[pypy-commit] pypy default: store next_row on the cursor not the statement

bdkearns noreply at buildbot.pypy.org
Thu Apr 4 22:19:06 CEST 2013


Author: Brian Kearns <bdkearns at gmail.com>
Branch: 
Changeset: r63019:db5b33a3f3c3
Date: 2013-04-04 16:17 -0400
http://bitbucket.org/pypy/pypy/changeset/db5b33a3f3c3/

Log:	store next_row on the cursor not the statement

diff --git a/lib_pypy/_sqlite3.py b/lib_pypy/_sqlite3.py
--- a/lib_pypy/_sqlite3.py
+++ b/lib_pypy/_sqlite3.py
@@ -884,6 +884,10 @@
     def __execute(self, multiple, sql, many_params):
         self.__locked = True
         try:
+            del self.__next_row
+        except AttributeError:
+            pass
+        try:
             self._reset = False
             if not isinstance(sql, basestring):
                 raise ValueError("operation parameter must be str or unicode")
@@ -915,9 +919,9 @@
                 if self.__statement._kind == Statement._DML:
                     self.__statement._reset()
 
-                if self.__statement._kind == Statement._DQL and ret == _lib.SQLITE_ROW:
+                if ret == _lib.SQLITE_ROW:
                     self.__statement._build_row_cast_map()
-                    self.__statement._readahead(self)
+                    self.__next_row = self.__statement._readahead(self)
 
                 if self.__statement._kind == Statement._DML:
                     if self.__rowcount == -1:
@@ -992,7 +996,22 @@
         self.__check_reset()
         if not self.__statement:
             raise StopIteration
-        return self.__statement._next(self)
+
+        try:
+            next_row = self.__next_row
+        except AttributeError:
+            self.__statement._reset()
+            self.__statement = None
+            raise StopIteration
+        del self.__next_row
+
+        ret = _lib.sqlite3_step(self.__statement._statement)
+        if ret not in (_lib.SQLITE_DONE, _lib.SQLITE_ROW):
+            self.__statement._reset()
+            raise self.__connection._get_exception(ret)
+        elif ret == _lib.SQLITE_ROW:
+            self.__next_row = self.__statement._readahead(self)
+        return next_row
 
     if sys.version_info[0] < 3:
         next = __next__
@@ -1259,24 +1278,7 @@
         row = tuple(row)
         if self._row_factory is not None:
             row = self._row_factory(cursor, row)
-        self._item = row
-
-    def _next(self, cursor):
-        try:
-            item = self._item
-        except AttributeError:
-            self._reset()
-            raise StopIteration
-        del self._item
-
-        ret = _lib.sqlite3_step(self._statement)
-        if ret not in (_lib.SQLITE_DONE, _lib.SQLITE_ROW):
-            _lib.sqlite3_reset(self._statement)
-            raise self.__con._get_exception(ret)
-        elif ret == _lib.SQLITE_ROW:
-            self._readahead(cursor)
-
-        return item
+        return row
 
     def _get_description(self):
         if self._kind == Statement._DML:


More information about the pypy-commit mailing list