Hello all-
Bear with me, my problem is a little goofy and has stolen six hours of my life.
I'm using the C API of sqlite 3.6.12 on Mac OS X 10.6.2.
I'm using a sqlite database table to collect paths from a filesystem. So, I
have some C code that opens the database at the beginning of an indexing job,
prepares an insert statement, and then for each file: sqlite3_bind_text()'s the
path into the insert statement and sqlite3_step()'s it for every file I'm
indexing, and then sqlite3_reset()'s the statement for the next path to insert.
My code works for hundreds of iterations at a time; if I start iterating
through a folder with a few hundred paths, I generally have no problem.
However, if I start higher up, and have a directory tree with 1000 or more
paths, at some point or other sqlite_step() will return SQLITE_CANTOPEN and any
call I try against my sqlite3 *database after that point will return
SQLITE_MISUSE.
For a given set of paths, sqlite_step() will always fail on the same path, plus
or minus 1. If I start in a completely different part of the filesystem,
sqlite_step() will usually fail eventually, with the same consistency, but
never after the same number of inserts -- for one folder, it fails consistently
after 1598 inserts +/-1, for another folder, it fails at 620 +/-1.
* At first, given the consistency, I thought there might be some sort of
memory/allocation problem, but going over my code carefully and with profiling,
I can find no leaks.
* I breakpoint on sqlite3_step() returning an error, and when I look at the
frame, I see no suspicious nulls or bad argument values. If I use dummy code
that inserts an identical dummy string for every call into sqlite3_step(), it
still eventually fails.
* When I change my sql "create" statement for the table I'm inserting into into
a temp table, the code can index tens of thousands of files and never has an
issue.
* This made me think there was some sort of issue with sqlite's IO with the
disk, but I can't figure out where the problem is. Googling tells me a lot of
people have a problem when they are trying to write a db file to a directory
their code doesn't have readwrite on, but I've verified that my database
directory (for purposes of testing) is chmod 777.
So, has anyone else run into SQLITE_CANTOPEN in a situation where it wasn't a
permissions issue?
I'll include the code if you'd really like to see it but it's essentially like
this: (eliding all error checking, etc)
/* EXAMPLE.c */
char *nextPath(); /* returns next path to index */
sqlite3 *_database;
int retVal;
sqlite3_open_v2(PATH_TO_DB, &_database, SQLITE_OPEN_READWRITE |
SQLITE_OPEN_CREATE, NULL);
sqlite3_stmt *statement;
const char *szStmt = "replace into AudioFiles (file_url) values (?)";
retVal = sqlite3_prepare_v2(_database, szStmt, strlen(szStmt), &statement,
NULL);
char *path;
while ( path = nextPath() ) {
retVal = sqlite3_bind_text(statement, 1, path , strlen(path) , SQLITE_STATIC);
/* I've tried every variation for argument 5 here */
retVal = sqlite3_step(statement);
retVal = sqlite3_reset(statement);
}
sqlite3_finalize(_upsertStatement);
sqlite3_close(_database);
/* end EXAMPLE.c */
--------------------------
Jamie Hardt
http://www.imdb.com/name/nm0362504/
http://www.soundepartment.com/
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users