def _update(self, new_db): if not isinstance(new_db, dict): raise DatabaseError("Database update can't be empty") try: if self.mode == "multi": self.serializer.dump(self.db) elif self.mode == "single": self.db = new_db except: raise DatabaseError('Update problem')
def _load_existing_db(self): if self.serializer is None: self._load_serializer() if not os.path.exists(self.path): self.serializer.init(self.init_schema) try: self.db = self.serializer.load() if not isinstance(self.db , dict): raise DatabaseError('Seems to be corrupt or not %s object' % self.serializer) except: raise DatabaseError('Seems to be corrupt or not %s object' % self.serializer)
def rename(self, old_name, new_name): if not old_name in self.collection_names(): raise DatabaseError('Collection not exist') if new_name in self.collection_names(): raise DatabaseError('Collection name already taken') if self.mode == "multi": tmp = self.db tmp[new_name] = tmp.pop(old_name) self._update(tmp) del tmp elif self.mode == "single": self.db[new_name] = self.db.pop(old_name)
def _del_id(self, old_id): try: if self.mode == "multi": tmp = self.db tmp['_infos']['total_entries'] -= 1 self._update(tmp) elif self.mode == "single": self.db['_infos']['total_entries'] -= 1 except: raise DatabaseError('Id is not in database')
def __init__(self, path = None, mode = "single", serializer = "json"): self.init_schema = {"_infos": { "creation_date": datetime.datetime.now().isoformat(), "serializer": serializer, "total_entries": 0}} self.mode = mode self.path = path self.serializer_name = serializer self.serializer = None if self.mode not in ['single','multi']: raise DatabaseError('Invalid database mode') self._initialize()
def drop_collection(self, name): if name == "_infos": raise DatabaseError("Can't remove \"_infos\" database") try: if self.mode == "multi": tmp = self.db tmp['_infos']['total_entries'] -= len(tmp[name]) del tmp[name] self._update(tmp) del tmp elif self.mode == "single": self.db['_infos']['total_entries'] -= len(self.db[name]) del self.db[name] except KeyError as err: pass
def _load_serializer(self): serializer = __import__("sofart.serializers._%s" % self.serializer_name) serializer = sys.modules["sofart.serializers._%s" % self.serializer_name] if serializer is None: raise DatabaseError('Failed to load %s serializer' % self.serializer_name) self.serializer = serializer.Serializer(self.path)
def sync(self): if not self.path: raise DatabaseError('Need path') if self.serializer is None: self._load_serializer() self.serializer.dump(self.db)