diff options
Diffstat (limited to 'src/database/database-postgresql.cpp')
-rw-r--r-- | src/database/database-postgresql.cpp | 433 |
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 |