From fcd9b55ea7a32a47ad46fa2d373bd7c7b0e9a093 Mon Sep 17 00:00:00 2001 From: dongresource Date: Mon, 14 Dec 2020 22:37:42 +0100 Subject: [PATCH] Clean up formatting in Database.cpp * Single quotes for strings * Semicolons at the end of all commands * No double colons around identifiers * Spaces for alignment * Some parts indented for readability Not everything is perfectly consistent, but it should all be pretty readable now. Non-SQL changes: * Opening braces shouldn't be on their own line * Removed trailing spaces * exit(1) should be used instead of terminate(0) during server init --- src/Database.cpp | 748 +++++++++++++++++++++++------------------------ 1 file changed, 367 insertions(+), 381 deletions(-) diff --git a/src/Database.cpp b/src/Database.cpp index ae4ac52..f77727f 100644 --- a/src/Database.cpp +++ b/src/Database.cpp @@ -23,15 +23,14 @@ std::mutex dbCrit; sqlite3* db; void Database::open() { - int rc = sqlite3_open(settings::DBPATH.c_str(), &db); if (rc != SQLITE_OK) { std::cout << "[FATAL] Cannot open database: " << sqlite3_errmsg(db) << std::endl; - terminate(0); + exit(1); } // foreign keys in sqlite are off by default; enable them - sqlite3_exec(db, "PRAGMA foreign_keys=ON", NULL, NULL, NULL); + sqlite3_exec(db, "PRAGMA foreign_keys=ON;", NULL, NULL, NULL); checkMetaTable(); createTables(); @@ -53,36 +52,33 @@ void Database::open() { } void Database::close() { - // TODO: Save everything to db? sqlite3_close(db); } void Database::checkMetaTable() { - // first check if meta table exists const char* sql = R"( - SELECT COUNT (*) FROM sqlite_master WHERE type="table" AND name="Meta"; + SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='Meta'; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (sqlite3_step(stmt) != SQLITE_ROW) { sqlite3_finalize(stmt); std::cout << "[FATAL] Failed to check meta table" << std::endl; - terminate(0); + exit(1); } int count = sqlite3_column_int(stmt, 0); if (count == 0) { - // check if there's other non-internal tables first sql = R"( - SELECT COUNT (*) FROM sqlite_master WHERE type="table" AND name NOT LIKE "sqlite_%"; + SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (sqlite3_step(stmt) != SQLITE_ROW || sqlite3_column_int(stmt, 0) != 0) { sqlite3_finalize(stmt); std::cout << "[FATAL] Existing DB is outdated" << std::endl; - terminate(0); + exit(1); } // create meta table @@ -92,31 +88,31 @@ void Database::checkMetaTable() { // check protocol version sql = R"( - SELECT "Value" FROM "Meta" WHERE "Key" = "ProtocolVersion"; + SELECT Value FROM Meta WHERE Key = 'ProtocolVersion'; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (sqlite3_step(stmt) != SQLITE_ROW) { sqlite3_finalize(stmt); std::cout << "[FATAL] Failed to check DB Protocol Version" << std::endl; - terminate(0); + exit(1); } if (sqlite3_column_int(stmt, 0) != PROTOCOL_VERSION) { sqlite3_finalize(stmt); std::cout << "[FATAL] DB Protocol Version doesn't match Server Build" << std::endl; - terminate(0); + exit(1); } sql = R"( - SELECT "Value" FROM "Meta" WHERE "Key" = "DatabaseVersion"; + SELECT Value FROM Meta WHERE Key = 'DatabaseVersion'; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); - + if (sqlite3_step(stmt) != SQLITE_ROW) { std::cout << "[FATAL] Failed to check DB Version" << std::endl; sqlite3_finalize(stmt); - terminate(0); + exit(1); } int dbVersion = sqlite3_column_int(stmt, 0); @@ -125,7 +121,7 @@ void Database::checkMetaTable() { if (dbVersion != DATABASE_VERSION) { // we should be handling migrations here in the future std::cout << "[FATAL] DB Version doesn't match Server Build" << std::endl; - terminate(0); + exit(1); } } @@ -135,10 +131,10 @@ void Database::createMetaTable() { sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL); const char* sql = R"( - CREATE TABLE "Meta"( - "Key" TEXT NOT NULL UNIQUE, - "Value" INTEGER NOT NULL, - "Created" INTEGER DEFAULT (strftime('%s', 'now')) + CREATE TABLE Meta( + Key TEXT NOT NULL UNIQUE, + Value INTEGER NOT NULL, + Created INTEGER DEFAULT (strftime('%s', 'now')) ); )"; sqlite3_stmt* stmt; @@ -147,11 +143,11 @@ void Database::createMetaTable() { sqlite3_finalize(stmt); sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); std::cout << "[FATAL] Failed to create meta table" << std::endl; - terminate(0); + exit(1); } sql = R"( - INSERT INTO "Meta" ("Key", "Value") + INSERT INTO Meta (Key, Value) VALUES (?, ?); )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -162,7 +158,7 @@ void Database::createMetaTable() { sqlite3_finalize(stmt); sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); std::cout << "[FATAL] Failed to create meta table" << std::endl; - terminate(0); + exit(1); } sqlite3_reset(stmt); @@ -174,7 +170,7 @@ void Database::createMetaTable() { if (rc != SQLITE_DONE) { sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); std::cout << "[FATAL] Failed to create meta table" << std::endl; - terminate(0); + exit(1); } sqlite3_exec(db, "COMMIT;", NULL, NULL, NULL); @@ -188,170 +184,170 @@ void Database::createTables() { const char* sql; sql = R"( - CREATE TABLE IF NOT EXISTS "Accounts" ( - "AccountID" INTEGER NOT NULL, - "Login" TEXT NOT NULL UNIQUE, - "Password" TEXT NOT NULL, - "Selected" INTEGER DEFAULT 1 NOT NULL, - "AccountLevel" INTEGER NOT NULL, - "Created" INTEGER DEFAULT (strftime('%s', 'now')) NOT NULL, - "LastLogin" INTEGER DEFAULT (strftime('%s', 'now')) NOT NULL, - "BannedUntil" INTEGER DEFAULT 0 NOT NULL, - "BannedSince" INTEGER DEFAULT 0 NOT NULL, - PRIMARY KEY("AccountID" AUTOINCREMENT) + CREATE TABLE IF NOT EXISTS Accounts ( + AccountID INTEGER NOT NULL, + Login TEXT NOT NULL UNIQUE, + Password TEXT NOT NULL, + Selected INTEGER DEFAULT 1 NOT NULL, + AccountLevel INTEGER NOT NULL, + Created INTEGER DEFAULT (strftime('%s', 'now')) NOT NULL, + LastLogin INTEGER DEFAULT (strftime('%s', 'now')) NOT NULL, + BannedUntil INTEGER DEFAULT 0 NOT NULL, + BannedSince INTEGER DEFAULT 0 NOT NULL, + PRIMARY KEY(AccountID AUTOINCREMENT) ); - CREATE TABLE IF NOT EXISTS "Players" ( - "PlayerID" INTEGER NOT NULL, - "AccountID" INTEGER NOT NULL, - "FirstName" TEXT NOT NULL COLLATE NOCASE, - "LastName" TEXT NOT NULL COLLATE NOCASE, - "NameCheck" INTEGER NOT NULL, - "Slot" INTEGER NOT NULL, - "Created" INTEGER DEFAULT (strftime('%s', 'now')) NOT NULL, - "LastLogin" INTEGER DEFAULT (strftime('%s', 'now')) NOT NULL, - "Level" INTEGER DEFAULT 1 NOT NULL, - "Nano1" INTEGER DEFAULT 0 NOT NULL, - "Nano2" INTEGER DEFAULT 0 NOT NULL, - "Nano3" INTEGER DEFAULT 0 NOT NULL, - "AppearanceFlag" INTEGER DEFAULT 0 NOT NULL, - "TutorialFlag" INTEGER DEFAULT 0 NOT NULL, - "PayZoneFlag" INTEGER DEFAULT 0 NOT NULL, - "XCoordinates" INTEGER NOT NULL, - "YCoordinates" INTEGER NOT NULL, - "ZCoordinates" INTEGER NOT NULL, - "Angle" INTEGER NOT NULL, - "HP" INTEGER NOT NULL, - "FusionMatter" INTEGER DEFAULT 0 NOT NULL, - "Taros" INTEGER DEFAULT 0 NOT NULL, - "BatteryW" INTEGER DEFAULT 0 NOT NULL, - "BatteryN" INTEGER DEFAULT 0 NOT NULL, - "Mentor" INTEGER DEFAULT 5 NOT NULL, - "CurrentMissionID" INTEGER DEFAULT 0 NOT NULL, - "WarpLocationFlag" INTEGER DEFAULT 0 NOT NULL, - "SkywayLocationFlag" BLOB NOT NULL, - "FirstUseFlag" BLOB NOT NULL, - "Quests" BLOB NOT NULL, - PRIMARY KEY("PlayerID" AUTOINCREMENT), - FOREIGN KEY("AccountID") REFERENCES "Accounts"("AccountID") ON DELETE CASCADE, - UNIQUE ("AccountID", "Slot"), - UNIQUE ("FirstName", "LastName") + CREATE TABLE IF NOT EXISTS Players ( + PlayerID INTEGER NOT NULL, + AccountID INTEGER NOT NULL, + FirstName TEXT NOT NULL COLLATE NOCASE, + LastName TEXT NOT NULL COLLATE NOCASE, + NameCheck INTEGER NOT NULL, + Slot INTEGER NOT NULL, + Created INTEGER DEFAULT (strftime('%s', 'now')) NOT NULL, + LastLogin INTEGER DEFAULT (strftime('%s', 'now')) NOT NULL, + Level INTEGER DEFAULT 1 NOT NULL, + Nano1 INTEGER DEFAULT 0 NOT NULL, + Nano2 INTEGER DEFAULT 0 NOT NULL, + Nano3 INTEGER DEFAULT 0 NOT NULL, + AppearanceFlag INTEGER DEFAULT 0 NOT NULL, + TutorialFlag INTEGER DEFAULT 0 NOT NULL, + PayZoneFlag INTEGER DEFAULT 0 NOT NULL, + XCoordinates INTEGER NOT NULL, + YCoordinates INTEGER NOT NULL, + ZCoordinates INTEGER NOT NULL, + Angle INTEGER NOT NULL, + HP INTEGER NOT NULL, + FusionMatter INTEGER DEFAULT 0 NOT NULL, + Taros INTEGER DEFAULT 0 NOT NULL, + BatteryW INTEGER DEFAULT 0 NOT NULL, + BatteryN INTEGER DEFAULT 0 NOT NULL, + Mentor INTEGER DEFAULT 5 NOT NULL, + CurrentMissionID INTEGER DEFAULT 0 NOT NULL, + WarpLocationFlag INTEGER DEFAULT 0 NOT NULL, + SkywayLocationFlag BLOB NOT NULL, + FirstUseFlag BLOB NOT NULL, + Quests BLOB NOT NULL, + PRIMARY KEY(PlayerID AUTOINCREMENT), + FOREIGN KEY(AccountID) REFERENCES Accounts(AccountID) ON DELETE CASCADE, + UNIQUE (AccountID, Slot), + UNIQUE (FirstName, LastName) ); - CREATE TABLE IF NOT EXISTS "Appearances" ( - "PlayerID" INTEGER UNIQUE NOT NULL, - "Body" INTEGER DEFAULT 0 NOT NULL, - "EyeColor" INTEGER DEFAULT 1 NOT NULL, - "FaceStyle" INTEGER DEFAULT 1 NOT NULL, - "Gender" INTEGER DEFAULT 1 NOT NULL, - "HairColor" INTEGER DEFAULT 1 NOT NULL, - "HairStyle" INTEGER DEFAULT 1 NOT NULL, - "Height" INTEGER DEFAULT 0 NOT NULL, - "SkinColor" INTEGER DEFAULT 1 NOT NULL, - FOREIGN KEY("PlayerID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE + CREATE TABLE IF NOT EXISTS Appearances ( + PlayerID INTEGER UNIQUE NOT NULL, + Body INTEGER DEFAULT 0 NOT NULL, + EyeColor INTEGER DEFAULT 1 NOT NULL, + FaceStyle INTEGER DEFAULT 1 NOT NULL, + Gender INTEGER DEFAULT 1 NOT NULL, + HairColor INTEGER DEFAULT 1 NOT NULL, + HairStyle INTEGER DEFAULT 1 NOT NULL, + Height INTEGER DEFAULT 0 NOT NULL, + SkinColor INTEGER DEFAULT 1 NOT NULL, + FOREIGN KEY(PlayerID) REFERENCES Players(PlayerID) ON DELETE CASCADE ); - CREATE TABLE IF NOT EXISTS "Inventory" ( - "PlayerID" INTEGER NOT NULL, - "Slot" INTEGER NOT NULL, - "ID" INTEGER NOT NULL, - "Type" INTEGER NOT NULL, - "Opt" INTEGER NOT NULL, - "TimeLimit" INTEGER DEFAULT 0 NOT NULL, - FOREIGN KEY("PlayerID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE, - UNIQUE ("PlayerID", "Slot") + CREATE TABLE IF NOT EXISTS Inventory ( + PlayerID INTEGER NOT NULL, + Slot INTEGER NOT NULL, + ID INTEGER NOT NULL, + Type INTEGER NOT NULL, + Opt INTEGER NOT NULL, + TimeLimit INTEGER DEFAULT 0 NOT NULL, + FOREIGN KEY(PlayerID) REFERENCES Players(PlayerID) ON DELETE CASCADE, + UNIQUE (PlayerID, Slot) ); - CREATE TABLE IF NOT EXISTS "QuestItems" ( - "PlayerID" INTEGER NOT NULL, - "Slot" INTEGER NOT NULL, - "ID" INTEGER NOT NULL, - "Opt" INTEGER NOT NULL, - FOREIGN KEY("PlayerID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE, - UNIQUE ("PlayerID", "Slot") - ); - - CREATE TABLE IF NOT EXISTS "Nanos" ( - "PlayerID" INTEGER NOT NULL, - "ID" INTEGER NOT NULL, - "Skill" INTEGER NOT NULL, - "Stamina" INTEGER DEFAULT 150 NOT NULL, - FOREIGN KEY("PlayerID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE, - UNIQUE ("PlayerID", "ID") + CREATE TABLE IF NOT EXISTS QuestItems ( + PlayerID INTEGER NOT NULL, + Slot INTEGER NOT NULL, + ID INTEGER NOT NULL, + Opt INTEGER NOT NULL, + FOREIGN KEY(PlayerID) REFERENCES Players(PlayerID) ON DELETE CASCADE, + UNIQUE (PlayerID, Slot) ); - CREATE TABLE IF NOT EXISTS "RunningQuests" ( - "PlayerID" INTEGER NOT NULL, - "TaskID" INTEGER NOT NULL, - "RemainingNPCCount1" INTEGER NOT NULL, - "RemainingNPCCount2" INTEGER NOT NULL, - "RemainingNPCCount3" INTEGER NOT NULL, - FOREIGN KEY("PlayerID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE + CREATE TABLE IF NOT EXISTS Nanos ( + PlayerID INTEGER NOT NULL, + ID INTEGER NOT NULL, + Skill INTEGER NOT NULL, + Stamina INTEGER DEFAULT 150 NOT NULL, + FOREIGN KEY(PlayerID) REFERENCES Players(PlayerID) ON DELETE CASCADE, + UNIQUE (PlayerID, ID) ); - CREATE TABLE IF NOT EXISTS "Buddyships" ( - "PlayerAID" INTEGER NOT NULL, - "PlayerBID" INTEGER NOT NULL, - FOREIGN KEY("PlayerAID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE, - FOREIGN KEY("PlayerBID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE + CREATE TABLE IF NOT EXISTS RunningQuests ( + PlayerID INTEGER NOT NULL, + TaskID INTEGER NOT NULL, + RemainingNPCCount1 INTEGER NOT NULL, + RemainingNPCCount2 INTEGER NOT NULL, + RemainingNPCCount3 INTEGER NOT NULL, + FOREIGN KEY(PlayerID) REFERENCES Players(PlayerID) ON DELETE CASCADE ); - CREATE TABLE IF NOT EXISTS "Blocks" ( - "PlayerID" INTEGER NOT NULL, - "BlockedPlayerID" INTEGER NOT NULL, - FOREIGN KEY("PlayerID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE, - FOREIGN KEY("BlockedPlayerID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE + CREATE TABLE IF NOT EXISTS Buddyships ( + PlayerAID INTEGER NOT NULL, + PlayerBID INTEGER NOT NULL, + FOREIGN KEY(PlayerAID) REFERENCES Players(PlayerID) ON DELETE CASCADE, + FOREIGN KEY(PlayerBID) REFERENCES Players(PlayerID) ON DELETE CASCADE ); - CREATE TABLE IF NOT EXISTS "EmailData" ( - "PlayerID" INTEGER NOT NULL, - "MsgIndex" INTEGER NOT NULL, - "ReadFlag" INTEGER NOT NULL, - "ItemFlag" INTEGER NOT NULL, - "SenderID" INTEGER NOT NULL, - "SenderFirstName" TEXT NOT NULL COLLATE NOCASE, - "SenderLastName" TEXT NOT NULL COLLATE NOCASE, - "SubjectLine" TEXT NOT NULL, - "MsgBody" TEXT NOT NULL, - "Taros" INTEGER NOT NULL, - "SendTime" INTEGER NOT NULL, - "DeleteTime" INTEGER NOT NULL, - FOREIGN KEY("PlayerID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE, - UNIQUE("PlayerID", "MsgIndex") + CREATE TABLE IF NOT EXISTS Blocks ( + PlayerID INTEGER NOT NULL, + BlockedPlayerID INTEGER NOT NULL, + FOREIGN KEY(PlayerID) REFERENCES Players(PlayerID) ON DELETE CASCADE, + FOREIGN KEY(BlockedPlayerID) REFERENCES Players(PlayerID) ON DELETE CASCADE ); - CREATE TABLE IF NOT EXISTS "EmailItems" ( - "PlayerID" INTEGER NOT NULL, - "MsgIndex" INTEGER NOT NULL, - "Slot" INTEGER NOT NULL, - "ID" INTEGER NOT NULL, - "Type" INTEGER NOT NULL, - "Opt" INTEGER NOT NULL, - "TimeLimit" INTEGER NOT NULL, - FOREIGN KEY("PlayerID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE, - UNIQUE ("MsgIndex", "Slot") + CREATE TABLE IF NOT EXISTS EmailData ( + PlayerID INTEGER NOT NULL, + MsgIndex INTEGER NOT NULL, + ReadFlag INTEGER NOT NULL, + ItemFlag INTEGER NOT NULL, + SenderID INTEGER NOT NULL, + SenderFirstName TEXT NOT NULL COLLATE NOCASE, + SenderLastName TEXT NOT NULL COLLATE NOCASE, + SubjectLine TEXT NOT NULL, + MsgBody TEXT NOT NULL, + Taros INTEGER NOT NULL, + SendTime INTEGER NOT NULL, + DeleteTime INTEGER NOT NULL, + FOREIGN KEY(PlayerID) REFERENCES Players(PlayerID) ON DELETE CASCADE, + UNIQUE(PlayerID, MsgIndex) ); - CREATE TABLE IF NOT EXISTS "RaceResults"( - "EPID" INTEGER NOT NULL, - "PlayerID" INTEGER NOT NULL, - "Score" INTEGER NOT NULL, - "Timestamp" INTEGER NOT NULL, - FOREIGN KEY("PlayerID") REFERENCES "Players"("PlayerID") ON DELETE CASCADE - ) + CREATE TABLE IF NOT EXISTS EmailItems ( + PlayerID INTEGER NOT NULL, + MsgIndex INTEGER NOT NULL, + Slot INTEGER NOT NULL, + ID INTEGER NOT NULL, + Type INTEGER NOT NULL, + Opt INTEGER NOT NULL, + TimeLimit INTEGER NOT NULL, + FOREIGN KEY(PlayerID) REFERENCES Players(PlayerID) ON DELETE CASCADE, + UNIQUE (MsgIndex, Slot) + ); + + CREATE TABLE IF NOT EXISTS RaceResults( + EPID INTEGER NOT NULL, + PlayerID INTEGER NOT NULL, + Score INTEGER NOT NULL, + Timestamp INTEGER NOT NULL, + FOREIGN KEY(PlayerID) REFERENCES Players(PlayerID) ON DELETE CASCADE + ); )"; int rc = sqlite3_exec(db, sql, NULL, NULL, &errMsg); if (rc != SQLITE_OK) { std::cout << "[FATAL] Database failed to create tables: " << errMsg << std::endl; - terminate(0); + exit(1); } } int Database::getTableSize(std::string tableName) { std::lock_guard lock(dbCrit); - const char* sql = "SELECT COUNT(*) FROM ?;"; + const char* sql = "SELECT COUNT(*) FROM ?"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_text(stmt, 1, tableName.c_str(), -1, NULL); @@ -365,18 +361,17 @@ void Database::findAccount(Account* account, std::string login) { std::lock_guard lock(dbCrit); const char* sql = R"( - SELECT "AccountID", "Password", "Selected", "BannedUntil" - FROM "Accounts" - WHERE "Login" = ? - LIMIT 1; + SELECT AccountID, Password, Selected, BannedUntil + FROM Accounts + WHERE Login = ? + LIMIT 1; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_text(stmt, 1, login.c_str(), -1, NULL); int rc = sqlite3_step(stmt); - if (rc == SQLITE_ROW) - { + if (rc == SQLITE_ROW) { account->AccountID = sqlite3_column_int(stmt, 0); account->Password = std::string(reinterpret_cast(sqlite3_column_text(stmt, 1))); account->Selected = sqlite3_column_int(stmt, 2); @@ -389,8 +384,7 @@ int Database::addAccount(std::string login, std::string password) { std::lock_guard lock(dbCrit); const char* sql = R"( - INSERT INTO "Accounts" - ("Login", "Password", "AccountLevel") + INSERT INTO Accounts (Login, Password, AccountLevel) VALUES (?, ?, ?); )"; sqlite3_stmt* stmt; @@ -414,10 +408,10 @@ void Database::banAccount(int accountId, int days) { std::lock_guard lock(dbCrit); const char* sql = R"( - UPDATE "Accounts" - SET "BannedSince" = (strftime('%s', 'now')), - "BannedUntil" = (strftime('%s', 'now')) + ? - WHERE "AccountID" = ?; + UPDATE Accounts SET + BannedSince = (strftime('%s', 'now')), + BannedUntil = (strftime('%s', 'now')) + ? + WHERE AccountID = ?; )"; sqlite3_stmt* stmt; @@ -439,9 +433,10 @@ void Database::updateSelected(int accountId, int slot) { } const char* sql = R"( - UPDATE "Accounts" - SET "Selected" = ?, "LastLogin" = (strftime('%s', 'now')) - WHERE "AccountID" = ?; + UPDATE Accounts SET + Selected = ?, + LastLogin = (strftime('%s', 'now')) + WHERE AccountID = ?; )"; sqlite3_stmt* stmt; @@ -461,10 +456,10 @@ bool Database::validateCharacter(int characterID, int userID) { // query whatever const char* sql = R"( - SELECT "PlayerID" - FROM "Players" - WHERE "PlayerID" = ? AND "AccountID" = ? - LIMIT 1; + SELECT PlayerID + FROM Players + WHERE PlayerID = ? AND AccountID = ? + LIMIT 1; )"; sqlite3_stmt* stmt; @@ -483,9 +478,9 @@ bool Database::isNameFree(std::string firstName, std::string lastName) { const char* sql = R"( SELECT COUNT(*) - FROM "Players" - WHERE "FirstName" = ? AND "LastName" = ? - LIMIT 1; + FROM Players + WHERE FirstName = ? AND LastName = ? + LIMIT 1; )"; sqlite3_stmt* stmt; @@ -493,7 +488,7 @@ bool Database::isNameFree(std::string firstName, std::string lastName) { sqlite3_bind_text(stmt, 1, firstName.c_str(), -1, NULL); sqlite3_bind_text(stmt, 2, lastName.c_str(), -1, NULL); int rc = sqlite3_step(stmt); - + bool result = (rc == SQLITE_ROW && sqlite3_column_int(stmt, 0) == 0); sqlite3_finalize(stmt); return result; @@ -508,9 +503,9 @@ bool Database::isSlotFree(int accountId, int slotNum) { } const char* sql = R"( - SELECT COUNT (*) - FROM "Players" - WHERE "AccountID" = ? AND "Slot" = ? + SELECT COUNT(*) + FROM Players + WHERE AccountID = ? AND Slot = ? LIMIT 1; )"; sqlite3_stmt* stmt; @@ -527,19 +522,20 @@ bool Database::isSlotFree(int accountId, int slotNum) { int Database::createCharacter(sP_CL2LS_REQ_SAVE_CHAR_NAME* save, int AccountID) { std::lock_guard lock(dbCrit); - + sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL); const char* sql = R"( - INSERT INTO "Players" - ("AccountID", "Slot", "FirstName", "LastName", "XCoordinates" , "YCoordinates", "ZCoordinates", "Angle", - "HP", "NameCheck", "Quests", "SkywayLocationFlag", "FirstUseFlag") + INSERT INTO Players + (AccountID, Slot, FirstName, LastName, + XCoordinates, YCoordinates, ZCoordinates, Angle, + HP, NameCheck, Quests, SkywayLocationFlag, FirstUseFlag) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); - )"; + )"; sqlite3_stmt* stmt; std::string firstName = U16toU8(save->szFirstName); std::string lastName = U16toU8(save->szLastName); - + sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, AccountID); sqlite3_bind_int(stmt, 2, save->iSlotNum); @@ -560,7 +556,7 @@ int Database::createCharacter(sP_CL2LS_REQ_SAVE_CHAR_NAME* save, int AccountID) sqlite3_bind_blob(stmt, 11, blobBuffer, sizeof(Player::aQuestFlag), NULL); sqlite3_bind_blob(stmt, 12, blobBuffer, sizeof(Player::aSkywayLocationFlag), NULL); sqlite3_bind_blob(stmt, 13, blobBuffer, sizeof(Player::iFirstUseFlag), NULL); - + if (sqlite3_step(stmt) != SQLITE_DONE) { sqlite3_finalize(stmt); sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); @@ -568,10 +564,9 @@ int Database::createCharacter(sP_CL2LS_REQ_SAVE_CHAR_NAME* save, int AccountID) } int playerId = sqlite3_last_insert_rowid(db); - + sql = R"( - INSERT INTO "Appearances" - ("PlayerID") + INSERT INTO Appearances (PlayerID) VALUES (?); )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -594,9 +589,9 @@ bool Database::finishCharacter(sP_CL2LS_REQ_CHAR_CREATE* character, int accountI sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL); const char* sql = R"( - UPDATE "Players" - SET "AppearanceFlag" = 1 - WHERE "PlayerID" = ? AND "AccountID" = ? AND "AppearanceFlag" = 0; + UPDATE Players + SET AppearanceFlag = 1 + WHERE PlayerID = ? AND AccountID = ? AND AppearanceFlag = 0; )"; sqlite3_stmt* stmt; @@ -604,25 +599,24 @@ bool Database::finishCharacter(sP_CL2LS_REQ_CHAR_CREATE* character, int accountI sqlite3_bind_int(stmt, 1, character->PCStyle.iPC_UID); sqlite3_bind_int(stmt, 2, accountId); - if (sqlite3_step(stmt) != SQLITE_DONE) - { + if (sqlite3_step(stmt) != SQLITE_DONE) { sqlite3_finalize(stmt); sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); return false; } sql = R"( - UPDATE "Appearances" + UPDATE Appearances SET - "Body" = ? , - "EyeColor" = ? , - "FaceStyle" = ? , - "Gender" = ? , - "HairColor" = ? , - "HairStyle" = ? , - "Height" = ? , - "SkinColor" = ? - WHERE "PlayerID" = ? ; + Body = ?, + EyeColor = ?, + FaceStyle = ?, + Gender = ?, + HairColor = ?, + HairStyle = ?, + Height = ?, + SkinColor = ? + WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -636,16 +630,14 @@ bool Database::finishCharacter(sP_CL2LS_REQ_CHAR_CREATE* character, int accountI sqlite3_bind_int(stmt, 8, character->PCStyle.iSkinColor); sqlite3_bind_int(stmt, 9, character->PCStyle.iPC_UID); - if (sqlite3_step(stmt) != SQLITE_DONE) - { + if (sqlite3_step(stmt) != SQLITE_DONE) { sqlite3_finalize(stmt); sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); return false; } sql = R"( - INSERT INTO "Inventory" - ("PlayerID", "Slot", "ID", "Type", "Opt") + INSERT INTO Inventory (PlayerID, Slot, ID, Type, Opt) VALUES (?, ?, ?, ?, 1); )"; sqlite3_prepare_v2(db, sql, -1, &stmt, 0); @@ -657,8 +649,7 @@ bool Database::finishCharacter(sP_CL2LS_REQ_CHAR_CREATE* character, int accountI sqlite3_bind_int(stmt, 3, items[i]); sqlite3_bind_int(stmt, 4, i+1); - if (sqlite3_step(stmt) != SQLITE_DONE) - { + if (sqlite3_step(stmt) != SQLITE_DONE) { sqlite3_finalize(stmt); sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); return false; @@ -677,12 +668,11 @@ bool Database::finishTutorial(int playerID, int accountID) { sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL); const char* sql = R"( - UPDATE "Players" - SET - "TutorialFlag" = 1, - "Nano1" = 1, - "Quests" = ? - WHERE "PlayerID" = ? AND "AccountID" = ? AND "TutorialFlag" = 0; + UPDATE Players SET + TutorialFlag = 1, + Nano1 = 1, + Quests = ? + WHERE PlayerID = ? AND AccountID = ? AND TutorialFlag = 0; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -694,8 +684,7 @@ bool Database::finishTutorial(int playerID, int accountID) { sqlite3_bind_int(stmt, 2, playerID); sqlite3_bind_int(stmt, 3, accountID); - if (sqlite3_step(stmt) != SQLITE_DONE) - { + if (sqlite3_step(stmt) != SQLITE_DONE) { sqlite3_finalize(stmt); sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); return false; @@ -703,16 +692,15 @@ bool Database::finishTutorial(int playerID, int accountID) { // Lightning Gun sql = R"( - INSERT INTO "Inventory" - ("PlayerID", "Slot", "ID", "Type", "Opt") + INSERT INTO Inventory + (PlayerID, Slot, ID, Type, Opt) VALUES (?, 0, 328, 0, 1); )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, playerID); - if (sqlite3_step(stmt) != SQLITE_DONE) - { + if (sqlite3_step(stmt) != SQLITE_DONE) { sqlite3_finalize(stmt); sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); return false; @@ -720,8 +708,8 @@ bool Database::finishTutorial(int playerID, int accountID) { // Nano Buttercup sql = R"( - INSERT INTO "Nanos" - ("PlayerID", "ID", "Skill") + INSERT INTO Nanos + (PlayerID, ID, Skill) VALUES (?, 1, 1); )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -731,8 +719,7 @@ bool Database::finishTutorial(int playerID, int accountID) { int rc = sqlite3_step(stmt); sqlite3_finalize(stmt); - if (rc != SQLITE_DONE) - { + if (rc != SQLITE_DONE) { sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); return false; } @@ -745,9 +732,9 @@ int Database::deleteCharacter(int characterID, int userID) { std::lock_guard lock(dbCrit); const char* sql = R"( - SELECT "Slot" - FROM "Players" - WHERE "AccountID" = ? AND "PlayerID" = ? + SELECT Slot + FROM Players + WHERE AccountID = ? AND PlayerID = ? LIMIT 1; )"; @@ -756,16 +743,15 @@ int Database::deleteCharacter(int characterID, int userID) { sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, userID); sqlite3_bind_int(stmt, 2, characterID); - if (sqlite3_step(stmt) != SQLITE_ROW) - { + if (sqlite3_step(stmt) != SQLITE_ROW) { sqlite3_finalize(stmt); return 0; } int slot = sqlite3_column_int(stmt, 0); sql = R"( - DELETE FROM "Players" - WHERE "AccountID" = ? AND "PlayerID" = ?; + DELETE FROM Players + WHERE AccountID = ? AND PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, 0); sqlite3_bind_int(stmt, 1, userID); @@ -786,10 +772,10 @@ void Database::getCharInfo(std::vector * result, int use SELECT p.PlayerID, p.Slot, p.FirstName, p.LastName, p.Level, p.AppearanceFlag, p.TutorialFlag, p.PayZoneFlag, p.XCoordinates, p.YCoordinates, p.ZCoordinates, p.NameCheck, - a.Body, a.EyeColor, a.FaceStyle, a.Gender, a.HairColor, a.HairStyle, a.Height, a.SkinColor - FROM "Players" as p - INNER JOIN "Appearances" as a ON p.PlayerID = a.PlayerID - WHERE p.AccountID = ? + a.Body, a.EyeColor, a.FaceStyle, a.Gender, a.HairColor, a.HairStyle, a.Height, a.SkinColor + FROM Players as p + INNER JOIN Appearances as a ON p.PlayerID = a.PlayerID + WHERE p.AccountID = ?; )"; sqlite3_stmt* stmt; @@ -801,12 +787,12 @@ void Database::getCharInfo(std::vector * result, int use toAdd.sPC_Style.iPC_UID = sqlite3_column_int(stmt, 0); toAdd.iSlot = sqlite3_column_int(stmt, 1); - // parsing const unsigned char* to char16_t + // parsing const unsigned char* to char16_t std::string placeHolder = std::string(reinterpret_cast(sqlite3_column_text(stmt, 2))); U8toU16(placeHolder, toAdd.sPC_Style.szFirstName, sizeof(toAdd.sPC_Style.szFirstName)); placeHolder = std::string(reinterpret_cast(sqlite3_column_text(stmt, 3))); U8toU16(placeHolder, toAdd.sPC_Style.szLastName, sizeof(toAdd.sPC_Style.szLastName)); - + toAdd.iLevel = sqlite3_column_int(stmt, 4); toAdd.sPC_Style2.iAppearanceFlag = sqlite3_column_int(stmt, 5); toAdd.sPC_Style2.iTutorialFlag = sqlite3_column_int(stmt, 6); @@ -826,8 +812,9 @@ void Database::getCharInfo(std::vector * result, int use // request aEquip const char* sql2 = R"( - SELECT "Slot", "Type", "ID", "Opt", "TimeLimit" from Inventory - WHERE "PlayerID" = ? AND "Slot" < ? + SELECT Slot, Type, ID, Opt, TimeLimit + FROM Inventory + WHERE PlayerID = ? AND Slot < ?; )"; sqlite3_stmt* stmt2; @@ -849,14 +836,14 @@ void Database::getCharInfo(std::vector * result, int use sqlite3_finalize(stmt); } -// XXX: This is never called? +// NOTE: This is currently never called. void Database::evaluateCustomName(int characterID, CustomName decision) { std::lock_guard lock(dbCrit); const char* sql = R"( - UPDATE "Players" - SET "NameCheck" = ? - WHERE "PlayerID" = ?; + UPDATE Players + SET NameCheck = ? + WHERE PlayerID = ?; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -872,12 +859,12 @@ bool Database::changeName(sP_CL2LS_REQ_CHANGE_CHAR_NAME* save, int accountId) { std::lock_guard lock(dbCrit); const char* sql = R"( - UPDATE "Players" + UPDATE Players SET - "FirstName" = ?, - "LastName" = ?, - "NameCheck" = ? - WHERE "PlayerID" = ? AND "AccountID" = ?; + FirstName = ?, + LastName = ?, + NameCheck = ? + WHERE PlayerID = ? AND AccountID = ?; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -910,11 +897,11 @@ void Database::getPlayer(Player* plr, int id) { p.Angle, p.HP, acc.AccountLevel, p.FusionMatter, p.Taros, p.Quests, p.BatteryW, p.BatteryN, p.Mentor, p.WarpLocationFlag, p.SkywayLocationFlag, p.CurrentMissionID, p.FirstUseFlag, - a.Body, a.EyeColor, a.FaceStyle, a.Gender, a.HairColor, a.HairStyle, a.Height, a.SkinColor - FROM "Players" as p - INNER JOIN "Appearances" as a ON p.PlayerID = a.PlayerID - INNER JOIN "Accounts" as acc ON p.AccountID = acc.AccountID - WHERE p.PlayerID = ? + a.Body, a.EyeColor, a.FaceStyle, a.Gender, a.HairColor, a.HairStyle, a.Height, a.SkinColor + FROM Players as p + INNER JOIN Appearances as a ON p.PlayerID = a.PlayerID + INNER JOIN Accounts as acc ON p.AccountID = acc.AccountID + WHERE p.PlayerID = ?; )"; sqlite3_stmt* stmt; @@ -932,7 +919,7 @@ void Database::getPlayer(Player* plr, int id) { plr->accountId = sqlite3_column_int(stmt, 0); plr->slot = sqlite3_column_int(stmt, 1); - // parsing const unsigned char* to char16_t + // parsing const unsigned char* to char16_t std::string placeHolder = std::string(reinterpret_cast(sqlite3_column_text(stmt, 2))); U8toU16(placeHolder, plr->PCStyle.szFirstName, sizeof(plr->PCStyle.szFirstName)); placeHolder = std::string(reinterpret_cast(sqlite3_column_text(stmt, 3))); @@ -959,14 +946,14 @@ void Database::getPlayer(Player* plr, int id) { plr->money = sqlite3_column_int(stmt, 19); memcpy(plr->aQuestFlag, sqlite3_column_blob(stmt, 20), sizeof(plr->aQuestFlag)); - + plr->batteryW = sqlite3_column_int(stmt, 21); plr->batteryN = sqlite3_column_int(stmt, 22); plr->mentor = sqlite3_column_int(stmt, 23); plr->iWarpLocationFlag = sqlite3_column_int(stmt, 24); - + memcpy(plr->aSkywayLocationFlag, sqlite3_column_blob(stmt, 25), sizeof(plr->aSkywayLocationFlag)); - + plr->CurrentMissionID = sqlite3_column_int(stmt, 26); memcpy(plr->iFirstUseFlag, sqlite3_column_blob(stmt, 27), sizeof(plr->iFirstUseFlag)); @@ -982,8 +969,9 @@ void Database::getPlayer(Player* plr, int id) { // get inventory sql = R"( - SELECT "Slot", "Type", "ID", "Opt", "TimeLimit" from Inventory - WHERE "PlayerID" = ?; + SELECT Slot, Type, ID, Opt, TimeLimit + FROM Inventory + WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1000,15 +988,16 @@ void Database::getPlayer(Player* plr, int id) { } sItemBase* item; - if (slot < AEQUIP_COUNT) - //equipment + if (slot < AEQUIP_COUNT) { + // equipment item = &plr->Equip[slot]; - else if (slot < (AEQUIP_COUNT + AINVEN_COUNT)) - //inventory + } else if (slot < (AEQUIP_COUNT + AINVEN_COUNT)) { + // inventory item = &plr->Inven[slot - AEQUIP_COUNT]; - else - //bank + } else { + // bank item = &plr->Bank[slot - AEQUIP_COUNT - AINVEN_COUNT]; + } item->iType = sqlite3_column_int(stmt, 1); item->iID = sqlite3_column_int(stmt, 2); @@ -1017,16 +1006,12 @@ void Database::getPlayer(Player* plr, int id) { } Database::removeExpiredVehicles(plr); - - // get quest inventory + // get quest inventory sql = R"( - SELECT - "Slot", - "ID", - "Opt" - FROM "QuestItems" - WHERE "PlayerID" = ? + SELECT Slot, ID, Opt + FROM QuestItems + WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1045,12 +1030,9 @@ void Database::getPlayer(Player* plr, int id) { // get nanos sql = R"( - SELECT - "ID", - "Skill", - "Stamina" - FROM "Nanos" - WHERE "PlayerID" = ? + SELECT ID, Skill, Stamina + FROM Nanos + WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1072,12 +1054,12 @@ void Database::getPlayer(Player* plr, int id) { // get active quests sql = R"( SELECT - "TaskID", - "RemainingNPCCount1", - "RemainingNPCCount2", - "RemainingNPCCount3" - FROM "RunningQuests" - WHERE "PlayerID" = ? + TaskID, + RemainingNPCCount1, + RemainingNPCCount2, + RemainingNPCCount3 + FROM RunningQuests + WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1094,8 +1076,9 @@ void Database::getPlayer(Player* plr, int id) { // get buddies sql = R"( - SELECT "PlayerAID", "PlayerBID" from "Buddyships" - WHERE "PlayerAID" = ? OR "PlayerBID" = ? + SELECT PlayerAID, PlayerBID + FROM Buddyships + WHERE PlayerAID = ? OR PlayerBID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1114,14 +1097,14 @@ void Database::getPlayer(Player* plr, int id) { // get blocked players sql = R"( - SELECT "BlockedPlayerID" FROM "Blocks" - WHERE "PlayerID" = ?; + SELECT BlockedPlayerID FROM Blocks + WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, id); - - // i remains from adding buddies! + + // i retains its value from after the loop over Buddyships while (sqlite3_step(stmt) == SQLITE_ROW && i < 50) { plr->buddyIDs[i] = sqlite3_column_int(stmt, 0); plr->isBuddyBlocked[i] = true; @@ -1137,15 +1120,15 @@ void Database::updatePlayer(Player *player) { sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL); const char* sql = R"( - UPDATE "Players" + UPDATE Players SET - "Level" = ? , "Nano1" = ?, "Nano2" = ?, "Nano3" = ?, - "XCoordinates" = ?, "YCoordinates" = ?, "ZCoordinates" = ?, - "Angle" = ?, "HP" = ?, "FusionMatter" = ?, "Taros" = ?, "Quests" = ?, - "BatteryW" = ?, "BatteryN" = ?, "WarplocationFlag" = ?, - "SkywayLocationFlag" = ?, "CurrentMissionID" = ?, - "PayZoneFlag" = ?, "FirstUseFlag" = ?, "Mentor" = ? - WHERE "PlayerID" = ? + Level = ? , Nano1 = ?, Nano2 = ?, Nano3 = ?, + XCoordinates = ?, YCoordinates = ?, ZCoordinates = ?, + Angle = ?, HP = ?, FusionMatter = ?, Taros = ?, Quests = ?, + BatteryW = ?, BatteryN = ?, WarplocationFlag = ?, + SkywayLocationFlag = ?, CurrentMissionID = ?, + PayZoneFlag = ?, FirstUseFlag = ?, Mentor = ? + WHERE PlayerID = ?; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1183,22 +1166,22 @@ void Database::updatePlayer(Player *player) { if (sqlite3_step(stmt) != SQLITE_DONE) { sqlite3_finalize(stmt); - sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); + sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); std::cout << "[WARN] Database: Failed to save player to database" << std::endl; return; } // update inventory sql = R"( - DELETE FROM "Inventory" WHERE "PlayerID" = ?; + DELETE FROM Inventory WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, player->iID); int rc = sqlite3_step(stmt); sql = R"( - INSERT INTO "Inventory" - ("PlayerID", "Slot", "Type", "Opt" , "ID", "Timelimit") + INSERT INTO Inventory + (PlayerID, Slot, Type, Opt, ID, Timelimit) VALUES (?, ?, ?, ?, ?, ?); )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1215,7 +1198,7 @@ void Database::updatePlayer(Player *player) { sqlite3_bind_int(stmt, 6, player->Equip[i].iTimeLimit); rc = sqlite3_step(stmt); - + if (rc != SQLITE_DONE) { sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL); sqlite3_finalize(stmt); @@ -1268,22 +1251,21 @@ void Database::updatePlayer(Player *player) { // Update Quest Inventory sql = R"( - DELETE FROM "QuestItems" WHERE "PlayerID" = ?; + DELETE FROM QuestItems WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, player->iID); sqlite3_step(stmt); sql = R"( - INSERT INTO "QuestItems" - ("PlayerID", "Slot", "Opt", "ID") + INSERT INTO QuestItems (PlayerID, Slot, Opt, ID) VALUES (?, ?, ?, ?); )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); for (int i = 0; i < AQINVEN_COUNT; i++) { if (player->QInven[i].iID == 0) - continue; + continue; sqlite3_bind_int(stmt, 1, player->iID); sqlite3_bind_int(stmt, 2, i); @@ -1301,15 +1283,14 @@ void Database::updatePlayer(Player *player) { // Update Nanos sql = R"( - DELETE FROM "Nanos" WHERE "PlayerID" = ?; + DELETE FROM Nanos WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, player->iID); sqlite3_step(stmt); sql = R"( - INSERT INTO "Nanos" - ("PlayerID", "ID", "SKill", "Stamina") + INSERT INTO Nanos (PlayerID, ID, SKill, Stamina) VALUES (?, ?, ?, ?); )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1334,15 +1315,15 @@ void Database::updatePlayer(Player *player) { // Update Running Quests sql = R"( - DELETE FROM "RunningQuests" WHERE "PlayerID" = ?; + DELETE FROM RunningQuests WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, player->iID); sqlite3_step(stmt); sql = R"( - INSERT INTO "RunningQuests" - ("PlayerID", "TaskID", "RemainingNPCCount1", "RemainingNPCCount2", "RemainingNPCCount3") + INSERT INTO RunningQuests + (PlayerID, TaskID, RemainingNPCCount1, RemainingNPCCount2, RemainingNPCCount3) VALUES (?, ?, ?, ?, ?); )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1372,7 +1353,7 @@ void Database::updatePlayer(Player *player) { void Database::removeExpiredVehicles(Player* player) { int32_t currentTime = getTimestamp(); - //if there are expired vehicles in bank just remove them silently + // if there are expired vehicles in bank just remove them silently for (int i = 0; i < ABANK_COUNT; i++) { if (player->Bank[i].iType == 10 && player->Bank[i].iTimeLimit < currentTime) { memset(&player->Bank[i], 0, sizeof(sItemBase)); @@ -1404,13 +1385,14 @@ void Database::removeExpiredVehicles(Player* player) { } // buddies -/// returns num of buddies + blocked players +// returns num of buddies + blocked players int Database::getNumBuddies(Player* player) { std::lock_guard lock(dbCrit); const char* sql = R"( - SELECT COUNT(*) FROM "Buddyships" - WHERE "PlayerAID" = ? OR "PlayerBID" = ?; + SELECT COUNT(*) + FROM Buddyships + WHERE PlayerAID = ? OR PlayerBID = ?; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1420,14 +1402,15 @@ int Database::getNumBuddies(Player* player) { int result = sqlite3_column_int(stmt, 0); sql = R"( - SELECT COUNT(*) FROM "Blocks" - WHERE "PlayerID" = ?; + SELECT COUNT(*) + FROM Blocks + WHERE PlayerID = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, player->iID); sqlite3_step(stmt); result += sqlite3_column_int(stmt, 0); - + sqlite3_finalize(stmt); // again, for peace of mind @@ -1438,8 +1421,7 @@ void Database::addBuddyship(int playerA, int playerB) { std::lock_guard lock(dbCrit); const char* sql = R"( - INSERT INTO "Buddyships" - ("PlayerAID", "PlayerBID") + INSERT INTO Buddyships (PlayerAID, PlayerBID) VALUES (?, ?); )"; sqlite3_stmt* stmt; @@ -1456,8 +1438,8 @@ void Database::removeBuddyship(int playerA, int playerB) { std::lock_guard lock(dbCrit); const char* sql = R"( - DELETE FROM "Buddyships" - WHERE ("PlayerAID" = ? AND "PlayerBID" = ?) OR ("PlayerAID" = ? AND "PlayerBID" = ?); + DELETE FROM Buddyships + WHERE (PlayerAID = ? AND PlayerBID = ?) OR (PlayerAID = ? AND PlayerBID = ?); )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1475,8 +1457,7 @@ void Database::addBlock(int playerId, int blockedPlayerId) { std::lock_guard lock(dbCrit); const char* sql = R"( - INSERT INTO "Blocks" - ("PlayerID", "BlockedPlayerID") + INSERT INTO Blocks (PlayerID, BlockedPlayerID) VALUES (?, ?); )"; sqlite3_stmt* stmt; @@ -1491,8 +1472,8 @@ void Database::addBlock(int playerId, int blockedPlayerId) { void Database::removeBlock(int playerId, int blockedPlayerId) { const char* sql = R"( - DELETE FROM "Blocks" - WHERE "PlayerID" = ? AND "BlockedPlayerID" = ?; + DELETE FROM Blocks + WHERE PlayerID = ? AND BlockedPlayerID = ?; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1508,8 +1489,8 @@ int Database::getUnreadEmailCount(int playerID) { std::lock_guard lock(dbCrit); const char* sql = R"( - SELECT COUNT (*) FROM "EmailData" - WHERE "PlayerID" = ? AND "ReadFlag" = 0; + SELECT COUNT(*) FROM EmailData + WHERE PlayerID = ? AND ReadFlag = 0; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1520,16 +1501,17 @@ int Database::getUnreadEmailCount(int playerID) { std::vector Database::getEmails(int playerID, int page) { std::lock_guard lock(dbCrit); - + std::vector emails; const char* sql = R"( SELECT - "MsgIndex", "ItemFlag", "ReadFlag", "SenderID", "SenderFirstName", "SenderLastName", "SubjectLine", "MsgBody", - "Taros", "SendTime", "DeleteTime" - FROM "EmailData" - WHERE "PlayerID" = ? - ORDER BY "MsgIndex" DESC + MsgIndex, ItemFlag, ReadFlag, SenderID, + SenderFirstName, SenderLastName, SubjectLine, + MsgBody, Taros, SendTime, DeleteTime + FROM EmailData + WHERE PlayerID = ? + ORDER BY MsgIndex DESC LIMIT 5 OFFSET ?; )"; @@ -1565,10 +1547,11 @@ Database::EmailData Database::getEmail(int playerID, int index) { const char* sql = R"( SELECT - "ItemFlag", "ReadFlag", "SenderID", "SenderFirstName", "SenderLastName", "SubjectLine", "MsgBody", - "Taros", "SendTime", "DeleteTime" - FROM "EmailData" - WHERE "PlayerID" = ? AND "MsgIndex" = ?; + ItemFlag, ReadFlag, SenderID, SenderFirstName, + SenderLastName, SubjectLine, MsgBody, + Taros, SendTime, DeleteTime + FROM EmailData + WHERE PlayerID = ? AND MsgIndex = ?; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1607,9 +1590,9 @@ sItemBase* Database::getEmailAttachments(int playerID, int index) { items[i] = { 0, 0, 0, 0 }; const char* sql = R"( - SELECT "Slot", "ID", "Type", "Opt", "TimeLimit" - FROM "EmailItems" - WHERE "PlayerID" = ? AND "MsgIndex" = ?; + SELECT Slot, ID, Type, Opt, TimeLimit + FROM EmailItems + WHERE PlayerID = ? AND MsgIndex = ?; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1628,16 +1611,17 @@ sItemBase* Database::getEmailAttachments(int playerID, int index) { items[slot].iOpt = sqlite3_column_int(stmt, 3); items[slot].iTimeLimit = sqlite3_column_int(stmt, 4); } - + return items; } void Database::updateEmailContent(EmailData* data) { std::lock_guard lock(dbCrit); - + const char* sql = R"( - SELECT COUNT(*) FROM "EmailItems" - WHERE "PlayerID" = ? AND "MsgIndex" = ?; + SELECT COUNT(*) + FROM EmailItems + WHERE PlayerID = ? AND MsgIndex = ?; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1649,21 +1633,21 @@ void Database::updateEmailContent(EmailData* data) { data->ItemFlag = (data->Taros > 0 || attachmentsCount > 0) ? 1 : 0; // set attachment flag dynamically sql = R"( - UPDATE "EmailData" + UPDATE EmailData SET - "PlayerID" = ?, - "MsgIndex" = ?, - "ReadFlag" = ?, - "ItemFlag" = ?, - "SenderID" = ?, - "SenderFirstName" = ?, - "SenderLastName" = ?, - "SubjectLine" = ?, - "MsgBody" = ?, - "Taros" = ?, - "SendTime" = ?, - "DeleteTime" = ? - WHERE "PlayerID" = ? AND "MsgIndex" = ?; + PlayerID = ?, + MsgIndex = ?, + ReadFlag = ?, + ItemFlag = ?, + SenderID = ?, + SenderFirstName = ?, + SenderLastName = ?, + SubjectLine = ?, + MsgBody = ?, + Taros = ?, + SendTime = ?, + DeleteTime = ? + WHERE PlayerID = ? AND MsgIndex = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, data->PlayerId); @@ -1693,8 +1677,8 @@ void Database::deleteEmailAttachments(int playerID, int index, int slot) { sqlite3_stmt* stmt; std::string sql(R"( - DELETE FROM "EmailItems" - WHERE "PlayerID" = ? AND "MsgIndex" = ? + DELETE FROM EmailItems + WHERE PlayerID = ? AND MsgIndex = ?; )"); if (slot != -1) @@ -1719,8 +1703,8 @@ void Database::deleteEmails(int playerID, int64_t* indices) { sqlite3_stmt* stmt; const char* sql = R"( - DELETE FROM "EmailData" - WHERE "PlayerID" = ? AND "MsgIndex" = ?; + DELETE FROM EmailData + WHERE PlayerID = ? AND MsgIndex = ?; )"; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1741,10 +1725,11 @@ int Database::getNextEmailIndex(int playerID) { std::lock_guard lock(dbCrit); const char* sql = R"( - SELECT "MsgIndex" FROM "EmailData" - WHERE "PlayerID" = ? - ORDER BY "MsgIndex" DESC - LIMIT 1 + SELECT MsgIndex + FROM EmailData + WHERE PlayerID = ? + ORDER BY MsgIndex DESC + LIMIT 1; )"; sqlite3_stmt* stmt; sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); @@ -1761,9 +1746,10 @@ bool Database::sendEmail(EmailData* data, std::vector attachments) { sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL); const char* sql = R"( - INSERT INTO "EmailData" - ("PlayerID", "MsgIndex", "ReadFlag", "ItemFlag", "SenderID", "SenderFirstName", "SenderLastName", - "SubjectLine", "MsgBody", "Taros", "SendTime", "DeleteTime") + INSERT INTO EmailData + (PlayerID, MsgIndex, ReadFlag, ItemFlag, + SenderID, SenderFirstName, SenderLastName, + SubjectLine, MsgBody, Taros, SendTime, DeleteTime) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); )"; sqlite3_stmt* stmt; @@ -1794,7 +1780,7 @@ bool Database::sendEmail(EmailData* data, std::vector attachments) { for (sItemBase item : attachments) { sql = R"( INSERT INTO EmailItems - ("PlayerID", "MsgIndex", "Slot", "ID", "Type", "Opt", "TimeLimit") + (PlayerID, MsgIndex, Slot, ID, Type, Opt, TimeLimit) VALUES (?, ?, ?, ?, ?, ?, ?); )"; sqlite3_stmt* stmt;