diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-02-04 18:33:49 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-02-04 18:33:49 -0500 |
commit | 637fdd32510c7e04dbf279482057f3fa19c97456 (patch) | |
tree | d0e138f1411ccde281972a2f43316006dee5b884 /lib | |
parent | d5cc2f83c1183eb65d0daac3532a1645d0cd9513 (diff) | |
download | sqlalchemy-637fdd32510c7e04dbf279482057f3fa19c97456.tar.gz |
- apply optimizations to alternate row proxies, [ticket:1787]
- add check to fetchmany() for None, don't send argument if not present,
helps DBAPIs which don't accept "None" for default (ie. pysqlite, maybe others)
- add tests to test_execute to provide 100% coverage for the three alternate
result proxy classes
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sqlalchemy/dialects/oracle/cx_oracle.py | 5 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/base.py | 34 |
2 files changed, 26 insertions, 13 deletions
diff --git a/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/lib/sqlalchemy/dialects/oracle/cx_oracle.py index 04f3aab95..bc1c87703 100644 --- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py @@ -127,6 +127,7 @@ from sqlalchemy.engine import base from sqlalchemy import types as sqltypes, util, exc, processors from datetime import datetime import random +import collections from sqlalchemy.util.compat import decimal import re @@ -423,8 +424,8 @@ class ReturningResultProxy(base.FullyBufferedResultProxy): return ret def _buffer_rows(self): - return [tuple(self._returning_params["ret_%d" % i] - for i, c in enumerate(self._returning_params))] + return collections.deque([tuple(self._returning_params["ret_%d" % i] + for i, c in enumerate(self._returning_params))]) class OracleDialect_cx_oracle(OracleDialect): execution_ctx_cls = OracleExecutionContext_cx_oracle diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index ccce58b9c..b78a30537 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -26,6 +26,7 @@ from sqlalchemy import exc, schema, util, types, log, interfaces, \ event, events from sqlalchemy.sql import expression from sqlalchemy import processors +import collections class Dialect(object): """Define the behavior of a specific database and DB-API combination. @@ -2603,7 +2604,10 @@ class ResultProxy(object): def _fetchmany_impl(self, size=None): try: - return self.cursor.fetchmany(size) + if size is None: + return self.cursor.fetchmany() + else: + return self.cursor.fetchmany(size) except AttributeError: self._non_result() @@ -2756,24 +2760,29 @@ class BufferedRowResultProxy(ResultProxy): 5 : 10, 10 : 20, 20 : 50, - 50 : 100 + 50 : 100, + 100 : 250, + 250 : 500, + 500 : 1000 } def __buffer_rows(self): size = getattr(self, '_bufsize', 1) - self.__rowbuffer = self.cursor.fetchmany(size) + self.__rowbuffer = collections.deque(self.cursor.fetchmany(size)) self._bufsize = self.size_growth.get(size, size) def _fetchone_impl(self): if self.closed: return None - if len(self.__rowbuffer) == 0: + if not self.__rowbuffer: self.__buffer_rows() - if len(self.__rowbuffer) == 0: + if not self.__rowbuffer: return None - return self.__rowbuffer.pop(0) + return self.__rowbuffer.popleft() def _fetchmany_impl(self, size=None): + if size is None: + return self._fetchall_impl() result = [] for x in range(0, size): row = self._fetchone_impl() @@ -2783,8 +2792,9 @@ class BufferedRowResultProxy(ResultProxy): return result def _fetchall_impl(self): - ret = self.__rowbuffer + list(self.cursor.fetchall()) - self.__rowbuffer[:] = [] + self.__rowbuffer.extend(self.cursor.fetchall()) + ret = self.__rowbuffer + self.__rowbuffer = collections.deque() return ret class FullyBufferedResultProxy(ResultProxy): @@ -2800,15 +2810,17 @@ class FullyBufferedResultProxy(ResultProxy): self.__rowbuffer = self._buffer_rows() def _buffer_rows(self): - return self.cursor.fetchall() + return collections.deque(self.cursor.fetchall()) def _fetchone_impl(self): if self.__rowbuffer: - return self.__rowbuffer.pop(0) + return self.__rowbuffer.popleft() else: return None def _fetchmany_impl(self, size=None): + if size is None: + return self._fetchall_impl() result = [] for x in range(0, size): row = self._fetchone_impl() @@ -2819,7 +2831,7 @@ class FullyBufferedResultProxy(ResultProxy): def _fetchall_impl(self): ret = self.__rowbuffer - self.__rowbuffer = [] + self.__rowbuffer = collections.deque() return ret class BufferedColumnRow(RowProxy): |