summaryrefslogtreecommitdiff
path: root/src/database/database-postgresql.cpp
diff options
context:
space:
mode:
authorLoïc Blot <nerzhul@users.noreply.github.com>2020-04-15 08:01:11 +0200
committerGitHub <noreply@github.com>2020-04-15 08:01:11 +0200
commit5c588f89e79e02cba392abe3d00688772321f88b (patch)
treef88ba42459e55fa577668054fb06803af928f7d1 /src/database/database-postgresql.cpp
parent62c62f382984bd1a6f5cd7c6edb00453ff758f9b (diff)
downloadminetest-5c588f89e79e02cba392abe3d00688772321f88b.tar.gz
minetest-5c588f89e79e02cba392abe3d00688772321f88b.tar.bz2
minetest-5c588f89e79e02cba392abe3d00688772321f88b.zip
Verify database connection on interval (#9665)
Diffstat (limited to 'src/database/database-postgresql.cpp')
-rw-r--r--src/database/database-postgresql.cpp38
1 files changed, 22 insertions, 16 deletions
diff --git a/src/database/database-postgresql.cpp b/src/database/database-postgresql.cpp
index 92816205c..c1b81586d 100644
--- a/src/database/database-postgresql.cpp
+++ b/src/database/database-postgresql.cpp
@@ -90,13 +90,19 @@ void Database_PostgreSQL::connectToDatabase()
initStatements();
}
-void Database_PostgreSQL::verifyDatabase()
+void Database_PostgreSQL::pingDatabase()
{
- if (PQstatus(m_conn) == CONNECTION_OK)
- return;
-
- PQreset(m_conn);
- ping();
+ // 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::ping()
@@ -151,7 +157,7 @@ void Database_PostgreSQL::createTableIfNotExists(const std::string &table_name,
void Database_PostgreSQL::beginSave()
{
- verifyDatabase();
+ pingDatabase();
checkResults(PQexec(m_conn, "BEGIN;"));
}
@@ -227,7 +233,7 @@ bool MapDatabasePostgreSQL::saveBlock(const v3s16 &pos, const std::string &data)
return false;
}
- verifyDatabase();
+ pingDatabase();
s32 x, y, z;
x = htonl(pos.X);
@@ -251,7 +257,7 @@ bool MapDatabasePostgreSQL::saveBlock(const v3s16 &pos, const std::string &data)
void MapDatabasePostgreSQL::loadBlock(const v3s16 &pos, std::string *block)
{
- verifyDatabase();
+ pingDatabase();
s32 x, y, z;
x = htonl(pos.X);
@@ -275,7 +281,7 @@ void MapDatabasePostgreSQL::loadBlock(const v3s16 &pos, std::string *block)
bool MapDatabasePostgreSQL::deleteBlock(const v3s16 &pos)
{
- verifyDatabase();
+ pingDatabase();
s32 x, y, z;
x = htonl(pos.X);
@@ -293,7 +299,7 @@ bool MapDatabasePostgreSQL::deleteBlock(const v3s16 &pos)
void MapDatabasePostgreSQL::listAllLoadableBlocks(std::vector<v3s16> &dst)
{
- verifyDatabase();
+ pingDatabase();
PGresult *results = execPrepared("list_all_loadable_blocks", 0,
NULL, NULL, NULL, false, false);
@@ -435,7 +441,7 @@ void PlayerDatabasePostgreSQL::initStatements()
bool PlayerDatabasePostgreSQL::playerDataExists(const std::string &playername)
{
- verifyDatabase();
+ pingDatabase();
const char *values[] = { playername.c_str() };
PGresult *results = execPrepared("load_player", 1, values, false);
@@ -451,7 +457,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
if (!sao)
return;
- verifyDatabase();
+ pingDatabase();
v3f pos = sao->getBasePosition();
std::string pitch = ftos(sao->getLookPitch());
@@ -535,7 +541,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
{
sanity_check(sao);
- verifyDatabase();
+ pingDatabase();
const char *values[] = { player->getName() };
PGresult *results = execPrepared("load_player", 1, values, false, false);
@@ -610,7 +616,7 @@ bool PlayerDatabasePostgreSQL::removePlayer(const std::string &name)
if (!playerDataExists(name))
return false;
- verifyDatabase();
+ pingDatabase();
const char *values[] = { name.c_str() };
execPrepared("remove_player", 1, values);
@@ -620,7 +626,7 @@ bool PlayerDatabasePostgreSQL::removePlayer(const std::string &name)
void PlayerDatabasePostgreSQL::listPlayers(std::vector<std::string> &res)
{
- verifyDatabase();
+ pingDatabase();
PGresult *results = execPrepared("load_player_list", 0, NULL, false);