On Mon, 2007-10-29 at 17:49 +0100, Ralf Junker wrote:
> >> I wonder if it is possible to retrieve bound host parameters from a
> >> prepared SQL statement? I am
> >> thinking of the opposite of the sqlite3_bind... family of functions like:
> >>
> >> int sqlite3_bound_int (sqlite3_stmt*, int*);
> >> int sqlite3_bound_double (sqlite3_stmt*, double*);
> >
> >You'd also need to specify the index of the ? parameter you're seeking.
>
> Certainly. Sorry for the ommission, glad you pointed this out.
>
> >> They would be usefull to work around the sqlite3_trace() limitation which
> >> does not replace host
> >> parameters in the SQL. With the sqlite3_bound... functions, the trace
> >> callback would be able
> >> retrieve the parameter values from the statement and replace them or log
> >> them separately.
> >
> >You could create all this functionality in your wrapper level above
> >the sqlite3 API.
> >
> >It would be easy enough for you to modify the sqlite3 sources to add
> >such functions to fish the values out of the internal Vdbe.aVar Mem
> >array of the sqlite3_stmt. If the type does not match what is stored
> >internally, or something was not previously bound or out of range, I
> >imagine an SQLITE_ERROR could be returned. Or maybe you want your
> >bound* functions to coerce the bound value to the type you specify.
>
> True, but we would need to access unsupported API to do so.
> And as we know only too well, unsupported API is subject to
> change without notice any time ;-). Therefore I would rather
> not write these myself but ask for the possibility to add them
> to the library officially, even if "experimental" only.
Depends how desperate you are. Say you want to query statement
object X that has 4 variables, you could do this:
pTmp = sqlite3_prepare("SELECT ?, ?, ?, ?");
sqlite3_transfer_bindings(X, pTmp);
/* Use sqlite3_step() etc. to fish values out of pTmp */
sqlite3_transfer_bindings(pTmp, X);
sqlite3_finalize(pTmp);
Dan.
>
> >Another complementary function, say sqlite3_bound_type, could
> >return the type(s) of the bound field. (I say types plural because
> >sometimes a value can be a combination of types at the same time -
> >i.e., MEM_Real|MEM_Int). These internal types would have to be
> >exposed if you required such functionality.
> >
> >#define MEM_Null 0x0001 /* Value is NULL */
> >#define MEM_Str 0x0002 /* Value is a string */
> >#define MEM_Int 0x0004 /* Value is an integer */
> >#define MEM_Real 0x0008 /* Value is a real number */
> >#define MEM_Blob 0x0010 /* Value is a BLOB */
>
> Indeed very much agreed to!
>
> Ralf
>
>
> -----------------------------------------------------------------------------
> To unsubscribe, send email to [EMAIL PROTECTED]
> -----------------------------------------------------------------------------
>
-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------