Quoth Lynton Grice <lynton.gr...@logosworld.com>, on 2011-04-03 12:37:06 +0200:
>   There are NULL characters

You mean NUL characters.

> in the first couple header fields [...]
>
> I am no C expert but I have the following table defined:
> 
> char *queueTable = "CREATE TABLE [test] ( "
>                          "[idx] INTEGER NOT NULL PRIMARY KEY 
> AUTOINCREMENT, "
>                          "[raw_stream_in] BLOB, "
>                          "[num_bytes_in] INTEGER );";

I wouldn't recommend the use of [] for quoting identifiers (I'd prefer
double-quotes for more ANSI-esque SQL), but that looks like it should
work fine.

> sqlite3_bind_blob( stmt, idx, msg.raw_stream_in, msg.num_bytes_in, 
> SQLITE_STATIC );

Be careful with SQLITE_STATIC.  AIUI, the lifetime of the buffer must
then be a superset of the lifetime of the statement.

> For testing purposes I simply read the 15MB file from file into a char *.
> 
>    char *buffer = NULL;
>    FILE *fp;
>    if((fp = fopen("./in.txt", "r"))==NULL){
>      exit(1);
>    }

Not "rb" for binary mode?

>    fseek(fp, 0, SEEK_END);
>    long int fsize = ftell(fp);
>    printf("File size: %i\n", fsize);
>    rewind(fp);
>    buffer = malloc(fsize * sizeof(char));
>    fread(buffer, 1, fsize, fp);
>    buffer[fsize] = '\0';

You're overwriting beyond the end of the array.  You don't need an
extra NUL here.

>    fclose(fp);
> 
> I then point the MSG "raw_stream_in" to the buffer:
> 
> msg_in.raw_stream_in = buffer;

And you set msg.num_bytes_in where?

> I then use the following statement as mentioned before to insert the 
> stream into the BLOB field:
> 
> sqlite3_bind_blob( stmt, idx, msg.raw_stream_in, msg.num_bytes_in, 
> SQLITE_STATIC );

That looks fine by itself, subject to the caveats of SQLITE_STATIC
above and whether stmt and idx are valid.

> _So essentially all characters are copied until the first NULL 
> char._

No.  I strongly suspect that's a red herring.

In summary:

  - Make sure msg.num_bytes_in is actually set to what you want.
  - Make sure you're handling the lifetime of the buffer correctly;
    for testing purposes I'd use SQLITE_TRANSIENT rather than
    SQLITE_STATIC, since that evades that issue at the cost of a
    memcpy.
  - Don't write past the end of the array.

   ---> Drake Wilson
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to