我已经阅读了其他关于如何检测SQLite数据库是否被锁定的答案,它建议使用
因为在我的应用程序使用情况中,另一个应用程序可能会访问同一个数据库,所以我需要处理这种情况。
以下是我打开数据库时设置的选项:
我有一个函数,应该确定数据库是否被锁定:
当数据库被锁定时,我执行此函数并打印出两个0(SQLITE_OK),而我期望得到5(SQLITE_BUSY)。并且回调函数也没有被调用。
我做错了什么?
sqlite3_busy_handler
/sqlite3_busy_timeout
。我正在使用支持SQLite数据库的Qt,但这在这里并不重要。因为在我的应用程序使用情况中,另一个应用程序可能会访问同一个数据库,所以我需要处理这种情况。
以下是我打开数据库时设置的选项:
auto db = QSqlDatabase::database();
db.setDatabaseName(m_sDatabasePath);
db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=0");
if (!db.open())
return false;
我有一个函数,应该确定数据库是否被锁定:
int callback(void *data, int)
{
std::cout << "callback" << std::endl;
return 0;
}
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, callback, nullptr) << std::endl;
std::cout << sqlite3_busy_timeout(handle, 0) << std::endl;
}
}
}
return true;
}
当数据库被锁定时,我执行此函数并打印出两个0(SQLITE_OK),而我期望得到5(SQLITE_BUSY)。并且回调函数也没有被调用。
我做错了什么?