Hi Michael, Well to be honest I am trying to mimic an "SAP IDoc (essentially a raw stream) coming out of SAP. In this case the "SAP IDoc" contains a large image, but 99% of the time it is just "plain text". So I probably forgot the "rb", my mistake....
When I say "point to MSG" I mean I do this: msg_in.raw_stream_in = buffer; I am sending all the code in next message... Thanks Lynton On 03/04/2011 12:53, Black, Michael (IS) wrote: > You apparently don't understand "strings" in C. Or are you actually reading > in binary data? > > #1 Since you said "image" I assume you're reading binaary. So get rid of > buffer[fsize]=0. You don't null terminate binary data and that statement is > 1-beyond the end of the array (which is from 0 to fsize-1). > > #2 You then say you "point the MSG". I suspect you're doing that wrong with > strcpy() or such. So if you would care to show ALL your code (it's just a > few more lines) we can probably help. > > #3 Also, what happens to "buffer"?? Do you free it at some point after the > bind? If so, that > > > > Michael D. Black > Senior Scientist > NG Information Systems > Advanced Analytics Directorate > > > > ________________________________________ > From: sqlite-users-boun...@sqlite.org [sqlite-users-boun...@sqlite.org] on > behalf of Lynton Grice [lynton.gr...@logosworld.com] > Sent: Sunday, April 03, 2011 5:37 AM > To: sqlite-users@sqlite.org > Subject: EXT :[sqlite] sqlite3_bind_blob CHOPS off at first NULL char > > Hi there, > > I have a 15MB file I need to read and store in an SQLite database. > > There are NULL characters in the first couple header fields and the > rest is pure BINARY data. You can imagine the file looking like: > > ppphNULNUL3STR.....and then all the BINARY data...... > > 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 );"; > > And then later in the code I use the "sqlite3_bind_blob" to send the > stream to SQLIte > > sqlite3_bind_blob( stmt, idx, msg.raw_stream_in, msg.num_bytes_in, > SQLITE_STATIC ); > > 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); > } > > 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'; > fclose(fp); > > I then point the MSG "raw_stream_in" to the buffer: > > msg_in.raw_stream_in = buffer; > > NOTE: Msg is a "message" as defined below: > > typedef struct messageStruct { > char *raw_stream_in; > int num_bytes_in; > }message; > > 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 ); > > However, _only the first 4 bytes are copied_ (the "ppph" in the attached > image). _So essentially all characters are copied until the first NULL > char._ > > How can I store EVERYTHING, including NULLs? Must I use a BYTE array or > something? Does anyone have any sample code? > > I would be hugely appreciative for any help in this regard, thanks > > Lynton > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users