from __future__ import annotations
import collections
-import itertools
from ..engine import AdaptedConnection
from ..util.concurrency import asyncio
def fetchmany(self, size=None):
if size is None:
size = self.arraysize
-
- rr = iter(self._rows)
- retval = list(itertools.islice(rr, 0, size))
- self._rows = collections.deque(rr)
- return retval
+ rr = self._rows
+ return [rr.popleft() for _ in range(min(size, len(rr)))]
def fetchall(self):
retval = list(self._rows)
if size is None:
return self.fetchall(result, dbapi_cursor)
- buf = list(self._rowbuffer)
- lb = len(buf)
+ rb = self._rowbuffer
+ lb = len(rb)
+ close = False
if size > lb:
try:
new = dbapi_cursor.fetchmany(size - lb)
self.handle_exception(result, dbapi_cursor, e)
else:
if not new:
- result._soft_close()
+ # defer closing since it may clear the row buffer
+ close = True
else:
- buf.extend(new)
+ rb.extend(new)
- result = buf[0:size]
- self._rowbuffer = collections.deque(buf[size:])
- return result
+ res = [rb.popleft() for _ in range(min(size, len(rb)))]
+ if close:
+ result._soft_close()
+ return res
def fetchall(self, result, dbapi_cursor):
try:
if size is None:
return self.fetchall(result, dbapi_cursor)
- buf = list(self._rowbuffer)
- rows = buf[0:size]
- self._rowbuffer = collections.deque(buf[size:])
+ rb = self._rowbuffer
+ rows = [rb.popleft() for _ in range(min(size, len(rb)))]
if not rows:
result._soft_close()
return rows