[pypy-commit] pypy default: simplify sqlite cursor locking

bdkearns noreply at buildbot.pypy.org
Wed Mar 6 09:35:12 CET 2013


Author: Brian Kearns <bdkearns at gmail.com>
Branch: 
Changeset: r62123:92298f0e65e7
Date: 2013-03-06 02:35 -0500
http://bitbucket.org/pypy/pypy/changeset/92298f0e65e7/

Log:	simplify sqlite cursor locking

diff --git a/lib_pypy/_sqlite3.py b/lib_pypy/_sqlite3.py
--- a/lib_pypy/_sqlite3.py
+++ b/lib_pypy/_sqlite3.py
@@ -739,20 +739,6 @@
                 raise OperationalError("Error enabling load extension")
 
 
-class _CursorLock(object):
-    def __init__(self, cursor):
-        self.cursor = cursor
-
-    def __enter__(self):
-        self.cursor._check_closed()
-        if self.cursor._locked:
-            raise ProgrammingError("Recursive use of cursors not allowed.")
-        self.cursor._locked = True
-
-    def __exit__(self, *args):
-        self.cursor._locked = False
-
-
 class Cursor(object):
     __initialized = False
     __connection = None
@@ -770,8 +756,8 @@
 
         self.arraysize = 1
         self.row_factory = None
-        self._locked = False
         self._reset = False
+        self.__locked = False
         self.__closed = False
         self.__description = None
         self.__rowcount = -1
@@ -798,6 +784,8 @@
             raise ProgrammingError("Base Cursor.__init__ not called.")
         if self.__closed:
             raise ProgrammingError("Cannot operate on a closed cursor.")
+        if self.__locked:
+            raise ProgrammingError("Recursive use of cursors not allowed.")
         self.__connection._check_thread()
         self.__connection._check_closed()
 
@@ -805,7 +793,9 @@
         if type(sql) is unicode:
             sql = sql.encode("utf-8")
 
-        with _CursorLock(self):
+        self._check_closed()
+        self.__locked = True
+        try:
             self.__description = None
             self._reset = False
             self.__statement = self.__connection._statement_cache.get(
@@ -842,6 +832,8 @@
             self.__rowcount = -1
             if self.__statement.kind == _DML:
                 self.__rowcount = sqlite.sqlite3_changes(self.__connection._db)
+        finally:
+            self.__locked = False
 
         return self
 
@@ -849,7 +841,9 @@
         if type(sql) is unicode:
             sql = sql.encode("utf-8")
 
-        with _CursorLock(self):
+        self._check_closed()
+        self.__locked = True
+        try:
             self.__description = None
             self._reset = False
             self.__statement = self.__connection._statement_cache.get(
@@ -873,6 +867,8 @@
                     raise self.__connection._get_exception(ret)
                 self.__rowcount += sqlite.sqlite3_changes(self.__connection._db)
             self.__statement.reset()
+        finally:
+            self.__locked = False
 
         return self
 


More information about the pypy-commit mailing list