diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index 513ed92a6c..c642c46a5b 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -371,6 +371,8 @@ class DB(object): UPDATE authors SET sort=author_to_author_sort(name) WHERE sort IS NULL; ''') + # Initialize_prefs must be called before initialize_custom_columns because + # icc can set a pref. self.initialize_prefs(default_prefs, restore_all_prefs, progress_callback) self.initialize_custom_columns() self.initialize_tables() @@ -425,6 +427,7 @@ class DB(object): defs['virtual_libraries'] = {} defs['virtual_lib_on_startup'] = defs['cs_virtual_lib_on_startup'] = '' defs['virt_libs_hidden'] = defs['virt_libs_order'] = () + defs['backup_all_metadata_on_start'] = 'no' # Migrate the bool tristate tweak defs['bools_are_tristate'] = \ @@ -539,7 +542,7 @@ class DB(object): DROP TABLE IF EXISTS {lt}; '''.format(table=table, lt=lt) ) - self.custom_columns_deleted = True + self.prefs.set('backup_all_metadata_on_start', 'yes') self.conn.execute('DELETE FROM custom_columns WHERE mark_for_delete=1') # Load metadata for custom columns @@ -808,6 +811,7 @@ class DB(object): if display is not None: self.conn.execute('UPDATE custom_columns SET display=? WHERE id=?', (json.dumps(display), num)) changed = True + # Note: the caller is responsible for scheduling a metadata backup if necessary return changed def create_custom_column(self, label, name, datatype, is_multiple, editable=True, display={}): # {{{ @@ -964,6 +968,7 @@ class DB(object): ] script = ' \n'.join(lines) self.conn.execute(script) + self.prefs.set('backup_all_metadata_on_start', 'yes') return num # }}} diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 40840f5910..d568709dac 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -308,9 +308,9 @@ class Cache(object): field.author_sort_field = self.fields['author_sort'] elif name == 'title': field.title_sort_field = self.fields['sort'] - if self.backend.custom_columns_deleted: + if self.backend.prefs['backup_all_metadata_on_start'] == 'yes': self.mark_as_dirty(self.all_book_ids()) - self.backend.custom_columns_deleted = False + self.backend.prefs.set('backup_all_metadata_on_start', 'no') @read_api def field_for(self, name, book_id, default_value=None): @@ -1604,8 +1604,15 @@ class Cache(object): self.backend.create_custom_column(label, name, datatype, is_multiple, editable=editable, display=display) @write_api - def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None, display=None): - return self.backend.set_custom_column_metadata(num, name=name, label=label, is_editable=is_editable, display=display) + def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None, + display=None, immediate_backup=False): + changed = self.backend.set_custom_column_metadata(num, name=name, label=label, is_editable=is_editable, display=display) + if changed: + if immediate_backup: + self.mark_as_dirty(self._all_book_ids()) + else: + self.backend.prefs.set('backup_all_metadata_on_start', 'yes') + return changed @read_api def get_books_for_category(self, category, item_id_or_composite_value): diff --git a/src/calibre/db/legacy.py b/src/calibre/db/legacy.py index 150edf9c0a..41118e4da1 100644 --- a/src/calibre/db/legacy.py +++ b/src/calibre/db/legacy.py @@ -684,8 +684,10 @@ class LibraryDatabase(object): def create_custom_column(self, label, name, datatype, is_multiple, editable=True, display={}): self.new_api.create_custom_column(label, name, datatype, is_multiple, editable=editable, display=display) - def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None, display=None, notify=True): - changed = self.new_api.set_custom_column_metadata(num, name=name, label=label, is_editable=is_editable, display=display) + def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None, display=None, + notify=True, immediate_backup=False): + changed = self.new_api.set_custom_column_metadata(num, name=name, label=label, is_editable=is_editable, + display=display, immediate_backup=immediate_backup) if changed and notify: self.notify('metadata', []) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 2db64fd8b3..b611cf406b 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -939,7 +939,8 @@ class BooksModel(QAbstractTableModel): # {{{ tmpl = unicode(value.toString()).strip() disp = cc['display'] disp['composite_template'] = tmpl - self.db.set_custom_column_metadata(cc['colnum'], display=disp) + self.db.set_custom_column_metadata(cc['colnum'], display=disp, + immediate_backup=True) self.refresh(reset=True) return True diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index d65eaa8ecc..4e20c02b5f 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -29,7 +29,6 @@ class CustomColumns(object): 'SELECT name FROM sqlite_master WHERE type="table" AND ' '(name GLOB "custom_column_*" OR name GLOB "books_custom_column_*")')]) - def __init__(self): # Verify that CUSTOM_DATA_TYPES is a (possibly improper) subset of # VALID_DATA_TYPES @@ -378,7 +377,7 @@ class CustomColumns(object): self.conn.commit() def set_custom_column_metadata(self, num, name=None, label=None, - is_editable=None, display=None, notify=True): + is_editable=None, display=None, notify=True, immediate_backup=False): changed = False if name is not None: self.conn.execute('UPDATE custom_columns SET name=? WHERE id=?',