From afcaac89c6dc4fc44b81a92474aabb71d7a0af9e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 28 Apr 2022 12:34:44 +0530 Subject: [PATCH] API to get FTS indexing progress --- src/calibre/db/cache.py | 25 +++++++++++++++++++------ src/calibre/db/fts/connect.py | 4 ++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 907f62c44e..36236ad62e 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -431,24 +431,37 @@ class Cache: self.fts_queue_thread = None self.fts_job_queue = Queue() self.backend.initialize_fts(weakref.ref(self)) + if self.is_fts_enabled(): + self.start_fts_pool() + + def start_fts_pool(self): + from threading import Thread + self.fts_queue_thread = Thread(name='FTSQueue', target=Cache.dispatch_fts_jobs, args=(self.fts_job_queue, weakref.ref(self)), daemon=True) + self.fts_queue_thread.start() + self.backend.fts.pool.initialize() + self.backend.fts.pool.initialized.wait() self.queue_next_fts_job() @read_api def is_fts_enabled(self): return self.backend.fts_enabled + @read_api + def fts_indexing_progress(self): + if not self.is_fts_enabled(): + return 0, 0 + num_to_scan = self.backend.fts.number_dirtied() + if not num_to_scan: + return 0, 1 + return num_to_scan, (self.backend.get('SELECT COUNT(*) FROM main.data')[0][0] or 0) + @write_api def enable_fts(self, enabled=True, start_pool=True, mark_all_dirty=False): fts = self.backend.enable_fts(weakref.ref(self) if enabled else None) if fts and start_pool: # used in the tests - from threading import Thread if mark_all_dirty: fts.dirty_existing() - self.fts_queue_thread = Thread(name='FTSQueue', target=Cache.dispatch_fts_jobs, args=(self.fts_job_queue, weakref.ref(self)), daemon=True) - self.fts_queue_thread.start() - fts.pool.initialize() - fts.pool.initialized.wait() - self.queue_next_fts_job() + self.start_fts_pool() if not fts and self.fts_queue_thread: self.fts_job_queue.put(None) self.fts_queue_thread = None diff --git a/src/calibre/db/fts/connect.py b/src/calibre/db/fts/connect.py index 49c791fbbe..092a1634ce 100644 --- a/src/calibre/db/fts/connect.py +++ b/src/calibre/db/fts/connect.py @@ -57,6 +57,10 @@ class FTS: SELECT book, format FROM main.data; ''') + def number_dirtied(self): + conn = self.get_connection() + return conn.get('''SELECT COUNT(*) from fts_db.dirtied_formats''')[0][0] + def all_currently_dirty(self): conn = self.get_connection() return conn.get('''SELECT book, format from fts_db.dirtied_formats''', all=True)