> The implementation for the SQLite ODBC driver does not use incremental
> BLOB I/O, it reads a BLOB into memory for each row
> fetched. Not much use if the size of each image in the SQLite database
> is 3gb and you only have 2gb memory. I'm looking for a solution that
> will work on BLOBs larger than available memory.

Just keep in mind that if the user puts blob column into a query
(which IIRC is required by SQLGetData) then SQLite reads full blob
value into memory before you can do anything with that. So you're not
with a good luck here anyway.


Pavel

On Sun, Dec 27, 2009 at 6:46 PM, Mark Hessling <m...@rexx.org> wrote:
> I have supported a generic Rexx interface to several SQL databases over
> the last 10 years, including SQLite, Oracle,
> ODBC, etc.
> The Rexx API is loosely based on ODBC function calls. I'm now trying to
> support BLOBs in SQLite.
> I've read the API for incremental I/O for BLOBs, and also checked the
> source for the SQLite ODBC driver.
> I'm looking for a way to support the incremental reading of a BLOB from
> a column while processing a result set.
>
> Here is a scenario:
> Table: PERSON: id int, name text, photoid int
> Table: IMAGEDATA: photoid int, image blob
>
> Query: "select name, image from person as a, imagedata as b where
> a.photoid = b.photoid where name = 'Smith'
>
> Rexx Pseduo Code for processing a query and writing the BLOB returned
> from each row to a file:
>
> Call SQLPrepare query      -- prepare query
> Call SQLOpen               -- open cursor
> Do Forever                 -- loop forever
>   rc = SQLFetch           -- fetch a row
>   If rc = 0 Then Leave    -- if no more rows leave loop
>   Do Forever              -- loop forever
>      rc = SQLGetData 1000 -- get 1000 byte chunk from BLOB
>      If rc = 0 Then Leave -- if no more data leave loop
>      -- append chunk to file
>   End
> End
>
> Before I try and implement SQLGetData using the incremental BLOB I/O I
> need to know if the approach I am taking is possible.
> The major issue is with the API function sqlite3_blob_open(). It
> requires:
>  const char *zDb - according to documentation this could be set to
> "main"
>  const char *zTable - this can be obtained from
> sqlite3_column_table_name()
>  const char *zColumn - this is supplied in the call to SQLGetData()
>  sqlite3_int64 iRow - requires the rowid of the table - how is this
> obtained???
>
> The implementation for the SQLite ODBC driver does not use incremental
> BLOB I/O, it reads a BLOB into memory for each row
> fetched. Not much use if the size of each image in the SQLite database
> is 3gb and you only have 2gb memory. I'm looking for a solution that
> will work on BLOBs larger than available memory.
>
> Remember this is a generic wrapper for the SQLite API. I cannot force
> the user to code their SQL in a certain way (eg include rowid in each
> query), or assume anything else. Everything about using the SQlite API
> must be available from the SQLite API.
>
> Thanks for your time.
>
> Cheers, Mark
>
>
> --
>
> * Mark Hessling, m...@rexx.org http://www.rexx.org/
> * Author of THE, a Free XEDIT/KEDIT editor, Rexx/SQL, Rexx/CURL,  etc.
> * Maintainer of Regina Rexx interpreter and Rexx/Tk
> * Use Rexx? join the Rexx Language Association: http://www.rexxla.org/
>
> _______________________________________________
> 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

Reply via email to