mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix a memory leak in the Copy to library operation
This commit is contained in:
parent
08ce94f3a0
commit
88627828b7
@ -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):
|
||||||
|
@ -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,6 +264,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
|
|
||||||
migrate_preference('user_categories', {})
|
migrate_preference('user_categories', {})
|
||||||
migrate_preference('saved_searches', {})
|
migrate_preference('saved_searches', {})
|
||||||
|
if not self.is_second_db:
|
||||||
set_saved_searches(self, 'saved_searches')
|
set_saved_searches(self, 'saved_searches')
|
||||||
|
|
||||||
# migrate grouped_search_terms
|
# migrate grouped_search_terms
|
||||||
|
@ -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):
|
||||||
|
db = self.db
|
||||||
|
if db is not None:
|
||||||
self.queries[self.force_unicode(name)] = self.force_unicode(value).strip()
|
self.queries[self.force_unicode(name)] = self.force_unicode(value).strip()
|
||||||
self.db.prefs[self.opt_name] = self.queries
|
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):
|
||||||
|
db = self.db
|
||||||
|
if db is not None:
|
||||||
self.queries.pop(self.force_unicode(name), False)
|
self.queries.pop(self.force_unicode(name), False)
|
||||||
self.db.prefs[self.opt_name] = self.queries
|
db.prefs[self.opt_name] = self.queries
|
||||||
|
|
||||||
def rename(self, old_name, new_name):
|
def rename(self, old_name, new_name):
|
||||||
|
db = self.db
|
||||||
|
if db is not None:
|
||||||
self.queries[self.force_unicode(new_name)] = \
|
self.queries[self.force_unicode(new_name)] = \
|
||||||
self.queries.get(self.force_unicode(old_name), None)
|
self.queries.get(self.force_unicode(old_name), None)
|
||||||
self.queries.pop(self.force_unicode(old_name), False)
|
self.queries.pop(self.force_unicode(old_name), False)
|
||||||
self.db.prefs[self.opt_name] = self.queries
|
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user