mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -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,
|
||||
book INTEGER NOT NULL,
|
||||
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
|
||||
BEGIN
|
||||
INSERT INTO fts_db.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(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
||||
INSERT INTO books_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER fts_db.books_fts_delete_trg AFTER DELETE ON fts_db.books_text
|
||||
BEGIN
|
||||
INSERT INTO fts_db.books_fts(fts_db.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(books_fts, 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;
|
||||
|
||||
CREATE TRIGGER fts_db.books_fts_update_trg AFTER UPDATE ON fts_db.books_text
|
||||
BEGIN
|
||||
INSERT INTO fts_db.books_fts(fts_db.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 fts_db.books_fts_stemmed(fts_db.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(books_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
|
||||
INSERT INTO books_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
||||
INSERT INTO books_fts_stemmed(books_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
|
||||
INSERT INTO books_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
|
||||
END;
|
||||
|
||||
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'))
|
||||
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')
|
||||
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)
|
||||
|
@ -9,6 +9,9 @@ class SchemaUpgrade:
|
||||
self.conn = conn
|
||||
conn.execute('BEGIN EXCLUSIVE TRANSACTION')
|
||||
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:
|
||||
uv = self.user_version
|
||||
meth = getattr(self, f'upgrade_version_{uv}', None)
|
||||
@ -17,6 +20,8 @@ class SchemaUpgrade:
|
||||
print(f'Upgrading FTS database to version {uv+1}...')
|
||||
meth()
|
||||
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):
|
||||
conn.execute('ROLLBACK')
|
||||
raise
|
||||
|
Loading…
x
Reference in New Issue
Block a user