From 3f70d9ef3759373b336678c2dba25f33247817fc 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 Backported from 8e995a69bfa003ab822b55731429d84b3bc5626f. 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 b1e0821..e00db6b 100644 --- a/offlineimap/accounts.py +++ b/offlineimap/accounts.py @@ -510,6 +510,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 c627e97..55109a7 100644 --- a/offlineimap/folder/LocalStatus.py +++ b/offlineimap/folder/LocalStatus.py @@ -155,6 +155,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 07cff89..79c6e99 100644 --- a/offlineimap/folder/LocalStatusSQLite.py +++ b/offlineimap/folder/LocalStatusSQLite.py @@ -59,9 +59,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) @@ -85,10 +87,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)