determine whether sqlite database is locked
-
i need to determine whether the sqlite database is locked. i found this function which returns that info. but, in order to call this function, i need
sqlite3.h
andsqlite3.c
which doesn't come with qt. so i need to download these files and link them with my project.
is there a better way to determine whether the database is locked? -
Hi,
From the looks of the documentation, it's rather for when a table is locked. So is it really what you want ?
-
Hi,
From the looks of the documentation, it's rather for when a table is locked. So is it really what you want ?
@sgaist
yeah i know but that's what i found. i didn't find any other way -
It is included. Here is how I got to it when playing with sqlite specific functions. You may need to alter some paths if those changed between revisions of Qt:
https://forum.qt.io/topic/101018/qsqldatabase-sqlite-how-to-load-into-memory-and-save-memory-to-disk/13 -
It is included. Here is how I got to it when playing with sqlite specific functions. You may need to alter some paths if those changed between revisions of Qt:
https://forum.qt.io/topic/101018/qsqldatabase-sqlite-how-to-load-into-memory-and-save-memory-to-disk/13@fcarney
my application uses a custom built qt (not the one downloaded from the website), and i looked at qtsql, sqldrivers folders, performed a search and didn't find the header file... -
@fcarney
the directory structure is different
i haveqt/ include/ qtcore,qtgui,... plugins/ sqldrivers
-
Hi
But do you really need to know of its locked?
You will get an error if you try to perform operations and it is indeed locked.
So that case could be treated like any other type of db failure. -
Hi
But do you really need to know of its locked?
You will get an error if you try to perform operations and it is indeed locked.
So that case could be treated like any other type of db failure.@mrjj
yes i first need to check if the db is locked. because in that case i need to show another dialog, and in all other db access failure cases should be handled differently (just print a message, etc.) -
@mrjj
yes i first need to check if the db is locked. because in that case i need to show another dialog, and in all other db access failure cases should be handled differently (just print a message, etc.)@user4592357
ok. it was worth a shot. :)i would download the source (version wise) of the Qt used to build your
custom Qt and take the sqlite files from there to be 100% sure its
compatible. or at least check the version used and download that from their site. -
@mrjj
yes i first need to check if the db is locked. because in that case i need to show another dialog, and in all other db access failure cases should be handled differently (just print a message, etc.)@mrjj said:
You will get an error if you try to perform operations and it is indeed locked.
You said:
yes i first need to check if the db is locked. because in that case i need to show another dialog,
So since this is proving so difficult, can you not initially try one operation which will raise an error if db is locked, then put up you dialog, and treat any subsequent errors in your standard dialog way?
-
what if the database is locked during the running of the application? in that case i need to perform "is database locked?" before executing each query (even selects). so i guess i need to perform this check before executing each query.
-
okay i downloaded the files and built with my project.
so i set the db connection timeout to 0:auto db = QSqlDatabase::database(); db.setDatabaseName(m_sDatabasePath); db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=0"); if (!db.open()) return false;
and then i do this:
bool isDatabaseLocked(const QSqlDatabase &db) { if (auto driver = db.driver()) { // get driver handler QVariant v = driver->handle(); if (v.isValid() && qstrcmp(v.typeName(), "sqlite3*") == 0) { // v.data() returns a pointer to the handle auto handle = *static_cast<sqlite3 **>(v.data()); if (handle) { std::cout << sqlite3_busy_handler(handle, cb, nullptr) << std::endl; std::cout << sqlite3_busy_timeout(handle, 0) << std::endl; } } } return true; } int cb(void *data, int) { std::cout << "cb" << std::endl; return 0; }
both these functions return 0 (SQLITE_OK) while i'd expect to get 5 (SQLITE_BUSY). and the callback function isn't called either. so what's wrong?
-
what if the database is locked during the running of the application? in that case i need to perform "is database locked?" before executing each query (even selects). so i guess i need to perform this check before executing each query.
@user4592357 said in determine whether sqlite database is locked:
what if the database is locked during the running of the application? in that case i need to perform "is database locked?" before executing each query (even selects). so i guess i need to perform this check before executing each query.
Absolutely not! If it's locked, you'll find out on your genuine call, not an extra check each time!
-
@user4592357 said in determine whether sqlite database is locked:
what if the database is locked during the running of the application? in that case i need to perform "is database locked?" before executing each query (even selects). so i guess i need to perform this check before executing each query.
Absolutely not! If it's locked, you'll find out on your genuine call, not an extra check each time!
This post is deleted! -
@jonb
yes i know, with lastError(). but what about handling it? should i check if (lastError().startWith("database is locked")) then show dialog else do something else? i don't like this -
@jonb
yes i know, with lastError(). but what about handling it? should i check if (lastError().startWith("database is locked")) then show dialog else do something else? i don't like this@user4592357
If you are are issuing some SQL statement which can only error in your "locked" case then you know where you are. If the "locked" can be returned from any SQL call then it looks like you have little choice but to look atlastError()
, since I do not see that Qt returns any information about a SQLite native error number you could examine.Yes, it's not perfect. Personally I'd still prefer that to having to bring in extra files and compile the driver myself just to get it perfect. What is this locked all about, is your app so critical that you have to get this case perfect, and why are you subject to this issue when loads of other people are using Qt with SQLite without worrying about this?
-
@user4592357
If you are are issuing some SQL statement which can only error in your "locked" case then you know where you are. If the "locked" can be returned from any SQL call then it looks like you have little choice but to look atlastError()
, since I do not see that Qt returns any information about a SQLite native error number you could examine.Yes, it's not perfect. Personally I'd still prefer that to having to bring in extra files and compile the driver myself just to get it perfect. What is this locked all about, is your app so critical that you have to get this case perfect, and why are you subject to this issue when loads of other people are using Qt with SQLite without worrying about this?
@jonb
yes i need to process the locked state of the database because it can potentially be opened from another application as well (in a nutshell, these two apps can talk to each other).i actually downloaded the files and compiled them. two posts above i show the code which i'm using but it doesn't return anything related to sqlite being busy or locked. is the code actually correct?