diff --git a/resources/fts_triggers.sql b/resources/fts_triggers.sql index c1d4a41844..996866afd7 100644 --- a/resources/fts_triggers.sql +++ b/resources/fts_triggers.sql @@ -4,8 +4,8 @@ CREATE TEMP TRIGGER fts_db_book_deleted_trg AFTER DELETE ON main.books BEGIN 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; + DELETE FROM books_text WHERE book=OLD.book AND format=OLD.format; + DELETE FROM dirtied_formats WHERE book=OLD.book AND format=OLD.format; END; CREATE TEMP TRIGGER fts_db_format_added_trg AFTER INSERT ON main.data BEGIN diff --git a/src/calibre/db/fts/connect.py b/src/calibre/db/fts/connect.py index 47bacb65d4..6c8271f226 100644 --- a/src/calibre/db/fts/connect.py +++ b/src/calibre/db/fts/connect.py @@ -39,3 +39,7 @@ class FTS: def all_currently_dirty(self): conn = self.get_connection() return conn.get('''SELECT book, format from fts_db.dirtied_formats''', all=True) + + def clear_all_dirty(self): + conn = self.get_connection() + conn.execute('DELETE FROM fts_db.dirtied_formats') diff --git a/src/calibre/db/tests/fts_api.py b/src/calibre/db/tests/fts_api.py index 7a07d4b9e1..d866399523 100644 --- a/src/calibre/db/tests/fts_api.py +++ b/src/calibre/db/tests/fts_api.py @@ -4,6 +4,7 @@ import builtins import sys +from io import BytesIO from calibre.db.tests.base import BaseTest @@ -29,10 +30,19 @@ class FTSAPITest(BaseTest): def test_fts_triggers(self): cache = self.init_cache() fts = cache.backend.enable_fts() - cd = fts.all_currently_dirty() - self.ae(len(cd), 3) + self.ae(fts.all_currently_dirty(), [(1, 'FMT1'), (1, 'FMT2'), (2, 'FMT1')]) fts.dirty_existing() - self.ae(len(cd), 3) + self.ae(fts.all_currently_dirty(), [(1, 'FMT1'), (1, 'FMT2'), (2, 'FMT1')]) + cache.remove_formats({2: ['FMT1']}) + self.ae(fts.all_currently_dirty(), [(1, 'FMT1'), (1, 'FMT2')]) + cache.remove_books((1,)) + self.ae(fts.all_currently_dirty(), []) + cache.add_format(2, 'ADDED', BytesIO(b'data')) + self.ae(fts.all_currently_dirty(), [(2, 'ADDED')]) + fts.clear_all_dirty() + self.ae(fts.all_currently_dirty(), []) + cache.add_format(2, 'ADDED', BytesIO(b'data2')) + self.ae(fts.all_currently_dirty(), [(2, 'ADDED')]) def find_tests():