Fix SQLite concurrency errors
This commit is contained in:
parent
84c39f3baa
commit
61c72ac3ea
2 changed files with 12 additions and 10 deletions
|
@ -56,6 +56,7 @@ class Db(object):
|
||||||
self.schema["version"] = self.schema.get("version", 1)
|
self.schema["version"] = self.schema.get("version", 1)
|
||||||
self.conn = None
|
self.conn = None
|
||||||
self.cur = None
|
self.cur = None
|
||||||
|
self.progress_sleeping = False
|
||||||
self.log = logging.getLogger("Db:%s" % schema["db_name"])
|
self.log = logging.getLogger("Db:%s" % schema["db_name"])
|
||||||
self.table_names = None
|
self.table_names = None
|
||||||
self.collect_stats = False
|
self.collect_stats = False
|
||||||
|
@ -92,7 +93,9 @@ class Db(object):
|
||||||
)
|
)
|
||||||
|
|
||||||
def progress(self, *args, **kwargs):
|
def progress(self, *args, **kwargs):
|
||||||
gevent.sleep()
|
self.progress_sleeping = True
|
||||||
|
time.sleep(0.001)
|
||||||
|
self.progress_sleeping = False
|
||||||
|
|
||||||
# Execute query using dbcursor
|
# Execute query using dbcursor
|
||||||
def execute(self, query, params=None):
|
def execute(self, query, params=None):
|
||||||
|
@ -101,6 +104,10 @@ class Db(object):
|
||||||
return self.cur.execute(query, params)
|
return self.cur.execute(query, params)
|
||||||
|
|
||||||
def commit(self, reason="Unknown"):
|
def commit(self, reason="Unknown"):
|
||||||
|
if self.progress_sleeping:
|
||||||
|
self.log.debug("Commit ignored: Progress sleeping")
|
||||||
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
s = time.time()
|
s = time.time()
|
||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
|
|
|
@ -84,16 +84,11 @@ class DbCursor:
|
||||||
|
|
||||||
def execute(self, query, params=None):
|
def execute(self, query, params=None):
|
||||||
query = query.strip()
|
query = query.strip()
|
||||||
|
while self.db.progress_sleeping:
|
||||||
|
time.sleep(0.1)
|
||||||
|
|
||||||
self.db.last_query_time = time.time()
|
self.db.last_query_time = time.time()
|
||||||
|
|
||||||
if time.time() - self.db.last_sleep_time > 0.1:
|
|
||||||
if self.db.num_execute_since_sleep > 100:
|
|
||||||
gevent.sleep(0.001)
|
|
||||||
self.db.num_execute_since_sleep = 0
|
|
||||||
self.db.last_sleep_time = time.time()
|
|
||||||
|
|
||||||
self.db.num_execute_since_sleep += 1
|
|
||||||
|
|
||||||
query, params = self.parseQuery(query, params)
|
query, params = self.parseQuery(query, params)
|
||||||
|
|
||||||
s = time.time()
|
s = time.time()
|
||||||
|
@ -128,7 +123,7 @@ class DbCursor:
|
||||||
|
|
||||||
params = query_sets
|
params = query_sets
|
||||||
params.update(query_wheres)
|
params.update(query_wheres)
|
||||||
self.cursor.execute(
|
self.execute(
|
||||||
"UPDATE %s SET %s WHERE %s" % (table, ", ".join(sql_sets), " AND ".join(sql_wheres)),
|
"UPDATE %s SET %s WHERE %s" % (table, ", ".join(sql_sets), " AND ".join(sql_wheres)),
|
||||||
params
|
params
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue