Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha 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)
commit1f6bfcc75415b8f5b0c3eb152c4ab087cd632ea9 (patch)
treeeffdbcc68f2380a1c689f9152d89e4eb1e52f4b7
parent3d86a0d85d1f64481a453b051c1fd234b9a40a87 (diff)
rebuild index on migration
-rw-r--r--src/carquinyol/datastore.py53
-rw-r--r--src/carquinyol/indexstore.py4
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