[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