From 2023fb01d0b787d201231073540a3e8cf2c27ddb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 3 Sep 2013 10:34:54 +0530 Subject: [PATCH] newdb: Replace dump and restore with vacuum apsw has various issues with dump and restore, so replace it with vacuum. Fixes #1217988 [Database integrity issue with V 1.0.0](https://bugs.launchpad.net/calibre/+bug/1217988) --- src/calibre/db/backend.py | 5 +++++ src/calibre/db/cache.py | 4 ++++ src/calibre/gui2/dialogs/check_library.py | 13 +++++-------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index 5c0ffcf022..1dab3cb2f5 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -995,6 +995,8 @@ class DB(object): shell = Shell(db=self.conn, stdout=buf) shell.process_command('.dump') sql = buf.getvalue() + del shell + del buf with TemporaryFile(suffix='_tmpdb.db', dir=os.path.dirname(self.dbpath)) as tmpdb: callback(_('Restoring database from SQL') + '...') @@ -1008,6 +1010,9 @@ class DB(object): finally: self.reopen() + def vacuum(self): + self.conn.execute('VACUUM') + @dynamic_property def user_version(self): doc = 'The user version of this database' diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index e16079efb2..40840f5910 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -1715,6 +1715,10 @@ class Cache(object): def dump_and_restore(self, callback=None, sql=None): return self.backend.dump_and_restore(callback=callback, sql=sql) + @write_api + def vacuum(self): + self.backend.vacuum() + @write_api def close(self): self.backend.close() diff --git a/src/calibre/gui2/dialogs/check_library.py b/src/calibre/gui2/dialogs/check_library.py index 2cb15c50d1..8c5e89ec2e 100644 --- a/src/calibre/gui2/dialogs/check_library.py +++ b/src/calibre/gui2/dialogs/check_library.py @@ -24,18 +24,15 @@ class DBCheck(QDialog): # {{{ QDialog.__init__(self, parent) self.l = QVBoxLayout() self.setLayout(self.l) - self.l1 = QLabel(_('Checking database integrity') + ' ' + + self.l1 = QLabel(_('Vacuuming database to improve performance.') + ' ' + _('This will take a while, please wait...')) - self.setWindowTitle(_('Checking database integrity')) + self.setWindowTitle(_('Vacuuming...')) self.l1.setWordWrap(True) self.l.addWidget(self.l1) self.msg = QLabel('') self.update_msg.connect(self.msg.setText, type=Qt.QueuedConnection) self.l.addWidget(self.msg) self.msg.setWordWrap(True) - self.bb = QDialogButtonBox(QDialogButtonBox.Cancel) - self.l.addWidget(self.bb) - self.bb.rejected.connect(self.reject) self.resize(self.sizeHint() + QSize(100, 50)) self.error = None self.db = db.new_api @@ -43,15 +40,15 @@ class DBCheck(QDialog): # {{{ self.rejected = False def start(self): - t = self.thread = Thread(target=self.dump_and_restore) + t = self.thread = Thread(target=self.vacuum) t.daemon = True t.start() QTimer.singleShot(100, self.check) self.exec_() - def dump_and_restore(self): + def vacuum(self): try: - self.db.dump_and_restore(self.update_msg.emit) + self.db.vacuum() except Exception as e: import traceback self.error = (as_unicode(e), traceback.format_exc())