66import logging
77import sqlparse
88from configparser import ConfigParser
9- from pkg_resources import parse_version
9+ from packaging . version import Version
1010from PySide6 .QtCore import QStandardPaths
1111from PySide6 .QtWidgets import QApplication , QMessageBox
1212from PySide6 .QtSql import QSql , QSqlDatabase , QSqlQuery , QSqlTableModel
@@ -79,6 +79,8 @@ def message(self):
7979class JalDB :
8080 _tables = []
8181 _instances_with_cache = []
82+ _sql_call_count = 0
83+ _trace_sql_requests = os .environ .get ('TRACE_SQL' , '' ).upper () == 'YES'
8284 PATH_APP = auto ()
8385 PATH_DB_FILE = auto ()
8486 PATH_LANG = auto ()
@@ -133,7 +135,7 @@ def init_db(self) -> JalDBError:
133135 error = db .lastError ()
134136 return JalDBError (JalDBError .DbInitFailure , details = f"{ error .driverText ()} : { error .databaseText ()} , file: { db_file } " )
135137 sqlite_version = self .get_engine_version ()
136- if parse_version (sqlite_version ) < parse_version (Setup .SQLITE_MIN_VERSION ):
138+ if Version (sqlite_version ) < Version (Setup .SQLITE_MIN_VERSION ):
137139 db .close ()
138140 return JalDBError (JalDBError .OutdatedSqlite )
139141 JalDB ._tables = db .tables (QSql .Tables ) + db .tables (QSql .Views ) # Bitwise or somehow doesn't work here :(
@@ -216,6 +218,8 @@ def _exec(cls, sql_text, params=None, forward_only=True, commit=False):
216218 for param in params :
217219 query .bindValue (param [0 ], param [1 ])
218220 assert query .boundValue (param [0 ]) == param [1 ], f"SQL: failed to assign parameter { param } in '{ sql_text } '"
221+ if JalDB ._trace_sql_requests :
222+ cls ._log_query (query )
219223 if not query .exec ():
220224 error = JalSqlError (query .lastError ().text ())
221225 if error .custom ():
@@ -227,6 +231,17 @@ def _exec(cls, sql_text, params=None, forward_only=True, commit=False):
227231 db .commit ()
228232 return query
229233
234+ # -------------------------------------------------------------------------------------------------------------------
235+ # Logs given query as SQL statement with parameters
236+ @classmethod
237+ def _log_query (cls , query ):
238+ JalDB ._sql_call_count = JalDB ._sql_call_count + 1
239+ query_text = query .lastQuery ()
240+ for k , v in zip (query .boundValueNames (), query .boundValues ()):
241+ v = f"'{ v } '" if type (v ) == str else v
242+ query_text = query_text .replace (k , str (v ))
243+ logging .debug (f"Trace SQL { JalDB ._sql_call_count } : { query_text } " )
244+
230245 # ------------------------------------------------------------------------------------------------------------------
231246 # Reads the result of 'sql_test' query from the database (with given params - the same as for _exec() method)
232247 # returns result of the query or None if result is empty
0 commit comments