[issue22382] sqlite3 connection built from apsw connection should raise IntegrityError, not DatabaseError

2014-09-18 Thread william tonkin

Changes by william tonkin :


--
nosy: +ghaering

___
Python tracker 
<http://bugs.python.org/issue22382>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue22382] sqlite3 connection built from apsw connection should raise IntegrityError, not DatabaseError

2014-09-11 Thread william tonkin

william tonkin added the comment:

The following worked for me:


--- util.c  2014-09-11 15:15:11.480266548 -0400
+++ util.c.fixed2014-09-11 15:17:19.214878592 -0400
@@ -54,7 +54,7 @@
 (void)sqlite3_reset(st);
 }

-errorcode = sqlite3_errcode(db);
+errorcode = 0xffu & sqlite3_errcode(db);

 switch (errorcode)
 {

--

___
Python tracker 
<http://bugs.python.org/issue22382>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue22382] sqlite3 connection built from apsw connection should raise IntegrityError, not DatabaseError

2014-09-11 Thread william tonkin

william tonkin added the comment:

sqlite3 allows a connection to be built from an apsw.Connection().  Using an 
apsw.Connection() to build an sqlite3.connect() implies that the underlying 
sqlite database engine will have extended error codes turned on (the default if 
for them to be turned off.)

The problem is that Modules/_sqlite/util.c:_pysqlite_seterror() is not extended 
error code aware.  In particular, the extended error code 
SQLITE_CONSTRAINT_CHECK will not be recognized as a kind of constraint 
violation and will fall into the "default:" arm of the case statement.  This 
will result in raising the exception DatabaseError when the correct exception 
to raise is IntegrityError.

One simple solution would be to convert the extended error code back to the 
base error code, that is:
 "errorcode = 0xffu % sqlite3_errcode(db);"

--
status: closed -> open
type:  -> behavior

___
Python tracker 
<http://bugs.python.org/issue22382>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue22382] sqlite3 connection built from apsw connection should raise IntegrityError, not DatabaseError

2014-09-10 Thread william tonkin

New submission from william tonkin:

python
Python 2.7.6 (default, Dec 23 2013, 13:16:30)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>


-
test script
-
import apsw
import sqlite3

print 'sqlite3.version:', sqlite3.version
print 'sqlite3.sqlite_version:', sqlite3.sqlite_version
print 'apsw.apswversion:', apsw.apswversion()

sqlite3_not_from_apsw = sqlite3.connect(':memory:')
apsw_conn = apsw.Connection(':memory:')
sqlite3_from_apsw = sqlite3.connect(apsw_conn)
cursor_not_from_apsw = sqlite3_not_from_apsw.cursor()
cursor_from_apsw = sqlite3_from_apsw.cursor()

sqlite3_not_from_apsw.execute(
"create table foo ( a timestamp check(datetime(a) is not null))")

try:
sqlite3_not_from_apsw.execute(
"insert into foo values (?)", ('',))
except sqlite3.DatabaseError as foo:
print 'not from apsw, repr(foo)', repr(foo)

sqlite3_from_apsw.execute(
"create table foo ( a timestamp check(datetime(a) is not null))")

try:
sqlite3_from_apsw.execute(
"insert into foo values (?)", ('',))
except sqlite3.DatabaseError as foo:
print 'from apsw, repr(foo)', repr(foo)

-
output:

sqlite3.version: 2.6.0
sqlite3.sqlite_version: 3.8.2
apsw.apswversion: 3.8.2-r1
not from apsw, repr(foo) IntegrityError('CHECK constraint failed: foo',)
from apsw, repr(foo) DatabaseError('CHECK constraint failed: foo',)


Note that when the sqlite3 connection is built from an apsw connection the 
insert statement that violates the check constraint raises 'DatabaseError' and 
not 'IntegrityError'.

--
messages: 226704
nosy: wtonkin
priority: normal
severity: normal
status: open
title: sqlite3 connection built from apsw connection should raise 
IntegrityError, not DatabaseError
versions: Python 2.7

___
Python tracker 
<http://bugs.python.org/issue22382>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com