Trigger backup for all books when adding/modifying a custom column

Merge branch 'master' of https://github.com/cbhaley/calibre
This commit is contained in:
Kovid Goyal 2013-09-11 08:56:04 +05:30
commit 4908ef7cad
5 changed files with 24 additions and 10 deletions

View File

@ -371,6 +371,8 @@ class DB(object):
UPDATE authors SET sort=author_to_author_sort(name) WHERE sort IS NULL; 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_prefs(default_prefs, restore_all_prefs, progress_callback)
self.initialize_custom_columns() self.initialize_custom_columns()
self.initialize_tables() self.initialize_tables()
@ -425,6 +427,7 @@ class DB(object):
defs['virtual_libraries'] = {} defs['virtual_libraries'] = {}
defs['virtual_lib_on_startup'] = defs['cs_virtual_lib_on_startup'] = '' defs['virtual_lib_on_startup'] = defs['cs_virtual_lib_on_startup'] = ''
defs['virt_libs_hidden'] = defs['virt_libs_order'] = () defs['virt_libs_hidden'] = defs['virt_libs_order'] = ()
defs['backup_all_metadata_on_start'] = 'no'
# Migrate the bool tristate tweak # Migrate the bool tristate tweak
defs['bools_are_tristate'] = \ defs['bools_are_tristate'] = \
@ -539,7 +542,7 @@ class DB(object):
DROP TABLE IF EXISTS {lt}; DROP TABLE IF EXISTS {lt};
'''.format(table=table, lt=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') self.conn.execute('DELETE FROM custom_columns WHERE mark_for_delete=1')
# Load metadata for custom columns # Load metadata for custom columns
@ -808,6 +811,7 @@ class DB(object):
if display is not None: if display is not None:
self.conn.execute('UPDATE custom_columns SET display=? WHERE id=?', (json.dumps(display), num)) self.conn.execute('UPDATE custom_columns SET display=? WHERE id=?', (json.dumps(display), num))
changed = True changed = True
# Note: the caller is responsible for scheduling a metadata backup if necessary
return changed return changed
def create_custom_column(self, label, name, datatype, is_multiple, editable=True, display={}): # {{{ def create_custom_column(self, label, name, datatype, is_multiple, editable=True, display={}): # {{{
@ -964,6 +968,7 @@ class DB(object):
] ]
script = ' \n'.join(lines) script = ' \n'.join(lines)
self.conn.execute(script) self.conn.execute(script)
self.prefs.set('backup_all_metadata_on_start', 'yes')
return num return num
# }}} # }}}

View File

@ -308,9 +308,9 @@ class Cache(object):
field.author_sort_field = self.fields['author_sort'] field.author_sort_field = self.fields['author_sort']
elif name == 'title': elif name == 'title':
field.title_sort_field = self.fields['sort'] 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.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 @read_api
def field_for(self, name, book_id, default_value=None): 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) self.backend.create_custom_column(label, name, datatype, is_multiple, editable=editable, display=display)
@write_api @write_api
def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None, display=None): def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None,
return self.backend.set_custom_column_metadata(num, name=name, label=label, is_editable=is_editable, display=display) 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 @read_api
def get_books_for_category(self, category, item_id_or_composite_value): def get_books_for_category(self, category, item_id_or_composite_value):

View File

@ -684,8 +684,10 @@ class LibraryDatabase(object):
def create_custom_column(self, label, name, datatype, is_multiple, editable=True, display={}): 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) 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): def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None, display=None,
changed = self.new_api.set_custom_column_metadata(num, name=name, label=label, is_editable=is_editable, display=display) 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: if changed and notify:
self.notify('metadata', []) self.notify('metadata', [])

View File

@ -939,7 +939,8 @@ class BooksModel(QAbstractTableModel): # {{{
tmpl = unicode(value.toString()).strip() tmpl = unicode(value.toString()).strip()
disp = cc['display'] disp = cc['display']
disp['composite_template'] = tmpl 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) self.refresh(reset=True)
return True return True

View File

@ -29,7 +29,6 @@ class CustomColumns(object):
'SELECT name FROM sqlite_master WHERE type="table" AND ' 'SELECT name FROM sqlite_master WHERE type="table" AND '
'(name GLOB "custom_column_*" OR name GLOB "books_custom_column_*")')]) '(name GLOB "custom_column_*" OR name GLOB "books_custom_column_*")')])
def __init__(self): def __init__(self):
# Verify that CUSTOM_DATA_TYPES is a (possibly improper) subset of # Verify that CUSTOM_DATA_TYPES is a (possibly improper) subset of
# VALID_DATA_TYPES # VALID_DATA_TYPES
@ -378,7 +377,7 @@ class CustomColumns(object):
self.conn.commit() self.conn.commit()
def set_custom_column_metadata(self, num, name=None, label=None, 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 changed = False
if name is not None: if name is not None:
self.conn.execute('UPDATE custom_columns SET name=? WHERE id=?', self.conn.execute('UPDATE custom_columns SET name=? WHERE id=?',