Move error handling to SqliteDatabase, performance tuning.

This commit is contained in:
Christian Speckner 2021-01-02 14:17:04 +01:00
parent c3d43a19aa
commit 40072f628d
5 changed files with 34 additions and 33 deletions

View File

@ -18,6 +18,10 @@
#include "SettingsDb.hxx" #include "SettingsDb.hxx"
#include "Logger.hxx" #include "Logger.hxx"
#include "SqliteError.hxx" #include "SqliteError.hxx"
#include "repository/KeyValueRepositoryNoop.hxx"
#include "repository/CompositeKeyValueRepositoryNoop.hxx"
#include "repository/CompositeKVRJsonAdapter.hxx"
#include "KeyValueRepositorySqlite.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SettingsDb::SettingsDb(const string& databaseDirectory, const string& databaseName) SettingsDb::SettingsDb(const string& databaseDirectory, const string& databaseName)
@ -27,17 +31,19 @@ SettingsDb::SettingsDb(const string& databaseDirectory, const string& databaseNa
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool SettingsDb::initialize() void SettingsDb::initialize()
{ {
try { try {
myDb = make_unique<SqliteDatabase>(myDatabaseDirectory, myDatabaseName); myDb = make_unique<SqliteDatabase>(myDatabaseDirectory, myDatabaseName);
myDb->initialize(); myDb->initialize();
mySettingsRepository = make_unique<KeyValueRepositorySqlite>(*myDb, "settings", "setting", "value"); auto settingsRepository = make_unique<KeyValueRepositorySqlite>(*myDb, "settings", "setting", "value");
mySettingsRepository->initialize(); settingsRepository->initialize();
mySettingsRepository = std::move(settingsRepository);
myPropertyRepositoryHost = make_unique<KeyValueRepositorySqlite>(*myDb, "properties", "md5", "properties"); auto propertyRepositoryHost = make_unique<KeyValueRepositorySqlite>(*myDb, "properties", "md5", "properties");
myPropertyRepositoryHost->initialize(); propertyRepositoryHost->initialize();
myPropertyRepositoryHost = std::move(propertyRepositoryHost);
myPropertyRepository = make_unique<CompositeKVRJsonAdapter>(*myPropertyRepositoryHost); myPropertyRepository = make_unique<CompositeKVRJsonAdapter>(*myPropertyRepositoryHost);
} }
@ -45,11 +51,9 @@ bool SettingsDb::initialize()
Logger::error("sqlite DB " + databaseFileName() + " failed to initialize: " + err.what()); Logger::error("sqlite DB " + databaseFileName() + " failed to initialize: " + err.what());
myDb.reset(); myDb.reset();
mySettingsRepository.reset(); myPropertyRepositoryHost.reset();
myPropertyRepository.reset();
return false; mySettingsRepository = make_unique<KeyValueRepositoryNoop>();
myPropertyRepository = make_unique<CompositeKeyValueRepositoryNoop>();
} }
return true;
} }

View File

@ -20,8 +20,8 @@
#include "bspf.hxx" #include "bspf.hxx"
#include "SqliteDatabase.hxx" #include "SqliteDatabase.hxx"
#include "KeyValueRepositorySqlite.hxx" #include "repository/KeyValueRepository.hxx"
#include "repository/CompositeKVRJsonAdapter.hxx" #include "repository/CompositeKeyValueRepository.hxx"
class SettingsDb class SettingsDb
{ {
@ -29,13 +29,13 @@ class SettingsDb
SettingsDb(const string& databaseDirectory, const string& databaseName); SettingsDb(const string& databaseDirectory, const string& databaseName);
bool initialize(); void initialize();
KeyValueRepository& settingsRepository() const { return *mySettingsRepository; } KeyValueRepository& settingsRepository() const { return *mySettingsRepository; }
CompositeKeyValueRepository& propertyRepository() const { return *myPropertyRepository; } CompositeKeyValueRepository& propertyRepository() const { return *myPropertyRepository; }
const string& databaseFileName() const { return myDb->fileName(); } const string& databaseFileName() const { return myDatabaseName; }
private: private:
@ -43,9 +43,9 @@ class SettingsDb
string myDatabaseName; string myDatabaseName;
shared_ptr<SqliteDatabase> myDb; shared_ptr<SqliteDatabase> myDb;
unique_ptr<KeyValueRepositorySqlite> mySettingsRepository; unique_ptr<KeyValueRepositoryAtomic> mySettingsRepository;
unique_ptr<KeyValueRepositorySqlite> myPropertyRepositoryHost; unique_ptr<KeyValueRepositoryAtomic> myPropertyRepositoryHost;
unique_ptr<CompositeKVRJsonAdapter> myPropertyRepository; unique_ptr<CompositeKeyValueRepository> myPropertyRepository;
}; };
#endif // SETTINGS_DB_HXX #endif // SETTINGS_DB_HXX

View File

@ -69,9 +69,11 @@ void SqliteDatabase::initialize()
} }
exec("PRAGMA journal_mode=WAL"); exec("PRAGMA journal_mode=WAL");
exec("PRAGMA synchronous=1");
switch (sqlite3_wal_checkpoint_v2(myHandle, nullptr, SQLITE_CHECKPOINT_TRUNCATE, nullptr, nullptr)) { switch (sqlite3_wal_checkpoint_v2(myHandle, nullptr, SQLITE_CHECKPOINT_TRUNCATE, nullptr, nullptr)) {
case SQLITE_OK: case SQLITE_OK:
case SQLITE_BUSY:
break; break;
case SQLITE_MISUSE: case SQLITE_MISUSE:

View File

@ -224,12 +224,11 @@ void OSystem::loadConfig(const Settings::Options& options)
myHomeDir.makeDir(); myHomeDir.makeDir();
mySettingsDb = make_shared<SettingsDb>(myBaseDir.getPath(), "settings"); mySettingsDb = make_shared<SettingsDb>(myBaseDir.getPath(), "settings");
if(!mySettingsDb->initialize()) mySettingsDb->initialize();
mySettingsDb.reset();
myConfigFile = FilesystemNode(mySettingsDb->databaseFileName()); myConfigFile = FilesystemNode(mySettingsDb->databaseFileName());
mySettings->setRepository(createSettingsRepository()); mySettings->setRepository(getSettingsRepository());
myPropSet->setRepository(createPropertyRepository()); myPropSet->setRepository(getPropertyRepository());
mySettings->load(options); mySettings->load(options);
// userDir is NOT affected by '-baseDir'and '-basedirinapp' params // userDir is NOT affected by '-baseDir'and '-basedirinapp' params
@ -880,18 +879,14 @@ void OSystem::mainLoop()
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
shared_ptr<KeyValueRepository> OSystem::createSettingsRepository() shared_ptr<KeyValueRepository> OSystem::getSettingsRepository()
{ {
return mySettingsDb return shared_ptr<KeyValueRepository>(mySettingsDb, &mySettingsDb->settingsRepository());
? shared_ptr<KeyValueRepository>(mySettingsDb, &mySettingsDb->settingsRepository())
: make_shared<KeyValueRepositoryNoop>();
} }
shared_ptr<CompositeKeyValueRepository> OSystem::createPropertyRepository() shared_ptr<CompositeKeyValueRepository> OSystem::getPropertyRepository()
{ {
return mySettingsDb return shared_ptr<CompositeKeyValueRepository>(mySettingsDb, &mySettingsDb->propertyRepository());
? shared_ptr<CompositeKeyValueRepository>(mySettingsDb, &mySettingsDb->propertyRepository())
: make_shared<CompositeKeyValueRepositoryNoop>();
} }

View File

@ -447,12 +447,12 @@ class OSystem
*/ */
virtual void stateChanged(EventHandlerState state) { } virtual void stateChanged(EventHandlerState state) { }
virtual shared_ptr<KeyValueRepository> getSettingsRepository();
virtual shared_ptr<CompositeKeyValueRepository> getPropertyRepository();
protected: protected:
virtual shared_ptr<KeyValueRepository> createSettingsRepository();
virtual shared_ptr<CompositeKeyValueRepository> createPropertyRepository();
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// The following methods are system-specific and *must* be // The following methods are system-specific and *must* be
// implemented in derived classes. // implemented in derived classes.