dbobj3 0.8.0__tar.gz → 0.9.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
dbobj3-0.9.3/.gitignore
ADDED
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dbobj3"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.9.3"
|
|
8
8
|
description = "High-level MySQL/MSSQL/Oracle access module"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.6"
|
|
@@ -16,7 +16,7 @@ dependencies = [
|
|
|
16
16
|
packages = ["src/dbobj3.py"]
|
|
17
17
|
|
|
18
18
|
[tool.bumpversion]
|
|
19
|
-
current_version = "0.
|
|
19
|
+
current_version = "0.9.3"
|
|
20
20
|
commit = true
|
|
21
21
|
tag = true
|
|
22
22
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env python3.
|
|
1
|
+
#!/usr/bin/env python3.6
|
|
2
2
|
|
|
3
3
|
"""
|
|
4
4
|
High-Level Access to MySQL, MS SQL Server, Oracle Module and more.
|
|
@@ -21,48 +21,92 @@ Example:
|
|
|
21
21
|
rsServices.next()
|
|
22
22
|
|
|
23
23
|
"""
|
|
24
|
-
__version__ = "0.
|
|
24
|
+
__version__ = "0.9.3"
|
|
25
25
|
|
|
26
|
+
import os
|
|
27
|
+
import importlib # needed for shim
|
|
26
28
|
from sys import version as sys_version, exit
|
|
27
29
|
from datetime import datetime, date, time
|
|
28
30
|
pyversion = sys_version[0:sys_version.find(' ')]
|
|
29
31
|
using_mysqlclient, using_pymysql = False, False
|
|
30
32
|
|
|
31
33
|
lstLoadedDrivers = []
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
34
|
+
force_pymysql = os.environ.get("DB_FORCE_PYMYSQL","0") == "1"
|
|
35
|
+
drv_env = os.environ.get("MYSQL_DRIVER","").lower() # optional: mysqlclient | pymysql
|
|
36
|
+
MySQLdb = None # placeholder so global name exists
|
|
37
|
+
pymysql = None # placeholder
|
|
38
|
+
|
|
39
|
+
def _select_mysql_driver():
|
|
40
|
+
global using_mysqlclient, using_pymysql, MySQLdb, pymysql
|
|
41
|
+
if force_pymysql or drv_env == "pymysql":
|
|
42
|
+
import pymysql
|
|
43
|
+
pymysql.install_as_MySQLdb()
|
|
44
|
+
import MySQLdb, MySQLdb.cursors, MySQLdb.converters
|
|
45
|
+
# MySQLdb dropped Python3.x support
|
|
46
|
+
# - For Centos/Python2.x use
|
|
47
|
+
# - yum install mysql-devel, MySQL-python
|
|
48
|
+
# - pip install mysql-python
|
|
49
|
+
# - For Python3.x use the fork MySQLdb
|
|
50
|
+
# - pip install mysqlclient ( developed by pymysql devs )
|
|
51
|
+
using_pymysql = True
|
|
52
|
+
lstLoadedDrivers.append({"PyMySQL":"Active"})
|
|
53
|
+
print("MySQL driver: PyMySQL (forced)")
|
|
54
|
+
return
|
|
49
55
|
try:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
#import pymysql.converters
|
|
56
|
+
import MySQLdb, MySQLdb.cursors, MySQLdb.converters
|
|
57
|
+
using_mysqlclient = True
|
|
58
|
+
lstLoadedDrivers.append({"mysqlclient":"Active"})
|
|
59
|
+
print("MySQL driver: mysqlclient")
|
|
60
|
+
except Exception as e:
|
|
61
|
+
print(f"mysqlclient import failed ({e}); falling back to PyMySQL")
|
|
62
|
+
import pymysql
|
|
63
|
+
pymysql.install_as_MySQLdb()
|
|
64
|
+
import MySQLdb, MySQLdb.cursors, MySQLdb.converters
|
|
60
65
|
using_pymysql = True
|
|
61
|
-
lstLoadedDrivers.append({"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
lstLoadedDrivers.append({"PyMySQL":"Active"})
|
|
67
|
+
print("MySQL driver: PyMySQL (fallback)")
|
|
68
|
+
|
|
69
|
+
# Minimal shim
|
|
70
|
+
def _ensure_constants_shim():
|
|
71
|
+
"""
|
|
72
|
+
Inject only minimal missing constants when using PyMySQL.
|
|
73
|
+
Avoid constructing synthetic CAPABILITIES to prevent >32-bit signed values.
|
|
74
|
+
Safe to call multiple times.
|
|
75
|
+
"""
|
|
76
|
+
if not using_pymysql:
|
|
77
|
+
return
|
|
78
|
+
try:
|
|
79
|
+
import importlib
|
|
80
|
+
const_pkg = importlib.import_module("MySQLdb.constants")
|
|
81
|
+
# COMMAND (only COM_PING needed for legacy ping code)
|
|
82
|
+
if not hasattr(const_pkg, "COMMAND"):
|
|
83
|
+
print("Injecting minimal MySQLdb.constants.COMMAND shim for COM_PING")
|
|
84
|
+
class _DummyCOMMAND:
|
|
85
|
+
COM_PING = 0x0e
|
|
86
|
+
const_pkg.COMMAND = _DummyCOMMAND
|
|
87
|
+
else:
|
|
88
|
+
if not hasattr(const_pkg.COMMAND, "COM_PING"):
|
|
89
|
+
print("Injecting MySQLdb.constants.COMMAND.COM_PING shim")
|
|
90
|
+
const_pkg.COMMAND.COM_PING = 0x0e
|
|
91
|
+
else:
|
|
92
|
+
pass
|
|
93
|
+
#print(f'COMMAND.COM_PING exists: {const_pkg.COMMAND.COM_PING}')
|
|
94
|
+
# SERVER_STATUS minimal
|
|
95
|
+
if not hasattr(const_pkg, "SERVER_STATUS"):
|
|
96
|
+
class _DummySERVER_STATUS:
|
|
97
|
+
SERVER_STATUS_IN_TRANS = 0x0001
|
|
98
|
+
SERVER_STATUS_AUTOCOMMIT = 0x0002
|
|
99
|
+
const_pkg.SERVER_STATUS = _DummySERVER_STATUS
|
|
100
|
+
# CLIENT flags: only ensure PLUGIN_AUTH if absent; do NOT build CAPABILITIES
|
|
101
|
+
importlib_client = importlib.import_module("MySQLdb.constants.CLIENT")
|
|
102
|
+
if not hasattr(importlib_client, "PLUGIN_AUTH"):
|
|
103
|
+
importlib_client.PLUGIN_AUTH = 0x00080000
|
|
104
|
+
# If CAPABILITIES exists already, leave it untouched. Do NOT create if missing.
|
|
105
|
+
except Exception as e:
|
|
106
|
+
print("MySQL minimal shim error:", e)
|
|
107
|
+
|
|
108
|
+
_select_mysql_driver()
|
|
109
|
+
_ensure_constants_shim()
|
|
66
110
|
|
|
67
111
|
def _build_pymysql_conv():
|
|
68
112
|
"""
|
|
@@ -100,6 +144,25 @@ def _build_pymysql_conv():
|
|
|
100
144
|
conv[FIELD_TYPE.DATE] = (lambda v: date.fromisoformat(v) if v else None)
|
|
101
145
|
return conv
|
|
102
146
|
|
|
147
|
+
# helper: unified connection state check
|
|
148
|
+
def _is_mysql_connected(handle):
|
|
149
|
+
try:
|
|
150
|
+
# mysqlclient has .open attr; PyMySQL does not
|
|
151
|
+
# both should support .ping() method
|
|
152
|
+
if not ( handle and hasattr(handle, "ping") and callable(handle.ping) ):
|
|
153
|
+
return False
|
|
154
|
+
else:
|
|
155
|
+
# mysqlclient: ping() raises exception if not connected
|
|
156
|
+
db_ping_res = None
|
|
157
|
+
db_ping_res = handle.ping()
|
|
158
|
+
# it appears that PyMySQL's ping() returns None when successful, but does it always?
|
|
159
|
+
if using_mysqlclient:
|
|
160
|
+
#print("mysqlclient ping() result:", db_ping_res)
|
|
161
|
+
return True
|
|
162
|
+
else:
|
|
163
|
+
return True
|
|
164
|
+
except Exception:
|
|
165
|
+
return False
|
|
103
166
|
|
|
104
167
|
try:
|
|
105
168
|
import pymssql
|
|
@@ -180,12 +243,12 @@ class dbObjCursor:
|
|
|
180
243
|
self.create(self.dbType)
|
|
181
244
|
|
|
182
245
|
def __del__(self):
|
|
183
|
-
if(self.dbType
|
|
246
|
+
if(self.dbType in ("MYSQL", "ORACLE")):
|
|
184
247
|
try:
|
|
185
248
|
if self.cursor and self.cursor.connection and self.cursor.connection.open:
|
|
186
249
|
self.cursor.close()
|
|
187
|
-
except:
|
|
188
|
-
|
|
250
|
+
except Exception as e:
|
|
251
|
+
print(str(e))
|
|
189
252
|
|
|
190
253
|
def create(self, prmDBType="MYSQL"):
|
|
191
254
|
if(prmDBType=="MYSQL"):
|
|
@@ -420,10 +483,11 @@ class dbObjConnection:
|
|
|
420
483
|
driverClass="",
|
|
421
484
|
prmApiBaseUrl="",
|
|
422
485
|
prmApiKey="",
|
|
423
|
-
prmApiKeyName="sk"
|
|
486
|
+
prmApiKeyName="sk",
|
|
487
|
+
prmReuseCursor=False):
|
|
424
488
|
self.set_env( envOracle=envOracle, envProgress=envProgress, driver=driver )
|
|
425
489
|
self.EOF = 1
|
|
426
|
-
self.connHandle = 0
|
|
490
|
+
self.connHandle = None # was 0; use None for clarity
|
|
427
491
|
self.dbType = prmDBType.upper()
|
|
428
492
|
self.msgObj = dbConnMessage()
|
|
429
493
|
self.lastInsId = 0
|
|
@@ -433,6 +497,8 @@ class dbObjConnection:
|
|
|
433
497
|
self.using_pymysql = using_pymysql
|
|
434
498
|
self.drivers = lstLoadedDrivers
|
|
435
499
|
self.driverClass = driverClass
|
|
500
|
+
self.reuseCursor = prmReuseCursor
|
|
501
|
+
self.cursor = None
|
|
436
502
|
if(prmDBType == "API"):
|
|
437
503
|
self.apiBaseUrl = prmApiBaseUrl
|
|
438
504
|
self.apiKeyName = prmApiKeyName
|
|
@@ -519,17 +585,21 @@ class dbObjConnection:
|
|
|
519
585
|
self.connHandle = MySQLdb.connect(**kwargs)
|
|
520
586
|
# Uniform autocommit enabling (mysqlclient vs pymysql)
|
|
521
587
|
try:
|
|
588
|
+
# mysqlclient
|
|
522
589
|
self.connHandle.autocommit(True)
|
|
523
590
|
except Exception:
|
|
591
|
+
# PyMySQL
|
|
524
592
|
try:
|
|
525
593
|
self.connHandle.autocommit = True
|
|
526
594
|
except Exception:
|
|
527
595
|
pass
|
|
528
|
-
if(self.connHandle):
|
|
596
|
+
if _is_mysql_connected(self.connHandle):
|
|
529
597
|
self.setConnectSuccess()
|
|
530
598
|
else:
|
|
531
|
-
self.
|
|
599
|
+
self.connHandle = None
|
|
600
|
+
self.setConnectFail("Unknown connection state")
|
|
532
601
|
except Exception as e:
|
|
602
|
+
self.connHandle = None
|
|
533
603
|
self.setConnectFail(e)
|
|
534
604
|
return self.msgObj
|
|
535
605
|
|
|
@@ -663,21 +733,35 @@ class dbObjConnection:
|
|
|
663
733
|
print('Connection to {0} Restored.'.format(self.dbType))
|
|
664
734
|
return self.msgObj
|
|
665
735
|
|
|
736
|
+
def ensure_mysql_connection(self):
|
|
737
|
+
# If connection invalid attempt reconnect (MySQL only)
|
|
738
|
+
if self.dbType == "MYSQL" and not _is_mysql_connected(self.connHandle):
|
|
739
|
+
self.reconnect()
|
|
740
|
+
if not _is_mysql_connected(self.connHandle):
|
|
741
|
+
raise RuntimeError(f"Cannot ensure connection: MySQL connection dead (host={self.host}, db={self.db})")
|
|
742
|
+
|
|
666
743
|
def getCursor(self):
|
|
744
|
+
# Reuse existing cursor if requested and still valid
|
|
745
|
+
if self.cursor and self.reuseCursor and _is_mysql_connected(self.connHandle):
|
|
746
|
+
return self.cursor
|
|
747
|
+
# If connection invalid attempt reconnect (MySQL only)
|
|
748
|
+
self.ensure_mysql_connection()
|
|
749
|
+
# proceed
|
|
667
750
|
if(self.dbType == "MYSQL"):
|
|
668
|
-
|
|
751
|
+
self.cursor = self.mySqlGetCursor()
|
|
669
752
|
elif(self.dbType == "MSSQL"):
|
|
670
|
-
|
|
753
|
+
self.cursor = self.mssqlGetCursor()
|
|
671
754
|
elif(self.dbType == "ORACLE"):
|
|
672
|
-
|
|
755
|
+
self.cursor = self.oracleGetCursor()
|
|
673
756
|
elif(self.dbType == "SQLITE" or self.dbType == "SQLITE3"):
|
|
674
|
-
|
|
757
|
+
self.cursor = self.sqlite3GetCursor()
|
|
675
758
|
elif(self.dbType == "PROGRESS"):
|
|
676
|
-
|
|
759
|
+
self.cursor = self.progressGetCursor()
|
|
677
760
|
elif(self.dbType == "API"):
|
|
678
|
-
|
|
761
|
+
self.cursor = self.apiGetCursor()
|
|
679
762
|
elif(self.dbType == "JDBC"):
|
|
680
|
-
|
|
763
|
+
self.cursor = self.jdbcGetCursor()
|
|
764
|
+
return self.cursor
|
|
681
765
|
|
|
682
766
|
def setCursorSuccess(self, cursor):
|
|
683
767
|
if cursor:
|
|
@@ -692,11 +776,14 @@ class dbObjConnection:
|
|
|
692
776
|
|
|
693
777
|
def mySqlGetCursor(self):
|
|
694
778
|
try:
|
|
779
|
+
if not _is_mysql_connected(self.connHandle):
|
|
780
|
+
raise RuntimeError("MySQL connection not established; cannot create cursor")
|
|
695
781
|
cursor = dbObjCursor(self.connHandle, self.dbType)
|
|
696
782
|
self.setCursorSuccess(cursor)
|
|
697
783
|
return cursor
|
|
698
784
|
except Exception as e:
|
|
699
785
|
self.setCursorFail(e)
|
|
786
|
+
raise
|
|
700
787
|
|
|
701
788
|
def mssqlGetCursor(self):
|
|
702
789
|
try:
|
|
@@ -797,10 +884,10 @@ class dbObjConnection:
|
|
|
797
884
|
self.connHandle.close()
|
|
798
885
|
self.connHandle = None
|
|
799
886
|
|
|
800
|
-
def execute(self, prmSql, *args
|
|
887
|
+
def execute(self, prmSql, *args):
|
|
801
888
|
"""Execute the SQL and return a record set if applicable"""
|
|
802
889
|
if(self.dbType == "MYSQL"):
|
|
803
|
-
return self.mySqlExecute(prmSql, *args
|
|
890
|
+
return self.mySqlExecute(prmSql, *args)
|
|
804
891
|
if(self.dbType == "MSSQL"):
|
|
805
892
|
return self.msSqlExecute(prmSql)
|
|
806
893
|
if(self.dbType == "ORACLE"):
|
|
@@ -916,44 +1003,22 @@ class dbObjConnection:
|
|
|
916
1003
|
self.jdbcPing()
|
|
917
1004
|
|
|
918
1005
|
def mySqlPing(self, reconnect=True):
|
|
919
|
-
"""
|
|
920
|
-
Check if the server is alive.
|
|
921
|
-
|
|
922
|
-
:param reconnect: If the connection is closed, reconnect.
|
|
923
|
-
:raise Error: If the connection is closed and reconnect=False.
|
|
924
|
-
"""
|
|
925
|
-
if using_pymysql:
|
|
926
|
-
self.connHandle.ping( reconnect )
|
|
927
|
-
return
|
|
928
|
-
elif( not self.connHandle.open ):
|
|
929
|
-
if reconnect:
|
|
930
|
-
self.connect()
|
|
931
|
-
reconnect = False
|
|
932
|
-
else:
|
|
933
|
-
raise Exception("Already closed")
|
|
934
|
-
|
|
935
|
-
''' This doesn't work with mysqlclient
|
|
936
|
-
if self.connHandle._sock is None:
|
|
937
|
-
if reconnect:
|
|
938
|
-
self.connect()
|
|
939
|
-
#self.connHandle.connect()
|
|
940
|
-
reconnect = False
|
|
941
|
-
else:
|
|
942
|
-
raise Exception("Already closed")
|
|
943
|
-
'''
|
|
944
|
-
|
|
945
1006
|
try:
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
if reconnect:
|
|
951
|
-
self.connect()
|
|
952
|
-
self.ping( False )
|
|
1007
|
+
if _is_mysql_connected(self.connHandle):
|
|
1008
|
+
return
|
|
1009
|
+
if not reconnect:
|
|
1010
|
+
raise RuntimeError("MySQL connection not established; cannot ping")
|
|
953
1011
|
else:
|
|
954
|
-
|
|
1012
|
+
self.reconnect()
|
|
1013
|
+
if not _is_mysql_connected(self.connHandle):
|
|
1014
|
+
raise RuntimeError("MySQL connection not established; cannot ping")
|
|
1015
|
+
except Exception as e:
|
|
1016
|
+
self.setConnectFail(e)
|
|
1017
|
+
raise
|
|
1018
|
+
else:
|
|
1019
|
+
self.setConnectSuccess()
|
|
955
1020
|
|
|
956
|
-
def setMySqlExecuteFail(self, mySqlCursor, prmSql, e, *args
|
|
1021
|
+
def setMySqlExecuteFail(self, mySqlCursor, prmSql, e, *args):
|
|
957
1022
|
self.msgObj.success = False
|
|
958
1023
|
prmSql += '' if not args else ' ({0}) '.format( repr(args) )
|
|
959
1024
|
self.msgObj.message = "SQL Failed: {0} - {1}".format( prmSql, e )
|
|
@@ -967,9 +1032,9 @@ class dbObjConnection:
|
|
|
967
1032
|
finally:
|
|
968
1033
|
return mySqlCursor
|
|
969
1034
|
|
|
970
|
-
def setMySqlExecuteSuccess(self, mySqlCursor, prmSql, *args
|
|
1035
|
+
def setMySqlExecuteSuccess(self, mySqlCursor, prmSql, *args):
|
|
971
1036
|
self.msgObj.success = True
|
|
972
|
-
self.msgObj.message = "SQL Executed: {0} {1}".format(prmSql,'' if not args else repr(args)
|
|
1037
|
+
self.msgObj.message = "SQL Executed: {0} {1}".format(prmSql,'' if not args else repr(args))
|
|
973
1038
|
try:
|
|
974
1039
|
mySqlCursor.numFields = len(mySqlCursor.cursor.description)
|
|
975
1040
|
if(mySqlCursor.numRows):
|
|
@@ -1007,23 +1072,22 @@ class dbObjConnection:
|
|
|
1007
1072
|
self.msgObj.message += ' or killed process/connection.'
|
|
1008
1073
|
self.msgObj.message += ' connHandle={0}, connHandle.open={1}'.format(self.connHandle,self.connHandle.open)
|
|
1009
1074
|
self.reconnect()
|
|
1010
|
-
elif
|
|
1075
|
+
elif self.connHandle.open==0 or "Can't connect to" in str(e):
|
|
1011
1076
|
self.msgObj.message += ' - Database Connection Closed or Never Established.'
|
|
1012
1077
|
self.msgObj.message += ' connHandle={0}, connHandle.open={1}'.format(self.connHandle,self.connHandle.open)
|
|
1013
1078
|
self.reconnect()
|
|
1014
|
-
return mySqlCursor if not self.msgObj.success else self.mySqlExecute( prmSql, *args
|
|
1079
|
+
return mySqlCursor if not self.msgObj.success else self.mySqlExecute( prmSql, *args )
|
|
1015
1080
|
except Exception as e:
|
|
1016
1081
|
mySqlCursor = self.setMySqlExecuteFail(mySqlCursor, prmSql, e, *args)
|
|
1017
|
-
|
|
1018
|
-
if not hasattr(self.connHandle, 'open') or self.connHandle.open==0 or "t connect t" in str(e).lower():
|
|
1082
|
+
if self.connHandle.open==0 or "Can't connect to" in str(e):
|
|
1019
1083
|
self.msgObj.message += ' - Database Connection Closed or Never Established.'
|
|
1020
1084
|
self.msgObj.message += ' connHandle={0}, connHandle.open={1}'.format(self.connHandle,self.connHandle.open)
|
|
1021
1085
|
self.reconnect()
|
|
1022
|
-
return mySqlCursor if not self.msgObj.success else self.mySqlExecute( prmSql, *args
|
|
1086
|
+
return mySqlCursor if not self.msgObj.success else self.mySqlExecute( prmSql, *args )
|
|
1023
1087
|
print(self.msgObj.message)
|
|
1024
1088
|
return mySqlCursor
|
|
1025
1089
|
else:
|
|
1026
|
-
mySqlCursor = self.setMySqlExecuteSuccess(mySqlCursor, prmSql, *args
|
|
1090
|
+
mySqlCursor = self.setMySqlExecuteSuccess(mySqlCursor, prmSql, *args)
|
|
1027
1091
|
return mySqlCursor
|
|
1028
1092
|
|
|
1029
1093
|
def msSqlExecute(self, prmSql):
|
|
@@ -1121,7 +1185,7 @@ class dbObjConnection:
|
|
|
1121
1185
|
if(r.status_code == requests.codes.ok):
|
|
1122
1186
|
retVal = r.json()
|
|
1123
1187
|
#print(retVal)
|
|
1124
|
-
if(retVal["error"]
|
|
1188
|
+
if(retVal["error"].success):
|
|
1125
1189
|
apiCursor.lstRecords = retVal["data"]
|
|
1126
1190
|
apiCursor.numRows = len(apiCursor.lstRecords)
|
|
1127
1191
|
if(apiCursor.numRows > 0):
|
|
@@ -1191,14 +1255,14 @@ class dbObjConnection:
|
|
|
1191
1255
|
self.msgObj.message += ' - Database Connection Closed or Never Established.'
|
|
1192
1256
|
self.msgObj.message += ' connHandle={0}, connHandle.open={1}'.format(self.connHandle,self.connHandle.open)
|
|
1193
1257
|
self.reconnect()
|
|
1194
|
-
return mySqlCursor if not self.msgObj.success else self.
|
|
1258
|
+
return mySqlCursor if not self.msgObj.success else self.mySqlExecute( prmSql, *args )
|
|
1195
1259
|
except Exception as e:
|
|
1196
1260
|
mySqlCursor = self.setMySqlExecuteFail(mySqlCursor, prmSql, e, *args)
|
|
1197
1261
|
if self.connHandle.open==0 or "Can't connect to" in str(e):
|
|
1198
1262
|
self.msgObj.message += ' - Database Connection Closed or Never Established.'
|
|
1199
1263
|
self.msgObj.message += ' connHandle={0}, connHandle.open={1}'.format(self.connHandle,self.connHandle.open)
|
|
1200
1264
|
self.reconnect()
|
|
1201
|
-
return mySqlCursor if not self.msgObj.success else self.
|
|
1265
|
+
return mySqlCursor if not self.msgObj.success else self.mySqlExecute( prmSql, *args )
|
|
1202
1266
|
print(self.msgObj.message)
|
|
1203
1267
|
return mySqlCursor
|
|
1204
1268
|
else:
|
|
@@ -1359,4 +1423,4 @@ if __name__ == '__main__':
|
|
|
1359
1423
|
return odb
|
|
1360
1424
|
|
|
1361
1425
|
# odb will be the interactively instantiated dbObj connection
|
|
1362
|
-
odb = run_test()
|
|
1426
|
+
odb = run_test()
|
|
File without changes
|