mirror of https://github.com/stella-emu/stella.git
Implement sqlite repository, fix link against sqlite3.
This commit is contained in:
parent
f9554ee3df
commit
b1f485e2bd
|
@ -876,6 +876,7 @@ if test "$_build_sqlite" = yes; then
|
|||
DEFINES="$DEFINES -DSQLITE_SUPPORT"
|
||||
MODULES="$MODULES $SQLITE"
|
||||
INCLUDES="$INCLUDES -I$SQLITE"
|
||||
LIBS="$LIBS -lsqlite3"
|
||||
fi
|
||||
|
||||
if test "$_build_zip" = yes ; then
|
||||
|
|
|
@ -16,28 +16,109 @@
|
|||
//============================================================================
|
||||
|
||||
#include <sqlite3.h>
|
||||
#include <cstdio>
|
||||
|
||||
#include "KeyValueRepositorySqlite.hxx"
|
||||
#include "bspf.hxx"
|
||||
|
||||
#ifdef BSPF_WINDOWS
|
||||
#define SEPARATOR "\"
|
||||
#else
|
||||
#define SEPARATOR "/"
|
||||
#endif
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
KeyValueRepositorySqlite::KeyValueRepositorySqlite(
|
||||
const string& databaseDirectory,
|
||||
const string& databaseName
|
||||
)
|
||||
) : myDatabaseFile(databaseDirectory + SEPARATOR + databaseName + ".sqlite3"),
|
||||
myDbHandle(nullptr),
|
||||
myDbInitialized(false)
|
||||
{}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
KeyValueRepositorySqlite::~KeyValueRepositorySqlite()
|
||||
{}
|
||||
{
|
||||
if (myDbHandle) sqlite3_close(myDbHandle);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
std::map<string, Variant> KeyValueRepositorySqlite::load()
|
||||
{
|
||||
std::map<string, Variant> values;
|
||||
|
||||
initializeDb();
|
||||
|
||||
if (!myDbInitialized) {
|
||||
cout << "Unable to load from sqlite DB " << myDatabaseFile << endl;
|
||||
return values;
|
||||
}
|
||||
|
||||
sqlite3_stmt* stmt;
|
||||
if (sqlite3_prepare_v2(
|
||||
myDbHandle,
|
||||
"SELECT `key`, `VALUE` FROM `values`",
|
||||
-1, &stmt, nullptr
|
||||
) != SQLITE_OK) return values;
|
||||
|
||||
while (sqlite3_step(stmt) == SQLITE_ROW)
|
||||
values[reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0))] =
|
||||
reinterpret_cast<const char*>(sqlite3_column_text(stmt, 1));
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void KeyValueRepositorySqlite::save(const std::map<string, Variant>& values)
|
||||
{}
|
||||
{
|
||||
initializeDb();
|
||||
|
||||
if (!myDbInitialized) {
|
||||
cout << "Unable to save to sqlite DB " << myDatabaseFile << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
sqlite3_stmt* stmt;
|
||||
if (sqlite3_prepare_v2(
|
||||
myDbHandle,
|
||||
"INSERT OR REPLACE INTO `values` VALUES (?, ?)",
|
||||
-1, &stmt, nullptr
|
||||
) != SQLITE_OK) return;
|
||||
|
||||
for (const auto& pair: values) {
|
||||
sqlite3_bind_text(stmt, 1, pair.first.c_str(), -1, SQLITE_STATIC);
|
||||
sqlite3_bind_text(stmt, 2, pair.second.toCString(), -1, SQLITE_STATIC);
|
||||
sqlite3_step(stmt);
|
||||
|
||||
if (sqlite3_reset(stmt) != SQLITE_OK) break;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void KeyValueRepositorySqlite::initializeDb()
|
||||
{
|
||||
if (myDbHandle) return;
|
||||
|
||||
for (int tries = 1; tries < 3 && !myDbInitialized; tries++) {
|
||||
myDbInitialized = (sqlite3_open(myDatabaseFile.c_str(), &myDbHandle) == SQLITE_OK);
|
||||
|
||||
myDbInitialized = myDbInitialized && (sqlite3_exec(
|
||||
myDbHandle,
|
||||
"CREATE TABLE IF NOT EXISTS `values` (`key` TEXT PRIMARY KEY, `value` TEXT) WITHOUT ROWID",
|
||||
nullptr, nullptr, nullptr
|
||||
) == SQLITE_OK);
|
||||
|
||||
if (!myDbInitialized && tries == 1) {
|
||||
cout << "sqlite DB " << myDatabaseFile << " seems to be corrupt, removing and retrying..." << endl;
|
||||
|
||||
remove(myDatabaseFile.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
if (!myDbInitialized)
|
||||
cout << "unable to initialize sqlite DB " << myDatabaseFile << endl;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
#ifndef KEY_VALUE_REPOSITORY_SQLITE_HXX
|
||||
#define KEY_VALUE_REPOSITORY_SQLITE_HXX
|
||||
|
||||
#include <sqlite3.h>
|
||||
|
||||
#include "repository/KeyValueRepository.hxx"
|
||||
|
||||
class KeyValueRepositorySqlite : public KeyValueRepository
|
||||
|
@ -31,6 +33,18 @@ class KeyValueRepositorySqlite : public KeyValueRepository
|
|||
virtual std::map<string, Variant> load();
|
||||
|
||||
virtual void save(const std::map<string, Variant>& values);
|
||||
|
||||
private:
|
||||
|
||||
void initializeDb();
|
||||
|
||||
private:
|
||||
|
||||
string myDatabaseFile;
|
||||
|
||||
sqlite3* myDbHandle;
|
||||
bool myDbInitialized;
|
||||
|
||||
};
|
||||
|
||||
#endif // KEY_VALUE_REPOSITORY_SQLITE_HXX
|
||||
|
|
Loading…
Reference in New Issue