sqlite: open database when we use it rather than at instantiation time

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 <dolohow@outlook.com>
Signed-off-by: Nicolas Sebrecht <nicolas.s-dev@laposte.net>
This commit is contained in:
Nicolas Sebrecht 2016-05-12 18:27:14 +02:00
parent b840e66d59
commit 3f70d9ef37
3 changed files with 9 additions and 3 deletions

View File

@ -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

View File

@ -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.

View File

@ -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)