diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 01f597caf4..a2555cfc56 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -156,8 +156,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.cover_cache.stop() self.cover_cache = CoverCache(db, FunctionDispatcher(self.db.cover)) self.cover_cache.start() - self.metadata_backup = MetadataBackup(db, - self.db.dump_metadata) + self.metadata_backup = MetadataBackup(db) self.metadata_backup.start() def refresh_cover(event, ids): if event == 'cover' and self.cover_cache is not None: diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index e675c97c76..bc16681f81 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -22,12 +22,17 @@ from calibre.ebooks.metadata import title_sort from calibre import fit_image, prints class MetadataBackup(Thread): # {{{ + ''' + Continuously backup changed metadata into OPF files + in the book directory. This class runs in its own + thread and makes sure that the actual file write happens in the + GUI thread to prevent Windows' file locking from causing problems. + ''' - def __init__(self, db, dump_func): + def __init__(self, db): Thread.__init__(self) self.daemon = True self.db = db - self.dump_func = dump_func self.keep_running = True from calibre.gui2 import FunctionDispatcher self.do_write = FunctionDispatcher(self.write) @@ -47,7 +52,7 @@ class MetadataBackup(Thread): # {{{ dump = [] try: - self.dump_func([id_], dump_queue=dump) + self.db.dump_metadata([id_], dump_to=dump) except: prints('Failed to get backup metadata for id:', id_, 'once') import traceback @@ -55,7 +60,7 @@ class MetadataBackup(Thread): # {{{ time.sleep(2) dump = [] try: - self.dump_func([id_], dump_queue=dump) + self.db.dump_metadata([id_], dump_to=dump) except: prints('Failed to get backup metadata for id:', id_, 'again, giving up') traceback.print_exc() diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 8c34510de4..39770068bb 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -567,7 +567,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return self.field_metadata[key] def dump_metadata(self, book_ids=None, remove_from_dirtied=True, - commit=True, dump_queue=None): + commit=True, dump_to=None): 'Write metadata for each record to an individual OPF file' if book_ids is None: book_ids = [x[0] for x in self.conn.get( @@ -583,11 +583,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): raw = metadata_to_opf(mi) path = os.path.join(self.abspath(book_id, index_is_id=True), 'metadata.opf') - if dump_queue is None: + if dump_to is None: with open(path, 'wb') as f: f.write(raw) else: - dump_queue.append((path, raw)) + dump_to.append((path, raw)) if remove_from_dirtied: self.conn.execute('DELETE FROM metadata_dirtied WHERE book=?', (book_id,))