def __init__(self, database): super(Database, self).__init__() # set up the database and the version file if isinstance(database, kaa.db.Database): self._db = database else: dbdir = os.path.dirname(database) if dbdir and not os.path.exists(dbdir): os.makedirs(dbdir) self._db = kaa.db.Database(database + '.db') self._versionfile = self._db.filename + '.version' self.imagedir = self._db.filename + '.images' if not os.path.isdir(self.imagedir): os.makedirs(self.imagedir) if not os.path.exists(self._versionfile): open(self._versionfile, 'w').write('0') try: self.version = int(open(self._versionfile).read()) except ValueError: self.version = 0 # FIXME: we need to keep the INotify object. Why? self.__inotify = INotify() self.__inotify.watch(self._versionfile, INotify.CLOSE_WRITE).connect(self._db_updated)
def __init__(self, database): super(Database, self).__init__() # set up the database and the version file if not os.path.exists(os.path.dirname(database)): os.makedirs(os.path.dirname(database)) self._db = kaa.db.Database(database + '.db') self._versionfile = database + '.version' if not os.path.exists(self._versionfile): open(self._versionfile, 'w').write('0') try: self.version = int(open(self._versionfile).read()) except ValueError: self.version = 0 # FIXME: we need to keep the INotify object. Why? self.__inotify = INotify() self.__inotify.watch(self._versionfile, INotify.CLOSE_WRITE).connect(self._db_updated)
class Database(MediaInfo): __kaasignals__ = { 'changed': ''' Signal when the database on disc changes ''', } def __init__(self, database): super(Database, self).__init__() # set up the database and the version file if isinstance(database, kaa.db.Database): self._db = database else: dbdir = os.path.dirname(database) if dbdir and not os.path.exists(dbdir): os.makedirs(dbdir) self._db = kaa.db.Database(database + '.db') self._versionfile = self._db.filename + '.version' self.imagedir = self._db.filename + '.images' if not os.path.isdir(self.imagedir): os.makedirs(self.imagedir) if not os.path.exists(self._versionfile): open(self._versionfile, 'w').write('0') try: self.version = int(open(self._versionfile).read()) except ValueError: self.version = 0 # FIXME: we need to keep the INotify object. Why? self.__inotify = INotify() self.__inotify.watch(self._versionfile, INotify.CLOSE_WRITE).connect(self._db_updated) def _db_updated(self, *args): """ Callback from INotify when the version file changed """ try: version = int(open(self._versionfile).read()) except ValueError: version = self.version + 1 if version != self.version: self.version = version self.signals['changed'].emit() def notify_resync(self): """ Notify all applications using the database that a resync is necessary by updating the version or the db. """ self.version += 1 f = open(self._versionfile, 'w') f.write(str(self.version)) f.close() @kaa.coroutine() def sync(self, force=False): yield None def get_metadata(self, key): """ Get database metadata """ if not self._db.query(type='metadata'): return None metadata = self._db.query(type='metadata')[0]['metadata'] if not metadata: return None return metadata.get(key) def set_metadata(self, key, value): """ Set database metadata """ if not self._db.query(type='metadata'): return None entry = self._db.query(type='metadata')[0] metadata = entry['metadata'] or {} metadata[key] = value self._db.update(entry, metadata=metadata) self._db.commit()