Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3k
Changeset: r58823:bf5875289270
Date: 2012-11-11 01:12 +0100
http://bitbucket.org/pypy/pypy/changeset/bf5875289270/
Log: Fix most test_sqlite failures.
diff --git a/lib-python/3.2/ctypes/__init__.py
b/lib-python/3.2/ctypes/__init__.py
--- a/lib-python/3.2/ctypes/__init__.py
+++ b/lib-python/3.2/ctypes/__init__.py
@@ -489,9 +489,12 @@
_flags_ = _FUNCFLAG_CDECL | _FUNCFLAG_PYTHONAPI
return CFunctionType
-_cast = PYFUNCTYPE(py_object, c_void_p, py_object, py_object)(_cast_addr)
def cast(obj, typ):
- return _cast(obj, obj, typ)
+ try:
+ c_void_p.from_param(obj)
+ except TypeError as e:
+ raise ArgumentError(str(e))
+ return _cast_addr(obj, obj, typ)
_string_at = PYFUNCTYPE(py_object, c_void_p, c_int)(_string_at_addr)
def string_at(ptr, size=-1):
diff --git a/lib-python/3.2/sqlite3/test/dbapi.py
b/lib-python/3.2/sqlite3/test/dbapi.py
--- a/lib-python/3.2/sqlite3/test/dbapi.py
+++ b/lib-python/3.2/sqlite3/test/dbapi.py
@@ -357,6 +357,9 @@
def __init__(self):
self.value = 5
+ def __iter__(self):
+ return self
+
def __next__(self):
if self.value == 10:
raise StopIteration
diff --git a/lib_pypy/_ctypes/function.py b/lib_pypy/_ctypes/function.py
--- a/lib_pypy/_ctypes/function.py
+++ b/lib_pypy/_ctypes/function.py
@@ -446,10 +446,6 @@
@classmethod
def _conv_param(cls, argtype, arg):
- if isinstance(argtype, _CDataMeta):
- cobj, ffiparam = argtype.get_ffi_param(arg)
- return cobj, ffiparam, argtype
-
if argtype is not None:
arg = argtype.from_param(arg)
if hasattr(arg, '_as_parameter_'):
@@ -559,6 +555,7 @@
try:
keepalive, newarg, newargtype = self._conv_param(argtype,
args[i])
except (UnicodeError, TypeError, ValueError) as e:
+ raise
raise ArgumentError(str(e))
keepalives.append(keepalive)
newargs.append(newarg)
diff --git a/lib_pypy/_ctypes/pointer.py b/lib_pypy/_ctypes/pointer.py
--- a/lib_pypy/_ctypes/pointer.py
+++ b/lib_pypy/_ctypes/pointer.py
@@ -128,7 +128,7 @@
if not (isinstance(tp, _CDataMeta) and tp._is_pointer_like()):
raise TypeError("cast() argument 2 must be a pointer type, not %s"
% (tp,))
- if isinstance(obj, (int, long)):
+ if isinstance(obj, int):
result = tp()
result._buffer[0] = obj
return result
diff --git a/lib_pypy/_ctypes/primitive.py b/lib_pypy/_ctypes/primitive.py
--- a/lib_pypy/_ctypes/primitive.py
+++ b/lib_pypy/_ctypes/primitive.py
@@ -90,7 +90,7 @@
return value
if isinstance(value, (_Pointer, CFuncPtr)):
return cls.from_address(value._buffer.buffer)
- if isinstance(value, (int, long)):
+ if isinstance(value, int):
return cls(value)
FROM_PARAM_BY_TYPE = {
@@ -173,7 +173,7 @@
return addr
def _setvalue(self, value):
- if isinstance(value, str):
+ if isinstance(value, bytes):
array = _rawffi.Array('c')(len(value)+1, value)
self._objects = CArgObject(value, array)
value = array.buffer
diff --git a/lib_pypy/_sqlite3.py b/lib_pypy/_sqlite3.py
--- a/lib_pypy/_sqlite3.py
+++ b/lib_pypy/_sqlite3.py
@@ -130,6 +130,13 @@
# SQLite C API
+class TEXT:
+ @classmethod
+ def from_param(cls, value):
+ if isinstance(value, bytes):
+ return value
+ return value.encode('utf-8')
+
sqlite.sqlite3_value_int.argtypes = [c_void_p]
sqlite.sqlite3_value_int.restype = c_int
@@ -167,7 +174,7 @@
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.argtypes = [c_void_p, c_int, TEXT, 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
@@ -206,11 +213,11 @@
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.argtypes = [TEXT, 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.argtypes = [c_void_p, TEXT, 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
@@ -227,9 +234,9 @@
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.argtypes = [c_void_p, TEXT, 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.argtypes = [c_void_p, TEXT, c_int, c_void_p]
sqlite.sqlite3_result_text.restype = None
HAS_LOAD_EXTENSION = hasattr(sqlite, "sqlite3_enable_load_extension")
@@ -242,7 +249,7 @@
##########################################
# SQLite version information
-sqlite_version = sqlite.sqlite3_libversion()
+sqlite_version = sqlite.sqlite3_libversion().decode('utf-8')
class Error(Exception):
pass
@@ -346,6 +353,7 @@
if error_code is None:
error_code = sqlite.sqlite3_errcode(self.db)
error_message = sqlite.sqlite3_errmsg(self.db)
+ error_message = error_message.decode('utf-8')
if error_code == SQLITE_OK:
raise ValueError("error signalled but got SQLITE_OK")
@@ -761,9 +769,6 @@
return CursorLock(self)
def execute(self, sql, params=None):
- if type(sql) is str:
- sql = sql.encode("utf-8")
-
with self._check_and_lock():
self._description = None
self.reset = False
@@ -801,9 +806,6 @@
return self
def executemany(self, sql, many_params):
- if type(sql) is str:
- sql = sql.encode("utf-8")
-
with self._check_and_lock():
self._description = None
self.reset = False
@@ -953,7 +955,7 @@
self.statement = c_void_p()
next_char = c_char_p()
- sql_char = c_char_p(sql)
+ sql_char = sql
ret = sqlite.sqlite3_prepare_v2(self.con.db, sql_char, -1,
byref(self.statement), byref(next_char))
if ret == SQLITE_OK and self.statement.value is None:
# an empty statement, we work around that, as it's the least
trouble
@@ -963,9 +965,10 @@
if ret != SQLITE_OK:
raise self.con._get_exception(ret)
self.con._remember_statement(self)
- if _check_remaining_sql(next_char.value):
+ next_char = next_char.value.decode('utf-8')
+ if _check_remaining_sql(next_char):
raise Warning("One and only one statement required: %r" %
- (next_char.value,))
+ (next_char,))
# sql_char should remain alive until here
self._build_row_cast_map()
@@ -981,6 +984,7 @@
if self.con.detect_types & PARSE_COLNAMES:
colname = sqlite.sqlite3_column_name(self.statement, i)
if colname is not None:
+ colname = colname.decode('utf-8')
type_start = -1
key = None
for pos in range(len(colname)):
@@ -994,23 +998,13 @@
decltype = sqlite.sqlite3_column_decltype(self.statement, i)
if decltype is not None:
decltype = decltype.split()[0] # if multiple words,
use first, eg. "INTEGER NOT NULL" => "INTEGER"
+ decltype = decltype.decode('utf-8')
if '(' in decltype:
decltype = decltype[:decltype.index('(')]
converter = converters.get(decltype.upper(), None)
self.row_cast_map.append(converter)
- def _check_decodable(self, param):
- if self.con.text_factory in (str, OptimizedUnicode,
unicode_text_factory):
- for c in param:
- if ord(c) & 0x80 != 0:
- raise self.con.ProgrammingError(
- "You must not use 8-bit bytestrings unless "
- "you use a text_factory that can interpret "
- "8-bit bytestrings (like text_factory = str). "
- "It is highly recommended that you instead "
- "just switch your application to Unicode strings.")
-
def set_param(self, idx, param):
cvt = converters.get(type(param))
if cvt is not None:
@@ -1028,13 +1022,11 @@
elif type(param) is float:
sqlite.sqlite3_bind_double(self.statement, idx, param)
elif isinstance(param, str):
- self._check_decodable(param)
+ param = param.encode('utf-8')
sqlite.sqlite3_bind_text(self.statement, idx, param, len(param),
SQLITE_TRANSIENT)
- elif isinstance(param, str):
- param = param.encode("utf-8")
- sqlite.sqlite3_bind_text(self.statement, idx, param, len(param),
SQLITE_TRANSIENT)
- elif type(param) is buffer:
- sqlite.sqlite3_bind_blob(self.statement, idx, str(param),
len(param), SQLITE_TRANSIENT)
+ elif type(param) in (bytes, memoryview):
+ param = bytes(param)
+ sqlite.sqlite3_bind_blob(self.statement, idx, param, len(param),
SQLITE_TRANSIENT)
else:
raise InterfaceError("parameter type %s is not supported" %
type(param))
@@ -1067,11 +1059,11 @@
param_name =
sqlite.sqlite3_bind_parameter_name(self.statement, idx)
if param_name is None:
raise ProgrammingError("need named parameters")
- param_name = param_name[1:]
+ param_name = param_name[1:].decode('utf-8')
try:
param = params[param_name]
except KeyError:
- raise ProgrammingError("missing parameter '%s'" %param)
+ raise ProgrammingError("missing parameter %r" % param_name)
self.set_param(idx, param)
def next(self, cursor):
@@ -1110,7 +1102,7 @@
elif typ == SQLITE_BLOB:
blob_len = sqlite.sqlite3_column_bytes(self.statement, i)
blob = sqlite.sqlite3_column_blob(self.statement, i)
- val = buffer(string_at(blob, blob_len))
+ val = bytes(string_at(blob, blob_len))
elif typ == SQLITE_NULL:
val = None
elif typ == SQLITE_TEXT:
@@ -1157,7 +1149,8 @@
return None
desc = []
for i in range(sqlite.sqlite3_column_count(self.statement)):
- name = sqlite.sqlite3_column_name(self.statement,
i).split("[")[0].strip()
+ col_name = sqlite.sqlite3_column_name(self.statement, i)
+ name = col_name.decode('utf-8').split("[")[0].strip()
desc.append((name, None, None, None, None, None, None))
return desc
@@ -1249,7 +1242,7 @@
elif typ == SQLITE_BLOB:
blob_len = sqlite.sqlite3_value_bytes(params[i])
blob = sqlite.sqlite3_value_blob(params[i])
- val = buffer(string_at(blob, blob_len))
+ val = bytes(string_at(blob, blob_len))
elif typ == SQLITE_NULL:
val = None
elif typ == SQLITE_TEXT:
@@ -1267,10 +1260,8 @@
elif isinstance(val, (bool, int)):
sqlite.sqlite3_result_int64(con, int(val))
elif isinstance(val, str):
- # XXX ignoring unicode issue
sqlite.sqlite3_result_text(con, val, len(val), SQLITE_TRANSIENT)
- elif isinstance(val, str):
- val = val.encode('utf-8')
+ elif isinstance(val, bytes):
sqlite.sqlite3_result_text(con, val, len(val), SQLITE_TRANSIENT)
elif isinstance(val, float):
sqlite.sqlite3_result_double(con, val)
@@ -1292,14 +1283,14 @@
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.argtypes = [c_void_p, TEXT, c_int, c_int,
c_void_p, FUNC, STEP, FINAL]
sqlite.sqlite3_create_function.restype = c_int
sqlite.sqlite3_aggregate_context.argtypes = [c_void_p, c_int]
sqlite.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.argtypes = [c_void_p, TEXT, c_int, c_void_p,
COLLATION]
sqlite.sqlite3_create_collation.restype = c_int
PROGRESS = CFUNCTYPE(c_int, c_void_p)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit