initStatements();
}
-void Database_PostgreSQL::pingDatabase()
-{
- // Verify DB connection with ping
- try {
- ping();
- } catch (const DatabaseException &e) {
- // If ping failed, show the error and try reconnect
- PQreset(m_conn);
-
- errorstream << e.what() << std::endl
- << "Reconnecting to database " << m_connect_string << std::endl;
- connectToDatabase();
- }
+void Database_PostgreSQL::verifyDatabase()
+{
+ if (PQstatus(m_conn) == CONNECTION_OK)
+ return;
+
+ PQreset(m_conn);
+ ping();
}
void Database_PostgreSQL::ping()
void Database_PostgreSQL::beginSave()
{
- pingDatabase();
+ verifyDatabase();
checkResults(PQexec(m_conn, "BEGIN;"));
}
return false;
}
- pingDatabase();
+ verifyDatabase();
s32 x, y, z;
x = htonl(pos.X);
void MapDatabasePostgreSQL::loadBlock(const v3s16 &pos, std::string *block)
{
- pingDatabase();
+ verifyDatabase();
s32 x, y, z;
x = htonl(pos.X);
bool MapDatabasePostgreSQL::deleteBlock(const v3s16 &pos)
{
- pingDatabase();
+ verifyDatabase();
s32 x, y, z;
x = htonl(pos.X);
void MapDatabasePostgreSQL::listAllLoadableBlocks(std::vector<v3s16> &dst)
{
- pingDatabase();
+ verifyDatabase();
PGresult *results = execPrepared("list_all_loadable_blocks", 0,
NULL, NULL, NULL, false, false);
bool PlayerDatabasePostgreSQL::playerDataExists(const std::string &playername)
{
- pingDatabase();
+ verifyDatabase();
const char *values[] = { playername.c_str() };
PGresult *results = execPrepared("load_player", 1, values, false);
if (!sao)
return;
- pingDatabase();
+ verifyDatabase();
v3f pos = sao->getBasePosition();
std::string pitch = ftos(sao->getLookPitch());
bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
{
sanity_check(sao);
- pingDatabase();
+ verifyDatabase();
const char *values[] = { player->getName() };
PGresult *results = execPrepared("load_player", 1, values, false, false);
if (!playerDataExists(name))
return false;
- pingDatabase();
+ verifyDatabase();
const char *values[] = { name.c_str() };
execPrepared("remove_player", 1, values);
void PlayerDatabasePostgreSQL::listPlayers(std::vector<std::string> &res)
{
- pingDatabase();
+ verifyDatabase();
PGresult *results = execPrepared("load_player_list", 0, NULL, false);