mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Dont use a timer for indexing progress
This makes things very slow as it requires locking the database ever second. Instead use the db's event system to deliver indexing progress changed events.
This commit is contained in:
parent
e747fddf0d
commit
152145e1ad
@ -431,6 +431,7 @@ class Cache:
|
|||||||
def initialize_fts(self):
|
def initialize_fts(self):
|
||||||
self.fts_queue_thread = None
|
self.fts_queue_thread = None
|
||||||
self.fts_job_queue = Queue()
|
self.fts_job_queue = Queue()
|
||||||
|
self.fts_indexing_left = self.fts_indexing_total = 0
|
||||||
fts = self.backend.initialize_fts(weakref.ref(self))
|
fts = self.backend.initialize_fts(weakref.ref(self))
|
||||||
if self.is_fts_enabled():
|
if self.is_fts_enabled():
|
||||||
self.start_fts_pool()
|
self.start_fts_pool()
|
||||||
@ -448,14 +449,20 @@ class Cache:
|
|||||||
def is_fts_enabled(self):
|
def is_fts_enabled(self):
|
||||||
return self.backend.fts_enabled
|
return self.backend.fts_enabled
|
||||||
|
|
||||||
@read_api
|
@api
|
||||||
def fts_indexing_progress(self):
|
def fts_indexing_progress(self):
|
||||||
if not self.is_fts_enabled():
|
return self.fts_indexing_left, self.fts_indexing_total
|
||||||
return 0, 0
|
|
||||||
num_to_scan = self.backend.fts.number_dirtied()
|
def _update_fts_indexing_numbers(self):
|
||||||
if not num_to_scan:
|
# this is called when new formats are added and when a format is
|
||||||
return 0, 1
|
# indexed, but NOT when books or formats are deleted, so total may not
|
||||||
return num_to_scan, (self.backend.get('SELECT COUNT(*) FROM main.data')[0][0] or 0)
|
# be up to date.
|
||||||
|
nl = self.backend.fts.number_dirtied()
|
||||||
|
nt = self.backend.get('SELECT COUNT(*) FROM main.data')[0][0] or 0
|
||||||
|
if (self.fts_indexing_left, self.fts_indexing_total) != (nl, nt):
|
||||||
|
self.fts_indexing_left = nl
|
||||||
|
self.fts_indexing_total = nt
|
||||||
|
self.event_dispatcher(EventType.indexing_progress_changed, nl, nt)
|
||||||
|
|
||||||
@write_api
|
@write_api
|
||||||
def enable_fts(self, enabled=True, start_pool=True):
|
def enable_fts(self, enabled=True, start_pool=True):
|
||||||
@ -527,10 +534,13 @@ class Cache:
|
|||||||
if not self.backend.fts_enabled:
|
if not self.backend.fts_enabled:
|
||||||
return
|
return
|
||||||
self.fts_job_queue.put(True)
|
self.fts_job_queue.put(True)
|
||||||
|
self._update_fts_indexing_numbers()
|
||||||
|
|
||||||
@write_api
|
@write_api
|
||||||
def commit_fts_result(self, book_id, fmt, fmt_size, fmt_hash, text, err_msg):
|
def commit_fts_result(self, book_id, fmt, fmt_size, fmt_hash, text, err_msg):
|
||||||
return self.backend.commit_fts_result(book_id, fmt, fmt_size, fmt_hash, text, err_msg)
|
ans = self.backend.commit_fts_result(book_id, fmt, fmt_size, fmt_hash, text, err_msg)
|
||||||
|
self._update_fts_indexing_numbers()
|
||||||
|
return ans
|
||||||
|
|
||||||
@api
|
@api
|
||||||
def reindex_fts(self):
|
def reindex_fts(self):
|
||||||
|
@ -40,6 +40,9 @@ class EventType(Enum):
|
|||||||
#: When a book format is edited, with arguments: (book_id, fmt)
|
#: When a book format is edited, with arguments: (book_id, fmt)
|
||||||
book_edited = auto()
|
book_edited = auto()
|
||||||
|
|
||||||
|
#: When the indexing progress changes
|
||||||
|
indexing_progress_changed = auto()
|
||||||
|
|
||||||
|
|
||||||
class EventDispatcher(Thread):
|
class EventDispatcher(Thread):
|
||||||
|
|
||||||
|
@ -5,13 +5,15 @@
|
|||||||
import os
|
import os
|
||||||
from qt.core import (
|
from qt.core import (
|
||||||
QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QPushButton,
|
QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QPushButton,
|
||||||
QRadioButton, QTimer, QVBoxLayout, QWidget, pyqtSignal
|
QRadioButton, QVBoxLayout, QWidget, pyqtSignal
|
||||||
)
|
)
|
||||||
|
|
||||||
from calibre import detect_ncpus
|
from calibre import detect_ncpus
|
||||||
from calibre.db.cache import Cache
|
from calibre.db.cache import Cache
|
||||||
|
from calibre.db.listeners import EventType
|
||||||
from calibre.gui2.dialogs.confirm_delete import confirm
|
from calibre.gui2.dialogs.confirm_delete import confirm
|
||||||
from calibre.gui2.fts.utils import get_db
|
from calibre.gui2.fts.utils import get_db
|
||||||
|
from calibre.gui2.ui import get_gui
|
||||||
|
|
||||||
|
|
||||||
class IndexingProgress:
|
class IndexingProgress:
|
||||||
@ -139,11 +141,20 @@ class ScanStatus(QWidget):
|
|||||||
l.addStretch(10)
|
l.addStretch(10)
|
||||||
self.apply_fts_state()
|
self.apply_fts_state()
|
||||||
self.enable_fts.toggled.connect(self.change_fts_state)
|
self.enable_fts.toggled.connect(self.change_fts_state)
|
||||||
self.indexing_status_timer = t = QTimer(self)
|
|
||||||
t.timeout.connect(self.update_stats)
|
|
||||||
t.setInterval(1000)
|
|
||||||
t.start()
|
|
||||||
self.update_stats()
|
self.update_stats()
|
||||||
|
gui = get_gui()
|
||||||
|
if gui is None:
|
||||||
|
self.db.add_listener(self)
|
||||||
|
else:
|
||||||
|
gui.add_db_listener(self.gui_update_event)
|
||||||
|
|
||||||
|
def gui_update_event(self, db, event_type, event_data):
|
||||||
|
if event_type is EventType.indexing_progress_changed:
|
||||||
|
self.update_stats()
|
||||||
|
|
||||||
|
def __call__(self, event_type, library_id, event_data):
|
||||||
|
if event_type is EventType.indexing_progress_changed:
|
||||||
|
self.update_stats()
|
||||||
|
|
||||||
def update_stats(self):
|
def update_stats(self):
|
||||||
changed = self.indexing_progress.update(*self.db.fts_indexing_progress())
|
changed = self.indexing_progress.update(*self.db.fts_indexing_progress())
|
||||||
@ -200,10 +211,9 @@ class ScanStatus(QWidget):
|
|||||||
self.apply_fts_state()
|
self.apply_fts_state()
|
||||||
|
|
||||||
def startup(self):
|
def startup(self):
|
||||||
self.indexing_status_timer.start()
|
pass
|
||||||
|
|
||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
self.indexing_status_timer.stop()
|
|
||||||
self.scan_progress.slow_button.setChecked(True)
|
self.scan_progress.slow_button.setChecked(True)
|
||||||
self.reset_indexing_state_for_current_db()
|
self.reset_indexing_state_for_current_db()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user