note 112117 deleted from function.sqlite-udf-encode-binary by cmb

From: Date: Mon, 02 Nov 2020 15:04:04 +0000
Subject: note 112117 deleted from function.sqlite-udf-encode-binary by cmb
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-215762@lists.php.net to get a copy of this message
Note Submitter: B. Keil ---- I wrote a script to transfer my old data from a mysql database, performing some changes to a sqlite3 database. When I realized that that the sqlite interfaces is no longer included in PHP and my PECL didn't get it installed it was too late. However, there is a very easy, though not particularly performant way to get the job done like in the "sqlite_encode_blob" function I present below. Note that this does ONLY encode the data. To actually use it in a query you will have to wrap it like: X'data' See the example below. #!/usr/bin/php <?php function sqlite_encode_blob($data) { $result = ""; for ($i = 0; $i < strlen($data); $i++) { $result .= sprintf("%02X", ord(substr($data, $i, 1))); } return $result; } error_reporting(E_ALL); $original = "62.jpg"; $data = file_get_contents($original); $before = microtime(true); $encodedData = sqlite_encode_blob($data); $after = microtime(true); unset($data); echo "Encoding time needed: ".($after - $before)." seconds.\n"; $sql = <<<QUERY BEGIN; CREATE TABLE test(test BLOB); INSERT INTO test(test) VALUES ( X'$encodedData' ); COMMIT; QUERY; unset($encodedData); file_put_contents("test.sql", $sql); sqlite3 blob_test.db < test.sql ?> The tricky part is to get the data back out of the database - that is not possible with the command line tool as far as I can tell. You will have to use a language with an actual API. The following example is written in C and compiles on a linux box where the sqlite3 API is installed using: gcc -o test test.c pkg-config --cflags --libs sqlite3 Note that this has absolutely no error checking whatsoever. If the slightest thing goes wrong it will likely cause a segmentation fault and likely leave the database corrupted. # FILE test.c START #include <stdlib.h> #include <stdio.h> #include <sqlite3.h> #define DB_FILE "blob_test.db" #define QUERY_STRING "SELECT data FROM test" #define STORAGE_FILE "test.jpg" int main(int argc, char** argv) { sqlite3 *db = NULL; int size = 0; const char *data = NULL; sqlite3_stmt *query = NULL; const char *rest = NULL; FILE *file = NULL; sqlite3_open(DB_FILE, &db); sqlite3_prepare_v2(db, QUERY_STRING, sizeof(QUERY_STRING), &query, &rest); sqlite3_step(query); size = sqlite3_column_bytes(query, 0); data = sqlite3_column_blob(query, 0); file = fopen(STORAGE_FILE, "w"); fwrite(data, 1, size, file); fclose(file); sqlite3_finalize(query); sqlite3_close(db); return 0; } # FILE test.c END

« previous php.notes (#215762) next »