From 93755db2d42f6b8cd34ae0b2c32c1b4bf925b6fd Mon Sep 17 00:00:00 2001 From: Rick Morrison Date: Thu, 4 Jan 2007 04:12:36 +0000 Subject: [PATCH] Patch from Paul Johnston that refactors adodbapi vs. pymssql a bit, fixes broken COMMITS in adodbapi --- lib/sqlalchemy/databases/mssql.py | 89 +++++++++++++------------------ 1 file changed, 37 insertions(+), 52 deletions(-) diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py index 3cfffd302a..f2a291e84d 100644 --- a/lib/sqlalchemy/databases/mssql.py +++ b/lib/sqlalchemy/databases/mssql.py @@ -51,7 +51,6 @@ try: make_connect_string = lambda keys: \ [["Provider=SQLOLEDB;Data Source=%s;User Id=%s;Password=%s;Initial Catalog=%s" % ( keys.get("host"), keys.get("user"), keys.get("password"), keys.get("database"))], {}] - do_commit = False sane_rowcount = True except: try: @@ -65,7 +64,6 @@ except: keys['host'] = ''.join([keys.get('host', ''), ':', str(keys['port'])]) del keys['port'] return [[], keys] - do_commit = True except: dbmodule = None make_connect_string = lambda keys: [[],{}] @@ -307,11 +305,6 @@ class MSSQLDialect(ansisql.ANSIDialect): def last_inserted_ids(self): return self.context.last_inserted_ids - def do_begin(self, connection): - """implementations might want to put logic here for turning autocommit on/off, etc.""" - if do_commit: - pass - def _execute(self, c, statement, parameters): try: c.execute(statement, parameters) @@ -320,26 +313,6 @@ class MSSQLDialect(ansisql.ANSIDialect): except Exception, e: raise exceptions.SQLError(statement, parameters, e) - - - def do_rollback(self, connection): - """implementations might want to put logic here for turning autocommit on/off, etc.""" - if do_commit: - try: - # connection.rollback() for pymmsql failed sometimes--the begin tran doesn't show up - # this is a workaround that seems to be handle it. - r = self.raw_connection(connection) - r.query("if @@trancount > 0 rollback tran") - r.fetch_array() - r.query("begin tran") - r.fetch_array() - except: - pass - try: - del connection - except: - raise - def raw_connection(self, connection): """Pull the raw pymmsql connection out--sensative to "pool.ConnectionFairy" and pymssql.pymssqlCnx Classes""" try: @@ -347,30 +320,6 @@ class MSSQLDialect(ansisql.ANSIDialect): except: return connection.connection.adoConn - def do_commit(self, connection): - """implementations might want to put logic here for turning autocommit on/off, etc. - do_commit is set for pymmsql connections--ADO seems to handle transactions without any issue - """ - # ADO Uses Implicit Transactions. - if do_commit: - # This is very pymssql specific. We use this instead of its commit, because it hangs on failed rollbacks. - # By using the "if" we don't assume an open transaction--much better. - r = self.raw_connection(connection) - r.query("if @@trancount > 0 commit tran") - r.fetch_array() - r.query("begin tran") - r.fetch_array() - else: - pass - #connection.supportsTransactions = 1 - try: - pass - #connection.adoConn.CommitTrans() - except: - pass - #connection.adoConn.execute("begin trans", {}) - #connection.adoConn.BeginTrans() - def connection(self): """returns a managed DBAPI connection from this SQLEngine's connection pool.""" c = self._pool.connect() @@ -510,6 +459,39 @@ class MSSQLDialect(ansisql.ANSIDialect): +class PyMSSQLDialect(MSSQLDialect): + def do_begin(self, connection): + """implementations might want to put logic here for turning autocommit on/off, etc.""" + if do_commit: + pass + + def do_rollback(self, connection): + """implementations might want to put logic here for turning autocommit on/off, etc.""" + try: + # connection.rollback() for pymmsql failed sometimes--the begin tran doesn't show up + # this is a workaround that seems to be handle it. + r = self.raw_connection(connection) + r.query("if @@trancount > 0 rollback tran") + r.fetch_array() + r.query("begin tran") + r.fetch_array() + except: + pass + + def do_commit(self, connection): + """implementations might want to put logic here for turning autocommit on/off, etc. + do_commit is set for pymmsql connections--ADO seems to handle transactions without any issue + """ + # ADO Uses Implicit Transactions. + # This is very pymssql specific. We use this instead of its commit, because it hangs on failed rollbacks. + # By using the "if" we don't assume an open transaction--much better. + r = self.raw_connection(connection) + r.query("if @@trancount > 0 commit tran") + r.fetch_array() + r.query("begin tran") + r.fetch_array() + + class MSSQLCompiler(ansisql.ANSICompiler): def __init__(self, dialect, statement, parameters, **kwargs): super(MSSQLCompiler, self).__init__(dialect, statement, parameters, **kwargs) @@ -597,4 +579,7 @@ class MSSQLIdentifierPreparer(ansisql.ANSIIdentifierPreparer): #TODO: determin MSSQL's case folding rules return value -dialect = MSSQLDialect +if dbmodule.__name__ == 'adodbapi': + dialect = MSSQLDialect +else: + dialect = PyMSSQLDialect -- 2.47.2