Author: Brian Kearns <bdkea...@gmail.com> Branch: py3k Changeset: r62208:d62f548e5d51 Date: 2013-03-07 23:39 -0500 http://bitbucket.org/pypy/pypy/changeset/d62f548e5d51/
Log: merge default diff --git a/lib_pypy/_sqlite3.py b/lib_pypy/_sqlite3.py --- a/lib_pypy/_sqlite3.py +++ b/lib_pypy/_sqlite3.py @@ -40,69 +40,69 @@ xrange = range basestring = unicode = str buffer = memoryview - BLOB_TYPE = bytes + _BLOB_TYPE = bytes else: - BLOB_TYPE = buffer + _BLOB_TYPE = buffer -names = "sqlite3.dll libsqlite3.so.0 libsqlite3.so libsqlite3.dylib".split() -for name in names: - try: - sqlite = cdll.LoadLibrary(name) - break - except OSError: - continue -else: - raise ImportError("Could not load C-library, tried: %s" % (names,)) -# pysqlite version information -version = "2.6.0" +def load_library(names): + for name in names: + try: + return cdll.LoadLibrary(name) + except OSError: + pass + else: + raise ImportError("Could not load C-library, tried: %s" % (names,)) -# pysqlite constants -PARSE_COLNAMES = 1 -PARSE_DECLTYPES = 2 +_lib = load_library( + "sqlite3.dll libsqlite3.so.0 libsqlite3.so libsqlite3.dylib".split()) +del load_library ########################################## # BEGIN Wrapped SQLite C API and constants ########################################## -SQLITE_OK = 0 -SQLITE_ERROR = 1 -SQLITE_INTERNAL = 2 -SQLITE_PERM = 3 -SQLITE_ABORT = 4 -SQLITE_BUSY = 5 -SQLITE_LOCKED = 6 -SQLITE_NOMEM = 7 -SQLITE_READONLY = 8 -SQLITE_INTERRUPT = 9 -SQLITE_IOERR = 10 -SQLITE_CORRUPT = 11 -SQLITE_NOTFOUND = 12 -SQLITE_FULL = 13 -SQLITE_CANTOPEN = 14 -SQLITE_PROTOCOL = 15 -SQLITE_EMPTY = 16 -SQLITE_SCHEMA = 17 -SQLITE_TOOBIG = 18 -SQLITE_CONSTRAINT = 19 -SQLITE_MISMATCH = 20 -SQLITE_MISUSE = 21 -SQLITE_NOLFS = 22 -SQLITE_AUTH = 23 -SQLITE_FORMAT = 24 -SQLITE_RANGE = 25 -SQLITE_NOTADB = 26 -SQLITE_ROW = 100 -SQLITE_DONE = 101 -SQLITE_INTEGER = 1 -SQLITE_FLOAT = 2 -SQLITE_BLOB = 4 -SQLITE_NULL = 5 -SQLITE_TEXT = 3 -SQLITE3_TEXT = 3 +_lib.SQLITE_OK = 0 +_lib.SQLITE_ERROR = 1 +_lib.SQLITE_INTERNAL = 2 +_lib.SQLITE_PERM = 3 +_lib.SQLITE_ABORT = 4 +_lib.SQLITE_BUSY = 5 +_lib.SQLITE_LOCKED = 6 +_lib.SQLITE_NOMEM = 7 +_lib.SQLITE_READONLY = 8 +_lib.SQLITE_INTERRUPT = 9 +_lib.SQLITE_IOERR = 10 +_lib.SQLITE_CORRUPT = 11 +_lib.SQLITE_NOTFOUND = 12 +_lib.SQLITE_FULL = 13 +_lib.SQLITE_CANTOPEN = 14 +_lib.SQLITE_PROTOCOL = 15 +_lib.SQLITE_EMPTY = 16 +_lib.SQLITE_SCHEMA = 17 +_lib.SQLITE_TOOBIG = 18 +_lib.SQLITE_CONSTRAINT = 19 +_lib.SQLITE_MISMATCH = 20 +_lib.SQLITE_MISUSE = 21 +_lib.SQLITE_NOLFS = 22 +_lib.SQLITE_AUTH = 23 +_lib.SQLITE_FORMAT = 24 +_lib.SQLITE_RANGE = 25 +_lib.SQLITE_NOTADB = 26 +_lib.SQLITE_ROW = 100 +_lib.SQLITE_DONE = 101 -SQLITE_TRANSIENT = cast(-1, c_void_p) -SQLITE_UTF8 = 1 +_lib.SQLITE_INTEGER = 1 +_lib.SQLITE_FLOAT = 2 +_lib.SQLITE_TEXT = 3 +_lib.SQLITE_BLOB = 4 +_lib.SQLITE_NULL = 5 + +_lib.SQLITE_UTF8 = 1 + +_lib.SQLITE_TRANSIENT = cast(-1, c_void_p) + +SQLITE_OK = _lib.SQLITE_OK SQLITE_DENY = 1 SQLITE_IGNORE = 2 @@ -135,161 +135,177 @@ SQLITE_ALTER_TABLE = 26 SQLITE_REINDEX = 27 SQLITE_ANALYZE = 28 -SQLITE_CREATE_VTABLE = 29 -SQLITE_DROP_VTABLE = 30 -SQLITE_FUNCTION = 31 # SQLite C API -sqlite.sqlite3_value_int.argtypes = [c_void_p] -sqlite.sqlite3_value_int.restype = c_int +_lib.sqlite3_value_int.argtypes = [c_void_p] +_lib.sqlite3_value_int.restype = c_int -sqlite.sqlite3_value_int64.argtypes = [c_void_p] -sqlite.sqlite3_value_int64.restype = c_int64 +_lib.sqlite3_value_int64.argtypes = [c_void_p] +_lib.sqlite3_value_int64.restype = c_int64 -sqlite.sqlite3_value_blob.argtypes = [c_void_p] -sqlite.sqlite3_value_blob.restype = c_void_p +_lib.sqlite3_value_blob.argtypes = [c_void_p] +_lib.sqlite3_value_blob.restype = c_void_p -sqlite.sqlite3_value_bytes.argtypes = [c_void_p] -sqlite.sqlite3_value_bytes.restype = c_int +_lib.sqlite3_value_bytes.argtypes = [c_void_p] +_lib.sqlite3_value_bytes.restype = c_int -sqlite.sqlite3_value_double.argtypes = [c_void_p] -sqlite.sqlite3_value_double.restype = c_double +_lib.sqlite3_value_double.argtypes = [c_void_p] +_lib.sqlite3_value_double.restype = c_double -sqlite.sqlite3_value_text.argtypes = [c_void_p] -sqlite.sqlite3_value_text.restype = c_char_p +_lib.sqlite3_value_text.argtypes = [c_void_p] +_lib.sqlite3_value_text.restype = c_char_p -sqlite.sqlite3_value_type.argtypes = [c_void_p] -sqlite.sqlite3_value_type.restype = c_int +_lib.sqlite3_value_type.argtypes = [c_void_p] +_lib.sqlite3_value_type.restype = c_int -sqlite.sqlite3_bind_blob.argtypes = [c_void_p, c_int, c_void_p, c_int, c_void_p] -sqlite.sqlite3_bind_blob.restype = c_int -sqlite.sqlite3_bind_double.argtypes = [c_void_p, c_int, c_double] -sqlite.sqlite3_bind_double.restype = c_int -sqlite.sqlite3_bind_int.argtypes = [c_void_p, c_int, c_int] -sqlite.sqlite3_bind_int.restype = c_int -sqlite.sqlite3_bind_int64.argtypes = [c_void_p, c_int, c_int64] -sqlite.sqlite3_bind_int64.restype = c_int -sqlite.sqlite3_bind_null.argtypes = [c_void_p, c_int] -sqlite.sqlite3_bind_null.restype = c_int -sqlite.sqlite3_bind_parameter_count.argtypes = [c_void_p] -sqlite.sqlite3_bind_parameter_count.restype = c_int -sqlite.sqlite3_bind_parameter_index.argtypes = [c_void_p, c_char_p] -sqlite.sqlite3_bind_parameter_index.restype = c_int -sqlite.sqlite3_bind_parameter_name.argtypes = [c_void_p, c_int] -sqlite.sqlite3_bind_parameter_name.restype = c_char_p -sqlite.sqlite3_bind_text.argtypes = [c_void_p, c_int, c_char_p, c_int, c_void_p] -sqlite.sqlite3_bind_text.restype = c_int -sqlite.sqlite3_busy_timeout.argtypes = [c_void_p, c_int] -sqlite.sqlite3_busy_timeout.restype = c_int -sqlite.sqlite3_changes.argtypes = [c_void_p] -sqlite.sqlite3_changes.restype = c_int -sqlite.sqlite3_close.argtypes = [c_void_p] -sqlite.sqlite3_close.restype = c_int -sqlite.sqlite3_column_blob.argtypes = [c_void_p, c_int] -sqlite.sqlite3_column_blob.restype = c_void_p -sqlite.sqlite3_column_bytes.argtypes = [c_void_p, c_int] -sqlite.sqlite3_column_bytes.restype = c_int -sqlite.sqlite3_column_count.argtypes = [c_void_p] -sqlite.sqlite3_column_count.restype = c_int -sqlite.sqlite3_column_decltype.argtypes = [c_void_p, c_int] -sqlite.sqlite3_column_decltype.restype = c_char_p -sqlite.sqlite3_column_double.argtypes = [c_void_p, c_int] -sqlite.sqlite3_column_double.restype = c_double -sqlite.sqlite3_column_int64.argtypes = [c_void_p, c_int] -sqlite.sqlite3_column_int64.restype = c_int64 -sqlite.sqlite3_column_name.argtypes = [c_void_p, c_int] -sqlite.sqlite3_column_name.restype = c_char_p -sqlite.sqlite3_column_text.argtypes = [c_void_p, c_int] -sqlite.sqlite3_column_text.restype = POINTER(c_char) -sqlite.sqlite3_column_type.argtypes = [c_void_p, c_int] -sqlite.sqlite3_column_type.restype = c_int -sqlite.sqlite3_complete.argtypes = [c_char_p] -sqlite.sqlite3_complete.restype = c_int -sqlite.sqlite3_errcode.restype = c_int -sqlite.sqlite3_errmsg.argtypes = [c_void_p] -sqlite.sqlite3_errmsg.restype = c_char_p -sqlite.sqlite3_finalize.argtypes = [c_void_p] -sqlite.sqlite3_finalize.restype = c_int -sqlite.sqlite3_get_autocommit.argtypes = [c_void_p] -sqlite.sqlite3_get_autocommit.restype = c_int -sqlite.sqlite3_last_insert_rowid.argtypes = [c_void_p] -sqlite.sqlite3_last_insert_rowid.restype = c_int64 -sqlite.sqlite3_libversion.argtypes = [] -sqlite.sqlite3_libversion.restype = c_char_p -sqlite.sqlite3_open.argtypes = [c_char_p, c_void_p] -sqlite.sqlite3_open.restype = c_int -sqlite.sqlite3_prepare.argtypes = [c_void_p, c_char_p, c_int, c_void_p, POINTER(c_char_p)] -sqlite.sqlite3_prepare.restype = c_int -sqlite.sqlite3_prepare_v2.argtypes = [c_void_p, c_char_p, c_int, c_void_p, POINTER(c_char_p)] -sqlite.sqlite3_prepare_v2.restype = c_int -sqlite.sqlite3_step.argtypes = [c_void_p] -sqlite.sqlite3_step.restype = c_int -sqlite.sqlite3_reset.argtypes = [c_void_p] -sqlite.sqlite3_reset.restype = c_int -sqlite.sqlite3_total_changes.argtypes = [c_void_p] -sqlite.sqlite3_total_changes.restype = c_int +_lib.sqlite3_bind_blob.argtypes = [c_void_p, c_int, c_void_p, c_int, c_void_p] +_lib.sqlite3_bind_blob.restype = c_int +_lib.sqlite3_bind_double.argtypes = [c_void_p, c_int, c_double] +_lib.sqlite3_bind_double.restype = c_int +_lib.sqlite3_bind_int.argtypes = [c_void_p, c_int, c_int] +_lib.sqlite3_bind_int.restype = c_int +_lib.sqlite3_bind_int64.argtypes = [c_void_p, c_int, c_int64] +_lib.sqlite3_bind_int64.restype = c_int +_lib.sqlite3_bind_null.argtypes = [c_void_p, c_int] +_lib.sqlite3_bind_null.restype = c_int +_lib.sqlite3_bind_parameter_count.argtypes = [c_void_p] +_lib.sqlite3_bind_parameter_count.restype = c_int +_lib.sqlite3_bind_parameter_index.argtypes = [c_void_p, c_char_p] +_lib.sqlite3_bind_parameter_index.restype = c_int +_lib.sqlite3_bind_parameter_name.argtypes = [c_void_p, c_int] +_lib.sqlite3_bind_parameter_name.restype = c_char_p +_lib.sqlite3_bind_text.argtypes = [c_void_p, c_int, c_char_p, c_int, c_void_p] +_lib.sqlite3_bind_text.restype = c_int +_lib.sqlite3_busy_timeout.argtypes = [c_void_p, c_int] +_lib.sqlite3_busy_timeout.restype = c_int +_lib.sqlite3_changes.argtypes = [c_void_p] +_lib.sqlite3_changes.restype = c_int +_lib.sqlite3_close.argtypes = [c_void_p] +_lib.sqlite3_close.restype = c_int +_lib.sqlite3_column_blob.argtypes = [c_void_p, c_int] +_lib.sqlite3_column_blob.restype = c_void_p +_lib.sqlite3_column_bytes.argtypes = [c_void_p, c_int] +_lib.sqlite3_column_bytes.restype = c_int +_lib.sqlite3_column_count.argtypes = [c_void_p] +_lib.sqlite3_column_count.restype = c_int +_lib.sqlite3_column_decltype.argtypes = [c_void_p, c_int] +_lib.sqlite3_column_decltype.restype = c_char_p +_lib.sqlite3_column_double.argtypes = [c_void_p, c_int] +_lib.sqlite3_column_double.restype = c_double +_lib.sqlite3_column_int64.argtypes = [c_void_p, c_int] +_lib.sqlite3_column_int64.restype = c_int64 +_lib.sqlite3_column_name.argtypes = [c_void_p, c_int] +_lib.sqlite3_column_name.restype = c_char_p +_lib.sqlite3_column_text.argtypes = [c_void_p, c_int] +_lib.sqlite3_column_text.restype = POINTER(c_char) +_lib.sqlite3_column_type.argtypes = [c_void_p, c_int] +_lib.sqlite3_column_type.restype = c_int +_lib.sqlite3_complete.argtypes = [c_char_p] +_lib.sqlite3_complete.restype = c_int +_lib.sqlite3_errcode.restype = c_int +_lib.sqlite3_errmsg.argtypes = [c_void_p] +_lib.sqlite3_errmsg.restype = c_char_p +_lib.sqlite3_finalize.argtypes = [c_void_p] +_lib.sqlite3_finalize.restype = c_int +_lib.sqlite3_get_autocommit.argtypes = [c_void_p] +_lib.sqlite3_get_autocommit.restype = c_int +_lib.sqlite3_last_insert_rowid.argtypes = [c_void_p] +_lib.sqlite3_last_insert_rowid.restype = c_int64 +_lib.sqlite3_libversion.argtypes = [] +_lib.sqlite3_libversion.restype = c_char_p +_lib.sqlite3_open.argtypes = [c_char_p, c_void_p] +_lib.sqlite3_open.restype = c_int +_lib.sqlite3_prepare.argtypes = [c_void_p, c_char_p, c_int, c_void_p, POINTER(c_char_p)] +_lib.sqlite3_prepare.restype = c_int +_lib.sqlite3_prepare_v2.argtypes = [c_void_p, c_char_p, c_int, c_void_p, POINTER(c_char_p)] +_lib.sqlite3_prepare_v2.restype = c_int +_lib.sqlite3_step.argtypes = [c_void_p] +_lib.sqlite3_step.restype = c_int +_lib.sqlite3_reset.argtypes = [c_void_p] +_lib.sqlite3_reset.restype = c_int +_lib.sqlite3_total_changes.argtypes = [c_void_p] +_lib.sqlite3_total_changes.restype = c_int -sqlite.sqlite3_result_blob.argtypes = [c_void_p, c_void_p, c_int, c_void_p] -sqlite.sqlite3_result_blob.restype = None -sqlite.sqlite3_result_int64.argtypes = [c_void_p, c_int64] -sqlite.sqlite3_result_int64.restype = None -sqlite.sqlite3_result_null.argtypes = [c_void_p] -sqlite.sqlite3_result_null.restype = None -sqlite.sqlite3_result_double.argtypes = [c_void_p, c_double] -sqlite.sqlite3_result_double.restype = None -sqlite.sqlite3_result_error.argtypes = [c_void_p, c_char_p, c_int] -sqlite.sqlite3_result_error.restype = None -sqlite.sqlite3_result_text.argtypes = [c_void_p, c_char_p, c_int, c_void_p] -sqlite.sqlite3_result_text.restype = None +_lib.sqlite3_result_blob.argtypes = [c_void_p, c_void_p, c_int, c_void_p] +_lib.sqlite3_result_blob.restype = None +_lib.sqlite3_result_int64.argtypes = [c_void_p, c_int64] +_lib.sqlite3_result_int64.restype = None +_lib.sqlite3_result_null.argtypes = [c_void_p] +_lib.sqlite3_result_null.restype = None +_lib.sqlite3_result_double.argtypes = [c_void_p, c_double] +_lib.sqlite3_result_double.restype = None +_lib.sqlite3_result_error.argtypes = [c_void_p, c_char_p, c_int] +_lib.sqlite3_result_error.restype = None +_lib.sqlite3_result_text.argtypes = [c_void_p, c_char_p, c_int, c_void_p] +_lib.sqlite3_result_text.restype = None -_HAS_LOAD_EXTENSION = hasattr(sqlite, "sqlite3_enable_load_extension") +_HAS_LOAD_EXTENSION = hasattr(_lib, "sqlite3_enable_load_extension") if _HAS_LOAD_EXTENSION: - sqlite.sqlite3_enable_load_extension.argtypes = [c_void_p, c_int] - sqlite.sqlite3_enable_load_extension.restype = c_int + _lib.sqlite3_enable_load_extension.argtypes = [c_void_p, c_int] + _lib.sqlite3_enable_load_extension.restype = c_int ########################################## # END Wrapped SQLite C API and constants ########################################## +# pysqlite version information +version = "2.6.0" + +# pysqlite constants +PARSE_COLNAMES = 1 +PARSE_DECLTYPES = 2 + # SQLite version information -sqlite_version = str(sqlite.sqlite3_libversion().decode('ascii')) +sqlite_version = str(_lib.sqlite3_libversion().decode('ascii')) + class Error(StandardError): pass + class Warning(StandardError): pass + class InterfaceError(Error): pass + class DatabaseError(Error): pass + class InternalError(DatabaseError): pass + class OperationalError(DatabaseError): pass + class ProgrammingError(DatabaseError): pass + class IntegrityError(DatabaseError): pass + class DataError(DatabaseError): pass + class NotSupportedError(DatabaseError): pass + def connect(database, **kwargs): factory = kwargs.get("factory", Connection) return factory(database, **kwargs) -def unicode_text_factory(x): + +def _unicode_text_factory(x): return unicode(x, 'utf-8') if sys.version_info[0] < 3: @@ -300,7 +316,7 @@ val = unicode(s, "utf-8") return val else: - OptimizedUnicode = unicode_text_factory + OptimizedUnicode = _unicode_text_factory class _StatementCache(object): @@ -335,14 +351,14 @@ if isinstance(database, unicode): database = database.encode('utf-8') - if sqlite.sqlite3_open(database, byref(self._db)) != SQLITE_OK: + if _lib.sqlite3_open(database, byref(self._db)) != _lib.SQLITE_OK: raise OperationalError("Could not open database") if timeout is not None: timeout = int(timeout * 1000) # pysqlite2 uses timeout in seconds - sqlite.sqlite3_busy_timeout(self._db, timeout) + _lib.sqlite3_busy_timeout(self._db, timeout) self.row_factory = None - self.text_factory = unicode_text_factory + self.text_factory = _unicode_text_factory self._detect_types = detect_types self._in_transaction = False @@ -373,7 +389,7 @@ def __del__(self): if self._db: - sqlite.sqlite3_close(self._db) + _lib.sqlite3_close(self._db) def close(self): self._check_thread() @@ -384,8 +400,8 @@ obj._finalize() if self._db: - ret = sqlite.sqlite3_close(self._db) - if ret != SQLITE_OK: + ret = _lib.sqlite3_close(self._db) + if ret != _lib.SQLITE_OK: raise self._get_exception(ret) self._db = None @@ -410,9 +426,9 @@ pass else: 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()) + "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) @@ -423,26 +439,29 @@ def _get_exception(self, error_code=None): if error_code is None: - error_code = sqlite.sqlite3_errcode(self._db) - error_message = sqlite.sqlite3_errmsg(self._db).decode('utf-8') + error_code = _lib.sqlite3_errcode(self._db) + error_message = _lib.sqlite3_errmsg(self._db).decode('utf-8') - if error_code == SQLITE_OK: + if error_code == _lib.SQLITE_OK: raise ValueError("error signalled but got SQLITE_OK") - elif error_code in (SQLITE_INTERNAL, SQLITE_NOTFOUND): + elif error_code in (_lib.SQLITE_INTERNAL, _lib.SQLITE_NOTFOUND): exc = InternalError - elif error_code == SQLITE_NOMEM: + elif error_code == _lib.SQLITE_NOMEM: exc = MemoryError - elif error_code in (SQLITE_ERROR, SQLITE_PERM, SQLITE_ABORT, SQLITE_BUSY, SQLITE_LOCKED, - SQLITE_READONLY, SQLITE_INTERRUPT, SQLITE_IOERR, SQLITE_FULL, SQLITE_CANTOPEN, - SQLITE_PROTOCOL, SQLITE_EMPTY, SQLITE_SCHEMA): + elif error_code in ( + _lib.SQLITE_ERROR, _lib.SQLITE_PERM, _lib.SQLITE_ABORT, + _lib.SQLITE_BUSY, _lib.SQLITE_LOCKED, _lib.SQLITE_READONLY, + _lib.SQLITE_INTERRUPT, _lib.SQLITE_IOERR, _lib.SQLITE_FULL, + _lib.SQLITE_CANTOPEN, _lib.SQLITE_PROTOCOL, _lib.SQLITE_EMPTY, + _lib.SQLITE_SCHEMA): exc = OperationalError - elif error_code == SQLITE_CORRUPT: + elif error_code == _lib.SQLITE_CORRUPT: exc = DatabaseError - elif error_code == SQLITE_TOOBIG: + elif error_code == _lib.SQLITE_TOOBIG: exc = DataError - elif error_code in (SQLITE_CONSTRAINT, SQLITE_MISMATCH): + elif error_code in (_lib.SQLITE_CONSTRAINT, _lib.SQLITE_MISMATCH): exc = IntegrityError - elif error_code == SQLITE_MISUSE: + elif error_code == _lib.SQLITE_MISUSE: exc = ProgrammingError else: exc = DatabaseError @@ -455,7 +474,8 @@ self.__statement_counter += 1 if self.__statement_counter % 100 == 0: - self.__statements = [ref for ref in self.__statements if ref() is not None] + self.__statements = [ref for ref in self.__statements + if ref() is not None] @_check_thread_wrap @_check_closed_wrap @@ -492,17 +512,17 @@ def _begin(self): statement = c_void_p() - ret = sqlite.sqlite3_prepare_v2(self._db, self.__begin_statement, -1, + ret = _lib.sqlite3_prepare_v2(self._db, self.__begin_statement, -1, byref(statement), None) try: - if ret != SQLITE_OK: + if ret != _lib.SQLITE_OK: raise self._get_exception(ret) - ret = sqlite.sqlite3_step(statement) - if ret != SQLITE_DONE: + ret = _lib.sqlite3_step(statement) + if ret != _lib.SQLITE_DONE: raise self._get_exception(ret) self._in_transaction = True finally: - sqlite.sqlite3_finalize(statement) + _lib.sqlite3_finalize(statement) def commit(self): self._check_thread() @@ -516,17 +536,17 @@ obj._reset() statement = c_void_p() - ret = sqlite.sqlite3_prepare_v2(self._db, b"COMMIT", -1, + ret = _lib.sqlite3_prepare_v2(self._db, b"COMMIT", -1, byref(statement), None) try: - if ret != SQLITE_OK: + if ret != _lib.SQLITE_OK: raise self._get_exception(ret) - ret = sqlite.sqlite3_step(statement) - if ret != SQLITE_DONE: + ret = _lib.sqlite3_step(statement) + if ret != _lib.SQLITE_DONE: raise self._get_exception(ret) self._in_transaction = False finally: - sqlite.sqlite3_finalize(statement) + _lib.sqlite3_finalize(statement) def rollback(self): self._check_thread() @@ -545,17 +565,17 @@ cursor._reset = True statement = c_void_p() - ret = sqlite.sqlite3_prepare_v2(self._db, b"ROLLBACK", -1, + ret = _lib.sqlite3_prepare_v2(self._db, b"ROLLBACK", -1, byref(statement), None) try: - if ret != SQLITE_OK: + if ret != _lib.SQLITE_OK: raise self._get_exception(ret) - ret = sqlite.sqlite3_step(statement) - if ret != SQLITE_DONE: + ret = _lib.sqlite3_step(statement) + if ret != _lib.SQLITE_DONE: raise self._get_exception(ret) self._in_transaction = False finally: - sqlite.sqlite3_finalize(statement) + _lib.sqlite3_finalize(statement) def __enter__(self): return self @@ -573,18 +593,18 @@ c_closure, _ = self.__func_cache[callback] except KeyError: def closure(context, nargs, c_params): - function_callback(callback, context, nargs, c_params) + _function_callback(callback, context, nargs, c_params) c_closure = _FUNC(closure) self.__func_cache[callback] = c_closure, closure if isinstance(name, unicode): name = name.encode('utf-8') - ret = sqlite.sqlite3_create_function(self._db, name, num_args, - SQLITE_UTF8, None, + ret = _lib.sqlite3_create_function(self._db, name, num_args, + _lib.SQLITE_UTF8, None, c_closure, cast(None, _STEP), cast(None, _FINAL)) - if ret != SQLITE_OK: + if ret != _lib.SQLITE_OK: raise self.OperationalError("Error creating function") @_check_thread_wrap @@ -595,7 +615,7 @@ except KeyError: def step_callback(context, argc, c_params): aggregate_ptr = cast( - sqlite.sqlite3_aggregate_context( + _lib.sqlite3_aggregate_context( context, sizeof(c_ssize_t)), POINTER(c_ssize_t)) @@ -605,7 +625,7 @@ except Exception: msg = (b"user-defined aggregate's '__init__' " b"method raised error") - sqlite.sqlite3_result_error(context, msg, len(msg)) + _lib.sqlite3_result_error(context, msg, len(msg)) return aggregate_id = id(aggregate) self.__aggregate_instances[aggregate_id] = aggregate @@ -619,11 +639,11 @@ except Exception: msg = (b"user-defined aggregate's 'step' " b"method raised error") - sqlite.sqlite3_result_error(context, msg, len(msg)) + _lib.sqlite3_result_error(context, msg, len(msg)) def final_callback(context): aggregate_ptr = cast( - sqlite.sqlite3_aggregate_context( + _lib.sqlite3_aggregate_context( context, sizeof(c_ssize_t)), POINTER(c_ssize_t)) @@ -634,7 +654,7 @@ except Exception: msg = (b"user-defined aggregate's 'finalize' " b"method raised error") - sqlite.sqlite3_result_error(context, msg, len(msg)) + _lib.sqlite3_result_error(context, msg, len(msg)) else: _convert_result(context, val) finally: @@ -648,12 +668,12 @@ if isinstance(name, unicode): name = name.encode('utf-8') - ret = sqlite.sqlite3_create_function(self._db, name, num_args, - SQLITE_UTF8, None, + ret = _lib.sqlite3_create_function(self._db, name, num_args, + _lib.SQLITE_UTF8, None, cast(None, _FUNC), c_step_callback, c_final_callback) - if ret != SQLITE_OK: + if ret != _lib.SQLITE_OK: raise self._get_exception(ret) @_check_thread_wrap @@ -681,11 +701,11 @@ if isinstance(name, unicode): name = name.encode('utf-8') - ret = sqlite.sqlite3_create_collation(self._db, name, - SQLITE_UTF8, + ret = _lib.sqlite3_create_collation(self._db, name, + _lib.SQLITE_UTF8, None, c_collation_callback) - if ret != SQLITE_OK: + if ret != _lib.SQLITE_OK: raise self._get_exception(ret) @_check_thread_wrap @@ -703,10 +723,10 @@ self.__func_cache[callback] = c_authorizer, authorizer - ret = sqlite.sqlite3_set_authorizer(self._db, + ret = _lib.sqlite3_set_authorizer(self._db, c_authorizer, None) - if ret != SQLITE_OK: + if ret != _lib.SQLITE_OK: raise self._get_exception(ret) @_check_thread_wrap @@ -728,10 +748,10 @@ c_progress_handler = _PROGRESS(progress_handler) self.__func_cache[callable] = c_progress_handler, progress_handler - ret = sqlite.sqlite3_progress_handler(self._db, nsteps, + ret = _lib.sqlite3_progress_handler(self._db, nsteps, c_progress_handler, None) - if ret != SQLITE_OK: + if ret != _lib.SQLITE_OK: raise self._get_exception(ret) if sys.version_info[0] >= 3: @@ -741,7 +761,7 @@ def __get_total_changes(self): self._check_closed() - return sqlite.sqlite3_total_changes(self._db) + return _lib.sqlite3_total_changes(self._db) total_changes = property(__get_total_changes) def __get_isolation_level(self): @@ -759,8 +779,8 @@ @_check_thread_wrap @_check_closed_wrap def enable_load_extension(self, enabled): - rc = sqlite.sqlite3_enable_load_extension(self._db, int(enabled)) - if rc != SQLITE_OK: + rc = _lib.sqlite3_enable_load_extension(self._db, int(enabled)) + if rc != _lib.SQLITE_OK: raise OperationalError("Error enabling load extension") @@ -841,17 +861,17 @@ self.__statement._set_params(params) # Actually execute the SQL statement - ret = sqlite.sqlite3_step(self.__statement._statement) - if ret not in (SQLITE_DONE, SQLITE_ROW): + ret = _lib.sqlite3_step(self.__statement._statement) + if ret not in (_lib.SQLITE_DONE, _lib.SQLITE_ROW): self.__statement._reset() self.__connection._in_transaction = \ - not sqlite.sqlite3_get_autocommit(self.__connection._db) + not _lib.sqlite3_get_autocommit(self.__connection._db) raise self.__connection._get_exception(ret) if self.__statement._kind == Statement._DML: self.__statement._reset() - if self.__statement._kind == Statement._DQL and ret == SQLITE_ROW: + if self.__statement._kind == Statement._DQL and ret == _lib.SQLITE_ROW: self.__statement._build_row_cast_map() self.__statement._readahead(self) else: @@ -860,7 +880,7 @@ self.__rowcount = -1 if self.__statement._kind == Statement._DML: - self.__rowcount = sqlite.sqlite3_changes(self.__connection._db) + self.__rowcount = _lib.sqlite3_changes(self.__connection._db) finally: self.__locked = False @@ -882,19 +902,20 @@ if not self.__connection._in_transaction: self.__connection._begin() else: - raise ProgrammingError("executemany is only for DML statements") + raise ProgrammingError( + "executemany is only for DML statements") self.__rowcount = 0 for params in many_params: self.__statement._set_params(params) - ret = sqlite.sqlite3_step(self.__statement._statement) - if ret != SQLITE_DONE: + ret = _lib.sqlite3_step(self.__statement._statement) + if ret != _lib.SQLITE_DONE: self.__statement._reset() self.__connection._in_transaction = \ - not sqlite.sqlite3_get_autocommit(self.__connection._db) + not _lib.sqlite3_get_autocommit(self.__connection._db) raise self.__connection._get_exception(ret) self.__statement._reset() - self.__rowcount += sqlite.sqlite3_changes(self.__connection._db) + self.__rowcount += _lib.sqlite3_changes(self.__connection._db) finally: self.__locked = False @@ -913,25 +934,25 @@ self.__connection.commit() while True: - rc = sqlite.sqlite3_prepare(self.__connection._db, c_sql, -1, byref(statement), byref(c_sql)) - if rc != SQLITE_OK: + rc = _lib.sqlite3_prepare(self.__connection._db, c_sql, -1, byref(statement), byref(c_sql)) + if rc != _lib.SQLITE_OK: raise self.__connection._get_exception(rc) - rc = SQLITE_ROW - while rc == SQLITE_ROW: + rc = _lib.SQLITE_ROW + while rc == _lib.SQLITE_ROW: if not statement: - rc = SQLITE_OK + rc = _lib.SQLITE_OK else: - rc = sqlite.sqlite3_step(statement) + rc = _lib.sqlite3_step(statement) - if rc != SQLITE_DONE: - sqlite.sqlite3_finalize(statement) - if rc == SQLITE_OK: + if rc != _lib.SQLITE_DONE: + _lib.sqlite3_finalize(statement) + if rc == _lib.SQLITE_OK: return self else: raise self.__connection._get_exception(rc) - rc = sqlite.sqlite3_finalize(statement) - if rc != SQLITE_OK: + rc = _lib.sqlite3_finalize(statement) + if rc != _lib.SQLITE_OK: raise self.__connection._get_exception(rc) if not c_sql.value: @@ -989,7 +1010,7 @@ description = property(__get_description) def __get_lastrowid(self): - return sqlite.sqlite3_last_insert_rowid(self.__connection._db) + return _lib.sqlite3_last_insert_rowid(self.__connection._db) lastrowid = property(__get_lastrowid) def setinputsizes(self, *args): @@ -1026,13 +1047,13 @@ if isinstance(sql, unicode): sql = sql.encode('utf-8') - ret = sqlite.sqlite3_prepare_v2(self.__con._db, sql, -1, byref(self._statement), byref(next_char)) - if ret == SQLITE_OK and self._statement.value is None: + ret = _lib.sqlite3_prepare_v2(self.__con._db, sql, -1, byref(self._statement), byref(next_char)) + if ret == _lib.SQLITE_OK and self._statement.value is None: # an empty statement, we work around that, as it's the least trouble - ret = sqlite.sqlite3_prepare_v2(self.__con._db, b"select 42", -1, byref(self._statement), byref(next_char)) + ret = _lib.sqlite3_prepare_v2(self.__con._db, b"select 42", -1, byref(self._statement), byref(next_char)) self._kind = Statement._DQL - if ret != SQLITE_OK: + if ret != _lib.SQLITE_OK: raise self.__con._get_exception(ret) self.__con._remember_statement(self) next_char = next_char.value.decode('utf-8') @@ -1042,27 +1063,27 @@ def __del__(self): if self._statement: - sqlite.sqlite3_finalize(self._statement) + _lib.sqlite3_finalize(self._statement) def _finalize(self): if self._statement: - sqlite.sqlite3_finalize(self._statement) + _lib.sqlite3_finalize(self._statement) self._statement = None self._in_use = False def _reset(self): if self._in_use and self._statement: - ret = sqlite.sqlite3_reset(self._statement) + _lib.sqlite3_reset(self._statement) self._in_use = False self._exhausted = False def _build_row_cast_map(self): self.__row_cast_map = [] - for i in xrange(sqlite.sqlite3_column_count(self._statement)): + for i in xrange(_lib.sqlite3_column_count(self._statement)): converter = None if self.__con._detect_types & PARSE_COLNAMES: - colname = sqlite.sqlite3_column_name(self._statement, i) + colname = _lib.sqlite3_column_name(self._statement, i) if colname is not None: colname = colname.decode('utf-8') type_start = -1 @@ -1075,7 +1096,7 @@ converter = converters[key.upper()] if converter is None and self.__con._detect_types & PARSE_DECLTYPES: - decltype = sqlite.sqlite3_column_decltype(self._statement, i) + decltype = _lib.sqlite3_column_decltype(self._statement, i) if decltype is not None: decltype = decltype.decode('utf-8') decltype = decltype.split()[0] # if multiple words, use first, eg. "INTEGER NOT NULL" => "INTEGER" @@ -1088,7 +1109,7 @@ if sys.version_info[0] < 3: def __check_decodable(self, param): if self.__con.text_factory in (unicode, OptimizedUnicode, - unicode_text_factory): + _unicode_text_factory): for c in param: if ord(c) & 0x80 != 0: raise self.__con.ProgrammingError( @@ -1106,23 +1127,23 @@ param = adapt(param) if param is None: - rc = sqlite.sqlite3_bind_null(self._statement, idx) + rc = _lib.sqlite3_bind_null(self._statement, idx) elif isinstance(param, (bool, int, long)): if -2147483648 <= param <= 2147483647: - rc = sqlite.sqlite3_bind_int(self._statement, idx, param) + rc = _lib.sqlite3_bind_int(self._statement, idx, param) else: - rc = sqlite.sqlite3_bind_int64(self._statement, idx, param) + rc = _lib.sqlite3_bind_int64(self._statement, idx, param) elif isinstance(param, float): - rc = sqlite.sqlite3_bind_double(self._statement, idx, param) + rc = _lib.sqlite3_bind_double(self._statement, idx, param) elif isinstance(param, unicode): param = param.encode("utf-8") - rc = sqlite.sqlite3_bind_text(self._statement, idx, param, len(param), SQLITE_TRANSIENT) + rc = _lib.sqlite3_bind_text(self._statement, idx, param, len(param), _lib.SQLITE_TRANSIENT) elif isinstance(param, str): self.__check_decodable(param) - rc = sqlite.sqlite3_bind_text(self._statement, idx, param, len(param), SQLITE_TRANSIENT) + rc = _lib.sqlite3_bind_text(self._statement, idx, param, len(param), _lib.SQLITE_TRANSIENT) elif isinstance(param, (buffer, bytes)): param = bytes(param) - rc = sqlite.sqlite3_bind_blob(self._statement, idx, param, len(param), SQLITE_TRANSIENT) + rc = _lib.sqlite3_bind_blob(self._statement, idx, param, len(param), _lib.SQLITE_TRANSIENT) else: rc = -1 return rc @@ -1130,7 +1151,7 @@ def _set_params(self, params): self._in_use = True - num_params_needed = sqlite.sqlite3_bind_parameter_count(self._statement) + num_params_needed = _lib.sqlite3_bind_parameter_count(self._statement) if isinstance(params, (tuple, list)) or \ not isinstance(params, dict) and \ hasattr(params, '__getitem__'): @@ -1145,12 +1166,12 @@ (num_params_needed, num_params)) for i in range(num_params): rc = self.__set_param(i + 1, params[i]) - if rc != SQLITE_OK: + if rc != _lib.SQLITE_OK: raise InterfaceError("Error binding parameter %d - " "probably unsupported type." % i) elif isinstance(params, dict): for i in range(1, num_params_needed + 1): - param_name = sqlite.sqlite3_bind_parameter_name(self._statement, i) + param_name = _lib.sqlite3_bind_parameter_name(self._statement, i) if param_name is None: raise ProgrammingError("Binding %d has no name, but you " "supplied a dictionary (which has " @@ -1162,7 +1183,7 @@ raise ProgrammingError("You did not supply a value for " "binding %d." % i) rc = self.__set_param(i, param) - if rc != SQLITE_OK: + if rc != _lib.SQLITE_OK: raise InterfaceError("Error binding parameter :%s - " "probably unsupported type." % param_name) @@ -1174,47 +1195,47 @@ raise StopIteration item = self._item - ret = sqlite.sqlite3_step(self._statement) - if ret == SQLITE_DONE: + ret = _lib.sqlite3_step(self._statement) + if ret == _lib.SQLITE_DONE: self._exhausted = True self._item = None - elif ret != SQLITE_ROW: + elif ret != _lib.SQLITE_ROW: exc = self.__con._get_exception(ret) - sqlite.sqlite3_reset(self._statement) + _lib.sqlite3_reset(self._statement) raise exc self._readahead(cursor) return item def _readahead(self, cursor): - self.column_count = sqlite.sqlite3_column_count(self._statement) + self.column_count = _lib.sqlite3_column_count(self._statement) row = [] for i in xrange(self.column_count): - typ = sqlite.sqlite3_column_type(self._statement, i) + typ = _lib.sqlite3_column_type(self._statement, i) converter = self.__row_cast_map[i] if converter is None: - if typ == SQLITE_NULL: + if typ == _lib.SQLITE_NULL: val = None - elif typ == SQLITE_INTEGER: - val = sqlite.sqlite3_column_int64(self._statement, i) - elif typ == SQLITE_FLOAT: - val = sqlite.sqlite3_column_double(self._statement, i) - elif typ == SQLITE_TEXT: - text = sqlite.sqlite3_column_text(self._statement, i) - text_len = sqlite.sqlite3_column_bytes(self._statement, i) + elif typ == _lib.SQLITE_INTEGER: + val = _lib.sqlite3_column_int64(self._statement, i) + elif typ == _lib.SQLITE_FLOAT: + val = _lib.sqlite3_column_double(self._statement, i) + elif typ == _lib.SQLITE_TEXT: + text = _lib.sqlite3_column_text(self._statement, i) + text_len = _lib.sqlite3_column_bytes(self._statement, i) val = string_at(text, text_len) val = self.__con.text_factory(val) - elif typ == SQLITE_BLOB: - blob = sqlite.sqlite3_column_blob(self._statement, i) - blob_len = sqlite.sqlite3_column_bytes(self._statement, i) - val = BLOB_TYPE(string_at(blob, blob_len)) + elif typ == _lib.SQLITE_BLOB: + blob = _lib.sqlite3_column_blob(self._statement, i) + blob_len = _lib.sqlite3_column_bytes(self._statement, i) + val = _BLOB_TYPE(string_at(blob, blob_len)) else: - blob = sqlite.sqlite3_column_blob(self._statement, i) + blob = _lib.sqlite3_column_blob(self._statement, i) if not blob: val = None else: - blob_len = sqlite.sqlite3_column_bytes(self._statement, i) + blob_len = _lib.sqlite3_column_bytes(self._statement, i) val = bytes(string_at(blob, blob_len)) val = converter(val) row.append(val) @@ -1228,8 +1249,8 @@ if self._kind == Statement._DML: return None desc = [] - for i in xrange(sqlite.sqlite3_column_count(self._statement)): - name = sqlite.sqlite3_column_name(self._statement, i) + for i in xrange(_lib.sqlite3_column_count(self._statement)): + name = _lib.sqlite3_column_name(self._statement, i) if name is not None: name = name.decode('utf-8').split("[")[0].strip() desc.append((name, None, None, None, None, None, None)) @@ -1316,20 +1337,20 @@ def _convert_params(con, nargs, params): _params = [] for i in range(nargs): - typ = sqlite.sqlite3_value_type(params[i]) - if typ == SQLITE_NULL: + typ = _lib.sqlite3_value_type(params[i]) + if typ == _lib.SQLITE_NULL: val = None - elif typ == SQLITE_INTEGER: - val = sqlite.sqlite3_value_int64(params[i]) - elif typ == SQLITE_FLOAT: - val = sqlite.sqlite3_value_double(params[i]) - elif typ == SQLITE_TEXT: - val = sqlite.sqlite3_value_text(params[i]) + elif typ == _lib.SQLITE_INTEGER: + val = _lib.sqlite3_value_int64(params[i]) + elif typ == _lib.SQLITE_FLOAT: + val = _lib.sqlite3_value_double(params[i]) + elif typ == _lib.SQLITE_TEXT: + val = _lib.sqlite3_value_text(params[i]) val = val.decode('utf-8') - elif typ == SQLITE_BLOB: - blob = sqlite.sqlite3_value_blob(params[i]) - blob_len = sqlite.sqlite3_value_bytes(params[i]) - val = BLOB_TYPE(string_at(blob, blob_len)) + elif typ == _lib.SQLITE_BLOB: + blob = _lib.sqlite3_value_blob(params[i]) + blob_len = _lib.sqlite3_value_bytes(params[i]) + val = _BLOB_TYPE(string_at(blob, blob_len)) else: raise NotImplementedError _params.append(val) @@ -1338,52 +1359,52 @@ def _convert_result(con, val): if val is None: - sqlite.sqlite3_result_null(con) + _lib.sqlite3_result_null(con) elif isinstance(val, (bool, int, long)): - sqlite.sqlite3_result_int64(con, int(val)) + _lib.sqlite3_result_int64(con, int(val)) elif isinstance(val, float): - sqlite.sqlite3_result_double(con, val) + _lib.sqlite3_result_double(con, val) elif isinstance(val, unicode): val = val.encode('utf-8') - sqlite.sqlite3_result_text(con, val, len(val), SQLITE_TRANSIENT) + _lib.sqlite3_result_text(con, val, len(val), _lib.SQLITE_TRANSIENT) elif isinstance(val, str): - sqlite.sqlite3_result_text(con, val, len(val), SQLITE_TRANSIENT) + _lib.sqlite3_result_text(con, val, len(val), _lib.SQLITE_TRANSIENT) elif isinstance(val, (buffer, bytes)): - sqlite.sqlite3_result_blob(con, bytes(val), len(val), SQLITE_TRANSIENT) + _lib.sqlite3_result_blob(con, bytes(val), len(val), _lib.SQLITE_TRANSIENT) else: raise NotImplementedError -def function_callback(real_cb, context, nargs, c_params): +def _function_callback(real_cb, context, nargs, c_params): params = _convert_params(context, nargs, c_params) try: val = real_cb(*params) except Exception: msg = b"user-defined function raised exception" - sqlite.sqlite3_result_error(context, msg, len(msg)) + _lib.sqlite3_result_error(context, msg, len(msg)) else: _convert_result(context, val) _FUNC = CFUNCTYPE(None, c_void_p, c_int, POINTER(c_void_p)) _STEP = CFUNCTYPE(None, c_void_p, c_int, POINTER(c_void_p)) _FINAL = CFUNCTYPE(None, c_void_p) -sqlite.sqlite3_create_function.argtypes = [c_void_p, c_char_p, c_int, c_int, c_void_p, _FUNC, _STEP, _FINAL] -sqlite.sqlite3_create_function.restype = c_int +_lib.sqlite3_create_function.argtypes = [c_void_p, c_char_p, c_int, c_int, c_void_p, _FUNC, _STEP, _FINAL] +_lib.sqlite3_create_function.restype = c_int -sqlite.sqlite3_aggregate_context.argtypes = [c_void_p, c_int] -sqlite.sqlite3_aggregate_context.restype = c_void_p +_lib.sqlite3_aggregate_context.argtypes = [c_void_p, c_int] +_lib.sqlite3_aggregate_context.restype = c_void_p _COLLATION = CFUNCTYPE(c_int, c_void_p, c_int, c_void_p, c_int, c_void_p) -sqlite.sqlite3_create_collation.argtypes = [c_void_p, c_char_p, c_int, c_void_p, _COLLATION] -sqlite.sqlite3_create_collation.restype = c_int +_lib.sqlite3_create_collation.argtypes = [c_void_p, c_char_p, c_int, c_void_p, _COLLATION] +_lib.sqlite3_create_collation.restype = c_int _PROGRESS = CFUNCTYPE(c_int, c_void_p) -sqlite.sqlite3_progress_handler.argtypes = [c_void_p, c_int, _PROGRESS, c_void_p] -sqlite.sqlite3_progress_handler.restype = c_int +_lib.sqlite3_progress_handler.argtypes = [c_void_p, c_int, _PROGRESS, c_void_p] +_lib.sqlite3_progress_handler.restype = c_int _AUTHORIZER = CFUNCTYPE(c_int, c_void_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p) -sqlite.sqlite3_set_authorizer.argtypes = [c_void_p, _AUTHORIZER, c_void_p] -sqlite.sqlite3_set_authorizer.restype = c_int +_lib.sqlite3_set_authorizer.argtypes = [c_void_p, _AUTHORIZER, c_void_p] +_lib.sqlite3_set_authorizer.restype = c_int converters = {} adapters = {} diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py b/pypy/module/_cffi_backend/test/_backend_test_c.py --- a/pypy/module/_cffi_backend/test/_backend_test_c.py +++ b/pypy/module/_cffi_backend/test/_backend_test_c.py @@ -2644,6 +2644,17 @@ c[1:3] = d assert list(c) == [0, 40, 50, 30, 0] +def test_FILE_forbidden(): + BFILE = new_struct_type("_IO_FILE") + BFILEP = new_pointer_type(BFILE) + BFunc = new_function_type((BFILEP,), BFILEP, False) + func = cast(BFunc, 0) + with open(__file__, "rb") as f: + e = py.test.raises(TypeError, func, f) + if '__pypy__' not in sys.builtin_module_names: + assert ('note that you cannot pass Python files directly ' + 'any more since CFFI 0.6') in str(e.value) + def test_version(): # this test is here mostly for PyPy assert __version__ == "0.6" _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit