diff options
author | Gerhard Häring <gh@ghaering.de> | 2006-07-02 17:48:30 +0000 |
---|---|---|
committer | Gerhard Häring <gh@ghaering.de> | 2006-07-02 17:48:30 +0000 |
commit | 762fbd34858f7df608e6da8079bf648bc7d3d8cc (patch) | |
tree | e13a3f77d934422ff11bf4229032cff87b9a4b60 | |
parent | 6ffe499397acfe916202e3e46adfa868e6a307b9 (diff) | |
download | cpython-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.py | 22 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Modules/_sqlite/cursor.c | 5 | ||||
-rw-r--r-- | Modules/_sqlite/module.h | 2 |
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() @@ -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; |