From: Mike Bayer Date: Thu, 31 May 2007 16:47:48 +0000 (+0000) Subject: ResultProxy pre-caches the dialect_impl()s for each TypeEngine, saving the X-Git-Tag: rel_0_4_6~232 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b941a5832718c4991566b8c19e28e3bedb9b5afa;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git ResultProxy pre-caches the dialect_impl()s for each TypeEngine, saving the method calls later. knocks 5000 function calls off the masseagerload.py test. --- diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index f4cb6bb36b..2999bad927 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -873,14 +873,17 @@ class ResultProxy(object): self.__props = {} self.__keys = [] metadata = self.cursor.description + if metadata is not None: for i, item in enumerate(metadata): # sqlite possibly prepending table name to colnames so strip colname = item[0].split('.')[-1] if self.context.typemap is not None: - rec = (self.context.typemap.get(colname.lower(), types.NULLTYPE), i) + type = self.context.typemap.get(colname.lower(), types.NULLTYPE) else: - rec = (types.NULLTYPE, i) + type = types.NULLTYPE + rec = (type, type.dialect_impl(self.dialect), i) + if rec[0] is None: raise DBAPIError("None for metadata " + colname) if self.__props.setdefault(colname.lower(), rec) is not rec: @@ -992,7 +995,7 @@ class ResultProxy(object): def _get_col(self, row, key): rec = self._convert_key(key) - return rec[0].dialect_impl(self.dialect).convert_result_value(row[rec[1]], self.dialect) + return rec[1].convert_result_value(row[rec[2]], self.dialect) def _fetchone_impl(self): return self.cursor.fetchone() @@ -1104,7 +1107,7 @@ class BufferedColumnResultProxy(ResultProxy): """ def _get_col(self, row, key): rec = self._convert_key(key) - return row[rec[1]] + return row[rec[2]] def _process_row(self, row): sup = super(BufferedColumnResultProxy, self) diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 223c270b0f..aff5705050 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -1446,8 +1446,8 @@ class Mapper(object): # including modifying any of its related items lists, as its already # been exposed to being modified by the application. - populate_existing = context.populate_existing or self.always_refresh identitykey = self.identity_key_from_row(row) + populate_existing = context.populate_existing or self.always_refresh if context.session.has_key(identitykey): instance = context.session._get(identitykey) if self.__should_log_debug: