Hi all,

I *think* that sqlite3_close behave strangly.

I use version 3.3.7 on Linux (Fedora Core 5).

What I do is to open a database, and start a transaction in it. Then,
without ending the transaction, open again the database and simply close it.

I found out, that the inner sqlite3_close return 0 (SQLITE_OK), but the
file handle is not released. So if I do it too many times, I run out of file
handles.

You are free to ask why I open and close that many times the same database
while it is already in transaction.
This is my mistake. Actually, it is already fixed.
But I still wonder - shouldn't the sqlite3_close return other thing then
just SQLITE_OK? Especially if the file handle is not released? If it did, I
would find my mistake much earlier.

Here is my script that demonstrate it (you can use /usr/sbin/lsof in linux
to see how many times the file is opened):

 #include <sqlite3.h>
 int main(int argc, char **argv) {
   sqlite3* db;
   sqlite3* db_inner;
   int rc;
   int i;
   system("rm -f open_many_test.db");

   rc = sqlite3_open("open_many_test.db", &db);
   sqlite3_exec(db, "begin", 0, 0, 0);
   sqlite3_stmt *pStmt;
   rc = sqlite3_prepare(db,
                        "create table a (id varchar)",
                        -1,
                        &pStmt,
                        0);
   rc = sqlite3_step(pStmt);
   sqlite3_finalize(pStmt);

   rc = sqlite3_prepare(db,
                        "insert into a values('bla')",
                        -1,
                        &pStmt,
                        0);
   rc = sqlite3_step(pStmt);
   sqlite3_finalize(pStmt);

   for (i = 0; i < 10000; i++) {
     rc = sqlite3_open("open_many_test.db", &db_inner);
     printf("sqlite3_open gives %d\n", rc);

     rc = sqlite3_close(db_inner);
     printf("sqlite3_close gives %d\n", rc);
   }

   sqlite3_exec(db, "commit", 0, 0, 0);
   rc = sqlite3_close(db);
 }


I will appreciate any explaination.

Thanks,

Ran

Reply via email to