Example #1
0
    def add_field(self, field_name, field_type, after=None, default=None):
        """Add a new field after the specified field, or in the beginning if
        no field is specified"""
        if field_name in self.field_names:
            raise NameError, "Field %s already exists" % field_name
        field_def = [field_name, field_type]
        if default is not None:
            field_def.append(default)

        # validate field and update dictionary defaults
        buzhug_info.validate_field(self, field_def)

        if after is None:
            indx = 2  # insert after __version__
        elif not after in self.field_names:
            raise NameError, "No field named %s" % after
        else:
            indx = 1 + self.field_names.index(after)
        self.field_names.insert(indx, field_name)
        self.fields[field_name] = field_type
        # create field file
        self._file[field_name] = \
            self.file_types[self.fields[field_name]](self.name,field_name)
        self._file[field_name].create()
        # populate field file with default value and update position file
        self._pos.add_field(field_name, indx, default)
        buzhug_info.save_info(self)
        self._full_rec = makeRecordClass(self, self.record_class,
                                         self.field_names)
Example #2
0
    def create(self, *fields, **kw):
        """Creates a database instance and returns a reference to it
        fields are tuples (field_name,field_type[,default_value])
        field_name must not begin by _
        field_type can be one of the values in the dictionary self.types
        A keyword 'mode' can be specified:
           'override' : if the base already exists, remove it and create
                        a new one
           'open' : if the base already exists, open it
        If mode is not set, if the base exists, raise IOError
        In any case, if a directory of the same name exists, raise an
        exception
        """
        mode = kw.get('mode', None)
        if os.path.exists(self.name):
            if os.path.exists(self.info_name):
                if mode == 'override':
                    pass
                elif mode == 'open':
                    return self.open()
                else:
                    raise IOError, "Base %s already exists" % self.name
            else:
                if mode != 'open':
                    raise IOError, "Directory %s already exists" % self.name
                else:
                    raise IOError,"Mode 'open' : " \
                        "Directory %s already exists but no info file found" \
                        %self.name

        self.field_names = [f[0] for f in fields]
        self.fields = dict([(f[0], f[1]) for f in fields])
        # set general info about field definition
        buzhug_info.set_info(self, fields)

        self.field_names = ['__id__', '__version__'] + self.field_names
        self.fields['__id__'] = int
        self.fields['__version__'] = int
        # create the directory used for the base
        if not os.path.exists(self.name):
            os.mkdir(self.name)
        # create index file
        self._id_pos = IntegerFile(self.name, '_id_pos').create()
        # create positions file
        open(self.pos_name, 'wb').close()
        self._pos = PositionFile(self).create()
        # create the file holding a list of the deleted rows (the line number
        # of deleted records in field files)
        self._del_rows = DeletedRowsFile(self.name, "__del_rows__").create()
        # create field files abstractions
        self._file = {}
        for f in self.field_names:
            self._file[f] = self.file_types[self.fields[f]](self.name, f)
            self._file[f].create()
        # save information in files __info__ and __defaults__
        buzhug_info.save_info(self)
        # create class for records with all values set
        self._full_rec = makeRecordClass(self, self.record_class,
                                         self.field_names)
        return self
Example #3
0
    def add_field(self,field_name,field_type,after=None,default=None):
        """Add a new field after the specified field, or in the beginning if
        no field is specified"""
        if field_name in self.field_names:
            raise NameError,"Field %s already exists" %field_name
        field_def = [field_name,field_type]
        if default is not None:
            field_def.append(default)

        # validate field and update dictionary defaults
        buzhug_info.validate_field(self,field_def)

        if after is None:
            indx = 2 # insert after __version__
        elif not after in self.field_names:
            raise NameError,"No field named %s" %after
        else:
            indx = 1+self.field_names.index(after)
        self.field_names.insert(indx,field_name)
        self.fields[field_name] = field_type
        # create field file
        self._file[field_name] = \
            self.file_types[self.fields[field_name]](self.name,field_name)
        self._file[field_name].create()
        # populate field file with default value and update position file
        self._pos.add_field(field_name,indx,default)
        buzhug_info.save_info(self)
        self._full_rec = makeRecordClass(self,self.record_class,
            self.field_names)
Example #4
0
    def create(self,*fields,**kw):
        """Creates a database instance and returns a reference to it
        fields are tuples (field_name,field_type[,default_value])
        field_name must not begin by _
        field_type can be one of the values in the dictionary self.types
        A keyword 'mode' can be specified:
           'override' : if the base already exists, remove it and create
                        a new one
           'open' : if the base already exists, open it
        If mode is not set, if the base exists, raise IOError
        In any case, if a directory of the same name exists, raise an
        exception
        """
        mode = kw.get('mode',None)
        if os.path.exists(self.name):
            if os.path.exists(self.info_name):
                if mode == 'override':
                    pass
                elif mode == 'open':
                    return self.open()
                else:
                    raise IOError,"Base %s already exists" %self.name
            else:
                if mode != 'open':
                    raise IOError,"Directory %s already exists" %self.name
                else:
                    raise IOError,"Mode 'open' : " \
                        "Directory %s already exists but no info file found" \
                        %self.name

        self.field_names = [ f[0] for f in fields ]
        self.fields = dict([(f[0],f[1]) for f in fields])
        # set general info about field definition
        buzhug_info.set_info(self,fields)

        self.field_names = ['__id__','__version__'] + self.field_names
        self.fields['__id__'] = int
        self.fields['__version__'] = int
        # create the directory used for the base
        if not os.path.exists(self.name):
            os.mkdir(self.name)
        # create index file
        self._id_pos = IntegerFile(self.name,'_id_pos').create()
        # create positions file
        open(self.pos_name,'wb').close()
        self._pos = PositionFile(self).create()
        # create the file holding a list of the deleted rows (the line number
        # of deleted records in field files)
        self._del_rows = DeletedRowsFile(self.name,"__del_rows__").create()
        # create field files abstractions
        self._file = {}
        for f in self.field_names:
            self._file[f] = self.file_types[self.fields[f]](self.name,f)
            self._file[f].create()
        # save information in files __info__ and __defaults__
        buzhug_info.save_info(self)
        # create class for records with all values set
        self._full_rec = makeRecordClass(self,self.record_class,self.field_names)
        return self
Example #5
0
 def drop_field(self, field_name):
     """Remove the specified field name"""
     if not field_name in self.field_names:
         raise NameError, "No field named %s" % field_name
     if field_name == '__id__':
         raise ValueError, "Field __id__ can't be removed"
     if field_name == '__version__':
         raise ValueError, "Field __version__ can't be removed"
     indx = self.field_names.index(field_name)
     self.field_names.remove(field_name)
     del self.defaults[field_name]
     buzhug_info.save_info(self)
     del self.fields[field_name]
     del self._file[field_name]
     self._pos.drop_field(field_name, indx)
     self._full_rec = makeRecordClass(self, self.record_class,
                                      self.field_names)
Example #6
0
 def drop_field(self,field_name):
     """Remove the specified field name"""
     if not field_name in self.field_names:
         raise NameError,"No field named %s" %field_name
     if field_name == '__id__':
         raise ValueError,"Field __id__ can't be removed"
     if field_name == '__version__':
         raise ValueError,"Field __version__ can't be removed"
     indx = self.field_names.index(field_name)
     self.field_names.remove(field_name)
     del self.defaults[field_name]
     buzhug_info.save_info(self)
     del self.fields[field_name]
     del self._file[field_name]
     self._pos.drop_field(field_name,indx)
     self._full_rec = makeRecordClass(self,self.record_class,
         self.field_names)