diff options
author | Sascha Silbe <sascha-pgp@silbe.org> | 2010-03-04 23:15:31 (GMT) |
---|---|---|
committer | Sascha Silbe <sascha-pgp@silbe.org> | 2010-03-04 23:15:31 (GMT) |
commit | 1f6bfcc75415b8f5b0c3eb152c4ab087cd632ea9 (patch) | |
tree | effdbcc68f2380a1c689f9152d89e4eb1e52f4b7 | |
parent | 3d86a0d85d1f64481a453b051c1fd234b9a40a87 (diff) |
rebuild index on migration
-rw-r--r-- | src/carquinyol/datastore.py | 53 | ||||
-rw-r--r-- | src/carquinyol/indexstore.py | 4 |
2 files changed, 31 insertions, 26 deletions
diff --git a/src/carquinyol/datastore.py b/src/carquinyol/datastore.py index dc2e167..dbe33af 100644 --- a/src/carquinyol/datastore.py +++ b/src/carquinyol/datastore.py @@ -57,40 +57,51 @@ class DataStore(dbus.service.Object): dbus.service.Object.__init__(self, bus_name, DS_OBJECT_PATH) layout_manager = layoutmanager.get_instance() + migrated = False if layout_manager.get_version() == 0: migration.migrate_from_0() - layout_manager.set_version(layoutmanager.CURRENT_LAYOUT_VERSION) - layout_manager.index_updated = False + migrated = True elif layout_manager.get_version() == 1: + migrated = True + + if migrated: layout_manager.set_version(layoutmanager.CURRENT_LAYOUT_VERSION) - layout_manager.index_updated = False self._metadata_store = MetadataStore() - + self._file_store = FileStore() + self._optimizer = Optimizer(self._file_store, self._metadata_store) self._index_store = IndexStore() + try: self._index_store.open_index() except Exception: logging.exception('Failed to open index, will rebuild') - layout_manager.index_updated = False - self._index_store.remove_index() - self._index_store.open_index() - - self._file_store = FileStore() - - if not layout_manager.index_updated: - logging.debug('Index is not up-to-date, will update') self._rebuild_index() + return - self._optimizer = Optimizer(self._file_store, self._metadata_store) + if migrated: + self._rebuild_index() + elif not layout_manager.index_updated: + logging.debug('Index is not up-to-date, will update') + self._update_index() def _rebuild_index(self): + """Remove and recreate index.""" + layoutmanager.get_instance().index_updated = False + self._index_store.close_index() + self._index_store.remove_index() + self._index_store.open_index() + self._update_index() + + def _update_index(self): + """Find entries that are not yet in the index and add them.""" uids = layoutmanager.get_instance().find_all() - logging.debug('Going to update the index with uids %r', uids) - gobject.idle_add(lambda: self.__rebuild_index_cb(uids), + logging.debug('Going to update the index with object_ids %r', + uids) + gobject.idle_add(lambda: self.__update_index_cb(uids), priority=gobject.PRIORITY_LOW) - def __rebuild_index_cb(self, uids): + def __update_index_cb(self, uids): if uids: uid = uids.pop() @@ -200,10 +211,6 @@ class DataStore(dbus.service.Object): uids, count = self._index_store.find(query) except Exception: logging.exception('Failed to query index, will rebuild') - layoutmanager.get_instance().index_updated = False - self._index_store.close_index() - self._index_store.remove_index() - self._index_store.open_index() self._rebuild_index() if not layoutmanager.get_instance().index_updated: @@ -216,13 +223,7 @@ class DataStore(dbus.service.Object): if not os.path.exists(entry_path): logging.warning( 'Inconsistency detected, returning all entries') - - layoutmanager.get_instance().index_updated = False - self._index_store.close_index() - self._index_store.remove_index() - self._index_store.open_index() self._rebuild_index() - return self._find_all(query, properties) metadata = self._metadata_store.retrieve(uid, properties) diff --git a/src/carquinyol/indexstore.py b/src/carquinyol/indexstore.py index 4dfd620..8a69334 100644 --- a/src/carquinyol/indexstore.py +++ b/src/carquinyol/indexstore.py @@ -220,6 +220,10 @@ class IndexStore(object): self._database = WritableDatabase(index_path, xapian.DB_CREATE_OR_OPEN) def close_index(self): + """Close index database if it is open.""" + if not self._database: + return + self._database.flush() self._database = None |