Kevin M. wrote:
> I have a C/C++ application in which I want to store data from a struct into a 
> table (using SQLite 3.6.23) and later retrieve data from the table and store 
> it back in the struct.  But, I need a general interface for this as there are 
> many types of structs used.  So, what I have is a function that accepts a 
> pointer to the struct (ptr), the struct size, and a sqlite3_stmt* variable 
> for the current row.  I then iterate through each column of the row and store 
> the value retrieved at ptr's address.  Then I increment ptr based on the size 
> of the column.  Thus, as long as I store and retrieve columns in the same 
> order I should be storing the right values in the right variables for a 
> particular struct instance.
>
> However, this method breaks down if a store a 16-bit integer value like "99" 
> and SQLite stores it internally as an 8-bit value (to save space) and 
> subsequently retrieves it and gives me a value of 1 for 
> sqlite3_column_bytes().  This causes alignment issues with the variables in 
> the struct.  So, is there a way I can tell SQLite to preserve the data size 
> in a particular column?  E.g.:
>
> CREATE TABLE test ( val1 INTEGER, val2 INT2, val3 INT1 ... );
>
> Here val1 is always 4-bytes, val2 is always 2 bytes, and val3 is always 1 
> byte.
>
> I'd prefer a way to do this without having to cast every last column in a 
> SELECT query to the right size.
>   
The layout of a column is an implementation detail and not part of 
SQLite's type system.  I wouldn't recommend depending on it.

You might want to consider writing a user-defined function to convert a 
column row into a BLOB that matches your struct layout.  Then you can 
just write

SELECT PACK('ihb', val1, val2, val3) FROM test

and memcpy the resulting BLOB into your struct.
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to