Hi Paolo,

for a very stupid reason I tried to store the output of bzip2 into a BLOB of
sqlite3. I have created this patch, it will convert a BLOB to a ByteArray to
have multiple '\0' bytes in it. But it is doing the same for binding a
ByteArray to a prepared statement.

Right now I am not sure if the failure is happening on the insert or on the
select... so maybe we do not need the special handling for binding. I will
follow up to this mail.



>From 03645f94573e7bb808c719bfb8fd3e57655a05c5 Mon Sep 17 00:00:00 2001
From: Holger Hans Peter Freyther <ze...@selfish.org>
Date: Thu, 28 Apr 2011 22:37:15 +0200
Subject: [PATCH] dbd-sqlite3: Fix the conversion of blobs

Convert a BLOB to a ByteArray. This allows a BLOB to contain
a NULL byte that can be converted back to a ByteArray.
---
 packages/dbd-sqlite/ChangeLog |    4 ++++
 packages/dbd-sqlite/sqlite3.c |   10 ++++++----
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/packages/dbd-sqlite/ChangeLog b/packages/dbd-sqlite/ChangeLog
index 2608bb5..adb7c9d 100644
--- a/packages/dbd-sqlite/ChangeLog
+++ b/packages/dbd-sqlite/ChangeLog
@@ -1,3 +1,7 @@
+2011-04-28  Holger Hans Peter Freyther  <ze...@selfish.org>
+
+	* sqlite3.c: Convert ByteArray to BLOB, BLOB to ByteArray.
+
 2011-04-09  Paolo Bonzini  <bonz...@gnu.org>
 
 	* Statement.st: Move #resetAndClear inside an #ensure: block.
diff --git a/packages/dbd-sqlite/sqlite3.c b/packages/dbd-sqlite/sqlite3.c
index 1810b62..631734d 100644
--- a/packages/dbd-sqlite/sqlite3.c
+++ b/packages/dbd-sqlite/sqlite3.c
@@ -188,7 +188,8 @@ gst_sqlite3_exec (OOP self)
 	      tmpOOP = vmProxy->stringToOOP (sqlite3_column_text (stmt, i));
 	      break;
 	    case SQLITE_BLOB:
-	      tmpOOP = vmProxy->stringToOOP (sqlite3_column_text (stmt, i));
+	      tmpOOP = vmProxy->byteArrayToOOP (sqlite3_column_text (stmt, i),
+						sqlite3_column_bytes(stmt, i));
 	      break;
 	    case SQLITE_NULL:
 	      tmpOOP = vmProxy->nilOOP;
@@ -241,11 +242,12 @@ gst_sqlite3_bind (OOP self, OOP key, OOP value)
 				   (sqlite_int64) vmProxy->OOPToInt (value));
 #endif
         
-    if (vmProxy->objectIsKindOf (value, vmProxy->stringClass)
-	|| vmProxy->objectIsKindOf (value, vmProxy->byteArrayClass))
+    if (vmProxy->objectIsKindOf (value, vmProxy->byteArrayClass))
+        return sqlite3_bind_blob (stmt, index, vmProxy->OOPIndexedBase (value),
+				  vmProxy->basicSize (value), SQLITE_TRANSIENT);
+    if (vmProxy->objectIsKindOf (value, vmProxy->stringClass))
         return sqlite3_bind_text (stmt, index, vmProxy->OOPIndexedBase (value),
 				  vmProxy->basicSize (value), SQLITE_TRANSIENT);
-        
     if (vmProxy->objectIsKindOf (value, vmProxy->floatDClass))
         return sqlite3_bind_double (stmt, index, vmProxy->OOPToFloat (value));
         
-- 
1.7.4.1

_______________________________________________
help-smalltalk mailing list
help-smalltalk@gnu.org
https://lists.gnu.org/mailman/listinfo/help-smalltalk

Reply via email to