summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/connectors/mxodbc.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/connectors/mxodbc.py')
-rw-r--r--lib/sqlalchemy/connectors/mxodbc.py56
1 files changed, 47 insertions, 9 deletions
diff --git a/lib/sqlalchemy/connectors/mxodbc.py b/lib/sqlalchemy/connectors/mxodbc.py
index a0f3f0216..c5d055b5a 100644
--- a/lib/sqlalchemy/connectors/mxodbc.py
+++ b/lib/sqlalchemy/connectors/mxodbc.py
@@ -1,3 +1,5 @@
+
+import sys
from sqlalchemy.connectors import Connector
class MxODBCConnector(Connector):
@@ -8,17 +10,53 @@ class MxODBCConnector(Connector):
supports_unicode_binds = False
@classmethod
- def import_dbapi(cls):
- import mxODBC as module
+ def dbapi(cls):
+ if 'win32' in sys.platform:
+ from mx.ODBC import Windows as module
+ elif 'linux' in sys.platform:
+ from mx.ODBC import unixODBC as module
+ elif 'darwin' in sys.platform:
+ from mx.ODBC import iODBC as module
+ else:
+ raise ImportError, "Unrecognized platform for mxODBC import"
return module
+ def visit_pool(self, pool):
+ def connect(conn, rec):
+ conn.stringformat = self.dbapi.MIXED_STRINGFORMAT
+ conn.datetimeformat = self.dbapi.PYDATETIME_DATETIMEFORMAT
+ #conn.bindmethod = self.dbapi.BIND_USING_PYTHONTYPE
+ #conn.bindmethod = self.dbapi.BIND_USING_SQLTYPE
+
+ pool.add_listener({'connect':connect})
+
def create_connect_args(self, url):
- '''Return a tuple of *args,**kwargs'''
- # FIXME: handle mx.odbc.Windows proprietary args
+ """ Return a tuple of *args,**kwargs for creating a connection.
+
+ The mxODBC 3.x connection constructor looks like this:
+
+ connect(dsn, user='', password='',
+ clear_auto_commit=1, errorhandler=None)
+
+ This method translates the values in the provided uri
+ into args and kwargs needed to instantiate an mxODBC Connection.
+
+ The arg 'errorhandler' is not used by SQLAlchemy and will
+ not be populated.
+ """
opts = url.translate_connect_args(username='user')
opts.update(url.query)
- argsDict = {}
- argsDict['user'] = opts['user']
- argsDict['password'] = opts['password']
- connArgs = [[opts['dsn']], argsDict]
- return connArgs
+ args = opts['host'],
+ kwargs = {'user':opts['user'],
+ 'password': opts['password']}
+ return args, kwargs
+
+ def is_disconnect(self, e):
+ if isinstance(e, self.dbapi.ProgrammingError):
+ return "connection already closed" in str(e)
+ elif isinstance(e, self.dbapi.Error):
+ return '[08S01]' in str(e)
+ else:
+ return False
+
+