From b9fe941dcc84807187360d51eb2feab4fa74c906 Mon Sep 17 00:00:00 2001 From: Stephen Tanner Date: Fri, 24 Oct 2014 14:58:52 -0400 Subject: [PATCH] Modified DAL and DB2 adapter to allow use of the official ibm_db_dbi driver or ODBC. --- gluon/dal/_load.py | 6 ++++++ gluon/dal/adapters/__init__.py | 3 ++- gluon/dal/adapters/db2.py | 14 ++++++++++++-- gluon/dal/base.py | 3 ++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/gluon/dal/_load.py b/gluon/dal/_load.py index f82c0241..103340b8 100644 --- a/gluon/dal/_load.py +++ b/gluon/dal/_load.py @@ -144,6 +144,12 @@ if not 'google' in DRIVERS: pyodbc = None LOGGER.debug('no MSSQL/DB2/Teradata/Ingres driver pyodbc') + try: + import ibm_db_dbi + DRIVERS.append('ibm_db_dbi') + except ImportError: + LOGGER.debug('no DB2 driver ibm_db_dbi') + try: import Sybase DRIVERS.append('Sybase') diff --git a/gluon/dal/adapters/__init__.py b/gluon/dal/adapters/__init__.py index 54927648..1bb4211f 100644 --- a/gluon/dal/adapters/__init__.py +++ b/gluon/dal/adapters/__init__.py @@ -36,7 +36,8 @@ ADAPTERS = { 'mssql4' : MSSQL4Adapter, 'vertica': VerticaAdapter, 'sybase': SybaseAdapter, - 'db2': DB2Adapter, + 'db2:ibm_db_dbi': DB2Adapter, + 'db2:pyodbc': DB2Adapter, 'teradata': TeradataAdapter, 'informix': InformixAdapter, 'informix-se': InformixSEAdapter, diff --git a/gluon/dal/adapters/db2.py b/gluon/dal/adapters/db2.py index 3b043b10..2740206d 100644 --- a/gluon/dal/adapters/db2.py +++ b/gluon/dal/adapters/db2.py @@ -7,7 +7,7 @@ from .base import BaseAdapter class DB2Adapter(BaseAdapter): - drivers = ('pyodbc',) + drivers = ('ibm_db_dbi', 'pyodbc') types = { 'boolean': 'CHAR(1)', @@ -73,8 +73,18 @@ class DB2Adapter(BaseAdapter): self._after_connection = after_connection self.find_or_make_work_folder() ruri = uri.split('://', 1)[1] + def connector(cnxn=ruri,driver_args=driver_args): - return self.driver.connect(cnxn,**driver_args) + if self.driver_name == 'ibm_db_dbi': + vars = cnxn.split(";") + cnxn = {} + for var in vars: + v = var.split('=') + cnxn[v[0]] = v[1] + return self.driver.connect(cnxn['DSN'], cnxn['UID'], cnxn['PWD'], **driver_args) + else: + return self.driver.connect(cnxn, **driver_args) + self.connector = connector if do_connect: self.reconnect() diff --git a/gluon/dal/base.py b/gluon/dal/base.py index 1f6b69db..4c9eeb3d 100644 --- a/gluon/dal/base.py +++ b/gluon/dal/base.py @@ -114,7 +114,8 @@ Supported DAL URI strings:: 'mssql4://web2py:none@A64X2/web2py_test' # best pagination (requires >= 2012) 'oracle://username:password@database' 'firebird://user:password@server:3050/database' - 'db2://DSN=dsn;UID=user;PWD=pass' + 'db2:ibm_db_dbi://DSN=dsn;UID=user;PWD=pass' + 'db2:pyodbc://driver=DB2;hostname=host;database=database;uid=user;pwd=password;port=port' 'firebird://username:password@hostname/database' 'firebird_embedded://username:password@c://path' 'informix://user:password@server:3050/database'