aboutsummaryrefslogtreecommitdiff
path: root/src/database/database-postgresql.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/database/database-postgresql.cpp')
-rw-r--r--src/database/database-postgresql.cpp433
1 files changed, 228 insertions, 205 deletions
diff --git a/src/database/database-postgresql.cpp b/src/database/database-postgresql.cpp
index 3d5e1947c..e1bb39928 100644
--- a/src/database/database-postgresql.cpp
+++ b/src/database/database-postgresql.cpp
@@ -23,12 +23,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "database-postgresql.h"
#ifdef _WIN32
-// Without this some of the network functions are not found on mingw
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0501
-#endif
-#include <windows.h>
-#include <winsock2.h>
+ // Without this some of the network functions are not found on mingw
+ #ifndef _WIN32_WINNT
+ #define _WIN32_WINNT 0x0501
+ #endif
+ #include <windows.h>
+ #include <winsock2.h>
#else
#include <netinet/in.h>
#endif
@@ -40,21 +40,19 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "server/player_sao.h"
Database_PostgreSQL::Database_PostgreSQL(const std::string &connect_string) :
- m_connect_string(connect_string)
+ m_connect_string(connect_string)
{
if (m_connect_string.empty()) {
throw SettingNotFoundException(
- "Set pgsql_connection string in world.mt to "
- "use the postgresql backend\n"
- "Notes:\n"
- "pgsql_connection has the following form: \n"
- "\tpgsql_connection = host=127.0.0.1 port=5432 "
- "user=mt_user "
- "password=mt_password dbname=minetest_world\n"
- "mt_user should have CREATE TABLE, INSERT, SELECT, "
- "UPDATE and "
- "DELETE rights on the database.\n"
- "Don't create mt_user as a SUPERUSER!");
+ "Set pgsql_connection string in world.mt to "
+ "use the postgresql backend\n"
+ "Notes:\n"
+ "pgsql_connection has the following form: \n"
+ "\tpgsql_connection = host=127.0.0.1 port=5432 user=mt_user "
+ "password=mt_password dbname=minetest_world\n"
+ "mt_user should have CREATE TABLE, INSERT, SELECT, UPDATE and "
+ "DELETE rights on the database.\n"
+ "Don't create mt_user as a SUPERUSER!");
}
}
@@ -68,24 +66,25 @@ void Database_PostgreSQL::connectToDatabase()
m_conn = PQconnectdb(m_connect_string.c_str());
if (PQstatus(m_conn) != CONNECTION_OK) {
- throw DatabaseException(std::string("PostgreSQL database error: ") +
- PQerrorMessage(m_conn));
+ throw DatabaseException(std::string(
+ "PostgreSQL database error: ") +
+ PQerrorMessage(m_conn));
}
m_pgversion = PQserverVersion(m_conn);
/*
- * We are using UPSERT feature from PostgreSQL 9.5
- * to have the better performance where possible.
- */
+ * We are using UPSERT feature from PostgreSQL 9.5
+ * to have the better performance where possible.
+ */
if (m_pgversion < 90500) {
warningstream << "Your PostgreSQL server lacks UPSERT "
- << "support. Use version 9.5 or better if possible."
- << std::endl;
+ << "support. Use version 9.5 or better if possible."
+ << std::endl;
}
infostream << "PostgreSQL Database: Version " << m_pgversion
- << " Connection made." << std::endl;
+ << " Connection made." << std::endl;
createDatabase();
initStatements();
@@ -103,8 +102,9 @@ void Database_PostgreSQL::verifyDatabase()
void Database_PostgreSQL::ping()
{
if (PQping(m_connect_string.c_str()) != PQPING_OK) {
- throw DatabaseException(std::string("PostgreSQL database error: ") +
- PQerrorMessage(m_conn));
+ throw DatabaseException(std::string(
+ "PostgreSQL database error: ") +
+ PQerrorMessage(m_conn));
}
}
@@ -123,8 +123,9 @@ PGresult *Database_PostgreSQL::checkResults(PGresult *result, bool clear)
break;
case PGRES_FATAL_ERROR:
default:
- throw DatabaseException(std::string("PostgreSQL database error: ") +
- PQresultErrorMessage(result));
+ throw DatabaseException(
+ std::string("PostgreSQL database error: ") +
+ PQresultErrorMessage(result));
}
if (clear)
@@ -133,11 +134,11 @@ PGresult *Database_PostgreSQL::checkResults(PGresult *result, bool clear)
return result;
}
-void Database_PostgreSQL::createTableIfNotExists(
- const std::string &table_name, const std::string &definition)
+void Database_PostgreSQL::createTableIfNotExists(const std::string &table_name,
+ const std::string &definition)
{
std::string sql_check_table = "SELECT relname FROM pg_class WHERE relname='" +
- table_name + "';";
+ table_name + "';";
PGresult *result = checkResults(PQexec(m_conn, sql_check_table.c_str()), false);
// If table doesn't exist, create it
@@ -164,57 +165,61 @@ void Database_PostgreSQL::rollback()
checkResults(PQexec(m_conn, "ROLLBACK;"));
}
-MapDatabasePostgreSQL::MapDatabasePostgreSQL(const std::string &connect_string) :
- Database_PostgreSQL(connect_string), MapDatabase()
+MapDatabasePostgreSQL::MapDatabasePostgreSQL(const std::string &connect_string):
+ Database_PostgreSQL(connect_string),
+ MapDatabase()
{
connectToDatabase();
}
+
void MapDatabasePostgreSQL::createDatabase()
{
- createTableIfNotExists("blocks", "CREATE TABLE blocks ("
- "posX INT NOT NULL,"
- "posY INT NOT NULL,"
- "posZ INT NOT NULL,"
- "data BYTEA,"
- "PRIMARY KEY (posX,posY,posZ)"
- ");");
+ createTableIfNotExists("blocks",
+ "CREATE TABLE blocks ("
+ "posX INT NOT NULL,"
+ "posY INT NOT NULL,"
+ "posZ INT NOT NULL,"
+ "data BYTEA,"
+ "PRIMARY KEY (posX,posY,posZ)"
+ ");"
+ );
infostream << "PostgreSQL: Map Database was initialized." << std::endl;
}
void MapDatabasePostgreSQL::initStatements()
{
- prepareStatement("read_block", "SELECT data FROM blocks "
- "WHERE posX = $1::int4 AND posY = $2::int4 AND "
- "posZ = $3::int4");
+ prepareStatement("read_block",
+ "SELECT data FROM blocks "
+ "WHERE posX = $1::int4 AND posY = $2::int4 AND "
+ "posZ = $3::int4");
if (getPGVersion() < 90500) {
prepareStatement("write_block_insert",
- "INSERT INTO blocks (posX, posY, posZ, data) SELECT "
+ "INSERT INTO blocks (posX, posY, posZ, data) SELECT "
"$1::int4, $2::int4, $3::int4, $4::bytea "
"WHERE NOT EXISTS (SELECT true FROM blocks "
"WHERE posX = $1::int4 AND posY = $2::int4 AND "
"posZ = $3::int4)");
prepareStatement("write_block_update",
- "UPDATE blocks SET data = $4::bytea "
+ "UPDATE blocks SET data = $4::bytea "
"WHERE posX = $1::int4 AND posY = $2::int4 AND "
"posZ = $3::int4");
} else {
prepareStatement("write_block",
- "INSERT INTO blocks (posX, posY, posZ, data) VALUES "
+ "INSERT INTO blocks (posX, posY, posZ, data) VALUES "
"($1::int4, $2::int4, $3::int4, $4::bytea) "
"ON CONFLICT ON CONSTRAINT blocks_pkey DO "
"UPDATE SET data = $4::bytea");
}
- prepareStatement("delete_block",
- "DELETE FROM blocks WHERE "
- "posX = $1::int4 AND posY = $2::int4 AND posZ = $3::int4");
+ prepareStatement("delete_block", "DELETE FROM blocks WHERE "
+ "posX = $1::int4 AND posY = $2::int4 AND posZ = $3::int4");
prepareStatement("list_all_loadable_blocks",
- "SELECT posX, posY, posZ FROM blocks");
+ "SELECT posX, posY, posZ FROM blocks");
}
bool MapDatabasePostgreSQL::saveBlock(const v3s16 &pos, const std::string &data)
@@ -222,8 +227,8 @@ bool MapDatabasePostgreSQL::saveBlock(const v3s16 &pos, const std::string &data)
// Verify if we don't overflow the platform integer with the mapblock size
if (data.size() > INT_MAX) {
errorstream << "Database_PostgreSQL::saveBlock: Data truncation! "
- << "data.size() over 0xFFFFFFFF (== " << data.size() << ")"
- << std::endl;
+ << "data.size() over 0xFFFFFFFF (== " << data.size()
+ << ")" << std::endl;
return false;
}
@@ -234,9 +239,11 @@ bool MapDatabasePostgreSQL::saveBlock(const v3s16 &pos, const std::string &data)
y = htonl(pos.Y);
z = htonl(pos.Z);
- const void *args[] = {&x, &y, &z, data.c_str()};
- const int argLen[] = {sizeof(x), sizeof(y), sizeof(z), (int)data.size()};
- const int argFmt[] = {1, 1, 1, 1};
+ const void *args[] = { &x, &y, &z, data.c_str() };
+ const int argLen[] = {
+ sizeof(x), sizeof(y), sizeof(z), (int)data.size()
+ };
+ const int argFmt[] = { 1, 1, 1, 1 };
if (getPGVersion() < 90500) {
execPrepared("write_block_update", ARRLEN(args), args, argLen, argFmt);
@@ -256,18 +263,17 @@ void MapDatabasePostgreSQL::loadBlock(const v3s16 &pos, std::string *block)
y = htonl(pos.Y);
z = htonl(pos.Z);
- const void *args[] = {&x, &y, &z};
- const int argLen[] = {sizeof(x), sizeof(y), sizeof(z)};
- const int argFmt[] = {1, 1, 1};
+ const void *args[] = { &x, &y, &z };
+ const int argLen[] = { sizeof(x), sizeof(y), sizeof(z) };
+ const int argFmt[] = { 1, 1, 1 };
- PGresult *results = execPrepared(
- "read_block", ARRLEN(args), args, argLen, argFmt, false);
+ PGresult *results = execPrepared("read_block", ARRLEN(args), args,
+ argLen, argFmt, false);
*block = "";
if (PQntuples(results))
- *block = std::string(
- PQgetvalue(results, 0, 0), PQgetlength(results, 0, 0));
+ *block = std::string(PQgetvalue(results, 0, 0), PQgetlength(results, 0, 0));
PQclear(results);
}
@@ -281,9 +287,9 @@ bool MapDatabasePostgreSQL::deleteBlock(const v3s16 &pos)
y = htonl(pos.Y);
z = htonl(pos.Z);
- const void *args[] = {&x, &y, &z};
- const int argLen[] = {sizeof(x), sizeof(y), sizeof(z)};
- const int argFmt[] = {1, 1, 1};
+ const void *args[] = { &x, &y, &z };
+ const int argLen[] = { sizeof(x), sizeof(y), sizeof(z) };
+ const int argFmt[] = { 1, 1, 1 };
execPrepared("delete_block", ARRLEN(args), args, argLen, argFmt);
@@ -294,8 +300,8 @@ void MapDatabasePostgreSQL::listAllLoadableBlocks(std::vector<v3s16> &dst)
{
verifyDatabase();
- PGresult *results = execPrepared(
- "list_all_loadable_blocks", 0, NULL, NULL, NULL, false, false);
+ PGresult *results = execPrepared("list_all_loadable_blocks", 0,
+ NULL, NULL, NULL, false, false);
int numrows = PQntuples(results);
@@ -308,63 +314,67 @@ void MapDatabasePostgreSQL::listAllLoadableBlocks(std::vector<v3s16> &dst)
/*
* Player Database
*/
-PlayerDatabasePostgreSQL::PlayerDatabasePostgreSQL(const std::string &connect_string) :
- Database_PostgreSQL(connect_string), PlayerDatabase()
+PlayerDatabasePostgreSQL::PlayerDatabasePostgreSQL(const std::string &connect_string):
+ Database_PostgreSQL(connect_string),
+ PlayerDatabase()
{
connectToDatabase();
}
+
void PlayerDatabasePostgreSQL::createDatabase()
{
- createTableIfNotExists("player", "CREATE TABLE player ("
- "name VARCHAR(60) NOT NULL,"
- "pitch NUMERIC(15, 7) NOT NULL,"
- "yaw NUMERIC(15, 7) NOT NULL,"
- "posX NUMERIC(15, 7) NOT NULL,"
- "posY NUMERIC(15, 7) NOT NULL,"
- "posZ NUMERIC(15, 7) NOT NULL,"
- "hp INT NOT NULL,"
- "breath INT NOT NULL,"
- "creation_date TIMESTAMP WITHOUT TIME ZONE NOT "
- "NULL DEFAULT NOW(),"
- "modification_date TIMESTAMP WITHOUT TIME ZONE "
- "NOT NULL DEFAULT NOW(),"
- "PRIMARY KEY (name)"
- ");");
-
- createTableIfNotExists("player_inventories", "CREATE TABLE player_inventories ("
- "player VARCHAR(60) NOT NULL,"
- "inv_id INT NOT NULL,"
- "inv_width INT NOT NULL,"
- "inv_name TEXT NOT NULL DEFAULT '',"
- "inv_size INT NOT NULL,"
- "PRIMARY KEY(player, inv_id),"
- "CONSTRAINT player_inventories_fkey "
- "FOREIGN KEY (player) REFERENCES "
- "player (name) ON DELETE CASCADE"
- ");");
+ createTableIfNotExists("player",
+ "CREATE TABLE player ("
+ "name VARCHAR(60) NOT NULL,"
+ "pitch NUMERIC(15, 7) NOT NULL,"
+ "yaw NUMERIC(15, 7) NOT NULL,"
+ "posX NUMERIC(15, 7) NOT NULL,"
+ "posY NUMERIC(15, 7) NOT NULL,"
+ "posZ NUMERIC(15, 7) NOT NULL,"
+ "hp INT NOT NULL,"
+ "breath INT NOT NULL,"
+ "creation_date TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW(),"
+ "modification_date TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW(),"
+ "PRIMARY KEY (name)"
+ ");"
+ );
+
+ createTableIfNotExists("player_inventories",
+ "CREATE TABLE player_inventories ("
+ "player VARCHAR(60) NOT NULL,"
+ "inv_id INT NOT NULL,"
+ "inv_width INT NOT NULL,"
+ "inv_name TEXT NOT NULL DEFAULT '',"
+ "inv_size INT NOT NULL,"
+ "PRIMARY KEY(player, inv_id),"
+ "CONSTRAINT player_inventories_fkey FOREIGN KEY (player) REFERENCES "
+ "player (name) ON DELETE CASCADE"
+ ");"
+ );
createTableIfNotExists("player_inventory_items",
- "CREATE TABLE player_inventory_items ("
+ "CREATE TABLE player_inventory_items ("
"player VARCHAR(60) NOT NULL,"
"inv_id INT NOT NULL,"
"slot_id INT NOT NULL,"
"item TEXT NOT NULL DEFAULT '',"
"PRIMARY KEY(player, inv_id, slot_id),"
- "CONSTRAINT player_inventory_items_fkey FOREIGN KEY (player) "
- "REFERENCES "
+ "CONSTRAINT player_inventory_items_fkey FOREIGN KEY (player) REFERENCES "
"player (name) ON DELETE CASCADE"
- ");");
+ ");"
+ );
createTableIfNotExists("player_metadata",
- "CREATE TABLE player_metadata ("
+ "CREATE TABLE player_metadata ("
"player VARCHAR(60) NOT NULL,"
"attr VARCHAR(256) NOT NULL,"
"value TEXT,"
"PRIMARY KEY(player, attr),"
"CONSTRAINT player_metadata_fkey FOREIGN KEY (player) REFERENCES "
"player (name) ON DELETE CASCADE"
- ");");
+ ");"
+ );
infostream << "PostgreSQL: Player Database was inited." << std::endl;
}
@@ -373,24 +383,18 @@ void PlayerDatabasePostgreSQL::initStatements()
{
if (getPGVersion() < 90500) {
prepareStatement("create_player",
- "INSERT INTO player(name, pitch, yaw, posX, posY, posZ, "
- "hp, breath) VALUES "
+ "INSERT INTO player(name, pitch, yaw, posX, posY, posZ, hp, breath) VALUES "
"($1, $2, $3, $4, $5, $6, $7::int, $8::int)");
prepareStatement("update_player",
- "UPDATE SET pitch = $2, yaw = $3, posX = $4, posY = $5, "
- "posZ = $6, hp = $7::int, "
- "breath = $8::int, modification_date = NOW() WHERE name "
- "= $1");
+ "UPDATE SET pitch = $2, yaw = $3, posX = $4, posY = $5, posZ = $6, hp = $7::int, "
+ "breath = $8::int, modification_date = NOW() WHERE name = $1");
} else {
prepareStatement("save_player",
- "INSERT INTO player(name, pitch, yaw, posX, posY, posZ, "
- "hp, breath) VALUES "
+ "INSERT INTO player(name, pitch, yaw, posX, posY, posZ, hp, breath) VALUES "
"($1, $2, $3, $4, $5, $6, $7::int, $8::int)"
- "ON CONFLICT ON CONSTRAINT player_pkey DO UPDATE SET "
- "pitch = $2, yaw = $3, "
- "posX = $4, posY = $5, posZ = $6, hp = $7::int, breath = "
- "$8::int, "
+ "ON CONFLICT ON CONSTRAINT player_pkey DO UPDATE SET pitch = $2, yaw = $3, "
+ "posX = $4, posY = $5, posZ = $6, hp = $7::int, breath = $8::int, "
"modification_date = NOW()");
}
@@ -399,47 +403,46 @@ void PlayerDatabasePostgreSQL::initStatements()
prepareStatement("load_player_list", "SELECT name FROM player");
prepareStatement("remove_player_inventories",
- "DELETE FROM player_inventories WHERE player = $1");
+ "DELETE FROM player_inventories WHERE player = $1");
prepareStatement("remove_player_inventory_items",
- "DELETE FROM player_inventory_items WHERE player = $1");
+ "DELETE FROM player_inventory_items WHERE player = $1");
prepareStatement("add_player_inventory",
- "INSERT INTO player_inventories (player, inv_id, inv_width, "
- "inv_name, inv_size) VALUES "
+ "INSERT INTO player_inventories (player, inv_id, inv_width, inv_name, inv_size) VALUES "
"($1, $2::int, $3::int, $4, $5::int)");
prepareStatement("add_player_inventory_item",
- "INSERT INTO player_inventory_items (player, inv_id, slot_id, "
- "item) VALUES "
+ "INSERT INTO player_inventory_items (player, inv_id, slot_id, item) VALUES "
"($1, $2::int, $3::int, $4)");
- prepareStatement("load_player_inventories", "SELECT inv_id, inv_width, inv_name, "
- "inv_size FROM player_inventories "
- "WHERE player = $1 ORDER BY inv_id");
+ prepareStatement("load_player_inventories",
+ "SELECT inv_id, inv_width, inv_name, inv_size FROM player_inventories "
+ "WHERE player = $1 ORDER BY inv_id");
prepareStatement("load_player_inventory_items",
- "SELECT slot_id, item FROM player_inventory_items WHERE "
+ "SELECT slot_id, item FROM player_inventory_items WHERE "
"player = $1 AND inv_id = $2::int");
- prepareStatement("load_player", "SELECT pitch, yaw, posX, posY, posZ, hp, breath "
- "FROM player WHERE name = $1");
+ prepareStatement("load_player",
+ "SELECT pitch, yaw, posX, posY, posZ, hp, breath FROM player WHERE name = $1");
prepareStatement("remove_player_metadata",
- "DELETE FROM player_metadata WHERE player = $1");
+ "DELETE FROM player_metadata WHERE player = $1");
- prepareStatement("save_player_metadata", "INSERT INTO player_metadata (player, "
- "attr, value) VALUES ($1, $2, $3)");
+ prepareStatement("save_player_metadata",
+ "INSERT INTO player_metadata (player, attr, value) VALUES ($1, $2, $3)");
prepareStatement("load_player_metadata",
- "SELECT attr, value FROM player_metadata WHERE player = $1");
+ "SELECT attr, value FROM player_metadata WHERE player = $1");
+
}
bool PlayerDatabasePostgreSQL::playerDataExists(const std::string &playername)
{
verifyDatabase();
- const char *values[] = {playername.c_str()};
+ const char *values[] = { playername.c_str() };
PGresult *results = execPrepared("load_player", 1, values, false);
bool res = (PQntuples(results) > 0);
@@ -449,7 +452,7 @@ bool PlayerDatabasePostgreSQL::playerDataExists(const std::string &playername)
void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
{
- PlayerSAO *sao = player->getPlayerSAO();
+ PlayerSAO* sao = player->getPlayerSAO();
if (!sao)
return;
@@ -463,11 +466,16 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
std::string posz = ftos(pos.Z);
std::string hp = itos(sao->getHP());
std::string breath = itos(sao->getBreath());
- const char *values[] = {player->getName(), pitch.c_str(), yaw.c_str(),
- posx.c_str(), posy.c_str(), posz.c_str(), hp.c_str(),
- breath.c_str()};
+ const char *values[] = {
+ player->getName(),
+ pitch.c_str(),
+ yaw.c_str(),
+ posx.c_str(), posy.c_str(), posz.c_str(),
+ hp.c_str(),
+ breath.c_str()
+ };
- const char *rmvalues[] = {player->getName()};
+ const char* rmvalues[] = { player->getName() };
beginSave();
if (getPGVersion() < 90500) {
@@ -475,23 +483,28 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
execPrepared("create_player", 8, values, true, false);
else
execPrepared("update_player", 8, values, true, false);
- } else
+ }
+ else
execPrepared("save_player", 8, values, true, false);
// Write player inventories
execPrepared("remove_player_inventories", 1, rmvalues);
execPrepared("remove_player_inventory_items", 1, rmvalues);
- std::vector<const InventoryList *> inventory_lists =
- sao->getInventory()->getLists();
+ std::vector<const InventoryList*> inventory_lists = sao->getInventory()->getLists();
for (u16 i = 0; i < inventory_lists.size(); i++) {
- const InventoryList *list = inventory_lists[i];
+ const InventoryList* list = inventory_lists[i];
const std::string &name = list->getName();
- std::string width = itos(list->getWidth()), inv_id = itos(i),
- lsize = itos(list->getSize());
-
- const char *inv_values[] = {player->getName(), inv_id.c_str(),
- width.c_str(), name.c_str(), lsize.c_str()};
+ std::string width = itos(list->getWidth()),
+ inv_id = itos(i), lsize = itos(list->getSize());
+
+ const char* inv_values[] = {
+ player->getName(),
+ inv_id.c_str(),
+ width.c_str(),
+ name.c_str(),
+ lsize.c_str()
+ };
execPrepared("add_player_inventory", 5, inv_values);
for (u32 j = 0; j < list->getSize(); j++) {
@@ -499,8 +512,12 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
list->getItem(j).serialize(os);
std::string itemStr = os.str(), slotId = itos(j);
- const char *invitem_values[] = {player->getName(), inv_id.c_str(),
- slotId.c_str(), itemStr.c_str()};
+ const char* invitem_values[] = {
+ player->getName(),
+ inv_id.c_str(),
+ slotId.c_str(),
+ itemStr.c_str()
+ };
execPrepared("add_player_inventory_item", 4, invitem_values);
}
}
@@ -508,8 +525,11 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
execPrepared("remove_player_metadata", 1, rmvalues);
const StringMap &attrs = sao->getMeta().getStrings();
for (const auto &attr : attrs) {
- const char *meta_values[] = {player->getName(), attr.first.c_str(),
- attr.second.c_str()};
+ const char *meta_values[] = {
+ player->getName(),
+ attr.first.c_str(),
+ attr.second.c_str()
+ };
execPrepared("save_player_metadata", 3, meta_values);
}
endSave();
@@ -522,7 +542,7 @@ bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
sanity_check(sao);
verifyDatabase();
- const char *values[] = {player->getName()};
+ const char *values[] = { player->getName() };
PGresult *results = execPrepared("load_player", 1, values, false, false);
// Player not found, return not found
@@ -533,10 +553,13 @@ bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
sao->setLookPitch(pg_to_float(results, 0, 0));
sao->setRotation(v3f(0, pg_to_float(results, 0, 1), 0));
- sao->setBasePosition(v3f(pg_to_float(results, 0, 2), pg_to_float(results, 0, 3),
- pg_to_float(results, 0, 4)));
- sao->setHPRaw((u16)pg_to_int(results, 0, 5));
- sao->setBreath((u16)pg_to_int(results, 0, 6), false);
+ sao->setBasePosition(v3f(
+ pg_to_float(results, 0, 2),
+ pg_to_float(results, 0, 3),
+ pg_to_float(results, 0, 4))
+ );
+ sao->setHPRaw((u16) pg_to_int(results, 0, 5));
+ sao->setBreath((u16) pg_to_int(results, 0, 6), false);
PQclear(results);
@@ -546,16 +569,19 @@ bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
int resultCount = PQntuples(results);
for (int row = 0; row < resultCount; ++row) {
- InventoryList *invList = player->inventory.addList(
- PQgetvalue(results, row, 2), pg_to_uint(results, row, 3));
+ InventoryList* invList = player->inventory.
+ addList(PQgetvalue(results, row, 2), pg_to_uint(results, row, 3));
invList->setWidth(pg_to_uint(results, row, 1));
u32 invId = pg_to_uint(results, row, 0);
std::string invIdStr = itos(invId);
- const char *values2[] = {player->getName(), invIdStr.c_str()};
- PGresult *results2 = execPrepared(
- "load_player_inventory_items", 2, values2, false, false);
+ const char* values2[] = {
+ player->getName(),
+ invIdStr.c_str()
+ };
+ PGresult *results2 = execPrepared("load_player_inventory_items", 2,
+ values2, false, false);
int resultCount2 = PQntuples(results2);
for (int row2 = 0; row2 < resultCount2; row2++) {
@@ -575,8 +601,7 @@ bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
int numrows = PQntuples(results);
for (int row = 0; row < numrows; row++) {
- sao->getMeta().setString(
- PQgetvalue(results, row, 0), PQgetvalue(results, row, 1));
+ sao->getMeta().setString(PQgetvalue(results, row, 0), PQgetvalue(results, row, 1));
}
sao->getMeta().setModified(false);
@@ -592,7 +617,7 @@ bool PlayerDatabasePostgreSQL::removePlayer(const std::string &name)
verifyDatabase();
- const char *values[] = {name.c_str()};
+ const char *values[] = { name.c_str() };
execPrepared("remove_player", 1, values);
return true;
@@ -619,48 +644,43 @@ AuthDatabasePostgreSQL::AuthDatabasePostgreSQL(const std::string &connect_string
void AuthDatabasePostgreSQL::createDatabase()
{
- createTableIfNotExists("auth", "CREATE TABLE auth ("
- "id SERIAL,"
- "name TEXT UNIQUE,"
- "password TEXT,"
- "last_login INT NOT NULL DEFAULT 0,"
- "PRIMARY KEY (id)"
- ");");
+ createTableIfNotExists("auth",
+ "CREATE TABLE auth ("
+ "id SERIAL,"
+ "name TEXT UNIQUE,"
+ "password TEXT,"
+ "last_login INT NOT NULL DEFAULT 0,"
+ "PRIMARY KEY (id)"
+ ");");
- createTableIfNotExists("user_privileges", "CREATE TABLE user_privileges ("
- "id INT,"
- "privilege TEXT,"
- "PRIMARY KEY (id, privilege),"
- "CONSTRAINT fk_id FOREIGN KEY (id) "
- "REFERENCES auth (id) ON DELETE CASCADE"
- ");");
+ createTableIfNotExists("user_privileges",
+ "CREATE TABLE user_privileges ("
+ "id INT,"
+ "privilege TEXT,"
+ "PRIMARY KEY (id, privilege),"
+ "CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES auth (id) ON DELETE CASCADE"
+ ");");
}
void AuthDatabasePostgreSQL::initStatements()
{
- prepareStatement("auth_read", "SELECT id, name, password, last_login FROM auth "
- "WHERE name = $1");
- prepareStatement("auth_write", "UPDATE auth SET name = $1, password = $2, "
- "last_login = $3 WHERE id = $4");
- prepareStatement("auth_create", "INSERT INTO auth (name, password, last_login) "
- "VALUES ($1, $2, $3) RETURNING id");
+ prepareStatement("auth_read", "SELECT id, name, password, last_login FROM auth WHERE name = $1");
+ prepareStatement("auth_write", "UPDATE auth SET name = $1, password = $2, last_login = $3 WHERE id = $4");
+ prepareStatement("auth_create", "INSERT INTO auth (name, password, last_login) VALUES ($1, $2, $3) RETURNING id");
prepareStatement("auth_delete", "DELETE FROM auth WHERE name = $1");
prepareStatement("auth_list_names", "SELECT name FROM auth ORDER BY name DESC");
- prepareStatement("auth_read_privs",
- "SELECT privilege FROM user_privileges WHERE id = $1");
- prepareStatement("auth_write_privs",
- "INSERT INTO user_privileges (id, privilege) VALUES ($1, $2)");
- prepareStatement(
- "auth_delete_privs", "DELETE FROM user_privileges WHERE id = $1");
+ prepareStatement("auth_read_privs", "SELECT privilege FROM user_privileges WHERE id = $1");
+ prepareStatement("auth_write_privs", "INSERT INTO user_privileges (id, privilege) VALUES ($1, $2)");
+ prepareStatement("auth_delete_privs", "DELETE FROM user_privileges WHERE id = $1");
}
bool AuthDatabasePostgreSQL::getAuth(const std::string &name, AuthEntry &res)
{
verifyDatabase();
- const char *values[] = {name.c_str()};
+ const char *values[] = { name.c_str() };
PGresult *result = execPrepared("auth_read", 1, values, false, false);
int numrows = PQntuples(result);
if (numrows == 0) {
@@ -676,7 +696,7 @@ bool AuthDatabasePostgreSQL::getAuth(const std::string &name, AuthEntry &res)
PQclear(result);
std::string playerIdStr = itos(res.id);
- const char *privsValues[] = {playerIdStr.c_str()};
+ const char *privsValues[] = { playerIdStr.c_str() };
PGresult *results = execPrepared("auth_read_privs", 1, privsValues, false);
numrows = PQntuples(results);
@@ -697,10 +717,10 @@ bool AuthDatabasePostgreSQL::saveAuth(const AuthEntry &authEntry)
std::string lastLoginStr = itos(authEntry.last_login);
std::string idStr = itos(authEntry.id);
const char *values[] = {
- authEntry.name.c_str(),
- authEntry.password.c_str(),
- lastLoginStr.c_str(),
- idStr.c_str(),
+ authEntry.name.c_str() ,
+ authEntry.password.c_str(),
+ lastLoginStr.c_str(),
+ idStr.c_str(),
};
execPrepared("auth_write", 4, values);
@@ -715,8 +735,11 @@ bool AuthDatabasePostgreSQL::createAuth(AuthEntry &authEntry)
verifyDatabase();
std::string lastLoginStr = itos(authEntry.last_login);
- const char *values[] = {authEntry.name.c_str(), authEntry.password.c_str(),
- lastLoginStr.c_str()};
+ const char *values[] = {
+ authEntry.name.c_str() ,
+ authEntry.password.c_str(),
+ lastLoginStr.c_str()
+ };
beginSave();
@@ -724,8 +747,7 @@ bool AuthDatabasePostgreSQL::createAuth(AuthEntry &authEntry)
int numrows = PQntuples(result);
if (numrows == 0) {
- errorstream << "Strange behaviour on auth creation, no ID returned."
- << std::endl;
+ errorstream << "Strange behaviour on auth creation, no ID returned." << std::endl;
PQclear(result);
rollback();
return false;
@@ -744,7 +766,7 @@ bool AuthDatabasePostgreSQL::deleteAuth(const std::string &name)
{
verifyDatabase();
- const char *values[] = {name.c_str()};
+ const char *values[] = { name.c_str() };
execPrepared("auth_delete", 1, values);
// privileges deleted by foreign key on delete cascade
@@ -755,8 +777,8 @@ void AuthDatabasePostgreSQL::listNames(std::vector<std::string> &res)
{
verifyDatabase();
- PGresult *results = execPrepared(
- "auth_list_names", 0, NULL, NULL, NULL, false, false);
+ PGresult *results = execPrepared("auth_list_names", 0,
+ NULL, NULL, NULL, false, false);
int numrows = PQntuples(results);
@@ -774,13 +796,14 @@ void AuthDatabasePostgreSQL::reload()
void AuthDatabasePostgreSQL::writePrivileges(const AuthEntry &authEntry)
{
std::string authIdStr = itos(authEntry.id);
- const char *values[] = {authIdStr.c_str()};
+ const char *values[] = { authIdStr.c_str() };
execPrepared("auth_delete_privs", 1, values);
for (const std::string &privilege : authEntry.privileges) {
- const char *values[] = {authIdStr.c_str(), privilege.c_str()};
+ const char *values[] = { authIdStr.c_str(), privilege.c_str() };
execPrepared("auth_write_privs", 2, values);
}
}
+
#endif // USE_POSTGRESQL