Move error handling to SqliteDatabase, performance tuning.

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

View File

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

View File

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

View File

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

View File

@ -224,12 +224,11 @@ void OSystem::loadConfig(const Settings::Options& options)
myHomeDir.makeDir();
mySettingsDb = make_shared<SettingsDb>(myBaseDir.getPath(), "settings");
if(!mySettingsDb->initialize())
mySettingsDb.reset();
mySettingsDb->initialize();
myConfigFile = FilesystemNode(mySettingsDb->databaseFileName());
mySettings->setRepository(createSettingsRepository());
myPropSet->setRepository(createPropertyRepository());
mySettings->setRepository(getSettingsRepository());
myPropSet->setRepository(getPropertyRepository());
mySettings->load(options);
// 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
? shared_ptr<KeyValueRepository>(mySettingsDb, &mySettingsDb->settingsRepository())
: make_shared<KeyValueRepositoryNoop>();
return shared_ptr<KeyValueRepository>(mySettingsDb, &mySettingsDb->settingsRepository());
}
shared_ptr<CompositeKeyValueRepository> OSystem::createPropertyRepository()
shared_ptr<CompositeKeyValueRepository> OSystem::getPropertyRepository()
{
return mySettingsDb
? shared_ptr<CompositeKeyValueRepository>(mySettingsDb, &mySettingsDb->propertyRepository())
: make_shared<CompositeKeyValueRepositoryNoop>();
return shared_ptr<CompositeKeyValueRepository>(mySettingsDb, &mySettingsDb->propertyRepository());
}

View File

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