1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-27 17:28:41 +00:00

Add mod storage PostgreSQL backend

This commit is contained in:
Jude Melton-Houghton 2022-10-19 14:16:57 -04:00 committed by Loïc Blot
parent 9dbac989bd
commit aaa05f901a
4 changed files with 315 additions and 0 deletions

View file

@ -20,12 +20,18 @@ with this program; if not, write to the Free Software Foundation, Inc.,
// This file is an edited copy of test_authdatabase.cpp
#include "cmake_config.h"
#include "test.h"
#include <algorithm>
#include <cstdlib>
#include "database/database-dummy.h"
#include "database/database-files.h"
#include "database/database-sqlite3.h"
#if USE_POSTGRESQL
#include "database/database-postgresql.h"
#endif
#include "filesys.h"
namespace
@ -104,6 +110,46 @@ private:
std::string dir;
ModMetadataDatabase *mod_meta_db = nullptr;
};
#if USE_POSTGRESQL
void clearPostgreSQLDatabase(const std::string &connect_string)
{
ModMetadataDatabasePostgreSQL db(connect_string);
std::vector<std::string> modnames;
db.beginSave();
db.listMods(&modnames);
for (const std::string &modname : modnames)
db.removeModEntries(modname);
db.endSave();
}
class PostgreSQLProvider : public ModMetadataDatabaseProvider
{
public:
PostgreSQLProvider(const std::string &connect_string): m_connect_string(connect_string) {}
~PostgreSQLProvider()
{
if (m_db)
m_db->endSave();
delete m_db;
}
ModMetadataDatabase *getModMetadataDatabase() override
{
if (m_db)
m_db->endSave();
delete m_db;
m_db = new ModMetadataDatabasePostgreSQL(m_connect_string);
m_db->beginSave();
return m_db;
};
private:
std::string m_connect_string;
ModMetadataDatabase *m_db = nullptr;
};
#endif // USE_POSTGRESQL
}
class TestModMetadataDatabase : public TestBase
@ -193,6 +239,33 @@ void TestModMetadataDatabase::runTests(IGameDef *gamedef)
runTestsForCurrentDB();
delete mod_meta_provider;
#if USE_POSTGRESQL
const char *env_postgresql_connect_string = getenv("MINETEST_POSTGRESQL_CONNECT_STRING");
if (env_postgresql_connect_string) {
std::string connect_string(env_postgresql_connect_string);
rawstream << "-------- PostgreSQL database (same object)" << std::endl;
clearPostgreSQLDatabase(connect_string);
mod_meta_db = new ModMetadataDatabasePostgreSQL(connect_string);
mod_meta_provider = new FixedProvider(mod_meta_db);
runTestsForCurrentDB();
delete mod_meta_db;
delete mod_meta_provider;
rawstream << "-------- PostgreSQL database (new objects)" << std::endl;
clearPostgreSQLDatabase(connect_string);
mod_meta_provider = new PostgreSQLProvider(connect_string);
runTestsForCurrentDB();
delete mod_meta_provider;
}
#endif // USE_POSTGRESQL
}
////////////////////////////////////////////////////////////////////////////////