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