Fix a memory leak in the Copy to library operation

This commit is contained in:
Kovid Goyal 2011-09-13 20:07:44 -06:00
parent 08ce94f3a0
commit 88627828b7
3 changed files with 34 additions and 16 deletions

View File

@ -53,9 +53,11 @@ class Worker(Thread): # {{{
def doit(self): def doit(self):
from calibre.library.database2 import LibraryDatabase2 from calibre.library.database2 import LibraryDatabase2
newdb = LibraryDatabase2(self.loc) newdb = LibraryDatabase2(self.loc, is_second_db=True)
with closing(newdb): with closing(newdb):
self._doit(newdb) self._doit(newdb)
newdb.break_cycles()
del newdb
def _doit(self, newdb): def _doit(self, newdb):
for i, x in enumerate(self.ids): for i, x in enumerate(self.ids):

View File

@ -161,7 +161,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
return path and os.path.exists(os.path.join(path, 'metadata.db')) return path and os.path.exists(os.path.join(path, 'metadata.db'))
def __init__(self, library_path, row_factory=False, default_prefs=None, def __init__(self, library_path, row_factory=False, default_prefs=None,
read_only=False): read_only=False, is_second_db=False):
self.is_second_db = is_second_db
try: try:
if isbytestring(library_path): if isbytestring(library_path):
library_path = library_path.decode(filesystem_encoding) library_path = library_path.decode(filesystem_encoding)
@ -263,7 +264,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
migrate_preference('user_categories', {}) migrate_preference('user_categories', {})
migrate_preference('saved_searches', {}) migrate_preference('saved_searches', {})
set_saved_searches(self, 'saved_searches') if not self.is_second_db:
set_saved_searches(self, 'saved_searches')
# migrate grouped_search_terms # migrate grouped_search_terms
if self.prefs.get('grouped_search_terms', None) is None: if self.prefs.get('grouped_search_terms', None) is None:

View File

@ -16,11 +16,11 @@ methods :method:`SearchQueryParser.universal_set` and
If this module is run, it will perform a series of unit tests. If this module is run, it will perform a series of unit tests.
''' '''
import sys, operator import sys, operator, weakref
from calibre.utils.pyparsing import CaselessKeyword, Group, Forward, \ from calibre.utils.pyparsing import (CaselessKeyword, Group, Forward,
CharsNotIn, Suppress, OneOrMore, MatchFirst, CaselessLiteral, \ CharsNotIn, Suppress, OneOrMore, MatchFirst, CaselessLiteral,
Optional, NoMatch, ParseException, QuotedString Optional, NoMatch, ParseException, QuotedString)
from calibre.constants import preferred_encoding from calibre.constants import preferred_encoding
from calibre.utils.icu import sort_key from calibre.utils.icu import sort_key
from calibre import prints from calibre import prints
@ -37,11 +37,19 @@ class SavedSearchQueries(object):
def __init__(self, db, _opt_name): def __init__(self, db, _opt_name):
self.opt_name = _opt_name; self.opt_name = _opt_name;
self.db = db
if db is not None: if db is not None:
self.queries = db.prefs.get(self.opt_name, {}) self.queries = db.prefs.get(self.opt_name, {})
else: else:
self.queries = {} self.queries = {}
try:
self._db = weakref.ref(db)
except:
# db could be None
self._db = lambda : None
@property
def db(self):
return self._db()
def force_unicode(self, x): def force_unicode(self, x):
if not isinstance(x, unicode): if not isinstance(x, unicode):
@ -49,21 +57,27 @@ class SavedSearchQueries(object):
return x return x
def add(self, name, value): def add(self, name, value):
self.queries[self.force_unicode(name)] = self.force_unicode(value).strip() db = self.db
self.db.prefs[self.opt_name] = self.queries if db is not None:
self.queries[self.force_unicode(name)] = self.force_unicode(value).strip()
db.prefs[self.opt_name] = self.queries
def lookup(self, name): def lookup(self, name):
return self.queries.get(self.force_unicode(name), None) return self.queries.get(self.force_unicode(name), None)
def delete(self, name): def delete(self, name):
self.queries.pop(self.force_unicode(name), False) db = self.db
self.db.prefs[self.opt_name] = self.queries if db is not None:
self.queries.pop(self.force_unicode(name), False)
db.prefs[self.opt_name] = self.queries
def rename(self, old_name, new_name): def rename(self, old_name, new_name):
self.queries[self.force_unicode(new_name)] = \ db = self.db
self.queries.get(self.force_unicode(old_name), None) if db is not None:
self.queries.pop(self.force_unicode(old_name), False) self.queries[self.force_unicode(new_name)] = \
self.db.prefs[self.opt_name] = self.queries self.queries.get(self.force_unicode(old_name), None)
self.queries.pop(self.force_unicode(old_name), False)
db.prefs[self.opt_name] = self.queries
def names(self): def names(self):
return sorted(self.queries.keys(),key=sort_key) return sorted(self.queries.keys(),key=sort_key)