Thanks for your answer.

Actually, I tried to have resets there although I think that finalize is as
good in releasing the locks on tables. It didn't help.

I do it with prepare and step because this script is a demo of a bug I have
in my code, where I use all over a certain function that prepare and step.
It is true that here I could use also exec.

However, if I change the script to have the first two create statements run
by sqlite3_exec, and change the last statement to a select (to justify the
use of prepare) I still get the "SQL logic error or missing database". So I
suspect that the problem is because I use two open connections to the
database (again, this is a demo of the bug which happen in much bigger
application where opening two connections to the same database make sense),
and somehow when I create a second table with the second connection it
locks/invalidate or whatever the first connection and I get this error. I
even checked the code with valgrind, but got nothing...

Any help will be appreciated.

Ran

On 5/23/06, Jay Sprenkle <[EMAIL PROTECTED]> wrote:

On 5/23/06, Ran <[EMAIL PROTECTED]> wrote:
> Hi all,
>
>
>   rc = sqlite3_prepare(db1,                // Database handle
>                        "create table bla(a int,b int)",
>                        -1,                 // Length of the statement
>                        &pStmt1,       // OUT: Statement handle
>                        0);                 // OUT: Pointer to unused
portion
>                                            // of the statement
>
>   rc = sqlite3_step(pStmt1);
>   if (rc != SQLITE_DONE) { // if we failed, we show it.
>     printf("Failed to step statement: %s\n", sqlite3_errmsg(db1));
>   }
>   rc = sqlite3_finalize(pStmt1);
>   sqlite3_exec(db1, "commit", 0, 0, 0); // here we commit the
transaction.

You forgot the reset here:
int sqlite3_reset(sqlite3_stmt *pStmt);
http://sqlite.org/capi3ref.html#sqlite3_reset

Why are you preparing this statement?
Just sqlite3_exec() it.

>
>   // now we suppose to have inside the database the table bla.
>
>   // here we, optionally, create another connection to the same
database,
>   // and then create other table in a transaction.
>   if (argc > 1) {
>     rc = sqlite3_open("bug.db", &db2); // create the second connection.
>     if (rc) {
>       printf("Cannot open database again: %s\n", sqlite3_errmsg(db2));
>       exit(1);
>     }
>     else {
>       printf("Opened the database.\n");
>     }

You still have a valid handle to the open database. Why create a second
one?


>
>     // create table foo
>     sqlite3_exec(db2, "begin", 0, 0, 0); // start the transaction.
>     rc = sqlite3_prepare(db2,                // Database handle
>                          "create table foo(c int,d int)",
>                          -1,                 // Length of the statement
>                          &pStmt2,            // OUT: Statement handle
>                          0);                 // OUT: Pointer to unused
> portion
>                                              // of the statement
>
>     rc = sqlite3_step(pStmt2);
>     if (rc != SQLITE_DONE) { // if we failed, we show it.
>       printf("Failed to step statement: %s\n", sqlite3_errmsg(db2));
>     }
>     rc = sqlite3_finalize(pStmt2);
>     sqlite3_exec(db2, "commit", 0, 0, 0);
>   }
>
>   // delete from table bla using the first connection.
>   sqlite3_exec(db1, "begin", 0, 0, 0);
>   rc = sqlite3_prepare(db1,                // Database handle
>                        "delete from bla",
>                        -1,                 // Length of the statement
>                        &pStmt3,       // OUT: Statement handle
>                        0);                 // OUT: Pointer to unused
portion
>                                            // of the statement
>
>   rc = sqlite3_step(pStmt3);
>   if (rc != SQLITE_DONE) { // if we failed, we log it.
>     printf("Failed to step statement: %s\n", sqlite3_errmsg(db1));
>   }
>   else {
>     printf("deleted all from bla successfully\n");
>   }
>   rc = sqlite3_finalize(pStmt3);
>   sqlite3_exec(db1, "commit", 0, 0, 0);
> }

Again, why prepare something that returns no results and will
not be used more than once?

Reply via email to