diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-03-17 13:14:47 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-03-17 13:14:47 -0400 |
commit | b81e9741ba26f2740725c9d403d116284af7d7a4 (patch) | |
tree | 5b8792ceca125ac46e8055db997ce9e6e82bba11 /lib/sqlalchemy/dialects/sybase/base.py | |
parent | 893f6563730f4d2460dd266a8fea40a38c678794 (diff) | |
download | sqlalchemy-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.py | 29 |
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( |