Skip to content

Commit 129dec4

Browse files
CopilotPhBouzid
andcommitted
fix: address review comments on db.py thread safety and resource leaks
Co-authored-by: PhBouzid <15084032+PhBouzid@users.noreply.github.com>
1 parent 585440e commit 129dec4

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

src/db.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ class DbException(Exception):
3030

3131

3232
class DB:
33-
_lock = threading.Lock()
34-
3533
def __init__(self, dbfile):
3634
"""
3735
Create a connection to sqlite database
@@ -42,6 +40,7 @@ def __init__(self, dbfile):
4240
:__tableName: table name for jobs
4341
"""
4442
self.__dbfile = dbfile
43+
self._lock = threading.Lock()
4544
try:
4645
log.debug("Database file: %s" % self.__dbfile)
4746
self.__conn = DB.__create_connection(dbfile)
@@ -77,37 +76,44 @@ def __create_table(self, query):
7776
log.exception("Database Error: %s" % err)
7877
return 0
7978

80-
@staticmethod
81-
def __log_and_execute(cursor, sql, args):
82-
with DB._lock:
79+
def __log_and_execute(self, cursor, sql, args):
80+
with self._lock:
8381
log.debug("SQL command: " + sql.replace('?', '%s') % args)
8482
cursor.execute(sql, args)
8583

8684
def __insert_or_delete(self, query, params, login=False):
8785
try:
8886
if login:
89-
cursor = DB.__create_connection(self.__dbfile).cursor()
87+
conn = DB.__create_connection(self.__dbfile)
88+
cursor = conn.cursor()
9089
else:
9190
cursor = self.__conn.cursor()
9291
with cursor:
93-
DB.__log_and_execute(cursor, query, params)
92+
self.__log_and_execute(cursor, query, params)
9493
return 1
9594
except apsw.Error as err:
9695
log.exception("Database Error: %s" % err)
9796
return 0
97+
finally:
98+
if login and 'conn' in locals():
99+
conn.close()
98100

99101
def __select(self, query, params, login=False):
100102
try:
101103
if login:
102-
cursor = DB.__create_connection(self.__dbfile).cursor()
104+
conn = DB.__create_connection(self.__dbfile)
105+
cursor = conn.cursor()
103106
else:
104107
cursor = self.__conn.cursor()
105108
with cursor:
106-
DB.__log_and_execute(cursor, query, params)
109+
self.__log_and_execute(cursor, query, params)
107110
return cursor.fetchall()
108111
except apsw.Error as err:
109112
log.exception("Database Error: %s" % err)
110113
return None
114+
finally:
115+
if login and 'conn' in locals():
116+
conn.close()
111117

112118
def update_job(self, task_id, type, status, vault, error, login=False):
113119
# this is required as java json convertion fails for None value of error

0 commit comments

Comments
 (0)