Add an attribute to the main item record for caching a Metadata instance. LibraryDatabase2.get_metadata it if None, and returns it if not None.

This commit is contained in:
Charles Haley 2010-09-19 09:24:57 +01:00
parent 7eaf417bb1
commit db446dc4ee
4 changed files with 37 additions and 6 deletions

View File

@ -114,6 +114,12 @@ class Metadata(object):
# Don't abuse this privilege # Don't abuse this privilege
self.__dict__[field] = val 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): def get(self, field, default=None):
if default is not None: if default is not None:
try: try:

View File

@ -539,6 +539,7 @@ class ResultCache(SearchQueryParser):
self._data[id] = db.conn.get('SELECT * from meta2 WHERE id=?', (id,))[0] 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.has_cover(id, index_is_id=True))
self._data[id].append(db.book_on_device_string(id)) self._data[id].append(db.book_on_device_string(id))
self._data[id].append(None)
if len(self.composites) > 0: if len(self.composites) > 0:
mi = db.get_metadata(id, index_is_id=True) mi = db.get_metadata(id, index_is_id=True)
for k,c in self.composites: 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] = 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.has_cover(id, index_is_id=True))
self._data[id].append(db.book_on_device_string(id)) self._data[id].append(db.book_on_device_string(id))
self._data[id].append(None)
if len(self.composites) > 0: if len(self.composites) > 0:
mi = db.get_metadata(id, index_is_id=True) mi = db.get_metadata(id, index_is_id=True)
for k,c in self.composites: for k,c in self.composites:
@ -588,6 +590,7 @@ class ResultCache(SearchQueryParser):
if item is not None: if item is not None:
item.append(db.has_cover(item[0], index_is_id=True)) item.append(db.has_cover(item[0], index_is_id=True))
item.append(db.book_on_device_string(item[0])) item.append(db.book_on_device_string(item[0]))
item.append(None)
if len(self.composites) > 0: if len(self.composites) > 0:
mi = db.get_metadata(item[0], index_is_id=True) mi = db.get_metadata(item[0], index_is_id=True)
for k,c in self.composites: for k,c in self.composites:

View File

@ -20,8 +20,8 @@ from calibre.library.caches import ResultCache
from calibre.library.custom_columns import CustomColumns from calibre.library.custom_columns import CustomColumns
from calibre.library.sqlite import connect, IntegrityError, DBThread from calibre.library.sqlite import connect, IntegrityError, DBThread
from calibre.library.prefs import DBPrefs from calibre.library.prefs import DBPrefs
from calibre.ebooks.metadata import string_to_authors, authors_to_string, \ from calibre.ebooks.metadata import string_to_authors, authors_to_string
MetaInformation from calibre.ebooks.metadata.book.base import Metadata
from calibre.ebooks.metadata.meta import get_metadata, metadata_from_formats from calibre.ebooks.metadata.meta import get_metadata, metadata_from_formats
from calibre.constants import preferred_encoding, iswindows, isosx, filesystem_encoding from calibre.constants import preferred_encoding, iswindows, isosx, filesystem_encoding
from calibre.ptempfile import PersistentTemporaryFile 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_metadata.set_field_record_index('cover', base+1, prefer_custom=False)
self.FIELD_MAP['ondevice'] = base+2 self.FIELD_MAP['ondevice'] = base+2
self.field_metadata.set_field_record_index('ondevice', base+2, prefer_custom=False) 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 = ''' script = '''
DROP VIEW IF EXISTS meta2; 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): 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) aut_list = self.authors_with_sort_strings(idx, index_is_id=index_is_id)
aum = [] aum = []
aus = {} aus = {}
for (author, author_sort) in aut_list: for (author, author_sort) in aut_list:
aum.append(author) aum.append(author)
aus[author] = author_sort 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 = self.author_sort(idx, index_is_id=index_is_id)
mi.author_sort_map = aus mi.author_sort_map = aus
mi.comments = self.comments(idx, index_is_id=index_is_id) 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): 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): def doit(func, *args, **kwargs):
try: try:
@ -1710,7 +1723,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
try: try:
mi = get_metadata(stream, format) mi = get_metadata(stream, format)
except: except:
mi = MetaInformation(title, ['calibre']) mi = Metadata(title, ['calibre'])
stream.seek(0) stream.seek(0)
mi.title, mi.authors = title, ['calibre'] mi.title, mi.authors = title, ['calibre']
mi.tags = [_('Catalog')] mi.tags = [_('Catalog')]

View File

@ -209,6 +209,15 @@ class FieldMetadata(dict):
'search_terms':[], 'search_terms':[],
'is_custom':False, 'is_custom':False,
'is_category':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, ('ondevice', {'table':None,
'column':None, 'column':None,
'datatype':'text', 'datatype':'text',