From: Jason Kirtland Date: Thu, 19 Apr 2007 23:44:26 +0000 (+0000) Subject: - Promoted mysql's dburl query string helper to util + fixed X-Git-Tag: rel_0_3_7~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0fe6b80c7024e6f9430071f162274fbbd0e3ca44;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Promoted mysql's dburl query string helper to util + fixed - Coercing sqlite connect args provided in query string to their expected type (e.g. 'timeout' as float, fixes #544) - Coerce mysql's client_flag to int too --- diff --git a/lib/sqlalchemy/databases/mysql.py b/lib/sqlalchemy/databases/mysql.py index 21f8bb3984..52aa03003d 100644 --- a/lib/sqlalchemy/databases/mysql.py +++ b/lib/sqlalchemy/databases/mysql.py @@ -10,6 +10,7 @@ from sqlalchemy import sql,engine,schema,ansisql from sqlalchemy.engine import default import sqlalchemy.types as sqltypes import sqlalchemy.exceptions as exceptions +import sqlalchemy.util as util from array import array @@ -285,16 +286,13 @@ class MySQLDialect(ansisql.ANSIDialect): def create_connect_args(self, url): opts = url.translate_connect_args(['host', 'db', 'user', 'passwd', 'port']) opts.update(url.query) - def coercetype(param, type): - if param in opts and type(param) is not type: - if type is bool: - opts[param] = bool(int(opts[param])) - else: - opts[param] = type(opts[param]) - coercetype('compress', bool) - coercetype('connect_timeout', int) - coercetype('use_unicode', bool) # this could break SA Unicode type - coercetype('charset', str) # this could break SA Unicode type + + util.coerce_kw_type(opts, 'compress', bool) + util.coerce_kw_type(opts, 'connect_timeout', int) + util.coerce_kw_type(opts, 'client_flag', int) + # note: these two could break SA Unicode type + util.coerce_kw_type(opts, 'use_unicode', bool) + util.coerce_kw_type(opts, 'charset', str) # TODO: what about options like "ssl", "cursorclass" and "conv" ? client_flag = opts.get('client_flag', 0) diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py index 0222496f83..6c12345428 100644 --- a/lib/sqlalchemy/databases/sqlite.py +++ b/lib/sqlalchemy/databases/sqlite.py @@ -10,6 +10,7 @@ import sys, StringIO, string, types, re from sqlalchemy import sql, engine, schema, ansisql, exceptions, pool, PassiveDefault import sqlalchemy.engine.default as default import sqlalchemy.types as sqltypes +import sqlalchemy.util as util import datetime,time @@ -179,7 +180,15 @@ class SQLiteDialect(ansisql.ANSIDialect): def create_connect_args(self, url): filename = url.database or ':memory:' - return ([filename], url.query) + + opts = url.query.copy() + util.coerce_kw_type(opts, 'timeout', float) + util.coerce_kw_type(opts, 'isolation_level', str) + util.coerce_kw_type(opts, 'detect_types', int) + util.coerce_kw_type(opts, 'check_same_thread', bool) + util.coerce_kw_type(opts, 'cached_statements', int) + + return ([filename], opts) def type_descriptor(self, typeobj): return sqltypes.adapt_type(typeobj, colspecs) diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 238f12493f..08b281684c 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -98,6 +98,17 @@ def get_func_kwargs(func): """Return the full set of legal kwargs for the given `func`.""" return [vn for vn in func.func_code.co_varnames] +def coerce_kw_type(kw, key, type_, flexi_bool=True): + """If 'key' is present in dict 'kw', coerce its value to type 'type_' if + necessary. If 'flexi_bool' is True, the string '0' is considered false + when coercing to boolean. + """ + if key in kw and type(kw[key]) is not type_ and kw[key] is not None: + if type_ is bool and flexi_bool and kw[key] == '0': + kw[key] = False + else: + kw[key] = type_(kw[key]) + class SimpleProperty(object): """A *default* property accessor."""