From 9a34d9a83fa40a27c6e9ab5c275c48716895574c Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 6 Jun 2011 22:24:07 -0400 Subject: [PATCH] - Adjusted the pyodbc dialect such that bound values are passed as bytes and not unicode if the "Easysoft" unix drivers are detected. This is the same behavior as occurs with FreeTDS. Easysoft appears to segfault if Python unicodes are passed under certain circumstances. --- CHANGES | 11 +++++++++++ lib/sqlalchemy/__init__.py | 2 +- lib/sqlalchemy/connectors/pyodbc.py | 14 ++++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 3454476742..9eeeb725ae 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,17 @@ ======= CHANGES ======= +0.7.2 +===== +- mssql + - Adjusted the pyodbc dialect such that bound + values are passed as bytes and not unicode + if the "Easysoft" unix drivers are detected. + This is the same behavior as occurs with + FreeTDS. Easysoft appears to segfault + if Python unicodes are passed under + certain circumstances. + 0.7.1 ===== - general diff --git a/lib/sqlalchemy/__init__.py b/lib/sqlalchemy/__init__.py index 5da63c9af8..cf7ebd22cd 100644 --- a/lib/sqlalchemy/__init__.py +++ b/lib/sqlalchemy/__init__.py @@ -117,6 +117,6 @@ from sqlalchemy.engine import create_engine, engine_from_config __all__ = sorted(name for name, obj in locals().items() if not (name.startswith('_') or inspect.ismodule(obj))) -__version__ = '0.7.1' +__version__ = '0.7.2' del inspect, sys diff --git a/lib/sqlalchemy/connectors/pyodbc.py b/lib/sqlalchemy/connectors/pyodbc.py index 3f6d6cb5fa..ea4810df7a 100644 --- a/lib/sqlalchemy/connectors/pyodbc.py +++ b/lib/sqlalchemy/connectors/pyodbc.py @@ -29,6 +29,10 @@ class PyODBCConnector(Connector): # if the freetds.so is detected freetds = False + # will be set to True after initialize() + # if the libessqlsrv.so is detected + easysoft = False + @classmethod def dbapi(cls): return __import__('pyodbc') @@ -98,15 +102,17 @@ class PyODBCConnector(Connector): dbapi_con = connection.connection - self.freetds = bool(re.match(r".*libtdsodbc.*\.so", - dbapi_con.getinfo(pyodbc.SQL_DRIVER_NAME) + _sql_driver_name = dbapi_con.getinfo(pyodbc.SQL_DRIVER_NAME) + self.freetds = bool(re.match(r".*libtdsodbc.*\.so", _sql_driver_name + )) + self.easysoft = bool(re.match(r".*libessqlsrv.*\.so", _sql_driver_name )) # the "Py2K only" part here is theoretical. # have not tried pyodbc + python3.1 yet. # Py2K - self.supports_unicode_statements = not self.freetds - self.supports_unicode_binds = not self.freetds + self.supports_unicode_statements = not self.freetds and not self.easysoft + self.supports_unicode_binds = not self.freetds and not self.easysoft # end Py2K # run other initialization which asks for user name, etc. -- 2.39.5