diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index cd2f2a3165..7b8eb07908 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -114,6 +114,12 @@ class Metadata(object): # Don't abuse this privilege self.__dict__[field] = val + def deepcopy(self): + m = Metadata(None) + m.__dict__ = copy.deepcopy(self.__dict__) + object.__setattr__(m, '_data', copy.deepcopy(object.__getattribute__(self, '_data'))) + return m + def get(self, field, default=None): if default is not None: try: diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index ead7a2b46d..b3f901ecd3 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -539,6 +539,7 @@ class ResultCache(SearchQueryParser): self._data[id] = db.conn.get('SELECT * from meta2 WHERE id=?', (id,))[0] self._data[id].append(db.has_cover(id, index_is_id=True)) self._data[id].append(db.book_on_device_string(id)) + self._data[id].append(None) if len(self.composites) > 0: mi = db.get_metadata(id, index_is_id=True) for k,c in self.composites: @@ -559,6 +560,7 @@ class ResultCache(SearchQueryParser): self._data[id] = db.conn.get('SELECT * from meta2 WHERE id=?', (id,))[0] self._data[id].append(db.has_cover(id, index_is_id=True)) self._data[id].append(db.book_on_device_string(id)) + self._data[id].append(None) if len(self.composites) > 0: mi = db.get_metadata(id, index_is_id=True) for k,c in self.composites: @@ -588,6 +590,7 @@ class ResultCache(SearchQueryParser): if item is not None: item.append(db.has_cover(item[0], index_is_id=True)) item.append(db.book_on_device_string(item[0])) + item.append(None) if len(self.composites) > 0: mi = db.get_metadata(item[0], index_is_id=True) for k,c in self.composites: diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index d51a8a62c0..489504dbb5 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -20,8 +20,8 @@ from calibre.library.caches import ResultCache from calibre.library.custom_columns import CustomColumns from calibre.library.sqlite import connect, IntegrityError, DBThread from calibre.library.prefs import DBPrefs -from calibre.ebooks.metadata import string_to_authors, authors_to_string, \ - MetaInformation +from calibre.ebooks.metadata import string_to_authors, authors_to_string +from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.meta import get_metadata, metadata_from_formats from calibre.constants import preferred_encoding, iswindows, isosx, filesystem_encoding from calibre.ptempfile import PersistentTemporaryFile @@ -282,6 +282,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.field_metadata.set_field_record_index('cover', base+1, prefer_custom=False) self.FIELD_MAP['ondevice'] = base+2 self.field_metadata.set_field_record_index('ondevice', base+2, prefer_custom=False) + self.FIELD_MAP['all_metadata'] = base+3 + self.field_metadata.set_field_record_index('all_metadata', base+3, prefer_custom=False) script = ''' DROP VIEW IF EXISTS meta2; @@ -520,15 +522,26 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def get_metadata(self, idx, index_is_id=False, get_cover=False): ''' - Convenience method to return metadata as a L{MetaInformation} object. + Convenience method to return metadata as a L{Metadata} object. ''' + mi = self.data.get(idx, self.FIELD_MAP['all_metadata'], + row_is_id = index_is_id) + if mi is not None: + return mi + + mi = self.field_metadata.get_empty_metadata_instance() + self.data.set(idx, self.FIELD_MAP['all_metadata'], mi, + row_is_id = index_is_id) + aut_list = self.authors_with_sort_strings(idx, index_is_id=index_is_id) aum = [] aus = {} for (author, author_sort) in aut_list: aum.append(author) aus[author] = author_sort - mi = MetaInformation(self.title(idx, index_is_id=index_is_id), aum) + mi = self.field_metadata.get_empty_metadata_instance() + mi.title = self.title(idx, index_is_id=index_is_id) + mi.authors = aum mi.author_sort = self.author_sort(idx, index_is_id=index_is_id) mi.author_sort_map = aus mi.comments = self.comments(idx, index_is_id=index_is_id) @@ -1056,7 +1069,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def set_metadata(self, id, mi, ignore_errors=False): ''' - Set metadata for the book `id` from the `MetaInformation` object `mi` + Set metadata for the book `id` from the `Metadata` object `mi` ''' def doit(func, *args, **kwargs): try: @@ -1710,7 +1723,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): try: mi = get_metadata(stream, format) except: - mi = MetaInformation(title, ['calibre']) + mi = Metadata(title, ['calibre']) stream.seek(0) mi.title, mi.authors = title, ['calibre'] mi.tags = [_('Catalog')] diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index dcdfcfd9d6..258c739e1c 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -209,6 +209,15 @@ class FieldMetadata(dict): 'search_terms':[], 'is_custom':False, 'is_category':False}), + ('all_metadata',{'table':None, + 'column':None, + 'datatype':None, + 'is_multiple':None, + 'kind':'field', + 'name':None, + 'search_terms':[], + 'is_custom':False, + 'is_category':False}), ('ondevice', {'table':None, 'column':None, 'datatype':'text',