diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 0fa280d997..7c2176ec31 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -114,6 +114,19 @@ class Cache(object): if self.dirtied_cache: self.dirtied_sequence = max(self.dirtied_cache.itervalues())+1 + @write_api + def initialize_template_cache(self): + self.formatter_template_cache = {} + + @write_api + def refresh(self): + self._initialize_template_cache() + for field in self.fields.itervalues(): + if hasattr(field, 'clear_cache'): + field.clear_cache() # Clear the composite cache + if hasattr(field, 'table'): + field.table.read(self.backend) # Reread data from metadata.db + @property def field_metadata(self): return self.backend.field_metadata diff --git a/src/calibre/db/legacy.py b/src/calibre/db/legacy.py index d1b76cd8bd..3c06f21fed 100644 --- a/src/calibre/db/legacy.py +++ b/src/calibre/db/legacy.py @@ -12,6 +12,7 @@ from functools import partial from calibre.db.backend import DB from calibre.db.cache import Cache from calibre.db.view import View +from calibre.utils.date import utcnow class LibraryDatabase(object): @@ -50,6 +51,8 @@ class LibraryDatabase(object): setattr(self, prop, partial(self.get_property, loc=self.FIELD_MAP[fm])) + self.last_update_check = self.last_modified() + def close(self): self.backend.close() @@ -74,6 +77,11 @@ class LibraryDatabase(object): def last_modified(self): return self.backend.last_modified() + def check_if_modified(self): + if self.last_modified() > self.last_update_check: + self.refresh() + self.last_update_check = utcnow() + @property def custom_column_num_map(self): return self.backend.custom_column_num_map @@ -86,9 +94,21 @@ class LibraryDatabase(object): def FIELD_MAP(self): return self.backend.FIELD_MAP + @property + def formatter_template_cache(self): + return self.data.cache.formatter_template_cache + + def initialize_template_cache(self): + self.data.cache.initialize_template_cache() + def all_ids(self): for book_id in self.data.cache.all_book_ids(): yield book_id + + def refresh(self, field=None, ascending=True): + self.data.cache.refresh() + self.data.refresh(field=field, ascending=ascending) + # }}} diff --git a/src/calibre/db/tests/legacy.py b/src/calibre/db/tests/legacy.py index 6d5734d6b5..2eba15c375 100644 --- a/src/calibre/db/tests/legacy.py +++ b/src/calibre/db/tests/legacy.py @@ -64,3 +64,15 @@ class LegacyTest(BaseTest): # }}} + def test_refresh(self): # {{{ + ' Test refreshing the view after a change to metadata.db ' + db = self.init_legacy() + db2 = self.init_legacy() + self.assertEqual(db2.data.cache.set_field('title', {1:'xxx'}), set([1])) + db2.close() + del db2 + self.assertNotEqual(db.title(1, index_is_id=True), 'xxx') + db.check_if_modified() + self.assertEqual(db.title(1, index_is_id=True), 'xxx') + # }}} + diff --git a/src/calibre/db/view.py b/src/calibre/db/view.py index 4ffa1dd074..ff41f20614 100644 --- a/src/calibre/db/view.py +++ b/src/calibre/db/view.py @@ -294,3 +294,11 @@ class View(object): self.marked_ids = dict(izip(id_dict.iterkeys(), imap(unicode, id_dict.itervalues()))) + def refresh(self, field=None, ascending=True): + self._map = tuple(self.cache.all_book_ids()) + self._map_filtered = tuple(self._map) + if field is not None: + self.sort(field, ascending) + if self.search_restriction or self.base_restriction: + self.search('', return_matches=False) +