From 68f71502c11b456527614b14cd162f50be123eb3 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 28 Feb 2010 22:05:39 +0000 Subject: [PATCH] mxodbc supports rowcount, just have to snag before the cursor is closed. --- lib/sqlalchemy/connectors/mxodbc.py | 2 +- lib/sqlalchemy/connectors/pyodbc.py | 2 +- lib/sqlalchemy/dialects/mssql/mxodbc.py | 19 +++++++++++++++---- lib/sqlalchemy/dialects/mssql/pyodbc.py | 2 -- test/orm/test_naturalpks.py | 4 ++-- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/sqlalchemy/connectors/mxodbc.py b/lib/sqlalchemy/connectors/mxodbc.py index ef7852f61b..49c5a73293 100644 --- a/lib/sqlalchemy/connectors/mxodbc.py +++ b/lib/sqlalchemy/connectors/mxodbc.py @@ -6,7 +6,7 @@ from sqlalchemy.connectors import Connector class MxODBCConnector(Connector): driver='mxodbc' - supports_sane_rowcount = False + supports_sane_multi_rowcount = False supports_unicode_statements = False supports_unicode_binds = False diff --git a/lib/sqlalchemy/connectors/pyodbc.py b/lib/sqlalchemy/connectors/pyodbc.py index 6abdbf0ddc..ce8e84c33c 100644 --- a/lib/sqlalchemy/connectors/pyodbc.py +++ b/lib/sqlalchemy/connectors/pyodbc.py @@ -7,7 +7,7 @@ import urllib class PyODBCConnector(Connector): driver='pyodbc' - supports_sane_rowcount = False + supports_sane_multi_rowcount = False # PyODBC unicode is broken on UCS-4 builds supports_unicode = sys.maxunicode == 65535 diff --git a/lib/sqlalchemy/dialects/mssql/mxodbc.py b/lib/sqlalchemy/dialects/mssql/mxodbc.py index 38d559e2ba..73cf1346e0 100644 --- a/lib/sqlalchemy/dialects/mssql/mxodbc.py +++ b/lib/sqlalchemy/dialects/mssql/mxodbc.py @@ -7,12 +7,23 @@ from sqlalchemy.dialects.mssql.base import MSDialect from sqlalchemy.dialects.mssql.pyodbc import MSExecutionContext_pyodbc # The pyodbc execution context seems to work for mxODBC; reuse it here -MSExecutionContext_mxodbc = MSExecutionContext_pyodbc + +class MSExecutionContext_mxodbc(MSExecutionContext_pyodbc): + + def post_exec(self): + # snag rowcount before the cursor is closed + if not self.cursor.description: + self._rowcount = self.cursor.rowcount + super(MSExecutionContext_mxodbc, self).post_exec() + + @property + def rowcount(self): + if hasattr(self, '_rowcount'): + return self._rowcount + else: + return self.cursor.rowcount class MSDialect_mxodbc(MxODBCConnector, MSDialect): - # FIXME: yikes, plain rowcount doesn't work ? - supports_sane_rowcount = False #True - supports_sane_multi_rowcount = False execution_ctx_cls = MSExecutionContext_mxodbc diff --git a/lib/sqlalchemy/dialects/mssql/pyodbc.py b/lib/sqlalchemy/dialects/mssql/pyodbc.py index 23ab0320cb..a4c7d4bfcf 100644 --- a/lib/sqlalchemy/dialects/mssql/pyodbc.py +++ b/lib/sqlalchemy/dialects/mssql/pyodbc.py @@ -50,8 +50,6 @@ class MSExecutionContext_pyodbc(MSExecutionContext): class MSDialect_pyodbc(PyODBCConnector, MSDialect): - supports_sane_rowcount = True - supports_sane_multi_rowcount = False execution_ctx_cls = MSExecutionContext_pyodbc diff --git a/test/orm/test_naturalpks.py b/test/orm/test_naturalpks.py index b4f1bba805..b061766bf3 100644 --- a/test/orm/test_naturalpks.py +++ b/test/orm/test_naturalpks.py @@ -5,7 +5,7 @@ Primary key changing capabilities and passive/non-passive cascading updates. from sqlalchemy.test.testing import eq_, assert_raises, assert_raises_message import sqlalchemy as sa from sqlalchemy.test import testing -from sqlalchemy import Integer, String, ForeignKey +from sqlalchemy import Integer, String, ForeignKey, Unicode from sqlalchemy.test.schema import Table, Column from sqlalchemy.orm import mapper, relation, create_session from sqlalchemy.test.testing import eq_ @@ -375,7 +375,7 @@ class ReversePKsTest(_base.MappedTest): 'user', metadata, Column('code', Integer, primary_key=True), Column('status', Integer, primary_key=True), - Column('username', String(50), nullable=False), + Column('username', Unicode(50), nullable=False), ) @classmethod -- 2.47.3