summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerhard Häring <gh@ghaering.de>2006-07-02 17:48:30 +0000
committerGerhard Häring <gh@ghaering.de>2006-07-02 17:48:30 +0000
commit762fbd34858f7df608e6da8079bf648bc7d3d8cc (patch)
treee13a3f77d934422ff11bf4229032cff87b9a4b60
parent6ffe499397acfe916202e3e46adfa868e6a307b9 (diff)
downloadcpython-git-762fbd34858f7df608e6da8079bf648bc7d3d8cc.tar.gz
The sqlite3 module did cut off data from the SQLite database at the first null
character before sending it to a custom converter. This has been fixed now.
-rw-r--r--Lib/sqlite3/test/types.py22
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/_sqlite/cursor.c5
-rw-r--r--Modules/_sqlite/module.h2
4 files changed, 28 insertions, 5 deletions
diff --git a/Lib/sqlite3/test/types.py b/Lib/sqlite3/test/types.py
index c238ef9a6b..8da5722d55 100644
--- a/Lib/sqlite3/test/types.py
+++ b/Lib/sqlite3/test/types.py
@@ -21,7 +21,7 @@
# misrepresented as being the original software.
# 3. This notice may not be removed or altered from any source distribution.
-import datetime
+import bz2, datetime
import unittest
import sqlite3 as sqlite
@@ -273,6 +273,23 @@ class ObjectAdaptationTests(unittest.TestCase):
val = self.cur.fetchone()[0]
self.failUnlessEqual(type(val), float)
+class BinaryConverterTests(unittest.TestCase):
+ def convert(s):
+ return bz2.decompress(s)
+ convert = staticmethod(convert)
+
+ def setUp(self):
+ self.con = sqlite.connect(":memory:", detect_types=sqlite.PARSE_COLNAMES)
+ sqlite.register_converter("bin", BinaryConverterTests.convert)
+
+ def tearDown(self):
+ self.con.close()
+
+ def CheckBinaryInputForConverter(self):
+ testdata = "abcdefg" * 10
+ result = self.con.execute('select ? as "x [bin]"', (buffer(bz2.compress(testdata)),)).fetchone()[0]
+ self.failUnlessEqual(testdata, result)
+
class DateTimeTests(unittest.TestCase):
def setUp(self):
self.con = sqlite.connect(":memory:", detect_types=sqlite.PARSE_DECLTYPES)
@@ -322,8 +339,9 @@ def suite():
decltypes_type_suite = unittest.makeSuite(DeclTypesTests, "Check")
colnames_type_suite = unittest.makeSuite(ColNamesTests, "Check")
adaptation_suite = unittest.makeSuite(ObjectAdaptationTests, "Check")
+ bin_suite = unittest.makeSuite(BinaryConverterTests, "Check")
date_suite = unittest.makeSuite(DateTimeTests, "Check")
- return unittest.TestSuite((sqlite_type_suite, decltypes_type_suite, colnames_type_suite, adaptation_suite, date_suite))
+ return unittest.TestSuite((sqlite_type_suite, decltypes_type_suite, colnames_type_suite, adaptation_suite, bin_suite, date_suite))
def test():
runner = unittest.TextTestRunner()
diff --git a/Misc/NEWS b/Misc/NEWS
index 039342389f..641b7a77d4 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -45,6 +45,10 @@ Library
- A bug was fixed in logging.config.fileConfig() which caused a crash on
shutdown when fileConfig() was called multiple times.
+- The sqlite3 module did cut off data from the SQLite database at the first
+ null character before sending it to a custom converter. This has been fixed
+ now.
+
Extension Modules
-----------------
diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index 98f5e0d825..94aea9bd65 100644
--- a/Modules/_sqlite/cursor.c
+++ b/Modules/_sqlite/cursor.c
@@ -321,12 +321,13 @@ PyObject* _fetch_one_row(Cursor* self)
}
if (converter != Py_None) {
- val_str = (const char*)sqlite3_column_text(self->statement->st, i);
+ nbytes = sqlite3_column_bytes(self->statement->st, i);
+ val_str = (const char*)sqlite3_column_blob(self->statement->st, i);
if (!val_str) {
Py_INCREF(Py_None);
converted = Py_None;
} else {
- item = PyString_FromString(val_str);
+ item = PyString_FromStringAndSize(val_str, nbytes);
if (!item) {
return NULL;
}
diff --git a/Modules/_sqlite/module.h b/Modules/_sqlite/module.h
index 3fdac615b3..e514bd1512 100644
--- a/Modules/_sqlite/module.h
+++ b/Modules/_sqlite/module.h
@@ -25,7 +25,7 @@
#define PYSQLITE_MODULE_H
#include "Python.h"
-#define PYSQLITE_VERSION "2.3.1"
+#define PYSQLITE_VERSION "2.3.2"
extern PyObject* Error;
extern PyObject* Warning;