Skip to content

Commit a3d9173

Browse files
author
clach04
committed
Test suite now has JDBC/Jython 2.5 support.
Added JDBC/Jython support. Requires jython2.5.0 (older releases of Jython have not been tested). Added logic to drop table to handle JDBC. Cleaned up sqlstate check for IngresDBI in drop table. Cleaned up spurious trace setting line in pooled check. Added setUpOnce() function to make clear what is single setup for the whole suite. Removed semi-colons ";" from SQL, DBMS/JDBC-driver does not like it. Connection defaults are all specified in one place. git-svn-id: http://code.ingres.com/ingres/drivers/python/main@1883 45b5d43f-8932-4c86-835a-3654e5842839
1 parent 3fefd44 commit a3d9173

File tree

1 file changed

+111
-45
lines changed

1 file changed

+111
-45
lines changed

tests/test_ingresdbi_dbapi20.py

Lines changed: 111 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,18 @@
4646
Added Unicode check.
4747
19-Aug-2009 (Chris.Clark@ingres.com)
4848
Tracing information was not being passed to the driver correctly.
49+
20-Aug-2009 (Chris.Clark@ingres.com)
50+
Added JDBC/Jython support. Requires jython2.5.0 (older releases
51+
of Jython have not been tested).
52+
Added logic to drop table to handle JDBC.
53+
Cleaned up sqlstate check for IngresDBI in drop table.
54+
Cleaned up spurious trace setting line in pooled check.
55+
Added setUpOnce() function to make clear what is single
56+
setup for the whole suite.
57+
Removed semi-colons ";" from SQL, DBMS/JDBC-driver does not like it.
4958
"""
5059
import dbapi20
5160
import unittest
52-
import ingresdbi
5361
import popen2
5462
import re
5563
import os
@@ -59,6 +67,25 @@
5967
from decimal import Decimal
6068
import gc # CPython specific.....
6169

70+
#poor but simple test
71+
jython_runtime_detected=hasattr(sys, 'JYTHON_JAR') or str(copyright).find('Jython') > 0
72+
73+
if jython_runtime_detected:
74+
from com.ziclix.python.sql import zxJDBC as driver
75+
"""
76+
JDBC needs a few things setup, minimum:
77+
Windows
78+
set CLASSPATH=%II_SYSTEM%\ingres\lib\iijdbc.jar
79+
set test_password=mypassword(operating system password for Ingres user)
80+
set test_port=R27
81+
Unix
82+
setenv CLASSPATH ${II_SYSTEM}/ingres/lib/iijdbc.jar
83+
export CLASSPATH=${II_SYSTEM}/ingres/lib/iijdbc.jar
84+
.....
85+
"""
86+
else:
87+
import ingresdbi as driver
88+
6289
"""
6390
6491
By default the test expects a locally accessible database called
@@ -96,13 +123,26 @@
96123
password=os.getenv('test_password')
97124
vnode=os.getenv('test_vnode')
98125
database=os.getenv('test_database')
126+
if database is None:
127+
database='dbapi20_test'
99128
pooled=os.getenv('test_pooled') # Windows only
100129
traceLevel_str=os.getenv('test_trace')
101130
if traceLevel_str != None:
102131
traceLevel = int(traceLevel_str)
103132
else:
104133
traceLevel = 0
105134
traceFile=os.getenv('test_trace_file')
135+
if jython_runtime_detected:
136+
hostname=os.getenv('test_hostname')
137+
if not hostname:
138+
hostname='localhost'
139+
port=os.getenv('test_port')
140+
if not port:
141+
port='II7'
142+
if not username:
143+
# JDBC needs a user name, either default to current user
144+
# or default to named user
145+
username='ingres'
106146

107147
# Not sure about this!!!!
108148
warnings.warn('Some tests are not being ran at the moment due to hangs (after they complete)')
@@ -113,7 +153,6 @@
113153
## We have an odd behavior, e.g. accessing connection.Warning, see dbapi20.py:210. pysqlite2 does not have this
114154
## oddly, setting warnings to ERRORS, silences Ingres but not sqlite!
115155

116-
117156
def dropTable(c, tablename):
118157
"""Simple drop table wrapper that ignores "table does not exist" errors. Warning: Not sql injection safe.
119158
c = cursor
@@ -126,54 +165,64 @@ def dropTable(c, tablename):
126165
try:
127166
sql_string = 'drop table %s' % tablename
128167
c.execute(sql_string)
129-
except ingresdbi.DataError, info:
130-
sqlstate=repr(info.args[2])
131-
if sqlstate != "'42500'": # this looks buggy.. string with quotes as part of data?
132-
raise
133-
168+
except driver.Error, info:
169+
# now follows some slightly hairy sqlstate check code
170+
# this should be fairly straight forward but the information
171+
# is not in an easy to use format
172+
if jython_runtime_detected:
173+
if not info.message.endswith('[SQLCode: 2753], [SQLState: 42500]'):
174+
raise
175+
else:
176+
# ingresdbi
177+
sqlstate=info.args[2]
178+
if sqlstate != '42500':
179+
raise
180+
181+
globalsetUpOnceFlag=False
134182
class test_Ingresdbi(dbapi20.DatabaseAPI20Test):
135-
driver = ingresdbi
183+
driver = driver
136184
connect_args = ()
137185
connect_kw_args = {}
138-
139-
if dsn != None:
140-
connect_kw_args.setdefault('dsn',dsn)
141-
if username != None:
142-
connect_kw_args.setdefault('uid',username)
143-
if password != None:
144-
connect_kw_args.setdefault('pwd',password)
145-
if vnode != None:
146-
connect_kw_args.setdefault('vnode',vnode)
147-
if database != None:
148-
connect_kw_args.setdefault('database',database)
186+
187+
if jython_runtime_detected:
188+
ingres_driver_class='com.ingres.jdbc.IngresDriver'
189+
ingres_driver_uri='ingres'
190+
d, u, p, v = "jdbc:%s://%s:%s/%s/;select_loop=on"%(ingres_driver_uri, hostname, port, database), username, password, ingres_driver_class
191+
connect_args += (d, u, p, v)
149192
else:
150-
connect_kw_args.setdefault('database', 'dbapi20_test')
151-
if pooled != None:
152-
connect_kw_args.setdefault('pooled', pooled)
193+
if dsn != None:
194+
connect_kw_args.setdefault('dsn',dsn)
195+
if username != None:
196+
connect_kw_args.setdefault('uid',username)
197+
if password != None:
198+
connect_kw_args.setdefault('pwd',password)
199+
if vnode != None:
200+
connect_kw_args.setdefault('vnode',vnode)
201+
connect_kw_args.setdefault('database',database)
202+
if pooled != None:
203+
connect_kw_args.setdefault('pooled', pooled)
153204
trace=(traceLevel, traceFile)
154-
trace=(traceLevel, traceFile)
155-
connect_kw_args.setdefault('trace',trace)
205+
connect_kw_args.setdefault('trace',trace)
206+
156207
table_prefix = 'dbapi20test_' # If you need to specify a prefix for tables
157208

158209
lower_func = 'lower' # For stored procedure test
159210

160-
def setUp(self):
161-
# NOTE using Python unittest, setUp() is called before EACH and every
162-
# test. There is no single setup routine hook (other than hacking init,
163-
# module main, etc.). Setup is done here in case an external test
164-
# suite runner is used (e.g. nose, py.test, etc.). So far all the
165-
# setup implemented here is single setup that only needs to be done
166-
# once at the start of the complete test run.
167-
#
168-
# Call superclass setUp In case this does something in the
169-
# future
170-
dbapi20.DatabaseAPI20Test.setUp(self)
171-
172-
dbname = self.connect_kw_args['database']
173-
211+
def setUpOnce(self):
212+
"""Custom, one shot custom setup issued only once for the entire batch of tests
213+
NOTE actually runs for every test if it fails......
214+
"""
215+
global globalsetUpOnceFlag
216+
if globalsetUpOnceFlag:
217+
return
218+
219+
if jython_runtime_detected:
220+
dbname = database # not sure about this
221+
else:
222+
dbname = self.connect_kw_args['database']
174223
try:
175224
con = self._connect()
176-
except ingresdbi.DataError:
225+
except self.driver.DataError:
177226
cmd = "createdb -i %s -f nofeclients" % dbname
178227
cout,cin = popen2.popen2(cmd)
179228
cin.close()
@@ -203,6 +252,23 @@ def setUp(self):
203252
rs = cur.fetchone()
204253
self.assertEqual(rs[0], 'NFC', 'Test database "%s" needs to use NFC UNICODE_NORMALIZATION (i.e. "createdb -i ...")' % dbname) # this probably should be made more obvious in the error output!
205254
con.close()
255+
# set complete flag AFTER everything has been done successfully
256+
globalsetUpOnceFlag=True
257+
258+
def setUp(self):
259+
# NOTE using Python unittest, setUp() is called before EACH and every
260+
# test. There is no single setup routine hook (other than hacking init,
261+
# module main, etc.). Setup is done here in case an external test
262+
# suite runner is used (e.g. nose, py.test, etc.).
263+
264+
# Call superclass setUp In case this does something in the
265+
# future
266+
dbapi20.DatabaseAPI20Test.setUp(self)
267+
268+
# ensure intial setup complete
269+
self.setUpOnce()
270+
271+
# end of setUp() there is no per test setup required.
206272

207273
def tearDown(self):
208274
dbapi20.DatabaseAPI20Test.tearDown(self)
@@ -638,7 +704,7 @@ def test_decimalLongValues(self):
638704
self.curs = self.con.cursor()
639705

640706
expected_value_str="-0.12345"
641-
sql_query="select decimal(%s, 5, 5) from iidbconstants;" % expected_value_str
707+
sql_query="select decimal(%s, 5, 5) from iidbconstants" % expected_value_str
642708

643709
expected_value=Decimal(expected_value_str)
644710
self.curs.execute(sql_query)
@@ -810,7 +876,7 @@ def test_stringLongValues(self):
810876

811877
expected_value="X"*50
812878
expected_value_len=len(expected_value)
813-
sql_query="select varchar('%s', %d) from iidbconstants;" % (expected_value, expected_value_len)
879+
sql_query="select varchar('%s', %d) from iidbconstants" % (expected_value, expected_value_len)
814880

815881
self.curs.execute(sql_query)
816882
rs = self.curs.fetchall()
@@ -850,7 +916,7 @@ def test_stringCharLongValues(self):
850916
expected_value="X"*50
851917
padlength=20
852918
expected_value_len=len(expected_value)+padlength
853-
sql_query="select char('%s', %d) from iidbconstants;" % (expected_value, expected_value_len)
919+
sql_query="select char('%s', %d) from iidbconstants" % (expected_value, expected_value_len)
854920

855921
self.curs.execute(sql_query)
856922
rs = self.curs.fetchall()
@@ -872,7 +938,7 @@ def test_stringUnicodeCharLongValues(self):
872938
expected_value="X"*50
873939
padlength=20
874940
expected_value_len=len(expected_value)+padlength
875-
sql_query="select nchar('%s', %d) from iidbconstants;" % (expected_value, expected_value_len)
941+
sql_query="select nchar('%s', %d) from iidbconstants" % (expected_value, expected_value_len)
876942

877943
self.curs.execute(sql_query)
878944
rs = self.curs.fetchall()
@@ -894,7 +960,7 @@ def test_stringUnicodeLongValues(self):
894960

895961
expected_value="X"*50
896962
expected_value_len=len(expected_value)
897-
sql_query="select nvarchar('%s', %d) from iidbconstants;" % (expected_value, expected_value_len)
963+
sql_query="select nvarchar('%s', %d) from iidbconstants" % (expected_value, expected_value_len)
898964

899965
self.curs.execute(sql_query)
900966
rs = self.curs.fetchall()
@@ -936,7 +1002,7 @@ def test_bugSelectLob(self):
9361002
#self.curs.execute("drop table myBlob")
9371003
dropTable(self.curs, 'myBlob')
9381004
self.curs.execute("create table myBlob(blobCol long byte)")
939-
self.curs.execute("insert into myBlob values(?)", (ingresdbi.Binary(blob),))
1005+
self.curs.execute("insert into myBlob values(?)", (self.driver.Binary(blob),))
9401006
#self.curs.execute("select * from myBlob")
9411007
rs = self.curs.fetchall() # issue fetch after an insert
9421008

0 commit comments

Comments
 (0)