diff --git a/src/calibre/gui2/actions/choose_library.py b/src/calibre/gui2/actions/choose_library.py index d726241432..001970f9db 100644 --- a/src/calibre/gui2/actions/choose_library.py +++ b/src/calibre/gui2/actions/choose_library.py @@ -390,7 +390,7 @@ class ChooseLibraryAction(InterfaceAction): #self.dbref = weakref.ref(self.gui.library_view.model().db) #self.before_mem = memory()/1024**2 self.gui.library_moved(loc) - #QTimer.singleShot(1000, self.debug_leak) + #QTimer.singleShot(5000, self.debug_leak) def debug_leak(self): import gc @@ -398,7 +398,7 @@ class ChooseLibraryAction(InterfaceAction): ref = self.dbref for i in xrange(3): gc.collect() if ref() is not None: - print 11111, ref() + print 'DB object alive:', ref() for r in gc.get_referrers(ref())[:10]: print r print diff --git a/src/calibre/gui2/convert/look_and_feel.ui b/src/calibre/gui2/convert/look_and_feel.ui index 0edc324dc5..3dea1f66d7 100644 --- a/src/calibre/gui2/convert/look_and_feel.ui +++ b/src/calibre/gui2/convert/look_and_feel.ui @@ -43,7 +43,7 @@ 0.000000000000000 - 30.000000000000000 + 50.000000000000000 1.000000000000000 diff --git a/src/calibre/gui2/dialogs/scheduler.py b/src/calibre/gui2/dialogs/scheduler.py index 572bbcf1c4..8aa624cacc 100644 --- a/src/calibre/gui2/dialogs/scheduler.py +++ b/src/calibre/gui2/dialogs/scheduler.py @@ -250,22 +250,27 @@ class Scheduler(QObject): self.timer = QTimer(self) self.timer.start(int(self.INTERVAL * 60 * 1000)) - self.oldest_timer = QTimer() - self.connect(self.oldest_timer, SIGNAL('timeout()'), self.oldest_check) self.connect(self.timer, SIGNAL('timeout()'), self.check) self.oldest = gconf['oldest_news'] - self.oldest_timer.start(int(60 * 60 * 1000)) QTimer.singleShot(5 * 1000, self.oldest_check) self.database_changed = self.recipe_model.database_changed def oldest_check(self): if self.oldest > 0: delta = timedelta(days=self.oldest) - ids = self.recipe_model.db.tags_older_than(_('News'), delta) + try: + ids = self.recipe_model.db.tags_older_than(_('News'), delta) + except: + # Should never happen + ids = [] + import traceback + traceback.print_exc() if ids: ids = list(ids) if ids: self.delete_old_news.emit(ids) + QTimer.singleShot(60 * 60 * 1000, self.oldest_check) + def show_dialog(self, *args): self.lock.lock() diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 5a57395530..2160e13b65 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -727,7 +727,11 @@ class TagsModel(QAbstractItemModel): # {{{ for user_cat in sorted(self.db.prefs.get('user_categories', {}).keys(), key=sort_key): cat_name = '@' + user_cat # add the '@' to avoid name collision - tb_cats.add_user_category(label=cat_name, name=user_cat) + try: + tb_cats.add_user_category(label=cat_name, name=user_cat) + except ValueError: + import traceback + traceback.print_exc() if len(saved_searches().names()): tb_cats.add_search_category(label='search', name=_('Searches')) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 7d6511e8a5..af47a79e49 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -42,7 +42,8 @@ class MetadataBackup(Thread): # {{{ def stop(self): self.keep_running = False - self.flush() + + def break_cycles(self): # Break cycles so that this object doesn't hold references to db self.do_write = self.get_metadata_for_dump = self.clear_dirtied = \ self.set_dirtied = self.db = None @@ -111,6 +112,8 @@ class MetadataBackup(Thread): # {{{ continue self.in_limbo = None + self.flush() + self.break_cycles() def flush(self): 'Used during shutdown to ensure that a dirtied book is not missed' diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index f2b2c94e31..ed47abbdb3 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -1376,10 +1376,12 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def tags_older_than(self, tag, delta): tag = tag.lower().strip() now = nowf() + tindex = self.FIELD_MAP['timestamp'] + gindex = self.FIELD_MAP['tags'] for r in self.data._data: if r is not None: - if (now - r[self.FIELD_MAP['timestamp']]) > delta: - tags = r[self.FIELD_MAP['tags']] + if (now - r[tindex]) > delta: + tags = r[gindex] if tags and tag in [x.strip() for x in tags.lower().split(',')]: yield r[self.FIELD_MAP['id']] diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index cfd95b2e3c..902e43891c 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -479,6 +479,8 @@ class FieldMetadata(dict): del self._tb_cats[key] if key in self._search_term_map: del self._search_term_map[key] + if key.lower() in self._search_term_map: + del self._search_term_map[key.lower()] def cc_series_index_column_for(self, key): return self._tb_cats[key]['rec_index'] + 1