From 05c75e8c8df8aacfd0b9b8618cd39523c4f43630 Mon Sep 17 00:00:00 2001 From: Nicolas Sebrecht Date: Thu, 12 May 2016 18:27:14 +0200 Subject: [PATCH] sqlite: open database when we use it rather than at instantiation time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We currently close the database as soon as possible while we handle the status backend but this is still too early because autorefresh induces looping on this code block. Instead of delaying the closing outside of the loop, it's easier to delay the opening as late as possible (inside the loop). The downside is that the database is opened/closed more than once when autorefresh is enabled. The good news is that this make the code much easier. Fixes regression introduces by 6fb5700. Reported-by: Łukasz Żarnowiecki Signed-off-by: Nicolas Sebrecht --- offlineimap/accounts.py | 1 + offlineimap/folder/LocalStatus.py | 3 +++ offlineimap/folder/LocalStatusSQLite.py | 8 +++++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/offlineimap/accounts.py b/offlineimap/accounts.py index f3e50ea..5acd82a 100644 --- a/offlineimap/accounts.py +++ b/offlineimap/accounts.py @@ -513,6 +513,7 @@ def syncfolder(account, remotefolder, quick): # Load status folder. statusfolder = statusrepos.getfolder(remotefolder.getvisiblename(). replace(remoterepos.getsep(), statusrepos.getsep())) + statusfolder.openfiles() if localfolder.get_uidvalidity() == None: # This is a new folder, so delete the status cache to be diff --git a/offlineimap/folder/LocalStatus.py b/offlineimap/folder/LocalStatus.py index 2bfd30e..e5d4ccf 100644 --- a/offlineimap/folder/LocalStatus.py +++ b/offlineimap/folder/LocalStatus.py @@ -154,6 +154,9 @@ class LocalStatusFolder(BaseFolder): self.readstatus(cachefd) cachefd.close() + def openfiles(self): + pass # Closing files is done on a per-transaction basis. + def closefiles(self): pass # Closing files is done on a per-transaction basis. diff --git a/offlineimap/folder/LocalStatusSQLite.py b/offlineimap/folder/LocalStatusSQLite.py index 550154e..1a9f03c 100644 --- a/offlineimap/folder/LocalStatusSQLite.py +++ b/offlineimap/folder/LocalStatusSQLite.py @@ -58,9 +58,11 @@ class LocalStatusSQLiteFolder(BaseFolder): raise UserWarning("SQLite database path '%s' is not a directory."% dirname) - # dblock protects against concurrent writes in same connection. + # This lock protects against concurrent writes in same connection. self._dblock = Lock() + self.connection = None + def openfiles(self): # Try to establish connection, no need for threadsafety in __init__. try: self.connection = sqlite.connect(self.filename, check_same_thread=False) @@ -84,10 +86,10 @@ class LocalStatusSQLiteFolder(BaseFolder): cursor = self.connection.execute( "SELECT value from metadata WHERE key='db_version'") except sqlite.DatabaseError: - #db file missing or corrupt, recreate it. + # db file missing or corrupt, recreate it. self.__create_db() else: - # fetch db version and upgrade if needed + # Fetch db version and upgrade if needed. version = int(cursor.fetchone()[0]) if version < LocalStatusSQLiteFolder.cur_version: self.__upgrade_db(version)