On Fri, Apr 25, 2008 at 4:13 PM, P Kishor <[EMAIL PROTECTED]> wrote:
>
> On 4/25/08, Cole Tuininga <[EMAIL PROTECTED]> wrote:
>  Here is what I do in the Perl world for this problem --
>
>  # Create a string with the bound vars to write to a log
>  $sql = "SELECT col FROM table WHERE col = '<bound value here>';
>  # Write this $sql to a log file
>  $log->info(localtime . ": " . $sql . "\n");
>
>  # Now bind and run the query for real
>  $sth = $dbh->prepare(qq{SELECT col from table WHERE col = ?});
>  $sth->execute('<bound value here>');

I see where you're coming from.  This does do what I asked, but I
think I didn't explain what my concern was very well.  :)

I did try printing out the key.  In fact, I then threw it into a perl
one-liner to pull the data from the same sqlite db and got the row I
was looking for (using DBI).  The thing is that my C is a bit rusty
and I'm not entirely certain that I've got the call right.  It would
probably be useful if I posted a code snippet.  Here are some relevant
snippets from the code.

char **keys;  /* This gets populated dynamically as an array of all
the keys that are in the sqlite database */
const char *q = "SELECT var FROM host_map WHERE ind = ?\0";
sqlite3 *dbh;
sqlite3_stmt *sth;

if (sqlite3_open_v2(INPUT_FILE, &dbh, SQLITE_OPEN_READONLY, NULL) !=
SQLITE_OK) {
        printf("Did not open the database\n");
        return -1;
}

/* Build the query */
if (sqlite3_prepare_v2(dbh, q, -1, &sth, NULL) != SQLITE_OK ) {
        printf("Could not compile the query\n");
        return -1;
}

index = random() % (long)(lines / 2);
result = sqlite3_bind_text(
        sth, 1, (char *) keys[index], strlen((char *)keys[index]) + 1,
        SQLITE_TRANSIENT
);

/* Check here to make sure the binding took */

keep_reading = 1;

while (keep_reading) {
        switch (sqlite3_step(sth)) {
                case SQLITE_ROW:
                        val = sqlite3_column_text(sth, 0);
                        printf("%s maps to %s\n", keys[index], val);
                        break;

                case SQLITE_BUSY:
                        printf("DB was too busy to respond\n");
                        keep_reading = 0;
                        break;

                case SQLITE_ERROR:
                        printf("An error has occurred.\n");
                        return -1;

                case SQLITE_MISUSE:
                        printf("Programming error!\n");
                        keep_reading = 0;
                        break;

                case SQLITE_DONE:
                        keep_reading = 0;
                        break;

                default:
                        printf("Unknown result from sqlite3_step\n");
        };
}

-- 
Cole Tuininga
http://www.tuininga.org/
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to