diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 1d265fea1e..1758116e7a 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -492,7 +492,6 @@ class BulkSeries(BulkBase): if clear or val != '': extras = [] next_index = self.db.get_next_cc_series_num_for(val, num=self.col_id) - print 'cc commit next index', next_index for book_id in book_ids: if clear: extras.append(None) diff --git a/src/calibre/gui2/preferences/misc.py b/src/calibre/gui2/preferences/misc.py index e72a1921ef..37887d56dc 100644 --- a/src/calibre/gui2/preferences/misc.py +++ b/src/calibre/gui2/preferences/misc.py @@ -95,11 +95,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): def mark_dirty(self): db = self.gui.library_view.model().db - ids = [id for id in db.data.iterallids()] - db.dirtied(ids) - info_dialog(self, _('Backup metadata'), - _('Metadata will be backed up while calibre is running, at the ' - 'rate of 30 books per minute.'), show=True) + db.dirtied(list(db.data.iterallids())) def debug_device_detection(self, *args): from calibre.gui2.preferences.device_debug import DebugDevice diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 9d6f87324f..7a15cb3ce1 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -48,7 +48,7 @@ class MetadataBackup(Thread): # {{{ while self.keep_running: try: time.sleep(0.5) # Limit to two per second - id_ = self.db.dirtied_queue.get(True, 2) + id_ = self.db.dirtied_queue.get(True, 1.45) except Empty: continue except: diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 6f628d8454..ce72b473e1 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -566,7 +566,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def metadata_for_field(self, key): return self.field_metadata[key] - def clear_dirtied(self, book_ids=None): + def clear_dirtied(self, book_ids): ''' Clear the dirtied indicator for the books. This is used when fetching metadata, creating an OPF, and writing a file are separated into steps. @@ -585,7 +585,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.conn.commit() def dump_metadata(self, book_ids=None, remove_from_dirtied=True, - commit=True, dump_to=None): + commit=True): ''' Write metadata for each record to an individual OPF file @@ -598,19 +598,12 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): for book_id in book_ids: if not self.data.has_id(book_id): continue - mi = self.get_metadata(book_id, index_is_id=True, get_cover=False) - # Always set cover to cover.jpg. Even if cover doesn't exist, - # no harm done. This way no need to call dirtied when - # cover is set/removed - mi.cover = 'cover.jpg' + path, mi = self.get_metadata_for_dump(book_id) + if path is None: + continue raw = metadata_to_opf(mi) - path = os.path.join(self.abspath(book_id, index_is_id=True), - 'metadata.opf') - if dump_to is None: - with open(path, 'wb') as f: - f.write(raw) - else: - dump_to.append((path, raw)) + with open(path, 'wb') as f: + f.write(raw) if remove_from_dirtied: self.conn.execute('DELETE FROM metadata_dirtied WHERE book=?', (book_id,)) @@ -660,9 +653,13 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): try: path = os.path.join(self.abspath(idx, index_is_id=True), 'metadata.opf') mi = self.get_metadata(idx, index_is_id=True) + # Always set cover to cover.jpg. Even if cover doesn't exist, + # no harm done. This way no need to call dirtied when + # cover is set/removed + mi.cover = 'cover.jpg' except: - return ((None, None)) - return ((path, mi)) + return (None, None) + return (path, mi) def get_metadata(self, idx, index_is_id=False, get_cover=False): ''' diff --git a/src/calibre/library/restore.py b/src/calibre/library/restore.py index d34e831fc7..c81cf7abcb 100644 --- a/src/calibre/library/restore.py +++ b/src/calibre/library/restore.py @@ -48,12 +48,13 @@ class Restore(Thread): self.books = [] self.conflicting_custom_cols = {} self.failed_restores = [] + self.mismatched_dirs = [] self.successes = 0 self.tb = None @property def errors_occurred(self): - return self.failed_dirs or \ + return self.failed_dirs or self.mismatched_dirs or \ self.conflicting_custom_cols or self.failed_restores @property @@ -74,6 +75,13 @@ class Restore(Thread): for x in self.conflicting_custom_cols: ans += '\t#'+x+'\n' + if self.mismatched_dirs: + ans += '\n\n' + ans += 'The following folders were ignored:\n' + for x in self.mismatched_dirs: + ans += '\t'+x+'\n' + + return ans @@ -140,7 +148,7 @@ class Restore(Thread): 'path': path, }) else: - self.ignored_dirs.append(dirpath) + self.mismatched_dirs.append(dirpath) def create_cc_metadata(self): self.books.sort(key=itemgetter('timestamp'))