Thank you very much for your advice! >to check that transaction >wasn't committed yet you can connect to the database with external >command while application is working and try to update or insert >something. If it fails with message "The database file is locked" then >application didn't commit transaction Yes, you are right. Update fails with message "The database file is locked". I inserted following statements:
const char *sql; int commit = sqlite3_get_autocommit(db); sqlite3_stmt *pStmt = sqlite3_next_stmt(db, NULL); if(pStmt != NULL) { sql = sqlite3_sql(pStmt); } right after : sqlite3_blob_close(); And received: commit = 1; pStmt != NULL but sql = NULL; //under debugger: pStmt->isPrepareV2 = 0; pStmt->zSql = NULL; The results surprised me. I think that I do not have any statement open yet sqlite3_next_stmt tells me that I have statement prepared and pending. At the same time sqlite3_sql(pStmt) says that that statement is a NULL statement. I just got more confused. Best regards, Samuel ----- Original Message ---- From: Pavel Ivanov <paiva...@gmail.com> To: General Discussion of SQLite Database <sqlite-users@sqlite.org> Sent: Thu, February 4, 2010 2:07:12 PM Subject: Re: [sqlite] When incremental write is committed to the hard drive? > 1) What else can prevent incremental data to be written to the hard drive? Besides all that I mentioned only explicit BEGIN statement can open transaction and thus prevent anything after that from being written to disk immediately until COMMIT is executed. What you can do now is first of all use sqlite3_get_autocommit function (http://www.sqlite.org/c3ref/get_autocommit.html) after closing blob handle to check that transaction should be automatically committed. But I'm not sure that it will return 0 if some SELECT statement is in progress. To check that you can call sqlite3_next_stmt(db, NULL) (http://www.sqlite.org/c3ref/next_stmt.html) to obtain pointer to the statement that is still open (if you finalize all your statements then this function should return NULL). If function returns some statement you can use sqlite3_sql (http://www.sqlite.org/c3ref/sql.html) to see what statement is at fault. > 2) Is there a way to force a write to the hard drive? Nothing but COMMIT statement (or auto-commit) can force new and changed data to be written on disk. BTW, to check that transaction wasn't committed yet you can connect to the database with external command while application is working and try to update or insert something. If it fails with message "The database file is locked" then application didn't commit transaction. If update succeeds and you still cannot see changes made by application then you have some problems with file system, but I hope you have not. __________________________________________________________________ Looking for the perfect gift? Give the gift of Flickr! http://www.flickr.com/gift/ _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users