summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/sybase/base.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-03-17 13:14:47 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2010-03-17 13:14:47 -0400
commitb81e9741ba26f2740725c9d403d116284af7d7a4 (patch)
tree5b8792ceca125ac46e8055db997ce9e6e82bba11 /lib/sqlalchemy/dialects/sybase/base.py
parent893f6563730f4d2460dd266a8fea40a38c678794 (diff)
downloadsqlalchemy-b81e9741ba26f2740725c9d403d116284af7d7a4.tar.gz
- basic sybase+pyodbc support. in particular this will impact freetds detection for MS-SQL as well.
Diffstat (limited to 'lib/sqlalchemy/dialects/sybase/base.py')
-rw-r--r--lib/sqlalchemy/dialects/sybase/base.py29
1 files changed, 28 insertions, 1 deletions
diff --git a/lib/sqlalchemy/dialects/sybase/base.py b/lib/sqlalchemy/dialects/sybase/base.py
index b3ac45558..5d20faaf9 100644
--- a/lib/sqlalchemy/dialects/sybase/base.py
+++ b/lib/sqlalchemy/dialects/sybase/base.py
@@ -176,7 +176,19 @@ ischema_names = {
class SybaseExecutionContext(default.DefaultExecutionContext):
_enable_identity_insert = False
-
+
+ def set_ddl_autocommit(self, connection, value):
+ """Must be implemented by subclasses to accommodate DDL executions.
+
+ "connection" is the raw unwrapped DBAPI connection. "value"
+ is True or False. when True, the connection should be configured
+ such that a DDL can take place subsequently. when False,
+ a DDL has taken place and the connection should be resumed
+ into non-autocommit mode.
+
+ """
+ raise NotImplementedError()
+
def pre_exec(self):
if self.isinsert:
tbl = self.compiled.statement.table
@@ -192,7 +204,22 @@ class SybaseExecutionContext(default.DefaultExecutionContext):
self.cursor.execute("SET IDENTITY_INSERT %s ON" %
self.dialect.identifier_preparer.format_table(tbl))
+ if self.isddl:
+ # TODO: to enhance this, we can detect "ddl in tran" on the
+ # database settings. this error message should be improved to
+ # include a note about that.
+ if not self.should_autocommit:
+ raise exc.InvalidRequestError("The Sybase dialect only supports "
+ "DDL in 'autocommit' mode at this time.")
+
+ self.root_connection.engine.logger.info("AUTOCOMMIT (Assuming no Sybase 'ddl in tran')")
+
+ self.set_ddl_autocommit(self.root_connection.connection.connection, True)
+
+
def post_exec(self):
+ if self.isddl:
+ self.set_ddl_autocommit(self.root_connection, False)
if self._enable_identity_insert:
self.cursor.execute(