mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 10:44:09 -04:00
oops in filter
This commit is contained in:
parent
343626751e
commit
d561643b79
@ -16,7 +16,7 @@
|
|||||||
Backend that implements storage of ebooks in an sqlite database.
|
Backend that implements storage of ebooks in an sqlite database.
|
||||||
"""
|
"""
|
||||||
import sqlite3 as sqlite
|
import sqlite3 as sqlite
|
||||||
import os, datetime
|
import os, datetime, re
|
||||||
from zlib import compress, decompress
|
from zlib import compress, decompress
|
||||||
from stat import ST_SIZE
|
from stat import ST_SIZE
|
||||||
|
|
||||||
@ -70,7 +70,15 @@ class LibraryDatabase(object):
|
|||||||
book = cur.fetchone()
|
book = cur.fetchone()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def import_old_database(path, conn):
|
def sizeof_old_database(path):
|
||||||
|
conn = sqlite.connect(path)
|
||||||
|
ans = conn.execute('SELECT COUNT(id) from books_meta').fetchone()[0]
|
||||||
|
conn.close()
|
||||||
|
return ans
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def import_old_database(path, conn, progress=None):
|
||||||
|
count = 0
|
||||||
for book, cover, formats in LibraryDatabase.books_in_old_database(path):
|
for book, cover, formats in LibraryDatabase.books_in_old_database(path):
|
||||||
obj = conn.execute('INSERT INTO books(title, timestamp) VALUES (?,?)',
|
obj = conn.execute('INSERT INTO books(title, timestamp) VALUES (?,?)',
|
||||||
(book['title'], book['timestamp']))
|
(book['title'], book['timestamp']))
|
||||||
@ -83,15 +91,15 @@ class LibraryDatabase(object):
|
|||||||
else:
|
else:
|
||||||
aid = conn.execute('INSERT INTO authors(name) VALUES (?)', (a,)).lastrowid
|
aid = conn.execute('INSERT INTO authors(name) VALUES (?)', (a,)).lastrowid
|
||||||
conn.execute('INSERT INTO books_authors_link(book, author) VALUES (?,?)', (id, aid))
|
conn.execute('INSERT INTO books_authors_link(book, author) VALUES (?,?)', (id, aid))
|
||||||
candidate = conn.execute('SELECT id from publishers WHERE name=?', (book['publisher'],)).fetchone()
|
if book['publisher']:
|
||||||
if candidate:
|
candidate = conn.execute('SELECT id from publishers WHERE name=?', (book['publisher'],)).fetchone()
|
||||||
pid = candidate[0] if candidate else conn.execute('INSERT INTO publishers(name) VALUES (?)',
|
pid = candidate[0] if candidate else conn.execute('INSERT INTO publishers(name) VALUES (?)',
|
||||||
(book['publisher'],)).lastrowid
|
(book['publisher'],)).lastrowid
|
||||||
conn.execute('INSERT INTO books_publishers_link(book, publisher) VALUES (?,?)', (id, pid))
|
conn.execute('INSERT INTO books_publishers_link(book, publisher) VALUES (?,?)', (id, pid))
|
||||||
candidate = conn.execute('SELECT id from ratings WHERE rating=?', (book['rating'],)).fetchone()
|
if book['rating']:
|
||||||
if candidate:
|
candidate = conn.execute('SELECT id from ratings WHERE rating=?', (2*book['rating'],)).fetchone()
|
||||||
rid = candidate[0] if candidate else conn.execute('INSERT INTO ratings(rating) VALUES (?)',
|
rid = candidate[0] if candidate else conn.execute('INSERT INTO ratings(rating) VALUES (?)',
|
||||||
(book['rating'],)).lastrowid
|
(2*book['rating'],)).lastrowid
|
||||||
conn.execute('INSERT INTO books_ratings_link(book, rating) VALUES (?,?)', (id, rid))
|
conn.execute('INSERT INTO books_ratings_link(book, rating) VALUES (?,?)', (id, rid))
|
||||||
tags = book['tags']
|
tags = book['tags']
|
||||||
if tags:
|
if tags:
|
||||||
@ -119,6 +127,9 @@ class LibraryDatabase(object):
|
|||||||
(id, format, formats[format]['uncompressed_size'],
|
(id, format, formats[format]['uncompressed_size'],
|
||||||
formats[format]['data']))
|
formats[format]['data']))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
count += 1
|
||||||
|
if progress:
|
||||||
|
progress(count)
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -226,7 +237,7 @@ class LibraryDatabase(object):
|
|||||||
CREATE TABLE books_publishers_link ( id INTEGER PRIMARY KEY,
|
CREATE TABLE books_publishers_link ( id INTEGER PRIMARY KEY,
|
||||||
book INTEGER NOT NULL,
|
book INTEGER NOT NULL,
|
||||||
publisher INTEGER NOT NULL,
|
publisher INTEGER NOT NULL,
|
||||||
UNIQUE(book, publisher)
|
UNIQUE(book)
|
||||||
);
|
);
|
||||||
CREATE INDEX books_publishers_link_bidx ON books_publishers_link (book);
|
CREATE INDEX books_publishers_link_bidx ON books_publishers_link (book);
|
||||||
CREATE INDEX books_publishers_link_aidx ON books_publishers_link (publisher);
|
CREATE INDEX books_publishers_link_aidx ON books_publishers_link (publisher);
|
||||||
@ -336,7 +347,7 @@ class LibraryDatabase(object):
|
|||||||
CREATE TABLE books_series_link ( id INTEGER PRIMARY KEY,
|
CREATE TABLE books_series_link ( id INTEGER PRIMARY KEY,
|
||||||
book INTEGER NOT NULL,
|
book INTEGER NOT NULL,
|
||||||
series INTEGER NOT NULL,
|
series INTEGER NOT NULL,
|
||||||
UNIQUE(book, series)
|
UNIQUE(book)
|
||||||
);
|
);
|
||||||
CREATE INDEX books_series_link_bidx ON books_series_link (book);
|
CREATE INDEX books_series_link_bidx ON books_series_link (book);
|
||||||
CREATE INDEX books_series_link_aidx ON books_series_link (series);
|
CREATE INDEX books_series_link_aidx ON books_series_link (series);
|
||||||
@ -485,7 +496,7 @@ class LibraryDatabase(object):
|
|||||||
CREATE TABLE comments ( id INTEGER PRIMARY KEY,
|
CREATE TABLE comments ( id INTEGER PRIMARY KEY,
|
||||||
book INTEGER NON NULL,
|
book INTEGER NON NULL,
|
||||||
text TEXT NON NULL COLLATE NOCASE,
|
text TEXT NON NULL COLLATE NOCASE,
|
||||||
UNIQUE(book, text)
|
UNIQUE(book)
|
||||||
);
|
);
|
||||||
CREATE INDEX comments_idx ON covers (book);
|
CREATE INDEX comments_idx ON covers (book);
|
||||||
CREATE TRIGGER fkc_comments_insert
|
CREATE TRIGGER fkc_comments_insert
|
||||||
@ -523,29 +534,106 @@ class LibraryDatabase(object):
|
|||||||
CREATE VIEW meta AS
|
CREATE VIEW meta AS
|
||||||
SELECT id, title,
|
SELECT id, title,
|
||||||
(SELECT concat(name) FROM authors WHERE authors.id IN (SELECT author from books_authors_link WHERE book=books.id)) authors,
|
(SELECT concat(name) FROM authors WHERE authors.id IN (SELECT author from books_authors_link WHERE book=books.id)) authors,
|
||||||
(SELECT concat(name) FROM publishers WHERE publishers.id IN (SELECT publisher from books_publishers_link WHERE book=books.id)) publisher,
|
(SELECT name FROM publishers WHERE publishers.id IN (SELECT publisher from books_publishers_link WHERE book=books.id)) publisher,
|
||||||
(SELECT rating FROM ratings WHERE ratings.id IN (SELECT rating from books_ratings_link WHERE book=books.id)) rating,
|
(SELECT rating FROM ratings WHERE ratings.id IN (SELECT rating from books_ratings_link WHERE book=books.id)) rating,
|
||||||
timestamp,
|
timestamp,
|
||||||
(SELECT MAX(uncompressed_size) FROM data WHERE book=books.id) size
|
(SELECT MAX(uncompressed_size) FROM data WHERE book=books.id) size,
|
||||||
|
(SELECT concat(name) FROM tags WHERE tags.id IN (SELECT tag from books_tags_link WHERE book=books.id)) tags,
|
||||||
|
(SELECT text FROM comments WHERE book=books.id) comments,
|
||||||
|
(SELECT name FROM series WHERE series.id IN (SELECT series FROM books_series_link WHERE book=books.id)) series,
|
||||||
|
sort,
|
||||||
|
(SELECT sort FROM authors WHERE authors.id IN (SELECT author from books_authors_link WHERE book=books.id)) authors_sort,
|
||||||
|
(SELECT sort FROM publishers WHERE publishers.id IN (SELECT publisher from books_publishers_link WHERE book=books.id)) publisher_sort
|
||||||
FROM books;
|
FROM books;
|
||||||
'''\
|
'''\
|
||||||
)
|
)
|
||||||
|
conn.execute('pragma user_version=1')
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
def __init__(self, dbpath):
|
def __init__(self, dbpath):
|
||||||
|
self.dbpath = dbpath
|
||||||
self.conn = _connect(dbpath)
|
self.conn = _connect(dbpath)
|
||||||
self.user_version = self.conn.execute('pragma user_version;').next()[0]
|
self.user_version = self.conn.execute('pragma user_version;').next()[0]
|
||||||
|
self.cache = []
|
||||||
|
self.data = []
|
||||||
if self.user_version == 0:
|
if self.user_version == 0:
|
||||||
LibraryDatabase.create_version1(self.conn)
|
LibraryDatabase.create_version1(self.conn)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
def is_empty(self):
|
||||||
if os.path.exists('/tmp/test.sqlite'):
|
return not self.conn.execute('SELECT id FROM books LIMIT 1').fetchone()
|
||||||
os.remove('/tmp/test.sqlite')
|
|
||||||
conn = _connect('/tmp/test.sqlite')
|
def refresh(self, sort_field, ascending):
|
||||||
|
FIELDS = {'title' : 'sort',
|
||||||
|
'authors': 'authors_sort',
|
||||||
|
'publisher': 'publisher_sort',
|
||||||
|
'size': 'size',
|
||||||
|
'date': 'timestamp',
|
||||||
|
'rating': 'rating'
|
||||||
|
}
|
||||||
|
field = FIELDS[sort_field]
|
||||||
|
order = 'ASC'
|
||||||
|
if not ascending:
|
||||||
|
order = 'DESC'
|
||||||
|
|
||||||
|
|
||||||
|
self.cache = self.conn.execute('select * from meta order by size').fetchall()
|
||||||
|
self.cache = self.conn.execute('SELECT * from meta ORDER BY '+field+' '
|
||||||
|
+order).fetchall()
|
||||||
|
self.data = self.cache
|
||||||
|
self.conn.commit()
|
||||||
|
|
||||||
|
def filter(self, filters, refilter=False):
|
||||||
|
'''
|
||||||
|
Filter data based on filters. All the filters must match for an item to
|
||||||
|
be accepted. Matching is case independent regexp matching.
|
||||||
|
@param filters: A list of strings suitable for compilation into regexps
|
||||||
|
@param refilter: If True filters are applied to the results of the previous
|
||||||
|
filtering.
|
||||||
|
'''
|
||||||
|
if not filters:
|
||||||
|
self.data = self.data if refilter else self.cache
|
||||||
|
else:
|
||||||
|
filters = [re.compile(i, re.IGNORECASE) for i in filters if i]
|
||||||
|
matches = []
|
||||||
|
for item in self.data if refilter else self.cache:
|
||||||
|
keep = True
|
||||||
|
test = ' '.join([item[i] if item[i] else '' for i in (1,2,3,7,8,9)])
|
||||||
|
for filter in filters:
|
||||||
|
if not filter.search(test):
|
||||||
|
keep = False
|
||||||
|
break
|
||||||
|
if keep:
|
||||||
|
matches.append(item)
|
||||||
|
self.data = matches
|
||||||
|
|
||||||
|
def rows(self):
|
||||||
|
return len(self.data) if self.data else 0
|
||||||
|
|
||||||
|
def title(self, index):
|
||||||
|
return self.data[index][1]
|
||||||
|
|
||||||
|
def authors(self, index):
|
||||||
|
return self.data[index][2]
|
||||||
|
|
||||||
|
def publisher(self, index):
|
||||||
|
return self.data[index][3]
|
||||||
|
|
||||||
|
def rating(self, index):
|
||||||
|
return self.data[index][4]
|
||||||
|
|
||||||
|
def timestamp(self, index):
|
||||||
|
return self.data[index][5]
|
||||||
|
|
||||||
|
def max_size(self, index):
|
||||||
|
return self.data[index][6]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
from IPython.Shell import IPShellEmbed
|
from IPython.Shell import IPShellEmbed
|
||||||
ipshell = IPShellEmbed([],
|
ipshell = IPShellEmbed([],
|
||||||
banner = 'Dropping into IPython',
|
banner = 'Dropping into IPython',
|
||||||
exit_msg = 'Leaving Interpreter, back to program.')
|
exit_msg = 'Leaving Interpreter, back to program.')
|
||||||
LibraryDatabase.create_version1(conn)
|
db = LibraryDatabase('/home/kovid/library1.db')
|
||||||
LibraryDatabase.import_old_database('/home/kovid/library.db', conn)
|
conn = db.conn
|
||||||
ipshell()
|
ipshell()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user