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]
-----------------------------------------------------------------------------

Reply via email to