summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/connectors
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-03-26 14:47:53 -0600
committerMike Bayer <mike_mp@zzzcomputing.com>2010-03-26 14:47:53 -0600
commitd56d420e809588d8dea8f36fd4ae3a8b4204be54 (patch)
treeeeeb939cf4beaae903dcebc24073ff26565a0756 /lib/sqlalchemy/connectors
parent1a3f424c864d1bbf782db20d0840895c8ae0f35d (diff)
downloadsqlalchemy-d56d420e809588d8dea8f36fd4ae3a8b4204be54.tar.gz
mssql+mxodbc should use executedirect for all selects and execute for insert/update/delete. To support this, an is_crud property has been added to the DefaultExecutionContext. The behavior is forcable either way per execution using execution_options(native_odbc_parameters=True|False). Some tests have been added to demonstrate usage. (patch by zzzeek committed by bradallen)
Diffstat (limited to 'lib/sqlalchemy/connectors')
-rw-r--r--lib/sqlalchemy/connectors/mxodbc.py30
1 files changed, 20 insertions, 10 deletions
diff --git a/lib/sqlalchemy/connectors/mxodbc.py b/lib/sqlalchemy/connectors/mxodbc.py
index 4476ffd78..f50bff7da 100644
--- a/lib/sqlalchemy/connectors/mxodbc.py
+++ b/lib/sqlalchemy/connectors/mxodbc.py
@@ -97,10 +97,10 @@ class MxODBCConnector(Connector):
"""
opts = url.translate_connect_args(username='user')
opts.update(url.query)
- args = opts['host'],
- kwargs = {'user':opts['user'],
- 'password': opts['password']}
- return args, kwargs
+ args = opts.pop('host')
+ opts.pop('port', None)
+ opts.pop('database', None)
+ return (args,), opts
def is_disconnect(self, e):
# eGenix recommends checking connection.closed here,
@@ -126,10 +126,20 @@ class MxODBCConnector(Connector):
return tuple(version)
def do_execute(self, cursor, statement, parameters, context=None):
- # temporary workaround until a more comprehensive solution can
- # be found for controlling when to use executedirect
- try:
- cursor.execute(statement, parameters)
- except (InterfaceError, ProgrammingError), e:
- warnings.warn("cursor.execute failed; falling back to executedirect")
+ if context:
+ native_odbc_execute = context.execution_options.\
+ get('native_odbc_execute', 'auto')
+ if native_odbc_execute is True:
+ # user specified native_odbc_execute=True
+ cursor.execute(statement, parameters)
+ elif native_odbc_execute is False:
+ # user specified native_odbc_execute=False
+ cursor.executedirect(statement, parameters)
+ elif context.is_crud:
+ # statement is UPDATE, DELETE, INSERT
+ cursor.execute(statement, parameters)
+ else:
+ # all other statements
+ cursor.executedirect(statement, parameters)
+ else:
cursor.executedirect(statement, parameters)