forked from qt-creator/qt-creator
Clang: Add busy timeout handler to database
You use now a busy timeout of one second. This is preventing the throwing of a exception for a busy time under one second. Change-Id: Iae800a525ad009b594c29883ffb243c1be8b3874 Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
@@ -28,6 +28,10 @@
|
|||||||
#include "sqlitetable.h"
|
#include "sqlitetable.h"
|
||||||
#include "sqlitetransaction.h"
|
#include "sqlitetransaction.h"
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
using namespace std::chrono_literals;
|
||||||
|
|
||||||
namespace Sqlite {
|
namespace Sqlite {
|
||||||
|
|
||||||
Database::Database()
|
Database::Database()
|
||||||
@@ -36,7 +40,15 @@ Database::Database()
|
|||||||
}
|
}
|
||||||
|
|
||||||
Database::Database(Utils::PathString &&databaseFilePath, JournalMode journalMode)
|
Database::Database(Utils::PathString &&databaseFilePath, JournalMode journalMode)
|
||||||
: m_databaseBackend(*this)
|
: Database(std::move(databaseFilePath), 0ms, journalMode)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Database::Database(Utils::PathString &&databaseFilePath,
|
||||||
|
std::chrono::milliseconds busyTimeout,
|
||||||
|
JournalMode journalMode)
|
||||||
|
: m_databaseBackend(*this),
|
||||||
|
m_busyTimeout(busyTimeout)
|
||||||
{
|
{
|
||||||
setJournalMode(journalMode);
|
setJournalMode(journalMode);
|
||||||
open(std::move(databaseFilePath));
|
open(std::move(databaseFilePath));
|
||||||
@@ -46,6 +58,7 @@ void Database::open()
|
|||||||
{
|
{
|
||||||
m_databaseBackend.open(m_databaseFilePath, m_openMode);
|
m_databaseBackend.open(m_databaseFilePath, m_openMode);
|
||||||
m_databaseBackend.setJournalMode(m_journalMode);
|
m_databaseBackend.setJournalMode(m_journalMode);
|
||||||
|
m_databaseBackend.setBusyTimeout(m_busyTimeout);
|
||||||
initializeTables();
|
initializeTables();
|
||||||
m_isOpen = true;
|
m_isOpen = true;
|
||||||
}
|
}
|
||||||
@@ -129,6 +142,4 @@ DatabaseBackend &Database::backend()
|
|||||||
return m_databaseBackend;
|
return m_databaseBackend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace Sqlite
|
} // namespace Sqlite
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include <utils/smallstring.h>
|
#include <utils/smallstring.h>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -52,7 +53,11 @@ public:
|
|||||||
using WriteStatement = Sqlite::WriteStatement;
|
using WriteStatement = Sqlite::WriteStatement;
|
||||||
|
|
||||||
Database();
|
Database();
|
||||||
Database(Utils::PathString &&databaseFilePath, JournalMode journalMode=JournalMode::Wal);
|
Database(Utils::PathString &&databaseFilePath,
|
||||||
|
JournalMode journalMode=JournalMode::Wal);
|
||||||
|
Database(Utils::PathString &&databaseFilePath,
|
||||||
|
std::chrono::milliseconds busyTimeout = {},
|
||||||
|
JournalMode journalMode=JournalMode::Wal);
|
||||||
|
|
||||||
Database(const Database &) = delete;
|
Database(const Database &) = delete;
|
||||||
Database &operator=(const Database &) = delete;
|
Database &operator=(const Database &) = delete;
|
||||||
@@ -138,6 +143,7 @@ private:
|
|||||||
DatabaseBackend m_databaseBackend;
|
DatabaseBackend m_databaseBackend;
|
||||||
std::vector<Table> m_sqliteTables;
|
std::vector<Table> m_sqliteTables;
|
||||||
std::mutex m_databaseMutex;
|
std::mutex m_databaseMutex;
|
||||||
|
std::chrono::milliseconds m_busyTimeout;
|
||||||
JournalMode m_journalMode = JournalMode::Wal;
|
JournalMode m_journalMode = JournalMode::Wal;
|
||||||
OpenMode m_openMode = OpenMode::ReadWrite;
|
OpenMode m_openMode = OpenMode::ReadWrite;
|
||||||
bool m_isOpen = false;
|
bool m_isOpen = false;
|
||||||
|
|||||||
@@ -105,7 +105,6 @@ void DatabaseBackend::open(Utils::SmallStringView databaseFilePath, OpenMode mod
|
|||||||
|
|
||||||
checkDatabaseCouldBeOpened(resultCode);
|
checkDatabaseCouldBeOpened(resultCode);
|
||||||
|
|
||||||
registerBusyHandler();
|
|
||||||
registerRankingFunction();
|
registerRankingFunction();
|
||||||
cacheTextEncoding();
|
cacheTextEncoding();
|
||||||
}
|
}
|
||||||
@@ -212,7 +211,9 @@ void DatabaseBackend::closeWithoutException()
|
|||||||
|
|
||||||
void DatabaseBackend::registerBusyHandler()
|
void DatabaseBackend::registerBusyHandler()
|
||||||
{
|
{
|
||||||
sqlite3_busy_handler(sqliteDatabaseHandle(), &busyHandlerCallback, nullptr);
|
int resultCode = sqlite3_busy_handler(sqliteDatabaseHandle(), &busyHandlerCallback, nullptr);
|
||||||
|
|
||||||
|
checkIfBusyTimeoutWasSet(resultCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseBackend::registerRankingFunction()
|
void DatabaseBackend::registerRankingFunction()
|
||||||
@@ -326,6 +327,12 @@ void DatabaseBackend::checkIfLogCouldBeCheckpointed(int resultCode)
|
|||||||
throwException("SqliteDatabaseBackend::checkpointFullWalLog: WAL log could not be checkpointed!");
|
throwException("SqliteDatabaseBackend::checkpointFullWalLog: WAL log could not be checkpointed!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DatabaseBackend::checkIfBusyTimeoutWasSet(int resultCode)
|
||||||
|
{
|
||||||
|
if (resultCode != SQLITE_OK)
|
||||||
|
throwException("SqliteDatabaseBackend::setBusyTimeout: Busy timeout cannot be set!");
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
template<std::size_t Size>
|
template<std::size_t Size>
|
||||||
int indexOfPragma(Utils::SmallStringView pragma, const Utils::SmallStringView (&pragmas)[Size])
|
int indexOfPragma(Utils::SmallStringView pragma, const Utils::SmallStringView (&pragmas)[Size])
|
||||||
@@ -395,6 +402,11 @@ int DatabaseBackend::openMode(OpenMode mode)
|
|||||||
return sqliteMode;
|
return sqliteMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DatabaseBackend::setBusyTimeout(std::chrono::milliseconds timeout)
|
||||||
|
{
|
||||||
|
sqlite3_busy_timeout(m_databaseHandle, int(timeout.count()));
|
||||||
|
}
|
||||||
|
|
||||||
void DatabaseBackend::throwExceptionStatic(const char *whatHasHappens)
|
void DatabaseBackend::throwExceptionStatic(const char *whatHasHappens)
|
||||||
{
|
{
|
||||||
throw Exception(whatHasHappens);
|
throw Exception(whatHasHappens);
|
||||||
|
|||||||
@@ -29,6 +29,8 @@
|
|||||||
|
|
||||||
#include <utils/smallstringvector.h>
|
#include <utils/smallstringvector.h>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
struct sqlite3;
|
struct sqlite3;
|
||||||
|
|
||||||
namespace Sqlite {
|
namespace Sqlite {
|
||||||
@@ -81,6 +83,8 @@ public:
|
|||||||
|
|
||||||
static int openMode(OpenMode);
|
static int openMode(OpenMode);
|
||||||
|
|
||||||
|
void setBusyTimeout(std::chrono::milliseconds timeout);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool databaseIsOpen() const;
|
bool databaseIsOpen() const;
|
||||||
|
|
||||||
@@ -105,6 +109,7 @@ protected:
|
|||||||
void checkInitializeSqliteLibraryWasSuccesful(int resultCode);
|
void checkInitializeSqliteLibraryWasSuccesful(int resultCode);
|
||||||
void checkShutdownSqliteLibraryWasSuccesful(int resultCode);
|
void checkShutdownSqliteLibraryWasSuccesful(int resultCode);
|
||||||
void checkIfLogCouldBeCheckpointed(int resultCode);
|
void checkIfLogCouldBeCheckpointed(int resultCode);
|
||||||
|
void checkIfBusyTimeoutWasSet(int resultCode);
|
||||||
|
|
||||||
static Utils::SmallStringView journalModeToPragma(JournalMode journalMode);
|
static Utils::SmallStringView journalModeToPragma(JournalMode journalMode);
|
||||||
static JournalMode pragmaToJournalMode(Utils::SmallStringView pragma);
|
static JournalMode pragmaToJournalMode(Utils::SmallStringView pragma);
|
||||||
|
|||||||
@@ -39,6 +39,10 @@
|
|||||||
|
|
||||||
#include <utils/hostosinfo.h>
|
#include <utils/hostosinfo.h>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
using namespace std::chrono_literals;
|
||||||
|
|
||||||
namespace ClangPchManager {
|
namespace ClangPchManager {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@@ -55,7 +59,7 @@ QString backendProcessPath()
|
|||||||
class ClangPchManagerPluginData
|
class ClangPchManagerPluginData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}};
|
Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}, 1000ms};
|
||||||
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
|
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
|
||||||
ClangBackEnd::FilePathCaching filePathCache{database};
|
ClangBackEnd::FilePathCaching filePathCache{database};
|
||||||
PrecompiledHeaderStorage<> preCompiledHeaderStorage{database};
|
PrecompiledHeaderStorage<> preCompiledHeaderStorage{database};
|
||||||
|
|||||||
@@ -52,6 +52,10 @@
|
|||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
using namespace std::chrono_literals;
|
||||||
|
|
||||||
namespace ClangRefactoring {
|
namespace ClangRefactoring {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@@ -74,7 +78,7 @@ public:
|
|||||||
using QuerySqliteReadStatementFactory = QuerySqliteStatementFactory<Sqlite::Database,
|
using QuerySqliteReadStatementFactory = QuerySqliteStatementFactory<Sqlite::Database,
|
||||||
Sqlite::ReadStatement>;
|
Sqlite::ReadStatement>;
|
||||||
|
|
||||||
Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}};
|
Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}, 1000ms};
|
||||||
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
|
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
|
||||||
ClangBackEnd::FilePathCaching filePathCache{database};
|
ClangBackEnd::FilePathCaching filePathCache{database};
|
||||||
RefactoringClient refactoringClient;
|
RefactoringClient refactoringClient;
|
||||||
|
|||||||
@@ -43,8 +43,11 @@
|
|||||||
#include <QTemporaryDir>
|
#include <QTemporaryDir>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
|
using namespace std::chrono_literals;
|
||||||
|
|
||||||
using ClangBackEnd::ClangPathWatcher;
|
using ClangBackEnd::ClangPathWatcher;
|
||||||
using ClangBackEnd::ConnectionServer;
|
using ClangBackEnd::ConnectionServer;
|
||||||
using ClangBackEnd::PchCreator;
|
using ClangBackEnd::PchCreator;
|
||||||
@@ -109,7 +112,7 @@ int main(int argc, char *argv[])
|
|||||||
const QString connectionName = arguments[0];
|
const QString connectionName = arguments[0];
|
||||||
const QString databasePath = arguments[1];
|
const QString databasePath = arguments[1];
|
||||||
|
|
||||||
Sqlite::Database database{Utils::PathString{databasePath}};
|
Sqlite::Database database{Utils::PathString{databasePath}, 1000ms};
|
||||||
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
|
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
|
||||||
ClangBackEnd::FilePathCaching filePathCache{database};
|
ClangBackEnd::FilePathCaching filePathCache{database};
|
||||||
ClangPathWatcher<QFileSystemWatcher, QTimer> includeWatcher(filePathCache);
|
ClangPathWatcher<QFileSystemWatcher, QTimer> includeWatcher(filePathCache);
|
||||||
|
|||||||
@@ -35,6 +35,10 @@
|
|||||||
#include <refactoringclientproxy.h>
|
#include <refactoringclientproxy.h>
|
||||||
#include <symbolindexing.h>
|
#include <symbolindexing.h>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
using namespace std::chrono_literals;
|
||||||
|
|
||||||
using ClangBackEnd::FilePathCaching;
|
using ClangBackEnd::FilePathCaching;
|
||||||
using ClangBackEnd::RefactoringClientProxy;
|
using ClangBackEnd::RefactoringClientProxy;
|
||||||
using ClangBackEnd::RefactoringServer;
|
using ClangBackEnd::RefactoringServer;
|
||||||
@@ -74,7 +78,7 @@ int main(int argc, char *argv[])
|
|||||||
const QString connectionName = arguments[0];
|
const QString connectionName = arguments[0];
|
||||||
const QString databasePath = arguments[1];
|
const QString databasePath = arguments[1];
|
||||||
|
|
||||||
Sqlite::Database database{Utils::PathString{databasePath}};
|
Sqlite::Database database{Utils::PathString{databasePath}, 1000ms};
|
||||||
RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
|
RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
|
||||||
FilePathCaching filePathCache{database};
|
FilePathCaching filePathCache{database};
|
||||||
SymbolIndexing symbolIndexing{database, filePathCache};
|
SymbolIndexing symbolIndexing{database, filePathCache};
|
||||||
|
|||||||
Reference in New Issue
Block a user