newdb: Speed up set_metadata() by not committing the db after individual field writes

This commit is contained in:
Kovid Goyal 2013-07-30 10:56:04 +05:30
parent c6daf258be
commit 82d7bd3d57

View File

@ -1084,11 +1084,6 @@ class Cache(object):
else: else:
raise raise
for field in ('rating', 'series_index', 'timestamp'):
val = getattr(mi, field)
if val is not None:
protected_set_field(field, val)
# force_changes has no effect on cover manipulation # force_changes has no effect on cover manipulation
cdata = mi.cover_data[1] cdata = mi.cover_data[1]
if cdata is None and isinstance(mi.cover, basestring) and mi.cover and os.access(mi.cover, os.R_OK): if cdata is None and isinstance(mi.cover, basestring) and mi.cover and os.access(mi.cover, os.R_OK):
@ -1099,42 +1094,48 @@ class Cache(object):
if cdata is not None: if cdata is not None:
self._set_cover({book_id: cdata}) self._set_cover({book_id: cdata})
for field in ('author_sort', 'publisher', 'series', 'tags', 'comments', with self.backend.conn: # Speed up set_metadata by not operating in autocommit mode
'languages', 'pubdate'): for field in ('rating', 'series_index', 'timestamp'):
val = mi.get(field, None) val = getattr(mi, field)
if (force_changes and val is not None) or not mi.is_null(field): if val is not None:
protected_set_field(field, val) protected_set_field(field, val)
val = mi.get('title_sort', None) for field in ('author_sort', 'publisher', 'series', 'tags', 'comments',
if (force_changes and val is not None) or not mi.is_null('title_sort'): 'languages', 'pubdate'):
protected_set_field('sort', val) val = mi.get(field, None)
if (force_changes and val is not None) or not mi.is_null(field):
protected_set_field(field, val)
# identifiers will always be replaced if force_changes is True val = mi.get('title_sort', None)
mi_idents = mi.get_identifiers() if (force_changes and val is not None) or not mi.is_null('title_sort'):
if force_changes: protected_set_field('sort', val)
protected_set_field('identifiers', mi_idents)
elif mi_idents:
identifiers = self._field_for('identifiers', book_id, default_value={})
for key, val in mi_idents.iteritems():
if val and val.strip(): # Don't delete an existing identifier
identifiers[icu_lower(key)] = val
protected_set_field('identifiers', identifiers)
user_mi = mi.get_all_user_metadata(make_copy=False) # identifiers will always be replaced if force_changes is True
fm = self.field_metadata mi_idents = mi.get_identifiers()
for key in user_mi.iterkeys(): if force_changes:
if (key in fm and protected_set_field('identifiers', mi_idents)
user_mi[key]['datatype'] == fm[key]['datatype'] and elif mi_idents:
(user_mi[key]['datatype'] != 'text' or identifiers = self._field_for('identifiers', book_id, default_value={})
user_mi[key]['is_multiple'] == fm[key]['is_multiple'])): for key, val in mi_idents.iteritems():
val = mi.get(key, None) if val and val.strip(): # Don't delete an existing identifier
if force_changes or val is not None: identifiers[icu_lower(key)] = val
protected_set_field(key, val) protected_set_field('identifiers', identifiers)
idx = key + '_index'
if idx in self.fields: user_mi = mi.get_all_user_metadata(make_copy=False)
extra = mi.get_extra(key) fm = self.field_metadata
if extra is not None or force_changes: for key in user_mi.iterkeys():
protected_set_field(idx, extra) if (key in fm and
user_mi[key]['datatype'] == fm[key]['datatype'] and
(user_mi[key]['datatype'] != 'text' or
user_mi[key]['is_multiple'] == fm[key]['is_multiple'])):
val = mi.get(key, None)
if force_changes or val is not None:
protected_set_field(key, val)
idx = key + '_index'
if idx in self.fields:
extra = mi.get_extra(key)
if extra is not None or force_changes:
protected_set_field(idx, extra)
@write_api @write_api
def add_format(self, book_id, fmt, stream_or_path, replace=True, run_hooks=True, dbapi=None): def add_format(self, book_id, fmt, stream_or_path, replace=True, run_hooks=True, dbapi=None):