Implement refresh()

This commit is contained in:
Kovid Goyal 2013-04-23 12:58:36 +05:30
parent d3a58c69ea
commit f0396d021c
4 changed files with 53 additions and 0 deletions

View File

@ -114,6 +114,19 @@ class Cache(object):
if self.dirtied_cache: if self.dirtied_cache:
self.dirtied_sequence = max(self.dirtied_cache.itervalues())+1 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 @property
def field_metadata(self): def field_metadata(self):
return self.backend.field_metadata return self.backend.field_metadata

View File

@ -12,6 +12,7 @@ from functools import partial
from calibre.db.backend import DB from calibre.db.backend import DB
from calibre.db.cache import Cache from calibre.db.cache import Cache
from calibre.db.view import View from calibre.db.view import View
from calibre.utils.date import utcnow
class LibraryDatabase(object): class LibraryDatabase(object):
@ -50,6 +51,8 @@ class LibraryDatabase(object):
setattr(self, prop, partial(self.get_property, setattr(self, prop, partial(self.get_property,
loc=self.FIELD_MAP[fm])) loc=self.FIELD_MAP[fm]))
self.last_update_check = self.last_modified()
def close(self): def close(self):
self.backend.close() self.backend.close()
@ -74,6 +77,11 @@ class LibraryDatabase(object):
def last_modified(self): def last_modified(self):
return self.backend.last_modified() 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 @property
def custom_column_num_map(self): def custom_column_num_map(self):
return self.backend.custom_column_num_map return self.backend.custom_column_num_map
@ -86,9 +94,21 @@ class LibraryDatabase(object):
def FIELD_MAP(self): def FIELD_MAP(self):
return self.backend.FIELD_MAP 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): def all_ids(self):
for book_id in self.data.cache.all_book_ids(): for book_id in self.data.cache.all_book_ids():
yield book_id yield book_id
def refresh(self, field=None, ascending=True):
self.data.cache.refresh()
self.data.refresh(field=field, ascending=ascending)
# }}} # }}}

View File

@ -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')
# }}}

View File

@ -294,3 +294,11 @@ class View(object):
self.marked_ids = dict(izip(id_dict.iterkeys(), imap(unicode, self.marked_ids = dict(izip(id_dict.iterkeys(), imap(unicode,
id_dict.itervalues()))) 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)