From b941a5832718c4991566b8c19e28e3bedb9b5afa Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 31 May 2007 16:47:48 +0000 Subject: [PATCH] ResultProxy pre-caches the dialect_impl()s for each TypeEngine, saving the method calls later. knocks 5000 function calls off the masseagerload.py test. --- lib/sqlalchemy/engine/base.py | 11 +++++++---- lib/sqlalchemy/orm/mapper.py | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) 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: -- 2.47.3