mirror of https://github.com/stella-emu/stella.git
Move error handling to SqliteDatabase, performance tuning.
This commit is contained in:
parent
c3d43a19aa
commit
40072f628d
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue