[Sqlalchemy-commits] [1258] sqlalchemy/trunk/test: moves the binding of a TypeEngine object from "sc
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-04-06 01:16:08
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1258] sqlalchemy/trunk/test: moves the binding of a TypeEngine object from "schema/statement creation" time into "compilation" time</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1258</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-04-05 20:15:46 -0500 (Wed, 05 Apr 2006)</dd> </dl> <h3>Log Message</h3> <pre>moves the binding of a TypeEngine object from "schema/statement creation" time into "compilation" time</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyansisqlpy">sqlalchemy/trunk/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesfirebirdpy">sqlalchemy/trunk/lib/sqlalchemy/databases/firebird.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesmssqlpy">sqlalchemy/trunk/lib/sqlalchemy/databases/mssql.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesmysqlpy">sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasesoraclepy">sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasespostgrespy">sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemydatabasessqlitepy">sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyextproxypy">sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyschemapy">sqlalchemy/trunk/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemysqlpy">sqlalchemy/trunk/lib/sqlalchemy/sql.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemytypespy">sqlalchemy/trunk/lib/sqlalchemy/types.py</a></li> <li><a href="#sqlalchemytrunktestproxy_enginepy">sqlalchemy/trunk/test/proxy_engine.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ansisql.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/ansisql.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -189,7 +189,10 @@ </span><span class="cx"> </span><span class="cx"> def visit_index(self, index): </span><span class="cx"> self.strings[index] = index.name </span><del>- </del><ins>+ + def visit_typeclause(self, typeclause): + self.strings[typeclause] = typeclause.type.engine_impl(self.engine).get_col_spec() + </ins><span class="cx"> def visit_textclause(self, textclause): </span><span class="cx"> if textclause.parens and len(textclause.text): </span><span class="cx"> self.strings[textclause] = "(" + textclause.text + ")" </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesfirebirdpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/firebird.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/firebird.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/firebird.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -238,7 +238,7 @@ </span><span class="cx"> class FBSchemaGenerator(ansisql.ANSISchemaGenerator): </span><span class="cx"> def get_column_specification(self, column, override_pk=False, **kwargs): </span><span class="cx"> colspec = column.name </span><del>- colspec += " " + column.type.get_col_spec() </del><ins>+ colspec += " " + column.type.engine_impl(self.engine).get_col_spec() </ins><span class="cx"> default = self.get_column_default_string(column) </span><span class="cx"> if default is not None: </span><span class="cx"> colspec += " DEFAULT " + default </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesmssqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/mssql.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/mssql.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/mssql.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -460,7 +460,7 @@ </span><span class="cx"> </span><span class="cx"> class MSSQLSchemaGenerator(ansisql.ANSISchemaGenerator): </span><span class="cx"> def get_column_specification(self, column, override_pk=False, first_pk=False): </span><del>- colspec = column.name + " " + column.type.get_col_spec() </del><ins>+ colspec = column.name + " " + column.type.engine_impl(self.engine).get_col_spec() </ins><span class="cx"> </span><span class="cx"> # install a IDENTITY Sequence if we have an implicit IDENTITY column </span><span class="cx"> if column.primary_key and isinstance(column.type, types.Integer): </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesmysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/mysql.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -263,7 +263,7 @@ </span><span class="cx"> </span><span class="cx"> class MySQLSchemaGenerator(ansisql.ANSISchemaGenerator): </span><span class="cx"> def get_column_specification(self, column, override_pk=False, first_pk=False): </span><del>- colspec = column.name + " " + column.type.get_col_spec() </del><ins>+ colspec = column.name + " " + column.type.engine_impl(self.engine).get_col_spec() </ins><span class="cx"> default = self.get_column_default_string(column) </span><span class="cx"> if default is not None: </span><span class="cx"> colspec += " DEFAULT " + default </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasesoraclepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/oracle.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -306,7 +306,7 @@ </span><span class="cx"> class OracleSchemaGenerator(ansisql.ANSISchemaGenerator): </span><span class="cx"> def get_column_specification(self, column, override_pk=False, **kwargs): </span><span class="cx"> colspec = column.name </span><del>- colspec += " " + column.type.get_col_spec() </del><ins>+ colspec += " " + column.type.engine_impl(self.engine).get_col_spec() </ins><span class="cx"> default = self.get_column_default_string(column) </span><span class="cx"> if default is not None: </span><span class="cx"> colspec += " DEFAULT " + default </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasespostgrespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/postgres.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -305,7 +305,7 @@ </span><span class="cx"> if column.primary_key and isinstance(column.type, types.Integer) and (column.default is None or (isinstance(column.default, schema.Sequence) and column.default.optional)): </span><span class="cx"> colspec += " SERIAL" </span><span class="cx"> else: </span><del>- colspec += " " + column.type.get_col_spec() </del><ins>+ colspec += " " + column.type.engine_impl(self.engine).get_col_spec() </ins><span class="cx"> default = self.get_column_default_string(column) </span><span class="cx"> if default is not None: </span><span class="cx"> colspec += " DEFAULT " + default </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemydatabasessqlitepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/databases/sqlite.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -241,7 +241,7 @@ </span><span class="cx"> </span><span class="cx"> class SQLiteSchemaGenerator(ansisql.ANSISchemaGenerator): </span><span class="cx"> def get_column_specification(self, column, override_pk=False, **kwargs): </span><del>- colspec = column.name + " " + column.type.get_col_spec() </del><ins>+ colspec = column.name + " " + column.type.engine_impl(self.engine).get_col_spec() </ins><span class="cx"> default = self.get_column_default_string(column) </span><span class="cx"> if default is not None: </span><span class="cx"> colspec += " DEFAULT " + default </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyenginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/engine.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -319,7 +319,7 @@ </span><span class="cx"> self.positional = True </span><span class="cx"> else: </span><span class="cx"> raise DBAPIError("Unsupported paramstyle '%s'" % self._paramstyle) </span><del>- </del><ins>+ </ins><span class="cx"> def type_descriptor(self, typeobj): </span><span class="cx"> """provides a database-specific TypeEngine object, given the generic object </span><span class="cx"> which comes from the types module. Subclasses will usually use the adapt_type() </span><span class="lines">@@ -808,7 +808,7 @@ </span><span class="cx"> rec = self.props[key.lower()] </span><span class="cx"> else: </span><span class="cx"> rec = self.props[key] </span><del>- return rec[0].convert_result_value(row[rec[1]], self.engine) </del><ins>+ return rec[0].engine_impl(self.engine).convert_result_value(row[rec[1]], self.engine) </ins><span class="cx"> </span><span class="cx"> def __iter__(self): </span><span class="cx"> while True: </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyextproxypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -36,11 +36,6 @@ </span><span class="cx"> return None </span><span class="cx"> return e.oid_column_name() </span><span class="cx"> </span><del>- def type_descriptor(self, typeobj): - """Proxy point: return a ProxyTypeEngine - """ - return ProxyTypeEngine(self, typeobj) - </del><span class="cx"> def __getattr__(self, attr): </span><span class="cx"> # call get_engine() to give subclasses a chance to change </span><span class="cx"> # connection establishment behavior </span><span class="lines">@@ -116,37 +111,3 @@ </span><span class="cx"> self.storage.engine = engine </span><span class="cx"> </span><span class="cx"> </span><del>-class ProxyType(object): - """ProxyType base class; used by ProxyTypeEngine to construct proxying - types - """ - def __init__(self, engine, typeobj): - self._engine = engine - self.typeobj = typeobj - - def __getattribute__(self, attr): - if attr.startswith('__') and attr.endswith('__'): - return object.__getattribute__(self, attr) - - engine = object.__getattribute__(self, '_engine').engine - typeobj = object.__getattribute__(self, 'typeobj') - return getattr(engine.type_descriptor(typeobj), attr) - - def __repr__(self): - return '<Proxy %s>' % (object.__getattribute__(self, 'typeobj')) - -class ProxyTypeEngine(object): - """Proxy type engine; creates dynamic proxy type subclass that is instance - of actual type, but proxies engine-dependant operations through the proxy - engine. - """ - def __new__(cls, engine, typeobj): - """Create a new subclass of ProxyType and typeobj - so that internal isinstance() calls will get the expected result. - """ - if isinstance(typeobj, type): - typeclass = typeobj - else: - typeclass = typeobj.__class__ - typed = type('ProxyTypeHelper', (ProxyType, typeclass), {}) - return typed(engine, typeobj) </del></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/schema.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/schema.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -163,7 +163,6 @@ </span><span class="cx"> if column.primary_key: </span><span class="cx"> self.primary_key.append(column) </span><span class="cx"> column.table = self </span><del>- column.type = self.engine.type_descriptor(column.type) </del><span class="cx"> </span><span class="cx"> def append_index(self, index): </span><span class="cx"> self.indexes[index.name] = index </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/sql.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/sql.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -139,17 +139,11 @@ </span><span class="cx"> or </span><span class="cx"> cast(table.c.timestamp, DATE) </span><span class="cx"> """ </span><del>- engine = kwargs.get('engine', None) - if engine is None: - engine = getattr(clause, 'engine', None) - if engine is not None: - totype_desc = engine.type_descriptor(totype) - # handle non-column clauses (e.g. cast(1234, TEXT) - if not hasattr(clause, 'label'): - clause = literal(clause) - return Function('CAST', clause.label(totype_desc.get_col_spec()), type=totype, **kwargs) - else: - raise InvalidRequestError("No engine available, cannot generate cast for " + str(clause) + " to type " + str(totype)) </del><ins>+ # handle non-column clauses (e.g. cast(1234, TEXT) + if not hasattr(clause, 'label'): + clause = literal(clause) + totype = sqltypes.to_instance(totype) + return Function('CAST', CompoundClause("AS", clause, TypeClause(totype)), type=totype, **kwargs) </ins><span class="cx"> </span><span class="cx"> def exists(*args, **params): </span><span class="cx"> params['correlate'] = True </span><span class="lines">@@ -295,7 +289,8 @@ </span><span class="cx"> def visit_clauselist(self, list):pass </span><span class="cx"> def visit_function(self, func):pass </span><span class="cx"> def visit_label(self, label):pass </span><del>- </del><ins>+ def visit_typeclause(self, typeclause):pass + </ins><span class="cx"> class Compiled(ClauseVisitor): </span><span class="cx"> """represents a compiled SQL expression. the __str__ method of the Compiled object </span><span class="cx"> should produce the actual text of the statement. Compiled objects are specific to the </span><span class="lines">@@ -671,13 +666,7 @@ </span><span class="cx"> self.key = key </span><span class="cx"> self.value = value </span><span class="cx"> self.shortname = shortname </span><del>- self.type = type or sqltypes.NULLTYPE - def _get_convert_type(self, engine): - try: - return self._converted_type - except AttributeError: - self._converted_type = engine.type_descriptor(self.type) - return self._converted_type </del><ins>+ self.type = sqltypes.to_instance(type) </ins><span class="cx"> def accept_visitor(self, visitor): </span><span class="cx"> visitor.visit_bindparam(self) </span><span class="cx"> def _get_from_objects(self): </span><span class="lines">@@ -685,7 +674,7 @@ </span><span class="cx"> def copy_container(self): </span><span class="cx"> return BindParamClause(self.key, self.value, self.shortname, self.type) </span><span class="cx"> def typeprocess(self, value, engine): </span><del>- return self._get_convert_type(engine).convert_bind_param(value, engine) </del><ins>+ return self.type.engine_impl(engine).convert_bind_param(value, engine) </ins><span class="cx"> def compare(self, other): </span><span class="cx"> """compares this BindParamClause to the given clause. </span><span class="cx"> </span><span class="lines">@@ -695,7 +684,14 @@ </span><span class="cx"> def _make_proxy(self, selectable, name = None): </span><span class="cx"> return self </span><span class="cx"> # return self.obj._make_proxy(selectable, name=self.name) </span><del>- </del><ins>+ +class TypeClause(ClauseElement): + """handles a type keyword in a SQL statement""" + def __init__(self, type): + self.type = type + def accept_visitor(self, visitor): + visitor.visit_typeclause(self) + </ins><span class="cx"> class TextClause(ClauseElement): </span><span class="cx"> """represents literal a SQL text fragment. public constructor is the </span><span class="cx"> text() function. </span><span class="lines">@@ -714,7 +710,7 @@ </span><span class="cx"> self.typemap = typemap </span><span class="cx"> if typemap is not None: </span><span class="cx"> for key in typemap.keys(): </span><del>- typemap[key] = engine.type_descriptor(typemap[key]) </del><ins>+ typemap[key] = sqltypes.to_instance(typemap[key]) </ins><span class="cx"> def repl(m): </span><span class="cx"> self.bindparams[m.group(1)] = bindparam(m.group(1)) </span><span class="cx"> return ":%s" % m.group(1) </span><span class="lines">@@ -820,11 +816,9 @@ </span><span class="cx"> """describes a SQL function. extends ClauseList to provide comparison operators.""" </span><span class="cx"> def __init__(self, name, *clauses, **kwargs): </span><span class="cx"> self.name = name </span><del>- self.type = kwargs.get('type', sqltypes.NULLTYPE) </del><ins>+ self.type = sqltypes.to_instance(kwargs.get('type', None)) </ins><span class="cx"> self.packagenames = kwargs.get('packagenames', None) or [] </span><span class="cx"> self._engine = kwargs.get('engine', None) </span><del>- if self._engine is not None: - self.type = self._engine.type_descriptor(self.type) </del><span class="cx"> ClauseList.__init__(self, parens=True, *clauses) </span><span class="cx"> key = property(lambda self:self.name) </span><span class="cx"> def append(self, clause): </span><span class="lines">@@ -873,7 +867,7 @@ </span><span class="cx"> self.left = left </span><span class="cx"> self.right = right </span><span class="cx"> self.operator = operator </span><del>- self.type = type </del><ins>+ self.type = sqltypes.to_instance(type) </ins><span class="cx"> self.parens = False </span><span class="cx"> if isinstance(self.left, BinaryClause): </span><span class="cx"> self.left.parens = True </span><span class="lines">@@ -1028,7 +1022,7 @@ </span><span class="cx"> while isinstance(obj, Label): </span><span class="cx"> obj = obj.obj </span><span class="cx"> self.obj = obj </span><del>- self.type = type or sqltypes.NullTypeEngine() </del><ins>+ self.type = sqltypes.to_instance(type) </ins><span class="cx"> obj.parens=True </span><span class="cx"> key = property(lambda s: s.name) </span><span class="cx"> </span><span class="lines">@@ -1049,7 +1043,7 @@ </span><span class="cx"> def __init__(self, text, selectable=None, type=None): </span><span class="cx"> self.key = self.name = self.text = text </span><span class="cx"> self.table = selectable </span><del>- self.type = type or sqltypes.NullTypeEngine() </del><ins>+ self.type = sqltypes.to_instance(type) </ins><span class="cx"> self.__label = None </span><span class="cx"> def _get_label(self): </span><span class="cx"> if self.__label is None: </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemytypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/types.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/types.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/lib/sqlalchemy/types.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -16,11 +16,22 @@ </span><span class="cx"> import cPickle as pickle </span><span class="cx"> except: </span><span class="cx"> import pickle </span><del>- </del><ins>+ </ins><span class="cx"> class TypeEngine(object): </span><del>- basetypes = [] </del><span class="cx"> def __init__(self, *args, **kwargs): </span><span class="cx"> pass </span><ins>+ def _get_impl_dict(self): + try: + return self._impl_dict + except AttributeError: + self._impl_dict = {} + return self._impl_dict + impl_dict = property(_get_impl_dict) + def engine_impl(self, engine): + try: + return self.impl_dict[engine] + except: + return self.impl_dict.setdefault(engine, engine.type_descriptor(self)) </ins><span class="cx"> def _get_impl(self): </span><span class="cx"> if hasattr(self, '_impl'): </span><span class="cx"> return self._impl </span><span class="lines">@@ -41,7 +52,14 @@ </span><span class="cx"> return {} </span><span class="cx"> def adapt_args(self): </span><span class="cx"> return self </span><del>- </del><ins>+ +def to_instance(typeobj): + if typeobj is None: + return NULLTYPE + elif isinstance(typeobj, type): + return typeobj() + else: + return typeobj </ins><span class="cx"> def adapt_type(typeobj, colspecs): </span><span class="cx"> if isinstance(typeobj, type): </span><span class="cx"> typeobj = typeobj() </span></span></pre></div> <a id="sqlalchemytrunktestproxy_enginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/test/proxy_engine.py (1257 => 1258)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/proxy_engine.py 2006-04-04 21:40:18 UTC (rev 1257) +++ sqlalchemy/trunk/test/proxy_engine.py 2006-04-06 01:15:46 UTC (rev 1258) </span><span class="lines">@@ -194,7 +194,7 @@ </span><span class="cx"> return 'a' </span><span class="cx"> </span><span class="cx"> def type_descriptor(self, typeobj): </span><del>- if typeobj == types.Integer: </del><ins>+ if isinstance(typeobj, types.Integer): </ins><span class="cx"> return TypeEngineX2() </span><span class="cx"> else: </span><span class="cx"> return TypeEngineSTR() </span><span class="lines">@@ -224,16 +224,16 @@ </span><span class="cx"> engine = ProxyEngine() </span><span class="cx"> engine.storage.engine = EngineA() </span><span class="cx"> </span><del>- a = engine.type_descriptor(sqltypes.Integer) </del><ins>+ a = sqltypes.Integer().engine_impl(engine) </ins><span class="cx"> assert a.convert_bind_param(12, engine) == 24 </span><span class="cx"> assert a.convert_bind_param([1,2,3], engine) == [1, 2, 3, 1, 2, 3] </span><span class="cx"> </span><del>- a2 = engine.type_descriptor(sqltypes.String) </del><ins>+ a2 = sqltypes.String().engine_impl(engine) </ins><span class="cx"> assert a2.convert_bind_param(12, engine) == "'12'" </span><span class="cx"> assert a2.convert_bind_param([1,2,3], engine) == "'[1, 2, 3]'" </span><span class="cx"> </span><span class="cx"> engine.storage.engine = EngineB() </span><del>- b = engine.type_descriptor(sqltypes.Integer) </del><ins>+ b = sqltypes.Integer().engine_impl(engine) </ins><span class="cx"> assert b.convert_bind_param(12, engine) == 'monkey' </span><span class="cx"> assert b.convert_bind_param([1,2,3], engine) == 'monkey' </span><span class="cx"> </span></span></pre> </div> </div> </body> </html> |