[pypy-commit] pypy default: improve layout of _sqlite3.Connection

bdkearns noreply at buildbot.pypy.org
Wed Mar 6 01:42:25 CET 2013


Author: Brian Kearns <bdkearns at gmail.com>
Branch: 
Changeset: r62103:10fab7978541
Date: 2013-03-05 19:32 -0500
http://bitbucket.org/pypy/pypy/changeset/10fab7978541/

Log:	improve layout of _sqlite3.Connection

diff --git a/lib_pypy/_sqlite3.py b/lib_pypy/_sqlite3.py
--- a/lib_pypy/_sqlite3.py
+++ b/lib_pypy/_sqlite3.py
@@ -50,6 +50,7 @@
 PARSE_COLNAMES = 1
 PARSE_DECLTYPES = 2
 
+DML, DQL, DDL = range(3)
 
 ##########################################
 # BEGIN Wrapped SQLite C API and constants
@@ -348,6 +349,49 @@
         if self.db:
             sqlite.sqlite3_close(self.db)
 
+    def close(self):
+        self._check_thread()
+
+        for statement in self.statements:
+            obj = statement()
+            if obj is not None:
+                obj.finalize()
+
+        if self.db:
+            ret = sqlite.sqlite3_close(self.db)
+            if ret != SQLITE_OK:
+                raise self._get_exception(ret)
+            self.db.value = 0
+
+    def _check_closed(self):
+        if self.db is None:
+            raise ProgrammingError("Base Connection.__init__ not called.")
+        if not self.db:
+            raise ProgrammingError("Cannot operate on a closed database.")
+
+    def _check_closed_wrap(func):
+        @wraps(func)
+        def _check_closed_func(self, *args, **kwargs):
+            self._check_closed()
+            return func(self, *args, **kwargs)
+        return _check_closed_func
+
+    def _check_thread(self):
+        if not hasattr(self, 'thread_ident'):
+            return
+        if self.thread_ident != thread_get_ident():
+            raise ProgrammingError(
+                "SQLite objects created in a thread can only be used in that same thread."
+                "The object was created in thread id %d and this is thread id %d",
+                self.thread_ident, thread_get_ident())
+
+    def _check_thread_wrap(func):
+        @wraps(func)
+        def _check_thread_func(self, *args, **kwargs):
+            self._check_thread()
+            return func(self, *args, **kwargs)
+        return _check_thread_func
+
     def _get_exception(self, error_code=None):
         if error_code is None:
             error_code = sqlite.sqlite3_errcode(self.db)
@@ -384,34 +428,12 @@
         if self.statement_counter % 100 == 0:
             self.statements = [ref for ref in self.statements if ref() is not None]
 
-    def _check_thread(self):
-        if not hasattr(self, 'thread_ident'):
-            return
-        if self.thread_ident != thread_get_ident():
-            raise ProgrammingError(
-                "SQLite objects created in a thread can only be used in that same thread."
-                "The object was created in thread id %d and this is thread id %d",
-                self.thread_ident, thread_get_ident())
-
-    def _check_thread_wrap(func):
-        @wraps(func)
-        def _check_thread_func(self, *args, **kwargs):
-            self._check_thread()
-            return func(self, *args, **kwargs)
-        return _check_thread_func
-
-    def _check_closed_wrap(func):
-        @wraps(func)
-        def _check_closed_func(self, *args, **kwargs):
-            self._check_closed()
-            return func(self, *args, **kwargs)
-        return _check_closed_func
-
-    def _reset_cursors(self):
-        for cursor_ref in self.cursors:
-            cursor = cursor_ref()
-            if cursor:
-                cursor.reset = True
+    @_check_closed_wrap
+    def __call__(self, sql):
+        if not isinstance(sql, (str, unicode)):
+            raise Warning("SQL is of wrong type. Must be string or unicode.")
+        statement = self.statement_cache.get(sql, self.row_factory)
+        return statement
 
     def cursor(self, factory=None):
         self._check_thread()
@@ -423,35 +445,21 @@
             cur.row_factory = self.row_factory
         return cur
 
+    def execute(self, *args):
+        cur = self.cursor()
+        return cur.execute(*args)
+
     def executemany(self, *args):
         cur = self.cursor()
         return cur.executemany(*args)
 
-    def execute(self, *args):
-        cur = self.cursor()
-        return cur.execute(*args)
-
     def executescript(self, *args):
         cur = self.cursor()
         return cur.executescript(*args)
 
-    @_check_closed_wrap
-    def __call__(self, sql):
-        if not isinstance(sql, (str, unicode)):
-            raise Warning("SQL is of wrong type. Must be string or unicode.")
-        statement = self.statement_cache.get(sql, self.row_factory)
-        return statement
-
-    def _get_isolation_level(self):
-        return self._isolation_level
-
-    def _set_isolation_level(self, val):
-        if val is None:
-            self.commit()
-        if isinstance(val, unicode):
-            val = str(val)
-        self._isolation_level = val
-    isolation_level = property(_get_isolation_level, _set_isolation_level)
+    def iterdump(self):
+        from sqlite3.dump import _iterdump
+        return _iterdump(self)
 
     def _begin(self):
         self._check_closed()
@@ -506,6 +514,11 @@
             if obj is not None:
                 obj.reset()
 
+        for cursor_ref in self.cursors:
+            cursor = cursor_ref()
+            if cursor:
+                cursor.reset = True
+
         try:
             sql = "ROLLBACK"
             statement = c_void_p()
@@ -518,13 +531,6 @@
                 raise self._get_exception(ret)
         finally:
             sqlite.sqlite3_finalize(statement)
-            self._reset_cursors()
-
-    def _check_closed(self):
-        if self.db is None:
-            raise ProgrammingError("Base Connection.__init__ not called.")
-        if not self.db:
-            raise ProgrammingError("Cannot operate on a closed database.")
 
     def __enter__(self):
         return self
@@ -535,101 +541,6 @@
         else:
             self.rollback()
 
-    def _get_total_changes(self):
-        self._check_closed()
-        return sqlite.sqlite3_total_changes(self.db)
-    total_changes = property(_get_total_changes)
-
-    def close(self):
-        self._check_thread()
-
-        for statement in self.statements:
-            obj = statement()
-            if obj is not None:
-                obj.finalize()
-
-        if self.db:
-            ret = sqlite.sqlite3_close(self.db)
-            if ret != SQLITE_OK:
-                raise self._get_exception(ret)
-            self.db.value = 0
-
-    @_check_thread_wrap
-    @_check_closed_wrap
-    def create_collation(self, name, callback):
-        name = name.upper()
-        if not name.replace('_', '').isalnum():
-            raise ProgrammingError("invalid character in collation name")
-
-        if callback is None:
-            del self._collations[name]
-            c_collation_callback = cast(None, COLLATION)
-        else:
-            if not callable(callback):
-                raise TypeError("parameter must be callable")
-
-            def collation_callback(context, len1, str1, len2, str2):
-                text1 = string_at(str1, len1)
-                text2 = string_at(str2, len2)
-
-                return callback(text1, text2)
-
-            c_collation_callback = COLLATION(collation_callback)
-            self._collations[name] = c_collation_callback
-
-        ret = sqlite.sqlite3_create_collation(self.db, name,
-                                              SQLITE_UTF8,
-                                              None,
-                                              c_collation_callback)
-        if ret != SQLITE_OK:
-            raise self._get_exception(ret)
-
-    @_check_thread_wrap
-    @_check_closed_wrap
-    def set_progress_handler(self, callable, nsteps):
-        if callable is None:
-            c_progress_handler = cast(None, PROGRESS)
-        else:
-            try:
-                c_progress_handler, _ = self.func_cache[callable]
-            except KeyError:
-                def progress_handler(userdata):
-                    try:
-                        ret = callable()
-                        return bool(ret)
-                    except Exception:
-                        # abort query if error occurred
-                        return 1
-                c_progress_handler = PROGRESS(progress_handler)
-
-                self.func_cache[callable] = c_progress_handler, progress_handler
-        ret = sqlite.sqlite3_progress_handler(self.db, nsteps,
-                                              c_progress_handler,
-                                              None)
-        if ret != SQLITE_OK:
-            raise self._get_exception(ret)
-
-    @_check_thread_wrap
-    @_check_closed_wrap
-    def set_authorizer(self, callback):
-        try:
-            c_authorizer, _ = self.func_cache[callback]
-        except KeyError:
-            def authorizer(userdata, action, arg1, arg2, dbname, source):
-                try:
-                    return int(callback(action, arg1, arg2, dbname, source))
-                except Exception:
-                    return SQLITE_DENY
-            c_authorizer = AUTHORIZER(authorizer)
-
-            self.func_cache[callback] = c_authorizer, authorizer
-
-        ret = sqlite.sqlite3_set_authorizer(self.db,
-                                            c_authorizer,
-                                            None)
-        if ret != SQLITE_OK:
-            raise self._get_exception(ret)
-
     @_check_thread_wrap
     @_check_closed_wrap
     def create_function(self, name, num_args, callback):
@@ -717,9 +628,97 @@
         if ret != SQLITE_OK:
             raise self._get_exception(ret)
 
-    def iterdump(self):
-        from sqlite3.dump import _iterdump
-        return _iterdump(self)
+    @_check_thread_wrap
+    @_check_closed_wrap
+    def create_collation(self, name, callback):
+        name = name.upper()
+        if not name.replace('_', '').isalnum():
+            raise ProgrammingError("invalid character in collation name")
+
+        if callback is None:
+            del self._collations[name]
+            c_collation_callback = cast(None, COLLATION)
+        else:
+            if not callable(callback):
+                raise TypeError("parameter must be callable")
+
+            def collation_callback(context, len1, str1, len2, str2):
+                text1 = string_at(str1, len1)
+                text2 = string_at(str2, len2)
+
+                return callback(text1, text2)
+
+            c_collation_callback = COLLATION(collation_callback)
+            self._collations[name] = c_collation_callback
+
+        ret = sqlite.sqlite3_create_collation(self.db, name,
+                                              SQLITE_UTF8,
+                                              None,
+                                              c_collation_callback)
+        if ret != SQLITE_OK:
+            raise self._get_exception(ret)
+
+    @_check_thread_wrap
+    @_check_closed_wrap
+    def set_authorizer(self, callback):
+        try:
+            c_authorizer, _ = self.func_cache[callback]
+        except KeyError:
+            def authorizer(userdata, action, arg1, arg2, dbname, source):
+                try:
+                    return int(callback(action, arg1, arg2, dbname, source))
+                except Exception:
+                    return SQLITE_DENY
+            c_authorizer = AUTHORIZER(authorizer)
+
+            self.func_cache[callback] = c_authorizer, authorizer
+
+        ret = sqlite.sqlite3_set_authorizer(self.db,
+                                            c_authorizer,
+                                            None)
+        if ret != SQLITE_OK:
+            raise self._get_exception(ret)
+
+    @_check_thread_wrap
+    @_check_closed_wrap
+    def set_progress_handler(self, callable, nsteps):
+        if callable is None:
+            c_progress_handler = cast(None, PROGRESS)
+        else:
+            try:
+                c_progress_handler, _ = self.func_cache[callable]
+            except KeyError:
+                def progress_handler(userdata):
+                    try:
+                        ret = callable()
+                        return bool(ret)
+                    except Exception:
+                        # abort query if error occurred
+                        return 1
+                c_progress_handler = PROGRESS(progress_handler)
+
+                self.func_cache[callable] = c_progress_handler, progress_handler
+        ret = sqlite.sqlite3_progress_handler(self.db, nsteps,
+                                              c_progress_handler,
+                                              None)
+        if ret != SQLITE_OK:
+            raise self._get_exception(ret)
+
+    def _get_isolation_level(self):
+        return self._isolation_level
+
+    def _get_total_changes(self):
+        self._check_closed()
+        return sqlite.sqlite3_total_changes(self.db)
+    total_changes = property(_get_total_changes)
+
+    def _set_isolation_level(self, val):
+        if val is None:
+            self.commit()
+        if isinstance(val, unicode):
+            val = str(val)
+        self._isolation_level = val
+    isolation_level = property(_get_isolation_level, _set_isolation_level)
 
     if HAS_LOAD_EXTENSION:
         @_check_thread_wrap
@@ -729,8 +728,6 @@
             if rc != SQLITE_OK:
                 raise OperationalError("Error enabling load extension")
 
-DML, DQL, DDL = range(3)
-
 
 class CursorLock(object):
     def __init__(self, cursor):


More information about the pypy-commit mailing list