mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-07 10:14:46 -04:00
More work on FTS
This commit is contained in:
parent
ba1707169a
commit
e3d6c9f192
@ -1,3 +1,9 @@
|
|||||||
|
CREATE TABLE fts_db.dirtied_formats ( id INTEGER PRIMARY KEY,
|
||||||
|
book INTEGER NOT NULL,
|
||||||
|
format TEXT NOT NULL COLLATE NOCASE,
|
||||||
|
UNIQUE(book, format)
|
||||||
|
);
|
||||||
|
|
||||||
CREATE TABLE fts_db.books_text ( id INTEGER PRIMARY KEY,
|
CREATE TABLE fts_db.books_text ( id INTEGER PRIMARY KEY,
|
||||||
book INTEGER NOT NULL,
|
book INTEGER NOT NULL,
|
||||||
format TEXT NOT NULL COLLATE NOCASE,
|
format TEXT NOT NULL COLLATE NOCASE,
|
||||||
@ -15,22 +21,22 @@ CREATE VIRTUAL TABLE fts_db.books_fts_stemmed USING fts5(searchable_text, conten
|
|||||||
|
|
||||||
CREATE TRIGGER fts_db.books_fts_insert_trg AFTER INSERT ON fts_db.books_text
|
CREATE TRIGGER fts_db.books_fts_insert_trg AFTER INSERT ON fts_db.books_text
|
||||||
BEGIN
|
BEGIN
|
||||||
INSERT INTO fts_db.books_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
INSERT INTO books_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
||||||
INSERT INTO fts_db.books_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
INSERT INTO books_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
||||||
END;
|
END;
|
||||||
|
|
||||||
CREATE TRIGGER fts_db.books_fts_delete_trg AFTER DELETE ON fts_db.books_text
|
CREATE TRIGGER fts_db.books_fts_delete_trg AFTER DELETE ON fts_db.books_text
|
||||||
BEGIN
|
BEGIN
|
||||||
INSERT INTO fts_db.books_fts(fts_db.books_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
|
INSERT INTO books_fts(books_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
|
||||||
INSERT INTO fts_db.books_fts_stemmed(fts_db.books_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
|
INSERT INTO books_fts_stemmed(books_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
|
||||||
END;
|
END;
|
||||||
|
|
||||||
CREATE TRIGGER fts_db.books_fts_update_trg AFTER UPDATE ON fts_db.books_text
|
CREATE TRIGGER fts_db.books_fts_update_trg AFTER UPDATE ON fts_db.books_text
|
||||||
BEGIN
|
BEGIN
|
||||||
INSERT INTO fts_db.books_fts(fts_db.books_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
|
INSERT INTO books_fts(books_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
|
||||||
INSERT INTO fts_db.books_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
INSERT INTO books_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
||||||
INSERT INTO fts_db.books_fts_stemmed(fts_db.books_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
|
INSERT INTO books_fts_stemmed(books_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
|
||||||
INSERT INTO fts_db.books_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
INSERT INTO books_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
||||||
END;
|
END;
|
||||||
|
|
||||||
PRAGMA fts_db.user_version=1;
|
PRAGMA fts_db.user_version=1;
|
||||||
|
17
resources/fts_triggers.sql
Normal file
17
resources/fts_triggers.sql
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
CREATE TEMP TRIGGER fts_db_book_deleted_trg AFTER DELETE ON main.books BEGIN
|
||||||
|
DELETE FROM books_text WHERE book=OLD.id;
|
||||||
|
DELETE FROM dirtied_formats WHERE book=OLD.id;
|
||||||
|
END;
|
||||||
|
|
||||||
|
CREATE TEMP TRIGGER fts_db_format_deleted_trg AFTER DELETE ON main.data BEGIN
|
||||||
|
DELETE FROM books_text WHERE book=OLD.id AND format=OLD.format;
|
||||||
|
DELETE FROM dirtied_formats WHERE book=OLD.id AND format=OLD.format;
|
||||||
|
END;
|
||||||
|
|
||||||
|
CREATE TEMP TRIGGER fts_db_format_added_trg AFTER INSERT ON main.data BEGIN
|
||||||
|
INSERT INTO dirtied_formats(book, format) VALUES (NEW.book, NEW.format);
|
||||||
|
END;
|
||||||
|
|
||||||
|
CREATE TEMP TRIGGER fts_db_format_updated_trg AFTER UPDATE ON main.data BEGIN
|
||||||
|
INSERT INTO dirtied_formats(book, format) VALUES (NEW.book, NEW.format);
|
||||||
|
END;
|
@ -20,14 +20,4 @@ class FTS:
|
|||||||
main_db_path = os.path.abspath(conn.db_filename('main'))
|
main_db_path = os.path.abspath(conn.db_filename('main'))
|
||||||
self.dbpath = os.path.join(os.path.dirname(main_db_path), 'full-text-search.db')
|
self.dbpath = os.path.join(os.path.dirname(main_db_path), 'full-text-search.db')
|
||||||
conn.execute(f'ATTACH DATABASE "{self.dbpath}" AS fts_db')
|
conn.execute(f'ATTACH DATABASE "{self.dbpath}" AS fts_db')
|
||||||
fts_sqlite = P('fts_sqlite.sql', data=True, allow_user_override=False).decode('utf-8')
|
|
||||||
cur = self.conn.cursor()
|
|
||||||
cur.execute('BEGIN EXCLUSIVE TRANSACTION')
|
|
||||||
try:
|
|
||||||
cur.execute(fts_sqlite)
|
|
||||||
except (Exception, BaseException):
|
|
||||||
cur.execute('ROLLBACK')
|
|
||||||
raise
|
|
||||||
else:
|
|
||||||
cur.execute('COMMIT')
|
|
||||||
SchemaUpgrade(conn)
|
SchemaUpgrade(conn)
|
||||||
|
@ -9,6 +9,9 @@ class SchemaUpgrade:
|
|||||||
self.conn = conn
|
self.conn = conn
|
||||||
conn.execute('BEGIN EXCLUSIVE TRANSACTION')
|
conn.execute('BEGIN EXCLUSIVE TRANSACTION')
|
||||||
try:
|
try:
|
||||||
|
if self.user_version == 0:
|
||||||
|
fts_sqlite = P('fts_sqlite.sql', data=True, allow_user_override=False).decode('utf-8')
|
||||||
|
conn.execute(fts_sqlite)
|
||||||
while True:
|
while True:
|
||||||
uv = self.user_version
|
uv = self.user_version
|
||||||
meth = getattr(self, f'upgrade_version_{uv}', None)
|
meth = getattr(self, f'upgrade_version_{uv}', None)
|
||||||
@ -17,6 +20,8 @@ class SchemaUpgrade:
|
|||||||
print(f'Upgrading FTS database to version {uv+1}...')
|
print(f'Upgrading FTS database to version {uv+1}...')
|
||||||
meth()
|
meth()
|
||||||
self.user_version = uv + 1
|
self.user_version = uv + 1
|
||||||
|
fts_triggers = P('fts_triggers.sql', data=True, allow_user_override=False).decode('utf-8')
|
||||||
|
conn.execute(fts_triggers)
|
||||||
except (Exception, BaseException):
|
except (Exception, BaseException):
|
||||||
conn.execute('ROLLBACK')
|
conn.execute('ROLLBACK')
|
||||||
raise
|
raise
|
||||||
|
Loading…
x
Reference in New Issue
Block a user