mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Micro-optimizations when reading from the db
This commit is contained in:
parent
d336d75a81
commit
e105493d78
@ -53,12 +53,10 @@ class Table(object):
|
|||||||
self.sort_alpha = metadata.get('is_multiple', False) and metadata.get('display', {}).get('sort_alpha', False)
|
self.sort_alpha = metadata.get('is_multiple', False) and metadata.get('display', {}).get('sort_alpha', False)
|
||||||
|
|
||||||
# self.unserialize() maps values from the db to python objects
|
# self.unserialize() maps values from the db to python objects
|
||||||
self.unserialize = \
|
self.unserialize = {
|
||||||
{
|
|
||||||
'datetime': _c_convert_timestamp,
|
'datetime': _c_convert_timestamp,
|
||||||
'bool': bool
|
'bool': bool
|
||||||
}.get(
|
}.get(metadata['datatype'], None)
|
||||||
metadata['datatype'], lambda x: x)
|
|
||||||
if name == 'authors':
|
if name == 'authors':
|
||||||
# Legacy
|
# Legacy
|
||||||
self.unserialize = lambda x: x.replace('|', ',') if x else None
|
self.unserialize = lambda x: x.replace('|', ',') if x else None
|
||||||
@ -93,9 +91,13 @@ class OneToOneTable(Table):
|
|||||||
def read(self, db):
|
def read(self, db):
|
||||||
self.book_col_map = {}
|
self.book_col_map = {}
|
||||||
idcol = 'id' if self.metadata['table'] == 'books' else 'book'
|
idcol = 'id' if self.metadata['table'] == 'books' else 'book'
|
||||||
for row in db.conn.execute('SELECT {0}, {1} FROM {2}'.format(idcol,
|
query = db.conn.execute('SELECT {0}, {1} FROM {2}'.format(idcol,
|
||||||
self.metadata['column'], self.metadata['table'])):
|
self.metadata['column'], self.metadata['table']))
|
||||||
self.book_col_map[row[0]] = self.unserialize(row[1])
|
if self.unserialize is None:
|
||||||
|
self.book_col_map = {row[0]:row[1] for row in query}
|
||||||
|
else:
|
||||||
|
us = self.unserialize
|
||||||
|
self.book_col_map = {row[0]:us(row[1]) for row in query}
|
||||||
|
|
||||||
def remove_books(self, book_ids, db):
|
def remove_books(self, book_ids, db):
|
||||||
clean = set()
|
clean = set()
|
||||||
@ -119,7 +121,7 @@ class SizeTable(OneToOneTable):
|
|||||||
for row in db.conn.execute(
|
for row in db.conn.execute(
|
||||||
'SELECT books.id, (SELECT MAX(uncompressed_size) FROM data '
|
'SELECT books.id, (SELECT MAX(uncompressed_size) FROM data '
|
||||||
'WHERE data.book=books.id) FROM books'):
|
'WHERE data.book=books.id) FROM books'):
|
||||||
self.book_col_map[row[0]] = self.unserialize(row[1])
|
self.book_col_map[row[0]] = row[1]
|
||||||
|
|
||||||
def update_sizes(self, size_map):
|
def update_sizes(self, size_map):
|
||||||
self.book_col_map.update(size_map)
|
self.book_col_map.update(size_map)
|
||||||
@ -180,9 +182,13 @@ class ManyToOneTable(Table):
|
|||||||
self.read_maps(db)
|
self.read_maps(db)
|
||||||
|
|
||||||
def read_id_maps(self, db):
|
def read_id_maps(self, db):
|
||||||
for row in db.conn.execute('SELECT id, {0} FROM {1}'.format(
|
query = db.conn.execute('SELECT id, {0} FROM {1}'.format(
|
||||||
self.metadata['column'], self.metadata['table'])):
|
self.metadata['column'], self.metadata['table']))
|
||||||
self.id_map[row[0]] = self.unserialize(row[1])
|
if self.unserialize is None:
|
||||||
|
self.id_map = {row[0]:row[1] for row in query}
|
||||||
|
else:
|
||||||
|
us = self.unserialize
|
||||||
|
self.id_map = {row[0]:us(row[1]) for row in query}
|
||||||
|
|
||||||
def read_maps(self, db):
|
def read_maps(self, db):
|
||||||
for row in db.conn.execute(
|
for row in db.conn.execute(
|
||||||
@ -348,11 +354,14 @@ class AuthorsTable(ManyToManyTable):
|
|||||||
def read_id_maps(self, db):
|
def read_id_maps(self, db):
|
||||||
self.alink_map = {}
|
self.alink_map = {}
|
||||||
self.asort_map = {}
|
self.asort_map = {}
|
||||||
|
self.id_map = {}
|
||||||
|
us = self.unserialize
|
||||||
for row in db.conn.execute(
|
for row in db.conn.execute(
|
||||||
'SELECT id, name, sort, link FROM authors'):
|
'SELECT id, name, sort, link FROM authors'):
|
||||||
self.id_map[row[0]] = self.unserialize(row[1])
|
val = us(row[1])
|
||||||
|
self.id_map[row[0]] = self.unserialize(val)
|
||||||
self.asort_map[row[0]] = (row[2] if row[2] else
|
self.asort_map[row[0]] = (row[2] if row[2] else
|
||||||
author_to_author_sort(row[1]))
|
author_to_author_sort(val))
|
||||||
self.alink_map[row[0]] = row[3]
|
self.alink_map[row[0]] = row[3]
|
||||||
|
|
||||||
def set_sort_names(self, aus_map, db):
|
def set_sort_names(self, aus_map, db):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user