Perhaps because you are committing the transaction?

> -----Original Message-----
> From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org]
> On Behalf Of Yuri
> Sent: Sunday, 5 March, 2017 02:27
> To: SQLite mailing list
> Subject: Re: [sqlite] Can sqlite3_blob_write be done through SQL?
> 
> On 03/04/2017 23:08, Clemens Ladisch wrote:
> > I think you can work around these problems by moving the blob value into
> > a separate table.
> 
> 
> I thought so too. However, even updates to other tables invalidate the
> blob handle. Please see the example below.
> 
> Variable breakMe breaks the second sqlite3_blob_write call, even though
> the added update statement is for the other table.
> 
> 
> Yuri
> 
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include "sqlite3.h"
> 
> int breakMe = 1;
> 
> char *exec_errmsg;
> 
> void execSql(sqlite3 *db, const char *sql) {
>    int rc;
>    if (SQLITE_OK != (rc = sqlite3_exec(db, sql, NULL, NULL,
> &exec_errmsg))) {
>      fprintf(stderr, "Error while executing sql=%s, error=%d\n", sql, rc);
>      exit(1);
>    }
> }
> 
> int main(int argc, char **argv) {
>    sqlite3 *db = NULL;
>    int rc;
> 
>    rc = sqlite3_open(argv[1], &db);
>    if (SQLITE_OK != rc) {
>      fprintf(stderr, "Can't open database %s (%i): %s\n", argv[1], rc,
> sqlite3_errmsg(db));
>      exit(1);
>    }
> 
>    execSql(db, "CREATE TABLE fragmented_data ( friend_id INTEGER NOT
> NULL, frags_id  INTEGER NOT NULL, message   BLOB, PRIMARY KEY (
> friend_id, frags_id));");
>    execSql(db, "CREATE TABLE fragmented_meta ( friend_id INTEGER NOT
> NULL, frags_id        INTEGER NOT NULL, timestamp_first INTEGER NOT
> NULL, timestamp_last  INTEGER NOT NULL, frags_done      INTEGER NOT
> NULL, frags_num       INTEGER NOT NULL, message         BLOB, PRIMARY
> KEY ( friend_id, frags_id));");
> 
>    execSql(db, "INSERT INTO fragmented_data (friend_id, frags_id,
> message) SELECT 0, 1488703606591, zeroblob(2070) WHERE NOT EXISTS
> (SELECT 1 FROM fragmented_meta WHERE friend_id=0 AND
> frags_id=1488703606591);");
>    execSql(db, "INSERT INTO fragmented_meta (friend_id, frags_id,
> timestamp_first, timestamp_last, frags_done, frags_num) SELECT 0,
> 1488703606591, 1488703647556, 1488703647556, 0, 2 WHERE NOT EXISTS
> (SELECT 1 FROM fragmented_meta WHERE friend_id=0 AND
> frags_id=1488703606591);");
> 
>    sqlite3_blob *blob1;
>    rc = sqlite3_blob_open(db, "main", "fragmented_data", "message", 1,
> 1, &blob1);
>    if (SQLITE_OK != rc) {
>      fprintf(stderr, "Couldn't get blob handle (%i): %s\n", rc,
> sqlite3_errmsg(db));
>      exit(1);
>    }
>    if (SQLITE_OK != (rc = sqlite3_blob_write(blob1, "1", 1, 0x10))) {
>      fprintf(stderr, "Error writing to blob handle #1. rc=%d\n", rc);
>      exit(1);
>    }
> 
>    if (breakMe)
>      execSql(db, "UPDATE fragmented_meta SET
> timestamp_last=max(timestamp_last,1488703647556), frags_done =
> frags_done+1 WHERE friend_id=0 AND frags_id=1488703606591;");
> 
>    if (SQLITE_OK != (rc = sqlite3_blob_write(blob1, "2", 1, 0x250))) {
>      fprintf(stderr, "Error writing to blob handle #2. rc=%d\n", rc);
>      exit(1);
>    }
> 
>    sqlite3_blob_close(blob1);
>    printf("Successfully wrote to blob\n");
>    sqlite3_close(db);
>    return 0;
> }
> 
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to