Skip to content

Commit bacc741

Browse files
committed
Update iDB2Call
Major change is how connections are handled: - Allow users to pass in a PEP-249 connection object - Use ibm_db_dbi instead of ibm_db for everything, wrapping any ibm_db connection objects passed - Use callproc if available - No longer connect/disconnect during call(), only at init time Other changes: general clean up and unused import removal
1 parent be89037 commit bacc741

File tree

1 file changed

+34
-72
lines changed

1 file changed

+34
-72
lines changed

itoolkit/db2/idb2call.py

Lines changed: 34 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,11 @@
2222
3) QXMLSERV -- IBM PTF library (DG1 PTFs)
2323
2424
"""
25-
import sys
2625
import os
27-
import re
28-
import urllib
29-
if sys.version_info >= (3,0):
30-
"""
31-
urllib has been split up in Python 3.
32-
The urllib.urlencode() function is now urllib.parse.urlencode(),
33-
and the urllib.urlopen() function is now urllib.request.urlopen().
34-
"""
35-
import urllib.request
36-
import urllib.parse
37-
import xml.dom.minidom
38-
# import inspect
26+
3927
try:
4028
import ibm_db
29+
import ibm_db_dbi
4130
except ImportError:
4231
pass
4332

@@ -66,38 +55,23 @@ class iDB2Call(object):
6655
Returns:
6756
(obj)
6857
"""
69-
def __init__(self, iuid, ipwd=0, idb2=0, ictl=0, ipc=0, isiz=0, ilib=0):
70-
# manditory
71-
self.uid = iuid
72-
if not isinstance(self.uid, str):
73-
if ipwd == 0:
74-
ipwd = "*NONE"
75-
# optional
76-
if ipwd == 0:
77-
self.pwd = os.environ['PASSWORD']
78-
else:
79-
self.pwd = ipwd
80-
if idb2 == 0:
81-
self.db2 = '*LOCAL'
82-
else:
83-
self.db2 = idb2
84-
if ictl == 0:
85-
self.ctl = '*here *cdata'
86-
else:
87-
self.ctl = ictl
88-
if ipc == 0:
89-
self.ipc = '*na'
90-
else:
91-
self.ipc = ipc
92-
if isiz == 0:
93-
self.siz = 512000
94-
else:
95-
self.siz = isiz
96-
if ilib == 0:
97-
self.lib = os.getenv('XMLSERVICE','QXMLSERV');
58+
def __init__(self, iuid=None, ipwd=None, idb2='*LOCAL', ictl='*here *cdata', ipc='*na', isiz=512000, ilib=None):
59+
if hasattr(iuid, 'cursor'):
60+
# iuid is a PEP-249 connection object, just store it
61+
self.conn = iuid
62+
elif isinstance(iuid, ibm_db.IBM_DBConnection):
63+
# iuid is a ibm_db connection object, wrap it in a ibm_db_dbi connection object
64+
self.conn = ibm_db_dbi.Connection(iuid)
9865
else:
99-
self.lib = ilib
100-
66+
# user id and password passed, connect using ibm_db_dbi
67+
ipwd = ipwd if ipwd else os.getenv('PASSWORD', None)
68+
self.conn = ibm_db_dbi.connect(database=idb2, user=iuid, password=ipwd)
69+
70+
self.ctl = ictl
71+
self.ipc = ipc
72+
self.siz = isiz
73+
self.lib = ilib if ilib else os.getenv('XMLSERVICE', 'QXMLSERV')
74+
10175
def trace_data(self):
10276
"""Return trace driver data.
10377
@@ -110,12 +84,10 @@ def trace_data(self):
11084
data = ""
11185
data += " ctl (" + str(self.ctl) + ")"
11286
data += " ipc (" + str(self.ipc) + ")"
113-
data += " uid (" + str(self.uid) + ")"
114-
data += " db2 (" + str(self.db2) + ")"
115-
data += " siz (" + str(self.siz) + ")"
87+
data += " siz (" + str(self.siz) + ") (unused)"
11688
data += " lib (" + str(self.lib) + ")"
11789
return data
118-
90+
11991
def call(self, itool):
12092
"""Call xmlservice with accumulated input XML.
12193
@@ -125,29 +97,19 @@ def call(self, itool):
12597
Returns:
12698
xml
12799
"""
128-
if isinstance(self.uid, str):
129-
conn = ibm_db.connect(self.db2, self.uid, self.pwd)
100+
cursor = self.conn.cursor()
101+
102+
parms = (self.ipc, self.ctl, itool.xml_in())
103+
104+
if hasattr(cursor, 'callproc'):
105+
cursor.callproc(self.lib + ".iPLUGR512K", parms)
130106
else:
131-
conn = self.uid
132-
# sql = "call " + self.lib + ".iPLUG512K(?,?,?,?)"
133-
sql = "call " + self.lib + ".iPLUGR512K(?,?,?)"
134-
stmt = ibm_db.prepare(conn, sql)
135-
ipc = self.ipc
136-
ctl = self.ctl
137-
xml_in = itool.xml_in()
107+
cursor.execute("call {}.iPLUGR512K(?,?,?)".format(self.lib), parms)
108+
138109
xml_out = ""
139-
ibm_db.bind_param(stmt, 1, ipc, ibm_db.SQL_PARAM_INPUT)
140-
ibm_db.bind_param(stmt, 2, ctl, ibm_db.SQL_PARAM_INPUT)
141-
ibm_db.bind_param(stmt, 3, xml_in, ibm_db.SQL_PARAM_INPUT)
142-
# ibm_db.bind_param(stmt, 4, xml_out, ibm_db.SQL_PARAM_OUTPUT)
143-
result = ibm_db.execute(stmt)
144-
if ( result ):
145-
row = ibm_db.fetch_tuple(stmt)
146-
while ( row ):
147-
for i in row:
148-
xml_out += i
149-
row = ibm_db.fetch_tuple(stmt)
150-
ibm_db.close(conn)
151-
return xml_out
152-
153-
110+
for row in cursor:
111+
xml_out += row[0]
112+
113+
print(xml_out)
114+
return xml_out.rstrip('\0')
115+

0 commit comments

Comments
 (0)