diff --git a/common/Item.h b/common/Item.h index 5631f4fd5..9dcd2a5e8 100644 --- a/common/Item.h +++ b/common/Item.h @@ -47,7 +47,7 @@ namespace ItemField { enum { source=0, #define F(x) x, -#include "item_fieldlist.h" + #include "item_fieldlist.h" #undef F updated }; diff --git a/common/StringUtil.cpp b/common/StringUtil.cpp index bba3433fb..cee88cfbe 100644 --- a/common/StringUtil.cpp +++ b/common/StringUtil.cpp @@ -56,10 +56,10 @@ void vStringFormat(std::string& output, const char* format, va_list args) throw std::runtime_error(errorMessage); } - else if ((unsigned int)characters_used > output.capacity()) { - output.resize(characters_used+1); + if ((unsigned int)characters_used > output.capacity()) { + output.resize(characters_used); va_copy(tmpargs,args); - characters_used = vsnprintf(&output[0], output.capacity(), format, tmpargs); + characters_used = vsnprintf(&output[0], output.capacity()+1, format, tmpargs); va_end(tmpargs); if (characters_used < 0) { @@ -70,24 +70,23 @@ void vStringFormat(std::string& output, const char* format, va_list args) throw std::runtime_error(errorMessage); } + return; } - else { - output.resize(characters_used + 1); + output.resize(characters_used+1); - va_copy(tmpargs,args); - characters_used = vsnprintf(&output[0], output.capacity(), format, tmpargs); - va_end(tmpargs); + va_copy(tmpargs,args); + characters_used = vsnprintf(&output[0], output.capacity()+1, format, tmpargs); + va_end(tmpargs); - if (characters_used < 0) { - // We shouldn't have a format error by this point, but I can't imagine what error we - // could have by this point. still error out and report it. - std::string errorMessage("Invalid format string or unknown vsnprintf error; vsnprintf returned negative with format string: "); - errorMessage.append(format); - - throw std::runtime_error(errorMessage); - } + if (characters_used < 0) { + // We shouldn't have a format error by this point, but I can't imagine what error we + // could have by this point. still error out and report it. + std::string errorMessage("Invalid format string or unknown vsnprintf error; vsnprintf returned negative with format string: "); + errorMessage.append(format); + throw std::runtime_error(errorMessage); } + return; } void StringFormat(std::string& output, const char* format, ...) diff --git a/common/database.cpp b/common/database.cpp index 82a0ecae8..fdec3545a 100644 --- a/common/database.cpp +++ b/common/database.cpp @@ -158,23 +158,23 @@ Zero will also be returned if there is a database error. */ uint32 Database::CheckLogin(const char* name, const char* password, int16* oStatus) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; if(strlen(name) >= 50 || strlen(password) >= 50) return(0); - char tmpUN[100]; - char tmpPW[100]; + std::string tmpUN; + std::string tmpPW; + DoEscapeString(tmpUN, name, strlen(name)); DoEscapeString(tmpPW, password, strlen(password)); - if (RunQuery(query, MakeAnyLenString(&query, - "SELECT id, status FROM account WHERE name='%s' AND password is not null " - "and length(password) > 0 and (password='%s' or password=MD5('%s'))", - tmpUN, tmpPW, tmpPW), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT id, status FROM account WHERE name='%s' AND password is not null " + "and length(password) > 0 and (password='%s' or password=MD5('%s'))", + tmpUN.c_str(), tmpPW.c_str(), tmpPW.c_str()); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -194,7 +194,6 @@ uint32 Database::CheckLogin(const char* name, const char* password, int16* oStat else { std::cerr << "Error in CheckLogin query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } @@ -206,11 +205,12 @@ uint32 Database::CheckLogin(const char* name, const char* password, int16* oStat bool Database::CheckBannedIPs(const char* loginIP) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; //cout << "Checking against Banned IPs table."<< endl; //Lieka: Debugging - if (RunQuery(query, MakeAnyLenString(&query, "SELECT ip_address FROM Banned_IPs WHERE ip_address='%s'", loginIP), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT ip_address FROM Banned_IPs WHERE ip_address='%s'", loginIP); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) != 0) { //cout << loginIP << " was present in the banned IPs table" << endl; //Lieka: Debugging @@ -228,7 +228,6 @@ bool Database::CheckBannedIPs(const char* loginIP) else { std::cerr << "Error in CheckBannedIPs query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return true; } return true; @@ -237,24 +236,25 @@ bool Database::CheckBannedIPs(const char* loginIP) bool Database::AddBannedIP(char* bannedIP, const char* notes) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT into Banned_IPs SET ip_address='%s', notes='%s'", bannedIP, notes), errbuf)) { + StringFormat(query,"INSERT into Banned_IPs SET ip_address='%s', notes='%s'", bannedIP, notes); + if (!RunQuery(query, errbuf)) { std::cerr << "Error in ReserveName query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); return true; } //End Lieka Edit bool Database::CheckGMIPs(const char* ip_address, uint32 account_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT * FROM `gm_ips` WHERE `ip_address` = '%s' AND `account_id` = %i", ip_address, account_id), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT * FROM `gm_ips` WHERE `ip_address` = '%s' AND `account_id` = %i", ip_address, account_id); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { mysql_free_result(result); return true; @@ -265,7 +265,6 @@ bool Database::AddBannedIP(char* bannedIP, const char* notes) mysql_free_result(result); } else { - safe_delete_array(query); return false; } @@ -274,38 +273,39 @@ bool Database::AddBannedIP(char* bannedIP, const char* notes) bool Database::AddGMIP(char* ip_address, char* name) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT into `gm_ips` SET `ip_address` = '%s', `name` = '%s'", ip_address, name), errbuf)) { - safe_delete_array(query); + StringFormat(query, "INSERT into `gm_ips` SET `ip_address` = '%s', `name` = '%s'", ip_address, name); + + if (!RunQuery(query, errbuf)) { return false; } - safe_delete_array(query); return true; } void Database::LoginIP(uint32 AccountID, const char* LoginIP) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO account_ip SET accid=%i, ip='%s' ON DUPLICATE KEY UPDATE count=count+1, lastused=now()", AccountID, LoginIP), errbuf)) { + StringFormat(query,"INSERT INTO account_ip SET accid=%i, ip='%s' ON DUPLICATE KEY UPDATE count=count+1, lastused=now()", AccountID, LoginIP); + if (!RunQuery(query, errbuf)) { std::cerr << "Error in Log IP query '" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); } int16 Database::CheckStatus(uint32 account_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query ; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT `status`, UNIX_TIMESTAMP(`suspendeduntil`) as `suspendeduntil`, UNIX_TIMESTAMP() as `current`" - " FROM `account` WHERE `id` = %i", account_id), errbuf, &result)) + StringFormat(query, "SELECT `status`, UNIX_TIMESTAMP(`suspendeduntil`) as `suspendeduntil`, UNIX_TIMESTAMP() as `current`" + " FROM `account` WHERE `id` = %i", account_id); + + if (RunQuery(query,errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) == 1) { @@ -334,7 +334,6 @@ int16 Database::CheckStatus(uint32 account_id) else { std::cerr << "Error in CheckStatus query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } @@ -343,22 +342,24 @@ int16 Database::CheckStatus(uint32 account_id) uint32 Database::CreateAccount(const char* name, const char* password, int16 status, uint32 lsaccount_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 querylen; uint32 last_insert_id; if (password) - querylen = MakeAnyLenString(&query, "INSERT INTO account SET name='%s', password='%s', status=%i, lsaccount_id=%i, time_creation=UNIX_TIMESTAMP();",name,password,status, lsaccount_id); + { + StringFormat(query,"INSERT INTO account SET name='%s', password='%s', status=%i, lsaccount_id=%i, time_creation=UNIX_TIMESTAMP();",name,password,status, lsaccount_id); + } else - querylen = MakeAnyLenString(&query, "INSERT INTO account SET name='%s', status=%i, lsaccount_id=%i, time_creation=UNIX_TIMESTAMP();",name, status, lsaccount_id); + { + StringFormat(query, "INSERT INTO account SET name='%s', status=%i, lsaccount_id=%i, time_creation=UNIX_TIMESTAMP();",name, status, lsaccount_id); + } std::cerr << "Account Attempting to be created:" << name << " " << (int16) status << std::endl; - if (!RunQuery(query, querylen, errbuf, 0, 0, &last_insert_id)) { + if (!RunQuery(query, errbuf, 0, 0, &last_insert_id)) { std::cerr << "Error in CreateAccount query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return 0; } - safe_delete_array(query); if (last_insert_id == 0) { std::cerr << "Error in CreateAccount query '" << query << "' " << errbuf << std::endl; @@ -370,12 +371,13 @@ uint32 Database::CreateAccount(const char* name, const char* password, int16 sta bool Database::DeleteAccount(const char* name) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; std::cerr << "Account Attempting to be deleted:" << name << std::endl; - if (RunQuery(query, MakeAnyLenString(&query, "DELETE FROM account WHERE name='%s';",name), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + StringFormat(query,"DELETE FROM account WHERE name='%s';",name); + + if (RunQuery(query, errbuf, 0, &affected_rows)) { if (affected_rows == 1) { return true; } @@ -383,7 +385,6 @@ bool Database::DeleteAccount(const char* name) { else { std::cerr << "Error in DeleteAccount query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return false; @@ -391,29 +392,28 @@ bool Database::DeleteAccount(const char* name) { bool Database::SetLocalPassword(uint32 accid, const char* password) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE account SET password=MD5('%s') where id=%i;", password, accid), errbuf)) { + StringFormat(query,"UPDATE account SET password=MD5('%s') where id=%i;", password, accid); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in SetLocalPassword query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); return true; } bool Database::SetAccountStatus(const char* name, int16 status) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; std::cout << "Account being GM Flagged:" << name << ", Level: " << (int16) status << std::endl; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE account SET status=%i WHERE name='%s';", status, name), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + StringFormat(query,"UPDATE account SET status=%i WHERE name='%s';", status, name); + if (!RunQuery(query, errbuf, 0, &affected_rows)) { return false; } - safe_delete_array(query); if (affected_rows == 0) { std::cout << "Account: " << name << " does not exist, therefore it cannot be flagged\n"; @@ -426,14 +426,13 @@ bool Database::SetAccountStatus(const char* name, int16 status) { bool Database::ReserveName(uint32 account_id, char* name) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT into character_ SET account_id=%i, name='%s', profile=NULL", account_id, name), errbuf)) { + StringFormat(query,"INSERT into character_ SET account_id=%i, name='%s', profile=NULL", account_id, name); + if (!RunQuery(query, errbuf)) { std::cerr << "Error in ReserveName query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); return true; } @@ -444,7 +443,7 @@ returns false on failure, true otherwise bool Database::DeleteCharacter(char *name) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query=0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; int charid, matches; @@ -461,12 +460,9 @@ bool Database::DeleteCharacter(char *name) #if DEBUG >= 5 printf("DeleteCharacter: Attempting to delete '%s'\n", name); #endif - RunQuery(query, MakeAnyLenString(&query, "SELECT id from character_ WHERE name='%s'", name), errbuf, &result); - if (query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"SELECT id from character_ WHERE name='%s'", name); + + RunQuery(query, errbuf, &result); matches = mysql_num_rows(result); if(matches == 1) { @@ -493,202 +489,124 @@ bool Database::DeleteCharacter(char *name) result = nullptr; } - - #if DEBUG >= 5 printf("DeleteCharacter: deleting '%s' (id %d): ", name, charid); printf(" quest_globals"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE from quest_globals WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE from quest_globals WHERE charid='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" character_tasks"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE from character_tasks WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE from character_tasks WHERE charid='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" character_activities"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE from character_activities WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE from character_activities WHERE charid='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" character_enabledtasks"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE from character_enabledtasks WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE from character_enabledtasks WHERE charid='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" completed_tasks"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE from completed_tasks WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE from completed_tasks WHERE charid='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" friends"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE from friends WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query, "DELETE from friends WHERE charid='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" mail"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE from mail WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query, "DELETE from mail WHERE charid='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" ptimers"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE from timers WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query, "DELETE from timers WHERE char_id='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" inventory"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE from inventory WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query, "DELETE from inventory WHERE charid='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" guild_members"); #endif #ifdef BOTS - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM guild_members WHERE char_id='%d' AND GetMobTypeById(%i) = 'C'", charid), errbuf, nullptr, &affected_rows); + StringFormat(query,"DELETE FROM guild_members WHERE char_id='%d' AND GetMobTypeById(%i) = 'C'", charid); #else - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM guild_members WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows); + StringFormat(query,"DELETE FROM guild_members WHERE char_id='%d'", charid); #endif - if(query) - { - safe_delete_array(query); - query = nullptr; - } + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" recipes"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM char_recipe_list WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE FROM char_recipe_list WHERE char_id='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" adventure_stats"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM adventure_stats WHERE player_id='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE FROM adventure_stats WHERE player_id='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" zone_flags"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM zone_flags WHERE charID='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE FROM zone_flags WHERE charID='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" titles"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM titles WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query, "DELETE FROM titles WHERE char_id='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" titlesets"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM player_titlesets WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE FROM player_titlesets WHERE char_id='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" keyring"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM keyring WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query, "DELETE FROM keyring WHERE char_id='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" factions"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM faction_values WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE FROM faction_values WHERE char_id='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" instances"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM instance_lockout_player WHERE charid='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE FROM instance_lockout_player WHERE charid='%d'", charid); + RunQuery(query,errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf(" _character"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE from character_ WHERE id='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE from character_ WHERE id='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); if(affected_rows != 1) // here we have to have a match or it's an error { LogFile->write(EQEMuLog::Error, "DeleteCharacter: error: delete operation affected %d rows\n", affected_rows); @@ -698,12 +616,8 @@ bool Database::DeleteCharacter(char *name) #if DEBUG >= 5 printf(" alternate currency"); #endif - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM character_alt_currency WHERE char_id='%d'", charid), errbuf, nullptr, &affected_rows); - if(query) - { - safe_delete_array(query); - query = nullptr; - } + StringFormat(query,"DELETE FROM character_alt_currency WHERE char_id='%d'", charid); + RunQuery(query, errbuf, nullptr, &affected_rows); #if DEBUG >= 5 printf("\n"); @@ -712,43 +626,30 @@ bool Database::DeleteCharacter(char *name) return true; } + // Store new character information into the character_ and inventory tables bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, Inventory* inv, ExtendedProfile_Struct *ext) { _CP(Database_StoreCharacter); char errbuf[MYSQL_ERRMSG_SIZE]; - char query[256+sizeof(PlayerProfile_Struct)*2+sizeof(ExtendedProfile_Struct)*2+5]; - char* end = query; + std::string query; uint32 affected_rows = 0; int i; uint32 charid = 0; - char* charidquery = 0; - char* invquery = 0; MYSQL_RES *result; MYSQL_ROW row = 0; + char zone[50]; float x, y, z; -// memset(&playeraa, 0, sizeof(playeraa)); // get the char id (used in inventory inserts below) - if(!RunQuery - ( - charidquery, - MakeAnyLenString - ( - &charidquery, - "SELECT id FROM character_ where name='%s'", - pp->name - ), - errbuf, - &result - )) { - safe_delete_array(charidquery); - LogFile->write(EQEMuLog::Error, "Error in char store id query: %s: %s", charidquery, errbuf); - return(false); + StringFormat(query,"SELECT id FROM character_ where name='%s'", pp->name); + + if(!RunQuery(query,errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in char store id query: %s: %s", query.c_str(), errbuf); + return false; } - safe_delete_array(charidquery); if(mysql_num_rows(result) == 1) { @@ -774,22 +675,35 @@ bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, Inven y=pp->y; z=pp->z; - // construct the character_ query - end += sprintf(end, - "UPDATE character_ SET timelaston=0, " - "zonename=\'%s\', x=%f, y=%f, z=%f, profile=\'", - zone, x, y, z - ); - end += DoEscapeString(end, (char*)pp, sizeof(PlayerProfile_Struct)); - end += sprintf(end, "\', extprofile=\'"); - end += DoEscapeString(end, (char*)ext, sizeof(ExtendedProfile_Struct)); - end += sprintf(end, "\' WHERE account_id=%d AND name='%s'",account_id, pp->name); + std::string playerProfileBuffer; + std::string extendedProfileBuffer; - RunQuery(query, (uint32) (end - query), errbuf, 0, &affected_rows); + // construct the character_ query + StringFormat(query, "UPDATE character_ SET timelaston=0, " + "zonename=\'%s\', x=%f, y=%f, z=%f, profile=\'", + zone, x, y, z); + + DoEscapeString(playerProfileBuffer, (char*)pp, sizeof(PlayerProfile_Struct)); + + query.append(playerProfileBuffer); + + query.append("\', extprofile=\'"); + + DoEscapeString(extendedProfileBuffer, (char*)ext, sizeof(ExtendedProfile_Struct)); + + query.append(extendedProfileBuffer); + + std::string ending; + + StringFormat(ending, "\' WHERE account_id=%d AND name='%s'",account_id, pp->name); + + query.append(ending); + + RunQuery(query, errbuf, 0, &affected_rows); if(!affected_rows) { - LogFile->write(EQEMuLog::Error, "StoreCharacter query '%s' %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "StoreCharacter query '%s' %s", query.c_str(), errbuf); return false; } @@ -804,27 +718,22 @@ bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, Inven const ItemInst* newinv = inv->GetItem((int16)i); if (newinv) { - MakeAnyLenString - ( - &invquery, - "INSERT INTO inventory SET " - "charid=%0u, slotid=%0d, itemid=%0u, charges=%0d, color=%0u", - charid, i, newinv->GetItem()->ID, - newinv->GetCharges(), newinv->GetColor() - ); - - RunQuery(invquery, strlen(invquery), errbuf, 0, &affected_rows); + StringFormat(query,"INSERT INTO inventory SET " + "charid=%0u, slotid=%0d, itemid=%0u, charges=%0d, color=%0u", + charid, i, newinv->GetItem()->ID, + newinv->GetCharges(), newinv->GetColor()); + + RunQuery(query, errbuf, 0, &affected_rows); if(!affected_rows) { - LogFile->write(EQEMuLog::Error, "StoreCharacter inventory failed. Query '%s' %s", invquery, errbuf); + LogFile->write(EQEMuLog::Error, "StoreCharacter inventory failed. Query '%s' %s", query.c_str(), errbuf); } #if EQDEBUG >= 9 else { - LogFile->write(EQEMuLog::Debug, "StoreCharacter inventory succeeded. Query '%s' %s", invquery, errbuf); + LogFile->write(EQEMuLog::Debug, "StoreCharacter inventory succeeded. Query '%s' %s", query, errbuf); } #endif - safe_delete_array(invquery); } if(i==30){ //end of standard inventory/cursor, jump to internals of bags/cursor @@ -859,12 +768,12 @@ Zero will also be returned if there is a database error. */ uint32 Database::GetAccountIDByChar(const char* charname, uint32* oCharID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT account_id, id FROM character_ WHERE name='%s'", charname), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT account_id, id FROM character_ WHERE name='%s'", charname); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -878,7 +787,6 @@ uint32 Database::GetAccountIDByChar(const char* charname, uint32* oCharID) { } else { std::cerr << "Error in GetAccountIDByChar query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return 0; @@ -887,12 +795,13 @@ uint32 Database::GetAccountIDByChar(const char* charname, uint32* oCharID) { // Retrieve account_id for a given char_id uint32 Database::GetAccountIDByChar(uint32 char_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 ret = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT account_id FROM character_ WHERE id=%i", char_id), errbuf, &result)) { + StringFormat(query,"SELECT account_id FROM character_ WHERE id=%i", char_id); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); ret = atoi(row[0]); // copy to temp var because gotta free the result before exitting this function @@ -900,16 +809,15 @@ uint32 Database::GetAccountIDByChar(uint32 char_id) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetAccountIDByChar query '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in GetAccountIDByChar query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); return ret; } uint32 Database::GetAccountIDByName(const char* accname, int16* status, uint32* lsid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -921,8 +829,8 @@ uint32 Database::GetAccountIDByName(const char* accname, int16* status, uint32* return 0; } - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id, status, lsaccount_id FROM account WHERE name='%s'", accname), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT id, status, lsaccount_id FROM account WHERE name='%s'", accname); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); uint32 tmp = atoi(row[0]); // copy to temp var because gotta free the result before exitting this function @@ -941,7 +849,6 @@ uint32 Database::GetAccountIDByName(const char* accname, int16* status, uint32* } else { std::cerr << "Error in GetAccountIDByAcc query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return 0; @@ -949,12 +856,12 @@ uint32 Database::GetAccountIDByName(const char* accname, int16* status, uint32* void Database::GetAccountName(uint32 accountid, char* name, uint32* oLSAccountID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT name, lsaccount_id FROM account WHERE id='%i'", accountid), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT name, lsaccount_id FROM account WHERE id='%i'", accountid); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -967,19 +874,18 @@ void Database::GetAccountName(uint32 accountid, char* name, uint32* oLSAccountID mysql_free_result(result); } else { - safe_delete_array(query); std::cerr << "Error in GetAccountName query '" << query << "' " << errbuf << std::endl; } } void Database::GetCharName(uint32 char_id, char* name) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT name FROM character_ WHERE id='%i'", char_id), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT name FROM character_ WHERE id='%i'", char_id); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -989,35 +895,37 @@ void Database::GetCharName(uint32 char_id, char* name) { mysql_free_result(result); } else { - safe_delete_array(query); std::cerr << "Error in GetCharName query '" << query << "' " << errbuf << std::endl; } } +void Database::LoadVariables_MQ(std::string& query) { +// the read of this single variable should be atomic... this was causing strange problems +// LockMutex lock(&Mvarcache); + StringFormat(query,"SELECT varname, value, unix_timestamp() " + "FROM variables where unix_timestamp(ts) >= %d", + varcache_lastupdate); +} + bool Database::LoadVariables() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; + + LoadVariables_MQ(query); - if (RunQuery(query, LoadVariables_MQ(&query), errbuf, &result)) { - safe_delete_array(query); + if (RunQuery(query, errbuf, &result)) { bool ret = LoadVariables_result(result); mysql_free_result(result); return ret; } else { std::cerr << "Error in LoadVariables query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return false; } -uint32 Database::LoadVariables_MQ(char** query) { -// the read of this single variable should be atomic... this was causing strange problems -// LockMutex lock(&Mvarcache); - return MakeAnyLenString(query, "SELECT varname, value, unix_timestamp() FROM variables where unix_timestamp(ts) >= %d", varcache_lastupdate); -} bool Database::LoadVariables_result(MYSQL_RES* result) { uint32 i; @@ -1099,31 +1007,25 @@ bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_ bool Database::SetVariable(const char* varname_in, const char* varvalue_in) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - char *varname,*varvalue; - - varname=(char *)malloc(strlen(varname_in)*2+1); - varvalue=(char *)malloc(strlen(varvalue_in)*2+1); + std::string varname, varvalue; DoEscapeString(varname, varname_in, strlen(varname_in)); DoEscapeString(varvalue, varvalue_in, strlen(varvalue_in)); - if (RunQuery(query, MakeAnyLenString(&query, "Update variables set value='%s' WHERE varname like '%s'", varvalue, varname), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + StringFormat(query,"Update variables set value='%s' WHERE varname like '%s'", varvalue.c_str(), varname.c_str()); + + if (RunQuery(query, errbuf, 0, &affected_rows)) { if (affected_rows == 1) { LoadVariables(); // refresh cache - free(varname); - free(varvalue); return true; } else { - if (RunQuery(query, MakeAnyLenString(&query, "Insert Into variables (varname, value) values ('%s', '%s')", varname, varvalue), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + StringFormat(query,"Insert Into variables (varname, value) values ('%s', '%s')", varname.c_str(), varvalue.c_str()); + if (RunQuery(query, errbuf, 0, &affected_rows)) { if (affected_rows == 1) { LoadVariables(); // refresh cache - free(varname); - free(varvalue); return true; } } @@ -1131,21 +1033,19 @@ bool Database::SetVariable(const char* varname_in, const char* varvalue_in) { } else { std::cerr << "Error in SetVariable query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } - free(varname); - free(varvalue); return false; } uint32 Database::GetMiniLoginAccount(char* ip){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 retid = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id FROM account WHERE minilogin_ip='%s'", ip), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query,"SELECT id FROM account WHERE minilogin_ip='%s'", ip); + if (RunQuery(query, errbuf, &result)) { if ((row = mysql_fetch_row(result))) retid = atoi(row[0]); mysql_free_result(result); @@ -1153,7 +1053,6 @@ uint32 Database::GetMiniLoginAccount(char* ip){ else { std::cerr << "Error in GetMiniLoginAccount query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return retid; } @@ -1161,17 +1060,18 @@ uint32 Database::GetMiniLoginAccount(char* ip){ // Pyro: Get zone starting points from DB bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe_x, float* safe_y, float* safe_z, int16* minstatus, uint8* minlevel, char *flag_needed) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; // int buf_len = 256; // int chars = -1; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, - "SELECT safe_x, safe_y, safe_z, min_status, min_level, " - " flag_needed FROM zone " - " WHERE short_name='%s' AND (version=%i OR version=0) ORDER BY version DESC", short_name, version), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT safe_x, safe_y, safe_z, min_status, min_level, " + "flag_needed FROM zone " + "WHERE short_name='%s' AND (version=%i OR version=0) " + "ORDER BY version DESC", short_name, version); + + if (RunQuery(query, errbuf, &result) ){ if (mysql_num_rows(result) > 0) { row = mysql_fetch_row(result); if (safe_x != 0) @@ -1199,8 +1099,6 @@ bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe std::cerr << "ALTER TABLE `zone` CHANGE `minium_level` `min_level` TINYINT(3) UNSIGNED DEFAULT \"0\" NOT NULL;\n"; std::cerr << "ALTER TABLE `zone` CHANGE `minium_status` `min_status` TINYINT(3) UNSIGNED DEFAULT \"0\" NOT NULL;\n"; std::cerr << "ALTER TABLE `zone` ADD flag_needed VARCHAR(128) NOT NULL DEFAULT '';\n"; - - safe_delete_array(query); } return false; } @@ -1208,13 +1106,15 @@ bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe bool Database::GetZoneLongName(const char* short_name, char** long_name, char* file_name, float* safe_x, float* safe_y, float* safe_z, uint32* graveyard_id, uint32* maxclients) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT long_name, file_name, safe_x, safe_y, safe_z, graveyard_id, maxclients FROM zone WHERE short_name='%s' AND version=0", short_name), errbuf, &result)) + StringFormat(query, "SELECT long_name, file_name, safe_x, safe_y, safe_z, graveyard_id, maxclients " + "FROM zone WHERE short_name='%s' AND version=0", short_name); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) > 0) { row = mysql_fetch_row(result); if (long_name != 0) { @@ -1244,7 +1144,6 @@ bool Database::GetZoneLongName(const char* short_name, char** long_name, char* f else { std::cerr << "Error in GetZoneLongName query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } @@ -1252,38 +1151,39 @@ bool Database::GetZoneLongName(const char* short_name, char** long_name, char* f } uint32 Database::GetZoneGraveyardID(uint32 zone_id, uint32 version) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 GraveyardID = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT graveyard_id FROM zone WHERE zoneidnumber='%u' AND (version=%i OR version=0) ORDER BY version DESC", zone_id, version), errbuf, &result)) + StringFormat(query,"SELECT graveyard_id FROM zone WHERE zoneidnumber='%u' " + "AND (version=%i OR version=0) ORDER BY version DESC", zone_id, version); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) > 0) { row = mysql_fetch_row(result); GraveyardID = atoi(row[0]); } mysql_free_result(result); - safe_delete_array(query); return GraveyardID; } else { std::cerr << "Error in GetZoneGraveyardID query '" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); return GraveyardID; } bool Database::GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zoneid, float* graveyard_x, float* graveyard_y, float* graveyard_z, float* graveyard_heading) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT zone_id, x, y, z, heading FROM graveyard WHERE id=%i", graveyard_id), errbuf, &result)) + StringFormat(query,"SELECT zone_id, x, y, z, heading FROM graveyard WHERE id=%i", graveyard_id); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); if(graveyard_zoneid != 0) @@ -1304,7 +1204,6 @@ bool Database::GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zon else { std::cerr << "Error in GetZoneGraveyard query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } @@ -1313,14 +1212,12 @@ bool Database::GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zon bool Database::LoadZoneNames() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; MYSQL_RES *result; MYSQL_ROW row; - query = new char[256]; - strcpy(query, "SELECT MAX(zoneidnumber) FROM zone"); - if (RunQuery(query, strlen(query), errbuf, &result)) { - safe_delete_array(query); + std::string query = "SELECT MAX(zoneidnumber) FROM zone"; + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if (row && row[0]) { @@ -1331,9 +1228,9 @@ bool Database::LoadZoneNames() { } mysql_free_result(result); - MakeAnyLenString(&query, "SELECT zoneidnumber, short_name FROM zone"); - if (RunQuery(query, strlen(query), errbuf, &result)) { - safe_delete_array(query); + + query = "SELECT zoneidnumber, short_name FROM zone"; + if (RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { zonename_array[atoi(row[0])] = new char[strlen(row[1]) + 1]; strcpy(zonename_array[atoi(row[0])], row[1]); @@ -1343,7 +1240,6 @@ bool Database::LoadZoneNames() { } else { std::cerr << "Error in LoadZoneNames query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } } @@ -1353,7 +1249,6 @@ bool Database::LoadZoneNames() { } else { std::cerr << "Error in LoadZoneNames query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } return true; @@ -1401,19 +1296,21 @@ const char* Database::GetZoneName(uint32 zoneID, bool ErrorUnknown) { uint8 Database::GetPEQZone(uint32 zoneID, uint32 version){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; int peqzone = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT peqzone from zone where zoneidnumber='%i' AND (version=%i OR version=0) ORDER BY version DESC", zoneID, version), errbuf, &result)) + StringFormat(query,"SELECT peqzone from zone where zoneidnumber='%i' " + "AND (version=%i OR version=0) ORDER BY version DESC", zoneID, version); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) > 0) { row = mysql_fetch_row(result); peqzone = atoi(row[0]); } - safe_delete_array(query); mysql_free_result(result); return peqzone; } @@ -1421,7 +1318,6 @@ uint8 Database::GetPEQZone(uint32 zoneID, uint32 version){ { std::cerr << "Error in GetPEQZone query '" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); return peqzone; } @@ -1429,7 +1325,7 @@ bool Database::CheckNameFilter(const char* name, bool surname) { std::string str_name = name; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -1482,8 +1378,9 @@ bool Database::CheckNameFilter(const char* name, bool surname) } } - if (RunQuery(query, MakeAnyLenString(&query, "SELECT name FROM name_filter"), errbuf, &result)) { - safe_delete_array(query); + query ="SELECT name FROM name_filter"; + + if (RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { std::string current_row = row[0]; @@ -1504,7 +1401,6 @@ bool Database::CheckNameFilter(const char* name, bool surname) else { std::cerr << "Error in CheckNameFilter query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return true; @@ -1512,17 +1408,15 @@ bool Database::CheckNameFilter(const char* name, bool surname) bool Database::AddToNameFilter(const char* name) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO name_filter (name) values ('%s')", name), errbuf, 0, &affected_rows)) { + StringFormat(query,"INSERT INTO name_filter (name) values ('%s')", name); + if (!RunQuery(query, errbuf, 0, &affected_rows)) { std::cerr << "Error in AddToNameFilter query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); - if (affected_rows == 0) { return false; } @@ -1532,13 +1426,14 @@ bool Database::AddToNameFilter(const char* name) { uint32 Database::GetAccountIDFromLSID(uint32 iLSID, char* oAccountName, int16* oStatus) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id, name, status FROM account WHERE lsaccount_id=%i", iLSID), errbuf, &result)) + StringFormat(query,"SELECT id, name, status FROM account WHERE lsaccount_id=%i", iLSID); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); uint32 account_id = atoi(row[0]); @@ -1558,7 +1453,6 @@ uint32 Database::GetAccountIDFromLSID(uint32 iLSID, char* oAccountName, int16* o } else { std::cerr << "Error in GetAccountIDFromLSID query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return 0; } @@ -1567,11 +1461,12 @@ uint32 Database::GetAccountIDFromLSID(uint32 iLSID, char* oAccountName, int16* o void Database::GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT name, status FROM account WHERE id=%i", id), errbuf, &result)) + StringFormat(query, "SELECT name, status FROM account WHERE id=%i", id); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -1584,30 +1479,30 @@ void Database::GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus) { } else std::cerr << "Error in GetAccountFromID query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } void Database::ClearMerchantTemp(){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "delete from merchantlist_temp"), errbuf)) { + std::string query = "delete from merchantlist_temp"; + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in ClearMerchantTemp query '" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); } bool Database::UpdateName(const char* oldname, const char* newname) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; std::cout << "Renaming " << oldname << " to " << newname << "..." << std::endl; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET name='%s' WHERE name='%s';", newname, oldname), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + + StringFormat(query,"UPDATE character_ SET name='%s' WHERE name='%s';", newname, oldname); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { return false; } - safe_delete_array(query); if (affected_rows == 0) { @@ -1621,17 +1516,19 @@ bool Database::UpdateName(const char* oldname, const char* newname) { bool Database::CheckUsedName(const char* name) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; + //if (strlen(name) > 15) // return false; - if (!RunQuery(query, MakeAnyLenString(&query, "SELECT id FROM character_ where name='%s'", name), errbuf, &result)) { + + StringFormat(query,"SELECT id FROM character_ where name='%s'", name); + + if (!RunQuery(query, errbuf, &result)) { std::cerr << "Error in CheckUsedName query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } else { // It was a valid Query, so lets do our counts! - safe_delete_array(query); uint32 tmp = mysql_num_rows(result); mysql_free_result(result); if (tmp > 0) // There is a Name! No change (Return False) @@ -1644,11 +1541,13 @@ bool Database::CheckUsedName(const char* name) uint8 Database::GetServerType() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT value FROM variables WHERE varname='ServerType'"), errbuf, &result)) { - safe_delete_array(query); + + std::string query ="SELECT value FROM variables WHERE varname='ServerType'"; + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -1666,7 +1565,6 @@ uint8 Database::GetServerType() else { std::cerr << "Error in GetServerType query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } return 0; @@ -1675,17 +1573,17 @@ uint8 Database::GetServerType() bool Database::MoveCharacterToZone(const char* charname, const char* zonename,uint32 zoneid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; if(zonename == nullptr || strlen(zonename) == 0) return(false); - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET zonename = '%s',zoneid=%i,x=-1, y=-1, z=-1 WHERE name='%s'", zonename,zoneid, charname), errbuf, 0,&affected_rows)) { + StringFormat(query,"UPDATE character_ SET zonename = '%s',zoneid=%i,x=-1, y=-1, z=-1 WHERE name='%s'", zonename,zoneid, charname); + if (!RunQuery(query, errbuf, 0,&affected_rows)) { std::cerr << "Error in MoveCharacterToZone(name) query '" << query << "' " << errbuf << std::endl; return false; } - safe_delete_array(query); if (affected_rows == 0) return false; @@ -1699,13 +1597,14 @@ bool Database::MoveCharacterToZone(const char* charname, const char* zonename) { bool Database::MoveCharacterToZone(uint32 iCharID, const char* iZonename) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET zonename = '%s', zoneid=%i, x=-1, y=-1, z=-1 WHERE id=%i", iZonename, GetZoneID(iZonename), iCharID), errbuf, 0,&affected_rows)) { + + StringFormat(query,"UPDATE character_ SET zonename = '%s', zoneid=%i, x=-1, y=-1, z=-1 WHERE id=%i", iZonename, GetZoneID(iZonename), iCharID); + if (!RunQuery(query, errbuf, 0,&affected_rows)) { std::cerr << "Error in MoveCharacterToZone(id) query '" << query << "' " << errbuf << std::endl; return false; } - safe_delete_array(query); if (affected_rows == 0) return false; @@ -1715,14 +1614,14 @@ bool Database::MoveCharacterToZone(uint32 iCharID, const char* iZonename) { uint8 Database::CopyCharacter(const char* oldname, const char* newname, uint32 acctid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; PlayerProfile_Struct* pp; ExtendedProfile_Struct* ext; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT profile, guild, guildrank, extprofile FROM character_ WHERE name='%s'", oldname), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT profile, guild, guildrank, extprofile FROM character_ WHERE name='%s'", oldname); + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); @@ -1736,21 +1635,30 @@ uint8 Database::CopyCharacter(const char* oldname, const char* newname, uint32 a else { std::cerr << "Error in CopyCharacter read query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return 0; } uint32 affected_rows = 0; - char query2[276 + sizeof(PlayerProfile_Struct)*2 + sizeof(ExtendedProfile_Struct)*2 + 1]; - char* end=query2; + std::string playerProfileBuffer; + std::string extendedProfileBuffer; - end += sprintf(end, "INSERT INTO character_ SET zonename=\'%s\', x = %f, y = %f, z = %f, profile=\'", GetZoneName(pp->zone_id), pp->x, pp->y, pp->z); - end += DoEscapeString(end, (char*) pp, sizeof(PlayerProfile_Struct)); - end += sprintf(end,"\', extprofile=\'"); - end += DoEscapeString(end, (char*) ext, sizeof(ExtendedProfile_Struct)); - end += sprintf(end, "\', account_id=%d, name='%s'", acctid, newname); + StringFormat(query, "INSERT INTO character_ SET zonename=\'%s\', x = %f, y = %f, z = %f, profile=\'", + GetZoneName(pp->zone_id), pp->x, pp->y, pp->z); + + DoEscapeString(playerProfileBuffer, (char*) pp, sizeof(PlayerProfile_Struct)); + query.append(playerProfileBuffer); - if (!RunQuery(query2, (uint32) (end - query2), errbuf, 0, &affected_rows)) { + query.append("\', extprofile=\'"); + + DoEscapeString(extendedProfileBuffer, (char*) ext, sizeof(ExtendedProfile_Struct)); + query.append(extendedProfileBuffer); + + std::string queryEnding; + StringFormat(queryEnding,"\', account_id=%d, name='%s'", acctid, newname); + + query.append(queryEnding); + + if (!RunQuery(query, errbuf, nullptr, &affected_rows)) { std::cerr << "Error in CopyCharacter query '" << query << "' " << errbuf << std::endl; return 0; } @@ -1765,13 +1673,15 @@ uint8 Database::CopyCharacter(const char* oldname, const char* newname, uint32 a bool Database::SetHackerFlag(const char* accountname, const char* charactername, const char* hacked) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO hackers(account,name,hacked) values('%s','%s','%s')", accountname, charactername, hacked), errbuf, 0,&affected_rows)) { + + StringFormat(query,"INSERT INTO hackers(account,name,hacked) values('%s','%s','%s')", accountname, charactername, hacked); + + if (!RunQuery(query, errbuf, 0,&affected_rows)) { std::cerr << "Error in SetHackerFlag query '" << query << "' " << errbuf << std::endl; return false; } - safe_delete_array(query); if (affected_rows == 0) { @@ -1784,15 +1694,16 @@ bool Database::SetHackerFlag(const char* accountname, const char* charactername, bool Database::SetMQDetectionFlag(const char* accountname, const char* charactername, const char* hacked, const char* zone) { //Utilize the "hacker" table, but also give zone information. char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO hackers(account,name,hacked,zone) values('%s','%s','%s','%s')", accountname, charactername, hacked, zone), errbuf, 0,&affected_rows)) { + StringFormat(query,"INSERT INTO hackers(account,name,hacked,zone) values('%s','%s','%s','%s')", accountname, charactername, hacked, zone); + + if (!RunQuery(query, errbuf, 0,&affected_rows)) { std::cerr << "Error in SetMQDetectionFlag query '" << query << "' " << errbuf << std::endl; return false; } - safe_delete_array(query); if (affected_rows == 0) { @@ -1806,20 +1717,20 @@ uint8 Database::GetRaceSkill(uint8 skillid, uint8 in_race) { uint16 race_cap = 0; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; MYSQL_RES *result; MYSQL_ROW row; //Check for a racial cap! - if (RunQuery(query, MakeAnyLenString(&query, "SELECT skillcap from race_skillcaps where skill = %i && race = %i", skillid, in_race), errbuf, &result, &affected_rows)) + StringFormat(query,"SELECT skillcap from race_skillcaps where skill = %i && race = %i", skillid, in_race); + if (RunQuery(query, errbuf, &result, &affected_rows)) { if (affected_rows != 0) { row = mysql_fetch_row(result); race_cap = atoi(row[0]); } - delete[] query; mysql_free_result(result); } @@ -1831,12 +1742,13 @@ uint8 Database::GetSkillCap(uint8 skillid, uint8 in_race, uint8 in_class, uint16 uint8 skill_level = 0, skill_formula = 0; uint16 base_cap = 0, skill_cap = 0, skill_cap2 = 0, skill_cap3 = 0; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; MYSQL_RES *result; MYSQL_ROW row; //Fetch the data from DB. - if (RunQuery(query, MakeAnyLenString(&query, "SELECT level, formula, pre50cap, post50cap, post60cap from skillcaps where skill = %i && class = %i", skillid, in_class), errbuf, &result, &affected_rows)) + StringFormat(query,"SELECT level, formula, pre50cap, post50cap, post60cap from skillcaps where skill = %i && class = %i", skillid, in_class); + if (RunQuery(query, errbuf, &result, &affected_rows)) { if (affected_rows != 0) { @@ -1848,7 +1760,6 @@ uint8 Database::GetSkillCap(uint8 skillid, uint8 in_race, uint8 in_class, uint16 skill_cap2 = (atoi(row[3])-skill_cap)/10; //Split the post-50 skill cap into difference between pre-50 cap and post-50 cap / 10 to determine amount of points per level. skill_cap3 = atoi(row[4]); } - delete[] query; mysql_free_result(result); } @@ -1880,12 +1791,12 @@ uint8 Database::GetSkillCap(uint8 skillid, uint8 in_race, uint8 in_class, uint16 uint32 Database::GetCharacterInfo(const char* iName, uint32* oAccID, uint32* oZoneID, uint32* oInstanceID, float* oX, float* oY, float* oZ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id, account_id, zonename, instanceid, x, y, z FROM character_ WHERE name='%s'", iName), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT id, account_id, zonename, instanceid, x, y, z FROM character_ WHERE name='%s'", iName); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); uint32 charid = atoi(row[0]); @@ -1908,31 +1819,30 @@ uint32 Database::GetCharacterInfo(const char* iName, uint32* oAccID, uint32* oZo } else { std::cerr << "Error in GetCharacterInfo query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return 0; } bool Database::UpdateLiveChar(char* charname,uint32 lsaccount_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE account SET charname='%s' WHERE id=%i;",charname, lsaccount_id), errbuf)) { + std::string query; + + StringFormat(query, "UPDATE account SET charname='%s' WHERE id=%i;",charname, lsaccount_id); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in UpdateLiveChar query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - - safe_delete_array(query); return true; } bool Database::GetLiveChar(uint32 account_id, char* cname) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT charname FROM account WHERE id=%i", account_id), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT charname FROM account WHERE id=%i", account_id); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); strcpy(cname,row[0]); @@ -1943,7 +1853,6 @@ bool Database::GetLiveChar(uint32 account_id, char* cname) { } else { std::cerr << "Error in GetLiveChar query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return false; @@ -1952,124 +1861,136 @@ bool Database::GetLiveChar(uint32 account_id, char* cname) { void Database::SetLFP(uint32 CharID, bool LFP) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char *Query = 0; + std::string query; - if (!RunQuery(Query, MakeAnyLenString(&Query, "update character_ set lfp=%i where id=%i",LFP, CharID), ErrBuf)) + StringFormat(query,"update character_ set lfp=%i where id=%i",LFP, CharID); + + if (!RunQuery(query, ErrBuf)) LogFile->write(EQEMuLog::Error, "Error updating LFP for character %i : %s", CharID, ErrBuf); - safe_delete_array(Query); } void Database::SetLoginFlags(uint32 CharID, bool LFP, bool LFG, uint8 firstlogon) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char *Query = 0; + std::string query; - if (!RunQuery(Query, MakeAnyLenString(&Query, "update character_ set lfp=%i, lfg=%i, firstlogon=%i where id=%i",LFP, LFG, firstlogon, CharID), ErrBuf)) + StringFormat(query,"update character_ set lfp=%i, lfg=%i, firstlogon=%i where id=%i",LFP, LFG, firstlogon, CharID); + + if (!RunQuery(query, ErrBuf)) LogFile->write(EQEMuLog::Error, "Error updating LFP for character %i : %s", CharID, ErrBuf); - - safe_delete_array(Query); - } void Database::SetLFG(uint32 CharID, bool LFG) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char *Query = 0; + std::string query; - if (!RunQuery(Query, MakeAnyLenString(&Query, "update character_ set lfg=%i where id=%i",LFG, CharID), ErrBuf)) + StringFormat(query,"update character_ set lfg=%i where id=%i",LFG, CharID); + + if (!RunQuery(query, ErrBuf)) LogFile->write(EQEMuLog::Error, "Error updating LFP for character %i : %s", CharID, ErrBuf); - safe_delete_array(Query); } void Database::SetFirstLogon(uint32 CharID, uint8 firstlogon) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char *Query = 0; + std::string query; - if (!RunQuery(Query, MakeAnyLenString(&Query, "update character_ set firstlogon=%i where id=%i",firstlogon, CharID), ErrBuf)) + StringFormat(query,"update character_ set firstlogon=%i where id=%i",firstlogon, CharID); + + if (!RunQuery(query, ErrBuf)) LogFile->write(EQEMuLog::Error, "Error updating firstlogon for character %i : %s", CharID, ErrBuf); - safe_delete_array(Query); - } void Database::AddReport(std::string who, std::string against, std::string lines) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char *Query = 0; - char *escape_str = new char[lines.size()*2+1]; + std::string query; + std::string escape_str; DoEscapeString(escape_str, lines.c_str(), lines.size()); - if (!RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO reports (name, reported, reported_text) VALUES('%s', '%s', '%s')", who.c_str(), against.c_str(), escape_str), ErrBuf)) + StringFormat(query,"INSERT INTO reports (name, reported, reported_text) VALUES('%s', '%s', '%s')", who.c_str(), against.c_str(), escape_str.c_str()); + if (!RunQuery(query, ErrBuf)) LogFile->write(EQEMuLog::Error, "Error adding a report for %s: %s", who.c_str(), ErrBuf); - safe_delete_array(Query); - safe_delete_array(escape_str); } void Database::SetGroupID(const char* name,uint32 id, uint32 charid, uint32 ismerc){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - if(id == 0){ //removing you from table - if (!RunQuery(query, MakeAnyLenString(&query, "delete from group_id where charid=%i and name='%s' and ismerc=%i",charid, name, ismerc), errbuf)) - LogFile->write(EQEMuLog::Error, "Error deleting character from group id: %s", errbuf); + std::string query; + if(id == 0) { //removing you from table + + StringFormat(query,"delete from group_id where charid=%i and name='%s' and ismerc=%i",charid, name, ismerc); + + if (!RunQuery(query, errbuf)) + LogFile->write(EQEMuLog::Error, "Error deleting character from group id: %s", errbuf); } - else{ - if (!RunQuery(query, MakeAnyLenString(&query, "replace into group_id set charid=%i, groupid=%i, name='%s', ismerc='%i'",charid, id, name, ismerc), errbuf)) - LogFile->write(EQEMuLog::Error, "Error adding character to group id: %s", errbuf); + else { + + StringFormat(query, "replace into group_id set charid=%i, groupid=%i, name='%s', ismerc='%i'",charid, id, name, ismerc); + + if (!RunQuery(query, errbuf)) + LogFile->write(EQEMuLog::Error, "Error adding character to group id: %s", errbuf); } - safe_delete_array(query); } void Database::ClearGroup(uint32 gid) { ClearGroupLeader(gid); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; + if(gid == 0) { //clear all groups - //if (!RunQuery(query, MakeAnyLenString(&query, "update group_id set groupid=0 where groupid!=0"), errbuf)) - if (!RunQuery(query, MakeAnyLenString(&query, "delete from group_id"), errbuf)) + + query = "delete from group_id"; + + if (!RunQuery(query, errbuf)) printf("Unable to clear groups: %s\n",errbuf); } else { //clear a specific group - //if (!RunQuery(query, MakeAnyLenString(&query, "update group_id set groupid=0 where groupid = %lu", gid), errbuf)) - if (!RunQuery(query, MakeAnyLenString(&query, "delete from group_id where groupid = %lu", (unsigned long)gid), errbuf)) + + StringFormat(query,"delete from group_id where groupid = %lu", (unsigned long)gid); + + if (!RunQuery(query, errbuf)) printf("Unable to clear groups: %s\n",errbuf); } - safe_delete_array(query); } uint32 Database::GetGroupID(const char* name){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 groupid=0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT groupid from group_id where name='%s'", name), errbuf, &result)) { + + StringFormat(query,"SELECT groupid from group_id where name='%s'", name); + if (RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result))) { if(row[0]) groupid=atoi(row[0]); } else - LogFile->write(EQEMuLog::Debug, "Character not in a group: %s", name); + LogFile->write(EQEMuLog::Debug, "Character not in a group: %s", name); mysql_free_result(result); } else LogFile->write(EQEMuLog::Error, "Error getting group id: %s", errbuf); - safe_delete_array(query); return groupid; } char* Database::GetGroupLeaderForLogin(const char* name,char* leaderbuf){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; PlayerProfile_Struct pp; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT profile from character_ where name='%s'", name), errbuf, &result)) { + + StringFormat(query, "SELECT profile from character_ where name='%s'", name); + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); unsigned long* lengths = mysql_fetch_lengths(result); if (lengths[0] == sizeof(PlayerProfile_Struct)) { @@ -2081,30 +2002,30 @@ char* Database::GetGroupLeaderForLogin(const char* name,char* leaderbuf){ else{ printf("Unable to get leader name: %s\n",errbuf); } - safe_delete_array(query); return leaderbuf; } void Database::SetGroupLeaderName(uint32 gid, const char* name) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "Replace into group_leaders set gid=%lu, leadername='%s'",(unsigned long)gid,name), errbuf)) + StringFormat(query,"Replace into group_leaders set gid=%lu, leadername='%s'",(unsigned long)gid,name); + + if (!RunQuery(query, errbuf)) printf("Unable to set group leader: %s\n",errbuf); - safe_delete_array(query); } char *Database::GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* maintank, char* assist, char* puller, char *marknpc, GroupLeadershipAA_Struct* GLAA){ char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES* result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT leadername, maintank, assist, puller, marknpc, leadershipaa FROM group_leaders WHERE gid=%lu",(unsigned long)gid), - errbuf, &result)) { + StringFormat(query,"SELECT leadername, maintank, assist, puller, marknpc, leadershipaa " + "FROM group_leaders WHERE gid=%lu",(unsigned long)gid); - safe_delete_array(query); + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); unsigned long* Lengths = mysql_fetch_lengths(result); @@ -2133,8 +2054,6 @@ char *Database::GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* mainta return leaderbuf; } } - else - safe_delete_array(query); if(leaderbuf) strcpy(leaderbuf, "UNKNOWN"); @@ -2156,23 +2075,27 @@ char *Database::GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* mainta void Database::ClearGroupLeader(uint32 gid){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; + if(gid == 0) { //clear all group leaders - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE from group_leaders"), errbuf)) + query = "DELETE from group_leaders"; + + if (!RunQuery(query, errbuf)) printf("Unable to clear group leaders: %s\n",errbuf); } else { //clear a specific group leader - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE from group_leaders where gid = %lu", (unsigned long)gid), errbuf)) + StringFormat(query,"DELETE from group_leaders where gid = %lu", (unsigned long)gid); + + if (!RunQuery(query, errbuf)) printf("Unable to clear group leader: %s\n",errbuf); } - safe_delete_array(query); } bool FetchRowMap(MYSQL_RES *result, std::map &rowmap) { -MYSQL_FIELD *fields; -MYSQL_ROW row; -unsigned long num_fields,i; -bool retval=false; + MYSQL_FIELD *fields; + MYSQL_ROW row; + unsigned long num_fields,i; + bool retval=false; rowmap.clear(); if (result && (num_fields=mysql_num_fields(result)) && (row = mysql_fetch_row(result))!=nullptr && (fields = mysql_fetch_fields(result))!=nullptr) { retval=true; @@ -2187,12 +2110,12 @@ bool retval=false; uint8 Database::GetAgreementFlag(uint32 acctid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES* result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT rulesflag FROM account WHERE id=%i",acctid), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT rulesflag FROM account WHERE id=%i",acctid); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -2201,60 +2124,70 @@ uint8 Database::GetAgreementFlag(uint32 acctid) return flag; } } - else - { - safe_delete_array(query); - } return 0; } void Database::SetAgreementFlag(uint32 acctid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - uint32 affected_rows = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE account SET rulesflag=1 where id=%i",acctid), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + StringFormat(query,"UPDATE account SET rulesflag=1 where id=%i",acctid); + + if (!RunQuery(query, errbuf)) { + std::cerr << "Unable to set agreement flag for account id: " << acctid << std::endl; + std::cerr << "Error message was " << errbuf << std::endl; } - else - safe_delete_array(query); } void Database::ClearRaid(uint32 rid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; if(rid == 0) { //clear all raids - if (!RunQuery(query, MakeAnyLenString(&query, "delete from raid_members"), errbuf)) + + query = "delete from raid_members"; + + if (!RunQuery(query, errbuf)) printf("Unable to clear raids: %s\n",errbuf); } else { //clear a specific group - if (!RunQuery(query, MakeAnyLenString(&query, "delete from raid_members where raidid = %lu", (unsigned long)rid), errbuf)) + + StringFormat(query,"delete from raid_members where raidid = %lu", (unsigned long)rid); + + if (!RunQuery(query, errbuf)) printf("Unable to clear raids: %s\n",errbuf); } - safe_delete_array(query); } void Database::ClearRaidDetails(uint32 rid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; + if(rid == 0) { //clear all raids - if (!RunQuery(query, MakeAnyLenString(&query, "delete from raid_details"), errbuf)) + + query = "delete from raid_details"; + + if (!RunQuery(query, errbuf)) printf("Unable to clear raid details: %s\n",errbuf); - } else { //clear a specific group - if (!RunQuery(query, MakeAnyLenString(&query, "delete from raid_details where raidid = %lu", (unsigned long)rid), errbuf)) + } + else { //clear a specific group + + StringFormat(query,"delete from raid_details where raidid = %lu", (unsigned long)rid); + + if (!RunQuery(query, errbuf)) printf("Unable to clear raid details: %s\n",errbuf); } - safe_delete_array(query); } uint32 Database::GetRaidID(const char* name){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 raidid=0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT raidid from raid_members where name='%s'", name), - errbuf, &result)) { + + StringFormat(query,"SELECT raidid from raid_members where name='%s'", name); + + if (RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result))) { if(row[0]) @@ -2265,8 +2198,8 @@ uint32 Database::GetRaidID(const char* name){ mysql_free_result(result); } else - printf("Unable to get raid id: %s\n",errbuf); - safe_delete_array(query); + printf("Unable to get raid id: %s\n",errbuf); + return raidid; } @@ -2275,18 +2208,18 @@ const char *Database::GetRaidLeaderName(uint32 rid) static char name[128]; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT name FROM raid_members WHERE raidid=%u AND israidleader=1", - rid), errbuf, &result)) { + StringFormat(query,"SELECT name FROM raid_members WHERE raidid=%u AND israidleader=1", rid); + + if (RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result)) != nullptr) { memset(name, 0, 128); strcpy(name, row[0]); mysql_free_result(result); - safe_delete_array(query); return name; } else @@ -2295,7 +2228,7 @@ const char *Database::GetRaidLeaderName(uint32 rid) } else printf("Unable to get raid id: %s\n",errbuf); - safe_delete_array(query); + return "UNKNOWN"; } @@ -2319,13 +2252,14 @@ bool Database::VerifyInstanceAlive(uint16 instance_id, uint32 char_id) bool Database::VerifyZoneInstance(uint32 zone_id, uint16 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id FROM instance_lockout where id=%u AND zone=%u", - instance_id, zone_id), errbuf, &result)) + StringFormat(query,"SELECT id FROM instance_lockout where id=%u AND zone=%u", + instance_id, zone_id); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) != 0) { mysql_free_result(result); @@ -2337,71 +2271,70 @@ bool Database::VerifyZoneInstance(uint32 zone_id, uint16 instance_id) return false; } } - else - { - safe_delete_array(query); - return false; - } return false; } bool Database::CharacterInInstanceGroup(uint16 instance_id, uint32 char_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; bool lockout_instance_player = false; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid FROM instance_lockout_player where id=%u AND charid=%u", - instance_id, char_id), errbuf, &result)) + StringFormat(query,"SELECT charid FROM instance_lockout_player where id=%u AND charid=%u", + instance_id, char_id); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) == 1) { lockout_instance_player = true; } mysql_free_result(result); } - else - { - safe_delete_array(query); - } + return lockout_instance_player; } void Database::DeleteInstance(uint16 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM instance_lockout WHERE id=%u", instance_id), errbuf); - safe_delete_array(query); + StringFormat(query,"DELETE FROM instance_lockout WHERE id=%u", instance_id); - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM instance_lockout_player WHERE id=%u", instance_id), errbuf); - safe_delete_array(query); + RunQuery(query, errbuf); - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM respawn_times WHERE instance_id=%u", instance_id), errbuf); - safe_delete_array(query); + StringFormat(query,"DELETE FROM instance_lockout_player WHERE id=%u", instance_id); + + RunQuery(query, errbuf); + + StringFormat(query,"DELETE FROM respawn_times WHERE instance_id=%u", instance_id); + + RunQuery(query, errbuf); + + StringFormat(query,"DELETE FROM spawn_condition_values WHERE instance_id=%u", instance_id); + + RunQuery(query, errbuf); - RunQuery(query, MakeAnyLenString(&query, "DELETE FROM spawn_condition_values WHERE instance_id=%u", instance_id), errbuf); - safe_delete_array(query); BuryCorpsesInInstance(instance_id); } bool Database::CheckInstanceExpired(uint16 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; int32 start_time = 0; int32 duration = 0; uint32 never_expires = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT start_time, duration, never_expires FROM instance_lockout WHERE id=%u", - instance_id), errbuf, &result)) + + StringFormat(query,"SELECT start_time, duration, never_expires FROM instance_lockout WHERE id=%u", instance_id); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) != 0) { row = mysql_fetch_row(result); @@ -2418,7 +2351,6 @@ bool Database::CheckInstanceExpired(uint16 instance_id) } else { - safe_delete_array(query); return true; } @@ -2439,15 +2371,14 @@ bool Database::CheckInstanceExpired(uint16 instance_id) uint32 Database::ZoneIDFromInstanceID(uint16 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 ret; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT zone FROM instance_lockout where id=%u", instance_id), - errbuf, &result)) - { - safe_delete_array(query); + StringFormat(query, "SELECT zone FROM instance_lockout where id=%u", instance_id); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) != 0) { row = mysql_fetch_row(result); @@ -2461,26 +2392,21 @@ uint32 Database::ZoneIDFromInstanceID(uint16 instance_id) return 0; } } - else - { - safe_delete_array(query); - return 0; - } return 0; } uint32 Database::VersionFromInstanceID(uint16 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 ret; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT version FROM instance_lockout where id=%u", instance_id), - errbuf, &result)) + StringFormat(query, "SELECT version FROM instance_lockout where id=%u", instance_id); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) != 0) { row = mysql_fetch_row(result); @@ -2496,7 +2422,6 @@ uint32 Database::VersionFromInstanceID(uint16 instance_id) } else { - safe_delete_array(query); return 0; } return 0; @@ -2505,17 +2430,17 @@ uint32 Database::VersionFromInstanceID(uint16 instance_id) uint32 Database::GetTimeRemainingInstance(uint16 instance_id, bool &is_perma) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 start_time = 0; uint32 duration = 0; uint32 never_expires = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT start_time, duration, never_expires FROM instance_lockout WHERE id=%u", - instance_id), errbuf, &result)) + StringFormat(query,"SELECT start_time, duration, never_expires FROM instance_lockout WHERE id=%u", + instance_id); + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) != 0) { row = mysql_fetch_row(result); @@ -2533,7 +2458,6 @@ uint32 Database::GetTimeRemainingInstance(uint16 instance_id, bool &is_perma) } else { - safe_delete_array(query); is_perma = false; return 0; } @@ -2556,15 +2480,13 @@ uint32 Database::GetTimeRemainingInstance(uint16 instance_id, bool &is_perma) bool Database::GetUnusedInstanceID(uint16 &instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT COUNT(*) FROM instance_lockout"), errbuf, &result)) - { - safe_delete_array(query); - if (mysql_num_rows(result) != 0) - { + StringFormat(query,"SELECT COUNT(*) FROM instance_lockout"); + if (RunQuery(query, errbuf, &result)) { + if (mysql_num_rows(result) != 0) { row = mysql_fetch_row(result); int count = atoi(row[0]); if(count == 0) @@ -2582,7 +2504,6 @@ bool Database::GetUnusedInstanceID(uint16 &instance_id) } else { - safe_delete_array(query); instance_id = 0; return false; } @@ -2590,9 +2511,9 @@ bool Database::GetUnusedInstanceID(uint16 &instance_id) int32 count = RuleI(Zone, ReservedInstances) + 1; int32 max = 65535; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id FROM instance_lockout where id >= %i ORDER BY id", count), errbuf, &result)) - { - safe_delete_array(query); + StringFormat(query,"SELECT id FROM instance_lockout where id >= %i ORDER BY id", count); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) != 0) { while((row = mysql_fetch_row(result))) @@ -2620,10 +2541,6 @@ bool Database::GetUnusedInstanceID(uint16 &instance_id) mysql_free_result(result); } } - else - { - safe_delete_array(query); - } instance_id = count; return true; } @@ -2632,33 +2549,29 @@ bool Database::GetUnusedInstanceID(uint16 &instance_id) bool Database::CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version, uint32 duration) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if(RunQuery(query, MakeAnyLenString(&query, "INSERT INTO instance_lockout (id, zone, version, start_time, duration)" - " values(%lu, %lu, %lu, UNIX_TIMESTAMP(), %lu)", (unsigned long)instance_id, (unsigned long)zone_id, (unsigned long)version, (unsigned long)duration), errbuf)) - { - safe_delete_array(query); - return true; - } - else - { - safe_delete_array(query); - return false; - } + StringFormat(query, "INSERT INTO instance_lockout (id, zone, version, start_time, duration)" + " values(%lu, %lu, %lu, UNIX_TIMESTAMP(), %lu)", + (unsigned long)instance_id, (unsigned long)zone_id, + (unsigned long)version, (unsigned long)duration); + + return RunQuery(query, errbuf); } void Database::PurgeExpiredInstances() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint16 id = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id FROM instance_lockout where " - "(start_time+duration) <= UNIX_TIMESTAMP() and never_expires = 0"), errbuf, &result)) + query = "SELECT id FROM instance_lockout where " + "(start_time+duration) <= UNIX_TIMESTAMP() and never_expires = 0"; + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) > 0) { row = mysql_fetch_row(result); @@ -2671,76 +2584,51 @@ void Database::PurgeExpiredInstances() } mysql_free_result(result); } - else - { - safe_delete_array(query); - } } bool Database::AddClientToInstance(uint16 instance_id, uint32 char_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if(RunQuery(query, MakeAnyLenString(&query, "INSERT INTO instance_lockout_player(id, charid) " - "values(%lu, %lu)", (unsigned long)instance_id, (unsigned long)char_id), errbuf)) - { - safe_delete_array(query); - return true; - } - else - { - safe_delete_array(query); - return false; - } + StringFormat(query, "INSERT INTO instance_lockout_player(id, charid) " + "values(%lu, %lu)", (unsigned long)instance_id, (unsigned long)char_id); + + return RunQuery(query, errbuf); } bool Database::RemoveClientFromInstance(uint16 instance_id, uint32 char_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if(RunQuery(query, MakeAnyLenString(&query, "DELETE FROM instance_lockout_player WHERE id=%lu AND charid=%lu", - (unsigned long)instance_id, (unsigned long)char_id), errbuf)) - { - safe_delete_array(query); - return true; - } - else - { - safe_delete_array(query); - return false; - } + StringFormat(query, "DELETE FROM instance_lockout_player WHERE id=%lu AND charid=%lu", + (unsigned long)instance_id, (unsigned long)char_id); + + return RunQuery(query, errbuf); } bool Database::RemoveClientsFromInstance(uint16 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if(RunQuery(query, MakeAnyLenString(&query, "DELETE FROM instance_lockout_player WHERE id=%lu", - (unsigned long)instance_id), errbuf)) - { - safe_delete_array(query); - return true; - } - else - { - safe_delete_array(query); - return false; - } + StringFormat(query, "DELETE FROM instance_lockout_player WHERE id=%lu", + (unsigned long)instance_id); + + return RunQuery(query, errbuf); } bool Database::CheckInstanceExists(uint16 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT * FROM instance_lockout where id=%u", instance_id), - errbuf, &result)) + StringFormat(query,"SELECT * FROM instance_lockout where id=%u", instance_id); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) != 0) { mysql_free_result(result); @@ -2749,26 +2637,22 @@ bool Database::CheckInstanceExists(uint16 instance_id) mysql_free_result(result); return false; } - else - { - safe_delete_array(query); - return false; - } + return false; } void Database::BuryCorpsesInInstance(uint16 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; - if(RunQuery(query, MakeAnyLenString(&query, "UPDATE player_corpses SET IsBurried=1, instanceid=0 WHERE instanceid=%u", - instance_id), errbuf, &result)) + StringFormat(query,"UPDATE player_corpses SET IsBurried=1, instanceid=0 WHERE instanceid=%u",instance_id); + + if(RunQuery(query, errbuf, &result)) { mysql_free_result(result); } - safe_delete_array(query); } uint16 Database::GetInstanceVersion(uint16 instance_id) @@ -2777,15 +2661,14 @@ uint16 Database::GetInstanceVersion(uint16 instance_id) return 0; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 ret; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT version FROM instance_lockout where id=%u", instance_id), - errbuf, &result)) - { - safe_delete_array(query); + StringFormat(query,"SELECT version FROM instance_lockout where id=%u", instance_id); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) != 0) { row = mysql_fetch_row(result); @@ -2799,27 +2682,25 @@ uint16 Database::GetInstanceVersion(uint16 instance_id) return 0; } } - else - { - safe_delete_array(query); - return 0; - } + return 0; } uint16 Database::GetInstanceID(const char* zone, uint32 charid, int16 version) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint16 ret; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT instance_lockout.id FROM instance_lockout, instance_lockout_player " - "WHERE instance_lockout.zone=%u AND instance_lockout.version=%u AND instance_lockout.id=instance_lockout_player.id AND " - "instance_lockout_player.charid=%u LIMIT 1;", GetZoneID(zone), version, charid, charid), errbuf, &result)) - { - safe_delete_array(query); + StringFormat(query, "SELECT instance_lockout.id FROM instance_lockout, instance_lockout_player " + "WHERE instance_lockout.zone=%u AND instance_lockout.version=%u AND " + "instance_lockout.id=instance_lockout_player.id AND " + "instance_lockout_player.charid=%u LIMIT 1;", + GetZoneID(zone), version, charid, charid); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) != 0) { row = mysql_fetch_row(result); @@ -2833,11 +2714,6 @@ uint16 Database::GetInstanceID(const char* zone, uint32 charid, int16 version) return 0; } } - else - { - safe_delete_array(query); - return 0; - } return 0; } @@ -2847,16 +2723,18 @@ uint16 Database::GetInstanceID(uint32 zone, uint32 charid, int16 version) return 0; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint16 ret; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT instance_lockout.id FROM instance_lockout, instance_lockout_player " - "WHERE instance_lockout.zone=%u AND instance_lockout.version=%u AND instance_lockout.id=instance_lockout_player.id AND " - "instance_lockout_player.charid=%u LIMIT 1;", zone, version, charid), errbuf, &result)) + StringFormat(query, "SELECT instance_lockout.id FROM instance_lockout, instance_lockout_player " + "WHERE instance_lockout.zone=%u AND instance_lockout.version=%u AND " + "instance_lockout.id=instance_lockout_player.id AND " + "instance_lockout_player.charid=%u LIMIT 1;", zone, version, charid); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) != 0) { row = mysql_fetch_row(result); @@ -2870,27 +2748,21 @@ uint16 Database::GetInstanceID(uint32 zone, uint32 charid, int16 version) return 0; } } - else - { - safe_delete_array(query); - return 0; - } return 0; } void Database::AssignGroupToInstance(uint32 gid, uint32 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 zone_id = ZoneIDFromInstanceID(instance_id); uint16 version = VersionFromInstanceID(instance_id); - if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid FROM group_id WHERE groupid=%u", gid), - errbuf, &result)) - { - safe_delete_array(query); + StringFormat(query,"SELECT charid FROM group_id WHERE groupid=%u", gid); + + if (RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result)) != nullptr) { uint32 charid = atoi(row[0]); @@ -2901,25 +2773,20 @@ void Database::AssignGroupToInstance(uint32 gid, uint32 instance_id) } mysql_free_result(result); } - else - { - safe_delete_array(query); - } } void Database::AssignRaidToInstance(uint32 rid, uint32 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 zone_id = ZoneIDFromInstanceID(instance_id); uint16 version = VersionFromInstanceID(instance_id); - if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid FROM raid_members WHERE raidid=%u", rid), - errbuf, &result)) - { - safe_delete_array(query); + StringFormat(query,"SELECT charid FROM raid_members WHERE raidid=%u", rid); + + if (RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result)) != nullptr) { uint32 charid = atoi(row[0]); @@ -2930,10 +2797,6 @@ void Database::AssignRaidToInstance(uint32 rid, uint32 instance_id) } mysql_free_result(result); } - else - { - safe_delete_array(query); - } } void Database::FlagInstanceByGroupLeader(uint32 zone, int16 version, uint32 charid, uint32 gid) @@ -2972,35 +2835,29 @@ void Database::FlagInstanceByRaidLeader(uint32 zone, int16 version, uint32 chari void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if(RunQuery(query, MakeAnyLenString(&query, "UPDATE `instance_lockout` SET start_time=UNIX_TIMESTAMP(), " - "duration=%u WHERE id=%u", new_duration, instance_id), errbuf)) - { - safe_delete_array(query); - } - else - { - //error - safe_delete_array(query); - } + StringFormat(query, "UPDATE `instance_lockout` SET start_time=UNIX_TIMESTAMP(), " + "duration=%u WHERE id=%u", new_duration, instance_id); + + RunQuery(query, errbuf); } bool Database::GlobalInstance(uint16 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - bool ret; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT is_global from instance_lockout where id=%u LIMIT 1", instance_id), errbuf, &result)) + StringFormat(query, "SELECT is_global from instance_lockout where id=%u LIMIT 1", instance_id); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); row = mysql_fetch_row(result); if(row) { - ret = (atoi(row[0]) == 1) ? true : false; + return (atoi(row[0]) == 1) ? true : false; } else { @@ -3008,18 +2865,14 @@ bool Database::GlobalInstance(uint16 instance_id) return false; } } - else - { - safe_delete_array(query); - return false; - } - return ret; + + return false; } void Database::UpdateAdventureStatsEntry(uint32 char_id, uint8 theme, bool win) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected = 0; std::string field; @@ -3095,29 +2948,18 @@ void Database::UpdateAdventureStatsEntry(uint32 char_id, uint8 theme, bool win) } } - if(RunQuery(query, MakeAnyLenString(&query, "UPDATE `adventure_stats` SET %s=%s+1 WHERE player_id=%u", - field.c_str(), field.c_str(), char_id), errbuf, nullptr, &affected)) - { - safe_delete_array(query); - } - else - { - //error - safe_delete_array(query); - } + StringFormat(query, "UPDATE `adventure_stats` SET %s=%s+1 WHERE player_id=%u", + field.c_str(), field.c_str(), char_id); + + RunQuery(query, errbuf, nullptr, &affected); if(affected == 0) { - if(RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `adventure_stats` SET %s=1, player_id=%u", - field.c_str(), char_id), errbuf)) - { - safe_delete_array(query); - } - else - { - //error - safe_delete_array(query); - } + + StringFormat(query, "INSERT INTO `adventure_stats` SET %s=1, player_id=%u", + field.c_str(), char_id); + + RunQuery(query, errbuf); } } @@ -3125,15 +2967,16 @@ bool Database::GetAdventureStats(uint32 char_id, uint32 &guk_w, uint32 &mir_w, u uint32 &tak_w, uint32 &guk_l, uint32 &mir_l, uint32 &mmc_l, uint32 &ruj_l, uint32 &tak_l) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT `guk_wins`, `mir_wins`, `mmc_wins`, `ruj_wins`, `tak_wins`, " - "`guk_losses`, `mir_losses`, `mmc_losses`, `ruj_losses`, `tak_losses` FROM `adventure_stats` WHERE player_id=%u", - char_id), errbuf, &result)) + StringFormat(query, "SELECT `guk_wins`, `mir_wins`, `mmc_wins`, `ruj_wins`, `tak_wins`, " + "`guk_losses`, `mir_losses`, `mmc_losses`, `ruj_losses`, `tak_losses` " + "FROM `adventure_stats` WHERE player_id=%u", char_id); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while((row = mysql_fetch_row(result)) != nullptr) { guk_w = atoi(row[0]); @@ -3150,20 +2993,19 @@ bool Database::GetAdventureStats(uint32 char_id, uint32 &guk_w, uint32 &mir_w, u mysql_free_result(result); return true; } - else - { - safe_delete_array(query); - return false; - } + + return false; } uint32 Database::GetGuildDBIDByCharID(uint32 char_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; int retVal = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT guild_id FROM guild_members WHERE char_id='%i'", char_id), errbuf, &result)) { + StringFormat(query, "SELECT guild_id FROM guild_members WHERE char_id='%i'", char_id); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { MYSQL_ROW row = mysql_fetch_row(result); retVal = atoi(row[0]); @@ -3173,6 +3015,6 @@ uint32 Database::GetGuildDBIDByCharID(uint32 char_id) { else { std::cerr << "Error in GetAccountIDByChar query '" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); + return retVal; } diff --git a/common/database.h b/common/database.h index b194476b8..ccf1402a4 100644 --- a/common/database.h +++ b/common/database.h @@ -221,7 +221,7 @@ public: bool GetVariable(const char* varname, char* varvalue, uint16 varvalue_len); bool SetVariable(const char* varname, const char* varvalue); bool LoadVariables(); - uint32 LoadVariables_MQ(char** query); + void LoadVariables_MQ(std::string& query); bool LoadVariables_result(MYSQL_RES* result); /* diff --git a/common/dbasync.cpp b/common/dbasync.cpp index 5b23a47a2..645a803ec 100644 --- a/common/dbasync.cpp +++ b/common/dbasync.cpp @@ -29,9 +29,11 @@ bool DBAsyncCB_LoadVariables(DBAsyncWork* iWork) { } void AsyncLoadVariables(DBAsync *dba, Database *db) { - char* query = 0; + std::string query; DBAsyncWork* dbaw = new DBAsyncWork(db, &DBAsyncCB_LoadVariables, 0, DBAsync::Read); - dbaw->AddQuery(0, &query, db->LoadVariables_MQ(&query)); + db->LoadVariables_MQ(query); + + dbaw->AddQuery(0, query); dba->AddWork(&dbaw); } @@ -466,8 +468,8 @@ bool DBAsyncWork::AddQuery(DBAsyncQuery** iDBAQ) { return ret; } -bool DBAsyncWork::AddQuery(uint32 iQPT, char** iQuery, uint32 iQueryLen, bool iGetResultSet, bool iGetErrbuf) { - DBAsyncQuery* DBAQ = new DBAsyncQuery(iQPT, iQuery, iQueryLen, iGetResultSet, iGetErrbuf); +bool DBAsyncWork::AddQuery(uint32 iQPT, std::string iQuery, bool iGetResultSet, bool iGetErrbuf) { + DBAsyncQuery* DBAQ = new DBAsyncQuery(iQPT, iQuery, iGetResultSet, iGetErrbuf); if (AddQuery(&DBAQ)) return true; else { @@ -587,24 +589,11 @@ void DBAsyncWork::PushAnswer(DBAsyncQuery* iDBAQ) { } -DBAsyncQuery::DBAsyncQuery(uint32 iQPT, char** iQuery, uint32 iQueryLen, bool iGetResultSet, bool iGetErrbuf) { - if (iQueryLen == 0xFFFFFFFF) - pQueryLen = strlen(*iQuery); - else - pQueryLen = iQueryLen; - pQuery = *iQuery; - *iQuery = 0; +DBAsyncQuery::DBAsyncQuery(uint32 iQPT, std::string iQuery, bool iGetResultSet, bool iGetErrbuf) { + pQuery = iQuery; Init(iQPT, iGetResultSet, iGetErrbuf); } -DBAsyncQuery::DBAsyncQuery(uint32 iQPT, const char* iQuery, uint32 iQueryLen, bool iGetResultSet, bool iGetErrbuf) { - if (iQueryLen == 0xFFFFFFFF) - pQueryLen = strlen(iQuery); - else - pQueryLen = iQueryLen; - pQuery = strn0cpy(new char[pQueryLen+1], iQuery, pQueryLen+1); - Init(iQPT, iGetResultSet, iGetErrbuf); -} void DBAsyncQuery::Init(uint32 iQPT, bool iGetResultSet, bool iGetErrbuf) { pstatus = DBAsync::AddingWork; @@ -622,7 +611,6 @@ void DBAsyncQuery::Init(uint32 iQPT, bool iGetResultSet, bool iGetErrbuf) { DBAsyncQuery::~DBAsyncQuery() { safe_delete_array(perrbuf); - safe_delete_array(pQuery); if (presult) mysql_free_result(presult); } @@ -663,7 +651,7 @@ void DBAsyncQuery::Process(DBcore* iDBC) { MYSQL_RES** resultPP = 0; if (pGetResultSet) resultPP = &presult; - pmysqlsuccess = iDBC->RunQuery(pQuery, pQueryLen, perrbuf, resultPP, &paffected_rows, &plast_insert_id, &perrnum); + pmysqlsuccess = iDBC->RunQuery(pQuery, perrbuf, resultPP, &paffected_rows, &plast_insert_id, &perrnum); pstatus = DBAsync::Finished; } diff --git a/common/dbasync.h b/common/dbasync.h index f65f9cb58..b7bec75cf 100644 --- a/common/dbasync.h +++ b/common/dbasync.h @@ -96,7 +96,7 @@ public: ~DBAsyncWork(); bool AddQuery(DBAsyncQuery** iDBAQ); - bool AddQuery(uint32 iQPT, char** iQuery, uint32 iQueryLen = 0xFFFFFFFF, bool iGetResultSet = true, bool iGetErrbuf = true); + bool AddQuery(uint32 iQPT, std::string iQuery, bool iGetResultSet = true, bool iGetErrbuf = true); uint32 WPT(); DBAsync::Type Type(); @@ -140,8 +140,7 @@ private: // Container class for the query information class DBAsyncQuery { public: - DBAsyncQuery(uint32 iQPT, char** iQuery, uint32 iQueryLen = 0xFFFFFFFF, bool iGetResultSet = true, bool iGetErrbuf = true); - DBAsyncQuery(uint32 iQPT, const char* iQuery, uint32 iQueryLen = 0xFFFFFFFF, bool iGetResultSet = true, bool iGetErrbuf = true); + DBAsyncQuery(uint32 iQPT, std::string iQuery, bool iGetResultSet = true, bool iGetErrbuf = true); ~DBAsyncQuery(); bool GetAnswer(char* errbuf = 0, MYSQL_RES** result = 0, uint32* affected_rows = 0, uint32* last_insert_id = 0, uint32* errnum = 0); @@ -155,8 +154,7 @@ protected: void Init(uint32 iQPT, bool iGetResultSet, bool iGetErrbuf); DBAsync::Status pstatus; - char* pQuery; - uint32 pQueryLen; + std::string pQuery; bool pGetResultSet; bool pGetErrbuf; diff --git a/common/dbcore.cpp b/common/dbcore.cpp index 3f215cd0f..600fe11a6 100644 --- a/common/dbcore.cpp +++ b/common/dbcore.cpp @@ -12,6 +12,7 @@ #include #include "../common/MiscFunctions.h" #include +#include #ifdef _WINDOWS #define snprintf _snprintf @@ -58,7 +59,7 @@ void DBcore::ping() { MDatabase.unlock(); } -bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RES** result, uint32* affected_rows, uint32* last_insert_id, uint32* errnum, bool retry) { +bool DBcore::RunQuery(const std::string& query, char* errbuf, MYSQL_RES** result, uint32* affected_rows, uint32* last_insert_id, uint32* errnum, bool retry) { _CP(DBcore_RunQuery); if (errnum) *errnum = 0; @@ -70,16 +71,16 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE Open(); #if DEBUG_MYSQL_QUERIES >= 1 char tmp[120]; - strn0cpy(tmp, query, sizeof(tmp)); + strn0cpy(tmp, query.c_str(), sizeof(tmp)); std::cout << "QUERY: " << tmp << std::endl; #endif - if (mysql_real_query(&mysql, query, querylen)) { + if (mysql_real_query(&mysql, query.c_str(), query.length())) { if (mysql_errno(&mysql) == CR_SERVER_GONE_ERROR) pStatus = Error; if (mysql_errno(&mysql) == CR_SERVER_LOST || mysql_errno(&mysql) == CR_SERVER_GONE_ERROR) { if (retry) { std::cout << "Database Error: Lost connection, attempting to recover...." << std::endl; - ret = RunQuery(query, querylen, errbuf, result, affected_rows, last_insert_id, errnum, false); + ret = RunQuery(query, errbuf, result, affected_rows, last_insert_id, errnum, false); if (ret) std::cout << "Reconnection to database successful." << std::endl; } @@ -152,10 +153,13 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE return ret; } -uint32 DBcore::DoEscapeString(char* tobuf, const char* frombuf, uint32 fromlen) { +void DBcore::DoEscapeString(std::string& outString, const char* frombuf, uint32 fromlen) { // No good reason to lock the DB, we only need it in the first place to check char encoding. // LockMutex lock(&MDatabase); - return mysql_real_escape_string(&mysql, tobuf, frombuf, fromlen); + char* tobuf = new char[sizeof(frombuf)*fromlen*2](); + unsigned long length = mysql_real_escape_string(&mysql, tobuf, frombuf, fromlen); + outString.assign(tobuf,length); + safe_delete_array(tobuf); } bool DBcore::Open(const char* iHost, const char* iUser, const char* iPassword, const char* iDatabase,uint32 iPort, uint32* errnum, char* errbuf, bool iCompress, bool iSSL) { diff --git a/common/dbcore.h b/common/dbcore.h index ed5e62133..25e33fcf2 100644 --- a/common/dbcore.h +++ b/common/dbcore.h @@ -7,6 +7,7 @@ //#include #endif #include +#include #include "../common/types.h" #include "../common/Mutex.h" #include "../common/linked_list.h" @@ -21,8 +22,8 @@ public: DBcore(); ~DBcore(); eStatus GetStatus() { return pStatus; } - bool RunQuery(const char* query, uint32 querylen, char* errbuf = 0, MYSQL_RES** result = 0, uint32* affected_rows = 0, uint32* last_insert_id = 0, uint32* errnum = 0, bool retry = true); - uint32 DoEscapeString(char* tobuf, const char* frombuf, uint32 fromlen); + bool RunQuery(const std::string& query, char* errbuf = 0, MYSQL_RES** result = 0, uint32* affected_rows = 0, uint32* last_insert_id = 0, uint32* errnum = 0, bool retry = true); + void DoEscapeString(std::string& outString, const char* frombuf, uint32 fromlen); void ping(); MYSQL* getMySQL(){ return &mysql; } diff --git a/common/debug.cpp b/common/debug.cpp index cb2b0ddf0..2e3d7d3e0 100644 --- a/common/debug.cpp +++ b/common/debug.cpp @@ -5,12 +5,6 @@ #ifdef _WINDOWS #include - - #define snprintf _snprintf - #define vsnprintf _vsnprintf - #define strncasecmp _strnicmp - #define strcasecmp _stricmp - #else #include diff --git a/common/guild_base.cpp b/common/guild_base.cpp index 46e058901..959194401 100644 --- a/common/guild_base.cpp +++ b/common/guild_base.cpp @@ -50,32 +50,32 @@ bool BaseGuildManager::LoadGuilds() { } char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; std::map::iterator res; + StringFormat(query, "SELECT id, name, leader, minstatus, motd, motd_setter,channel, url FROM guilds"); + // load up all the guilds - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "SELECT id, name, leader, minstatus, motd, motd_setter,channel,url FROM guilds"), errbuf, &result)) { - _log(GUILDS__ERROR, "Error loading guilds '%s': %s", query, errbuf); - safe_delete_array(query); + if (!m_db->RunQuery(query, errbuf, &result)) { + _log(GUILDS__ERROR, "Error loading guilds '%s': %s", query.c_str(), errbuf); return(false); } - safe_delete_array(query); while ((row = mysql_fetch_row(result))) { _CreateGuild(atoi(row[0]), row[1], atoi(row[2]), atoi(row[3]), row[4], row[5], row[6], row[7]); } mysql_free_result(result); + StringFormat(query,"SELECT guild_id, rank, title, can_hear, can_speak, can_invite, can_remove, can_promote," + "can_demote, can_motd, can_warpeace FROM guild_ranks"); + //load up the rank info for each guild. - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "SELECT guild_id,rank,title,can_hear,can_speak,can_invite,can_remove,can_promote,can_demote,can_motd,can_warpeace FROM guild_ranks"), errbuf, &result)) { - _log(GUILDS__ERROR, "Error loading guild ranks '%s': %s", query, errbuf); - safe_delete_array(query); + if (!m_db->RunQuery(query, errbuf, &result)) { + _log(GUILDS__ERROR, "Error loading guild ranks '%s': %s", query.c_str(), errbuf); return(false); } - safe_delete_array(query); + while ((row = mysql_fetch_row(result))) { uint32 guild_id = atoi(row[0]); uint8 rankn = atoi(row[1]); @@ -114,20 +114,21 @@ bool BaseGuildManager::RefreshGuild(uint32 guild_id) { } char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; std::map::iterator res; GuildInfo *info; // load up all the guilds - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "SELECT name, leader, minstatus, motd, motd_setter, channel,url FROM guilds WHERE id=%lu", (unsigned long)guild_id), errbuf, &result)) { - _log(GUILDS__ERROR, "Error reloading guilds '%s': %s", query, errbuf); - safe_delete_array(query); + StringFormat(query,"SELECT name, leader, minstatus, motd, motd_setter, channel, url" + " FROM guilds WHERE id=%lu", (unsigned long)guild_id); + + if (!m_db->RunQuery(query, errbuf, &result)) { + _log(GUILDS__ERROR, "Error reloading guilds '%s': %s", query.c_str(), errbuf); return(false); } - safe_delete_array(query); + if ((row = mysql_fetch_row(result))) { //delete the old entry and create the new one. info = _CreateGuild(guild_id, row[0], atoi(row[1]), atoi(row[2]), row[3], row[4], row[5], row[6]); @@ -138,14 +139,13 @@ bool BaseGuildManager::RefreshGuild(uint32 guild_id) { mysql_free_result(result); //load up the rank info for each guild. - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "SELECT guild_id,rank,title,can_hear,can_speak,can_invite,can_remove,can_promote,can_demote,can_motd,can_warpeace " - "FROM guild_ranks WHERE guild_id=%lu", (unsigned long)guild_id), errbuf, &result)) { - _log(GUILDS__ERROR, "Error reloading guild ranks '%s': %s", query, errbuf); - safe_delete_array(query); + StringFormat(query,"SELECT guild_id,rank,title,can_hear,can_speak,can_invite,can_remove,can_promote,can_demote,can_motd,can_warpeace " + "FROM guild_ranks WHERE guild_id=%lu", (unsigned long)guild_id); + + if (!m_db->RunQuery(query, errbuf, &result)) { + _log(GUILDS__ERROR, "Error reloading guild ranks '%s': %s", query.c_str(), errbuf); return(false); } - safe_delete_array(query); while((row = mysql_fetch_row(result))) { uint8 rankn = atoi(row[1]); @@ -232,77 +232,62 @@ bool BaseGuildManager::_StoreGuildDB(uint32 guild_id) { GuildInfo *info = res->second; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; //clear out old `guilds` entry - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM guilds WHERE id=%lu", (unsigned long)guild_id), errbuf)) - { - _log(GUILDS__ERROR, "Error clearing old guild record when storing %d '%s': %s", guild_id, query, errbuf); + StringFormat(query, "DELETE FROM guilds WHERE id=%lu", (unsigned long)guild_id); + if (!m_db->RunQuery(query, errbuf)) { + _log(GUILDS__ERROR, "Error clearing old guild record when storing %d '%s': %s", guild_id, query.c_str(), errbuf); } - safe_delete_array(query); //clear out old `guild_ranks` entries - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM guild_ranks WHERE guild_id=%lu", (unsigned long)guild_id), errbuf)) - { - _log(GUILDS__ERROR, "Error clearing old guild_ranks records when storing %d '%s': %s", guild_id, query, errbuf); + StringFormat(query, "DELETE FROM guild_ranks WHERE guild_id=%lu", (unsigned long)guild_id); + if (!m_db->RunQuery(query, errbuf)) { + _log(GUILDS__ERROR, "Error clearing old guild_ranks records when storing %d '%s': %s", guild_id, query.c_str(), errbuf); } - safe_delete_array(query); //escape our strings. - char *name_esc = new char[info->name.length()*2+1]; - char *motd_esc = new char[info->motd.length()*2+1]; - char *motd_set_esc = new char[info->motd_setter.length()*2+1]; + std::string name_esc; + std::string motd_esc; + std::string motd_set_esc; m_db->DoEscapeString(name_esc, info->name.c_str(), info->name.length()); m_db->DoEscapeString(motd_esc, info->motd.c_str(), info->motd.length()); m_db->DoEscapeString(motd_set_esc, info->motd_setter.c_str(), info->motd_setter.length()); //insert the new `guilds` entry - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO guilds (id,name,leader,minstatus,motd,motd_setter) VALUES(%lu,'%s',%lu,%d,'%s', '%s')", - (unsigned long)guild_id, name_esc, (unsigned long)info->leader_char_id, info->minstatus, motd_esc, motd_set_esc), errbuf)) + StringFormat(query, "INSERT INTO guilds (id,name,leader,minstatus,motd,motd_setter) VALUES(%lu,'%s',%lu,%d,'%s', '%s')", + (unsigned long)guild_id, name_esc.c_str(), (unsigned long)info->leader_char_id, info->minstatus, motd_esc.c_str(), motd_set_esc.c_str()); + + if (!m_db->RunQuery(query, errbuf)) { - _log(GUILDS__ERROR, "Error inserting new guild record when storing %d. Giving up. '%s': %s", guild_id, query, errbuf); - safe_delete_array(query); - safe_delete_array(name_esc); - safe_delete_array(motd_esc); - safe_delete_array(motd_set_esc); + _log(GUILDS__ERROR, "Error inserting new guild record when storing %d. Giving up. '%s': %s", guild_id, query.c_str(), errbuf); return(false); } - safe_delete_array(query); - safe_delete_array(name_esc); - safe_delete_array(motd_esc); - safe_delete_array(motd_set_esc); //now insert the new ranks uint8 rank; for(rank = 0; rank <= GUILD_MAX_RANK; rank++) { const RankInfo &r = info->ranks[rank]; - char *title_esc = new char[r.name.length()*2+1]; + std::string title_esc; m_db->DoEscapeString(title_esc, r.name.c_str(), r.name.length()); - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO guild_ranks (guild_id,rank,title,can_hear,can_speak,can_invite,can_remove,can_promote,can_demote,can_motd,can_warpeace)" - " VALUES(%d,%d,'%s',%d,%d,%d,%d,%d,%d,%d,%d)", - guild_id, rank, title_esc, - r.permissions[GUILD_HEAR], - r.permissions[GUILD_SPEAK], - r.permissions[GUILD_INVITE], - r.permissions[GUILD_REMOVE], - r.permissions[GUILD_PROMOTE], - r.permissions[GUILD_DEMOTE], - r.permissions[GUILD_MOTD], - r.permissions[GUILD_WARPEACE]), errbuf)) - { - _log(GUILDS__ERROR, "Error inserting new guild rank record when storing %d for %d. Giving up. '%s': %s", rank, guild_id, query, errbuf); - safe_delete_array(query); - safe_delete_array(title_esc); + StringFormat(query,"INSERT INTO guild_ranks (guild_id,rank,title,can_hear,can_speak,can_invite,can_remove,can_promote,can_demote,can_motd,can_warpeace)" + " VALUES(%d,%d,'%s',%d,%d,%d,%d,%d,%d,%d,%d)", + guild_id, rank, title_esc.c_str(), + r.permissions[GUILD_HEAR], + r.permissions[GUILD_SPEAK], + r.permissions[GUILD_INVITE], + r.permissions[GUILD_REMOVE], + r.permissions[GUILD_PROMOTE], + r.permissions[GUILD_DEMOTE], + r.permissions[GUILD_MOTD], + r.permissions[GUILD_WARPEACE]); + + if (!m_db->RunQuery(query, errbuf)) { + _log(GUILDS__ERROR, "Error inserting new guild rank record when storing %d for %d. Giving up. '%s': %s", rank, guild_id, query.c_str(), errbuf); return(false); } - safe_delete_array(query); - safe_delete_array(title_esc); } _log(GUILDS__DB, "Stored guild %d in the database", guild_id); @@ -317,7 +302,7 @@ uint32 BaseGuildManager::_GetFreeGuildID() { } char errbuf[MYSQL_ERRMSG_SIZE]; - char query[100]; + std::string query; MYSQL_RES *result; //this has got to be one of the more retarded things I have seen. @@ -325,9 +310,9 @@ uint32 BaseGuildManager::_GetFreeGuildID() { uint16 x; for (x = 1; x < MAX_NUMBER_GUILDS; x++) { - snprintf(query, 100, "SELECT id FROM guilds where id=%i;", x); + StringFormat(query,"SELECT id FROM guilds where id=%i;", x); - if (m_db->RunQuery(query, strlen(query), errbuf, &result)) { + if (m_db->RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 0) { mysql_free_result(result); _log(GUILDS__DB, "Located free guild ID %d in the database", x); @@ -336,7 +321,7 @@ uint32 BaseGuildManager::_GetFreeGuildID() { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in _GetFreeGuildID query '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in _GetFreeGuildID query '%s': %s", query.c_str(), errbuf); } } @@ -529,23 +514,23 @@ bool BaseGuildManager::DBDeleteGuild(uint32 guild_id) { return(false); } - char *query = 0; + std::string query; //clear out old `guilds` entry - _RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM guilds WHERE id=%lu", (unsigned long)guild_id), "clearing old guild record"); + StringFormat(query,"DELETE FROM guilds WHERE id=%lu", (unsigned long)guild_id); + _RunQuery(query, "clearing old guild record"); //clear out old `guild_ranks` entries - _RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM guild_ranks WHERE guild_id=%lu", (unsigned long)guild_id), "clearing old guild_ranks records"); + StringFormat(query,"DELETE FROM guild_ranks WHERE guild_id=%lu", (unsigned long)guild_id); + _RunQuery(query, "clearing old guild_ranks records"); //clear out people belonging to this guild. - _RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM guild_members WHERE guild_id=%lu", (unsigned long)guild_id), "clearing chars in guild"); + StringFormat(query,"DELETE FROM guild_members WHERE guild_id=%lu", (unsigned long)guild_id); + _RunQuery(query, "clearing chars in guild"); // Delete the guild bank - _RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM guild_bank WHERE guildid=%lu", (unsigned long)guild_id), "deleting guild bank"); + StringFormat(query,"DELETE FROM guild_bank WHERE guildid=%lu", (unsigned long)guild_id); + _RunQuery(query, "deleting guild bank"); _log(GUILDS__DB, "Deleted guild %d from the database.", guild_id); @@ -565,25 +550,22 @@ bool BaseGuildManager::DBRenameGuild(uint32 guild_id, const char* name) { GuildInfo *info = res->second; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; //escape our strings. uint32 len = strlen(name); - char *esc = new char[len*2+1]; + std::string esc; m_db->DoEscapeString(esc, name, len); //insert the new `guilds` entry - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "UPDATE guilds SET name='%s' WHERE id=%d", - esc, guild_id), errbuf)) + StringFormat(query, "UPDATE guilds SET name='%s' WHERE id=%d", + esc.c_str(), guild_id); + + if (!m_db->RunQuery(query, errbuf)) { - _log(GUILDS__ERROR, "Error renaming guild %d '%s': %s", guild_id, query, errbuf); - safe_delete_array(query); - safe_delete_array(esc); + _log(GUILDS__ERROR, "Error renaming guild %d '%s': %s", guild_id, query.c_str(), errbuf); return(false); } - safe_delete_array(query); - safe_delete_array(esc); _log(GUILDS__DB, "Renamed guild %s (%d) to %s in database.", info->name.c_str(), guild_id, name); @@ -605,18 +587,16 @@ bool BaseGuildManager::DBSetGuildLeader(uint32 guild_id, uint32 leader) { GuildInfo *info = res->second; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; //insert the new `guilds` entry - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "UPDATE guilds SET leader='%d' WHERE id=%d", - leader, guild_id), errbuf)) - { - _log(GUILDS__ERROR, "Error changing leader on guild %d '%s': %s", guild_id, query, errbuf); - safe_delete_array(query); + StringFormat(query, "UPDATE guilds SET leader='%d' WHERE id=%d", + leader, guild_id); + + if (!m_db->RunQuery(query, errbuf)) { + _log(GUILDS__ERROR, "Error changing leader on guild %d '%s': %s", guild_id, query.c_str(), errbuf); return(false); } - safe_delete_array(query); //set the old leader to officer if(!DBSetGuildRank(info->leader_char_id, GUILD_OFFICER)) @@ -645,30 +625,24 @@ bool BaseGuildManager::DBSetGuildMOTD(uint32 guild_id, const char* motd, const c GuildInfo *info = res->second; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; //escape our strings. uint32 len = strlen(motd); uint32 len2 = strlen(setter); - char *esc = new char[len*2+1]; - char *esc_set = new char[len2*2+1]; + std::string esc; + std::string esc_set; m_db->DoEscapeString(esc, motd, len); m_db->DoEscapeString(esc_set, setter, len2); //insert the new `guilds` entry - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "UPDATE guilds SET motd='%s',motd_setter='%s' WHERE id=%d", - esc, esc_set, guild_id), errbuf)) - { - _log(GUILDS__ERROR, "Error setting MOTD for guild %d '%s': %s", guild_id, query, errbuf); - safe_delete_array(query); - safe_delete_array(esc); - safe_delete_array(esc_set); + StringFormat(query,"UPDATE guilds SET motd='%s',motd_setter='%s' WHERE id=%d", + esc.c_str(), esc_set.c_str(), guild_id); + + if (!m_db->RunQuery(query, errbuf)) { + _log(GUILDS__ERROR, "Error setting MOTD for guild %d '%s': %s", guild_id, query.c_str(), errbuf); return(false); } - safe_delete_array(query); - safe_delete_array(esc); - safe_delete_array(esc_set); _log(GUILDS__DB, "Set MOTD for guild %d in the database", guild_id); @@ -693,24 +667,23 @@ bool BaseGuildManager::DBSetGuildURL(uint32 GuildID, const char* URL) GuildInfo *info = res->second; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; //escape our strings. uint32 len = strlen(URL); - char *esc = new char[len*2+1]; + std::string esc; m_db->DoEscapeString(esc, URL, len); - if (!m_db->RunQuery(query, MakeAnyLenString(&query, "UPDATE guilds SET url='%s' WHERE id=%d", esc, GuildID), errbuf)) + StringFormat(query, "UPDATE guilds SET url='%s' WHERE id=%d", + esc.c_str(), GuildID); + + if (!m_db->RunQuery(query, errbuf)) { - _log(GUILDS__ERROR, "Error setting URL for guild %d '%s': %s", GuildID, query, errbuf); - safe_delete_array(query); - safe_delete_array(esc); + _log(GUILDS__ERROR, "Error setting URL for guild %d '%s': %s", GuildID, query.c_str(), errbuf); return(false); } - safe_delete_array(query); - safe_delete_array(esc); _log(GUILDS__DB, "Set URL for guild %d in the database", GuildID); @@ -734,24 +707,21 @@ bool BaseGuildManager::DBSetGuildChannel(uint32 GuildID, const char* Channel) GuildInfo *info = res->second; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; //escape our strings. uint32 len = strlen(Channel); - char *esc = new char[len*2+1]; + std::string esc; m_db->DoEscapeString(esc, Channel, len); - if (!m_db->RunQuery(query, MakeAnyLenString(&query, "UPDATE guilds SET channel='%s' WHERE id=%d", esc, GuildID), errbuf)) - { - _log(GUILDS__ERROR, "Error setting Channel for guild %d '%s': %s", GuildID, query, errbuf); - safe_delete_array(query); - safe_delete_array(esc); + StringFormat(query,"UPDATE guilds SET channel='%s' WHERE id=%d", esc.c_str(), GuildID); + + if (!m_db->RunQuery(query, errbuf)) { + _log(GUILDS__ERROR, "Error setting Channel for guild %d '%s': %s", GuildID, query.c_str(), errbuf); return(false); } - safe_delete_array(query); - safe_delete_array(esc); _log(GUILDS__DB, "Set Channel for guild %d in the database", GuildID); @@ -767,28 +737,25 @@ bool BaseGuildManager::DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank) { } char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; if(guild_id != GUILD_NONE) { - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "REPLACE INTO guild_members (char_id,guild_id,rank) VALUES(%d,%d,%d)", - charid, guild_id, rank), errbuf)) - { - _log(GUILDS__ERROR, "Error Changing char %d to guild %d '%s': %s", charid, guild_id, query, errbuf); - safe_delete_array(query); + StringFormat(query, "REPLACE INTO guild_members (char_id,guild_id,rank) VALUES(%d,%d,%d)", + charid, guild_id, rank); + + if (!m_db->RunQuery(query, errbuf)) { + _log(GUILDS__ERROR, "Error Changing char %d to guild %d '%s': %s", charid, guild_id, query.c_str(), errbuf); return(false); } - } else { - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM guild_members WHERE char_id=%d", - charid), errbuf)) - { - _log(GUILDS__ERROR, "Error removing char %d from guild '%s': %s", charid, guild_id, query, errbuf); - safe_delete_array(query); + } + else { + StringFormat(query, "DELETE FROM guild_members WHERE char_id=%d", charid); + + if (!m_db->RunQuery(query, errbuf)) { + _log(GUILDS__ERROR, "Error removing char %d from guild '%s': %s", charid, guild_id, query.c_str(), errbuf); return(false); } } - safe_delete_array(query); _log(GUILDS__DB, "Set char %d to guild %d and rank %d in the database.", charid, guild_id, rank); @@ -796,40 +763,38 @@ bool BaseGuildManager::DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank) { } bool BaseGuildManager::DBSetGuildRank(uint32 charid, uint8 rank) { - char *query = 0; - return(_RunQuery(query, MakeAnyLenString(&query, - "UPDATE guild_members SET rank=%d WHERE char_id=%d", - rank, charid), "setting a guild member's rank")); + std::string query; + StringFormat(query, "UPDATE guild_members SET rank=%d WHERE char_id=%d", rank, charid); + + return(_RunQuery(query, "setting a guild member's rank")); } bool BaseGuildManager::DBSetBankerFlag(uint32 charid, bool is_banker) { - char *query = 0; - return(_RunQuery(query, MakeAnyLenString(&query, - "UPDATE guild_members SET banker=%d WHERE char_id=%d", - is_banker?1:0, charid), "setting a guild member's banker flag")); + std::string query; + StringFormat(query, "UPDATE guild_members SET banker=%d WHERE char_id=%d", + is_banker?1:0, charid); + return(_RunQuery(query, "setting a guild member's banker flag")); } bool BaseGuildManager::GetBankerFlag(uint32 CharID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; if(!m_db) return false; - if(!m_db->RunQuery(query, MakeAnyLenString(&query, "select `banker` from `guild_members` where char_id=%i LIMIT 1", CharID), errbuf, &result)) - { - _log(GUILDS__ERROR, "Error retrieving banker flag '%s': %s", query, errbuf); + StringFormat(query,"select `banker` from `guild_members` where char_id=%i LIMIT 1", CharID); - safe_delete_array(query); + if(!m_db->RunQuery(query, errbuf, &result)) + { + _log(GUILDS__ERROR, "Error retrieving banker flag '%s': %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); - if(mysql_num_rows(result) != 1) return false; @@ -844,34 +809,31 @@ bool BaseGuildManager::GetBankerFlag(uint32 CharID) bool BaseGuildManager::DBSetAltFlag(uint32 charid, bool is_alt) { - char *query = 0; + std::string query; - return(_RunQuery(query, MakeAnyLenString(&query, - "UPDATE guild_members SET alt=%d WHERE char_id=%d", - is_alt?1:0, charid), "setting a guild member's alt flag")); + StringFormat(query,"UPDATE guild_members SET alt=%d WHERE char_id=%d", + is_alt?1:0, charid); + return(_RunQuery(query, "setting a guild member's alt flag")); } bool BaseGuildManager::GetAltFlag(uint32 CharID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; if(!m_db) return false; - if(!m_db->RunQuery(query, MakeAnyLenString(&query, "select `alt` from `guild_members` where char_id=%i LIMIT 1", CharID), errbuf, &result)) - { - _log(GUILDS__ERROR, "Error retrieving alt flag '%s': %s", query, errbuf); + StringFormat(query, "select `alt` from `guild_members` where char_id=%i LIMIT 1", CharID); - safe_delete_array(query); + if(!m_db->RunQuery(query, errbuf, &result)) { + _log(GUILDS__ERROR, "Error retrieving alt flag '%s': %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); - if(mysql_num_rows(result) != 1) return false; @@ -885,10 +847,11 @@ bool BaseGuildManager::GetAltFlag(uint32 CharID) } bool BaseGuildManager::DBSetTributeFlag(uint32 charid, bool enabled) { - char *query = 0; - return(_RunQuery(query, MakeAnyLenString(&query, - "UPDATE guild_members SET tribute_enable=%d WHERE char_id=%d", - enabled?1:0, charid), "setting a guild member's tribute flag")); + std::string query; + StringFormat(query, "UPDATE guild_members SET tribute_enable=%d WHERE char_id=%d", + enabled?1:0, charid); + + return(_RunQuery(query,"setting a guild member's tribute flag")); } bool BaseGuildManager::DBSetPublicNote(uint32 charid, const char* note) { @@ -896,44 +859,38 @@ bool BaseGuildManager::DBSetPublicNote(uint32 charid, const char* note) { return(false); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; //escape our strings. uint32 len = strlen(note); - char *esc = new char[len*2+1]; + std::string esc; m_db->DoEscapeString(esc, note, len); //insert the new `guilds` entry - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - "UPDATE guild_members SET public_note='%s' WHERE char_id=%d", - esc, charid), errbuf)) - { - _log(GUILDS__ERROR, "Error setting public note for char %d '%s': %s", charid, query, errbuf); - safe_delete_array(query); - safe_delete_array(esc); + StringFormat(query,"UPDATE guild_members SET public_note='%s' WHERE char_id=%d", + esc.c_str(), charid); + + if (!m_db->RunQuery(query, errbuf)) { + _log(GUILDS__ERROR, "Error setting public note for char %d '%s': %s", charid, query.c_str(), errbuf); return(false); } - safe_delete_array(query); - safe_delete_array(esc); _log(GUILDS__DB, "Set public not for char %d", charid); return(true); } -bool BaseGuildManager::_RunQuery(char *&query, int len, const char *errmsg) { +bool BaseGuildManager::_RunQuery(const std::string query, const char *errmsg) { if(m_db == nullptr) return(false); char errbuf[MYSQL_ERRMSG_SIZE]; - if (!m_db->RunQuery(query, len, errbuf)) + if (!m_db->RunQuery(query, errbuf)) { - _log(GUILDS__ERROR, "Error %s: '%s': %s", errmsg, query, errbuf); - safe_delete_array(query); + _log(GUILDS__ERROR, "Error %s: '%s': %s", errmsg, query.c_str(), errbuf); return(false); } - safe_delete_array(query); return(true); } @@ -986,19 +943,17 @@ bool BaseGuildManager::GetEntireGuild(uint32 guild_id, std::vectorRunQuery(query, MakeAnyLenString(&query, - GuildMemberBaseQuery " WHERE g.guild_id=%d", guild_id - ), errbuf, &result)) { - _log(GUILDS__ERROR, "Error loading guild member list '%s': %s", query, errbuf); - safe_delete_array(query); + StringFormat(query,GuildMemberBaseQuery " WHERE g.guild_id=%d", guild_id); + + if (!m_db->RunQuery(query, errbuf, &result)) { + _log(GUILDS__ERROR, "Error loading guild member list '%s': %s", query.c_str(), errbuf); return(false); } - safe_delete_array(query); while ((row = mysql_fetch_row(result))) { CharGuildInfo *ci = new CharGuildInfo; @@ -1019,26 +974,22 @@ bool BaseGuildManager::GetCharInfo(const char *char_name, CharGuildInfo &into) { } char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; //escape our strings. uint32 nl = strlen(char_name); - char *esc = new char[nl*2+1]; + std::string esc; m_db->DoEscapeString(esc, char_name, nl); + StringFormat(query, GuildMemberBaseQuery " WHERE c.name='%s'", esc.c_str()); + //load up the rank info for each guild. - if (!m_db->RunQuery(query, MakeAnyLenString(&query, - GuildMemberBaseQuery " WHERE c.name='%s'", esc - ), errbuf, &result)) { - _log(GUILDS__ERROR, "Error loading guild member '%s': %s", query, errbuf); - safe_delete_array(query); - safe_delete_array(esc); + if (!m_db->RunQuery(query, errbuf, &result)) { + _log(GUILDS__ERROR, "Error loading guild member '%s': %s", query.c_str(), errbuf); return(false); } - safe_delete_array(query); - safe_delete_array(esc); bool ret = true; if ((row = mysql_fetch_row(result))) { @@ -1061,23 +1012,21 @@ bool BaseGuildManager::GetCharInfo(uint32 char_id, CharGuildInfo &into) { } char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; //load up the rank info for each guild. - if (!m_db->RunQuery(query, MakeAnyLenString(&query, + #ifdef BOTS - GuildMemberBaseQuery " WHERE c.id=%d AND c.mobtype = 'C'", char_id + StringFormat(query, GuildMemberBaseQuery " WHERE c.id=%d AND c.mobtype = 'C'", char_id); #else - GuildMemberBaseQuery " WHERE c.id=%d", char_id + StringFormat(query, GuildMemberBaseQuery " WHERE c.id=%d", char_id); #endif - ), errbuf, &result)) { - _log(GUILDS__ERROR, "Error loading guild member '%s': %s", query, errbuf); - safe_delete_array(query); + if (!m_db->RunQuery(query, errbuf, &result)) { + _log(GUILDS__ERROR, "Error loading guild member '%s': %s", query.c_str(), errbuf); return(false); } - safe_delete_array(query); bool ret = true; if ((row = mysql_fetch_row(result))) { @@ -1317,19 +1266,17 @@ BaseGuildManager::GuildInfo::GuildInfo() { uint32 BaseGuildManager::DoesAccountContainAGuildLeader(uint32 AccountID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; - if (!m_db->RunQuery(query, - MakeAnyLenString(&query, - "select guild_id from guild_members where char_id in (select id from character_ where account_id = %i) and rank = 2", - AccountID), errbuf, &result)) - { - _log(GUILDS__ERROR, "Error executing query '%s': %s", query, errbuf); - safe_delete_array(query); + StringFormat(query, "SELECT guild_id FROM guild_members WHERE char_id in " + "(SELECT id FROM character_ WHERE account_id = %i) AND rank = 2", + AccountID); + + if (!m_db->RunQuery(query, errbuf, &result)) { + _log(GUILDS__ERROR, "Error executing query '%s': %s", query.c_str(), errbuf); return 0; } - safe_delete_array(query); uint32 Rows = mysql_num_rows(result); mysql_free_result(result); @@ -1342,7 +1289,7 @@ uint32 BaseGuildManager::DoesAccountContainAGuildLeader(uint32 AccountID) bool Database::LoadGuilds(GuildRanks_Struct* guilds) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; // int i; MYSQL_RES *result; MYSQL_ROW row; @@ -1377,10 +1324,11 @@ bool Database::LoadGuilds(GuildRanks_Struct* guilds) { Sleep(0); } + StringFormat(query, "SELECT id, eqid, name, leader, minstatus, rank0title, rank1, rank1title, rank2, " + "rank2title, rank3, rank3title, rank4, rank4title, rank5, rank5title FROM guilds"); - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id, eqid, name, leader, minstatus, rank0title, rank1, rank1title, rank2, rank2title, rank3, rank3title, rank4, rank4title, rank5, rank5title from guilds"), errbuf, &result)) { + if (RunQuery(query,errbuf, &result)) { - safe_delete_array(query); uint32 guildeqid = 0xFFFFFFFF; while ((row = mysql_fetch_row(result))) { guildeqid = atoi(row[1]); @@ -1436,7 +1384,6 @@ bool Database::LoadGuilds(GuildRanks_Struct* guilds) { else { cerr << "Error in LoadGuilds query '" << query << "' " << errbuf << endl; - safe_delete_array(query); return false; } @@ -1446,13 +1393,13 @@ bool Database::LoadGuilds(GuildRanks_Struct* guilds) { void Database::SetPublicNote(uint32 guild_id,char* charname, char* note){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; char* notebuf = new char[(strlen(note)*2)+3]; DoEscapeString(notebuf, note, strlen(note)) ; - if (!RunQuery(query, MakeAnyLenString(&query, "update character_ set publicnote='%s' where name='%s' and guild=%i", notebuf,charname,guild_id), errbuf)) { + StringFormat(query,"update character_ set publicnote='%s' where name='%s' and guild=%i", notebuf,charname,guild_id); + if (!RunQuery(query, errbuf)) { cerr << "Error running SetPublicNote query: " << errbuf << endl; } - safe_delete_array(query); safe_delete_array(notebuf); } @@ -1460,13 +1407,16 @@ void Database::SetPublicNote(uint32 guild_id,char* charname, char* note){ bool Database::GetGuildRanks(uint32 guildeqid, GuildRanks_Struct* gr) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id, eqid, name, leader, minstatus, rank0title, rank1, rank1title, rank2, rank2title, rank3, rank3title, rank4, rank4title, rank5, rank5title from guilds where eqid=%i;", guildeqid), errbuf, &result)) + StringFormat(query, "SELECT id, eqid, name, leader, minstatus, rank0title, rank1, rank1title, " + "rank2, rank2title, rank3, rank3title, rank4, rank4title, rank5, rank5title " + "FROM guilds WHERE eqid=%i;", guildeqid); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); gr->leader = atoi(row[3]); @@ -1545,7 +1495,6 @@ bool Database::GetGuildRanks(uint32 guildeqid, GuildRanks_Struct* gr) { } else { cerr << "Error in GetGuildRank query '" << query << "' " << errbuf << endl; - safe_delete_array(query); return false; } diff --git a/common/guild_base.h b/common/guild_base.h index f27afb3d0..a3dd00190 100644 --- a/common/guild_base.h +++ b/common/guild_base.h @@ -108,7 +108,7 @@ protected: bool DBSetAltFlag(uint32 charid, bool is_alt); bool DBSetTributeFlag(uint32 charid, bool enabled); bool DBSetPublicNote(uint32 charid, const char *note); - bool _RunQuery(char *&query, int len, const char *errmsg); + bool _RunQuery(const std::string query, const char *errmsg); // void DBSetPublicNote(uint32 guild_id,char* charname, char* note); bool LocalDeleteGuild(uint32 guild_id); diff --git a/common/ptimer.cpp b/common/ptimer.cpp index 07533bc55..fae8f731d 100644 --- a/common/ptimer.cpp +++ b/common/ptimer.cpp @@ -130,25 +130,24 @@ bool PersistentTimer::Load(Database *db) { char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - char *query = 0; + std::string query; uint32 qlen = 0; uint32 qcount = 0; - qlen = MakeAnyLenString(&query, "SELECT start,duration,enable " - " FROM timers WHERE char_id=%lu AND type=%u", (unsigned long)_char_id, _type); + StringFormat(query, "SELECT start,duration,enable " + " FROM timers WHERE char_id=%lu AND type=%u", + (unsigned long)_char_id, _type); #ifdef DEBUG_PTIMERS printf("Loading timer: char %lu of type %u\n", (unsigned long)_char_id, _type); #endif - if (!db->RunQuery(query, qlen, errbuf, &result)) { - safe_delete_array(query); + if (!db->RunQuery(query, errbuf, &result)) { #if EQDEBUG > 5 LogFile->write(EQEMuLog::Error, "Error in PersistentTimer::Load, error: %s", errbuf); #endif return(false); } - safe_delete_array(query); bool res = false; qcount = mysql_num_rows(result); @@ -169,55 +168,51 @@ bool PersistentTimer::Store(Database *db) { return(true); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 qlen = 0; - qlen = MakeAnyLenString(&query, "REPLACE INTO timers " - " (char_id,type,start,duration,enable) " - " VALUES(%lu,%u,%lu,%lu,%d)", - (unsigned long)_char_id, _type, (unsigned long)start_time, (unsigned long)timer_time, enabled?1:0); + StringFormat(query, "REPLACE INTO timers " + "(char_id, type, start, duration, enable) " + "VALUES (%lu, %u, %lu, %lu, %d) ", + (unsigned long)_char_id, _type, (unsigned long)start_time, + (unsigned long)timer_time, enabled?1:0); #ifdef DEBUG_PTIMERS printf("Storing timer: char %lu of type %u: '%s'\n", (unsigned long)_char_id, _type, query); #endif - if (!db->RunQuery(query, qlen, errbuf)) { - safe_delete_array(query); + if (!db->RunQuery(query, errbuf)) { #if EQDEBUG > 5 LogFile->write(EQEMuLog::Error, "Error in PersistentTimer::Store, error: %s", errbuf); #endif return(false); } - safe_delete_array(query); return(true); } bool PersistentTimer::Clear(Database *db) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 qlen = 0; - qlen = MakeAnyLenString(&query, "DELETE FROM timers " - " WHERE char_id=%lu AND type=%u ", - (unsigned long)_char_id, _type); + StringFormat(query, "DELETE FROM timers " + " WHERE char_id=%lu AND type=%u ", + (unsigned long)_char_id, _type); #ifdef DEBUG_PTIMERS printf("Clearing timer: char %lu of type %u: '%s'\n", (unsigned long)_char_id, _type, query); #endif - if (!db->RunQuery(query, qlen, errbuf)) { - safe_delete_array(query); + if (!db->RunQuery(query, errbuf)) { #if EQDEBUG > 5 LogFile->write(EQEMuLog::Error, "Error in PersistentTimer::Clear, error: %s", errbuf); #endif return(false); } - safe_delete_array(query); return(true); - } /* This function checks if the timer triggered */ @@ -312,25 +307,24 @@ bool PTimerList::Load(Database *db) { char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - char *query = 0; + std::string query; uint32 qlen = 0; uint32 qcount = 0; - qlen = MakeAnyLenString(&query, "SELECT type,start,duration,enable " - " FROM timers WHERE char_id=%lu", (unsigned long)_char_id); + StringFormat(query, "SELECT type,start,duration,enable " + "FROM timers WHERE char_id=%lu", + (unsigned long)_char_id); #ifdef DEBUG_PTIMERS printf("Loading all timers for char %lu\n", (unsigned long)_char_id); #endif - if (!db->RunQuery(query, qlen, errbuf, &result)) { - safe_delete_array(query); + if (!db->RunQuery(query, errbuf, &result)) { #if EQDEBUG > 5 LogFile->write(EQEMuLog::Error, "Error in PersistentTimer::Load, error: %s", errbuf); #endif return(false); } - safe_delete_array(query); pTimerType type; uint32 start_time, timer_time; @@ -382,24 +376,23 @@ bool PTimerList::Clear(Database *db) { _list.clear(); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 qlen = 0; - qlen = MakeAnyLenString(&query, "DELETE FROM timers " - " WHERE char_id=%lu ", (unsigned long)_char_id); + StringFormat(query, "DELETE FROM timers " + "WHERE char_id=%lu ", + (unsigned long)_char_id); #ifdef DEBUG_PTIMERS printf("Storing all timers for char %lu: '%s'\n", (unsigned long)_char_id, query); #endif - if (!db->RunQuery(query, qlen, errbuf)) { - safe_delete_array(query); + if (!db->RunQuery(query, errbuf)) { #if EQDEBUG > 5 LogFile->write(EQEMuLog::Error, "Error in PersistentTimer::Clear, error: %s", errbuf); #endif return(false); } - safe_delete_array(query); return(true); } @@ -480,23 +473,21 @@ void PTimerList::ToVector(std::vector< std::pair bool PTimerList::ClearOffline(Database *db, uint32 char_id, pTimerType type) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - uint32 qlen = 0; + std::string query; - qlen = MakeAnyLenString(&query, "DELETE FROM timers WHERE char_id=%lu AND type=%u ",(unsigned long)char_id, type); + StringFormat(query, "DELETE FROM timers WHERE char_id=%lu AND type=%u ", + (unsigned long)char_id, type); #ifdef DEBUG_PTIMERS printf("Clearing timer (offline): char %lu of type %u: '%s'\n", (unsigned long)char_id, type, query); #endif - if (!db->RunQuery(query, qlen, errbuf)) { - safe_delete_array(query); + if (!db->RunQuery(query, errbuf)) { #if EQDEBUG > 5 LogFile->write(EQEMuLog::Error, "Error in PTimerList::ClearOffline, error: %s", errbuf); #endif return(false); } - safe_delete_array(query); return(true); diff --git a/common/rulesys.cpp b/common/rulesys.cpp index 47ae94138..42b963e6d 100644 --- a/common/rulesys.cpp +++ b/common/rulesys.cpp @@ -267,7 +267,7 @@ void RuleManager::SaveRules(Database *db, const char *ruleset) { bool RuleManager::LoadRules(Database *db, const char *ruleset) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -282,20 +282,20 @@ bool RuleManager::LoadRules(Database *db, const char *ruleset) { m_activeRuleset = rsid; m_activeName = ruleset; - if (db->RunQuery(query, MakeAnyLenString(&query, + StringFormat(query, "SELECT rule_name, rule_value" " FROM rule_values" - " WHERE ruleset_id=%d", rsid), errbuf, &result)) + " WHERE ruleset_id=%d", rsid); + + if (db->RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while((row = mysql_fetch_row(result))) { if(!SetRule(row[0], row[1], nullptr, false)) _log(RULES__ERROR, "Unable to interpret rule record for %s", row[0]); } mysql_free_result(result); } else { - safe_delete_array(query); - LogFile->write(EQEMuLog::Error, "Error in LoadRules query %s: %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in LoadRules query %s: %s", query.c_str(), errbuf); return(false); } @@ -318,44 +318,44 @@ void RuleManager::_SaveRule(Database *db, RuleType type, uint16 index) { } char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; - if (!db->RunQuery(query, MakeAnyLenString(&query, - "REPLACE INTO rule_values (ruleset_id, rule_name, rule_value) " + std::string query; + + StringFormat(query,"REPLACE INTO rule_values (ruleset_id, rule_name, rule_value) " " VALUES(%d, '%s', '%s')", - m_activeRuleset, _GetRuleName(type, index), vstr),errbuf)) + m_activeRuleset, _GetRuleName(type, index), vstr); + + if (!db->RunQuery(query, errbuf)) { - _log(RULES__ERROR, "Fauled to set rule in the database: %s: %s", query,errbuf); + _log(RULES__ERROR, "Fauled to set rule in the database: %s: %s", query.c_str(),errbuf); } - safe_delete_array(query); } int RuleManager::GetRulesetID(Database *db, const char *rulesetname) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 len = strlen(rulesetname); - char* rst = new char[2*len+1]; + std::string rst; db->DoEscapeString(rst, rulesetname, len); int res = -1; - if (db->RunQuery(query, MakeAnyLenString(&query, - "SELECT ruleset_id" - " FROM rule_sets" - " WHERE name='%s'", rst), errbuf, &result)) + StringFormat(query,"SELECT ruleset_id" + " FROM rule_sets" + " WHERE name='%s'", rst.c_str()); + + if (db->RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result))) { res = atoi(row[0]); } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadRules query %s: %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in LoadRules query %s: %s", query.c_str(), errbuf); } - safe_delete_array(query); - safe_delete_array(rst); return(res); } @@ -368,73 +368,69 @@ int RuleManager::_FindOrCreateRuleset(Database *db, const char *ruleset) { return(res); //found and existing one... uint32 len = strlen(ruleset); - char* rst = new char[2*len+1]; + std::string rst; db->DoEscapeString(rst, ruleset, len); uint32 new_id; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; - if (!db->RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO rule_sets (ruleset_id, name) " - " VALUES(0, '%s')", - rst),errbuf,nullptr,nullptr,&new_id)) + + std::string query; + StringFormat(query,"INSERT INTO rule_sets (ruleset_id, name) " + " VALUES(0, '%s')",rst.c_str()); + + if (!db->RunQuery(query,errbuf,nullptr,nullptr,&new_id)) { - _log(RULES__ERROR, "Fauled to create rule set in the database: %s: %s", query,errbuf); + _log(RULES__ERROR, "Failed to create rule set in the database: %s: %s", query.c_str(),errbuf); res = -1; } else { res = new_id; } - safe_delete_array(query); return(res); } std::string RuleManager::GetRulesetName(Database *db, int id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; std::string res; - if (db->RunQuery(query, MakeAnyLenString(&query, - "SELECT name" - " FROM rule_sets" - " WHERE ruleset_id=%d", id), errbuf, &result)) - { + StringFormat(query,"SELECT name" + " FROM rule_sets" + " WHERE ruleset_id=%d", id); + if (db->RunQuery(query, errbuf, &result)){ if((row = mysql_fetch_row(result))) { res = row[0]; } mysql_free_result(result); - } else { - LogFile->write(EQEMuLog::Error, "Error in LoadRules query %s: %s", query, errbuf); + } + else { + LogFile->write(EQEMuLog::Error, "Error in LoadRules query %s: %s", query.c_str(), errbuf); } - safe_delete_array(query); return(res); } bool RuleManager::ListRulesets(Database *db, std::map &into) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; //start out with the default set which is always present. into[0] = "default"; + StringFormat(query,"SELECT ruleset_id , name FROM rule_sets"); - if (db->RunQuery(query, MakeAnyLenString(&query, - "SELECT ruleset_id,name" - " FROM rule_sets"), errbuf, &result)) - { + if (db->RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { into[ atoi(row[0]) ] = row[1]; } mysql_free_result(result); - safe_delete_array(query); - } else { - LogFile->write(EQEMuLog::Error, "Error in ListRulesets query %s: %s", query, errbuf); - safe_delete_array(query); + } + else { + LogFile->write(EQEMuLog::Error, "Error in ListRulesets query %s: %s", query.c_str(), errbuf); return(false); } return(true); diff --git a/common/shareddb.cpp b/common/shareddb.cpp index c208cc743..e87666244 100644 --- a/common/shareddb.cpp +++ b/common/shareddb.cpp @@ -47,15 +47,14 @@ SharedDatabase::~SharedDatabase() { bool SharedDatabase::SetHideMe(uint32 account_id, uint8 hideme) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE account SET hideme = %i where id = %i", hideme, account_id), errbuf)) { + StringFormat(query, "UPDATE account SET hideme = %i where id = %i", hideme, account_id); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in SetGMSpeed query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - - safe_delete_array(query); return true; } @@ -63,11 +62,13 @@ bool SharedDatabase::SetHideMe(uint32 account_id, uint8 hideme) uint8 SharedDatabase::GetGMSpeed(uint32 account_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT gmspeed FROM account where id='%i'", account_id), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query,"SELECT gmspeed FROM account where id='%i'", account_id); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -84,10 +85,7 @@ uint8 SharedDatabase::GetGMSpeed(uint32 account_id) } else { - std::cerr << "Error in GetGMSpeed query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); - return false; } return 0; @@ -98,32 +96,33 @@ uint8 SharedDatabase::GetGMSpeed(uint32 account_id) bool SharedDatabase::SetGMSpeed(uint32 account_id, uint8 gmspeed) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE account SET gmspeed = %i where id = %i", gmspeed, account_id), errbuf)) { + StringFormat(query, "UPDATE account SET gmspeed = %i where id = %i", gmspeed, account_id); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in SetGMSpeed query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); return true; - } uint32 SharedDatabase::GetTotalTimeEntitledOnAccount(uint32 AccountID) { uint32 EntitledTime = 0; - - const char *EntitledQuery = "select sum(ascii(substring(profile, 237, 1)) + (ascii(substring(profile, 238, 1)) * 256) +" - "(ascii(substring(profile, 239, 1)) * 65536) + (ascii(substring(profile, 240, 1)) * 16777216))" - "from character_ where account_id = %i"; - char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, EntitledQuery, AccountID), errbuf, &result)) { + + std::string query; + + + StringFormat(query,"select sum(ascii(substring(profile, 237, 1)) + (ascii(substring(profile, 238, 1)) * 256) +" + "(ascii(substring(profile, 239, 1)) * 65536) + (ascii(substring(profile, 240, 1)) * 16777216))" + "from character_ where account_id = %i", AccountID); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { @@ -135,20 +134,23 @@ uint32 SharedDatabase::GetTotalTimeEntitledOnAccount(uint32 AccountID) { mysql_free_result(result); } - safe_delete_array(query); - return EntitledTime; } bool SharedDatabase::SaveCursor(uint32 char_id, std::list::const_iterator &start, std::list::const_iterator &end) { -iter_queue it; -int i; -bool ret=true; + iter_queue it; + int i; + bool ret=true; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; + + // Delete cursor items - if ((ret = RunQuery(query, MakeAnyLenString(&query, "DELETE FROM inventory WHERE charid=%i AND ( (slotid >=8000 and slotid<=8999) or slotid=30 or (slotid>=331 and slotid<=340))", char_id), errbuf))) { + StringFormat(query,"DELETE FROM inventory WHERE charid=%i AND ( (slotid >=8000 and slotid<=8999) " + "or slotid=30 or (slotid>=331 and slotid<=340))", char_id); + + if ((ret = RunQuery(query, errbuf))) { for(it=start,i=8000;it!=end;it++,i++) { ItemInst *inst=*it; if (!(ret=SaveInventory(char_id,inst,(i==8000) ? 30 : i))) @@ -157,7 +159,6 @@ bool ret=true; } else { std::cout << "Clearing cursor failed: " << errbuf << std::endl; } - safe_delete_array(query); return ret; } @@ -165,20 +166,20 @@ bool ret=true; bool SharedDatabase::VerifyInventory(uint32 account_id, int16 slot_id, const ItemInst* inst) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; + // Delete cursor items - if (!RunQuery(query, MakeAnyLenString(&query, - "SELECT itemid,charges FROM sharedbank " - "WHERE acctid=%d AND slotid=%d", - account_id, slot_id), errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Error runing inventory verification query '%s': %s", query, errbuf); - safe_delete_array(query); + StringFormat(query, "SELECT itemid,charges FROM sharedbank " + "WHERE acctid=%d AND slotid=%d", + account_id, slot_id); + + if (!RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error runing inventory verification query '%s': %s", query.c_str(), errbuf); //returning true is less harmful in the face of a query error return(true); } - safe_delete_array(query); row = mysql_fetch_row(result); bool found = false; @@ -202,7 +203,7 @@ bool SharedDatabase::VerifyInventory(uint32 account_id, int16 slot_id, const Ite bool SharedDatabase::SaveInventory(uint32 char_id, const ItemInst* inst, int16 slot_id) { _CP(Database_SaveInventory); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; bool ret = false; uint32 augslot[5] = { 0, 0, 0, 0, 0 }; @@ -221,17 +222,19 @@ bool SharedDatabase::SaveInventory(uint32 char_id, const ItemInst* inst, int16 s if (!inst) { // Delete item uint32 account_id = GetAccountIDByChar(char_id); - uint32 len_query = MakeAnyLenString(&query, "DELETE FROM sharedbank WHERE acctid=%i AND slotid=%i", - account_id, slot_id); + StringFormat(query, "DELETE FROM sharedbank WHERE acctid=%i AND slotid=%i", + account_id, slot_id); - ret = RunQuery(query, len_query, errbuf); + ret = RunQuery(query, errbuf); // Delete bag slots, if need be if (ret && Inventory::SupportsContainers(slot_id)) { - safe_delete_array(query); int16 base_slot_id = Inventory::CalcSlotId(slot_id, 0); - ret = RunQuery(query, MakeAnyLenString(&query, "DELETE FROM sharedbank WHERE acctid=%i AND slotid>=%i AND slotid<%i", - account_id, base_slot_id, (base_slot_id+10)), errbuf); + + StringFormat(query, "DELETE FROM sharedbank WHERE acctid=%i AND slotid>=%i AND slotid<%i", + account_id, base_slot_id, (base_slot_id+10)); + + ret = RunQuery(query, errbuf); } // @merth: need to delete augments here @@ -245,32 +248,39 @@ bool SharedDatabase::SaveInventory(uint32 char_id, const ItemInst* inst, int16 s else charges = 0x7FFF; - uint32 len_query = MakeAnyLenString(&query, - "REPLACE INTO sharedbank " - " (acctid,slotid,itemid,charges,custom_data," - " augslot1,augslot2,augslot3,augslot4,augslot5)" - " VALUES(%lu,%lu,%lu,%lu,'%s'," - " %lu,%lu,%lu,%lu,%lu)", - (unsigned long)account_id, (unsigned long)slot_id, (unsigned long)inst->GetItem()->ID, (unsigned long)charges, - inst->GetCustomDataString().c_str(), - (unsigned long)augslot[0],(unsigned long)augslot[1],(unsigned long)augslot[2],(unsigned long)augslot[3],(unsigned long)augslot[4]); + StringFormat(query, "REPLACE INTO sharedbank " + " (acctid,slotid,itemid,charges,custom_data," + " augslot1,augslot2,augslot3,augslot4,augslot5)" + " VALUES(%lu,%lu,%lu,%lu,'%s'," + " %lu,%lu,%lu,%lu,%lu)", + (unsigned long)account_id, (unsigned long)slot_id, + (unsigned long)inst->GetItem()->ID, (unsigned long)charges, + inst->GetCustomDataString().c_str(), + (unsigned long)augslot[0],(unsigned long)augslot[1], + (unsigned long)augslot[2],(unsigned long)augslot[3], + (unsigned long)augslot[4]); - ret = RunQuery(query, len_query, errbuf); + ret = RunQuery(query, errbuf); } } else { // All other inventory if (!inst) { // Delete item - ret = RunQuery(query, MakeAnyLenString(&query, "DELETE FROM inventory WHERE charid=%i AND slotid=%i", - char_id, slot_id), errbuf); + + StringFormat(query, "DELETE FROM inventory WHERE charid=%i AND slotid=%i", + char_id, slot_id); + + ret = RunQuery(query, errbuf); // Delete bag slots, if need be if (ret && Inventory::SupportsContainers(slot_id)) { - safe_delete_array(query); int16 base_slot_id = Inventory::CalcSlotId(slot_id, 0); - ret = RunQuery(query, MakeAnyLenString(&query, "DELETE FROM inventory WHERE charid=%i AND slotid>=%i AND slotid<%i", - char_id, base_slot_id, (base_slot_id+10)), errbuf); + + StringFormat(query, "DELETE FROM inventory WHERE charid=%i AND slotid>=%i AND slotid<%i", + char_id, base_slot_id, (base_slot_id+10)); + + ret = RunQuery(query, errbuf); } // @merth: need to delete augments here @@ -282,23 +292,25 @@ bool SharedDatabase::SaveInventory(uint32 char_id, const ItemInst* inst, int16 s else charges = 0x7FFF; // Update/Insert item - uint32 len_query = MakeAnyLenString(&query, - "REPLACE INTO inventory " - " (charid,slotid,itemid,charges,instnodrop,custom_data,color," - " augslot1,augslot2,augslot3,augslot4,augslot5)" - " VALUES(%lu,%lu,%lu,%lu,%lu,'%s',%lu," - " %lu,%lu,%lu,%lu,%lu)", - (unsigned long)char_id, (unsigned long)slot_id, (unsigned long)inst->GetItem()->ID, (unsigned long)charges, - (unsigned long)(inst->IsInstNoDrop() ? 1:0),inst->GetCustomDataString().c_str(),(unsigned long)inst->GetColor(), - (unsigned long)augslot[0],(unsigned long)augslot[1],(unsigned long)augslot[2],(unsigned long)augslot[3],(unsigned long)augslot[4] ); - ret = RunQuery(query, len_query, errbuf); + StringFormat(query, "REPLACE INTO inventory " + " (charid,slotid,itemid,charges,instnodrop,custom_data,color," + " augslot1,augslot2,augslot3,augslot4,augslot5)" + " VALUES(%lu,%lu,%lu,%lu,%lu,'%s',%lu," + " %lu,%lu,%lu,%lu,%lu)", + (unsigned long)char_id, (unsigned long)slot_id, + (unsigned long)inst->GetItem()->ID, (unsigned long)charges, (unsigned long)(inst->IsInstNoDrop() ? 1:0), + inst->GetCustomDataString().c_str(),(unsigned long)inst->GetColor(), + (unsigned long)augslot[0],(unsigned long)augslot[1], + (unsigned long)augslot[2],(unsigned long)augslot[3], + (unsigned long)augslot[4]); + + ret = RunQuery(query, errbuf); } } if (!ret) - LogFile->write(EQEMuLog::Error, "SaveInventory query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "SaveInventory query '%s': %s", query.c_str(), errbuf); // Save bag contents, if slot supports bag contents if (inst && inst->IsType(ItemClassContainer) && Inventory::SupportsContainers(slot_id)) { @@ -316,11 +328,13 @@ bool SharedDatabase::SaveInventory(uint32 char_id, const ItemInst* inst, int16 s int32 SharedDatabase::GetSharedPlatinum(uint32 account_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT sharedplat FROM account WHERE id='%i'", account_id), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT sharedplat FROM account WHERE id='%i'", account_id); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -338,8 +352,6 @@ int32 SharedDatabase::GetSharedPlatinum(uint32 account_id) else { std::cerr << "Error in GetSharedPlatinum query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); - return false; } return 0; @@ -348,42 +360,33 @@ int32 SharedDatabase::GetSharedPlatinum(uint32 account_id) bool SharedDatabase::SetSharedPlatinum(uint32 account_id, int32 amount_to_add) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE account SET sharedplat = sharedplat + %i WHERE id = %i", amount_to_add, account_id), errbuf)) { + StringFormat(query,"UPDATE account SET sharedplat = sharedplat + %i WHERE id = %i", + amount_to_add, account_id); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in SetSharedPlatinum query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - - safe_delete_array(query); return true; } bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, Inventory* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin_level) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; const Item_Struct* myitem; - RunQuery - ( - query, - MakeAnyLenString - ( - &query, - "SELECT itemid, item_charges, slot FROM starting_items " - "WHERE (race = %i or race = 0) AND (class = %i or class = 0) AND " - "(deityid = %i or deityid=0) AND (zoneid = %i or zoneid = 0) AND " - "gm <= %i ORDER BY id", - si_race, si_class, si_deity, si_current_zone, admin_level - ), - errbuf, - &result - ); - safe_delete_array(query); + StringFormat(query, "SELECT itemid, item_charges, slot FROM starting_items " + "WHERE (race = %i or race = 0) AND (class = %i or class = 0) AND " + "(deityid = %i or deityid=0) AND (zoneid = %i or zoneid = 0) AND " + "gm <= %i ORDER BY id", + si_race, si_class, si_deity, si_current_zone, admin_level); + + RunQuery(query, errbuf, &result); while((row = mysql_fetch_row(result))) { int itemid = atoi(row[0]); @@ -408,24 +411,29 @@ bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, Inventory* inv, // Retrieve shared bank inventory based on either account or character bool SharedDatabase::GetSharedBank(uint32 id, Inventory* inv, bool is_charid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; uint32 len_query = 0; MYSQL_RES *result; MYSQL_ROW row; - bool ret = false; if (is_charid) { - len_query = MakeAnyLenString(&query, - "SELECT sb.slotid,sb.itemid,sb.charges,sb.augslot1,sb.augslot2,sb.augslot3,sb.augslot4,sb.augslot5,sb.custom_data from sharedbank sb " - "INNER JOIN character_ ch ON ch.account_id=sb.acctid " - "WHERE ch.id=%i", id); + + StringFormat(query, "SELECT sb.slotid, sb.itemid, sb.charges, " + "sb.augslot1, sb.augslot2, sb.augslot3, sb.augslot4, " + "sb.augslot5, sb.custom_data from sharedbank sb " + "INNER JOIN character_ ch ON ch.account_id=sb.acctid " + "WHERE ch.id=%i", id); + } else { - len_query = MakeAnyLenString(&query, - "SELECT slotid,itemid,charges,augslot1,augslot2,augslot3,augslot4,augslot5,custom_data from sharedbank WHERE acctid=%i", id); + + StringFormat(query, "SELECT slotid, itemid, charges, augslot1, " + "augslot2, augslot3, augslot4, augslot5, " + "custom_data from sharedbank WHERE acctid=%i", id); + } - if (RunQuery(query, len_query, errbuf, &result)) { + if (RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { int16 slot_id = (int16)atoi(row[0]); uint32 item_id = (uint32)atoi(row[1]); @@ -496,14 +504,12 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory* inv, bool is_charid) { } mysql_free_result(result); - ret = true; + return true; } else { LogFile->write(EQEMuLog::Error, "Database::GetSharedBank(uint32 account_id): %s", errbuf); } - - safe_delete_array(query); - return ret; + return false; } @@ -511,14 +517,17 @@ bool SharedDatabase::GetSharedBank(uint32 id, Inventory* inv, bool is_charid) { bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) { _CP(Database_GetInventory); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES* result; MYSQL_ROW row; - bool ret = false; // Retrieve character inventory - if (RunQuery(query, MakeAnyLenString(&query, "SELECT slotid,itemid,charges,color,augslot1,augslot2,augslot3,augslot4,augslot5," - "instnodrop,custom_data FROM inventory WHERE charid=%i ORDER BY slotid", char_id), errbuf, &result)) { + StringFormat(query, "SELECT slotid, itemid, charges, color, " + "augslot1, augslot2, augslot3, augslot4, augslot5, " + "instnodrop, custom_data FROM inventory WHERE " + "charid=%i ORDER BY slotid", char_id); + + if (RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { int16 slot_id = atoi(row[0]); @@ -605,30 +614,33 @@ bool SharedDatabase::GetInventory(uint32 char_id, Inventory* inv) { mysql_free_result(result); // Retrieve shared inventory - ret = GetSharedBank(char_id, inv, true); + return GetSharedBank(char_id, inv, true); } else { - LogFile->write(EQEMuLog::Error, "GetInventory query '%s' %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "GetInventory query '%s' %s", query.c_str(), errbuf); LogFile->write(EQEMuLog::Error, "If you got an error related to the 'instnodrop' field, run the following SQL Queries:\nalter table inventory add instnodrop tinyint(1) unsigned default 0 not null;\n"); } - safe_delete_array(query); - return ret; + return false; } // Overloaded: Retrieve character inventory based on account_id and character name bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv) { _CP(Database_GetInventory_name); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES* result; MYSQL_ROW row; - bool ret = false; // Retrieve character inventory - if (RunQuery(query, MakeAnyLenString(&query, "SELECT slotid,itemid,charges,color,augslot1,augslot2,augslot3,augslot4,augslot5," - "instnodrop,custom_data FROM inventory INNER JOIN character_ ch ON ch.id=charid WHERE ch.name='%s' AND ch.account_id=%i ORDER BY slotid", - name, account_id), errbuf, &result)) + StringFormat(query, "SELECT slotid, itemid, charges, color, " + "augslot1, augslot2, augslot3, augslot4, augslot5, " + "instnodrop, custom_data FROM inventory INNER JOIN " + "character_ ch ON ch.id=charid WHERE ch.name='%s' " + "AND ch.account_id=%i ORDER BY slotid", + name, account_id); + + if (RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { int16 slot_id = atoi(row[0]); @@ -703,15 +715,13 @@ bool SharedDatabase::GetInventory(uint32 account_id, char* name, Inventory* inv) mysql_free_result(result); // Retrieve shared inventory - ret = GetSharedBank(account_id, inv, false); + return GetSharedBank(account_id, inv, false); } else { - LogFile->write(EQEMuLog::Error, "GetInventory query '%s' %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "GetInventory query '%s' %s", query.c_str(), errbuf); LogFile->write(EQEMuLog::Error, "If you got an error related to the 'instnodrop' field, run the following SQL Queries:\nalter table inventory add instnodrop tinyint(1) unsigned default 0 not null;\n"); } - - safe_delete_array(query); - return ret; + return false; } @@ -722,8 +732,8 @@ void SharedDatabase::GetItemsCount(int32 &item_count, uint32 &max_id) { item_count = -1; max_id = 0; - char query[] = "SELECT MAX(id), count(*) FROM items"; - if (RunQuery(query, static_cast(strlen(query)), errbuf, &result)) { + std::string query = "SELECT MAX(id), count(*) FROM items"; + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if (row != nullptr && row[1] != 0) { item_count = atoi(row[1]); @@ -733,7 +743,7 @@ void SharedDatabase::GetItemsCount(int32 &item_count, uint32 &max_id) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetItemsCount '%s': '%s'", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in GetItemsCount '%s': '%s'", query.c_str(), errbuf); } } @@ -800,14 +810,14 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_ } } - char query[] = "select source," + std::string query = "select source," #define F(x) "`"#x"`," #include "item_fieldlist.h" #undef F "updated" " from items order by id"; Item_Struct item; - if(RunQuery(query, sizeof(query), errbuf, &result)) { + if(RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { memset(&item, 0, sizeof(Item_Struct)); @@ -1012,7 +1022,7 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_ mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "LoadItems '%s', %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "LoadItems '%s', %s", query.c_str(), errbuf); } } @@ -1051,21 +1061,21 @@ const Item_Struct* SharedDatabase::IterateItems(uint32* id) { std::string SharedDatabase::GetBook(const char *txtfile) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; char txtfile2[20]; std::string txtout; strcpy(txtfile2,txtfile); - if (!RunQuery(query, MakeAnyLenString(&query, "SELECT txtfile FROM books where name='%s'", txtfile2), errbuf, &result)) { + + StringFormat(query,"SELECT txtfile FROM books where name='%s'", txtfile2); + + if (!RunQuery(query,errbuf, &result)) { std::cerr << "Error in GetBook query '" << query << "' " << errbuf << std::endl; - if (query != 0) - safe_delete_array(query); txtout.assign(" ",1); return txtout; } else { - safe_delete_array(query); if (mysql_num_rows(result) == 0) { mysql_free_result(result); LogFile->write(EQEMuLog::Error, "No book to send, (%s)", txtfile); @@ -1084,19 +1094,20 @@ std::string SharedDatabase::GetBook(const char *txtfile) void SharedDatabase::GetFactionListInfo(uint32 &list_count, uint32 &max_lists) { list_count = 0; max_lists = 0; - const char *query = "SELECT COUNT(*), MAX(id) FROM npc_faction"; char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - if(RunQuery(query, strlen(query), errbuf, &result)) { + std::string query = "SELECT COUNT(*), MAX(id) FROM npc_faction"; + + if(RunQuery(query, errbuf, &result)) { if(row = mysql_fetch_row(result)) { list_count = static_cast(atoul(row[0])); max_lists = static_cast(atoul(row[1])); } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error getting npc faction info from database: %s, %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error getting npc faction info from database: %s, %s", query.c_str(), errbuf); } } @@ -1114,17 +1125,21 @@ const NPCFactionList* SharedDatabase::GetNPCFactionEntry(uint32 id) { void SharedDatabase::LoadNPCFactionLists(void *data, uint32 size, uint32 list_count, uint32 max_lists) { EQEmu::FixedMemoryHashSet hash(reinterpret_cast(data), size, list_count, max_lists); - const char *query = "SELECT npc_faction.id, npc_faction.primaryfaction, npc_faction.ignore_primary_assist, " - "npc_faction_entries.faction_id, npc_faction_entries.value, npc_faction_entries.npc_value, npc_faction_entries.temp " - "FROM npc_faction LEFT JOIN npc_faction_entries ON npc_faction.id = npc_faction_entries.npc_faction_id ORDER BY " - "npc_faction.id;"; + + std::string query = "SELECT npc_faction.id, npc_faction.primaryfaction, " + "npc_faction.ignore_primary_assist, npc_faction_entries.faction_id, " + "npc_faction_entries.value, npc_faction_entries.npc_value, " + "npc_faction_entries.temp " + "FROM npc_faction LEFT JOIN npc_faction_entries ON " + "npc_faction.id = npc_faction_entries.npc_faction_id " + "ORDER BY npc_faction.id;"; char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; NPCFactionList faction; - if(RunQuery(query, strlen(query), errbuf, &result)) { + if(RunQuery(query, errbuf, &result)) { uint32 current_id = 0; uint32 current_entry = 0; while(row = mysql_fetch_row(result)) { @@ -1163,7 +1178,7 @@ void SharedDatabase::LoadNPCFactionLists(void *data, uint32 size, uint32 list_co mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error getting npc faction info from database: %s, %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error getting npc faction info from database: %s, %s", query.c_str(), errbuf); } } @@ -1206,14 +1221,17 @@ bool SharedDatabase::LoadNPCFactionLists() { bool SharedDatabase::GetPlayerProfile(uint32 account_id, char* name, PlayerProfile_Struct* pp, Inventory* inv, ExtendedProfile_Struct *ext, char* current_zone, uint32 *current_instance) { _CP(Database_GetPlayerProfile); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES* result; MYSQL_ROW row; bool ret = false; unsigned long* lengths; + StringFormat(query, "SELECT profile,zonename,x,y,z,extprofile,instanceid FROM " + "character_ WHERE account_id=%i AND name='%s'", + account_id, name); - if (RunQuery(query, MakeAnyLenString(&query, "SELECT profile,zonename,x,y,z,extprofile,instanceid FROM character_ WHERE account_id=%i AND name='%s'", account_id, name), errbuf, &result)) { + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); lengths = mysql_fetch_lengths(result); @@ -1250,36 +1268,34 @@ bool SharedDatabase::GetPlayerProfile(uint32 account_id, char* name, PlayerProfi mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "GetPlayerProfile query '%s' %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "GetPlayerProfile query '%s' %s", query.c_str(), errbuf); } - - safe_delete_array(query); return ret; } bool SharedDatabase::SetPlayerProfile(uint32 account_id, uint32 charid, PlayerProfile_Struct* pp, Inventory* inv, ExtendedProfile_Struct *ext, uint32 current_zone, uint32 current_instance, uint8 MaxXTargets) { _CP(Database_SetPlayerProfile); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; uint32 affected_rows = 0; bool ret = false; - if (RunQuery(query, SetPlayerProfile_MQ(&query, account_id, charid, pp, inv, ext, current_zone, current_instance, MaxXTargets), errbuf, 0, &affected_rows)) { + SetPlayerProfile_MQ(query, account_id, charid, pp, inv, ext, current_zone, current_instance, MaxXTargets); + + if (RunQuery(query, errbuf, 0, &affected_rows)) { ret = (affected_rows != 0); } if (!ret) { - LogFile->write(EQEMuLog::Error, "SetPlayerProfile query '%s' %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "SetPlayerProfile query '%s' %s", query.c_str(), errbuf); } - safe_delete_array(query); return ret; } // Generate SQL for updating player profile -uint32 SharedDatabase::SetPlayerProfile_MQ(char** query, uint32 account_id, uint32 charid, PlayerProfile_Struct* pp, Inventory* inv, ExtendedProfile_Struct *ext, uint32 current_zone, uint32 current_instance, uint8 MaxXTargets) { - *query = new char[396 + sizeof(PlayerProfile_Struct)*2 + sizeof(ExtendedProfile_Struct)*2 + 4]; - char* end = *query; +uint32 SharedDatabase::SetPlayerProfile_MQ(std::string &query, uint32 account_id, uint32 charid, PlayerProfile_Struct* pp, Inventory* inv, ExtendedProfile_Struct *ext, uint32 current_zone, uint32 current_instance, uint8 MaxXTargets) { + if (!current_zone) current_zone = pp->zone_id; @@ -1289,17 +1305,34 @@ uint32 SharedDatabase::SetPlayerProfile_MQ(char** query, uint32 account_id, uint if(strlen(pp->name) == 0) // Sanity check in case pp never loaded return false; - end += sprintf(end, "UPDATE character_ SET timelaston=unix_timestamp(now()),name=\'%s\', zonename=\'%s\', zoneid=%u, instanceid=%u, x = %f, y = %f, z = %f, profile=\'", pp->name, GetZoneName(current_zone), current_zone, current_instance, pp->x, pp->y, pp->z); - end += DoEscapeString(end, (char*)pp, sizeof(PlayerProfile_Struct)); - end += sprintf(end,"\', extprofile=\'"); - end += DoEscapeString(end, (char*)ext, sizeof(ExtendedProfile_Struct)); - end += sprintf(end,"\',class=%d,level=%d,xtargets=%u WHERE id=%u", pp->class_, pp->level, MaxXTargets, charid); + std::string playerProfileBuffer; + std::string extendedProfileBuffer; - return (uint32) (end - (*query)); + StringFormat(query, "UPDATE character_ SET timelaston=unix_timestamp(now()), name=\'%s\', zonename=\'%s\', " + "zoneid=%u, instanceid=%u, x = %f, y = %f, z = %f, profile=\'", + pp->name, GetZoneName(current_zone), current_zone, current_instance, + pp->x, pp->y, pp->z); + + DoEscapeString(playerProfileBuffer, (char*)pp, sizeof(PlayerProfile_Struct)); + + query.append(playerProfileBuffer); + query.append("\', extprofile=\'"); + + DoEscapeString(extendedProfileBuffer, (char*)ext, sizeof(ExtendedProfile_Struct)); + + query.append(extendedProfileBuffer); + + std::string endingOfQuery; + + StringFormat(endingOfQuery,"\',class=%d,level=%d,xtargets=%u " + "WHERE id=%u", pp->class_, pp->level, + MaxXTargets, charid); + + query.append(endingOfQuery); + + return query.length(); } - - // Create appropriate ItemInst class ItemInst* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5) { @@ -1355,59 +1388,60 @@ ItemInst* SharedDatabase::CreateBaseItem(const Item_Struct* item, int16 charges) int32 SharedDatabase::DeleteStalePlayerCorpses() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; if(RuleB(Zone, EnableShadowrest)) { - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE player_corpses SET IsBurried = 1 WHERE IsBurried=0 and " - "(UNIX_TIMESTAMP() - UNIX_TIMESTAMP(timeofdeath)) > %d and not timeofdeath=0", - (RuleI(Character, CorpseDecayTimeMS) / 1000)), errbuf, 0, &affected_rows)) + StringFormat(query, "UPDATE player_corpses SET IsBurried = 1 WHERE IsBurried=0 and " + "(UNIX_TIMESTAMP() - UNIX_TIMESTAMP(timeofdeath)) > %d and " + "not timeofdeath=0", + (RuleI(Character, CorpseDecayTimeMS) / 1000)); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { - safe_delete_array(query); return -1; } } else { - if (!RunQuery(query, MakeAnyLenString(&query, "Delete from player_corpses where (UNIX_TIMESTAMP() - " - "UNIX_TIMESTAMP(timeofdeath)) > %d and not timeofdeath=0", (RuleI(Character, CorpseDecayTimeMS) / 1000)), - errbuf, 0, &affected_rows)) + StringFormat(query,"Delete from player_corpses where (UNIX_TIMESTAMP() - " + "UNIX_TIMESTAMP(timeofdeath)) > %d and not timeofdeath=0", + (RuleI(Character, CorpseDecayTimeMS) / 1000)); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { - safe_delete_array(query); return -1; } } - - safe_delete_array(query); return affected_rows; } int32 SharedDatabase::DeleteStalePlayerBackups() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; // 1209600 seconds = 2 weeks - if (!RunQuery(query, MakeAnyLenString(&query, "Delete from player_corpses_backup where (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(timeofdeath)) > 1209600"), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + query = "Delete from player_corpses_backup where (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(timeofdeath)) > 1209600"; + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { return -1; } - safe_delete_array(query); return affected_rows; } bool SharedDatabase::GetCommandSettings(std::map &commands) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - query = new char[256]; - strcpy(query, "SELECT command,access from commands"); + + query = "SELECT command,access from commands"; commands.clear(); - if (RunQuery(query, strlen(query), errbuf, &result)) { - safe_delete_array(query); + + if (RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { commands[row[0]]=atoi(row[1]); } @@ -1415,7 +1449,6 @@ bool SharedDatabase::GetCommandSettings(std::map &commands) { return true; } else { std::cerr << "Error in GetCommands query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } @@ -1455,13 +1488,12 @@ void SharedDatabase::LoadSkillCaps(void *data) { uint16 *skill_caps_table = reinterpret_cast(data); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if(RunQuery(query, MakeAnyLenString(&query, - "SELECT skillID, class, level, cap FROM skill_caps ORDER BY skillID, class, level"), - errbuf, &result)) { - safe_delete_array(query); + + query = "SELECT skillID, class, level, cap FROM skill_caps ORDER BY skillID, class, level"; + if(RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { uint8 skillID = atoi(row[0]); @@ -1477,7 +1509,6 @@ void SharedDatabase::LoadSkillCaps(void *data) { mysql_free_result(result); } else { LogFile->write(EQEMuLog::Error, "Error loading skill caps from database: %s", errbuf); - safe_delete_array(query); } } @@ -1561,17 +1592,16 @@ uint8 SharedDatabase::GetTrainLevel(uint8 Class_, SkillType Skill, uint8 Level) void SharedDatabase::LoadDamageShieldTypes(SPDat_Spell_Struct* sp, int32 iMaxSpellID) { - const char *DSQuery = "SELECT `spellid`, `type` from `damageshieldtypes` WHERE `spellid` > 0 " - "AND `spellid` <= %i"; - - const char *ERR_MYSQLERROR = "Error in LoadDamageShieldTypes: %s %s"; - char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if(RunQuery(query,MakeAnyLenString(&query,DSQuery,iMaxSpellID),errbuf,&result)) { + StringFormat(query,"SELECT `spellid`, `type` from `damageshieldtypes` " + "WHERE `spellid` > 0 AND `spellid` <= %i", iMaxSpellID); + + + if(RunQuery(query,errbuf,&result)) { while((row = mysql_fetch_row(result))) { @@ -1581,11 +1611,9 @@ void SharedDatabase::LoadDamageShieldTypes(SPDat_Spell_Struct* sp, int32 iMaxSpe } } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadDamageShieldTypes: %s %s", query.c_str(), errbuf); } } @@ -1595,19 +1623,19 @@ const EvolveInfo* SharedDatabase::GetEvolveInfo(uint32 loregroup) { int SharedDatabase::GetMaxSpellID() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = nullptr; + std::string query; MYSQL_RES *result; MYSQL_ROW row; int32 ret = 0; - if(RunQuery(query, MakeAnyLenString(&query, "SELECT MAX(id) FROM spells_new"), - errbuf, &result)) { - safe_delete_array(query); + + query = "SELECT MAX(id) FROM spells_new"; + + if(RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); ret = atoi(row[0]); mysql_free_result(result); } else { - _log(SPELLS__LOAD_ERR, "Error in GetMaxSpellID query '%s' %s", query, errbuf); - safe_delete_array(query); + _log(SPELLS__LOAD_ERR, "Error in GetMaxSpellID query '%s' %s", query.c_str(), errbuf); ret = -1; } return ret; @@ -1616,14 +1644,13 @@ int SharedDatabase::GetMaxSpellID() { void SharedDatabase::LoadSpells(void *data, int max_spells) { SPDat_Spell_Struct *sp = reinterpret_cast(data); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if(RunQuery(query, MakeAnyLenString(&query, - "SELECT * FROM spells_new ORDER BY id ASC"), - errbuf, &result)) { - safe_delete_array(query); + query = "SELECT * FROM spells_new ORDER BY id ASC"; + + if(RunQuery(query, errbuf, &result)) { int tempid = 0; int counter = 0; @@ -1742,8 +1769,7 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) { LoadDamageShieldTypes(sp, max_spells); } else { - _log(SPELLS__LOAD_ERR, "Error in LoadSpells query '%s' %s", query, errbuf); - safe_delete_array(query); + _log(SPELLS__LOAD_ERR, "Error in LoadSpells query '%s' %s", query.c_str(), errbuf); } } @@ -1751,12 +1777,12 @@ void SharedDatabase::GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot loot_table_count = 0; max_loot_table = 0; loot_table_entries = 0; - const char *query = "SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM loottable_entries) FROM loottable"; + std::string query = "SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM loottable_entries) FROM loottable"; char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - if(RunQuery(query, strlen(query), errbuf, &result)) { + if(RunQuery(query, errbuf, &result)) { if(row = mysql_fetch_row(result)) { loot_table_count = static_cast(atoul(row[0])); max_loot_table = static_cast(atoul(row[1])); @@ -1764,7 +1790,7 @@ void SharedDatabase::GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error getting loot table info from database: %s, %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error getting loot table info from database: %s, %s", query.c_str(), errbuf); } } @@ -1772,12 +1798,13 @@ void SharedDatabase::GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_d loot_drop_count = 0; max_loot_drop = 0; loot_drop_entries = 0; - const char *query = "SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM lootdrop_entries) FROM lootdrop"; char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - if(RunQuery(query, strlen(query), errbuf, &result)) { + std::string query = "SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM lootdrop_entries) FROM lootdrop"; + + if(RunQuery(query, errbuf, &result)) { if(row = mysql_fetch_row(result)) { loot_drop_count = static_cast(atoul(row[0])); max_loot_drop = static_cast(atoul(row[1])); @@ -1785,23 +1812,25 @@ void SharedDatabase::GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_d } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error getting loot table info from database: %s, %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error getting loot table info from database: %s, %s", query.c_str(), errbuf); } } void SharedDatabase::LoadLootTables(void *data, uint32 size) { EQEmu::FixedMemoryVariableHashSet hash(reinterpret_cast(data), size); - const char *query = "SELECT loottable.id, loottable.mincash, loottable.maxcash, loottable.avgcoin," - " loottable_entries.lootdrop_id, loottable_entries.multiplier, loottable_entries.droplimit, " - "loottable_entries.mindrop, loottable_entries.probability FROM loottable LEFT JOIN loottable_entries" - " ON loottable.id = loottable_entries.loottable_id ORDER BY id"; char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; uint8 loot_table[sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * 128)]; LootTable_Struct *lt = reinterpret_cast(loot_table); - if(RunQuery(query, strlen(query), errbuf, &result)) { + std::string query = "SELECT loottable.id, loottable.mincash, loottable.maxcash, loottable.avgcoin," + " loottable_entries.lootdrop_id, loottable_entries.multiplier, " + " loottable_entries.droplimit, loottable_entries.mindrop, " + "loottable_entries.probability FROM loottable LEFT JOIN loottable_entries" + " ON loottable.id = loottable_entries.loottable_id ORDER BY id"; + + if(RunQuery(query, errbuf, &result)) { uint32 current_id = 0; uint32 current_entry = 0; while(row = mysql_fetch_row(result)) { @@ -1844,23 +1873,26 @@ void SharedDatabase::LoadLootTables(void *data, uint32 size) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error getting loot table info from database: %s, %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error getting loot table info from database: %s, %s", query.c_str(), errbuf); } } void SharedDatabase::LoadLootDrops(void *data, uint32 size) { EQEmu::FixedMemoryVariableHashSet hash(reinterpret_cast(data), size); - const char *query = "SELECT lootdrop.id, lootdrop_entries.item_id, lootdrop_entries.item_charges, " - "lootdrop_entries.equip_item, lootdrop_entries.chance, lootdrop_entries.minlevel, " - "lootdrop_entries.maxlevel, lootdrop_entries.multiplier FROM lootdrop JOIN lootdrop_entries " - "ON lootdrop.id = lootdrop_entries.lootdrop_id ORDER BY lootdrop_id"; char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - uint8 loot_drop[sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * 1260)]; LootDrop_Struct *ld = reinterpret_cast(loot_drop); - if(RunQuery(query, strlen(query), errbuf, &result)) { + + std::string query = "SELECT lootdrop.id, lootdrop_entries.item_id, " + "lootdrop_entries.item_charges, lootdrop_entries.equip_item, " + "lootdrop_entries.chance, lootdrop_entries.minlevel, " + "lootdrop_entries.maxlevel, lootdrop_entries.multiplier FROM " + "lootdrop JOIN lootdrop_entries " + "ON lootdrop.id = lootdrop_entries.lootdrop_id ORDER BY lootdrop_id"; + + if(RunQuery(query, errbuf, &result)) { uint32 current_id = 0; uint32 current_entry = 0; while(row = mysql_fetch_row(result)) { @@ -1898,7 +1930,7 @@ void SharedDatabase::LoadLootDrops(void *data, uint32 size) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error getting loot drop info from database: %s, %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error getting loot drop info from database: %s, %s", query.c_str(), errbuf); } } @@ -1957,12 +1989,12 @@ const LootDrop_Struct* SharedDatabase::GetLootDrop(uint32 lootdrop_id) { void SharedDatabase::GetPlayerInspectMessage(char* playername, InspectMessage_Struct* message) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT inspectmessage FROM character_ WHERE name='%s'", playername), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT inspectmessage FROM character_ WHERE name='%s'", playername); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -1973,32 +2005,32 @@ void SharedDatabase::GetPlayerInspectMessage(char* playername, InspectMessage_St } else { std::cerr << "Error in GetPlayerInspectMessage query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } } void SharedDatabase::SetPlayerInspectMessage(char* playername, const InspectMessage_Struct* message) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET inspectmessage='%s' WHERE name='%s'", message->text, playername), errbuf)) { + StringFormat(query, "UPDATE character_ SET inspectmessage='%s' WHERE name='%s'", + message->text, playername); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in SetPlayerInspectMessage query '" << query << "' " << errbuf << std::endl; } - - safe_delete_array(query); } void SharedDatabase::GetBotInspectMessage(uint32 botid, InspectMessage_Struct* message) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT BotInspectMessage FROM bots WHERE BotID=%i", botid), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT BotInspectMessage FROM bots WHERE BotID=%i", botid); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); memcpy(message, row[0], sizeof(InspectMessage_Struct)); @@ -2008,18 +2040,18 @@ void SharedDatabase::GetBotInspectMessage(uint32 botid, InspectMessage_Struct* m } else { std::cerr << "Error in GetBotInspectMessage query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } } void SharedDatabase::SetBotInspectMessage(uint32 botid, const InspectMessage_Struct* message) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE bots SET BotInspectMessage='%s' WHERE BotID=%i", message->text, botid), errbuf)) { + StringFormat(query, "UPDATE bots SET BotInspectMessage='%s' WHERE BotID=%i", + message->text, botid); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in SetBotInspectMessage query '" << query << "' " << errbuf << std::endl; } - - safe_delete_array(query); } diff --git a/common/shareddb.h b/common/shareddb.h index d10ec894e..d594458ad 100644 --- a/common/shareddb.h +++ b/common/shareddb.h @@ -41,7 +41,7 @@ public: bool SetHideMe(uint32 account_id, uint8 hideme); bool GetPlayerProfile(uint32 account_id, char* name, PlayerProfile_Struct* pp, Inventory* inv, ExtendedProfile_Struct *ext, char* current_zone = 0, uint32 *current_instance = 0); bool SetPlayerProfile(uint32 account_id, uint32 charid, PlayerProfile_Struct* pp, Inventory* inv, ExtendedProfile_Struct *ext, uint32 current_zone, uint32 current_instance, uint8 MaxXTargets); - uint32 SetPlayerProfile_MQ(char** query, uint32 account_id, uint32 charid, PlayerProfile_Struct* pp, Inventory* inv, ExtendedProfile_Struct *ext, uint32 current_zone, uint32 current_instance, uint8 MaxXTargets); + uint32 SetPlayerProfile_MQ(std::string& query, uint32 account_id, uint32 charid, PlayerProfile_Struct* pp, Inventory* inv, ExtendedProfile_Struct *ext, uint32 current_zone, uint32 current_instance, uint8 MaxXTargets); int32 DeleteStalePlayerCorpses(); int32 DeleteStalePlayerBackups(); void GetPlayerInspectMessage(char* playername, InspectMessage_Struct* message); diff --git a/queryserv/database.cpp b/queryserv/database.cpp index 14d4c34a9..c77cad4d3 100644 --- a/queryserv/database.cpp +++ b/queryserv/database.cpp @@ -99,21 +99,19 @@ Database::~Database() bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_len) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (!RunQuery(query,MakeAnyLenString(&query, "select `value` from `variables` where `varname`='%s'", varname), errbuf, &result)) { + StringFormat(query,"select `value` from `variables` where `varname`='%s'", varname); - _log(UCS__ERROR, "Unable to get message count from database. %s %s", query, errbuf); + if (!RunQuery(query, errbuf, &result)) { - safe_delete_array(query); + _log(UCS__ERROR, "Unable to get message count from database. %s %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); - if (mysql_num_rows(result) != 1) { mysql_free_result(result); @@ -133,51 +131,59 @@ bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_ void Database::AddSpeech(const char* from, const char* to, const char* message, uint16 minstatus, uint32 guilddbid, uint8 type) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query, speechFrom, speechTo, speechMeesage; + + DoEscapeString(speechFrom, from, strlen(from)); + DoEscapeString(speechTo, to, strlen(to)); + DoEscapeString(speechMeesage, message, strlen(message)); - char *S1 = new char[strlen(from) * 2 + 1]; - char *S2 = new char[strlen(to) * 2 + 1]; - char *S3 = new char[strlen(message) * 2 + 1]; - DoEscapeString(S1, from, strlen(from)); - DoEscapeString(S2, to, strlen(to)); - DoEscapeString(S3, message, strlen(message)); + StringFormat(query, "INSERT INTO `qs_player_speech` SET " + "`from`='%s', `to`='%s', `message`='%s', " + "`minstatus`='%i', `guilddbid`='%i', `type`='%i'", + speechFrom.c_str(), speechTo.c_str(), speechMeesage.c_str(), minstatus, guilddbid, type); - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_speech` SET `from`='%s', `to`='%s', `message`='%s', `minstatus`='%i', `guilddbid`='%i', `type`='%i'", S1, S2, S3, minstatus, guilddbid, type), errbuf, 0, 0)) { + if(!RunQuery(query, errbuf, 0, 0)) { _log(NET__WORLD, "Failed Speech Entry Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } - - safe_delete_array(query); - safe_delete_array(S1); - safe_delete_array(S2); - safe_delete_array(S3); } void Database::LogPlayerTrade(QSPlayerLogTrade_Struct* QS, uint32 Items) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; uint32 lastid = 0; - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_trade_record` SET `time`=NOW(), " - "`char1_id`='%i', `char1_pp`='%i', `char1_gp`='%i', `char1_sp`='%i', `char1_cp`='%i', `char1_items`='%i', " - "`char2_id`='%i', `char2_pp`='%i', `char2_gp`='%i', `char2_sp`='%i', `char2_cp`='%i', `char2_items`='%i'", - QS->char1_id, QS->char1_money.platinum, QS->char1_money.gold, QS->char1_money.silver, QS->char1_money.copper, QS->char1_count, - QS->char2_id, QS->char2_money.platinum, QS->char2_money.gold, QS->char2_money.silver, QS->char2_money.copper, QS->char2_count), - errbuf, 0, 0, &lastid)) { + + StringFormat(query,"INSERT INTO `qs_player_trade_record` SET `time`=NOW(), " + "`char1_id`='%i', `char1_pp`='%i', `char1_gp`='%i', " + "`char1_sp`='%i', `char1_cp`='%i', `char1_items`='%i', " + "`char2_id`='%i', `char2_pp`='%i', `char2_gp`='%i', " + "`char2_sp`='%i', `char2_cp`='%i', `char2_items`='%i'", + QS->char1_id, QS->char1_money.platinum, QS->char1_money.gold, + QS->char1_money.silver, QS->char1_money.copper, QS->char1_count, + QS->char2_id, QS->char2_money.platinum, QS->char2_money.gold, + QS->char2_money.silver, QS->char2_money.copper, QS->char2_count); + + + if(!RunQuery(query, errbuf, nullptr, nullptr, &lastid)) { _log(NET__WORLD, "Failed Trade Log Record Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } if(Items > 0) { for(int i = 0; i < Items; i++) { - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_trade_record_entries` SET `event_id`='%i', " - "`from_id`='%i', `from_slot`='%i', `to_id`='%i', `to_slot`='%i', `item_id`='%i', " - "`charges`='%i', `aug_1`='%i', `aug_2`='%i', `aug_3`='%i', `aug_4`='%i', `aug_5`='%i'", - lastid, QS->items[i].from_id, QS->items[i].from_slot, QS->items[i].to_id, QS->items[i].to_slot, QS->items[i].item_id, - QS->items[i].charges, QS->items[i].aug_1, QS->items[i].aug_2, QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5, - errbuf, 0, 0))) { + StringFormat(query, "INSERT INTO `qs_player_trade_record_entries` SET `event_id`='%i', " + "`from_id`='%i', `from_slot`='%i', `to_id`='%i', `to_slot`='%i', " + "`item_id`='%i', `charges`='%i', `aug_1`='%i', `aug_2`='%i', " + "`aug_3`='%i', `aug_4`='%i', `aug_5`='%i'", + lastid, QS->items[i].from_id, QS->items[i].from_slot, QS->items[i].to_id, + QS->items[i].to_slot, QS->items[i].item_id, QS->items[i].charges, + QS->items[i].aug_1, QS->items[i].aug_2, QS->items[i].aug_3, + QS->items[i].aug_4, QS->items[i].aug_5); + + if(!RunQuery(query, errbuf, 0, 0)) { _log(NET__WORLD, "Failed Trade Log Record Entry Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } } } @@ -186,28 +192,36 @@ void Database::LogPlayerTrade(QSPlayerLogTrade_Struct* QS, uint32 Items) { void Database::LogPlayerHandin(QSPlayerLogHandin_Struct* QS, uint32 Items) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; uint32 lastid = 0; - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_handin_record` SET `time`=NOW(), `quest_id`='%i', " - "`char_id`='%i', `char_pp`='%i', `char_gp`='%i', `char_sp`='%i', `char_cp`='%i', `char_items`='%i', " - "`npc_id`='%i', `npc_pp`='%i', `npc_gp`='%i', `npc_sp`='%i', `npc_cp`='%i', `npc_items`='%i'", - QS->quest_id, QS->char_id, QS->char_money.platinum, QS->char_money.gold, QS->char_money.silver, QS->char_money.copper, QS->char_count, - QS->npc_id, QS->npc_money.platinum, QS->npc_money.gold, QS->npc_money.silver, QS->npc_money.copper, QS->npc_count), - errbuf, 0, 0, &lastid)) { + + StringFormat(query,"INSERT INTO `qs_player_handin_record` SET `time`=NOW(), `quest_id`='%i', " + "`char_id`='%i', `char_pp`='%i', `char_gp`='%i', `char_sp`='%i', " + "`char_cp`='%i', `char_items`='%i', `npc_id`='%i', `npc_pp`='%i', " + "`npc_gp`='%i', `npc_sp`='%i', `npc_cp`='%i', `npc_items`='%i'", + QS->quest_id, QS->char_id, QS->char_money.platinum, QS->char_money.gold, + QS->char_money.silver, QS->char_money.copper, QS->char_count, + QS->npc_id, QS->npc_money.platinum, QS->npc_money.gold, QS->npc_money.silver, + QS->npc_money.copper, QS->npc_count); + + if(!RunQuery(query, errbuf, 0, 0, &lastid)) { _log(NET__WORLD, "Failed Handin Log Record Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } if(Items > 0) { for(int i = 0; i < Items; i++) { - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_handin_record_entries` SET `event_id`='%i', " - "`action_type`='%s', `char_slot`='%i', `item_id`='%i', `charges`='%i', " - "`aug_1`='%i', `aug_2`='%i', `aug_3`='%i', `aug_4`='%i', `aug_5`='%i'", - lastid, QS->items[i].action_type, QS->items[i].char_slot, QS->items[i].item_id, QS->items[i].charges, - QS->items[i].aug_1, QS->items[i].aug_2, QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5, - errbuf, 0, 0))) { + + StringFormat(query, "INSERT INTO `qs_player_handin_record_entries` SET `event_id`='%i', " + "`action_type`='%s', `char_slot`='%i', `item_id`='%i', `charges`='%i', " + "`aug_1`='%i', `aug_2`='%i', `aug_3`='%i', `aug_4`='%i', `aug_5`='%i'", + lastid, QS->items[i].action_type, QS->items[i].char_slot, + QS->items[i].item_id, QS->items[i].charges, QS->items[i].aug_1, + QS->items[i].aug_2, QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5); + + if(!RunQuery(query, errbuf, 0, 0)) { _log(NET__WORLD, "Failed Handin Log Record Entry Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } } } @@ -215,18 +229,28 @@ void Database::LogPlayerHandin(QSPlayerLogHandin_Struct* QS, uint32 Items) { void Database::LogPlayerNPCKill(QSPlayerLogNPCKill_Struct* QS, uint32 Members){ char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; uint32 lastid = 0; - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_npc_kill_record` SET `npc_id`='%i', `type`='%i', `zone_id`='%i', `time`=NOW()", QS->s1.NPCID, QS->s1.Type, QS->s1.ZoneID), errbuf, 0, 0, &lastid)) { + + StringFormat(query,"INSERT INTO `qs_player_npc_kill_record` SET `npc_id`='%i', " + "`type`='%i', `zone_id`='%i', `time`=NOW()", + QS->s1.NPCID, QS->s1.Type, QS->s1.ZoneID); + + if(!RunQuery(query, errbuf, nullptr, nullptr, &lastid)) { _log(NET__WORLD, "Failed NPC Kill Log Record Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } if(Members > 0){ for (int i = 0; i < Members; i++) { - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_npc_kill_record_entries` SET `event_id`='%i', `char_id`='%i'", lastid, QS->Chars[i].char_id, errbuf, 0, 0))) { + + StringFormat(query, "INSERT INTO `qs_player_npc_kill_record_entries` SET " + "`event_id`='%i', `char_id`='%i'", + lastid, QS->Chars[i].char_id); + + if(!RunQuery(query, errbuf, nullptr, nullptr)) { _log(NET__WORLD, "Failed NPC Kill Log Entry Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } } } @@ -235,26 +259,31 @@ void Database::LogPlayerNPCKill(QSPlayerLogNPCKill_Struct* QS, uint32 Members){ void Database::LogPlayerDelete(QSPlayerLogDelete_Struct* QS, uint32 Items) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; uint32 lastid = 0; - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_delete_record` SET `time`=NOW(), " - "`char_id`='%i', `stack_size`='%i', `char_items`='%i'", - QS->char_id, QS->stack_size, QS->char_count, QS->char_count), - errbuf, 0, 0, &lastid)) { + + StringFormat(query, "INSERT INTO `qs_player_delete_record` SET `time`=NOW(), " + "`char_id`='%i', `stack_size`='%i', `char_items`='%i'", + QS->char_id, QS->stack_size, QS->char_count, QS->char_count); + + if(!RunQuery(query, errbuf, nullptr, nullptr, &lastid)) { _log(NET__WORLD, "Failed Delete Log Record Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } if(Items > 0) { for(int i = 0; i < Items; i++) { - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_delete_record_entries` SET `event_id`='%i', " - "`char_slot`='%i', `item_id`='%i', `charges`='%i', `aug_1`='%i', " - "`aug_2`='%i', `aug_3`='%i', `aug_4`='%i', `aug_5`='%i'", - lastid, QS->items[i].char_slot, QS->items[i].item_id, QS->items[i].charges, QS->items[i].aug_1, - QS->items[i].aug_2, QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5, - errbuf, 0, 0))) { + + StringFormat(query,"INSERT INTO `qs_player_delete_record_entries` SET `event_id`='%i', " + "`char_slot`='%i', `item_id`='%i', `charges`='%i', `aug_1`='%i', " + "`aug_2`='%i', `aug_3`='%i', `aug_4`='%i', `aug_5`='%i'", + lastid, QS->items[i].char_slot, QS->items[i].item_id, + QS->items[i].charges, QS->items[i].aug_1,QS->items[i].aug_2, + QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5); + + if(!RunQuery(query, errbuf, nullptr, nullptr)) { _log(NET__WORLD, "Failed Delete Log Record Entry Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } } } @@ -263,26 +292,33 @@ void Database::LogPlayerDelete(QSPlayerLogDelete_Struct* QS, uint32 Items) { void Database::LogPlayerMove(QSPlayerLogMove_Struct* QS, uint32 Items) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; uint32 lastid = 0; - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_move_record` SET `time`=NOW(), " - "`char_id`='%i', `from_slot`='%i', `to_slot`='%i', `stack_size`='%i', `char_items`='%i', `postaction`='%i'", - QS->char_id, QS->from_slot, QS->to_slot, QS->stack_size, QS->char_count, QS->postaction), - errbuf, 0, 0, &lastid)) { + + StringFormat(query, "INSERT INTO `qs_player_move_record` SET `time`=NOW(), " + "`char_id`='%i', `from_slot`='%i', `to_slot`='%i', " + "`stack_size`='%i', `char_items`='%i', `postaction`='%i'", + QS->char_id, QS->from_slot, QS->to_slot, QS->stack_size, + QS->char_count, QS->postaction); + + if(!RunQuery(query, errbuf, 0, 0, &lastid)) { _log(NET__WORLD, "Failed Move Log Record Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } if(Items > 0) { for(int i = 0; i < Items; i++) { - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_move_record_entries` SET `event_id`='%i', " - "`from_slot`='%i', `to_slot`='%i', `item_id`='%i', `charges`='%i', " - "`aug_1`='%i', `aug_2`='%i', `aug_3`='%i', `aug_4`='%i', `aug_5`='%i'", lastid, - QS->items[i].from_slot, QS->items[i].to_slot, QS->items[i].item_id, QS->items[i].charges, - QS->items[i].aug_1, QS->items[i].aug_2, QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5, - errbuf, 0, 0))) { + + StringFormat(query,"INSERT INTO `qs_player_move_record_entries` SET `event_id`='%i', " + "`from_slot`='%i', `to_slot`='%i', `item_id`='%i', `charges`='%i', " + "`aug_1`='%i', `aug_2`='%i', `aug_3`='%i', `aug_4`='%i', `aug_5`='%i'", + lastid, QS->items[i].from_slot, QS->items[i].to_slot, QS->items[i].item_id, + QS->items[i].charges, QS->items[i].aug_1, QS->items[i].aug_2, QS->items[i].aug_3, + QS->items[i].aug_4, QS->items[i].aug_5); + + if(!RunQuery(query, errbuf, nullptr, nullptr)) { _log(NET__WORLD, "Failed Move Log Record Entry Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } } } @@ -292,28 +328,38 @@ void Database::LogMerchantTransaction(QSMerchantLogTransaction_Struct* QS, uint3 // Merchant transactions are from the perspective of the merchant, not the player -U char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; uint32 lastid = 0; - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_merchant_transaction_record` SET `time`=NOW(), " - "`zone_id`='%i', `merchant_id`='%i', `merchant_pp`='%i', `merchant_gp`='%i', `merchant_sp`='%i', `merchant_cp`='%i', `merchant_items`='%i', " - "`char_id`='%i', `char_pp`='%i', `char_gp`='%i', `char_sp`='%i', `char_cp`='%i', `char_items`='%i'", - QS->zone_id, QS->merchant_id, QS->merchant_money.platinum, QS->merchant_money.gold, QS->merchant_money.silver, QS->merchant_money.copper, QS->merchant_count, - QS->char_id, QS->char_money.platinum, QS->char_money.gold, QS->char_money.silver, QS->char_money.copper, QS->char_count), - errbuf, 0, 0, &lastid)) { + + StringFormat(query,"INSERT INTO `qs_merchant_transaction_record` SET `time`=NOW(), " + "`zone_id`='%i', `merchant_id`='%i', `merchant_pp`='%i', " + "`merchant_gp`='%i', `merchant_sp`='%i', `merchant_cp`='%i', " + "`merchant_items`='%i', `char_id`='%i', `char_pp`='%i', " + "`char_gp`='%i', `char_sp`='%i', `char_cp`='%i', `char_items`='%i'", + QS->zone_id, QS->merchant_id, QS->merchant_money.platinum, + QS->merchant_money.gold, QS->merchant_money.silver, + QS->merchant_money.copper, QS->merchant_count, + QS->char_id, QS->char_money.platinum, QS->char_money.gold, + QS->char_money.silver, QS->char_money.copper, QS->char_count); + + if(!RunQuery(query, errbuf, 0, 0, &lastid)) { _log(NET__WORLD, "Failed Transaction Log Record Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } if(Items > 0) { for(int i = 0; i < Items; i++) { - if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_merchant_transaction_record_entries` SET `event_id`='%i', " - "`char_slot`='%i', `item_id`='%i', `charges`='%i', `aug_1`='%i', " - "`aug_2`='%i', `aug_3`='%i', `aug_4`='%i', `aug_5`='%i'", - lastid, QS->items[i].char_slot, QS->items[i].item_id, QS->items[i].charges, QS->items[i].aug_1, - QS->items[i].aug_2, QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5, - errbuf, 0, 0))) { + + StringFormat(query,"INSERT INTO `qs_merchant_transaction_record_entries` SET `event_id`='%i', " + "`char_slot`='%i', `item_id`='%i', `charges`='%i', `aug_1`='%i', " + "`aug_2`='%i', `aug_3`='%i', `aug_4`='%i', `aug_5`='%i'", + lastid, QS->items[i].char_slot, QS->items[i].item_id, QS->items[i].charges, + QS->items[i].aug_1, QS->items[i].aug_2, QS->items[i].aug_3, QS->items[i].aug_4, + QS->items[i].aug_5); + + if(!RunQuery(query, errbuf, 0, 0)) { _log(NET__WORLD, "Failed Transaction Log Record Entry Insert: %s", errbuf); - _log(NET__WORLD, "%s", query); + _log(NET__WORLD, "%s", query.c_str()); } } } diff --git a/queryserv/lfguild.cpp b/queryserv/lfguild.cpp index 37f80bf28..abb6bbab9 100644 --- a/queryserv/lfguild.cpp +++ b/queryserv/lfguild.cpp @@ -35,19 +35,20 @@ GuildLookingForPlayers::GuildLookingForPlayers(char *Name, char *Comments, uint3 bool LFGuildManager::LoadDatabase() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; - if (!database.RunQuery(query,MakeAnyLenString(&query, "SELECT `type`,`name`,`comment`, `fromlevel`, `tolevel`, `classes`, `aacount`, `timezone`, `timeposted` FROM `lfguild`"),errbuf,&result)){ + std::string query = "SELECT `type`,`name`,`comment`, `fromlevel`, " + "`tolevel`, `classes`, `aacount`, `timezone`, " + "`timeposted` FROM `lfguild`"; - _log(QUERYSERV__ERROR, "Failed to load LFGuild info from database. %s %s", query, errbuf); - safe_delete_array(query); + if (!database.RunQuery(query,errbuf,&result)){ + + _log(QUERYSERV__ERROR, "Failed to load LFGuild info from database. %s %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); while((row = mysql_fetch_row(result))) { @@ -243,7 +244,7 @@ void LFGuildManager::SendGuildMatches(uint32 FromZoneID, uint32 FromInstanceID, void LFGuildManager::TogglePlayer(uint32 FromZoneID, uint32 FromInstanceID, char *From, uint32 Class, uint32 Level, uint32 AAPoints, char *Comments, uint32 Toggle, uint32 TimeZone) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; std::list::iterator it; @@ -257,10 +258,11 @@ void LFGuildManager::TogglePlayer(uint32 FromZoneID, uint32 FromInstanceID, char } } - if(!database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM `lfguild` WHERE `type` = 0 AND `name` = '%s'", From), errbuf, 0, 0)) - _log(QUERYSERV__ERROR, "Error removing player from LFGuild table, query was %s, %s", query, errbuf); + StringFormat(query,"DELETE FROM `lfguild` WHERE `type` = 0 AND `name` = '%s'", From); + + if(!database.RunQuery(query, errbuf, 0, 0)) + _log(QUERYSERV__ERROR, "Error removing player from LFGuild table, query was %s, %s", query.c_str(), errbuf); - safe_delete_array(query); uint32 Now = time(nullptr); @@ -268,10 +270,14 @@ void LFGuildManager::TogglePlayer(uint32 FromZoneID, uint32 FromInstanceID, char { PlayerLookingForGuild p(From, Comments, Level, Class, AAPoints, TimeZone, Now); Players.push_back(p); - if(!database.RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `lfguild` (`type`, `name`, `comment`, `fromlevel`, `tolevel`, `classes`, `aacount`, `timezone`, `timeposted`) VALUES(0, '%s', '%s', %u, 0, %u, %u, %u, %u)", From, Comments, Level, Class, AAPoints, TimeZone, Now), errbuf, 0, 0)) - _log(QUERYSERV__ERROR, "Error inserting player into LFGuild table, query was %s, %s", query, errbuf); - safe_delete_array(query); + StringFormat(query,"INSERT INTO `lfguild` (`type`, `name`, `comment`, `fromlevel`, " + "`tolevel`, `classes`, `aacount`, `timezone`, `timeposted`) " + "VALUES(0, '%s', '%s', %u, 0, %u, %u, %u, %u)", + From, Comments, Level, Class, AAPoints, TimeZone, Now); + + if(!database.RunQuery(query, errbuf, nullptr, nullptr)) + _log(QUERYSERV__ERROR, "Error inserting player into LFGuild table, query was %s, %s", query.c_str(), errbuf); } @@ -295,7 +301,7 @@ void LFGuildManager::TogglePlayer(uint32 FromZoneID, uint32 FromInstanceID, char void LFGuildManager::ToggleGuild(uint32 FromZoneID, uint32 FromInstanceID, char *From, char* GuildName, char *Comments, uint32 FromLevel, uint32 ToLevel, uint32 Classes, uint32 AACount, uint32 Toggle, uint32 TimeZone) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; std::list::iterator it; @@ -308,10 +314,11 @@ void LFGuildManager::ToggleGuild(uint32 FromZoneID, uint32 FromInstanceID, char } } - if(!database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM `lfguild` WHERE `type` = 1 AND `name` = '%s'", GuildName), errbuf, 0, 0)) - _log(QUERYSERV__ERROR, "Error removing guild from LFGuild table, query was %s, %s", query, errbuf); + StringFormat(query,"DELETE FROM `lfguild` WHERE `type` = 1 AND `name` = '%s'", GuildName); + + if(!database.RunQuery(query, errbuf, 0, 0)) + _log(QUERYSERV__ERROR, "Error removing guild from LFGuild table, query was %s, %s", query.c_str(), errbuf); - safe_delete_array(query); uint32 Now = time(nullptr); @@ -319,10 +326,16 @@ void LFGuildManager::ToggleGuild(uint32 FromZoneID, uint32 FromInstanceID, char { GuildLookingForPlayers g(GuildName, Comments, FromLevel, ToLevel, Classes, AACount, TimeZone, Now); Guilds.push_back(g); - if(!database.RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `lfguild` (`type`, `name`, `comment`, `fromlevel`, `tolevel`, `classes`, `aacount`, `timezone`, `timeposted`) VALUES(1, '%s', '%s', %u, %u, %u, %u, %u, %u)", GuildName, Comments, FromLevel, ToLevel, Classes, AACount, TimeZone, Now), errbuf, 0, 0)) - _log(QUERYSERV__ERROR, "Error inserting guild into LFGuild table, query was %s, %s", query, errbuf); - safe_delete_array(query); + StringFormat(query,"INSERT INTO `lfguild` (`type`, `name`, `comment`, `fromlevel`, " + "`tolevel`, `classes`, `aacount`, `timezone`, `timeposted`) " + "VALUES(1, '%s', '%s', %u, %u, %u, %u, %u, %u)", + GuildName, Comments, FromLevel, ToLevel, Classes, + AACount, TimeZone, Now); + + if(!database.RunQuery(query, errbuf, 0, 0)) + _log(QUERYSERV__ERROR, "Error inserting guild into LFGuild table, query was %s, %s", query.c_str(), errbuf); + } ServerPacket *pack = new ServerPacket(ServerOP_LFGuildUpdate, strlen(GuildName) + strlen(Comments) + 30); @@ -344,7 +357,7 @@ void LFGuildManager::ToggleGuild(uint32 FromZoneID, uint32 FromInstanceID, char void LFGuildManager::ExpireEntries() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; std::list::iterator it; std::list::iterator it2; @@ -353,10 +366,12 @@ void LFGuildManager::ExpireEntries() { if((*it).TimePosted + 604800 <= (uint32)time(nullptr)) { - if(!database.RunQuery(query, MakeAnyLenString(&query, "DELETE from `lfguild` WHERE `type` = 0 AND `name` = '%s'", (*it).Name.c_str()), errbuf, 0, 0)) - _log(QUERYSERV__ERROR, "Error expiring player LFGuild entry, query was %s, %s", query, errbuf); - safe_delete_array(query); + StringFormat(query, "DELETE from `lfguild` WHERE `type` = 0 AND `name` = '%s'", (*it).Name.c_str()); + + if(!database.RunQuery(query, errbuf, 0, 0)) + _log(QUERYSERV__ERROR, "Error expiring player LFGuild entry, query was %s, %s", query.c_str(), errbuf); + it = Players.erase(it); } @@ -366,10 +381,11 @@ void LFGuildManager::ExpireEntries() { if((*it2).TimePosted + 2592000 <= time(nullptr)) { - if(!database.RunQuery(query, MakeAnyLenString(&query, "DELETE from `lfguild` WHERE `type` = 1 AND `name` = '%s'", (*it2).Name.c_str()), errbuf, 0, 0)) - _log(QUERYSERV__ERROR, "Error removing guild LFGuild entry, query was %s, %s", query, errbuf); + StringFormat(query, "DELETE from `lfguild` WHERE `type` = 1 AND `name` = '%s'", (*it2).Name.c_str()); + + if(!database.RunQuery(query, errbuf, 0, 0)) + _log(QUERYSERV__ERROR, "Error removing guild LFGuild entry, query was %s, %s", query.c_str(), errbuf); - safe_delete_array(query); it2 = Guilds.erase(it2); } diff --git a/ucs/database.cpp b/ucs/database.cpp index 508fab4a0..f9371d9c0 100644 --- a/ucs/database.cpp +++ b/ucs/database.cpp @@ -105,21 +105,22 @@ Database::~Database() void Database::GetAccountStatus(Client *c) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (!RunQuery(query,MakeAnyLenString(&query, "select `status`, `hideme`, `karma`, `revoked` from `account` where `id`='%i' limit 1", - c->GetAccountID()),errbuf,&result)){ + StringFormat(query, "select `status`, `hideme`, `karma`, `revoked` from `account` " + "where `id`='%i' limit 1", + c->GetAccountID()); + + if (!RunQuery(query,errbuf,&result)){ _log(UCS__ERROR, "Unable to get account status for character %s, error %s", c->GetName().c_str(), errbuf); - safe_delete_array(query); return; } - _log(UCS__TRACE, "GetAccountStatus Query: %s", query); - safe_delete_array(query); + _log(UCS__TRACE, "GetAccountStatus Query: %s", query.c_str()); if(mysql_num_rows(result) != 1) { @@ -144,20 +145,21 @@ int Database::FindAccount(const char *CharacterName, Client *c) { _log(UCS__TRACE, "FindAccount for character %s", CharacterName); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; c->ClearCharacters(); - if (!RunQuery(query,MakeAnyLenString(&query, "select `id`, `account_id`, `level` from `character_` where `name`='%s' limit 1", - CharacterName),errbuf,&result)) + StringFormat(query, "select `id`, `account_id`, `level` from " + "`character_` where `name`='%s' limit 1", + CharacterName); + + if (!RunQuery(query,errbuf,&result)) { - _log(UCS__ERROR, "FindAccount query failed: %s", query); - safe_delete_array(query); + _log(UCS__ERROR, "FindAccount query failed: %s", query.c_str()); return -1; } - safe_delete_array(query); if (mysql_num_rows(result) != 1) { @@ -173,13 +175,15 @@ int Database::FindAccount(const char *CharacterName, Client *c) { mysql_free_result(result); _log(UCS__TRACE, "Account ID for %s is %i", CharacterName, AccountID); - if (!RunQuery(query,MakeAnyLenString(&query, "select `id`, `name`, `level` from `character_` where `account_id`=%i and `name` !='%s'", - AccountID, CharacterName),errbuf,&result)) + StringFormat(query,"select `id`, `name`, `level` from " + "`character_` where `account_id`=%i " + "and `name` !='%s'", + AccountID, CharacterName); + + if (!RunQuery(query,errbuf,&result)) { - safe_delete_array(query); return AccountID; } - safe_delete_array(query); for(unsigned int i = 0; i < mysql_num_rows(result); i++) { @@ -193,21 +197,20 @@ int Database::FindAccount(const char *CharacterName, Client *c) { bool Database::VerifyMailKey(std::string CharacterName, int IPAddress, std::string MailKey) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (!RunQuery(query,MakeAnyLenString(&query, "select `mailkey` from `character_` where `name`='%s' limit 1", - CharacterName.c_str()),errbuf,&result)){ + StringFormat(query,"select `mailkey` from `character_` where `name`='%s' limit 1", + CharacterName.c_str()); - safe_delete_array(query); + if (!RunQuery(query,errbuf,&result)){ _log(UCS__ERROR, "Error retrieving mailkey from database: %s", errbuf); return false; } - safe_delete_array(query); row = mysql_fetch_row(result); @@ -234,24 +237,24 @@ bool Database::VerifyMailKey(std::string CharacterName, int IPAddress, std::stri int Database::FindCharacter(const char *CharacterName) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; char *SafeCharName = RemoveApostrophes(CharacterName); - if (!RunQuery(query,MakeAnyLenString(&query, "select `id` from `character_` where `name`='%s' limit 1", - SafeCharName),errbuf,&result)){ + StringFormat(query,"select `id` from `character_` where `name`='%s' limit 1", + SafeCharName); - _log(UCS__ERROR, "FindCharacter failed. %s %s", query, errbuf); + if (!RunQuery(query,errbuf,&result)){ + + _log(UCS__ERROR, "FindCharacter failed. %s %s", query.c_str(), errbuf); - safe_delete_array(query); safe_delete_array(SafeCharName); return -1; } - safe_delete_array(query); safe_delete_array(SafeCharName); if (mysql_num_rows(result) != 1) { @@ -276,21 +279,19 @@ int Database::FindCharacter(const char *CharacterName) { bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_len) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; + + StringFormat(query,"select `value` from `variables` where `varname`='%s'", varname); - if (!RunQuery(query,MakeAnyLenString(&query, "select `value` from `variables` where `varname`='%s'", varname), errbuf, &result)) { + if (!RunQuery(query, errbuf, &result)) { - _log(UCS__ERROR, "Unable to get message count from database. %s %s", query, errbuf); - - safe_delete_array(query); + _log(UCS__ERROR, "Unable to get message count from database. %s %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); - if (mysql_num_rows(result) != 1) { mysql_free_result(result); @@ -312,19 +313,18 @@ bool Database::LoadChatChannels() { _log(UCS__INIT, "Loading chat channels from the database."); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; - if (!RunQuery(query,MakeAnyLenString(&query, "select `name`,`owner`,`password`, `minstatus` from `chatchannels`"),errbuf,&result)){ + std::string query = "select `name`,`owner`,`password`, `minstatus` from `chatchannels`"; - _log(UCS__ERROR, "Failed to load channels. %s %s", query, errbuf); - safe_delete_array(query); + if (!RunQuery(query,errbuf,&result)){ + + _log(UCS__ERROR, "Failed to load channels. %s %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); while((row = mysql_fetch_row(result))) { @@ -345,16 +345,16 @@ void Database::SetChannelPassword(std::string ChannelName, std::string Password) _log(UCS__TRACE, "Database::SetChannelPassword(%s, %s)", ChannelName.c_str(), Password.c_str()); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if(!RunQuery(query, MakeAnyLenString(&query, "UPDATE `chatchannels` set `password`='%s' where `name`='%s'", Password.c_str(), - ChannelName.c_str()), errbuf)) { + StringFormat(query,"UPDATE `chatchannels` set `password`='%s' where `name`='%s'", + Password.c_str(), ChannelName.c_str()); - _log(UCS__ERROR, "Error updating password in database: %s, %s", query, errbuf); + if(!RunQuery(query, errbuf)) { + + _log(UCS__ERROR, "Error updating password in database: %s, %s", query.c_str(), errbuf); } - - safe_delete_array(query); } void Database::SetChannelOwner(std::string ChannelName, std::string Owner) { @@ -362,16 +362,16 @@ void Database::SetChannelOwner(std::string ChannelName, std::string Owner) { _log(UCS__TRACE, "Database::SetChannelOwner(%s, %s)", ChannelName.c_str(), Owner.c_str()); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if(!RunQuery(query, MakeAnyLenString(&query, "UPDATE `chatchannels` set `owner`='%s' where `name`='%s'", Owner.c_str(), - ChannelName.c_str()), errbuf)) { + StringFormat(query, "UPDATE `chatchannels` set `owner`='%s' where `name`='%s'", + Owner.c_str(), ChannelName.c_str()); - _log(UCS__ERROR, "Error updating Owner in database: %s, %s", query, errbuf); + if(!RunQuery(query, errbuf)) { + + _log(UCS__ERROR, "Error updating Owner in database: %s, %s", query.c_str(), errbuf); } - - safe_delete_array(query); } void Database::SendHeaders(Client *c) { @@ -384,22 +384,20 @@ void Database::SendHeaders(Client *c) { if(CharacterID <= 0) return; - char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (!RunQuery(query,MakeAnyLenString(&query, "select `msgid`,`timestamp`,`from`,`subject`, `status` from `mail` " - "where `charid`=%i", CharacterID),errbuf,&result)){ + StringFormat(query, "select `msgid`,`timestamp`,`from`,`subject`, `status` " + "from `mail` where `charid`=%i", + CharacterID); - safe_delete_array(query); + if (!RunQuery(query,errbuf,&result)){ return ; } - safe_delete_array(query); - char Buf[100]; my_ulonglong NumRows = mysql_num_rows(result); @@ -490,18 +488,18 @@ void Database::SendBody(Client *c, int MessageNumber) { return; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (!RunQuery(query,MakeAnyLenString(&query, "select `msgid`, `body`, `to` from `mail` " - "where `charid`=%i and `msgid`=%i", CharacterID, MessageNumber), errbuf, &result)){ - safe_delete_array(query); + StringFormat(query,"select `msgid`, `body`, `to` from `mail` " + "where `charid`=%i and `msgid`=%i", + CharacterID, MessageNumber); + if (!RunQuery(query,errbuf, &result)) { return ; } - safe_delete_array(query); if (mysql_num_rows(result) != 1) { @@ -568,38 +566,31 @@ bool Database::SendMail(std::string Recipient, std::string From, std::string Sub if(CharacterID <= 0) return false; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query,escSubject,escBody; - char *EscSubject = new char[Subject.length() * 2 + 1]; - char *EscBody = new char[Body.length() * 2 + 1]; + DoEscapeString(escSubject, Subject.c_str(), Subject.length()); + DoEscapeString(escBody, Body.c_str(), Body.length()); - DoEscapeString(EscSubject, Subject.c_str(), Subject.length()); - DoEscapeString(EscBody, Body.c_str(), Body.length()); - - const char *MailQuery="INSERT INTO `mail` (`charid`, `timestamp`, `from`, `subject`, `body`, `to`, `status`) " - "VALUES ('%i', %i, '%s', '%s', '%s', '%s', %i)"; uint32 LastMsgID; - int Now = time(nullptr); // time returns a 64 bit int on Windows at least, which vsnprintf doesn't like. - if(!RunQuery(query, MakeAnyLenString(&query, MailQuery, CharacterID, Now, From.c_str(), EscSubject, EscBody, - RecipientsString.c_str(), 1), errbuf, 0, 0, &LastMsgID)) { + StringFormat(query,"INSERT INTO `mail` (`charid`, `timestamp`, `from`, " + "`subject`, `body`, `to`, `status`) " + "VALUES ('%i', %i, '%s', '%s', '%s', '%s', %i)", + CharacterID, Now, From.c_str(), escSubject.c_str(), escBody.c_str(), + RecipientsString.c_str(), 1); + - _log(UCS__ERROR, "SendMail: Query %s failed with error %s", query, errbuf); + if(!RunQuery(query, errbuf, nullptr, nullptr, &LastMsgID)) { - safe_delete_array(EscSubject); - safe_delete_array(EscBody); - safe_delete_array(query); + _log(UCS__ERROR, "SendMail: Query %s failed with error %s", query.c_str(), errbuf); return false; } _log(UCS__TRACE, "MessageID %i generated, from %s, to %s", LastMsgID, From.c_str(), Recipient.c_str()); - safe_delete_array(EscSubject); - safe_delete_array(EscBody); - safe_delete_array(query); Client *c = CL->IsCharacterOnline(CharacterName); @@ -619,17 +610,24 @@ void Database::SetMessageStatus(int MessageNumber, int Status) { _log(UCS__TRACE, "SetMessageStatus %i %i", MessageNumber, Status); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; if(Status == 0) - RunQuery(query, MakeAnyLenString(&query, "delete from `mail` where `msgid`=%i", MessageNumber), errbuf); - else if (!RunQuery(query, MakeAnyLenString(&query, "update `mail` set `status`=%i where `msgid`=%i", Status, MessageNumber), errbuf)) { + { + StringFormat(query, "delete from `mail` where `msgid`=%i", MessageNumber); - _log(UCS__ERROR, "Error updating status %s, %s", query, errbuf); + RunQuery(query, errbuf); + } + else + { + StringFormat(query, "update `mail` set `status`=%i where `msgid`=%i", + Status, MessageNumber); + if (!RunQuery(query, errbuf)) { + _log(UCS__ERROR, "Error updating status %s, %s", query.c_str(), errbuf); + } } - safe_delete_array(query); } void Database::ExpireMail() { @@ -637,18 +635,16 @@ void Database::ExpireMail() { _log(UCS__INIT, "Expiring mail..."); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + MYSQL_RES *result; MYSQL_ROW row; uint32 AffectedRows; - - if (!RunQuery(query,MakeAnyLenString(&query, "select COUNT(*) from `mail` "),errbuf,&result)){ - _log(UCS__ERROR, "Unable to get message count from database. %s %s", query, errbuf); - safe_delete_array(query); + std::string query ="select COUNT(*) from `mail` "; + if (!RunQuery(query,errbuf,&result)){ + _log(UCS__ERROR, "Unable to get message count from database. %s %s", query.c_str(), errbuf); return ; } - safe_delete_array(query); row = mysql_fetch_row(result); @@ -658,94 +654,93 @@ void Database::ExpireMail() { // Expire Trash if(RuleI(Mail, ExpireTrash) >= 0) { - if(RunQuery(query, MakeAnyLenString(&query, "delete from `mail` where `status`=4 and `timestamp` < %i", - time(nullptr) - RuleI(Mail, ExpireTrash)), errbuf, 0, &AffectedRows)) { + + StringFormat(query,"delete from `mail` where `status`=4 and `timestamp` < %i", + time(nullptr) - RuleI(Mail, ExpireTrash)); + + if(RunQuery(query, errbuf, 0, &AffectedRows)) { _log(UCS__INIT, "Expired %i trash messages.", AffectedRows); } else { - _log(UCS__ERROR, "Error expiring trash messages, %s %s", query, errbuf); + _log(UCS__ERROR, "Error expiring trash messages, %s %s", query.c_str(), errbuf); } - safe_delete_array(query); } // Expire Read if(RuleI(Mail, ExpireRead) >= 0) { - if(RunQuery(query, MakeAnyLenString(&query, "delete from `mail` where `status`=3 and `timestamp` < %i", - time(nullptr) - RuleI(Mail, ExpireRead)), errbuf, 0, &AffectedRows)) { + + StringFormat(query,"delete from `mail` where `status`=3 and `timestamp` < %i", + time(nullptr) - RuleI(Mail, ExpireRead)); + + if(RunQuery(query, errbuf, 0, &AffectedRows)) { _log(UCS__INIT, "Expired %i read messages.", AffectedRows); } else { - _log(UCS__ERROR, "Error expiring read messages, %s %s", query, errbuf); + _log(UCS__ERROR, "Error expiring read messages, %s %s", query.c_str(), errbuf); } - safe_delete_array(query); } // Expire Unread if(RuleI(Mail, ExpireUnread) >= 0) { - if(RunQuery(query, MakeAnyLenString(&query, "delete from `mail` where `status`=1 and `timestamp` < %i", - time(nullptr) - RuleI(Mail, ExpireUnread)), errbuf, 0, &AffectedRows)) { - _log(UCS__INIT, "Expired %i unread messages.", AffectedRows); + + StringFormat(query, "delete from `mail` where `status`=1 and `timestamp` < %i", + time(nullptr) - RuleI(Mail, ExpireUnread)); + + if(RunQuery(query, errbuf, 0, &AffectedRows)) { + _log(UCS__INIT, "Expired %i unread messages.", AffectedRows); } else { - _log(UCS__ERROR, "Error expiring unread messages, %s %s", query, errbuf); + _log(UCS__ERROR, "Error expiring unread messages, %s %s", query.c_str(), errbuf); } - safe_delete_array(query); } } void Database::AddFriendOrIgnore(int CharID, int Type, std::string Name) { - const char *FriendsQuery="INSERT INTO `friends` (`charid`, `type`, `name`) VALUES ('%i', %i, '%s')"; - char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; + StringFormat(query, "INSERT INTO `friends` (`charid`, `type`, `name`) VALUES ('%i', %i, '%s')", + CharID, Type, CapitaliseName(Name).c_str()); - if(!RunQuery(query, MakeAnyLenString(&query, FriendsQuery, CharID, Type, CapitaliseName(Name).c_str()), errbuf, 0, 0)) - _log(UCS__ERROR, "Error adding friend/ignore, query was %s : %s", query, errbuf); + if(!RunQuery(query, errbuf, 0, 0)) + _log(UCS__ERROR, "Error adding friend/ignore, query was %s : %s", query.c_str(), errbuf); else _log(UCS__TRACE, "Wrote Friend/Ignore entry for charid %i, type %i, name %s to database.", - CharID, Type, Name.c_str()); - - - safe_delete_array(query); + CharID, Type, Name.c_str()); } void Database::RemoveFriendOrIgnore(int CharID, int Type, std::string Name) { - const char *FriendsQuery="DELETE FROM `friends` WHERE `charid`=%i AND `type`=%i and `name`='%s'"; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; - if(!RunQuery(query, MakeAnyLenString(&query, FriendsQuery, CharID, Type, CapitaliseName(Name).c_str()), errbuf, 0, 0)) - _log(UCS__ERROR, "Error removing friend/ignore, query was %s", query); + StringFormat(query,"DELETE FROM `friends` WHERE `charid`=%i AND `type`=%i and `name`='%s'", + CharID, Type, CapitaliseName(Name).c_str()); + + if(!RunQuery(query, errbuf, 0, 0)) + _log(UCS__ERROR, "Error removing friend/ignore, query was %s", query.c_str()); else _log(UCS__TRACE, "Removed Friend/Ignore entry for charid %i, type %i, name %s from database.", CharID, Type, Name.c_str()); - - safe_delete_array(query); } void Database::GetFriendsAndIgnore(int CharID, std::vector &Friends, std::vector &Ignorees) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - const char *FriendsQuery="select `type`, `name` from `friends` WHERE `charid`=%i"; + StringFormat(query,"select `type`, `name` from `friends` WHERE `charid`=%i", CharID); - if (!RunQuery(query,MakeAnyLenString(&query, FriendsQuery, CharID),errbuf,&result)){ + if (!RunQuery(query,errbuf,&result)){ - _log(UCS__ERROR, "GetFriendsAndIgnore query error %s, %s", query, errbuf); - - safe_delete_array(query); + _log(UCS__ERROR, "GetFriendsAndIgnore query error %s, %s", query.c_str(), errbuf); return ; } - safe_delete_array(query); - while((row = mysql_fetch_row(result))) { std::string Name = row[1]; diff --git a/world/Adventure.cpp b/world/Adventure.cpp index d44b84d0e..a48104bc4 100644 --- a/world/Adventure.cpp +++ b/world/Adventure.cpp @@ -375,11 +375,13 @@ void Adventure::MoveCorpsesToGraveyard() std::list dbid_list; std::list charid_list; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT id, charid FROM player_corpses WHERE instanceid=%d", GetInstanceID()), errbuf, &result)) + StringFormat(query,"SELECT id, charid FROM player_corpses WHERE instanceid=%d", GetInstanceID()); + + if(database.RunQuery(query,errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -387,12 +389,10 @@ void Adventure::MoveCorpsesToGraveyard() charid_list.push_back(atoi(row[1])); } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::MoveCorpsesToGraveyard: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::MoveCorpsesToGraveyard: %s (%s)", query.c_str(), errbuf); } std::list::iterator iter = dbid_list.begin(); @@ -401,15 +401,13 @@ void Adventure::MoveCorpsesToGraveyard() float x = GetTemplate()->graveyard_x + MakeRandomFloat(-GetTemplate()->graveyard_radius, GetTemplate()->graveyard_radius); float y = GetTemplate()->graveyard_y + MakeRandomFloat(-GetTemplate()->graveyard_radius, GetTemplate()->graveyard_radius); float z = GetTemplate()->graveyard_z; - if(database.RunQuery(query,MakeAnyLenString(&query, "UPDATE player_corpses SET zoneid=%d, instanceid=0, x=%f, y=%f, z=%f WHERE instanceid=%d", - GetTemplate()->graveyard_zone_id, x, y, z, GetInstanceID()), errbuf)) + + StringFormat(query,"UPDATE player_corpses SET zoneid=%d, instanceid=0, x=%f, y=%f, z=%f WHERE instanceid=%d", + GetTemplate()->graveyard_zone_id, x, y, z, GetInstanceID()); + + if(!database.RunQuery(query,errbuf)) { - safe_delete_array(query); - } - else - { - LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::MoveCorpsesToGraveyard: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::MoveCorpsesToGraveyard: %s (%s)", query.c_str(), errbuf); } iter++; } diff --git a/world/AdventureManager.cpp b/world/AdventureManager.cpp index 834b2b643..f5df366f1 100644 --- a/world/AdventureManager.cpp +++ b/world/AdventureManager.cpp @@ -636,16 +636,17 @@ AdventureTemplate *AdventureManager::GetAdventureTemplate(int id) bool AdventureManager::LoadAdventureTemplates() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT id, zone, zone_version, " - "is_hard, min_level, max_level, type, type_data, type_count, assa_x, " - "assa_y, assa_z, assa_h, text, duration, zone_in_time, win_points, lose_points, " - "theme, zone_in_zone_id, zone_in_x, zone_in_y, zone_in_object_id, dest_x, dest_y," - " dest_z, dest_h, graveyard_zone_id, graveyard_x, graveyard_y, graveyard_z, " - "graveyard_radius FROM adventure_template"), errbuf, &result)) + std::string query = "SELECT id, zone, zone_version, " + "is_hard, min_level, max_level, type, type_data, type_count, assa_x, " + "assa_y, assa_z, assa_h, text, duration, zone_in_time, win_points, lose_points, " + "theme, zone_in_zone_id, zone_in_x, zone_in_y, zone_in_object_id, dest_x, dest_y," + " dest_z, dest_h, graveyard_zone_id, graveyard_x, graveyard_y, graveyard_z, " + "graveyard_radius FROM adventure_template"; + + if(database.RunQuery(query,errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -686,13 +687,11 @@ bool AdventureManager::LoadAdventureTemplates() adventure_templates[t->id] = t; } mysql_free_result(result); - safe_delete_array(query); return true; } else { - LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::LoadAdventures: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::LoadAdventures: %s (%s)", query.c_str(), errbuf); return false; } return false; @@ -701,11 +700,12 @@ bool AdventureManager::LoadAdventureTemplates() bool AdventureManager::LoadAdventureEntries() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; - - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT id, template_id FROM adventure_template_entry"), errbuf, &result)) + + std::string query= "SELECT id, template_id FROM adventure_template_entry"; + + if(database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -738,13 +738,11 @@ bool AdventureManager::LoadAdventureEntries() } } mysql_free_result(result); - safe_delete_array(query); return true; } else { - LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::LoadAdventureEntries: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::LoadAdventureEntries: %s (%s)", query.c_str(), errbuf); return false; } return false; @@ -1093,12 +1091,14 @@ void AdventureManager::LoadLeaderboardInfo() leaderboard_info_wins_tak.clear(); leaderboard_info_percentage_tak.clear(); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; - if(database.RunQuery(query,MakeAnyLenString(&query,"select ch.name, ch.id, adv_stats.* from adventure_stats " - "AS adv_stats ""left join character_ AS ch on adv_stats.player_id = ch.id;"), errbuf, &result)) + std::string query = "select ch.name, ch.id, adv_stats.* from adventure_stats " + "AS adv_stats ""left join character_ AS ch on " + "adv_stats.player_id = ch.id;"; + + if(database.RunQuery(query,errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -1155,13 +1155,11 @@ void AdventureManager::LoadLeaderboardInfo() } } mysql_free_result(result); - safe_delete_array(query); return; } else { - LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::GetLeaderboardInfo: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in AdventureManager:::GetLeaderboardInfo: %s (%s)", query.c_str(), errbuf); return; } return; diff --git a/world/EQLConfig.cpp b/world/EQLConfig.cpp index de5ed5753..5c4d10d1f 100644 --- a/world/EQLConfig.cpp +++ b/world/EQLConfig.cpp @@ -34,19 +34,18 @@ EQLConfig::EQLConfig(const char *launcher_name) void EQLConfig::LoadSettings() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; LauncherZone tmp; - char namebuf[128]; - database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()&0x3F); //limit len to 64 - namebuf[127] = '\0'; + std::string namebuf; + database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()); + namebuf.resize(63); //limit len to 64 - if (database.RunQuery(query, MakeAnyLenString(&query, - "SELECT dynamics FROM launcher WHERE name='%s'", - namebuf) - , errbuf, &result)) + StringFormat(query,"SELECT dynamics FROM launcher WHERE name='%s'",namebuf.c_str()); + + if (database.RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { m_dynamics = atoi(row[0]); @@ -55,12 +54,10 @@ void EQLConfig::LoadSettings() { } else { LogFile->write(EQEMuLog::Error, "EQLConfig::LoadSettings: %s", errbuf); } - safe_delete_array(query); - if (database.RunQuery(query, MakeAnyLenString(&query, - "SELECT zone,port FROM launcher_zones WHERE launcher='%s'", - namebuf) - , errbuf, &result)) + StringFormat(query, "SELECT zone,port FROM launcher_zones WHERE launcher='%s'", namebuf.c_str()); + + if (database.RunQuery(query, errbuf, &result)) { LauncherZone zs; while ((row = mysql_fetch_row(result))) { @@ -72,25 +69,23 @@ void EQLConfig::LoadSettings() { } else { LogFile->write(EQEMuLog::Error, "EQLConfig::LoadSettings: %s", errbuf); } - safe_delete_array(query); } EQLConfig *EQLConfig::CreateLauncher(const char *name, uint8 dynamic_count) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - char namebuf[128]; - database.DoEscapeString(namebuf, name, strlen(name)&0x3F); //limit len to 64 - namebuf[127] = '\0'; + std::string namebuf; + database.DoEscapeString(namebuf, name, strlen(name)); + namebuf.resize(63); //limit len to 64 - if (!database.RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO launcher (name,dynamics) VALUES('%s', %d)", - namebuf, dynamic_count), errbuf)) { + StringFormat(query, "INSERT INTO launcher (name,dynamics) VALUES('%s', %d)", + namebuf.c_str(), dynamic_count); + + if (!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Error in CreateLauncher query: %s", errbuf); - safe_delete_array(query); return nullptr; } - safe_delete_array(query); return(new EQLConfig(name)); } @@ -127,29 +122,26 @@ void EQLConfig::DeleteLauncher() { launcher_list.Remove(m_name.c_str()); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - char namebuf[128]; - database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()&0x3F); //limit len to 64 - namebuf[127] = '\0'; + std::string namebuf; + database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()); + namebuf.resize(63); //limit len to 64 - if (!database.RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM launcher WHERE name='%s'", - namebuf), errbuf)) { + StringFormat(query, "DELETE FROM launcher WHERE name='%s'",namebuf.c_str()); + + if (!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Error in DeleteLauncher 1 query: %s", errbuf); - safe_delete_array(query); return; } - safe_delete_array(query); - if (!database.RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM launcher_zones WHERE launcher='%s'", - namebuf), errbuf)) { + StringFormat(query, "DELETE FROM launcher_zones WHERE launcher='%s'", + namebuf.c_str()); + + if (!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Error in DeleteLauncher 2 query: %s", errbuf); - safe_delete_array(query); return; } - safe_delete_array(query); } bool EQLConfig::IsConnected() const { @@ -185,23 +177,23 @@ bool EQLConfig::BootStaticZone(Const_char *short_name, uint16 port) { //database update char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - char namebuf[128]; - database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()&0x3F); //limit len to 64 - namebuf[127] = '\0'; - char zonebuf[32]; - database.DoEscapeString(zonebuf, short_name, strlen(short_name)&0xF); //limit len to 16 - zonebuf[31] = '\0'; + std::string namebuf; + database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()); + namebuf.resize(63); //limit len to 64 + + std::string zonebuf; + database.DoEscapeString(zonebuf, short_name, strlen(short_name)); + zonebuf.resize(15); //limit len to 16 - if (!database.RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO launcher_zones (launcher,zone,port) VALUES('%s', '%s', %d)", - namebuf, zonebuf, port), errbuf)) { + StringFormat(query, "INSERT INTO launcher_zones (launcher,zone,port) VALUES('%s', '%s', %d)", + namebuf.c_str(), zonebuf.c_str(), port); + + if (!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Error in BootStaticZone query: %s", errbuf); - safe_delete_array(query); return false; } - safe_delete_array(query); //update our internal state. LauncherZone lz; @@ -235,24 +227,23 @@ bool EQLConfig::ChangeStaticZone(Const_char *short_name, uint16 port) { //database update char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - char namebuf[128]; - database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()&0x3F); //limit len to 64 - namebuf[127] = '\0'; - char zonebuf[32]; - database.DoEscapeString(zonebuf, short_name, strlen(short_name)&0xF); //limit len to 16 - zonebuf[31] = '\0'; + std::string namebuf; + database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()); + namebuf.resize(63); //limit len to 64 + + std::string zonebuf; + database.DoEscapeString(zonebuf, short_name, strlen(short_name)); //limit len to 16 + zonebuf.resize(15); - if (!database.RunQuery(query, MakeAnyLenString(&query, - "UPDATE launcher_zones SET port=%d WHERE launcher='%s' AND zone='%s'", - port, namebuf, zonebuf), errbuf)) { + StringFormat(query, "UPDATE launcher_zones SET port=%d WHERE launcher='%s' AND zone='%s'", + port, namebuf.c_str(), zonebuf.c_str()); + + if (!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Error in ChangeStaticZone query: %s", errbuf); - safe_delete_array(query); return false; } - safe_delete_array(query); - //update internal state res->second.port = port; @@ -278,23 +269,23 @@ bool EQLConfig::DeleteStaticZone(Const_char *short_name) { //database update char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - char namebuf[128]; - database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()&0x3F); //limit len to 64 - namebuf[127] = '\0'; - char zonebuf[32]; - database.DoEscapeString(zonebuf, short_name, strlen(short_name)&0xF); //limit len to 16 - zonebuf[31] = '\0'; + std::string namebuf; + database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()); + namebuf.resize(63);//limit len to 64 + + std::string zonebuf; + database.DoEscapeString(zonebuf, short_name, strlen(short_name)); + zonebuf.resize(15); //limit len to 16 - if (!database.RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM launcher_zones WHERE launcher='%s' AND zone='%s'", - namebuf, zonebuf), errbuf)) { + StringFormat(query, "DELETE FROM launcher_zones WHERE launcher='%s' AND zone='%s'", + namebuf.c_str(), zonebuf.c_str()); + + if (!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Error in DeleteStaticZone query: %s", errbuf); - safe_delete_array(query); return false; } - safe_delete_array(query); //internal update. m_zones.erase(res); @@ -310,20 +301,19 @@ bool EQLConfig::DeleteStaticZone(Const_char *short_name) { bool EQLConfig::SetDynamicCount(int count) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - char namebuf[128]; - database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()&0x3F); //limit len to 64 - namebuf[127] = '\0'; + std::string namebuf; + database.DoEscapeString(namebuf, m_name.c_str(), m_name.length()); + namebuf.resize(63);//limit len to 64 - if (!database.RunQuery(query, MakeAnyLenString(&query, - "UPDATE launcher SET dynamics=%d WHERE name='%s'", - count, namebuf), errbuf)) { + StringFormat(query, "UPDATE launcher SET dynamics=%d WHERE name='%s'", + count, namebuf.c_str()); + + if (!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Error in SetDynamicCount query: %s", errbuf); - safe_delete_array(query); return false; } - safe_delete_array(query); //update in-memory version. m_dynamics = count; diff --git a/world/EQW.cpp b/world/EQW.cpp index 0e41f9e64..dbe259a79 100644 --- a/world/EQW.cpp +++ b/world/EQW.cpp @@ -385,11 +385,12 @@ bool EQW::SetPublicNote(uint32 charid, const char *note) { int EQW::CountBugs() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; - if(database.RunQuery(query, MakeAnyLenString(&query, "SELECT count(*) FROM bugs where status = 0"), errbuf, &result)) { - safe_delete_array(query); + + std::string query = "SELECT count(*) FROM bugs where status = 0"; + + if(database.RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result))) { int count = atoi(row[0]); mysql_free_result(result); @@ -397,35 +398,37 @@ int EQW::CountBugs() { } mysql_free_result(result); } - safe_delete_array(query); return 0; } std::vector EQW::ListBugs(uint32 offset) { std::vector res; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if(database.RunQuery(query, MakeAnyLenString(&query, "SELECT id FROM bugs WHERE status = 0 limit %d, 30", offset), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query,"SELECT id FROM bugs WHERE status = 0 limit %d, 30", offset); + + if(database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { res.push_back(row[0]); } mysql_free_result(result); } - safe_delete_array(query); return res; } std::map EQW::GetBugDetails(Const_char *id) { std::map res; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if(database.RunQuery(query, MakeAnyLenString(&query, "select name, zone, x, y, z, target, bug from bugs where id = %s", id), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query,"select name, zone, x, y, z, target, bug from bugs where id = %s", id); + + if(database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { res["name"] = row[0]; res["zone"] = row[1]; @@ -438,18 +441,19 @@ std::map EQW::GetBugDetails(Const_char *id) { } mysql_free_result(result); } - safe_delete_array(query); return res; } void EQW::ResolveBug(const char *id) { std::vector res; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; - if(database.RunQuery(query, MakeAnyLenString(&query, "UPDATE bugs SET status=1 WHERE id=%s", id), errbuf)) { - safe_delete_array(query); + std::string query; + + StringFormat(query,"UPDATE bugs SET status=1 WHERE id=%s", id); + + if(!database.RunQuery(query, errbuf)) { + // TODO: log failed statement. } - safe_delete_array(query); } void EQW::SendMessage(uint32 type, const char *msg) { diff --git a/world/worlddb.cpp b/world/worlddb.cpp index 9099060ee..4be20283b 100644 --- a/world/worlddb.cpp +++ b/world/worlddb.cpp @@ -36,7 +36,7 @@ extern std::vector character_create_race_class_combos; // solar: the current stuff is at the bottom of this function void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct* cs) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; Inventory *inv; @@ -53,8 +53,12 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct* unsigned long* lengths; // Populate character info - if (RunQuery(query, MakeAnyLenString(&query, "SELECT name,profile,zonename,class,level FROM character_ WHERE account_id=%i order by name limit 10", account_id), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT name,profile,zonename,class,level " + "FROM character_ WHERE account_id=%i " + "order by name limit 10", + account_id); + + if (RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { lengths = mysql_fetch_lengths(result); //////////// @@ -119,18 +123,12 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct* } } else { - RunQuery(query, - MakeAnyLenString(&query, - "SELECT zone_id,bind_id,x,y,z FROM start_zones " - "WHERE player_class=%i AND player_deity=%i AND player_race=%i", - pp->class_, - pp->deity, - pp->race - ), - errbuf, - &result2 - ); - safe_delete_array(query); + + StringFormat(query, "SELECT zone_id,bind_id,x,y,z FROM start_zones " + "WHERE player_class=%i AND player_deity=%i AND player_race=%i", + pp->class_, pp->deity, pp->race); + + RunQuery(query,errbuf,&result2); // if there is only one possible start city, set it if(mysql_num_rows(result2) == 1) { @@ -160,8 +158,10 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct* // update the player profile if(altered) { uint32 char_id = GetCharacterID(cs->name[char_num]); - RunQuery(query,MakeAnyLenString(&query,"SELECT extprofile FROM character_ WHERE id=%i",char_id), errbuf, &result2); - safe_delete_array(query); + + StringFormat(query,"SELECT extprofile FROM character_ WHERE id=%i",char_id); + + RunQuery(query,errbuf, &result2); if(result2) { row2 = mysql_fetch_row(result2); ExtendedProfile_Struct* ext = (ExtendedProfile_Struct*)row2[0]; @@ -229,7 +229,6 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct* else { std::cerr << "Error in GetCharSelectInfo query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return; } @@ -242,7 +241,7 @@ int WorldDatabase::MoveCharacterToBind(int CharID, uint8 bindnum) { bindnum = 0; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 affected_rows = 0; @@ -250,7 +249,9 @@ int WorldDatabase::MoveCharacterToBind(int CharID, uint8 bindnum) { bool PPValid = false; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT profile from character_ where id='%i'", CharID), errbuf, &result)) { + StringFormat(query, "SELECT profile from character_ where id='%i'", CharID); + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); unsigned long* lengths = mysql_fetch_lengths(result); if (lengths[0] == sizeof(PlayerProfile_Struct)) { @@ -259,7 +260,6 @@ int WorldDatabase::MoveCharacterToBind(int CharID, uint8 bindnum) { } mysql_free_result(result); } - safe_delete_array(query); if(!PPValid) return 0; @@ -267,13 +267,14 @@ int WorldDatabase::MoveCharacterToBind(int CharID, uint8 bindnum) { if(!strcmp(BindZoneName, "UNKNWN")) return pp.zone_id; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET zonename = '%s',zoneid=%i,x=%f, y=%f, z=%f, instanceid=0 WHERE id='%i'", + StringFormat(query, "UPDATE character_ SET zonename = '%s',zoneid=%i,x=%f, y=%f, z=%f, instanceid=0 WHERE id='%i'", BindZoneName, pp.binds[bindnum].zoneId, pp.binds[bindnum].x, pp.binds[bindnum].y, pp.binds[bindnum].z, - CharID), errbuf, 0,&affected_rows)) { + CharID); + + if (!RunQuery(query, errbuf, nullptr,&affected_rows)) { return pp.zone_id; } - safe_delete_array(query); return pp.binds[bindnum].zoneId; } @@ -281,7 +282,7 @@ int WorldDatabase::MoveCharacterToBind(int CharID, uint8 bindnum) { bool WorldDatabase::GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row = 0; int rows; @@ -292,20 +293,19 @@ bool WorldDatabase::GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_pp->x = in_pp->y = in_pp->z = in_pp->heading = in_pp->zone_id = 0; in_pp->binds[0].x = in_pp->binds[0].y = in_pp->binds[0].z = in_pp->binds[0].zoneId = 0; - if(!RunQuery(query, MakeAnyLenString(&query, "SELECT x,y,z,heading,zone_id,bind_id FROM start_zones WHERE player_choice=%i AND player_class=%i " - "AND player_deity=%i AND player_race=%i", - in_cc->start_zone, - in_cc->class_, - in_cc->deity, - in_cc->race), errbuf, &result)) + StringFormat(query, "SELECT x,y,z,heading,zone_id,bind_id FROM " + "start_zones WHERE player_choice=%i AND player_class=%i " + "AND player_deity=%i AND player_race=%i", + in_cc->start_zone, in_cc->class_, + in_cc->deity, in_cc->race); + + if(!RunQuery(query, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Start zone query failed: %s : %s\n", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Start zone query failed: %s : %s\n", query.c_str(), errbuf); return false; } - LogFile->write(EQEMuLog::Status, "Start zone query: %s\n", query); - safe_delete_array(query); + LogFile->write(EQEMuLog::Status, "Start zone query: %s\n", query.c_str()); if((rows = mysql_num_rows(result)) > 0) row = mysql_fetch_row(result); @@ -433,7 +433,7 @@ bool WorldDatabase::GetStartZoneSoF(PlayerProfile_Struct* in_pp, CharCreate_Stru // reason for no match being found. // char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row = 0; int rows; @@ -444,20 +444,19 @@ bool WorldDatabase::GetStartZoneSoF(PlayerProfile_Struct* in_pp, CharCreate_Stru in_pp->x = in_pp->y = in_pp->z = in_pp->heading = in_pp->zone_id = 0; in_pp->binds[0].x = in_pp->binds[0].y = in_pp->binds[0].z = in_pp->binds[0].zoneId = 0; - if(!RunQuery(query, MakeAnyLenString(&query, "SELECT x,y,z,heading,bind_id FROM start_zones WHERE zone_id=%i AND player_class=%i " - "AND player_deity=%i AND player_race=%i", - in_cc->start_zone, - in_cc->class_, - in_cc->deity, - in_cc->race), errbuf, &result)) + StringFormat(query,"SELECT x,y,z,heading,bind_id FROM " + "start_zones WHERE zone_id=%i AND player_class=%i " + "AND player_deity=%i AND player_race=%i", + in_cc->start_zone, in_cc->class_, + in_cc->deity, in_cc->race); + + if(!RunQuery(query, errbuf, &result)) { - LogFile->write(EQEMuLog::Status, "SoF Start zone query failed: %s : %s\n", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Status, "SoF Start zone query failed: %s : %s\n", query.c_str(), errbuf); return false; } - LogFile->write(EQEMuLog::Status, "SoF Start zone query: %s\n", query); - safe_delete_array(query); + LogFile->write(EQEMuLog::Status, "SoF Start zone query: %s\n", query.c_str()); if((rows = mysql_num_rows(result)) > 0) row = mysql_fetch_row(result); @@ -499,15 +498,14 @@ bool WorldDatabase::GetStartZoneSoF(PlayerProfile_Struct* in_pp, CharCreate_Stru void WorldDatabase::GetLauncherList(std::vector &rl) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; rl.clear(); - if (RunQuery(query, MakeAnyLenString(&query, - "SELECT name FROM launcher" ) - , errbuf, &result)) + std::string query = "SELECT name FROM launcher"; + + if (RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { rl.push_back(row[0]); @@ -517,13 +515,12 @@ void WorldDatabase::GetLauncherList(std::vector &rl) { else { LogFile->write(EQEMuLog::Error, "WorldDatabase::GetLauncherList: %s", errbuf); } - safe_delete_array(query); } void WorldDatabase::SetMailKey(int CharID, int IPAddress, int MailKey) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; char MailKeyString[17]; @@ -532,29 +529,29 @@ void WorldDatabase::SetMailKey(int CharID, int IPAddress, int MailKey) { else sprintf(MailKeyString, "%08X", MailKey); - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET mailkey = '%s' WHERE id='%i'", - MailKeyString, CharID), errbuf)) + StringFormat(query, "UPDATE character_ SET mailkey = '%s' WHERE id='%i'", + MailKeyString, CharID); + if (!RunQuery(query, errbuf)) LogFile->write(EQEMuLog::Error, "WorldDatabase::SetMailKey(%i, %s) : %s", CharID, MailKeyString, errbuf); - safe_delete_array(query); - } bool WorldDatabase::GetCharacterLevel(const char *name, int &level) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if(RunQuery(query, MakeAnyLenString(&query, "SELECT level FROM character_ WHERE name='%s'", name), errbuf, &result)) + StringFormat(query, "SELECT level FROM character_ WHERE name='%s'", name); + + if(RunQuery(query, errbuf, &result)) { if(row = mysql_fetch_row(result)) { level = atoi(row[0]); mysql_free_result(result); - safe_delete_array(query); return true; } mysql_free_result(result); @@ -563,7 +560,6 @@ bool WorldDatabase::GetCharacterLevel(const char *name, int &level) { LogFile->write(EQEMuLog::Error, "WorldDatabase::GetCharacterLevel: %s", errbuf); } - safe_delete_array(query); return false; } @@ -571,11 +567,13 @@ bool WorldDatabase::LoadCharacterCreateAllocations() { character_create_allocations.clear(); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + MYSQL_RES *result; MYSQL_ROW row; - if(RunQuery(query, MakeAnyLenString(&query, "SELECT * FROM char_create_point_allocations order by id"), errbuf, &result)) { - safe_delete_array(query); + + std::string query = "SELECT * FROM char_create_point_allocations order by id"; + + if(RunQuery(query, errbuf, &result)) { while(row = mysql_fetch_row(result)) { RaceClassAllocation allocate; int r = 0; @@ -598,7 +596,6 @@ bool WorldDatabase::LoadCharacterCreateAllocations() { } mysql_free_result(result); } else { - safe_delete_array(query); return false; } @@ -609,11 +606,12 @@ bool WorldDatabase::LoadCharacterCreateCombos() { character_create_race_class_combos.clear(); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; - if(RunQuery(query, MakeAnyLenString(&query, "select * from char_create_combinations order by race, class, deity, start_zone"), errbuf, &result)) { - safe_delete_array(query); + + std::string query ="select * from char_create_combinations order by race, class, deity, start_zone"; + + if(RunQuery(query, errbuf, &result)) { while(row = mysql_fetch_row(result)) { RaceClassCombos combo; int r = 0; @@ -627,7 +625,6 @@ bool WorldDatabase::LoadCharacterCreateCombos() { } mysql_free_result(result); } else { - safe_delete_array(query); return false; } diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index 73a4a6c67..79ef8202d 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -448,7 +448,7 @@ bool ZoneServer::Process() { else if (cle->Online() == CLE_Status_Zoning) { if (!scm->noreply) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; //MYSQL_ROW row; Trumpcard - commenting. Currently unused. time_t rawtime; @@ -456,21 +456,25 @@ bool ZoneServer::Process() { time ( &rawtime ); timeinfo = localtime ( &rawtime ); char *telldate=asctime(timeinfo); - if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT name from character_ where name='%s'",scm->deliverto), errbuf, &result)) { - safe_delete(query); + + StringFormat(query,"SELECT name from character_ where name='%s'",scm->deliverto); + + if (database.RunQuery(query,errbuf, &result)) { if (result!=0) { - if (database.RunQuery(query, MakeAnyLenString(&query, "INSERT INTO tellque (Date,Receiver,Sender,Message) values('%s','%s','%s','%s')",telldate,scm->deliverto,scm->from,scm->message), errbuf, &result)) + + StringFormat(query, "INSERT INTO tellque (Date,Receiver,Sender,Message) " + "values('%s','%s','%s','%s')", + telldate, scm->deliverto, scm->from,scm->message); + + if (database.RunQuery(query, errbuf, &result)) zoneserver_list.SendEmoteMessage(scm->from, 0, 0, 0, "Your message has been added to the %s's que.", scm->to); else zoneserver_list.SendEmoteMessage(scm->from, 0, 0, 0, "You told %s, '%s is not online at this time'", scm->to, scm->to); - safe_delete(query); } else zoneserver_list.SendEmoteMessage(scm->from, 0, 0, 0, "You told %s, '%s is not online at this time'", scm->to, scm->to); mysql_free_result(result); } - else - safe_delete(query); } // zoneserver_list.SendEmoteMessage(scm->from, 0, 0, 0, "You told %s, '%s is not online at this time'", scm->to, scm->to); } diff --git a/zone/AA.cpp b/zone/AA.cpp index bbcf1d3d2..9b12f5920 100644 --- a/zone/AA.cpp +++ b/zone/AA.cpp @@ -1465,12 +1465,13 @@ void Zone::LoadAAs() { bool ZoneDatabase::LoadAAEffects2() { aa_effects.clear(); //start fresh - char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT aaid, slot, effectid, base1, base2 FROM aa_effects ORDER BY aaid ASC, slot ASC"), errbuf, &result)) { + + std::string query = "SELECT aaid, slot, effectid, base1, base2 FROM aa_effects ORDER BY aaid ASC, slot ASC"; + + if (RunQuery(query, errbuf, &result)) { int count = 0; while((row = mysql_fetch_row(result))!= nullptr) { int aaid = atoi(row[0]); @@ -1488,10 +1489,9 @@ bool ZoneDatabase::LoadAAEffects2() { if (count < 1) //no results LogFile->write(EQEMuLog::Error, "Error loading AA Effects, none found in the database."); } else { - LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::LoadAAEffects2 query: '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::LoadAAEffects2 query: '%s': %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); return true; } void Client::ResetAA(){ @@ -1639,11 +1639,10 @@ bool ZoneDatabase::LoadAAEffects() { memset(AA_Actions, 0, sizeof(AA_Actions)); //I hope the compiler is smart about this size... - const char *query = "SELECT aaid,rank,reuse_time,spell_id,target,nonspell_action,nonspell_mana,nonspell_duration," - "redux_aa,redux_rate,redux_aa2,redux_rate2 FROM aa_actions"; + std::string query = "SELECT aaid,rank,reuse_time,spell_id,target,nonspell_action,nonspell_mana,nonspell_duration," + "redux_aa,redux_rate,redux_aa2,redux_rate2 FROM aa_actions"; - if(RunQuery(query, static_cast(strlen(query)), errbuf, &result)) { - //safe_delete_array(query); + if(RunQuery(query, errbuf, &result)) { int r; while ((row = mysql_fetch_row(result))) { r = 0; @@ -1668,8 +1667,7 @@ bool ZoneDatabase::LoadAAEffects() { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadAAEffects query '%s': %s", query, errbuf);; - //safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadAAEffects query '%s': %s", query.c_str(), errbuf); return false; } @@ -1684,20 +1682,21 @@ bool ZoneDatabase::LoadAAEffects() { //AndMetal: this may now be obsolete since we have Zone::GetTotalAALevels() uint8 ZoneDatabase::GetTotalAALevels(uint32 skill_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; int total=0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT count(slot) from aa_effects where aaid=%i", skill_id), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query,"SELECT count(slot) from aa_effects where aaid=%i", skill_id); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); total=atoi(row[0]); } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetTotalAALevels '%s: %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetTotalAALevels '%s: %s", query.c_str(), errbuf); } return total; } @@ -1728,10 +1727,14 @@ void ZoneDatabase::FillAAEffects(SendAA_Struct* aa_struct){ return; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT effectid, base1, base2, slot from aa_effects where aaid=%i order by slot asc", aa_struct->id), errbuf, &result)) { + + StringFormat(query,"SELECT effectid, base1, base2, slot from aa_effects " + "where aaid=%i order by slot asc", aa_struct->id); + + if (RunQuery(query, errbuf, &result)) { int ndx=0; while((row = mysql_fetch_row(result))!=nullptr) { aa_struct->abilities[ndx].skill_id=atoi(row[0]); @@ -1742,43 +1745,44 @@ void ZoneDatabase::FillAAEffects(SendAA_Struct* aa_struct){ } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in Client::FillAAEffects query: '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in Client::FillAAEffects query: '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); } uint32 ZoneDatabase::CountAAs(){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; MYSQL_RES *result; MYSQL_ROW row; int count=0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT count(title_sid) from altadv_vars"), errbuf, &result)) { + + std::string query = "SELECT count(title_sid) from altadv_vars"; + + if (RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result))!=nullptr) count = atoi(row[0]); mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::CountAAs query '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::CountAAs query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); return count; } uint32 ZoneDatabase::CountAAEffects(){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; MYSQL_RES *result; MYSQL_ROW row; int count=0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT count(id) from aa_effects"), errbuf, &result)) { + + std::string query = "SELECT count(id) from aa_effects"; + + if (RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result))!=nullptr){ count = atoi(row[0]); } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::CountAALevels query '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::CountAALevels query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); return count; } @@ -1793,10 +1797,12 @@ void ZoneDatabase::LoadAAs(SendAA_Struct **load){ if(!load) return; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT skill_id from altadv_vars order by skill_id"), errbuf, &result)) { + + std::string query = "SELECT skill_id from altadv_vars order by skill_id"; + + if (RunQuery(query, errbuf, &result)) { int skill=0,ndx=0; while((row = mysql_fetch_row(result))!=nullptr) { skill=atoi(row[0]); @@ -1806,13 +1812,14 @@ void ZoneDatabase::LoadAAs(SendAA_Struct **load){ } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::LoadAAs query '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::LoadAAs query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); AARequiredLevelAndCost.clear(); - if (RunQuery(query, MakeAnyLenString(&query, "SELECT skill_id, level, cost from aa_required_level_cost order by skill_id"), errbuf, &result)) + query = "SELECT skill_id, level, cost from aa_required_level_cost order by skill_id"; + + if (RunQuery(query, errbuf, &result)) { AALevelCost_Struct aalcs; while((row = mysql_fetch_row(result))!=nullptr) @@ -1824,69 +1831,56 @@ void ZoneDatabase::LoadAAs(SendAA_Struct **load){ mysql_free_result(result); } else - LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::LoadAAs query '%s': %s", query, errbuf); - - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::LoadAAs query '%s': %s", query.c_str(), errbuf); } SendAA_Struct* ZoneDatabase::GetAASkillVars(uint32 skill_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; SendAA_Struct* sendaa = nullptr; uchar* buffer; - if (RunQuery(query, MakeAnyLenString(&query, "SET @row = 0"), errbuf)) { //initialize "row" variable in database for next query - safe_delete_array(query); + + std::string query = "SET @row = 0"; + + if (RunQuery(query, errbuf)) { //initialize "row" variable in database for next query MYSQL_RES *result; //we don't really need these unless we get to this point, so why bother? MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, - "SELECT " - "a.cost, " - "a.max_level, " - "a.hotkey_sid, " - "a.hotkey_sid2, " - "a.title_sid, " - "a.desc_sid, " - "a.type, " - "COALESCE(" //so we can return 0 if it's null - "(" //this is our derived table that has the row # that we can SELECT from, because the client is stupid - "SELECT " - "p.prereq_index_num " - "FROM " - "(" - "SELECT " - "a2.skill_id, " - "@row := @row + 1 AS prereq_index_num " - "FROM " - "altadv_vars a2" - ") AS p " - "WHERE " - "p.skill_id = a.prereq_skill" - "), " - "0) AS prereq_skill_index, " - "a.prereq_minpoints, " - "a.spell_type, " - "a.spell_refresh, " - "a.classes, " - "a.berserker, " - "a.spellid, " - "a.class_type, " - "a.name, " - "a.cost_inc, " - "a.aa_expansion, " - "a.special_category, " - "a.sof_type, " - "a.sof_cost_inc, " - "a.sof_max_level, " - "a.sof_next_skill, " - "a.clientver, " // Client Version 0 = None, 1 = All, 2 = Titanium/6.2, 4 = SoF 5 = SOD 6 = UF - "a.account_time_required, " - "a.sof_current_level," - "a.sof_next_id, " - "a.level_inc " - " FROM altadv_vars a WHERE skill_id=%i", skill_id), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT " + "a.cost, a.max_level, a.hotkey_sid, a.hotkey_sid2, " + "a.title_sid, a.desc_sid, a.type, " + "COALESCE(" //so we can return 0 if it's null + // This is our derived table that has the row # that we can SELECT from, + // because the client is stupid. + "(" + "SELECT " + "p.prereq_index_num " + "FROM " + "(" + "SELECT " + "a2.skill_id, " + "@row := @row + 1 AS prereq_index_num " + "FROM " + "altadv_vars a2" + ") AS p " + "WHERE " + "p.skill_id = a.prereq_skill" + "), " + "0) AS prereq_skill_index, " + "a.prereq_minpoints, a.spell_type, " + "a.spell_refresh, a.classes, " + "a.berserker, a.spellid, " + "a.class_type, a.name, " + "a.cost_inc, a.aa_expansion, " + "a.special_category, a.sof_type, " + "a.sof_cost_inc, a.sof_max_level, " + // Client Version 0 = None, 1 = All, 2 = Titanium/6.2, 4 = SoF 5 = SOD 6 = UF + "a.sof_next_skill, a.clientver, " + "a.account_time_required, a.sof_current_level," + "a.sof_next_id, a.level_inc " + " FROM altadv_vars a WHERE skill_id=%i", skill_id); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { int total_abilities = GetTotalAALevels(skill_id); //eventually we'll want to use zone->GetTotalAALevels(skill_id) since it should save queries to the DB int totalsize = total_abilities * sizeof(AA_Ability) + sizeof(SendAA_Struct); @@ -1943,12 +1937,10 @@ SendAA_Struct* ZoneDatabase::GetAASkillVars(uint32 skill_id) } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetAASkillVars '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetAASkillVars '%s': %s", query.c_str(), errbuf); } } else { - LogFile->write(EQEMuLog::Error, "Error in GetAASkillVars '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetAASkillVars '%s': %s", query.c_str(), errbuf); } return sendaa; } diff --git a/zone/MobAI.cpp b/zone/MobAI.cpp index fc6fd75f3..63c3ed964 100644 --- a/zone/MobAI.cpp +++ b/zone/MobAI.cpp @@ -2330,20 +2330,26 @@ DBnpcspells_Struct* ZoneDatabase::GetNPCSpells(uint32 iDBSpellsID) { else if (!npc_spells_loadtried[iDBSpellsID]) { // no reason to ask the DB again if we have failed once already npc_spells_loadtried[iDBSpellsID] = true; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id, parent_list, attack_proc, proc_chance from npc_spells where id=%d", iDBSpellsID), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT id, parent_list, attack_proc, proc_chance from npc_spells where id=%d", iDBSpellsID); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); uint32 tmpparent_list = atoi(row[1]); int16 tmpattack_proc = atoi(row[2]); uint8 tmpproc_chance = atoi(row[3]); mysql_free_result(result); - if (RunQuery(query, MakeAnyLenString(&query, "SELECT spellid, type, minlevel, maxlevel, manacost, recast_delay, priority, resist_adjust from npc_spells_entries where npc_spells_id=%d ORDER BY minlevel", iDBSpellsID), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT spellid, type, minlevel, maxlevel, manacost, recast_delay, " + "priority, resist_adjust from npc_spells_entries " + "where npc_spells_id=%d ORDER BY minlevel", + iDBSpellsID); + + if (RunQuery(query, errbuf, &result)) { uint32 tmpSize = sizeof(DBnpcspells_Struct) + (sizeof(DBnpcspells_entries_Struct) * mysql_num_rows(result)); npc_spells_cache[iDBSpellsID] = (DBnpcspells_Struct*) new uchar[tmpSize]; memset(npc_spells_cache[iDBSpellsID], 0, tmpSize); @@ -2379,7 +2385,6 @@ DBnpcspells_Struct* ZoneDatabase::GetNPCSpells(uint32 iDBSpellsID) { } else { std::cerr << "Error in AddNPCSpells query1 '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return 0; } } @@ -2389,7 +2394,6 @@ DBnpcspells_Struct* ZoneDatabase::GetNPCSpells(uint32 iDBSpellsID) { } else { std::cerr << "Error in AddNPCSpells query1 '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return 0; } @@ -2400,12 +2404,12 @@ DBnpcspells_Struct* ZoneDatabase::GetNPCSpells(uint32 iDBSpellsID) { uint32 ZoneDatabase::GetMaxNPCSpellsID() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT max(id) from npc_spells"), errbuf, &result)) { - safe_delete_array(query); + std::string query = "SELECT max(id) from npc_spells"; + + if (RunQuery(query,errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); uint32 ret = 0; @@ -2418,7 +2422,6 @@ uint32 ZoneDatabase::GetMaxNPCSpellsID() { } else { std::cerr << "Error in GetMaxNPCSpellsID query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return 0; } diff --git a/zone/Object.cpp b/zone/Object.cpp index c6c7eb3f7..6eedf2c8f 100644 --- a/zone/Object.cpp +++ b/zone/Object.cpp @@ -559,7 +559,7 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object) uint32 ZoneDatabase::AddObject(uint32 type, uint32 icon, const Object_Struct& object, const ItemInst* inst) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; uint32 database_id = 0; uint32 item_id = 0; @@ -572,18 +572,16 @@ uint32 ZoneDatabase::AddObject(uint32 type, uint32 icon, const Object_Struct& ob // SQL Escape object_name uint32 len = strlen(object.object_name) * 2 + 1; - char* object_name = new char[len]; + std::string object_name; DoEscapeString(object_name, object.object_name, strlen(object.object_name)); - // Construct query - uint32 len_query = MakeAnyLenString(&query, - "insert into object (zoneid, xpos, ypos, zpos, heading, itemid, charges, objectname, " - "type, icon) values (%i, %f, %f, %f, %f, %i, %i, '%s', %i, %i)", - object.zone_id, object.x, object.y, object.z, object.heading, - item_id, charges, object_name, type, icon); - + StringFormat(query,"insert into object (zoneid, xpos, ypos, zpos, heading, itemid, charges, objectname, " + "type, icon) values (%i, %f, %f, %f, %f, %i, %i, '%s', %i, %i)", + object.zone_id, object.x, object.y, object.z, object.heading, + item_id, charges, object_name.c_str(), type, icon); + // Save new record for object - if (!RunQuery(query, len_query, errbuf, nullptr, nullptr, &database_id)) { + if (!RunQuery(query, errbuf, nullptr, nullptr, &database_id)) { LogFile->write(EQEMuLog::Error, "Unable to insert object: %s", errbuf); } else { @@ -593,8 +591,6 @@ uint32 ZoneDatabase::AddObject(uint32 type, uint32 icon, const Object_Struct& ob } } - safe_delete_array(object_name); - safe_delete_array(query); return database_id; } @@ -602,7 +598,7 @@ uint32 ZoneDatabase::AddObject(uint32 type, uint32 icon, const Object_Struct& ob void ZoneDatabase::UpdateObject(uint32 id, uint32 type, uint32 icon, const Object_Struct& object, const ItemInst* inst) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; uint32 item_id = 0; int16 charges = 0; @@ -614,18 +610,16 @@ void ZoneDatabase::UpdateObject(uint32 id, uint32 type, uint32 icon, const Objec // SQL Escape object_name uint32 len = strlen(object.object_name) * 2 + 1; - char* object_name = new char[len]; + std::string object_name; DoEscapeString(object_name, object.object_name, strlen(object.object_name)); - // Construct query - uint32 len_query = MakeAnyLenString(&query, - "update object set zoneid=%i, xpos=%f, ypos=%f, zpos=%f, heading=%f, " - "itemid=%i, charges=%i, objectname='%s', type=%i, icon=%i where id=%i", - object.zone_id, object.x, object.y, object.z, object.heading, - item_id, charges, object_name, type, icon, id); + StringFormat(query,"update object set zoneid=%i, xpos=%f, ypos=%f, zpos=%f, heading=%f, " + "itemid=%i, charges=%i, objectname='%s', type=%i, icon=%i where id=%i", + object.zone_id, object.x, object.y, object.z, object.heading, + item_id, charges, object_name.c_str(), type, icon, id); // Save new record for object - if (!RunQuery(query, len_query, errbuf)) { + if (!RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Unable to update object: %s", errbuf); } else { @@ -635,18 +629,21 @@ void ZoneDatabase::UpdateObject(uint32 id, uint32 type, uint32 icon, const Objec } } - safe_delete_array(object_name); - safe_delete_array(query); } Ground_Spawns* ZoneDatabase::LoadGroundSpawns(uint32 zone_id, int16 version, Ground_Spawns* gs){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT max_x,max_y,max_z,min_x,min_y,heading,name,item,max_allowed,respawn_timer from ground_spawns where zoneid=%i and (version=%u OR version=-1) limit 50", zone_id, version), errbuf, &result)) + StringFormat(query,"SELECT max_x, max_y, max_z, min_x, min_y," + "heading,name,item,max_allowed,respawn_timer " + "from ground_spawns where zoneid=%i and " + "(version=%u OR version=-1) limit 50", + zone_id, version); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); int i=0; while( (row=mysql_fetch_row(result) ) ) { gs->spawn[i].max_x=atof(row[0]); @@ -665,29 +662,20 @@ Ground_Spawns* ZoneDatabase::LoadGroundSpawns(uint32 zone_id, int16 version, Gro } else { std::cerr << "Error in LoadGroundSpawns query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return gs; } void ZoneDatabase::DeleteObject(uint32 id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; - - // Construct query - uint32 len_query = MakeAnyLenString(&query, - "delete from object where id=%i", id); + std::string query; // Save new record for object - if (!RunQuery(query, len_query, errbuf)) { + StringFormat(query,"delete from object where id=%i", id); + + if (!RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Unable to delete object: %s", errbuf); } - //else { - // Delete contained items, if any - // DeleteWorldContainer(id); - //} - - safe_delete_array(query); } uint32 Object::GetDBID() diff --git a/zone/PlayerCorpse.cpp b/zone/PlayerCorpse.cpp index d2f9120df..5d659f44e 100644 --- a/zone/PlayerCorpse.cpp +++ b/zone/PlayerCorpse.cpp @@ -416,7 +416,7 @@ Corpse::Corpse(Client* client, int32 in_rezexp) iter++; } ss << ")"; - database.RunQuery(ss.str().c_str(), ss.str().length()); + database.RunQuery(ss.str()); } if(cursor) { // all cursor items should be on corpse (client < SoF or RespawnFromHover = false) @@ -1446,14 +1446,13 @@ void Corpse::Spawn() { bool ZoneDatabase::DeleteGraveyard(uint32 zone_id, uint32 graveyard_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = new char[256]; + std::string query; uint32 query_length = 0; uint32 affected_rows = 0; - query_length = sprintf(query,"UPDATE zone SET graveyard_id=0 WHERE zoneidnumber=%u AND version=0", zone_id); + StringFormat(query, "UPDATE zone SET graveyard_id=0 WHERE zoneidnumber=%u AND version=0", zone_id); - if (!RunQuery(query, query_length, errbuf, 0, &affected_rows)) { - safe_delete_array(query); + if (!RunQuery(query, errbuf, 0, &affected_rows)) { std::cerr << "Error1 in DeleteGraveyard query " << errbuf << std::endl; return false; } @@ -1463,14 +1462,12 @@ bool ZoneDatabase::DeleteGraveyard(uint32 zone_id, uint32 graveyard_id) { return false; } - query_length = sprintf(query,"DELETE FROM graveyard WHERE id=%u", graveyard_id); + StringFormat(query,"DELETE FROM graveyard WHERE id=%u", graveyard_id); - if (!RunQuery(query, query_length, errbuf, 0, &affected_rows)) { - safe_delete_array(query); + if (!RunQuery(query,errbuf, 0, &affected_rows)) { std::cerr << "Error3 in DeleteGraveyard query " << errbuf << std::endl; return false; } - safe_delete_array(query); if (affected_rows == 0) { std::cerr << "Error4 in DeleteGraveyard query: affected_rows = 0" << std::endl; @@ -1481,18 +1478,17 @@ bool ZoneDatabase::DeleteGraveyard(uint32 zone_id, uint32 graveyard_id) { } uint32 ZoneDatabase::AddGraveyardIDToZone(uint32 zone_id, uint32 graveyard_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = new char[256]; - char* end = query; + std::string query; uint32 affected_rows = 0; - end += sprintf(end,"UPDATE zone SET graveyard_id=%u WHERE zoneidnumber=%u AND version=0", graveyard_id, zone_id); + StringFormat(query, "UPDATE zone SET graveyard_id=%u " + "WHERE zoneidnumber=%u AND version=0", + graveyard_id, zone_id); - if (!RunQuery(query, (uint32) (end - query), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + if (!RunQuery(query,errbuf, 0, &affected_rows)) { std::cerr << "Error1 in AddGraveyardIDToZone query " << errbuf << std::endl; return 0; } - safe_delete_array(query); if (affected_rows == 0) { std::cerr << "Error2 in AddGraveyardIDToZone query: affected_rows = 0" << std::endl; @@ -1503,19 +1499,17 @@ uint32 ZoneDatabase::AddGraveyardIDToZone(uint32 zone_id, uint32 graveyard_id) { } uint32 ZoneDatabase::NewGraveyardRecord(uint32 graveyard_zoneid, float graveyard_x, float graveyard_y, float graveyard_z, float graveyard_heading) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = new char[256]; - char* end = query; + std::string query; uint32 affected_rows = 0; uint32 new_graveyard_id = 0; - end += sprintf(end,"INSERT INTO graveyard SET zone_id=%u, x=%1.1f, y=%1.1f, z=%1.1f, heading=%1.1f", graveyard_zoneid, graveyard_x, graveyard_y, graveyard_z, graveyard_heading); + StringFormat(query, "INSERT INTO graveyard SET zone_id=%u, x=%1.1f, y=%1.1f, z=%1.1f, heading=%1.1f", + graveyard_zoneid, graveyard_x, graveyard_y, graveyard_z, graveyard_heading); - if (!RunQuery(query, (uint32) (end - query), errbuf, 0, &affected_rows, &new_graveyard_id)) { - safe_delete_array(query); + if (!RunQuery(query, errbuf, 0, &affected_rows, &new_graveyard_id)) { std::cerr << "Error1 in NewGraveyardRecord query " << errbuf << std::endl; return 0; } - safe_delete_array(query); if (affected_rows == 0) { std::cerr << "Error2 in NewGraveyardRecord query: affected_rows = 0" << std::endl; @@ -1529,21 +1523,22 @@ uint32 ZoneDatabase::NewGraveyardRecord(uint32 graveyard_zoneid, float graveyard return new_graveyard_id; } + uint32 ZoneDatabase::GraveyardPlayerCorpse(uint32 dbid, uint32 zoneid, uint16 instanceid, float x, float y, float z, float heading) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = new char[256]; - char* end = query; + std::string query; uint32 affected_rows = 0; // We probably don't want a graveyard located in an instance. - end += sprintf(end,"Update player_corpses SET zoneid=%u, instanceid=0, x=%1.1f, y=%1.1f, z=%1.1f, heading=%1.1f, WasAtGraveyard=1 WHERE id=%d", zoneid, x, y, z, heading, dbid); + StringFormat(query,"Update player_corpses SET zoneid=%u, instanceid=0, " + "x=%1.1f, y=%1.1f, z=%1.1f, heading=%1.1f, " + "WasAtGraveyard=1 WHERE id=%d", + zoneid, x, y, z, heading, dbid); - if (!RunQuery(query, (uint32) (end - query), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + if (!RunQuery(query, errbuf, 0, &affected_rows)) { std::cerr << "Error1 in GraveyardPlayerCorpse query " << errbuf << std::endl; return 0; } - safe_delete_array(query); if (affected_rows == 0) { std::cerr << "Error2 in GraveyardPlayerCorpse query: affected_rows = 0" << std::endl; @@ -1551,34 +1546,44 @@ uint32 ZoneDatabase::GraveyardPlayerCorpse(uint32 dbid, uint32 zoneid, uint16 in } return dbid; } + uint32 ZoneDatabase::UpdatePlayerCorpse(uint32 dbid, uint32 charid, const char* charname, uint32 zoneid, uint16 instanceid, uchar* data, uint32 datasize, float x, float y, float z, float heading, bool rezzed) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = new char[256+(datasize*2)]; - char* end = query; + std::string query; + std::string dataSection; + std::string endOfQuery; uint32 affected_rows = 0; - end += sprintf(end, "Update player_corpses SET data="); - *end++ = '\''; - end += DoEscapeString(end, (char*)data, datasize); - *end++ = '\''; - end += sprintf(end,", charname='%s', zoneid=%u, instanceid=%u, charid=%d, x=%1.1f, y=%1.1f, z=%1.1f, heading=%1.1f WHERE id=%d", charname, zoneid, instanceid, charid, x, y, z, heading, dbid); + query = "Update player_corpses SET data= \'"; + + DoEscapeString(dataSection, (char*)data, datasize); + + query.append(dataSection); - if (!RunQuery(query, (uint32) (end - query), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + StringFormat(endOfQuery,"\', charname='%s', zoneid=%u, instanceid=%u, " + "charid=%d, x=%1.1f, y=%1.1f, z=%1.1f, heading=%1.1f " + "WHERE id=%d", + charname, zoneid, instanceid, charid, + x, y, z, heading, dbid); + + query.append(endOfQuery); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { std::cerr << "Error1 in UpdatePlayerCorpse query " << errbuf << std::endl; return 0; } - safe_delete_array(query); if (affected_rows == 0) { std::cerr << "Error2 in UpdatePlayerCorpse query: affected_rows = 0" << std::endl; return 0; } if(rezzed){ - if (!RunQuery(query, MakeAnyLenString(&query, "update player_corpses set rezzed = 1 WHERE id=%d",dbid), errbuf)) { + + StringFormat(query,"update player_corpses set rezzed = 1 WHERE id=%d",dbid); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in UpdatePlayerCorpse/Rezzed query: " << errbuf << std::endl; } - safe_delete_array(query); } return dbid; } @@ -1586,37 +1591,40 @@ uint32 ZoneDatabase::UpdatePlayerCorpse(uint32 dbid, uint32 charid, const char* void ZoneDatabase::MarkCorpseAsRezzed(uint32 dbid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; - if(!database.RunQuery(query,MakeAnyLenString(&query, "UPDATE player_corpses SET rezzed = 1 WHERE id = %i", dbid), errbuf)) + StringFormat(query,"UPDATE player_corpses SET rezzed = 1 WHERE id = %i", dbid); + + if(!database.RunQuery(query, errbuf)) { - LogFile->write(EQEMuLog::Error, "MarkCorpseAsRezzed failed: %s, %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "MarkCorpseAsRezzed failed: %s, %s", query.c_str(), errbuf); } - safe_delete_array(query); } uint32 ZoneDatabase::CreatePlayerCorpse(uint32 charid, const char* charname, uint32 zoneid, uint16 instanceid, uchar* data, uint32 datasize, float x, float y, float z, float heading) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = new char[256+(datasize*2)]; - char* end = query; - //MYSQL_RES *result; - //MYSQL_ROW row; + std::string dataSection; uint32 affected_rows = 0; uint32 last_insert_id = 0; - end += sprintf(end, "Insert into player_corpses SET data="); - *end++ = '\''; - end += DoEscapeString(end, (char*)data, datasize); - *end++ = '\''; - end += sprintf(end,", charname='%s', zoneid=%u, instanceid=%u, charid=%d, x=%1.1f, y=%1.1f, z=%1.1f, heading=%1.1f, timeofdeath=Now(), IsBurried=0", charname, zoneid, instanceid, charid, x, y, z, heading); + std::string endOfQuery; + std::string query = "Insert into player_corpses SET data= \'"; + + DoEscapeString(dataSection, (char*)data, datasize); + + query.append(dataSection); - if (!RunQuery(query, (uint32) (end - query), errbuf, 0, &affected_rows, &last_insert_id)) { - safe_delete_array(query); + StringFormat(endOfQuery,"\', charname='%s', zoneid=%u, instanceid=%u, " + "charid=%d, x=%1.1f, y=%1.1f, z=%1.1f, heading=%1.1f, " + "timeofdeath=Now(), IsBurried=0", + charname, zoneid, instanceid, charid, x, y, z, heading); + query.append(endOfQuery); + + if (!RunQuery(query, errbuf, 0, &affected_rows, &last_insert_id)) { std::cerr << "Error1 in CreatePlayerCorpse query " << errbuf << std::endl; return 0; } - safe_delete_array(query); - + if (affected_rows == 0) { std::cerr << "Error2 in CreatePlayerCorpse query: affected_rows = 0" << std::endl; return 0; @@ -1632,8 +1640,8 @@ uint32 ZoneDatabase::CreatePlayerCorpse(uint32 charid, const char* charname, uin bool ZoneDatabase::CreatePlayerCorpseBackup(uint32 dbid, uint32 charid, const char* charname, uint32 zoneid, uint16 instanceid, uchar* data, uint32 datasize, float x, float y, float z, float heading) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = new char[256+(datasize*2)]; - char* end = query; + std::string query; + std::string dataSection; uint32 affected_rows = 0; uint32 last_insert_id = 0; bool result = false; @@ -1641,13 +1649,24 @@ bool ZoneDatabase::CreatePlayerCorpseBackup(uint32 dbid, uint32 charid, const ch if (dbid != 0) { if(RuleB(Character, LeaveCorpses) == true && dbpcs->level >= RuleI(Character, DeathItemLossLevel)){ - end += sprintf(end, "Insert into player_corpses_backup SET data="); - *end++ = '\''; - end += DoEscapeString(end, (char*)data, datasize); - *end++ = '\''; - end += sprintf(end,", charname='%s', zoneid=%u, instanceid=%u, charid=%d, x=%1.1f, y=%1.1f, z=%1.1f, heading=%1.1f, timeofdeath=Now(), IsBurried=0, id=%u", charname, zoneid, instanceid, charid, x, y, z, heading, dbid); + + query = "Insert into player_corpses_backup SET data=\'"; + + DoEscapeString(dataSection, (char*)data, datasize); + + query.append(dataSection); + + std::string endOfQuery; + + StringFormat(endOfQuery, "\', charname='%s', zoneid=%u, instanceid=%u, " + "charid=%d, x=%1.1f, y=%1.1f, z=%1.1f, " + "heading=%1.1f, timeofdeath=Now(), IsBurried=0, id=%u", + charname, zoneid, instanceid, charid, + x, y, z, heading, dbid); + + query.append(endOfQuery); - if (RunQuery(query, (uint32) (end - query), errbuf, 0, &affected_rows)) { + if (RunQuery(query, errbuf, 0, &affected_rows)) { if (affected_rows == 1) result = true; else @@ -1656,7 +1675,6 @@ bool ZoneDatabase::CreatePlayerCorpseBackup(uint32 dbid, uint32 charid, const ch else std::cerr << "Error in CreatePlayerCorpseBackup query " << errbuf << std::endl; } - safe_delete_array(query); } else { std::cerr << "Error in CreatePlayerCorpseBackup: dbid = 0" << std::endl; @@ -1666,12 +1684,15 @@ bool ZoneDatabase::CreatePlayerCorpseBackup(uint32 dbid, uint32 charid, const ch uint32 ZoneDatabase::GetPlayerBurriedCorpseCount(uint32 char_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 CorpseCount = 0; - if (RunQuery(query, MakeAnyLenString(&query, "select count(*) from player_corpses where charid = '%u' and IsBurried = 1", char_id), errbuf, &result)) { + StringFormat(query,"select count(*) from player_corpses " + "where charid = '%u' and IsBurried = 1", char_id); + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); CorpseCount = atoi(row[0]); mysql_free_result(result); @@ -1680,19 +1701,19 @@ uint32 ZoneDatabase::GetPlayerBurriedCorpseCount(uint32 char_id) { std::cerr << "Error in GetPlayerBurriedCorpseCount query '" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); - return CorpseCount; } uint32 ZoneDatabase::GetPlayerCorpseCount(uint32 char_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 CorpseCount = 0; - if (RunQuery(query, MakeAnyLenString(&query, "select count(*) from player_corpses where charid = '%u'", char_id), errbuf, &result)) { + StringFormat(query,"select count(*) from player_corpses where charid = '%u'", char_id); + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); CorpseCount = atoi(row[0]); mysql_free_result(result); @@ -1701,19 +1722,19 @@ uint32 ZoneDatabase::GetPlayerCorpseCount(uint32 char_id) { std::cerr << "Error in GetPlayerCorpseCount query '" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); - return CorpseCount; } uint32 ZoneDatabase::GetPlayerCorpseID(uint32 char_id, uint8 corpse) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 id = 0; - if (RunQuery(query, MakeAnyLenString(&query, "select id from player_corpses where charid = '%u'", char_id), errbuf, &result)) { + StringFormat(query,"select id from player_corpses where charid = '%u'", char_id); + + if (RunQuery(query, errbuf, &result)) { for (int i=0; iwrite(EQEMuLog::Error, "Error moving corpses, Query = %s, Error = %s\n", query, errbuf); + StringFormat(query,"UPDATE player_corpses SET zoneid = %i, instanceid = %i, x = %f, y = %f, z = %f, " + "heading = %f, IsBurried = 0, WasAtGraveyard = 0 WHERE charid = %i", + dest_zoneid, dest_instanceid, dest_x, dest_y, dest_z, dest_heading, char_id); - safe_delete_array(query); + if(!RunQuery(query, errbuf)) + LogFile->write(EQEMuLog::Error, "Error moving corpses, Query = %s, Error = %s\n", query.c_str(), errbuf); - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id, charname, data, timeofdeath, rezzed FROM player_corpses WHERE charid='%u'" - "ORDER BY timeofdeath", char_id), errbuf, &result)) + StringFormat(query,"SELECT id, charname, data, timeofdeath, rezzed " + "FROM player_corpses WHERE charid='%u'" + "ORDER BY timeofdeath", + char_id); + + if (RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -1814,23 +1839,24 @@ bool ZoneDatabase::SummonAllPlayerCorpses(uint32 char_id, uint32 dest_zoneid, ui mysql_free_result(result); } else - LogFile->write(EQEMuLog::Error, "Error in SummonAllPlayerCorpses Query = %s, Error = %s\n", query, errbuf); - - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in SummonAllPlayerCorpses Query = %s, Error = %s\n", query.c_str(), errbuf); return (CorpseCount > 0); } bool ZoneDatabase::UnburyPlayerCorpse(uint32 dbid, uint32 new_zoneid, uint16 new_instanceid, float new_x, float new_y, float new_z, float new_heading) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = new char[256]; - char* end = query; + std::string query; uint32 affected_rows = 0; bool Result = false; - end += sprintf(end, "UPDATE player_corpses SET IsBurried=0, zoneid=%u, instanceid=%u, x=%f, y=%f, z=%f, heading=%f, timeofdeath=Now(), WasAtGraveyard=0 WHERE id=%u", new_zoneid, new_instanceid, new_x, new_y, new_z, new_heading, dbid); + StringFormat(query,"UPDATE player_corpses SET IsBurried=0, zoneid=%u, " + "instanceid=%u, x=%f, y=%f, z=%f, heading=%f, " + "timeofdeath=Now(), WasAtGraveyard=0 WHERE id=%u", + new_zoneid, new_instanceid, new_x, new_y, new_z, + new_heading, dbid); - if (RunQuery(query, (uint32) (end - query), errbuf, 0, &affected_rows)) { + if (RunQuery(query, errbuf, 0, &affected_rows)) { if (affected_rows == 1) Result = true; else @@ -1839,26 +1865,29 @@ bool ZoneDatabase::UnburyPlayerCorpse(uint32 dbid, uint32 new_zoneid, uint16 new else std::cerr << "Error1 in UnburyPlayerCorpse query " << errbuf << std::endl; - safe_delete_array(query); - return Result; } Corpse* ZoneDatabase::LoadPlayerCorpse(uint32 player_corpse_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; Corpse* NewCorpse = 0; unsigned long* lengths; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id, charid, charname, x, y, z, heading, data, timeofdeath, rezzed, WasAtGraveyard FROM player_corpses WHERE id='%u'", player_corpse_id), errbuf, &result)) { + StringFormat(query,"SELECT id, charid, charname, x, y, z, " + "heading, data, timeofdeath, rezzed, WasAtGraveyard " + "FROM player_corpses WHERE id='%u'", + player_corpse_id); + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); lengths = mysql_fetch_lengths(result); if(row && lengths) { - NewCorpse = Corpse::LoadFromDBData(atoi(row[0]), atoi(row[1]), row[2], (uchar*) row[7], lengths[7], atof(row[3]), atoi(row[4]), atoi(row[5]), atoi(row[6]), row[8],atoi(row[9])==1, atoi(row[10])); - entity_list.AddCorpse(NewCorpse); + NewCorpse = Corpse::LoadFromDBData(atoi(row[0]), atoi(row[1]), row[2], (uchar*) row[7], lengths[7], atof(row[3]), atoi(row[4]), atoi(row[5]), atoi(row[6]), row[8],atoi(row[9])==1, atoi(row[10])); + entity_list.AddCorpse(NewCorpse); } mysql_free_result(result); } @@ -1867,27 +1896,35 @@ Corpse* ZoneDatabase::LoadPlayerCorpse(uint32 player_corpse_id) { std::cerr << "Note that if your missing the 'rezzed' field you can add it with:\nALTER TABLE `player_corpses` ADD `rezzed` TINYINT UNSIGNED DEFAULT \"0\";\n"; } - safe_delete_array(query); - return NewCorpse; } bool ZoneDatabase::LoadPlayerCorpses(uint32 iZoneID, uint16 iInstanceID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 query_length = 0; unsigned long* lengths; - if(!RuleB(Zone, EnableShadowrest)) - query_length = MakeAnyLenString(&query, "SELECT id, charid, charname, x, y, z, heading, data, timeofdeath, rezzed, WasAtGraveyard FROM player_corpses WHERE zoneid='%u' AND instanceid='%u'", iZoneID, iInstanceID); - else - query_length = MakeAnyLenString(&query, "SELECT id, charid, charname, x, y, z, heading, data, timeofdeath, rezzed, 0 FROM player_corpses WHERE zoneid='%u' AND instanceid='%u' AND IsBurried=0", iZoneID, iInstanceID); + if(!RuleB(Zone, EnableShadowrest)) { + + StringFormat(query, "SELECT id, charid, charname, x, y, z, " + "heading, data, timeofdeath, rezzed, " + "WasAtGraveyard FROM player_corpses WHERE " + "zoneid='%u' AND instanceid='%u'", + iZoneID, iInstanceID); + } + else { + StringFormat(query, "SELECT id, charid, charname, x, y, z, " + "heading, data, timeofdeath, rezzed, 0 " + "FROM player_corpses WHERE zoneid='%u' " + "AND instanceid='%u' AND IsBurried=0", + iZoneID, iInstanceID); + } - if (RunQuery(query, query_length, errbuf, &result)) { - safe_delete_array(query); + if (RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { lengths = mysql_fetch_lengths(result); entity_list.AddCorpse(Corpse::LoadFromDBData(atoi(row[0]), atoi(row[1]), row[2], (uchar*) row[7], lengths[7], atof(row[3]), atoi(row[4]), atoi(row[5]), atoi(row[6]), row[8],atoi(row[9])==1, atoi(row[10]))); @@ -1897,7 +1934,6 @@ bool ZoneDatabase::LoadPlayerCorpses(uint32 iZoneID, uint16 iInstanceID) { else { std::cerr << "Error in LoadPlayerCorpses query '" << query << "' " << errbuf << std::endl; std::cerr << "Note that if your missing the 'rezzed' field you can add it with:\nALTER TABLE `player_corpses` ADD `rezzed` TINYINT UNSIGNED DEFAULT \"0\";\n"; - safe_delete_array(query); return false; } @@ -1906,68 +1942,68 @@ bool ZoneDatabase::LoadPlayerCorpses(uint32 iZoneID, uint16 iInstanceID) { uint32 ZoneDatabase::GetFirstCorpseID(uint32 char_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 CorpseID = 0; - MakeAnyLenString(&query, "SELECT id FROM player_corpses WHERE charid='%u' AND IsBurried=0 ORDER BY timeofdeath LIMIT 1", char_id); - if (RunQuery(query, strlen(query), errbuf, &result)) { - if (mysql_num_rows(result)!= 0){ - row = mysql_fetch_row(result); - CorpseID = atoi(row[0]); - mysql_free_result(result); - } + StringFormat(query, "SELECT id FROM player_corpses WHERE charid='%u' " + "AND IsBurried=0 ORDER BY timeofdeath LIMIT 1", + char_id); + + if (RunQuery(query, errbuf, &result)) { + if (mysql_num_rows(result)!= 0) { + row = mysql_fetch_row(result); + CorpseID = atoi(row[0]); + mysql_free_result(result); } + } else { std::cerr << "Error in GetFirstCorpseID query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return 0; } - - safe_delete_array(query); return CorpseID; } bool ZoneDatabase::BuryPlayerCorpse(uint32 dbid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE player_corpses SET IsBurried = 1 WHERE id=%d", dbid), errbuf)) { + StringFormat(query,"UPDATE player_corpses SET IsBurried = 1 WHERE id=%d", dbid); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in BuryPlayerCorpse query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); return true; } bool ZoneDatabase::BuryAllPlayerCorpses(uint32 charid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE player_corpses SET IsBurried = 1 WHERE charid=%d", charid), errbuf)) { + StringFormat(query,"UPDATE player_corpses SET IsBurried = 1 WHERE charid=%d", charid); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in BuryPlayerCorpse query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); return true; } bool ZoneDatabase::DeletePlayerCorpse(uint32 dbid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "Delete from player_corpses where id=%d", dbid), errbuf)) { + StringFormat(query,"Delete from player_corpses where id=%d", dbid); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in DeletePlayerCorpse query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); return true; } @@ -2022,11 +2058,15 @@ void Corpse::LoadPlayerCorpseDecayTime(uint32 dbid){ if(!dbid) return; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(timeofdeath)) FROM player_corpses WHERE id=%d and not timeofdeath=0", dbid), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query,"SELECT (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(timeofdeath)) " + "FROM player_corpses WHERE id=%d and not timeofdeath=0", + dbid); + + if (database.RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { if(atoi(row[0]) > 0 && RuleI(Character, CorpseDecayTimeMS) > (atoi(row[0]) * 1000)) { corpse_decay_timer.SetTimer(RuleI(Character, CorpseDecayTimeMS) - (atoi(row[0]) * 1000)); @@ -2054,8 +2094,6 @@ void Corpse::LoadPlayerCorpseDecayTime(uint32 dbid){ } mysql_free_result(result); } - else - safe_delete_array(query); } /* diff --git a/zone/QGlobals.cpp b/zone/QGlobals.cpp index 73faa8b2c..963afab47 100644 --- a/zone/QGlobals.cpp +++ b/zone/QGlobals.cpp @@ -140,12 +140,14 @@ void QGlobalCache::PurgeExpiredGlobals() void QGlobalCache::LoadByNPCID(uint32 npcID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query, MakeAnyLenString(&query, "select name, charid, npcid, zoneid, value, expdate" - " from quest_globals where npcid = %d", npcID), errbuf, &result)) + StringFormat(query,"select name, charid, npcid, zoneid, value, expdate" + " from quest_globals where npcid = %d", npcID); + + if (database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -153,18 +155,20 @@ void QGlobalCache::LoadByNPCID(uint32 npcID) } mysql_free_result(result); } - safe_delete_array(query); } void QGlobalCache::LoadByCharID(uint32 charID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query, MakeAnyLenString(&query, "select name, charid, npcid, zoneid, value, expdate from" - " quest_globals where charid = %d && npcid = 0", charID), errbuf, &result)) + StringFormat(query,"select name, charid, npcid, zoneid, value, expdate from " + "quest_globals where charid = %d && npcid = 0", + charID); + + if (database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -172,18 +176,19 @@ void QGlobalCache::LoadByCharID(uint32 charID) } mysql_free_result(result); } - safe_delete_array(query); } void QGlobalCache::LoadByZoneID(uint32 zoneID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query, MakeAnyLenString(&query, "select name, charid, npcid, zoneid, value, expdate from quest_globals" - " where zoneid = %d && npcid = 0 && charid = 0", zoneID), errbuf, &result)) + StringFormat(query,"select name, charid, npcid, zoneid, value, expdate from quest_globals" + " where zoneid = %d && npcid = 0 && charid = 0", zoneID); + + if (database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -191,17 +196,18 @@ void QGlobalCache::LoadByZoneID(uint32 zoneID) } mysql_free_result(result); } - safe_delete_array(query); } void QGlobalCache::LoadByGlobalContext() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query, MakeAnyLenString(&query, "select name, charid, npcid, zoneid, value, expdate from quest_globals" - " where zoneid = 0 && npcid = 0 && charid = 0"), errbuf, &result)) + query = "select name, charid, npcid, zoneid, value, expdate from quest_globals" + " where zoneid = 0 && npcid = 0 && charid = 0"; + + if (database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -209,5 +215,4 @@ void QGlobalCache::LoadByGlobalContext() } mysql_free_result(result); } - safe_delete_array(query); } diff --git a/zone/bot.cpp b/zone/bot.cpp index c88ad72b7..21fec6573 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -1466,8 +1466,7 @@ void Bot::GenerateAABonuses(StatBonuses* newbon) { void Bot::LoadAAs() { std::string errorMessage; - char* Query = 0; - int length = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; @@ -1476,11 +1475,11 @@ void Bot::LoadAAs() { botAAs.clear(); //start fresh if(GetClass() == BERSERKER) - length = MakeAnyLenString(&Query, "SELECT skill_id FROM altadv_vars WHERE berserker = 1 AND class_type > 1 AND class_type <= %i AND aa_expansion <= %i ORDER BY skill_id;", GetLevel(), maxAAExpansion); + StringFormat(query,"SELECT skill_id FROM altadv_vars WHERE berserker = 1 AND class_type > 1 AND class_type <= %i AND aa_expansion <= %i ORDER BY skill_id;", GetLevel(), maxAAExpansion); else - length = MakeAnyLenString(&Query, "SELECT skill_id FROM altadv_vars WHERE ((classes & ( 1 << %i )) >> %i) = 1 AND class_type > 1 AND class_type <= %i AND aa_expansion <= %i ORDER BY skill_id;", GetClass(), GetClass(), GetLevel(), maxAAExpansion); + StringFormat(query,"SELECT skill_id FROM altadv_vars WHERE ((classes & ( 1 << %i )) >> %i) = 1 AND class_type > 1 AND class_type <= %i AND aa_expansion <= %i ORDER BY skill_id;", GetClass(), GetClass(), GetLevel(), maxAAExpansion); - if(!database.RunQuery(Query, length, TempErrorMessageBuffer, &DatasetResult)) { + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -1538,8 +1537,6 @@ void Bot::LoadAAs() { mysql_free_result(DatasetResult); } - safe_delete(Query); - Query = 0; if(!errorMessage.empty()) { LogFile->write(EQEMuLog::Error, "Error in Bot::LoadAAs()"); @@ -2351,12 +2348,14 @@ bool Bot::IsBotNameAvailable(std::string* errorMessage) { bool Result = false; if(this->GetCleanName()) { - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT COUNT(id) FROM vwBotCharacterMobs WHERE name LIKE '%s'", this->GetCleanName()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT COUNT(id) FROM vwBotCharacterMobs WHERE name LIKE '%s'", this->GetCleanName()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { *errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -2372,8 +2371,6 @@ bool Bot::IsBotNameAvailable(std::string* errorMessage) { mysql_free_result(DatasetResult); } - - safe_delete(Query); } return Result; @@ -2383,14 +2380,31 @@ bool Bot::Save() { bool Result = false; std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; uint32 affectedRows = 0; if(this->GetBotID() == 0) { // New bot record uint32 TempNewBotID = 0; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO bots (BotOwnerCharacterID, BotSpellsID, Name, LastName, BotLevel, Race, Class, Gender, Size, Face, LuclinHairStyle, LuclinHairColor, LuclinEyeColor, LuclinEyeColor2, LuclinBeardColor, LuclinBeard, DrakkinHeritage, DrakkinTattoo, DrakkinDetails, HP, Mana, MR, CR, DR, FR, PR, Corrup, AC, STR, STA, DEX, AGI, _INT, WIS, CHA, ATK, LastSpawnDate, TotalPlayTime, LastZoneId) VALUES('%u', '%u', '%s', '%s', '%u', '%i', '%i', '%i', '%f', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', NOW(), 0, %i)", this->_botOwnerCharacterID, this->GetBotSpellID(), this->GetCleanName(), this->lastname, this->GetLevel(), GetRace(), GetClass(), GetGender(), GetSize(), this->GetLuclinFace(), this->GetHairStyle(), GetHairColor(), this->GetEyeColor1(), this->GetEyeColor2(), this->GetBeardColor(), this->GetBeard(), this->GetDrakkinHeritage(), this->GetDrakkinTattoo(), this->GetDrakkinDetails(), GetHP(), GetMana(), GetMR(), GetCR(), GetDR(), GetFR(), GetPR(), GetCorrup(), GetAC(), GetSTR(), GetSTA(), GetDEX(), GetAGI(), GetINT(), GetWIS(), GetCHA(), GetATK(), _lastZoneId), TempErrorMessageBuffer, 0, &affectedRows, &TempNewBotID)) { + + StringFormat(query, "INSERT INTO bots (BotOwnerCharacterID, BotSpellsID, Name, LastName, BotLevel, " + "Race, Class, Gender, Size, Face, LuclinHairStyle, LuclinHairColor, LuclinEyeColor, " + "LuclinEyeColor2, LuclinBeardColor, LuclinBeard, DrakkinHeritage, DrakkinTattoo, " + "DrakkinDetails, HP, Mana, MR, CR, DR, FR, PR, Corrup, AC, STR, STA, DEX, AGI, " + "_INT, WIS, CHA, ATK, LastSpawnDate, TotalPlayTime, LastZoneId) " + "VALUES('%u', '%u', '%s', '%s', '%u', '%i', '%i', '%i', '%f', '%i', '%i', " + "'%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', " + "'%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', NOW(), 0, %i)", + this->_botOwnerCharacterID, this->GetBotSpellID(), this->GetCleanName(), this->lastname, + this->GetLevel(), GetRace(), GetClass(), GetGender(), GetSize(), this->GetLuclinFace(), + this->GetHairStyle(), GetHairColor(), this->GetEyeColor1(), this->GetEyeColor2(), + this->GetBeardColor(), this->GetBeard(), this->GetDrakkinHeritage(), this->GetDrakkinTattoo(), + this->GetDrakkinDetails(), GetHP(), GetMana(), GetMR(), GetCR(), GetDR(), GetFR(), GetPR(), + GetCorrup(), GetAC(), GetSTR(), GetSTA(), GetDEX(), GetAGI(), GetINT(), GetWIS(), GetCHA(), + GetATK(), _lastZoneId); + + if(!database.RunQuery(query, TempErrorMessageBuffer, nullptr, &affectedRows, &TempNewBotID)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -2400,7 +2414,29 @@ bool Bot::Save() { } else { // Update existing bot record - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE bots SET BotOwnerCharacterID = '%u', BotSpellsID = '%u', Name = '%s', LastName = '%s', BotLevel = '%u', Race = '%i', Class = '%i', Gender = '%i', Size = '%f', Face = '%i', LuclinHairStyle = '%i', LuclinHairColor = '%i', LuclinEyeColor = '%i', LuclinEyeColor2 = '%i', LuclinBeardColor = '%i', LuclinBeard = '%i', DrakkinHeritage = '%i', DrakkinTattoo = '%i', DrakkinDetails = '%i', HP = '%i', Mana = '%i', MR = '%i', CR = '%i', DR = '%i', FR = '%i', PR = '%i', Corrup = '%i', AC = '%i', STR = '%i', STA = '%i', DEX = '%i', AGI = '%i', _INT = '%i', WIS = '%i', CHA = '%i', ATK = '%i', LastSpawnDate = NOW(), TotalPlayTime = '%u', LastZoneId = %i WHERE BotID = '%u'", _botOwnerCharacterID, this->GetBotSpellID(), this->GetCleanName(), this->lastname, this->GetLevel(), _baseRace, this->GetClass(), _baseGender, GetSize(), this->GetLuclinFace(), this->GetHairStyle(), GetHairColor(), this->GetEyeColor1(), this->GetEyeColor2(), this->GetBeardColor(), this->GetBeard(), this->GetDrakkinHeritage(), GetDrakkinTattoo(), GetDrakkinDetails(), GetHP(), GetMana(), _baseMR, _baseCR, _baseDR, _baseFR, _basePR, _baseCorrup, _baseAC, _baseSTR, _baseSTA, _baseDEX, _baseAGI, _baseINT, _baseWIS, _baseCHA, _baseATK, GetTotalPlayTime(), _lastZoneId, GetBotID()), TempErrorMessageBuffer, 0, &affectedRows)) { + + StringFormat(query,"UPDATE bots SET BotOwnerCharacterID = '%u', BotSpellsID = '%u', " + "Name = '%s', LastName = '%s', BotLevel = '%u', Race = '%i', " + "Class = '%i', Gender = '%i', Size = '%f', Face = '%i', " + "LuclinHairStyle = '%i', LuclinHairColor = '%i', LuclinEyeColor = '%i', " + "LuclinEyeColor2 = '%i', LuclinBeardColor = '%i', LuclinBeard = '%i', " + "DrakkinHeritage = '%i', DrakkinTattoo = '%i', DrakkinDetails = '%i', " + "HP = '%i', Mana = '%i', MR = '%i', CR = '%i', DR = '%i', FR = '%i', " + "PR = '%i', Corrup = '%i', AC = '%i', STR = '%i', STA = '%i', DEX = '%i', " + "AGI = '%i', _INT = '%i', WIS = '%i', CHA = '%i', ATK = '%i', " + "LastSpawnDate = NOW(), TotalPlayTime = '%u', LastZoneId = %i " + "WHERE BotID = '%u'", + _botOwnerCharacterID, this->GetBotSpellID(), this->GetCleanName(), + this->lastname, this->GetLevel(), _baseRace, this->GetClass(), + _baseGender, GetSize(), this->GetLuclinFace(), this->GetHairStyle(), + GetHairColor(), this->GetEyeColor1(), this->GetEyeColor2(), this->GetBeardColor(), + this->GetBeard(), this->GetDrakkinHeritage(), GetDrakkinTattoo(), + GetDrakkinDetails(), GetHP(), GetMana(), _baseMR, _baseCR, _baseDR, + _baseFR, _basePR, _baseCorrup, _baseAC, _baseSTR, _baseSTA, _baseDEX, + _baseAGI, _baseINT, _baseWIS, _baseCHA, _baseATK, GetTotalPlayTime(), + _lastZoneId, GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, 0, &affectedRows)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -2409,8 +2445,6 @@ bool Bot::Save() { } } - safe_delete(Query); - if(!errorMessage.empty() || (Result && affectedRows != 1)) { if(GetBotOwner() && !errorMessage.empty()) GetBotOwner()->Message(13, errorMessage.c_str()); @@ -2448,7 +2482,7 @@ uint32 Bot::GetTotalPlayTime() { void Bot::SaveBuffs() { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; int BuffCount = 0; int InsertCount = 0; @@ -2458,10 +2492,11 @@ void Bot::SaveBuffs() { if(buffs[BuffCount].spellid > 0 && buffs[BuffCount].spellid != SPELL_UNKNOWN) { if(InsertCount == 0) { // Remove any existing buff saves - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM botbuffs WHERE BotId = %u", GetBotID()), TempErrorMessageBuffer)) { + + StringFormat(query, "DELETE FROM botbuffs WHERE BotId = %u", GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; break; } } @@ -2473,26 +2508,26 @@ void Bot::SaveBuffs() { else IsPersistent = 0; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO botbuffs (BotId, SpellId, CasterLevel, DurationFormula, " - "TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, HitCount, MeleeRune, MagicRune, " - "DeathSaveSuccessChance, CasterAARank, Persistent) VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u);", - GetBotID(), buffs[BuffCount].spellid, buffs[BuffCount].casterlevel, spells[buffs[BuffCount].spellid].buffdurationformula, - buffs[BuffCount].ticsremaining, - CalculatePoisonCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, - CalculateDiseaseCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, - CalculateCurseCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, - CalculateCorruptionCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, - buffs[BuffCount].numhits, buffs[BuffCount].melee_rune, buffs[BuffCount].magic_rune, - buffs[BuffCount].deathSaveSuccessChance, - buffs[BuffCount].deathsaveCasterAARank, IsPersistent), TempErrorMessageBuffer)) { + StringFormat(query, "INSERT INTO botbuffs (BotId, SpellId, CasterLevel, DurationFormula, " + "TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, " + "CorruptionCounters, HitCount, MeleeRune, MagicRune, " + "DeathSaveSuccessChance, CasterAARank, Persistent) " + "VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u);", + GetBotID(), buffs[BuffCount].spellid, buffs[BuffCount].casterlevel, + spells[buffs[BuffCount].spellid].buffdurationformula, buffs[BuffCount].ticsremaining, + CalculatePoisonCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, + CalculateDiseaseCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, + CalculateCurseCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, + CalculateCorruptionCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, + buffs[BuffCount].numhits, buffs[BuffCount].melee_rune, buffs[BuffCount].magic_rune, + buffs[BuffCount].deathSaveSuccessChance, + buffs[BuffCount].deathsaveCasterAARank, IsPersistent); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; break; } else { - safe_delete(Query); - Query = 0; InsertCount++; } } @@ -2507,14 +2542,19 @@ void Bot::SaveBuffs() { void Bot::LoadBuffs() { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; bool BuffsLoaded = false; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT SpellId, CasterLevel, DurationFormula, TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, HitCount, MeleeRune, MagicRune, DeathSaveSuccessChance, CasterAARank, Persistent FROM botbuffs WHERE BotId = %u", GetBotID()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query, "SELECT SpellId, CasterLevel, DurationFormula, TicsRemaining, " + "PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, " + "HitCount, MeleeRune, MagicRune, DeathSaveSuccessChance, CasterAARank, " + "Persistent FROM botbuffs WHERE BotId = %u", GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -2559,14 +2599,13 @@ void Bot::LoadBuffs() { BuffsLoaded = true; } - safe_delete(Query); - Query = 0; if(errorMessage.empty() && BuffsLoaded) { - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM botbuffs WHERE BotId = %u", GetBotID()), TempErrorMessageBuffer)) { + + StringFormat(query, "DELETE FROM botbuffs WHERE BotId = %u", GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; } } @@ -2578,12 +2617,14 @@ void Bot::LoadBuffs() { uint32 Bot::GetPetSaveId() { uint32 Result = 0; std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "select BotPetsId from botpets where BotId = %u;", GetBotID()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query, "select BotPetsId from botpets where BotId = %u;", GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -2595,8 +2636,6 @@ uint32 Bot::GetPetSaveId() { mysql_free_result(DatasetResult); } - safe_delete(Query); - if(!errorMessage.empty()) { // TODO: Record this error message to zone error log } @@ -2638,14 +2677,16 @@ void Bot::LoadPet() { void Bot::LoadPetStats(std::string* petName, uint16* petMana, uint16* petHitPoints, uint32* botPetId, uint32 botPetSaveId) { if(botPetSaveId > 0) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; bool statsLoaded = false; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "select PetId, Name, Mana, HitPoints from botpets where BotPetsId = %u;", botPetSaveId), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"select PetId, Name, Mana, HitPoints from botpets where BotPetsId = %u;", botPetSaveId); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -2662,8 +2703,6 @@ void Bot::LoadPetStats(std::string* petName, uint16* petMana, uint16* petHitPoin statsLoaded = true; } - safe_delete(Query); - Query = 0; if(!errorMessage.empty()) { // TODO: Record this error message to zone error log @@ -2674,14 +2713,16 @@ void Bot::LoadPetStats(std::string* petName, uint16* petMana, uint16* petHitPoin void Bot::LoadPetBuffs(SpellBuff_Struct* petBuffs, uint32 botPetSaveId) { if(petBuffs && botPetSaveId > 0) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; bool BuffsLoaded = false; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT SpellId, CasterLevel, Duration FROM botpetbuffs WHERE BotPetsId = %u;", botPetSaveId), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT SpellId, CasterLevel, Duration FROM botpetbuffs WHERE BotPetsId = %u;", botPetSaveId); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -2703,14 +2744,12 @@ void Bot::LoadPetBuffs(SpellBuff_Struct* petBuffs, uint32 botPetSaveId) { BuffsLoaded = true; } - safe_delete(Query); - Query = 0; - if(errorMessage.empty() && BuffsLoaded) { - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM botpetbuffs WHERE BotPetsId = %u;", botPetSaveId), TempErrorMessageBuffer)) { + + StringFormat(query, "DELETE FROM botpetbuffs WHERE BotPetsId = %u;", botPetSaveId); + + if(!database.RunQuery(query,TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; } } @@ -2723,14 +2762,16 @@ void Bot::LoadPetBuffs(SpellBuff_Struct* petBuffs, uint32 botPetSaveId) { void Bot::LoadPetItems(uint32* petItems, uint32 botPetSaveId) { if(petItems && botPetSaveId > 0) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; bool itemsLoaded = false; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT ItemId FROM botpetinventory WHERE BotPetsId = %u;", botPetSaveId), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT ItemId FROM botpetinventory WHERE BotPetsId = %u;", botPetSaveId); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -2750,14 +2791,12 @@ void Bot::LoadPetItems(uint32* petItems, uint32 botPetSaveId) { itemsLoaded = true; } - safe_delete(Query); - Query = 0; - if(errorMessage.empty() && itemsLoaded) { - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM botpetinventory WHERE BotPetsId = %u;", botPetSaveId), TempErrorMessageBuffer)) { + + StringFormat(query,"DELETE FROM botpetinventory WHERE BotPetsId = %u;", botPetSaveId); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; } } @@ -2807,37 +2846,37 @@ uint32 Bot::SavePetStats(std::string petName, uint16 petMana, uint16 petHitPoint uint32 Result = 0; std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "REPLACE INTO botpets SET PetId = %u, BotId = %u, Name = '%s', Mana = %u, HitPoints = %u;", botPetId, GetBotID(), petName.c_str(), petMana, petHitPoints), TempErrorMessageBuffer, 0, 0, &Result)) { + StringFormat(query,"REPLACE INTO botpets SET PetId = %u, BotId = %u, Name = '%s', Mana = %u, HitPoints = %u;", botPetId, GetBotID(), petName.c_str(), petMana, petHitPoints); + + if(!database.RunQuery(query,TempErrorMessageBuffer, 0, 0, &Result)) { errorMessage = std::string(TempErrorMessageBuffer); } - safe_delete(Query); - Query = 0; - return Result; } void Bot::SavePetBuffs(SpellBuff_Struct* petBuffs, uint32 botPetSaveId) { if(petBuffs && botPetSaveId > 0) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; int BuffCount = 0; while(BuffCount < BUFF_COUNT) { if(petBuffs[BuffCount].spellid > 0 && petBuffs[BuffCount].spellid != SPELL_UNKNOWN) { - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO botpetbuffs (BotPetsId, SpellId, CasterLevel, Duration) VALUES(%u, %u, %u, %u);", botPetSaveId, petBuffs[BuffCount].spellid, petBuffs[BuffCount].level, petBuffs[BuffCount].duration), TempErrorMessageBuffer)) { + + StringFormat(query,"INSERT INTO botpetbuffs (BotPetsId, SpellId, CasterLevel, Duration) VALUES(%u, %u, %u, %u);", + botPetSaveId, petBuffs[BuffCount].spellid, petBuffs[BuffCount].level, petBuffs[BuffCount].duration); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; break; } else { - safe_delete(Query); - Query = 0; + } } @@ -2853,21 +2892,21 @@ void Bot::SavePetBuffs(SpellBuff_Struct* petBuffs, uint32 botPetSaveId) { void Bot::SavePetItems(uint32* petItems, uint32 botPetSaveId) { if(petItems && botPetSaveId > 0) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; int ItemCount = 0; while(ItemCount < MAX_WORN_INVENTORY) { if(petItems[ItemCount] > 0) { - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO botpetinventory (BotPetsId, ItemId) VALUES(%u, %u);", botPetSaveId, petItems[ItemCount]), TempErrorMessageBuffer)) { + + StringFormat(query,"INSERT INTO botpetinventory (BotPetsId, ItemId) VALUES(%u, %u);", + botPetSaveId, petItems[ItemCount]); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; break; } else { - safe_delete(Query); - Query = 0; ItemCount++; } } @@ -2884,45 +2923,43 @@ void Bot::SavePetItems(uint32* petItems, uint32 botPetSaveId) { void Bot::DeletePetBuffs(uint32 botPetSaveId) { if(botPetSaveId > 0) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM botpetbuffs WHERE BotPetsId = %u;", botPetSaveId), TempErrorMessageBuffer)) { + StringFormat(query,"DELETE FROM botpetbuffs WHERE BotPetsId = %u;", botPetSaveId); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); } - - safe_delete(Query); - Query = 0; } } void Bot::DeletePetItems(uint32 botPetSaveId) { if(botPetSaveId > 0) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM botpetinventory WHERE BotPetsId = %u;", botPetSaveId), TempErrorMessageBuffer)) { + StringFormat(query,"DELETE FROM botpetinventory WHERE BotPetsId = %u;", botPetSaveId); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); } - - safe_delete(Query); - Query = 0; } } void Bot::DeletePetStats(uint32 botPetSaveId) { if(botPetSaveId > 0) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE from botpets where BotPetsId = %u;", botPetSaveId), TempErrorMessageBuffer)) { + StringFormat(query, "DELETE from botpets where BotPetsId = %u;", botPetSaveId); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); } - safe_delete(Query); - Query = 0; } } @@ -2930,12 +2967,14 @@ void Bot::LoadStance() { int Result = 0; bool loaded = false; std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "select StanceID from botstances where BotID = %u;", GetBotID()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"select StanceID from botstances where BotID = %u;", GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -2948,9 +2987,6 @@ void Bot::LoadStance() { mysql_free_result(DatasetResult); } - safe_delete(Query); - Query = 0; - if(!errorMessage.empty()) { LogFile->write(EQEMuLog::Error, "Error in Bot::LoadStance()"); } @@ -2964,17 +3000,13 @@ void Bot::LoadStance() { void Bot::SaveStance() { if(_baseBotStance != _botStance) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "REPLACE INTO botstances (BotID, StanceId) VALUES(%u, %u);", GetBotID(), GetBotStance()), TempErrorMessageBuffer)) { + StringFormat(query,"REPLACE INTO botstances (BotID, StanceId) VALUES(%u, %u);", GetBotID(), GetBotStance()); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; - } - else { - safe_delete(Query); - Query = 0; } if(!errorMessage.empty()) { @@ -2985,12 +3017,18 @@ void Bot::SaveStance() { void Bot::LoadTimers() { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT IfNull(bt.TimerID, 0) As TimerID, IfNull(bt.Value, 0) As Value, IfNull(MAX(sn.recast_time), 0) AS MaxTimer FROM bottimers bt, spells_new sn WHERE bt.BotID = %u AND sn.EndurTimerIndex = (SELECT case WHEN TimerID > %i THEN TimerID - %i ELSE TimerID END AS TimerID FROM bottimers WHERE TimerID = bt.TimerID AND BotID = bt.BotID ) AND sn.classes%i <= %i;", GetBotID(), DisciplineReuseStart-1, DisciplineReuseStart-1, GetClass(), GetLevel()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT IfNull(bt.TimerID, 0) As TimerID, IfNull(bt.Value, 0) As Value, IfNull(MAX(sn.recast_time), 0) " + "AS MaxTimer FROM bottimers bt, spells_new sn WHERE bt.BotID = %u AND sn.EndurTimerIndex = " + "(SELECT case WHEN TimerID > %i THEN TimerID - %i ELSE TimerID END AS TimerID FROM bottimers " + "WHERE TimerID = bt.TimerID AND BotID = bt.BotID ) AND sn.classes%i <= %i;", + GetBotID(), DisciplineReuseStart-1, DisciplineReuseStart-1, GetClass(), GetLevel()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -3011,9 +3049,6 @@ void Bot::LoadTimers() { mysql_free_result(DatasetResult); } - safe_delete(Query); - Query = 0; - if(!errorMessage.empty()) { LogFile->write(EQEMuLog::Error, "Error in Bot::LoadTimers()"); } @@ -3021,23 +3056,25 @@ void Bot::LoadTimers() { void Bot::SaveTimers() { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM bottimers WHERE BotID = %u;", GetBotID()), TempErrorMessageBuffer)) { + StringFormat(query,"DELETE FROM bottimers WHERE BotID = %u;", GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; } for(int i = 0; i < MaxTimer; i++) { if(timers[i] > Timer::GetCurrentTime()) { - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "REPLACE INTO bottimers (BotID, TimerID, Value) VALUES(%u, %u, %u);", GetBotID(), i+1, timers[i]), TempErrorMessageBuffer)) { + + StringFormat(query,"REPLACE INTO bottimers (BotID, TimerID, Value) VALUES(%u, %u, %u);", + GetBotID(), i+1, timers[i]); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); } - safe_delete(Query); - Query = 0; } } @@ -4249,30 +4286,38 @@ bool Bot::DeleteBot(std::string* errorMessage) { int TempCounter = 0; if(this->GetBotID() > 0) { - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; // TODO: These queries need to be ran together as a transaction.. ie, if one or more fail then they all will fail to commit to the database. - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM botinventory WHERE botid = '%u'", this->GetBotID()), TempErrorMessageBuffer)) { + StringFormat(query,"DELETE FROM botinventory WHERE botid = '%u'", this->GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { *errorMessage = std::string(TempErrorMessageBuffer); } else TempCounter++; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM botbuffs WHERE botid = '%u'", this->GetBotID()), TempErrorMessageBuffer)) { + StringFormat(query, "DELETE FROM botbuffs WHERE botid = '%u'", this->GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { *errorMessage = std::string(TempErrorMessageBuffer); } else TempCounter++; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM botstances WHERE BotID = '%u'", this->GetBotID()), TempErrorMessageBuffer)) { + StringFormat(query, "DELETE FROM botstances WHERE BotID = '%u'", this->GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { *errorMessage = std::string(TempErrorMessageBuffer); } else TempCounter++; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM bots WHERE BotID = '%u'", this->GetBotID()), TempErrorMessageBuffer)) { + StringFormat(query,"DELETE FROM bots WHERE BotID = '%u'", this->GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { *errorMessage = std::string(TempErrorMessageBuffer); } else @@ -4337,7 +4382,7 @@ void Bot::Spawn(Client* botCharacterOwner, std::string* errorMessage) { // Saves the specified item as an inventory record in the database for this bot. void Bot::SetBotItemInSlot(uint32 slotID, uint32 itemID, const ItemInst* inst, std::string *errorMessage) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 augslot[5] = { 0, 0, 0, 0, 0 }; if(this->GetBotID() > 0 && slotID >= 0 && itemID > 0) { @@ -4347,31 +4392,35 @@ void Bot::SetBotItemInSlot(uint32 slotID, uint32 itemID, const ItemInst* inst, s augslot[i] = (auginst && auginst->GetItem()) ? auginst->GetItem()->ID : 0; } } - if(!database.RunQuery(query, MakeAnyLenString(&query, - "REPLACE INTO botinventory " - " (botid,slotid,itemid,charges,instnodrop,color," - " augslot1,augslot2,augslot3,augslot4,augslot5)" - " VALUES(%lu,%lu,%lu,%lu,%lu,%lu," - " %lu,%lu,%lu,%lu,%lu)", - (unsigned long)this->GetBotID(), (unsigned long)slotID, (unsigned long)itemID, (unsigned long)inst->GetCharges(), (unsigned long)(inst->IsInstNoDrop() ? 1:0),(unsigned long)inst->GetColor(), - (unsigned long)augslot[0],(unsigned long)augslot[1],(unsigned long)augslot[2],(unsigned long)augslot[3],(unsigned long)augslot[4]), errbuf)) { + + StringFormat(query,"REPLACE INTO botinventory " + " (botid,slotid,itemid,charges,instnodrop,color," + " augslot1,augslot2,augslot3,augslot4,augslot5)" + " VALUES(%lu,%lu,%lu,%lu,%lu,%lu," + " %lu,%lu,%lu,%lu,%lu)", + (unsigned long)this->GetBotID(), (unsigned long)slotID, (unsigned long)itemID, + (unsigned long)inst->GetCharges(), (unsigned long)(inst->IsInstNoDrop() ? 1:0), + (unsigned long)inst->GetColor(),(unsigned long)augslot[0],(unsigned long)augslot[1], + (unsigned long)augslot[2],(unsigned long)augslot[3],(unsigned long)augslot[4]); + + if(!database.RunQuery(query, errbuf)) { *errorMessage = std::string(errbuf); } - - safe_delete_array(query); } } // Deletes the inventory record for the specified item from the database for this bot. void Bot::RemoveBotItemBySlot(uint32 slotID, std::string *errorMessage) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; if(this->GetBotID() > 0 && slotID >= 0) { - if(!database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM botinventory WHERE botid=%i AND slotid=%i", this->GetBotID(), slotID), errbuf)){ + + StringFormat(query,"DELETE FROM botinventory WHERE botid=%i AND slotid=%i", this->GetBotID(), slotID); + + if(!database.RunQuery(query, errbuf)){ *errorMessage = std::string(errbuf); } - safe_delete_array(query); m_inv.DeleteItem(slotID); } } @@ -4381,11 +4430,15 @@ void Bot::GetBotItems(std::string* errorMessage, Inventory &inv) { if(this->GetBotID() > 0) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(database.RunQuery(query, MakeAnyLenString(&query, "SELECT slotid,itemid,charges,color,augslot1,augslot2,augslot3,augslot4,augslot5,instnodrop FROM botinventory WHERE botid=%i order by slotid", this->GetBotID()), errbuf, &DatasetResult)) { + StringFormat(query,"SELECT slotid, itemid, charges, color, augslot1, augslot2, " + "augslot3, augslot4, augslot5, instnodrop FROM botinventory " + "WHERE botid=%i order by slotid", this->GetBotID()); + + if(database.RunQuery(query, errbuf, &DatasetResult)) { while(DataRow = mysql_fetch_row(DatasetResult)) { int16 slot_id = atoi(DataRow[0]); uint32 item_id = atoi(DataRow[1]); @@ -4436,7 +4489,6 @@ void Bot::GetBotItems(std::string* errorMessage, Inventory &inv) { else *errorMessage = std::string(errbuf); - safe_delete_array(query); } } @@ -4445,11 +4497,14 @@ uint32 Bot::GetBotItemBySlot(uint32 slotID) { uint32 Result = 0; if(this->GetBotID() > 0 && slotID >= 0) { - char* query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(database.RunQuery(query, MakeAnyLenString(&query, "SELECT itemid FROM botinventory WHERE botid=%i AND slotid=%i", GetBotID(), slotID), 0, &DatasetResult)) { + StringFormat(query,"SELECT itemid FROM botinventory WHERE botid=%i AND slotid=%i", + GetBotID(), slotID); + + if(database.RunQuery(query, nullptr, &DatasetResult)) { if(mysql_num_rows(DatasetResult) == 1) { DataRow = mysql_fetch_row(DatasetResult); if(DataRow) @@ -4458,8 +4513,6 @@ uint32 Bot::GetBotItemBySlot(uint32 slotID) { mysql_free_result(DatasetResult); } - - safe_delete_array(query); } return Result; @@ -4471,11 +4524,13 @@ uint32 Bot::GetBotItemsCount(std::string *errorMessage) { if(this->GetBotID() > 0) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(database.RunQuery(query, MakeAnyLenString(&query, "SELECT COUNT(*) FROM botinventory WHERE botid=%i", this->GetBotID()), errbuf, &DatasetResult)) { + StringFormat(query,"SELECT COUNT(*) FROM botinventory WHERE botid=%i", this->GetBotID()); + + if(database.RunQuery(query, errbuf, &DatasetResult)) { if(mysql_num_rows(DatasetResult) == 1) { DataRow = mysql_fetch_row(DatasetResult); if(DataRow) @@ -4487,7 +4542,6 @@ uint32 Bot::GetBotItemsCount(std::string *errorMessage) { else *errorMessage = std::string(errbuf); - safe_delete_array(query); } return Result; @@ -4683,13 +4737,15 @@ uint32 Bot::GetBotIDByBotName(std::string botName) { uint32 Result = 0; if(!botName.empty()) { - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; std::string errorMessage; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT BotID FROM bots WHERE Name = '%s'", botName.c_str()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT BotID FROM bots WHERE Name = '%s'", botName.c_str()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -4701,7 +4757,6 @@ uint32 Bot::GetBotIDByBotName(std::string botName) { mysql_free_result(DatasetResult); } - safe_delete_array(Query); if(!errorMessage.empty()) { // TODO: Log this error to zone error log @@ -4715,12 +4770,20 @@ Bot* Bot::LoadBot(uint32 botID, std::string* errorMessage) { Bot* Result = 0; if(botID > 0) { - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT BotOwnerCharacterID, BotSpellsID, Name, LastName, BotLevel, Race, Class, Gender, Size, Face, LuclinHairStyle, LuclinHairColor, LuclinEyeColor, LuclinEyeColor2, LuclinBeardColor, LuclinBeard, DrakkinHeritage, DrakkinTattoo, DrakkinDetails, HP, Mana, MR, CR, DR, FR, PR, Corrup, AC, STR, STA, DEX, AGI, _INT, WIS, CHA, ATK, BotCreateDate, LastSpawnDate, TotalPlayTime, LastZoneId FROM bots WHERE BotID = '%u'", botID), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT BotOwnerCharacterID, BotSpellsID, Name, LastName, BotLevel, " + "Race, Class, Gender, Size, Face, LuclinHairStyle, LuclinHairColor, " + "LuclinEyeColor, LuclinEyeColor2, LuclinBeardColor, LuclinBeard, " + "DrakkinHeritage, DrakkinTattoo, DrakkinDetails, HP, Mana, MR, CR, " + "DR, FR, PR, Corrup, AC, STR, STA, DEX, AGI, _INT, WIS, CHA, ATK, " + "BotCreateDate, LastSpawnDate, TotalPlayTime, LastZoneId " + "FROM bots WHERE BotID = '%u'", botID); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { *errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -4734,7 +4797,6 @@ Bot* Bot::LoadBot(uint32 botID, std::string* errorMessage) { mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return Result; @@ -4744,12 +4806,14 @@ std::list Bot::GetGroupedBotsByGroupId(uint32 groupId, std::string* erro std::list Result; if(groupId > 0) { - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "select g.mobid as BotID from vwGroups as g join bots as b on g.mobid = b.BotId and g.mobtype = 'B' where g.groupid = %u", groupId), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"select g.mobid as BotID from vwGroups as g join bots as b on g.mobid = b.BotId and g.mobtype = 'B' where g.groupid = %u", groupId); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { *errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -4762,7 +4826,6 @@ std::list Bot::GetGroupedBotsByGroupId(uint32 groupId, std::string* erro mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return Result; @@ -4834,12 +4897,14 @@ std::list Bot::GetBotList(uint32 botOwnerCharacterID, std::st std::list Result; if(botOwnerCharacterID > 0) { - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT BotID, Name, Class, BotLevel, Race FROM bots WHERE BotOwnerCharacterID = '%u'", botOwnerCharacterID), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT BotID, Name, Class, BotLevel, Race FROM bots WHERE BotOwnerCharacterID = '%u'", botOwnerCharacterID); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { *errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -4859,7 +4924,6 @@ std::list Bot::GetBotList(uint32 botOwnerCharacterID, std::st mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return Result; @@ -4868,12 +4932,14 @@ std::list Bot::GetBotList(uint32 botOwnerCharacterID, std::st std::list Bot::ListSpawnedBots(uint32 characterID, std::string* errorMessage) { std::list Result; char ErrBuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; + StringFormat(query,"SELECT bot_name, zone_name FROM botleader WHERE leaderid=%i", characterID); + if(characterID > 0) { - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT bot_name, zone_name FROM botleader WHERE leaderid=%i", characterID), ErrBuf, &DatasetResult)) { + if(!database.RunQuery(query, ErrBuf, &DatasetResult)) { *errorMessage = std::string(ErrBuf); } else { @@ -4894,7 +4960,6 @@ std::list Bot::ListSpawnedBots(uint32 characterID, std::string* mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return Result; @@ -4903,7 +4968,7 @@ std::list Bot::ListSpawnedBots(uint32 characterID, std::string* void Bot::SaveBotGroup(Group* botGroup, std::string botGroupName, std::string* errorMessage) { if(botGroup && !botGroupName.empty()) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; Mob* tempGroupLeader = botGroup->GetLeader(); @@ -4912,7 +4977,9 @@ void Bot::SaveBotGroup(Group* botGroup, std::string botGroupName, std::string* e uint32 botGroupLeaderBotId = tempGroupLeader->CastToBot()->GetBotID(); - if(!database.RunQuery(query, MakeAnyLenString(&query, "INSERT into botgroup (BotGroupLeaderBotId, BotGroupName) values (%u, '%s')", botGroupLeaderBotId, botGroupName.c_str()), errbuf, 0, 0, &botGroupId)) { + StringFormat(query,"INSERT into botgroup (BotGroupLeaderBotId, BotGroupName) values (%u, '%s')", botGroupLeaderBotId, botGroupName.c_str()); + + if(!database.RunQuery(query, errbuf, 0, 0, &botGroupId)) { *errorMessage = std::string(errbuf); } else { @@ -4923,9 +4990,10 @@ void Bot::SaveBotGroup(Group* botGroup, std::string botGroupName, std::string* e if(tempBot && tempBot->IsBot()) { uint32 botGroupMemberBotId = tempBot->CastToBot()->GetBotID(); - safe_delete_array(query); + StringFormat(query, "INSERT into botgroupmembers (BotGroupId, BotId) values (%u, %u)", + botGroupId, botGroupMemberBotId); - if(!database.RunQuery(query, MakeAnyLenString(&query, "INSERT into botgroupmembers (BotGroupId, BotId) values (%u, %u)", botGroupId, botGroupMemberBotId), errbuf)) { + if(!database.RunQuery(query, errbuf)) { *errorMessage = std::string(errbuf); } } @@ -4933,31 +5001,32 @@ void Bot::SaveBotGroup(Group* botGroup, std::string botGroupName, std::string* e } } - safe_delete_array(query); } } } void Bot::DeleteBotGroup(std::string botGroupName, std::string* errorMessage) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; if(!botGroupName.empty()) { uint32 botGroupId = GetBotGroupIdByBotGroupName(botGroupName, errorMessage); if(errorMessage->empty() && botGroupId > 0) { - if(!database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM botgroupmembers WHERE BotGroupId = %u", botGroupId), errbuf)) { + + StringFormat(query, "DELETE FROM botgroupmembers WHERE BotGroupId = %u", botGroupId); + + if(!database.RunQuery(query, errbuf)) { *errorMessage = std::string(errbuf); } else { - safe_delete_array(query); - if(!database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM botgroup WHERE BotGroupId = %u", botGroupId), errbuf)) { + StringFormat(query, "DELETE FROM botgroup WHERE BotGroupId = %u", botGroupId); + + if(!database.RunQuery(query, errbuf)) { *errorMessage = std::string(errbuf); } } - - safe_delete_array(query); } } } @@ -4965,7 +5034,7 @@ void Bot::DeleteBotGroup(std::string botGroupName, std::string* errorMessage) { std::list Bot::LoadBotGroup(std::string botGroupName, std::string* errorMessage) { std::list Result; char ErrBuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; @@ -4973,7 +5042,10 @@ std::list Bot::LoadBotGroup(std::string botGroupName, std::string* err uint32 botGroupId = GetBotGroupIdByBotGroupName(botGroupName, errorMessage); if(botGroupId > 0) { - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "select BotId from botgroupmembers where BotGroupId = %u", botGroupId), ErrBuf, &DatasetResult)) { + + StringFormat(query,"select BotId from botgroupmembers where BotGroupId = %u", botGroupId); + + if(!database.RunQuery(query, ErrBuf, &DatasetResult)) { *errorMessage = std::string(ErrBuf); } else { @@ -4996,7 +5068,6 @@ std::list Bot::LoadBotGroup(std::string botGroupName, std::string* err mysql_free_result(DatasetResult); } - safe_delete_array(Query); } } @@ -5008,11 +5079,13 @@ std::list Bot::GetBotGroupListByBotOwnerCharacterId(uint32 botOwne if(botOwnerCharacterId > 0) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "select BotGroupName, BotGroupLeaderName from vwBotGroups where BotOwnerCharacterId = %u", botOwnerCharacterId), ErrBuf, &DatasetResult)) { + StringFormat(query,"select BotGroupName, BotGroupLeaderName from vwBotGroups where BotOwnerCharacterId = %u", botOwnerCharacterId); + + if(!database.RunQuery(query, ErrBuf, &DatasetResult)) { *errorMessage = std::string(ErrBuf); } else { @@ -5035,7 +5108,6 @@ std::list Bot::GetBotGroupListByBotOwnerCharacterId(uint32 botOwne mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return result; @@ -5045,11 +5117,13 @@ bool Bot::DoesBotGroupNameExist(std::string botGroupName) { bool result = false; if(!botGroupName.empty()) { - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(database.RunQuery(Query, MakeAnyLenString(&Query, "select BotGroupId from vwBotGroups where BotGroupName = '%s'", botGroupName.c_str()), 0, &DatasetResult)) { + StringFormat(query,"select BotGroupId from vwBotGroups where BotGroupName = '%s'", botGroupName.c_str()); + + if(database.RunQuery(query, 0, &DatasetResult)) { uint32 RowCount = mysql_num_rows(DatasetResult); if(RowCount > 0) { @@ -5071,7 +5145,6 @@ bool Bot::DoesBotGroupNameExist(std::string botGroupName) { mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return result; @@ -5082,11 +5155,13 @@ uint32 Bot::CanLoadBotGroup(uint32 botOwnerCharacterId, std::string botGroupName if(botOwnerCharacterId > 0 && !botGroupName.empty()) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "select BotGroupId, BotGroupName from vwBotGroups where BotOwnerCharacterId = %u", botOwnerCharacterId), ErrBuf, &DatasetResult)) { + StringFormat(query,"select BotGroupId, BotGroupName from vwBotGroups where BotOwnerCharacterId = %u", botOwnerCharacterId); + + if(!database.RunQuery(query, ErrBuf, &DatasetResult)) { *errorMessage = std::string(ErrBuf); } else { @@ -5111,7 +5186,6 @@ uint32 Bot::CanLoadBotGroup(uint32 botOwnerCharacterId, std::string botGroupName mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return result; @@ -5122,11 +5196,13 @@ uint32 Bot::GetBotGroupIdByBotGroupName(std::string botGroupName, std::string* e if(!botGroupName.empty()) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "select BotGroupId from vwBotGroups where BotGroupName = '%s'", botGroupName.c_str()), ErrBuf, &DatasetResult)) { + StringFormat(query,"select BotGroupId from vwBotGroups where BotGroupName = '%s'", botGroupName.c_str()); + + if(!database.RunQuery(query, ErrBuf, &DatasetResult)) { *errorMessage = std::string(ErrBuf); } else { @@ -5146,7 +5222,6 @@ uint32 Bot::GetBotGroupIdByBotGroupName(std::string botGroupName, std::string* e mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return result; @@ -5156,11 +5231,13 @@ uint32 Bot::GetBotGroupLeaderIdByBotGroupName(std::string botGroupName) { uint32 result = 0; if(!botGroupName.empty()) { - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(database.RunQuery(Query, MakeAnyLenString(&Query, "select BotGroupLeaderBotId from vwBotGroups where BotGroupName = '%s'", botGroupName.c_str()), 0, &DatasetResult)) { + StringFormat(query,"select BotGroupLeaderBotId from vwBotGroups where BotGroupName = '%s'", botGroupName.c_str()); + + if(database.RunQuery(query, 0, &DatasetResult)) { uint32 RowCount = mysql_num_rows(DatasetResult); if(RowCount > 0) { @@ -5177,7 +5254,6 @@ uint32 Bot::GetBotGroupLeaderIdByBotGroupName(std::string botGroupName) { mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return result; @@ -5188,11 +5264,13 @@ uint32 Bot::AllowedBotSpawns(uint32 botOwnerCharacterID, std::string* errorMessa if(botOwnerCharacterID > 0) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT value FROM quest_globals WHERE name='bot_spawn_limit' and charid=%i", botOwnerCharacterID), ErrBuf, &DatasetResult)) { + StringFormat(query,"SELECT value FROM quest_globals WHERE name='bot_spawn_limit' and charid=%i", botOwnerCharacterID); + + if(database.RunQuery(query, ErrBuf, &DatasetResult)) { if(mysql_num_rows(DatasetResult) == 1) { DataRow = mysql_fetch_row(DatasetResult); if(DataRow) @@ -5204,7 +5282,6 @@ uint32 Bot::AllowedBotSpawns(uint32 botOwnerCharacterID, std::string* errorMessa else *errorMessage = std::string(ErrBuf); - safe_delete_array(Query); } return Result; @@ -5227,11 +5304,13 @@ uint32 Bot::CreatedBotCount(uint32 botOwnerCharacterID, std::string* errorMessag if(botOwnerCharacterID > 0) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT COUNT(BotID) FROM bots WHERE BotOwnerCharacterID=%i", botOwnerCharacterID), ErrBuf, &DatasetResult)) { + StringFormat(query,"SELECT COUNT(BotID) FROM bots WHERE BotOwnerCharacterID=%i", botOwnerCharacterID); + + if(database.RunQuery(query, ErrBuf, &DatasetResult)) { if(mysql_num_rows(DatasetResult) == 1) { DataRow = mysql_fetch_row(DatasetResult); if(DataRow) @@ -5243,7 +5322,6 @@ uint32 Bot::CreatedBotCount(uint32 botOwnerCharacterID, std::string* errorMessag else *errorMessage = std::string(ErrBuf); - safe_delete_array(Query); } return Result; @@ -5254,11 +5332,13 @@ uint32 Bot::GetBotOwnerCharacterID(uint32 botID, std::string* errorMessage) { if(botID > 0) { char ErrBuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT BotOwnerCharacterID FROM bots WHERE BotID = %u", botID), ErrBuf, &DatasetResult)) { + StringFormat(query,"SELECT BotOwnerCharacterID FROM bots WHERE BotID = %u", botID); + + if(database.RunQuery(query, ErrBuf, &DatasetResult)) { if(mysql_num_rows(DatasetResult) == 1) { if(DataRow = mysql_fetch_row(DatasetResult)) Result = atoi(DataRow[0]); @@ -5269,7 +5349,6 @@ uint32 Bot::GetBotOwnerCharacterID(uint32 botID, std::string* errorMessage) { else *errorMessage = std::string(ErrBuf); - safe_delete_array(Query); } return Result; @@ -9248,21 +9327,25 @@ void Bot::SetBotGuildMembership(uint32 botId, uint32 guildid, uint8 rank) { if(botId > 0) { std::string errorMessage; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; if(guildid > 0) { - if(!database.RunQuery(query, MakeAnyLenString(&query, "REPLACE INTO botguildmembers SET char_id = %u, guild_id = %u, rank = %u;", botId, guildid, rank), errbuf)) { + + StringFormat(query,"REPLACE INTO botguildmembers SET char_id = %u, guild_id = %u, rank = %u;", botId, guildid, rank); + + if(!database.RunQuery(query, errbuf)) { errorMessage = std::string(errbuf); } } else { - if(!database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM botguildmembers WHERE char_id = %u;", botId), errbuf)) { + + StringFormat(query, "DELETE FROM botguildmembers WHERE char_id = %u;",botId); + + if(!database.RunQuery(query, errbuf)) { errorMessage = std::string(errbuf); } } - safe_delete_array(query); - if(!errorMessage.empty()) { // TODO: Log this error message to the zone error log } @@ -9272,12 +9355,16 @@ void Bot::SetBotGuildMembership(uint32 botId, uint32 guildid, uint8 rank) { void Bot::LoadGuildMembership(uint32* guildId, uint8* guildRank, std::string* guildName) { if(guildId && guildRank && guildName) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT gm.guild_id, gm.rank, g.name FROM vwGuildMembers AS gm JOIN guilds AS g ON gm.guild_id = g.id WHERE gm.char_id = %u AND gm.mobtype = 'B';", GetBotID()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT gm.guild_id, gm.rank, g.name FROM vwGuildMembers " + "AS gm JOIN guilds AS g ON gm.guild_id = g.id " + "WHERE gm.char_id = %u AND gm.mobtype = 'B';", GetBotID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -9291,7 +9378,6 @@ void Bot::LoadGuildMembership(uint32* guildId, uint8* guildRank, std::string* gu mysql_free_result(DatasetResult); } - safe_delete(Query); if(!errorMessage.empty()) { // TODO: Record this error message to zone error log @@ -12099,15 +12185,19 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { uint32 botid = c->GetTarget()->CastToBot()->GetBotID(); std::string errorMessage; - char* Query = 0; + std::string query; int setslot = atoi(sep->arg[2]); uint8 red = atoi(sep->arg[3]); uint8 green = atoi(sep->arg[4]); uint8 blue = atoi(sep->arg[5]); uint32 setcolor = (red << 16) | (green << 8) | blue; - - if(database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE botinventory SET color = %u WHERE slotID = %i AND botID = %u",setcolor, setslot, botid))){ + + StringFormat(query,"UPDATE botinventory SET color = %u " + "WHERE slotID = %i AND botID = %u", + setcolor, setslot, botid); + + if(database.RunQuery(query)){ int slotmaterial = Inventory::CalcMaterialFromSlot(setslot); c->GetTarget()->CastToBot()->SendWearChange(slotmaterial); } @@ -12120,7 +12210,6 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { // Help for coloring bot armor if(!strcasecmp(sep->arg[1], "help") && !strcasecmp(sep->arg[2], "armorcolor") ){ //read from db - char* Query = 0; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; @@ -16856,18 +16945,21 @@ uint32 Bot::GetEquipmentColor(uint8 material_slot) const slotid = Inventory::CalcSlotFromMaterial(material_slot); //read from db - char* Query = 0; + std::string query; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - - if(database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT color FROM botinventory WHERE BotID = %u AND SlotID = %u", botid, slotid), 0, &DatasetResult)) { + + StringFormat(query,"SELECT color FROM botinventory " + "WHERE BotID = %u AND SlotID = %u", + botid, slotid); + + if(database.RunQuery(query, nullptr, &DatasetResult)) { if(mysql_num_rows(DatasetResult) == 1) { DataRow = mysql_fetch_row(DatasetResult); if(DataRow) returncolor = atoul(DataRow[0]); } mysql_free_result(DatasetResult); - safe_delete_array(Query); } return returncolor; } diff --git a/zone/client.cpp b/zone/client.cpp index cacc19ab2..c8e3a0831 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -599,13 +599,17 @@ bool Client::Save(uint8 iCommitNow) { SaveTaskState(); if (iCommitNow <= 1) { - char* query = 0; + std::string query; uint32_breakdown workpt; workpt.b4() = DBA_b4_Entity; workpt.w2_3() = GetID(); workpt.b1() = DBA_b1_Entity_Client_Save; DBAsyncWork* dbaw = new DBAsyncWork(&database, &MTdbafq, workpt, DBAsync::Write, 0xFFFFFFFF); - dbaw->AddQuery(iCommitNow == 0 ? true : false, &query, database.SetPlayerProfile_MQ(&query, account_id, character_id, &m_pp, &m_inv, &m_epp, 0, 0, MaxXTargets), false); + + + database.SetPlayerProfile_MQ(query, account_id, character_id, &m_pp, &m_inv, &m_epp, 0, 0, MaxXTargets); + + dbaw->AddQuery(iCommitNow == 0 ? true : false, query, false); if (iCommitNow == 0){ pQueuedSaveWorkID = dbasync->AddWork(&dbaw, 2500); } @@ -613,7 +617,6 @@ bool Client::Save(uint8 iCommitNow) { dbasync->AddWork(&dbaw, 0); SaveBackup(); } - safe_delete_array(query); return true; } else if (database.SetPlayerProfile(account_id, character_id, &m_pp, &m_inv, &m_epp, 0, 0, MaxXTargets)) { @@ -630,9 +633,14 @@ bool Client::Save(uint8 iCommitNow) { void Client::SaveBackup() { if (!RunLoops) return; - char* query = 0; + std::string query; DBAsyncWork* dbaw = new DBAsyncWork(&database, &DBAsyncCB_CharacterBackup, this->CharacterID(), DBAsync::Read); - dbaw->AddQuery(0, &query, MakeAnyLenString(&query, "Select id, UNIX_TIMESTAMP()-UNIX_TIMESTAMP(ts) as age from character_backup where charid=%u and backupreason=0 order by ts asc", this->CharacterID()), true); + + StringFormat(query,"Select id, UNIX_TIMESTAMP()-UNIX_TIMESTAMP(ts) as age " + "from character_backup where charid=%u and backupreason=0 " + "order by ts asc", this->CharacterID()); + + dbaw->AddQuery(0, query, true); dbasync->AddWork(&dbaw, 0); } @@ -3849,22 +3857,20 @@ void Client::SendWindow(uint32 PopupID, uint32 NegativeID, uint32 Buttons, const void Client::KeyRingLoad() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; MYSQL_RES *result; MYSQL_ROW row; - query = new char[256]; - - sprintf(query, "SELECT item_id FROM keyring WHERE char_id='%i' ORDER BY item_id",character_id); - if (database.RunQuery(query, strlen(query), errbuf, &result)) + + std::string query; + StringFormat(query, "SELECT item_id FROM keyring WHERE char_id='%i' ORDER BY item_id",character_id); + + if (database.RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while(0 != (row = mysql_fetch_row(result))){ keyring.push_back(atoi(row[0])); } mysql_free_result(result); }else { std::cerr << "Error in Client::KeyRingLoad query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return; } } @@ -3873,21 +3879,21 @@ void Client::KeyRingAdd(uint32 item_id) { if(0==item_id)return; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; uint32 affected_rows = 0; - query = new char[256]; + std::string query; bool bFound = KeyRingCheck(item_id); if(!bFound){ - sprintf(query, "INSERT INTO keyring(char_id,item_id) VALUES(%i,%i)",character_id,item_id); - if(database.RunQuery(query, strlen(query), errbuf, 0, &affected_rows)) + + StringFormat(query, "INSERT INTO keyring(char_id,item_id) VALUES(%i,%i)", + character_id, item_id); + + if(database.RunQuery(query, errbuf, 0, &affected_rows)) { Message(4,"Added to keyring."); - safe_delete_array(query); } else { std::cerr << "Error in Doors::HandleClick query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return; } keyring.push_back(item_id); @@ -3923,17 +3929,18 @@ void Client::KeyRingList() bool Client::IsDiscovered(uint32 itemid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT count(*) FROM discovered_items WHERE item_id = '%lu'", itemid), errbuf, &result)) + StringFormat(query,"SELECT count(*) FROM discovered_items WHERE item_id = '%lu'", itemid); + + if (database.RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if (atoi(row[0])) { mysql_free_result(result); - safe_delete_array(query); return true; } } @@ -3942,20 +3949,24 @@ bool Client::IsDiscovered(uint32 itemid) { std::cerr << "Error in IsDiscovered query '" << query << "' " << errbuf << std::endl; } mysql_free_result(result); - safe_delete_array(query); return false; } void Client::DiscoverItem(uint32 itemid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "INSERT INTO discovered_items SET item_id=%lu, char_name='%s', discovered_date=UNIX_TIMESTAMP(), account_status=%i", itemid, GetName(), Admin()), errbuf, &result)) + + StringFormat(query,"INSERT INTO discovered_items SET " + "item_id=%lu, char_name='%s', " + "discovered_date=UNIX_TIMESTAMP(), account_status=%i", + itemid, GetName(), Admin()); + + if (database.RunQuery(query, errbuf, &result)) { mysql_free_result(result); } - safe_delete_array(query); parse->EventPlayer(EVENT_DISCOVER_ITEM, this, "", itemid); } @@ -5099,13 +5110,16 @@ void Client::SendRewards() { std::vector rewards; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT reward_id, amount FROM" - " account_rewards WHERE account_id=%i ORDER by reward_id", AccountID()), - errbuf,&result)) + StringFormat(query, "SELECT reward_id, amount FROM" + " account_rewards WHERE account_id=%i " + "ORDER by reward_id", + AccountID()); + + if(database.RunQuery(query,errbuf,&result)) { while((row = mysql_fetch_row(result))) { @@ -5115,12 +5129,10 @@ void Client::SendRewards() rewards.push_back(cr); } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, "Error in Client::SendRewards(): %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Client::SendRewards(): %s (%s)", query.c_str(), errbuf); return; } @@ -5188,14 +5200,18 @@ bool Client::TryReward(uint32 claim_id) } char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 amt = 0; - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT amount FROM" - " account_rewards WHERE account_id=%i AND reward_id=%i", AccountID(), claim_id), - errbuf,&result)) + + StringFormat(query, "SELECT amount FROM" + " account_rewards WHERE " + "account_id=%i AND reward_id=%i", + AccountID(), claim_id); + + if(database.RunQuery(query,errbuf,&result)) { row = mysql_fetch_row(result); if(row) @@ -5205,16 +5221,13 @@ bool Client::TryReward(uint32 claim_id) else { mysql_free_result(result); - safe_delete_array(query); return false; } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, "Error in Client::TryReward(): %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Client::TryReward(): %s (%s)", query.c_str(), errbuf); return false; } @@ -5240,30 +5253,24 @@ bool Client::TryReward(uint32 claim_id) if(amt == 1) { - if(!database.RunQuery(query,MakeAnyLenString(&query,"DELETE FROM" - " account_rewards WHERE account_id=%i AND reward_id=%i", AccountID(), claim_id), - errbuf)) + StringFormat(query, "DELETE FROM account_rewards WHERE " + "account_id=%i AND reward_id=%i", + AccountID(), claim_id); + + if(!database.RunQuery(query, errbuf)) { - LogFile->write(EQEMuLog::Error, "Error in Client::TryReward(): %s (%s)", query, errbuf); - safe_delete_array(query); - } - else - { - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Client::TryReward(): %s (%s)", query.c_str(), errbuf); } } else { - if(!database.RunQuery(query,MakeAnyLenString(&query,"UPDATE account_rewards SET amount=(amount-1)" - " WHERE account_id=%i AND reward_id=%i", AccountID(), claim_id), - errbuf)) + StringFormat(query,"UPDATE account_rewards SET amount=(amount-1)" + " WHERE account_id=%i AND reward_id=%i", + AccountID(), claim_id); + + if(!database.RunQuery(query,errbuf)) { - LogFile->write(EQEMuLog::Error, "Error in Client::TryReward(): %s (%s)", query, errbuf); - safe_delete_array(query); - } - else - { - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Client::TryReward(): %s (%s)", query.c_str(), errbuf); } } @@ -7630,107 +7637,112 @@ some day. void Client::LoadAccountFlags() { - char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - MYSQL_RES *result; - MYSQL_ROW row; + char errbuf[MYSQL_ERRMSG_SIZE]; + std::string query; + MYSQL_RES *result; + MYSQL_ROW row; - accountflags.clear(); - MakeAnyLenString(&query, "SELECT p_flag, p_value FROM account_flags WHERE p_accid = '%d'", account_id); - if(database.RunQuery(query, strlen(query), errbuf, &result)) - { - while(row = mysql_fetch_row(result)) - { - std::string fname(row[0]); - std::string fval(row[1]); - accountflags[fname] = fval; - } - mysql_free_result(result); - } - else - { - std::cerr << "Error in LoadAccountFlags query '" << query << "' " << errbuf << std::endl; - } - safe_delete_array(query); + accountflags.clear(); + + StringFormat(query,"SELECT p_flag, p_value FROM " + "account_flags WHERE p_accid = '%d'", + account_id); + + if(database.RunQuery(query, errbuf, &result)) + { + while(row = mysql_fetch_row(result)) + { + std::string fname(row[0]); + std::string fval(row[1]); + accountflags[fname] = fval; + } + mysql_free_result(result); + } + else + { + std::cerr << "Error in LoadAccountFlags query '" << query << "' " << errbuf << std::endl; + } } void Client::SetAccountFlag(std::string flag, std::string val) { - char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + char errbuf[MYSQL_ERRMSG_SIZE]; + std::string query; + + StringFormat(query, "REPLACE INTO account_flags (p_accid, p_flag, p_value) " + "VALUES( '%d', '%s', '%s')", + account_id, flag.c_str(), val.c_str()); + + if(!database.RunQuery(query, errbuf)) + { + std::cerr << "Error in SetAccountFlags query '" << query << "' " << errbuf << std::endl; + } - MakeAnyLenString(&query, "REPLACE INTO account_flags (p_accid, p_flag, p_value) VALUES( '%d', '%s', '%s')", account_id, flag.c_str(), val.c_str()); - if(!database.RunQuery(query, strlen(query), errbuf)) - { - std::cerr << "Error in SetAccountFlags query '" << query << "' " << errbuf << std::endl; - } - safe_delete_array(query); - - accountflags[flag] = val; + accountflags[flag] = val; } std::string Client::GetAccountFlag(std::string flag) { - return(accountflags[flag]); + return(accountflags[flag]); } void Client::TickItemCheck() { - int i; + int i; if(zone->tick_items.empty()) { return; } - //Scan equip slots for items - for(i = 0; i <= 21; i++) - { + //Scan equip slots for items + for(i = 0; i <= 21; i++) + { TryItemTick(i); - } - //Scan main inventory + cursor - for(i = 22; i < 31; i++) - { + } + //Scan main inventory + cursor + for(i = 22; i < 31; i++) + { TryItemTick(i); - } - //Scan bags - for(i = 251; i < 340; i++) - { + } + //Scan bags + for(i = 251; i < 340; i++) + { TryItemTick(i); - } + } } void Client::TryItemTick(int slot) { int iid = 0; - const ItemInst* inst = m_inv[slot]; - if(inst == 0) { return; } + const ItemInst* inst = m_inv[slot]; + if(inst == 0) { return; } - iid = inst->GetID(); + iid = inst->GetID(); - if(zone->tick_items.count(iid) > 0) - { - if( GetLevel() >= zone->tick_items[iid].level && MakeRandomInt(0, 100) >= (100 - zone->tick_items[iid].chance) && (zone->tick_items[iid].bagslot || slot < 22) ) - { - ItemInst* e_inst = (ItemInst*)inst; - parse->EventItem(EVENT_ITEM_TICK, this, e_inst, e_inst->GetID(), slot); - } - } + if(zone->tick_items.count(iid) > 0) + { + if( GetLevel() >= zone->tick_items[iid].level && MakeRandomInt(0, 100) >= (100 - zone->tick_items[iid].chance) && (zone->tick_items[iid].bagslot || slot < 22) ) + { + ItemInst* e_inst = (ItemInst*)inst; + parse->EventItem(EVENT_ITEM_TICK, this, e_inst, e_inst->GetID(), slot); + } + } //Only look at augs in main inventory if(slot > 21) { return; } - for(int x = 0; x < MAX_AUGMENT_SLOTS; ++x) - { - ItemInst * a_inst = inst->GetAugment(x); - if(!a_inst) { continue; } + for(int x = 0; x < MAX_AUGMENT_SLOTS; ++x) + { + ItemInst * a_inst = inst->GetAugment(x); + if(!a_inst) { continue; } - iid = a_inst->GetID(); + iid = a_inst->GetID(); - if(zone->tick_items.count(iid) > 0) - { - if( GetLevel() >= zone->tick_items[iid].level && MakeRandomInt(0, 100) >= (100 - zone->tick_items[iid].chance) ) - { - ItemInst* e_inst = (ItemInst*)a_inst; - parse->EventItem(EVENT_ITEM_TICK, this, e_inst, e_inst->GetID(), slot); - } - } - } + if(zone->tick_items.count(iid) > 0) + { + if( GetLevel() >= zone->tick_items[iid].level && MakeRandomInt(0, 100) >= (100 - zone->tick_items[iid].chance) ) + { + ItemInst* e_inst = (ItemInst*)a_inst; + parse->EventItem(EVENT_ITEM_TICK, this, e_inst, e_inst->GetID(), slot); + } + } + } } diff --git a/zone/client.h b/zone/client.h index 2a51bdca2..c8da22129 100644 --- a/zone/client.h +++ b/zone/client.h @@ -659,7 +659,7 @@ public: inline uint16 MaxSkill(SkillType skillid) const { return MaxSkill(skillid, GetClass(), GetLevel()); } uint8 SkillTrainLevel(SkillType skillid, uint16 class_); - void TradeskillSearchResults(const char *query, unsigned long qlen, unsigned long objtype, unsigned long someid); + void TradeskillSearchResults(const std::string query, unsigned long qlen, unsigned long objtype, unsigned long someid); void SendTradeskillDetails(uint32 recipe_id); bool TradeskillExecute(DBTradeskillRecipe_Struct *spec); void CheckIncreaseTradeskill(int16 bonusstat, int16 stat_modifier, float skillup_modifier, uint16 success_modifier, SkillType tradeskill); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 133f5caa6..993de83a8 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -537,23 +537,37 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) client->Disconnect(); } - char* query = 0; + uint32_breakdown workpt; workpt.b4() = DBA_b4_Entity; workpt.w2_3() = GetID(); workpt.b1() = DBA_b1_Entity_Client_InfoForLogin; DBAsyncWork* dbaw = new DBAsyncWork(&database, &MTdbafq, workpt, DBAsync::Read); - dbaw->AddQuery(1, &query, MakeAnyLenString(&query, - "SELECT status,name,lsaccount_id,gmspeed,revoked,hideme,time_creation FROM account WHERE id=%i", - account_id)); + + std::string accountQuery; + StringFormat(accountQuery,"SELECT status, name, lsaccount_id, gmspeed, " + "revoked, hideme, time_creation FROM account " + "WHERE id=%i", account_id); + + dbaw->AddQuery(1, accountQuery); + //DO NOT FORGET TO EDIT ZoneDatabase::GetCharacterInfoForLogin if you change this - dbaw->AddQuery(2, &query, MakeAnyLenString(&query, - "SELECT id,profile,zonename,x,y,z,guild_id,rank,extprofile,class,level,lfp,lfg,instanceid,xtargets,firstlogon" - " FROM character_ LEFT JOIN guild_members ON id=char_id WHERE id=%i", - character_id)); - dbaw->AddQuery(3, &query, MakeAnyLenString(&query, - "SELECT faction_id,current_value FROM faction_values WHERE temp = 0 AND char_id = %i", - character_id)); + std::string characterInfoQuery; + StringFormat(characterInfoQuery,"SELECT id, profile, zonename, x, y, z, " + "guild_id, rank, extprofile, class, " + "level, lfp, lfg, instanceid, xtargets, " + "firstlogon FROM character_ LEFT JOIN " + "guild_members ON id=char_id WHERE id=%i", + character_id); + + dbaw->AddQuery(2, characterInfoQuery); + + std::string characterFactionQuery; + StringFormat(characterFactionQuery, "SELECT faction_id,current_value FROM " + "faction_values WHERE temp = 0 AND " + "char_id = %i", character_id); + + dbaw->AddQuery(3, characterFactionQuery); if (!(pDBAsyncWorkID = dbasync->AddWork(&dbaw))) { safe_delete(dbaw); LogFile->write(EQEMuLog::Error,"dbasync->AddWork() returned false, client crash"); @@ -2070,28 +2084,28 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app) } } - int r; - bool tryaug = false; - ItemInst* clickaug = 0; - Item_Struct* augitem = 0; + int r; + bool tryaug = false; + ItemInst* clickaug = 0; + Item_Struct* augitem = 0; - for(r = 0; r < MAX_AUGMENT_SLOTS; r++) { - const ItemInst* aug_i = inst->GetAugment(r); - if(!aug_i) - continue; - const Item_Struct* aug = aug_i->GetItem(); - if(!aug) - continue; + for(r = 0; r < MAX_AUGMENT_SLOTS; r++) { + const ItemInst* aug_i = inst->GetAugment(r); + if(!aug_i) + continue; + const Item_Struct* aug = aug_i->GetItem(); + if(!aug) + continue; - if ( (aug->Click.Type == ET_ClickEffect) || (aug->Click.Type == ET_Expendable) || (aug->Click.Type == ET_EquipClick) || (aug->Click.Type == ET_ClickEffect2) ) - { - tryaug = true; - clickaug = (ItemInst*)aug_i; - augitem = (Item_Struct*)aug; - spell_id = aug->Click.Effect; - break; - } - } + if ( (aug->Click.Type == ET_ClickEffect) || (aug->Click.Type == ET_Expendable) || (aug->Click.Type == ET_EquipClick) || (aug->Click.Type == ET_ClickEffect2) ) + { + tryaug = true; + clickaug = (ItemInst*)aug_i; + augitem = (Item_Struct*)aug; + spell_id = aug->Click.Effect; + break; + } + } if((spell_id <= 0) && (item->ItemType != ItemTypeFood && item->ItemType != ItemTypeDrink && item->ItemType != ItemTypeAlcohol && item->ItemType != ItemTypeSpell)) { @@ -2140,39 +2154,39 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app) return; } } - else if (tryaug) - { - if (clickaug->GetCharges() == 0) - { - //Message(0, "This item is out of charges."); - Message_StringID(13, ITEM_OUT_OF_CHARGES); - return; - } - if(GetLevel() >= augitem->Click.Level2) - { - if(parse->ItemHasQuestSub(clickaug, "EVENT_ITEM_CLICK_CAST")) - { - //TODO: need to enforce and set recast timers here because the spell may not be cast. - parse->EventItem(EVENT_ITEM_CLICK_CAST, this, clickaug, clickaug->GetID(), slot_id); - inst = m_inv[slot_id]; - if (!inst) - { - // Item was deleted by the perl event - return; - } - } - else - { - //We assume augs aren't consumable - CastSpell(augitem->Click.Effect, target_id, 10, augitem->CastTime, 0, 0, slot_id); - } - } - else - { - Message_StringID(13, ITEMS_INSUFFICIENT_LEVEL); - return; - } - } + else if (tryaug) + { + if (clickaug->GetCharges() == 0) + { + //Message(0, "This item is out of charges."); + Message_StringID(13, ITEM_OUT_OF_CHARGES); + return; + } + if(GetLevel() >= augitem->Click.Level2) + { + if(parse->ItemHasQuestSub(clickaug, "EVENT_ITEM_CLICK_CAST")) + { + //TODO: need to enforce and set recast timers here because the spell may not be cast. + parse->EventItem(EVENT_ITEM_CLICK_CAST, this, clickaug, clickaug->GetID(), slot_id); + inst = m_inv[slot_id]; + if (!inst) + { + // Item was deleted by the perl event + return; + } + } + else + { + //We assume augs aren't consumable + CastSpell(augitem->Click.Effect, target_id, 10, augitem->CastTime, 0, 0, slot_id); + } + } + else + { + Message_StringID(13, ITEMS_INSUFFICIENT_LEVEL); + return; + } + } else { if(GetClientVersion() >= EQClientSoD && !inst->IsEquipable(GetBaseRace(),GetClass())) @@ -3227,12 +3241,13 @@ void Client::Handle_OP_ItemLinkClick(const EQApplicationPacket *app) if (sayid && sayid > 0) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT `phrase` FROM saylink WHERE `id` = '%i'", sayid),errbuf,&result)) + StringFormat(query, "SELECT `phrase` FROM saylink WHERE `id` = '%i'", sayid); + + if(database.RunQuery(query,errbuf,&result)) { if (mysql_num_rows(result) == 1) { @@ -3244,10 +3259,8 @@ void Client::Handle_OP_ItemLinkClick(const EQApplicationPacket *app) else { Message(13, "Error: The saylink (%s) was not found in the database.",response.c_str()); - safe_delete_array(query); return; } - safe_delete_array(query); } if((response).size() > 0) @@ -6159,35 +6172,34 @@ void Client::Handle_OP_RecipesSearch(const EQApplicationPacket *app) snprintf(containers,29, "in (%u,%u)", rss->object_type, rss->some_id); } - char *query = 0; + std::string query; char searchclause[140]; //2X rss->query + SQL crap //omit the rlike clause if query is empty if(rss->query[0] != 0) { - char buf[120]; //larger than 2X rss->query + std::string buf; //larger than 2X rss->query database.DoEscapeString(buf, rss->query, strlen(rss->query)); - snprintf(searchclause, 139, "name rlike '%s' AND", buf); + snprintf(searchclause, 139, "name rlike '%s' AND", buf.c_str()); } else { searchclause[0] = '\0'; } - uint32 qlen = 0; //arbitrary limit of 200 recipes, makes sense to me. - qlen = MakeAnyLenString(&query, "SELECT tr.id,tr.name,tr.trivial,SUM(tre.componentcount),crl.madecount,tr.tradeskill " - " FROM tradeskill_recipe AS tr " - " LEFT JOIN tradeskill_recipe_entries AS tre ON tr.id=tre.recipe_id " - " LEFT JOIN (SELECT recipe_id, madecount FROM char_recipe_list WHERE char_id = %u) AS crl ON tr.id=crl.recipe_id " - " WHERE %s tr.trivial >= %u AND tr.trivial <= %u " - " AND tr.must_learn & 0x20 <> 0x20 AND((tr.must_learn & 0x3 <> 0 AND crl.madecount IS NOT NULL) OR (tr.must_learn & 0x3 = 0)) " - " GROUP BY tr.id " - " HAVING sum(if(tre.item_id %s AND tre.iscontainer > 0,1,0)) > 0 " - " LIMIT 200 " - , CharacterID(), searchclause, rss->mintrivial, rss->maxtrivial, containers); + + StringFormat(query,"SELECT tr.id,tr.name,tr.trivial,SUM(tre.componentcount),crl.madecount,tr.tradeskill " + "FROM tradeskill_recipe AS tr " + "LEFT JOIN tradeskill_recipe_entries AS tre ON tr.id=tre.recipe_id " + "LEFT JOIN (SELECT recipe_id, madecount FROM char_recipe_list WHERE char_id = %u) AS crl ON tr.id=crl.recipe_id " + "WHERE %s tr.trivial >= %u AND tr.trivial <= %u " + "AND tr.must_learn & 0x20 <> 0x20 AND((tr.must_learn & 0x3 <> 0 AND crl.madecount IS NOT NULL) OR (tr.must_learn & 0x3 = 0)) " + "GROUP BY tr.id " + "HAVING sum(if(tre.item_id %s AND tre.iscontainer > 0,1,0)) > 0 " + "LIMIT 200 ", + CharacterID(), searchclause, rss->mintrivial, rss->maxtrivial, containers); - TradeskillSearchResults(query, qlen, rss->object_type, rss->some_id); + TradeskillSearchResults(query, query.length(), rss->object_type, rss->some_id); - safe_delete_array(query); return; } @@ -11508,7 +11520,7 @@ void Client::Handle_OP_SetStartCity(const EQApplicationPacket *app) } char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result = nullptr; MYSQL_ROW row = 0; float x(0),y(0),z(0); @@ -11516,22 +11528,12 @@ void Client::Handle_OP_SetStartCity(const EQApplicationPacket *app) uint32 StartCity = (uint32)strtol((const char*)app->pBuffer, nullptr, 10); bool ValidCity = false; - database.RunQuery - ( - query, - MakeAnyLenString - ( - &query, - "SELECT zone_id, bind_id, x, y, z FROM start_zones " - "WHERE player_class=%i AND player_deity=%i AND player_race=%i", - m_pp.class_, - m_pp.deity, - m_pp.race - ), - errbuf, - &result - ); - safe_delete_array(query); + + StringFormat(query,"SELECT zone_id, bind_id, x, y, z FROM start_zones " + "WHERE player_class=%i AND player_deity=%i AND player_race=%i", + m_pp.class_, m_pp.deity, m_pp.race); + + database.RunQuery(query, errbuf, &result); if(!result) { LogFile->write(EQEMuLog::Error, "No valid start zones found for /setstartcity"); @@ -11557,22 +11559,13 @@ void Client::Handle_OP_SetStartCity(const EQApplicationPacket *app) SetStartZone(StartCity, x, y, z); } else { - database.RunQuery - ( - query, - MakeAnyLenString - ( - &query, - "SELECT zone_id, bind_id FROM start_zones " - "WHERE player_class=%i AND player_deity=%i AND player_race=%i", - m_pp.class_, - m_pp.deity, - m_pp.race - ), - errbuf, - &result - ); - safe_delete_array(query); + + StringFormat(query, "SELECT zone_id, bind_id FROM start_zones " + "WHERE player_class=%i AND player_deity=%i AND player_race=%i", + m_pp.class_, m_pp.deity, m_pp.race); + + database.RunQuery(query,errbuf,&result); + Message(15,"Use \"/startcity #\" to choose a home city from the following list:"); char* name; while(row = mysql_fetch_row(result)) { @@ -11706,17 +11699,19 @@ void Client::Handle_OP_GMSearchCorpse(const EQApplicationPacket *app) GMSearchCorpse_Struct *gmscs = (GMSearchCorpse_Struct *)app->pBuffer; char errbuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; MYSQL_RES *Result; MYSQL_ROW Row; - char *EscSearchString = new char[129]; + std::string escSearchString; - database.DoEscapeString(EscSearchString, gmscs->Name, strlen(gmscs->Name)); - - if (database.RunQuery(Query, MakeAnyLenString(&Query, "select charname, zoneid, x, y, z, timeofdeath, rezzed, IsBurried from " - "player_corpses where charname like '%%%s%%' order by charname limit %i", - EscSearchString, MaxResults), errbuf, &Result)) + database.DoEscapeString(escSearchString, gmscs->Name, strlen(gmscs->Name)); + + StringFormat(query, "select charname, zoneid, x, y, z, timeofdeath, rezzed, IsBurried from " + "player_corpses where charname like '%%%s%%' order by charname limit %i", + escSearchString.c_str(), MaxResults); + + if (database.RunQuery(query, errbuf, &Result)) { int NumberOfRows = mysql_num_rows(Result); @@ -11731,7 +11726,6 @@ void Client::Handle_OP_GMSearchCorpse(const EQApplicationPacket *app) if(NumberOfRows == 0) { mysql_free_result(Result); - safe_delete_array(Query); return; } @@ -11782,8 +11776,6 @@ void Client::Handle_OP_GMSearchCorpse(const EQApplicationPacket *app) Message(0, "Query failed: %s.", errbuf); } - safe_delete_array(Query); - safe_delete_array(EscSearchString); } void Client::Handle_OP_GuildBank(const EQApplicationPacket *app) diff --git a/zone/command.cpp b/zone/command.cpp index b08fe3104..2db268e61 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -952,11 +952,14 @@ void command_setfaction(Client *c, const Seperator *sep) else { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"Setting NPC %u to faction %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->argplus[1])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set npc_faction_id=%i where id=%i",atoi(sep->argplus[1]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set npc_faction_id=%i where id=%i", + atoi(sep->argplus[1]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } } @@ -1646,12 +1649,15 @@ void command_viewpetition(Client *c, const Seperator *sep) else { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + int queryfound = 0; MYSQL_RES *result; MYSQL_ROW row; c->Message(13," ID : Character Name , Petition Text"); - if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT petid, charname, petitiontext from petitions order by petid"), errbuf, &result)) + + std::string query = "SELECT petid, charname, petitiontext from petitions order by petid"; + + if (database.RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { @@ -1666,7 +1672,6 @@ void command_viewpetition(Client *c, const Seperator *sep) c->Message(13,"There was an error in your request: ID not found! Please check the Id and try again."); mysql_free_result(result); } - safe_delete_array(query); } } @@ -1677,12 +1682,13 @@ void command_petitioninfo(Client *c, const Seperator *sep) else { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; int queryfound = 0; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT petid, charname, accountname, zone, charclass, charrace, charlevel from petitions order by petid"), errbuf, &result)) + std::string query = "SELECT petid, charname, accountname, zone, charclass, charrace, charlevel from petitions order by petid"; + + if (database.RunQuery(query,errbuf, &result)) { while ((row = mysql_fetch_row(result))) if (strcasecmp(row[0],sep->argplus[1])== 0) @@ -1695,7 +1701,6 @@ void command_petitioninfo(Client *c, const Seperator *sep) c->Message(13,"There was an error in your request: ID not found! Please check the Id and try again."); mysql_free_result(result); } - safe_delete_array(query); } } @@ -1705,12 +1710,14 @@ void command_delpetition(Client *c, const Seperator *sep) c->Message(0, "Usage: #delpetition (petition number) Type #listpetition for a list"); else { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(13,"Attempting to delete petition number: %i",atoi(sep->argplus[1])); - if (database.RunQuery(query, MakeAnyLenString(&query, "DELETE from petitions where petid=%i",atoi(sep->argplus[1])), errbuf)) { + + StringFormat(query,"DELETE from petitions where petid=%i",atoi(sep->argplus[1])); + + if (database.RunQuery(query,errbuf)) { LogFile->write(EQEMuLog::Normal,"Delete petition request from %s, petition number:", c->GetName(), atoi(sep->argplus[1]) ); } - safe_delete_array(query); } } @@ -2899,7 +2906,7 @@ void command_appearance(Client *c, const Seperator *sep) void command_charbackup(Client *c, const Seperator *sep) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES* result; MYSQL_ROW row; if (strcasecmp(sep->arg[1], "list") == 0) { @@ -2909,10 +2916,12 @@ void command_charbackup(Client *c, const Seperator *sep) else database.GetAccountIDByChar(sep->arg[2], &charid); if (charid) { - if (database.RunQuery(query, MakeAnyLenString(&query, - "Select id, backupreason, charid, account_id, zoneid, DATE_FORMAT(ts, '%%m/%%d/%%Y %%H:%%i:%%s') " - " from character_backup where charid=%u", charid), errbuf, &result)) { - safe_delete(query); + + StringFormat(query, "Select id, backupreason, charid, account_id, " + "zoneid, DATE_FORMAT(ts, '%%m/%%d/%%Y %%H:%%i:%%s') " + " from character_backup where charid=%u", charid); + + if (database.RunQuery(query, errbuf, &result)) { uint32 x = 0; while ((row = mysql_fetch_row(result))) { c->Message(0, " %u: %s, %s (%u), reason=%u", atoi(row[0]), row[5], database.GetZoneName(atoi(row[4])), atoi(row[4]), atoi(row[1])); @@ -2922,8 +2931,7 @@ void command_charbackup(Client *c, const Seperator *sep) mysql_free_result(result); } else { - c->Message(13, "Query error: '%s' %s", query, errbuf); - safe_delete(query); + c->Message(13, "Query error: '%s' %s", query.c_str(), errbuf); } } else @@ -2938,31 +2946,34 @@ void command_charbackup(Client *c, const Seperator *sep) if (charid && sep->IsNumber(3)) { uint32 cbid = atoi(sep->arg[3]); - if (database.RunQuery(query, MakeAnyLenString(&query, - "Insert into character_backup (backupreason, charid, account_id, name, profile, level, class, x, y, z, zoneid, alt_adv) " - " select 1, id, account_id, name, profile, level, class, x, y, z, zoneid, alt_adv from character_ where id=%u", charid), errbuf)) { - if (database.RunQuery(query, MakeAnyLenString(&query, - "update character_ inner join character_backup on character_.id = character_backup.charid " - " set character_.name = character_backup.name, " - " character_.profile = character_backup.profile, " - " character_.level = character_backup.level, " - " character_.class = character_backup.class, " - " character_.x = character_backup.x, " - " character_.y = character_backup.y, " - " character_.z = character_backup.z, " - " character_.zoneid = character_backup.zoneid " - " where character_backup.charid=%u and character_backup.id=%u", charid, cbid), errbuf)) { - safe_delete(query); + + StringFormat(query, "Insert into character_backup (backupreason, charid, account_id, name, " + "profile, level, class, x, y, z, zoneid, alt_adv) " + " select 1, id, account_id, name, profile, level, class, x, y, z, zoneid, " + "alt_adv from character_ where id=%u", charid); + + if (database.RunQuery(query, errbuf)) { + + StringFormat(query, "update character_ inner join character_backup on character_.id = character_backup.charid " + " set character_.name = character_backup.name, " + " character_.profile = character_backup.profile, " + " character_.level = character_backup.level, " + " character_.class = character_backup.class, " + " character_.x = character_backup.x, " + " character_.y = character_backup.y, " + " character_.z = character_backup.z, " + " character_.zoneid = character_backup.zoneid " + " where character_backup.charid=%u and character_backup.id=%u", charid, cbid); + + if (database.RunQuery(query, errbuf)) { c->Message(0, "Character restored."); } else { - c->Message(13, "Query error: '%s' %s", query, errbuf); - safe_delete(query); + c->Message(13, "Query error: '%s' %s", query.c_str(), errbuf); } } else { - c->Message(13, "Query error: '%s' %s", query, errbuf); - safe_delete(query); + c->Message(13, "Query error: '%s' %s", query.c_str(), errbuf); } } else @@ -3319,25 +3330,29 @@ void command_findnpctype(Client *c, const Seperator *sep) int count; const int maxrows = 20; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - query = new char[256]; // If id evaluates to 0, then search as if user entered a string. - if ((id = atoi((const char *)sep->arg[1])) == 0) - MakeAnyLenString(&query, - "SELECT id,name" - " FROM npc_types WHERE name LIKE '%%%s%%'", - sep->arg[1]); + if ((id = atoi((const char *)sep->arg[1])) == 0) { + + StringFormat(query, "SELECT id,name " + "FROM npc_types " + "WHERE name LIKE '%%%s%%'", + sep->arg[1]); + // Otherwise, look for just that npc id. - else - MakeAnyLenString(&query, - "SELECT id,name FROM npc_types WHERE id=%i", id); - + } + else { + StringFormat(query, "SELECT id, name " + "FROM npc_types WHERE id=%i", + id); + + } // If query runs successfully. - if (database.RunQuery(query, strlen(query), errbuf, &result)) + if (database.RunQuery(query, errbuf, &result)) { count = 0; @@ -3367,10 +3382,9 @@ void command_findnpctype(Client *c, const Seperator *sep) else { c->Message (0, "Error querying database."); - c->Message (0, query); + c->Message (0, query.c_str()); } - safe_delete_array(query); } } @@ -3384,27 +3398,32 @@ void command_findzone(Client *c, const Seperator *sep) int count; const int maxrows = 20; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - query = new char[256]; - + + // If id evaluates to 0, then search as if user entered a string. if ((id = atoi((const char *)sep->arg[1])) == 0) { - char *EscName = new char[strlen(sep->arg[1]) * 2 + 1]; - database.DoEscapeString(EscName, sep->arg[1], strlen(sep->arg[1])); - - MakeAnyLenString(&query, "SELECT zoneidnumber,short_name,long_name FROM zone WHERE long_name rLIKE '%s' AND version=0", - EscName); - safe_delete_array(EscName); + std::string escName; + database.DoEscapeString(escName, sep->arg[1], strlen(sep->arg[1])); + + StringFormat(query, "SELECT zoneidnumber, short_name,long_name " + "FROM zone WHERE long_name rLIKE '%s' AND version=0", + escName.c_str()); } // Otherwise, look for just that zoneidnumber. - else - MakeAnyLenString(&query, "SELECT zoneidnumber,short_name,long_name FROM zone WHERE zoneidnumber=%i AND version=0", id); - - if (database.RunQuery(query, strlen(query), errbuf, &result)) + else { + + StringFormat(query, "SELECT zoneidnumber, short_name, long_name " + "FROM zone WHERE zoneidnumber=%i AND version=0", + id); + + } + + if (database.RunQuery(query, errbuf, &result)) { count = 0; @@ -3428,10 +3447,9 @@ void command_findzone(Client *c, const Seperator *sep) else { c->Message (0, "Error querying database."); - c->Message (0, query); + c->Message (0, query.c_str()); } - safe_delete_array(query); } } @@ -3622,11 +3640,14 @@ void command_motd(Client *c, const Seperator *sep) void command_listpetition(Client *c, const Seperator *sep) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; bool header = false; - if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT petid, charname, accountname from petitions order by petid"), errbuf, &result)) { + + StringFormat(query,"SELECT petid, charname, accountname from petitions order by petid"); + + if (database.RunQuery(query, errbuf, &result)) { LogFile->write(EQEMuLog::Normal,"Petition list requested by %s", c->GetName()); while ((row = mysql_fetch_row(result))) { if(!header) { @@ -3637,7 +3658,6 @@ void command_listpetition(Client *c, const Seperator *sep) } mysql_free_result(result); } - safe_delete_array(query); } void command_equipitem(Client *c, const Seperator *sep) @@ -4400,10 +4420,13 @@ void command_repop(Client *c, const Seperator *sep) while (iterator.MoreElements()) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM respawn_times WHERE id=%lu" - " AND instance_id=%lu",(unsigned long)iterator.GetData()->GetID(), (unsigned long)zone->GetInstanceID()), errbuf); - safe_delete_array(query); + std::string query; + + StringFormat(query, "DELETE FROM respawn_times WHERE id=%lu AND instance_id=%lu", + (unsigned long)iterator.GetData()->GetID(), + (unsigned long)zone->GetInstanceID()); + + database.RunQuery(query, errbuf); iterator.Advance(); } c->Message(0, "Zone depop: Force resetting spawn timers."); @@ -4766,16 +4789,20 @@ void command_spawnfix(Client *c, const Seperator *sep) { else { Spawn2* s2 = t->CastToNPC()->respawn2; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; if(!s2) { c->Message(0, "#spawnfix FAILED -- cannot determine which spawn entry in the database this mob came from."); } else { - if(database.RunQuery(query, MakeAnyLenString(&query, "UPDATE spawn2 SET x='%f', y='%f', z='%f', heading='%f' WHERE id='%i'",c->GetX(), c->GetY(), c->GetZ(), c->GetHeading(),s2->GetID()), errbuf)) + + StringFormat(query,"UPDATE spawn2 SET x='%f', y='%f', z='%f', heading='%f' WHERE id='%i'", + c->GetX(), c->GetY(), c->GetZ(), c->GetHeading(),s2->GetID()); + + if(database.RunQuery(query, errbuf)) { - c->LogSQL(query); + c->LogSQL(query.c_str()); c->Message(0, "Updating coordinates successful."); t->Depop(false); } @@ -4784,7 +4811,6 @@ void command_spawnfix(Client *c, const Seperator *sep) { c->Message(13, "Update failed! MySQL gave the following error:"); c->Message(13, errbuf); } - safe_delete_array(query); } } } @@ -5397,12 +5423,17 @@ void command_manaburn(Client *c, const Seperator *sep) void command_viewmessage(Client *c, const Seperator *sep) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; if(sep->arg[1][0]==0) { - if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT id,date,receiver,sender,message from tellque where receiver='%s'",c->GetName()), errbuf, &result)) + + StringFormat(query,"SELECT id, date, receiver, sender, message FROM " + "tellque where receiver='%s'", + c->GetName()); + + if (database.RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result)>0) { @@ -5416,11 +5447,14 @@ void command_viewmessage(Client *c, const Seperator *sep) c->Message(0,"You have no new messages"); mysql_free_result(result); } - safe_delete_array(query); } else { - if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT id,date,receiver,sender,message from tellque where id=%s",sep->argplus[1]), errbuf, &result)) + StringFormat(query,"SELECT id,date,receiver,sender,message FROM " + "tellque where id=%s", + sep->argplus[1]); + + if (database.RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result)==1) { @@ -5429,7 +5463,10 @@ void command_viewmessage(Client *c, const Seperator *sep) if (strcasecmp((const char *) c->GetName(), (const char *) row[2]) == 0) { c->Message(15,"ID: %s,Sent Date: %s,Sender: %s,Message: %s",row[0],row[1],row[3],row[4]); - database.RunQuery(query, MakeAnyLenString(&query, "Delete from tellque where id=%s",row[0]), errbuf); + + StringFormat(query, "Delete from tellque where id=%s",row[0]); + + database.RunQuery(query, errbuf); } else c->Message(13,"Invalid Message Number, check the number and try again."); @@ -5437,7 +5474,6 @@ void command_viewmessage(Client *c, const Seperator *sep) else c->Message(13,"Invalid Message Number, check the number and try again."); } - safe_delete_array(query); } } @@ -6505,7 +6541,7 @@ void command_embperl_eval(Client *c, const Seperator *sep) void command_ban(Client *c, const Seperator *sep) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -6515,16 +6551,17 @@ void command_ban(Client *c, const Seperator *sep) } else { - database.RunQuery(query, MakeAnyLenString(&query, "SELECT account_id from character_ where name = '%s'", sep->arg[1]), errbuf, &result); - if(query) - { - safe_delete_array(query); - } + StringFormat(query,"SELECT account_id from character_ where name = '%s'", sep->arg[1]); + + database.RunQuery(query, errbuf, &result); if(mysql_num_rows(result)) { row = mysql_fetch_row(result); - database.RunQuery(query, MakeAnyLenString(&query, "UPDATE account set status = -2 where id = %i", atoi(row[0])), errbuf, 0); + + StringFormat(query, "UPDATE account set status = -2 where id = %i", atoi(row[0])); + + database.RunQuery(query, errbuf, 0); c->Message(13,"Account number %i with the character %s has been banned.", atoi(row[0]), sep->arg[1]); ServerPacket* pack = new ServerPacket(ServerOP_FlagUpdate, 6); @@ -6556,17 +6593,13 @@ void command_ban(Client *c, const Seperator *sep) { c->Message(13,"Character does not exist."); } - if(query) - { - safe_delete_array(query); - } } } void command_suspend(Client *c, const Seperator *sep) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = nullptr; + std::string query; if((sep->arg[1][0] == 0) || (sep->arg[2][0] == 0)) c->Message(0, "Usage: #suspend (Specify 0 days to lift the suspension immediately)"); @@ -6577,16 +6610,19 @@ void command_suspend(Client *c, const Seperator *sep) if(Duration < 0) Duration = 0; - char *EscName = new char[strlen(sep->arg[1]) * 2 + 1]; + std::string escName; - database.DoEscapeString(EscName, sep->arg[1], strlen(sep->arg[1])); + database.DoEscapeString(escName, sep->arg[1], strlen(sep->arg[1])); int AccountID; - if((AccountID = database.GetAccountIDByChar(EscName)) > 0) + if((AccountID = database.GetAccountIDByChar(escName.c_str())) > 0) { - database.RunQuery(query, MakeAnyLenString(&query, "UPDATE `account` SET `suspendeduntil` = DATE_ADD(NOW(), INTERVAL %i DAY)" - " WHERE `id` = %i", Duration, AccountID), errbuf, 0); + + StringFormat(query, "UPDATE `account` SET `suspendeduntil` = DATE_ADD(NOW(), INTERVAL %i DAY)" + " WHERE `id` = %i", Duration, AccountID); + + database.RunQuery(query, errbuf, 0); if(Duration) c->Message(13,"Account number %i with the character %s has been temporarily suspended for %i day(s).", AccountID, sep->arg[1], @@ -6594,7 +6630,6 @@ void command_suspend(Client *c, const Seperator *sep) else c->Message(13,"Account number %i with the character %s is no longer suspended.", AccountID, sep->arg[1]); - safe_delete_array(query); Client *BannedClient = entity_list.GetClientByName(sep->arg[1]); @@ -6617,7 +6652,6 @@ void command_suspend(Client *c, const Seperator *sep) } else c->Message(13,"Character does not exist."); - safe_delete_array(EscName); } } @@ -6638,7 +6672,7 @@ void command_ipban(Client *c, const Seperator *sep) void command_revoke(Client *c, const Seperator *sep) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; if(sep->arg[1][0] == 0 || sep->arg[2][0] == 0) { @@ -6650,7 +6684,11 @@ void command_revoke(Client *c, const Seperator *sep) if(tmp) { int flag = sep->arg[2][0] == '1' ? true : false; - database.RunQuery(query, MakeAnyLenString(&query, "UPDATE account set revoked=%d where id = %i", flag, tmp), errbuf, 0); + + StringFormat(query,"UPDATE account set revoked=%d where id = %i", + flag, tmp); + + database.RunQuery(query, errbuf, 0); c->Message(13,"%s account number %i with the character %s.", flag?"Revoking":"Unrevoking", tmp, sep->arg[1]); Client* revokee = entity_list.GetClientByAccID(tmp); if(revokee) @@ -6675,11 +6713,7 @@ void command_revoke(Client *c, const Seperator *sep) else { c->Message(13,"Character does not exist."); } - if(query) - { - safe_delete_array(query); - query=nullptr; - } + } } @@ -6848,419 +6882,571 @@ void command_npcedit(Client *c, const Seperator *sep) else if ( strcasecmp( sep->arg[1], "name" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has the name %s",c->GetTarget()->CastToNPC()->GetNPCTypeID(),(sep->argplus[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set name='%s' where id=%i",(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set name='%s' where id=%i", + (sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "lastname" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has the lastname %s",c->GetTarget()->CastToNPC()->GetNPCTypeID(),(sep->argplus[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set lastname='%s' where id=%i",(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set lastname='%s' where id=%i", + (sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "race" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has the race %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set race=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set race=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "class" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u is now class %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set class=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set class=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "bodytype" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has type %i bodytype ",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set bodytype=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set bodytype=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "hp" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has %i Hitpoints",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set hp=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set hp=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "gender" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u is now gender %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set gender=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set gender=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "texture" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now uses texture %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set texture=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set texture=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "helmtexture" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now uses helmtexture %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set helmtexture=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set helmtexture=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "size" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u is now size %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set size=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set size=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "hpregen" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now regens %i hitpoints per tick",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set hp_regen_rate=%i where hp_regen_rate=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set hp_regen_rate=%i where hp_regen_rate=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "manaregen" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now regens %i mana per tick",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set mana_regen_rate=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set mana_regen_rate=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "loottable" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u is now on loottable_id %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set loottable_id=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set loottable_id=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "merchantid" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now is merchant_id %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set merchant_id=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set merchant_id=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "alt_currency_id" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has field 'alt_currency_id' set to %s",c->GetTarget()->CastToNPC()->GetNPCTypeID(), (sep->argplus[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set alt_currency_id='%s' where id=%i",(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set alt_currency_id='%s' where id=%i", + (sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "spell" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now uses spell list %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set npc_spells_id=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set npc_spells_id=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query,errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "faction" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u is now faction %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set npc_faction_id=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set npc_faction_id=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "mindmg" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now hits for a min of %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set mindmg=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set mindmg=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "maxdmg" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now hits for a max of %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set maxdmg=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set maxdmg=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "aggroradius" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has an aggro radius of %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set aggroradius=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set aggroradius=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "social" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u social status is now %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set social=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set social=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "runspeed" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u is now runs at %f",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atof(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set runspeed=%f where id=%i",atof(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set runspeed=%f where id=%i", + atof(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "MR" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; + + StringFormat(query, "update npc_types set MR=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + c->Message(15,"NPCID %u now has a magic resist of %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set MR=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "DR" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has a disease resist of %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set DR=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set DR=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "CR" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has a cold resist of %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set CR=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set CR=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "FR" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has a fire resist of %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set FR=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set FR=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "PR" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has a poison resist of %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set PR=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set PR=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "Corrup" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has a corruption resist of %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set corrup=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set corrup=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "seeinvis" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has seeinvis set to %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set see_invis=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set see_invis=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "seeinvisundead" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has seeinvisundead set to %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set see_invis_undead=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query,"update npc_types set see_invis_undead=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "seehide" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has seehide set to %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set see_hide=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set see_hide=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "seeimprovedhide" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has seeimprovedhide set to %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set see_improved_hide=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set see_improved_hide=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "AC" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has %i armor class",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->argplus[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set ac=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set ac=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "level" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u is now level %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set level=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set level=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "qglobal" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"Quest globals have been %d for NPCID %u",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])==0?"disabled":"enabled"); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set qglobal=%i where id=%i",atoi(sep->argplus[2])==0?0:1,c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set qglobal=%i where id=%i", + atoi(sep->argplus[2])==0?0:1, + c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "npcaggro" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u will now %s other NPCs with negative faction npc_value",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])==0?"not aggro":"aggro"); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set npc_aggro=%i where id=%i",atoi(sep->argplus[2])==0?0:1,c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set npc_aggro=%i where id=%i", + atoi(sep->argplus[2])==0?0:1, + c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "limit" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has a spawn limit of %i",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->argplus[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set limit=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set limit=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "Attackspeed" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has attack_speed set to %f",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atof(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set attack_speed=%f where id=%i",atof(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set attack_speed=%f where id=%i", + atof(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "findable" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u is now %s",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])==0?"not findable":"findable"); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set findable=%i where id=%i",atoi(sep->argplus[2])==0?0:1,c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set findable=%i where id=%i", + atoi(sep->argplus[2])==0?0:1, + c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "wep1" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u will have item graphic %i set to his primary on repop.",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set d_meele_texture1=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set d_meele_texture1=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "wep2" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u will have item graphic %i set to his secondary on repop.",c->GetTarget()->CastToNPC()->GetNPCTypeID(),atoi(sep->arg[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set d_meele_texture2=%i where id=%i",atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set d_meele_texture2=%i where id=%i", + atoi(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "featuresave" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u saved with all current facial feature settings",c->GetTarget()->CastToNPC()->GetNPCTypeID()); - - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set luclin_haircolor=%i where id=%i",c->GetTarget()->GetHairColor(),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set luclin_beardcolor=%i where id=%i",c->GetTarget()->GetBeardColor(),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set luclin_hairstyle=%i where id=%i",c->GetTarget()->GetHairStyle(),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set luclin_beard=%i where id=%i",c->GetTarget()->GetBeard(),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set face=%i where id=%i",c->GetTarget()->GetLuclinFace(),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set drakkin_heritage=%i where id=%i",c->GetTarget()->GetDrakkinHeritage(),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set drakkin_tattoo=%i where id=%i",c->GetTarget()->GetDrakkinTattoo(),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set drakkin_details=%i where id=%i",c->GetTarget()->GetDrakkinDetails(),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set luclin_haircolor=%i where id=%i", + c->GetTarget()->GetHairColor(),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); + + StringFormat(query, "update npc_types set luclin_beardcolor=%i where id=%i", + c->GetTarget()->GetBeardColor(),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); + + StringFormat(query, "update npc_types set luclin_hairstyle=%i where id=%i", + c->GetTarget()->GetHairStyle(),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); + + StringFormat(query, "update npc_types set luclin_beard=%i where id=%i", + c->GetTarget()->GetBeard(),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); + + StringFormat(query, "update npc_types set face=%i where id=%i", + c->GetTarget()->GetLuclinFace(),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); + + StringFormat(query, "update npc_types set drakkin_heritage=%i where id=%i", + c->GetTarget()->GetDrakkinHeritage(),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); + + StringFormat(query, "update npc_types set drakkin_tattoo=%i where id=%i", + c->GetTarget()->GetDrakkinTattoo(),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); + + StringFormat(query, "update npc_types set drakkin_details=%i where id=%i", + c->GetTarget()->GetDrakkinDetails(),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "armortint_id" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; c->Message(15,"NPCID %u now has field 'armortint_id' set to %s",c->GetTarget()->CastToNPC()->GetNPCTypeID(), (sep->argplus[2])); - database.RunQuery(query, MakeAnyLenString(&query, "update npc_types set armortint_id='%s' where id=%i",(sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()), errbuf); - c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "update npc_types set armortint_id='%s' where id=%i", + (sep->argplus[2]),c->GetTarget()->CastToNPC()->GetNPCTypeID()); + + database.RunQuery(query, errbuf); + c->LogSQL(query.c_str()); } else if ( strcasecmp( sep->arg[1], "setanimation" ) == 0 ) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; int Animation = 0; if(sep->arg[2] && atoi(sep->arg[2]) <= 4){ if((strcasecmp( sep->arg[2], "stand" ) == 0) || atoi(sep->arg[2]) == 0){ @@ -7286,10 +7472,13 @@ void command_npcedit(Client *c, const Seperator *sep) return; } c->Message(15,"NPCID %u now has the animation set to %i on spawn with spawngroup %i", c->GetTarget()->CastToNPC()->GetNPCTypeID(), Animation, c->GetTarget()->CastToNPC()->GetSp2() ); - database.RunQuery(query, MakeAnyLenString(&query, "update spawn2 set animation = %i where spawngroupID=%i", Animation, c->GetTarget()->CastToNPC()->GetSp2()), errbuf); + + StringFormat(query, "update spawn2 set animation = %i where spawngroupID=%i", + Animation, c->GetTarget()->CastToNPC()->GetSp2()); + + database.RunQuery(query, errbuf); c->GetTarget()->SetAppearance(EmuAppearance(Animation)); - c->LogSQL(query); - safe_delete_array(query); + c->LogSQL(query.c_str()); } else if((sep->arg[1][0] == 0 || strcasecmp(sep->arg[1],"*")==0) || ((c->GetTarget()==0) || (c->GetTarget()->IsClient()))) @@ -7401,45 +7590,49 @@ void command_nologs(Client *c, const Seperator *sep) void command_qglobal(Client *c, const Seperator *sep) { //In-game switch for qglobal column char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; if(sep->arg[1][0] == 0) { c->Message(0, "Syntax: #qglobal [on/off/view]. Requires NPC target."); return; } - Mob *t = c->GetTarget(); - if(!t || !t->IsNPC()) { + Mob *targetMob = c->GetTarget(); + if(!targetMob || !targetMob->IsNPC()) { c->Message(13, "NPC Target Required!"); return; } if(!strcasecmp(sep->arg[1], "on")) { - if(!database.RunQuery(query, MakeAnyLenString(&query, "UPDATE npc_types SET qglobal=1 WHERE id='%i'", t->GetNPCTypeID()), errbuf, 0)) + StringFormat(query, "UPDATE npc_types SET qglobal=1 WHERE id='%i'", + targetMob->GetNPCTypeID()); + + if(!database.RunQuery(query, errbuf, 0)) { c->Message(15, "Could not update database."); } else { - c->LogSQL(query); + c->LogSQL(query.c_str()); c->Message(15, "Success! Changes take effect on zone reboot."); } - safe_delete(query); } else if(!strcasecmp(sep->arg[1], "off")) { - if(!database.RunQuery(query, MakeAnyLenString(&query, "UPDATE npc_types SET qglobal=0 WHERE id='%i'", t->GetNPCTypeID()), errbuf, 0)) + StringFormat(query, "UPDATE npc_types SET qglobal=0 WHERE id='%i'", + targetMob->GetNPCTypeID()); + + if(!database.RunQuery(query, errbuf, 0)) { c->Message(15, "Could not update database."); } else { - c->LogSQL(query); + c->LogSQL(query.c_str()); c->Message(15, "Success! Changes take effect on zone reboot."); } - safe_delete(query); } else if(!strcasecmp(sep->arg[1], "view")) { - const NPCType *type = database.GetNPCType(t->GetNPCTypeID()); + const NPCType *type = database.GetNPCType(targetMob->GetNPCTypeID()); if(!type) { c->Message(15, "Invalid NPC type."); } else if(type->qglobal) { @@ -8166,24 +8359,25 @@ void command_flagedit(Client *c, const Seperator *sep) { return; } - char flag_name[128]; + std::string flagName; if(sep->argplus[3][0] == '\0') { c->Message(13, "flag name required. see help."); return; } - database.DoEscapeString(flag_name, sep->argplus[3], 64); - flag_name[127] = '\0'; - - if(!database.RunQuery(query, MakeAnyLenString(&query, - "UPDATE zone SET flag_needed='%s' WHERE zoneidnumber=%d AND version=%d", - flag_name, zoneid, zone->GetInstanceVersion()), errbuf)) + database.DoEscapeString(flagName, sep->argplus[3], 64); + + std::string query; + + StringFormat(query,"UPDATE zone SET flag_needed='%s' WHERE zoneidnumber=%d AND version=%d", + flagName.c_str(), zoneid, zone->GetInstanceVersion()); + + if(!database.RunQuery(query, errbuf)) { c->Message(13, "Error updating zone: %s", errbuf); } else { - c->LogSQL(query); - c->Message(15, "Success! Zone %s now requires a flag, named %s", database.GetZoneName(zoneid), flag_name); + c->LogSQL(query.c_str()); + c->Message(15, "Success! Zone %s now requires a flag, named %s", database.GetZoneName(zoneid), flagName.c_str()); } - safe_delete(query); } else if(!strcasecmp(sep->arg[1], "unlockzone")) { uint32 zoneid = 0; if(sep->arg[2][0] != '\0') { @@ -8196,24 +8390,26 @@ void command_flagedit(Client *c, const Seperator *sep) { c->Message(13, "zone required. see help."); return; } - - if(!database.RunQuery(query, MakeAnyLenString(&query, - "UPDATE zone SET flag_needed='' WHERE zoneidnumber=%d AND version=%d", - zoneid, zone->GetInstanceVersion()), errbuf)) - { + + std::string query; + + StringFormat(query, "UPDATE zone SET flag_needed='' WHERE zoneidnumber=%d AND version=%d", + zoneid, zone->GetInstanceVersion()); + + if(!database.RunQuery(query, errbuf)) { c->Message(15, "Error updating zone: %s", errbuf); } else { - c->LogSQL(query); + c->LogSQL(query.c_str()); c->Message(15, "Success! Zone %s no longer requires a flag.", database.GetZoneName(zoneid)); } - safe_delete(query); } else if(!strcasecmp(sep->arg[1], "listzones")) { MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query, MakeAnyLenString(&query, - "SELECT zoneidnumber,short_name,long_name,version,flag_needed FROM zone WHERE flag_needed != ''" - ), errbuf, &result)) - { + + query = "SELECT zoneidnumber, short_name, long_name, version, flag_needed " + "FROM zone WHERE flag_needed != ''"; + + if (database.RunQuery(query, errbuf, &result)){ c->Message(0, "Zones which require flags:"); while ((row = mysql_fetch_row(result))) { @@ -8223,7 +8419,6 @@ void command_flagedit(Client *c, const Seperator *sep) { } else { c->Message(13, "Unable to query zone flags: %s", errbuf); } - safe_delete_array(query); } else if(!strcasecmp(sep->arg[1], "give")) { uint32 zoneid = 0; if(sep->arg[2][0] != '\0') { @@ -9076,17 +9271,26 @@ void command_advnpcspawn(Client *c, const Seperator *sep) else if (strcasecmp(sep->arg[1], "makegroup") == 0) { if(sep->arg[2]) { - if (!database.RunQuery(query, MakeAnyLenString(&query, "INSERT INTO spawngroup (name,spawn_limit,dist,max_x,min_x,max_y,min_y,delay) VALUES (\"%s\",%i,%f,%f,%f,%f,%f,%i)", sep->arg[2], (sep->arg[3]?atoi(sep->arg[3]):0), (sep->arg[4]?atof(sep->arg[4]):0), (sep->arg[5]?atof(sep->arg[5]):0), (sep->arg[6]?atof(sep->arg[6]):0), (sep->arg[7]?atof(sep->arg[7]):0), (sep->arg[8]?atof(sep->arg[8]):0), (sep->arg[9]?atoi(sep->arg[9]):0)), errbuf, 0, 0, &last_insert_id)) + + std::string query; + + StringFormat(query, "INSERT INTO spawngroup (name,spawn_limit,dist,max_x,min_x,max_y,min_y,delay) " + "VALUES (\"%s\", %i, %f, %f, %f, %f, %f, %i)", + sep->arg[2], (sep->arg[3]?atoi(sep->arg[3]):0), + (sep->arg[4]?atof(sep->arg[4]):0), (sep->arg[5]?atof(sep->arg[5]):0), + (sep->arg[6]?atof(sep->arg[6]):0), (sep->arg[7]?atof(sep->arg[7]):0), + (sep->arg[8]?atof(sep->arg[8]):0), (sep->arg[9]?atoi(sep->arg[9]):0)); + + if (!database.RunQuery(query, errbuf, 0, 0, &last_insert_id)) { c->Message(0, "Invalid Arguments -- MySQL gave the following error:"); c->Message(13, errbuf); } else { - c->LogSQL(query); - c->Message(0, "Group ID %i created successfully!", last_insert_id); + c->LogSQL(query.c_str()); + c->Message(0, "Group ID %i created successfully!", last_insert_id); } - safe_delete_array(query); } else { @@ -9096,17 +9300,21 @@ void command_advnpcspawn(Client *c, const Seperator *sep) else if (strcasecmp(sep->arg[1], "addgroupentry") == 0) { if(atoi(sep->arg[2]) && atoi(sep->arg[3]) && atoi(sep->arg[4])) { - if (!database.RunQuery(query, MakeAnyLenString(&query, "INSERT INTO spawnentry (spawngroupID,npcID,chance) VALUES (%i,%i,%i)", atoi(sep->arg[2]), atoi(sep->arg[3]), atoi(sep->arg[4]), errbuf, 0, 0, &last_insert_id))) + std::string query; + + StringFormat(query,"INSERT INTO spawnentry (spawngroupID,npcID,chance) VALUES (%i,%i,%i)", + atoi(sep->arg[2]), atoi(sep->arg[3]), atoi(sep->arg[4])); + + if (!database.RunQuery(query, errbuf, 0, 0, &last_insert_id)) { c->Message(0, "Invalid Arguments -- MySQL gave the following error:"); c->Message(13, errbuf); } else { - c->LogSQL(query); - c->Message(0, "NPC %i added to group %i with %i chance!", atoi(sep->arg[3]), atoi(sep->arg[2]), atoi(sep->arg[4]) ); + c->LogSQL(query.c_str()); + c->Message(0, "NPC %i added to group %i with %i chance!", atoi(sep->arg[3]), atoi(sep->arg[2]), atoi(sep->arg[4]) ); } - safe_delete(query); } else { @@ -9116,17 +9324,23 @@ void command_advnpcspawn(Client *c, const Seperator *sep) else if (strcasecmp(sep->arg[1], "editgroupbox") == 0) { if(atof(sep->arg[2]) && atof(sep->arg[3]) && atof(sep->arg[4]) && atof(sep->arg[5]) && atof(sep->arg[6]) && atof(sep->arg[7]) && atof(sep->arg[8])) { - if (!database.RunQuery(query, MakeAnyLenString(&query, "UPDATE spawngroup SET dist='%f',max_x='%f',min_x='%f',max_y='%f',min_y='%f',delay='%i' WHERE id='%i'", atof(sep->arg[3]),atof(sep->arg[4]),atof(sep->arg[5]),atof(sep->arg[6]),atof(sep->arg[7]),atoi(sep->arg[8]),atoi(sep->arg[2]), errbuf, 0, 0, &last_insert_id))) + std::string query; + + StringFormat(query,"UPDATE spawngroup SET dist='%f',max_x='%f',min_x='%f',max_y='%f',min_y='%f',delay='%i' " + "WHERE id='%i'", + atof(sep->arg[3]), atof(sep->arg[4]), atof(sep->arg[5]), atof(sep->arg[6]), atof(sep->arg[7]), + atoi(sep->arg[8]),atoi(sep->arg[2])); + + if (!database.RunQuery(query, errbuf, 0, 0, &last_insert_id)) { c->Message(0, "Invalid Arguments -- MySQL gave the following error:"); c->Message(13, errbuf); } else { - c->LogSQL(query); - c->Message(0, "Group ID %i created successfully!", last_insert_id); + c->LogSQL(query.c_str()); + c->Message(0, "Group ID %i created successfully!", last_insert_id); } - safe_delete_array(query); } else { @@ -9136,17 +9350,23 @@ void command_advnpcspawn(Client *c, const Seperator *sep) else if (strcasecmp(sep->arg[1], "cleargroupbox") == 0) { if(atoi(sep->arg[2])) { - if (!database.RunQuery(query, MakeAnyLenString(&query, "UPDATE spawngroup SET dist='0',max_x='0',min_x='0',max_y='0',min_y='0',delay='0' WHERE id='%i'",atoi(sep->arg[2])), errbuf, 0, 0, &last_insert_id)) + std::string query; + + StringFormat(query, "UPDATE spawngroup SET " + "dist='0',max_x='0',min_x='0', max_y='0',min_y='0',delay='0' " + "WHERE id='%i'", + atoi(sep->arg[2])); + + if (!database.RunQuery(query, errbuf, 0, 0, &last_insert_id)) { c->Message(0, "Invalid Arguments -- MySQL gave the following error:"); c->Message(13, errbuf); } else { - c->LogSQL(query); - c->Message(0, "Group ID %i created successfully!", last_insert_id); + c->LogSQL(query.c_str()); + c->Message(0, "Group ID %i created successfully!", last_insert_id); } - safe_delete_array(query); } else { @@ -9168,9 +9388,14 @@ void command_advnpcspawn(Client *c, const Seperator *sep) } else { - if(database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM spawn2 WHERE id='%i'",s2->GetID()), errbuf)) + + std::string query; + + StringFormat(query, "DELETE FROM spawn2 WHERE id='%i'",s2->GetID()); + + if(database.RunQuery(query, errbuf)) { - c->LogSQL(query); + c->LogSQL(query.c_str()); c->Message(0, "Spawnpoint Removed successfully."); target->Depop(false); } @@ -9179,7 +9404,6 @@ void command_advnpcspawn(Client *c, const Seperator *sep) c->Message(13, "Update failed! MySQL gave the following error:"); c->Message(13, errbuf); } - safe_delete_array(query); } } } @@ -9194,9 +9418,14 @@ void command_advnpcspawn(Client *c, const Seperator *sep) } else { - if(database.RunQuery(query, MakeAnyLenString(&query, "UPDATE spawn2 SET x='%f', y='%f', z='%f', heading='%f' WHERE id='%i'",c->GetX(), c->GetY(), c->GetZ(), c->GetHeading(),s2->GetID()), errbuf)) + std::string query; + + StringFormat(query, "UPDATE spawn2 SET x='%f', y='%f', z='%f', heading='%f' WHERE id='%i'", + c->GetX(), c->GetY(), c->GetZ(), c->GetHeading(),s2->GetID()); + + if(database.RunQuery(query, errbuf)) { - c->LogSQL(query); + c->LogSQL(query.c_str()); c->Message(0, "Updating coordinates successful."); target->CastToNPC()->GMMove(c->GetX(), c->GetY(), c->GetZ(), c->GetHeading()); target->CastToNPC()->SaveGuardSpot(true); @@ -9207,7 +9436,6 @@ void command_advnpcspawn(Client *c, const Seperator *sep) c->Message(13, "Update failed! MySQL gave the following error:"); c->Message(13, errbuf); } - safe_delete_array(query); } } } @@ -9239,9 +9467,14 @@ void command_advnpcspawn(Client *c, const Seperator *sep) } else { - if(database.RunQuery(query, MakeAnyLenString(&query, "UPDATE spawn2 SET respawntime=%u, variance=%u WHERE id='%i'", new_rs, new_var, s2->GetID()), errbuf)) + std::string query; + + StringFormat(query, "UPDATE spawn2 SET respawntime=%u, variance=%u WHERE id='%i'", + new_rs, new_var, s2->GetID()); + + if(database.RunQuery(query, errbuf)) { - c->LogSQL(query); + c->LogSQL(query.c_str()); c->Message(0, "Updating respawn timer successful."); s2->SetRespawnTimer(new_rs); s2->SetVariance(new_var); @@ -9251,7 +9484,6 @@ void command_advnpcspawn(Client *c, const Seperator *sep) c->Message(13, "Update failed! MySQL gave the following error:"); c->Message(13, errbuf); } - safe_delete_array(query); } } } @@ -9262,8 +9494,14 @@ void command_advnpcspawn(Client *c, const Seperator *sep) else { if(sep->IsNumber(2)){ Version = atoi(sep->arg[2]); - if(database.RunQuery(query, MakeAnyLenString(&query, "UPDATE spawn2 SET version=%i WHERE spawngroupID='%i'", Version, c->GetTarget()->CastToNPC()->GetSp2()), errbuf)){ - c->LogSQL(query); + + std::string query; + + StringFormat(query, "UPDATE spawn2 SET version=%i WHERE spawngroupID='%i'", + Version, c->GetTarget()->CastToNPC()->GetSp2()); + + if(database.RunQuery(query, errbuf)){ + c->LogSQL(query.c_str()); c->Message(0, "Version change to %i was successful from SpawnGroupID %i", Version, c->GetTarget()->CastToNPC()->GetSp2()); c->GetTarget()->Depop(false); } @@ -9271,7 +9509,6 @@ void command_advnpcspawn(Client *c, const Seperator *sep) c->Message(13, "Update failed! MySQL gave the following error:"); c->Message(13, errbuf); } - safe_delete_array(query); } else{ c->Message(0, "setversion FAILED -- You must set a version number"); @@ -9584,13 +9821,12 @@ void command_object(Client *c, const Seperator *sep) } char errbuf[MYSQL_ERRMSG_SIZE]; - char query[512]; uint32 col; MYSQL_RES *result; MYSQL_ROW row; int iObjectsFound = 0; int len; - + std::string query; Object* o = nullptr; Object_Struct od; Door door; @@ -9621,6 +9857,7 @@ void command_object(Client *c, const Seperator *sep) // Protip: We only really care about the first letter. You can abbreviate Delete to just D if desired. switch (sep->arg[1][0]) { + case 'l': // List Objects // Insufficient or invalid args if ((sep->argnum < 2) || (sep->arg[2][0] < '0') || ((sep->arg[2][0] > '9') && ((sep->arg[2][0] & 0xDF) != 'A'))) @@ -9647,40 +9884,44 @@ void command_object(Client *c, const Seperator *sep) { c->Message(0, "Objects within %u units of your current location:", radius); } - + + + if (radius) { - len = snprintf(query, sizeof(query), - "SELECT id, xpos, ypos, zpos, heading, itemid, objectname, type, icon, unknown08, unknown10, unknown20" - " FROM object" - " WHERE (zoneid=%u)" - " AND (version=%u)" - " AND (xpos BETWEEN %.1f AND %.1f)" - " AND (ypos BETWEEN %.1f AND %.1f)" - " AND (zpos BETWEEN %.1f AND %.1f)" - " ORDER BY id", - zone->GetZoneID(), - zone->GetInstanceVersion(), - c->GetX() - radius, // Yes, we're actually using a bounding box instead of a radius. - c->GetX() + radius, // Much less processing power used this way. - c->GetY() - radius, - c->GetY() + radius, - c->GetZ() - radius, - c->GetZ() + radius); + + StringFormat(query, "SELECT id, xpos, ypos, zpos, heading, itemid, objectname, type, icon, unknown08, unknown10, unknown20" + " FROM object" + " WHERE (zoneid=%u)" + " AND (version=%u)" + " AND (xpos BETWEEN %.1f AND %.1f)" + " AND (ypos BETWEEN %.1f AND %.1f)" + " AND (zpos BETWEEN %.1f AND %.1f)" + " ORDER BY id", + zone->GetZoneID(), + zone->GetInstanceVersion(), + c->GetX() - radius, // Yes, we're actually using a bounding box instead of a radius. + c->GetX() + radius, // Much less processing power used this way. + c->GetY() - radius, + c->GetY() + radius, + c->GetZ() - radius, + c->GetZ() + radius); } else { - len = snprintf(query, sizeof(query), - "SELECT id, xpos, ypos, zpos, heading, itemid, objectname, type, icon, unknown08, unknown10, unknown20" - " FROM object" - " WHERE (zoneid=%u)" - " AND (version=%u)" - " ORDER BY id", - zone->GetZoneID(), - zone->GetInstanceVersion()); + + StringFormat(query, "SELECT id, xpos, ypos, zpos, heading, itemid, " + "objectname, type, icon, unknown08, unknown10, unknown20 " + "FROM object " + "WHERE (zoneid=%u) " + "AND (version=%u) " + "ORDER BY id", + zone->GetZoneID(), + zone->GetInstanceVersion()); + } - if (database.RunQuery(query, len, errbuf, &result)) + if (database.RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { @@ -9815,11 +10056,10 @@ void command_object(Client *c, const Seperator *sep) if (id) { // ID specified. Verify that it doesn't already exist. - - len = snprintf(query, sizeof(query), "SELECT COUNT(*) FROM object WHERE ID=%u", id); + StringFormat(query, "SELECT COUNT(*) FROM object WHERE ID=%u", id); // Already in database? - if (database.RunQuery(query, len, errbuf, &result)) + if (database.RunQuery(query,errbuf, &result)) { if ((row = mysql_fetch_row(result)) != nullptr) { @@ -9854,21 +10094,21 @@ void command_object(Client *c, const Seperator *sep) } // Verify no other objects already in this spot (accidental double-click of Hotkey?) - len = snprintf(query, sizeof(query), - "SELECT COUNT(*) FROM object " - "WHERE (zoneid=%u) " - "AND (version=%u) " - "AND (posx BETWEEN %.1f AND %.1f) " - "AND (posy BETWEEN %.1f AND %.1f) " - "AND (posz BETWEEN %.1f AND %.1f)", - zone->GetZoneID(), - zone->GetInstanceVersion(), - od.x - 0.2f, od.x + 0.2f, // Yes, we're actually using a bounding box instead of a radius. - od.y - 0.2f, od.y + 0.2f, // Much less processing power used this way. - od.z - 0.2f, od.z + 0.2f); // It's pretty forgiving, though, allowing for close-proximity objects + + StringFormat(query, "SELECT COUNT(*) FROM object " + "WHERE (zoneid=%u) " + "AND (version=%u) " + "AND (posx BETWEEN %.1f AND %.1f) " + "AND (posy BETWEEN %.1f AND %.1f) " + "AND (posz BETWEEN %.1f AND %.1f)", + zone->GetZoneID(), + zone->GetInstanceVersion(), + od.x - 0.2f, od.x + 0.2f, // Yes, we're actually using a bounding box instead of a radius. + od.y - 0.2f, od.y + 0.2f, // Much less processing power used this way. + od.z - 0.2f, od.z + 0.2f); // It's pretty forgiving, though, allowing for close-proximity objects iObjectsFound = 0; - if (database.RunQuery(query, len, errbuf, &result)) + if (database.RunQuery(query, errbuf, &result)) { if ((row = mysql_fetch_row(result)) != nullptr) { @@ -9924,10 +10164,9 @@ void command_object(Client *c, const Seperator *sep) // No ID specified. Get a best-guess next number from the database // If there's a problem retrieving an ID from the database, it'll end up being object # 1. No biggie. + query = "SELECT MAX(id) FROM object"; - strn0cpy(query, "SELECT MAX(id) FROM object", sizeof(query)); - - if (database.RunQuery(query, strlen(query), errbuf, &result)) + if (database.RunQuery(query, errbuf, &result)) { if (row = mysql_fetch_row(result)) { @@ -10002,11 +10241,11 @@ void command_object(Client *c, const Seperator *sep) else { // Object not found in-zone in a modifiable form. Check for valid matching circumstances. - - len = snprintf(query, sizeof(query), "SELECT zoneid, version, type FROM object WHERE id=%u", id); + StringFormat(query, "SELECT zoneid, version, type FROM object WHERE id=%u", + id); iObjectsFound = 0; - if (database.RunQuery(query, len, errbuf, &result)) + if (database.RunQuery(query, errbuf, &result)) { if (row = mysql_fetch_row(result)) { @@ -10048,10 +10287,10 @@ void command_object(Client *c, const Seperator *sep) { case 0: // Static object needing unlocking // Convert to tradeskill object temporarily for changes + StringFormat(query, "UPDATE object SET type=%u WHERE id=%u", + TempStaticType, id); - len = snprintf(query, sizeof(query), "UPDATE object SET type=%u WHERE id=%u", TempStaticType, id); - - database.RunQuery(query, len); + database.RunQuery(query); c->Message(0, "Static Object %u unlocked for editing. You must zone out and back in to make your changes, then commit them with '#object Save'.", id); @@ -10288,9 +10527,10 @@ void command_object(Client *c, const Seperator *sep) if (!(o = entity_list.FindObject(id))) { - len = snprintf(query, sizeof(query), "SELECT zoneid, version, type FROM object WHERE id=%u", id); - - if ((!database.RunQuery(query, len, errbuf, &result)) || ((row = mysql_fetch_row(result)) == 0)) + + StringFormat(query, "SELECT zoneid, version, type FROM object WHERE id=%u", id); + + if ((!database.RunQuery(query, errbuf, &result)) || ((row = mysql_fetch_row(result)) == 0)) { if (result) { @@ -10441,8 +10681,8 @@ void command_object(Client *c, const Seperator *sep) } o = entity_list.FindObject(id); - - sprintf(query, "SELECT zoneid, version, type FROM object WHERE id=%u", id); + + StringFormat(query, "SELECT zoneid, version, type FROM object WHERE id=%u", id); od.zone_id = 0; od.zone_instance = 0; @@ -10450,7 +10690,7 @@ void command_object(Client *c, const Seperator *sep) // If this ID isn't in the database yet, it's a new object bNewObject = true; - if (database.RunQuery(query, strlen(query), errbuf, &result)) + if (database.RunQuery(query, errbuf, &result)) { if (row = mysql_fetch_row(result)) { @@ -10542,42 +10782,44 @@ void command_object(Client *c, const Seperator *sep) { if (id == 0) { - len = snprintf(query, sizeof(query), - "INSERT INTO object (zoneid, version, xpos, ypos, zpos, heading, objectname, type, icon, unknown08, unknown10, unknown20)" - " VALUES (%u, %u, %.1f, %.1f, %.1f, %.1f, '%s', %u, %u, %u, %u, %u)", - zone->GetZoneID(), zone->GetInstanceVersion(), - od.x, od.y, od.z, od.heading, - od.object_name, od.object_type, icon, - od.unknown008[0], od.unknown008[1], od.unknown020); + StringFormat(query, "INSERT INTO object (zoneid, version, xpos, ypos, zpos, heading, " + "objectname, type, icon, unknown08, unknown10, unknown20)" + " VALUES (%u, %u, %.1f, %.1f, %.1f, %.1f, '%s', %u, %u, %u, %u, %u)", + zone->GetZoneID(), zone->GetInstanceVersion(), + od.x, od.y, od.z, od.heading, + od.object_name, od.object_type, icon, + od.unknown008[0], od.unknown008[1], od.unknown020); + } else { - len = snprintf(query, sizeof(query), - "INSERT INTO object (id, zoneid, version, xpos, ypos, zpos, heading, objectname, type, icon, unknown08, unknown10, unknown20)" - " VALUES (%u, %u, %u, %.1f, %.1f, %.1f, %.1f, '%s', %u, %u, %u, %u, %u)", - id, zone->GetZoneID(), zone->GetInstanceVersion(), - od.x, od.y, od.z, od.heading, - od.object_name, od.object_type, icon, - od.unknown008[0], od.unknown008[1], od.unknown020); + + StringFormat(query, "INSERT INTO object (id, zoneid, version, xpos, ypos, zpos, " + "heading, objectname, type, icon, unknown08, unknown10, unknown20) " + "VALUES (%u, %u, %u, %.1f, %.1f, %.1f, %.1f, '%s', %u, %u, %u, %u, %u)", + id, zone->GetZoneID(), zone->GetInstanceVersion(), + od.x, od.y, od.z, od.heading, + od.object_name, od.object_type, icon, + od.unknown008[0], od.unknown008[1], od.unknown020); } } else { - len = snprintf(query, sizeof(query), - "UPDATE object SET " - " zoneid=%u, version=%u," - " xpos=%.1f, ypos=%.1f, zpos=%.1f, heading=%.1f," - " objectname='%s', type=%u, icon=%u," - " unknown08=%u, unknown10=%u, unknown20=%u" - " WHERE ID=%u", - zone->GetZoneID(), zone->GetInstanceVersion(), - od.x, od.y, od.z, od.heading, - od.object_name, od.object_type, icon, - od.unknown008[0], od.unknown008[1], od.unknown020, - id); + StringFormat(query, "UPDATE object SET " + " zoneid=%u, version=%u," + " xpos=%.1f, ypos=%.1f, zpos=%.1f, heading=%.1f," + " objectname='%s', type=%u, icon=%u," + " unknown08=%u, unknown10=%u, unknown20=%u" + " WHERE ID=%u", + zone->GetZoneID(), zone->GetInstanceVersion(), + od.x, od.y, od.z, od.heading, + od.object_name, od.object_type, icon, + od.unknown008[0], od.unknown008[1], od.unknown020, + id); + } - if (!database.RunQuery(query, len, errbuf, 0, &col, &newid)) + if (!database.RunQuery(query, errbuf, 0, &col, &newid)) { col = 0; } @@ -10716,15 +10958,15 @@ void command_object(Client *c, const Seperator *sep) if ((sep->arg[2][0] & 0xDF) == 'A') { // Copy All + StringFormat(query,"INSERT INTO object (zoneid, version, xpos, ypos, zpos, heading, " + "itemid, objectname, type, icon, unknown08, unknown10, unknown20) " + "SELECT zoneid, %u, xpos, ypos, zpos, heading, itemid, objectname, " + "type, icon, unknown08, unknown10, unknown20 " + "FROM object " + "WHERE (zoneid=%u) AND (version=%u)", + od.zone_instance, zone->GetZoneID(), zone->GetInstanceVersion()); - len = snprintf(query, sizeof(query), - "INSERT INTO object (zoneid, version, xpos, ypos, zpos, heading, itemid, objectname, type, icon, unknown08, unknown10, unknown20)" - " SELECT zoneid, %u, xpos, ypos, zpos, heading, itemid, objectname, type, icon, unknown08, unknown10, unknown20" - " FROM object" - " WHERE (zoneid=%u) AND (version=%u)", - od.zone_instance, zone->GetZoneID(), zone->GetInstanceVersion()); - - if (database.RunQuery(query, len, errbuf, 0, &col)) + if (database.RunQuery(query, errbuf, 0, &col)) { c->Message(0, "Copied %u object%s into instance version %u", col, (col == 1) ? "" : "s", od.zone_instance); } @@ -10744,15 +10986,16 @@ void command_object(Client *c, const Seperator *sep) { // Copy ObjectID id = atoi(sep->arg[2]); + + StringFormat(query, "INSERT INTO object (zoneid, version, xpos, ypos, zpos, " + "heading, itemid, objectname, type, icon, unknown08, unknown10, unknown20) " + "SELECT zoneid, %u, xpos, ypos, zpos, heading, itemid, objectname, type, " + "icon, unknown08, unknown10, unknown20 " + "FROM object " + "WHERE (id=%u) AND (zoneid=%u) AND (version=%u)", + od.zone_instance, id, zone->GetZoneID(), zone->GetInstanceVersion()); - len = snprintf(query, sizeof(query), - "INSERT INTO object (zoneid, version, xpos, ypos, zpos, heading, itemid, objectname, type, icon, unknown08, unknown10, unknown20)" - " SELECT zoneid, %u, xpos, ypos, zpos, heading, itemid, objectname, type, icon, unknown08, unknown10, unknown20" - " FROM object" - " WHERE (id=%u) AND (zoneid=%u) AND (version=%u)", - od.zone_instance, id, zone->GetZoneID(), zone->GetInstanceVersion()); - - if ((database.RunQuery(query, len, errbuf, 0, &col)) && (col > 0)) + if ((database.RunQuery(query, errbuf, 0, &col)) && (col > 0)) { c->Message(0, "Copied Object %u into instance version %u", id, od.zone_instance); } @@ -10763,10 +11006,9 @@ void command_object(Client *c, const Seperator *sep) if (errbuf[0] == '\0') { // No database error returned. See if we can figure out why. + StringFormat(query, "SELECT zoneid, version FROM object WHERE id=%u", id); - len = snprintf(query, sizeof(query), "SELECT zoneid, version FROM object WHERE id=%u", id); - - if (database.RunQuery(query, len, errbuf, &result)) + if (database.RunQuery(query, errbuf, &result)) { if (row = mysql_fetch_row(result)) { @@ -10833,8 +11075,11 @@ void command_object(Client *c, const Seperator *sep) // Verifying ZoneID and Version in case someone else ended up adding an object with our ID // from a different zone/version. Don't want to delete someone else's work. - sprintf(query, "DELETE FROM object WHERE (id=%u) AND (zoneid=%u) AND (version=%u) LIMIT 1", id, zone->GetZoneID(), zone->GetInstanceVersion()); - database.RunQuery(query, strlen(query)); + StringFormat(query, "DELETE FROM object WHERE (id=%u) AND (zoneid=%u) AND " + "(version=%u) LIMIT 1", + id, zone->GetZoneID(), zone->GetInstanceVersion()); + + database.RunQuery(query); c->Message(0, "Object %u deleted", id); } @@ -10842,9 +11087,11 @@ void command_object(Client *c, const Seperator *sep) { // Object not found in zone. - sprintf(query, "SELECT type FROM object WHERE (id=%u) AND (zoneid=%u) AND (version=%u) LIMIT 1", id, zone->GetZoneID(), zone->GetInstanceVersion()); + StringFormat(query, "SELECT type FROM object WHERE (id=%u) AND (zoneid=%u) " + "AND (version=%u) LIMIT 1", + id, zone->GetZoneID(), zone->GetInstanceVersion()); - if (database.RunQuery(query, strlen(query), errbuf, &result)) + if (database.RunQuery(query, errbuf, &result)) { if (row = mysql_fetch_row(result)) { @@ -10852,9 +11099,12 @@ void command_object(Client *c, const Seperator *sep) { case 0: // Static Object mysql_free_result(result); - - sprintf(query, "DELETE FROM object WHERE (id=%u) AND (zoneid=%u) AND (version=%u) LIMIT 1", id, zone->GetZoneID(), zone->GetInstanceVersion()); - database.RunQuery(query, strlen(query)); + + StringFormat(query, "DELETE FROM object WHERE (id=%u) AND " + "(zoneid=%u) AND (version=%u) LIMIT 1", + id, zone->GetZoneID(), zone->GetInstanceVersion()); + + database.RunQuery(query); c->Message(0, "Object %u deleted. NOTE: This static object will remain for anyone currently in the zone until they next zone out and in.", id); @@ -10910,11 +11160,13 @@ void command_object(Client *c, const Seperator *sep) entity_list.RemoveObject(o->GetID()); safe_delete(app); - len = snprintf(query, sizeof(query), - "SELECT xpos, ypos, zpos, heading, objectname, type, icon, unknown08, unknown10, unknown20" - " FROM object WHERE id=%u", id); + StringFormat(query, "SELECT xpos, ypos, zpos, heading, " + "objectname, type, icon, unknown08, " + "unknown10, unknown20 " + "FROM object WHERE id=%u", + id); - if ((!database.RunQuery(query, len, errbuf, &result)) || ((row = mysql_fetch_row(result)) == 0)) + if ((!database.RunQuery(query, errbuf, &result)) || ((row = mysql_fetch_row(result)) == 0)) { if (result) { @@ -11462,7 +11714,7 @@ void command_mysql(Client *c, const Seperator *sep) //swap # for % so like queries can work std::replace(QueryText.begin(), QueryText.end(), '#', '%'); - if (database.RunQuery(QueryText.c_str(), QueryText.length(), errbuf, &result)) { + if (database.RunQuery(QueryText, errbuf, &result)) { //Using sep->arg[2] again, replace # with %% so it doesn't screw up when sent through vsnprintf in Message QueryText = sep->arg[2]; int pos = QueryText.find('#'); diff --git a/zone/doors.cpp b/zone/doors.cpp index 7c22ea7eb..9f1647b11 100644 --- a/zone/doors.cpp +++ b/zone/doors.cpp @@ -570,14 +570,14 @@ void Doors::DumpDoor(){ int32 ZoneDatabase::GetDoorsCount(uint32* oMaxID, const char *zone_name, int16 version) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - MYSQL_RES *result; MYSQL_ROW row; - query = new char[256]; - sprintf(query, "SELECT MAX(id), count(*) FROM doors WHERE zone='%s' AND (version=%u OR version=-1)", zone_name, version); - if (RunQuery(query, strlen(query), errbuf, &result)) { - safe_delete_array(query); + + std::string query; + + StringFormat(query,"SELECT MAX(id), count(*) FROM doors WHERE zone='%s' AND (version=%u OR version=-1)",zone_name, version); + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if (row != nullptr && row[1] != 0) { int32 ret = atoi(row[1]); @@ -594,7 +594,6 @@ int32 ZoneDatabase::GetDoorsCount(uint32* oMaxID, const char *zone_name, int16 v } else { std::cerr << "Error in GetDoorsCount query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return -1; } @@ -603,15 +602,16 @@ int32 ZoneDatabase::GetDoorsCount(uint32* oMaxID, const char *zone_name, int16 v int32 ZoneDatabase::GetDoorsCountPlusOne(const char *zone_name, int16 version) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 oMaxID = 0; MYSQL_RES *result; MYSQL_ROW row; query = new char[256]; - sprintf(query, "SELECT MAX(id) FROM doors WHERE zone='%s' AND version=%u", zone_name, version); - if (RunQuery(query, strlen(query), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT MAX(id) FROM doors WHERE zone='%s' AND version=%u", zone_name, version); + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if (row != nullptr && row[1] != 0) { if (row[0]) @@ -625,7 +625,6 @@ int32 ZoneDatabase::GetDoorsCountPlusOne(const char *zone_name, int16 version) { } else { std::cerr << "Error in GetDoorsCountPlusOne query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return -1; } @@ -634,15 +633,15 @@ int32 ZoneDatabase::GetDoorsCountPlusOne(const char *zone_name, int16 version) { int32 ZoneDatabase::GetDoorsDBCountPlusOne(const char *zone_name, int16 version) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 oMaxID = 0; MYSQL_RES *result; MYSQL_ROW row; - query = new char[256]; - sprintf(query, "SELECT MAX(doorid) FROM doors WHERE zone='%s' AND (version=%u OR version=-1)", zone_name, version); - if (RunQuery(query, strlen(query), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT MAX(doorid) FROM doors WHERE zone='%s' AND (version=%u OR version=-1)", zone_name, version); + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if (row != nullptr && row[1] != 0) { if (row[0]) @@ -656,7 +655,6 @@ int32 ZoneDatabase::GetDoorsDBCountPlusOne(const char *zone_name, int16 version) } else { std::cerr << "Error in GetDoorsCountPlusOne query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return -1; } @@ -666,17 +664,20 @@ int32 ZoneDatabase::GetDoorsDBCountPlusOne(const char *zone_name, int16 version) bool ZoneDatabase::LoadDoors(int32 iDoorCount, Door *into, const char *zone_name, int16 version) { LogFile->write(EQEMuLog::Status, "Loading Doors from database..."); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; // Door tmpDoor; - MakeAnyLenString(&query, "SELECT id,doorid,zone,name,pos_x,pos_y,pos_z,heading," - "opentype,guild,lockpick,keyitem,nokeyring,triggerdoor,triggertype,dest_zone,dest_instance,dest_x," - "dest_y,dest_z,dest_heading,door_param,invert_state,incline,size,is_ldon_door,client_version_mask " - "FROM doors WHERE zone='%s' AND (version=%u OR version=-1) ORDER BY doorid asc", zone_name, version); - if (RunQuery(query, strlen(query), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT id,doorid,zone,name,pos_x,pos_y,pos_z,heading," + "opentype,guild,lockpick,keyitem,nokeyring,triggerdoor," + "triggertype,dest_zone,dest_instance,dest_x," + "dest_y,dest_z,dest_heading,door_param,invert_state," + "incline,size,is_ldon_door,client_version_mask " + "FROM doors WHERE zone='%s' AND (version=%u OR version=-1) " + "ORDER BY doorid asc", zone_name, version); + + if (RunQuery(query, errbuf, &result)) { int32 r; for(r = 0; (row = mysql_fetch_row(result)); r++) { if(r >= iDoorCount) { @@ -717,7 +718,6 @@ bool ZoneDatabase::LoadDoors(int32 iDoorCount, Door *into, const char *zone_name else { std::cerr << "Error in DBLoadDoors query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } return true; diff --git a/zone/forage.cpp b/zone/forage.cpp index 3c97c12a8..70d730d64 100644 --- a/zone/forage.cpp +++ b/zone/forage.cpp @@ -86,7 +86,7 @@ CREATE TABLE fishing ( // This allows EqEmu to have zone specific foraging - BoB uint32 ZoneDatabase::GetZoneForage(uint32 ZoneID, uint8 skill) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -101,13 +101,14 @@ uint32 ZoneDatabase::GetZoneForage(uint32 ZoneID, uint8 skill) { uint32 chancepool = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT itemid,chance FROM forage WHERE zoneid= '%i' and level <= '%i' LIMIT %i", ZoneID, skill, FORAGE_ITEM_LIMIT), errbuf, &result)) + StringFormat(query,"SELECT itemid,chance FROM forage WHERE zoneid= '%i' and level <= '%i' LIMIT %i", ZoneID, skill, FORAGE_ITEM_LIMIT); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while ((row = mysql_fetch_row(result)) && (index < FORAGE_ITEM_LIMIT)) { item[index] = atoi(row[0]); chance[index] = atoi(row[1])+chancepool; -LogFile->write(EQEMuLog::Error, "Possible Forage: %d with a %d chance", item[index], chance[index]); + LogFile->write(EQEMuLog::Error, "Possible Forage: %d with a %d chance", item[index], chance[index]); chancepool = chance[index]; index++; } @@ -115,8 +116,7 @@ LogFile->write(EQEMuLog::Error, "Possible Forage: %d with a %d chance", item[ind mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in Forage query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Forage query '%s': %s", query.c_str(), errbuf); return 0; } @@ -144,7 +144,7 @@ LogFile->write(EQEMuLog::Error, "Possible Forage: %d with a %d chance", item[ind uint32 ZoneDatabase::GetZoneFishing(uint32 ZoneID, uint8 skill, uint32 &npc_id, uint8 &npc_chance) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -161,9 +161,10 @@ uint32 ZoneDatabase::GetZoneFishing(uint32 ZoneID, uint8 skill, uint32 &npc_id, chance[c]=0; } - if (RunQuery(query, MakeAnyLenString(&query, "SELECT itemid,chance,npc_id,npc_chance FROM fishing WHERE (zoneid= '%i' || zoneid = 0) and skill_level <= '%i'",ZoneID, skill ), errbuf, &result)) + StringFormat(query,"SELECT itemid,chance,npc_id,npc_chance FROM fishing WHERE (zoneid= '%i' || zoneid = 0) and skill_level <= '%i'",ZoneID, skill ); + + if (RunQuery(query,errbuf, &result)) { - safe_delete_array(query); while ((row = mysql_fetch_row(result))&&(index<50)) { item[index] = atoi(row[0]); chance[index] = atoi(row[1])+chancepool; @@ -178,7 +179,6 @@ uint32 ZoneDatabase::GetZoneFishing(uint32 ZoneID, uint8 skill, uint32 &npc_id, } else { std::cerr << "Error in Fishing query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return 0; } diff --git a/zone/groups.cpp b/zone/groups.cpp index 429987bb3..44662bb63 100644 --- a/zone/groups.cpp +++ b/zone/groups.cpp @@ -957,16 +957,17 @@ void Group::TeleportGroup(Mob* sender, uint32 zoneID, uint16 instance_id, float bool Group::LearnMembers() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query,MakeAnyLenString(&query, "SELECT name FROM group_id WHERE groupid=%lu", (unsigned long)GetID()), - errbuf,&result)){ - safe_delete_array(query); + + StringFormat(query, "SELECT name FROM group_id WHERE groupid=%lu", (unsigned long)GetID()); + + if (database.RunQuery(query,errbuf,&result)){ if(mysql_num_rows(result) < 1) { //could prolly be 2 mysql_free_result(result); LogFile->write(EQEMuLog::Error, "Error getting group members for group %lu: %s", (unsigned long)GetID(), errbuf); - return(false); + return false; } int i = 0; while((row = mysql_fetch_row(result))) { @@ -980,7 +981,7 @@ bool Group::LearnMembers() { mysql_free_result(result); } - return(true); + return true; } void Group::VerifyGroup() { @@ -1273,13 +1274,14 @@ void Group::DelegateMainTank(const char *NewMainTankName, uint8 toggle) if(updateDB) { char errbuff[MYSQL_ERRMSG_SIZE]; - char *Query = nullptr; + std::string query; - if (!database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE group_leaders SET maintank='%s' WHERE gid=%i LIMIT 1", - MainTankName.c_str(), GetID()), errbuff)) + StringFormat(query, "UPDATE group_leaders SET maintank='%s' WHERE gid=%i LIMIT 1", + MainTankName.c_str(), GetID()); + + if (!database.RunQuery(query, errbuff)) LogFile->write(EQEMuLog::Error, "Unable to set group main tank: %s\n", errbuff); - safe_delete_array(Query); } } @@ -1322,13 +1324,14 @@ void Group::DelegateMainAssist(const char *NewMainAssistName, uint8 toggle) if(updateDB) { char errbuff[MYSQL_ERRMSG_SIZE]; - char *Query = nullptr; + std::string query; - if (!database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE group_leaders SET assist='%s' WHERE gid=%i LIMIT 1", - MainAssistName.c_str(), GetID()), errbuff)) + StringFormat(query, "UPDATE group_leaders SET assist='%s' WHERE gid=%i LIMIT 1", + MainAssistName.c_str(), GetID()); + + if (!database.RunQuery(query, errbuff)) LogFile->write(EQEMuLog::Error, "Unable to set group main assist: %s\n", errbuff); - safe_delete_array(Query); } } @@ -1371,13 +1374,14 @@ void Group::DelegatePuller(const char *NewPullerName, uint8 toggle) if(updateDB) { char errbuff[MYSQL_ERRMSG_SIZE]; - char *Query = nullptr; + std::string query; - if (!database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE group_leaders SET puller='%s' WHERE gid=%i LIMIT 1", - PullerName.c_str(), GetID()), errbuff)) + StringFormat(query, "UPDATE group_leaders SET puller='%s' WHERE gid=%i LIMIT 1", + PullerName.c_str(), GetID()); + + if (!database.RunQuery(query, errbuff)) LogFile->write(EQEMuLog::Error, "Unable to set group main puller: %s\n", errbuff); - safe_delete_array(Query); } } @@ -1525,14 +1529,14 @@ void Group::UnDelegateMainTank(const char *OldMainTankName, uint8 toggle) if(OldMainTankName == MainTankName) { char errbuff[MYSQL_ERRMSG_SIZE]; - char *Query = 0; + std::string query; - if (!database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE group_leaders SET maintank='' WHERE gid=%i LIMIT 1", - GetID()), errbuff)) + StringFormat(query, "UPDATE group_leaders SET maintank='' WHERE gid=%i LIMIT 1", + GetID()); + + if (!database.RunQuery(query, errbuff)) LogFile->write(EQEMuLog::Error, "Unable to clear group main tank: %s\n", errbuff); - safe_delete_array(Query); - if(!toggle) { for(uint32 i = 0; i < MAX_GROUP_MEMBERS; ++i) { if(members[i] && members[i]->IsClient()) @@ -1579,13 +1583,14 @@ void Group::UnDelegateMainAssist(const char *OldMainAssistName, uint8 toggle) char errbuff[MYSQL_ERRMSG_SIZE]; - char *Query = 0; + std::string query; - if (!database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE group_leaders SET assist='' WHERE gid=%i LIMIT 1", - GetID()), errbuff)) + StringFormat(query, "UPDATE group_leaders SET assist='' WHERE gid=%i LIMIT 1", + GetID()); + + if (!database.RunQuery(query, errbuff)) LogFile->write(EQEMuLog::Error, "Unable to clear group main assist: %s\n", errbuff); - safe_delete_array(Query); if(!toggle) { @@ -1610,15 +1615,14 @@ void Group::UnDelegatePuller(const char *OldPullerName, uint8 toggle) // if(OldPullerName == PullerName) { char errbuff[MYSQL_ERRMSG_SIZE]; + std::string query; - char *Query = 0; + StringFormat(query, "UPDATE group_leaders SET puller='' WHERE gid=%i LIMIT 1", + GetID()); - if (!database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE group_leaders SET puller='' WHERE gid=%i LIMIT 1", - GetID()), errbuff)) + if (!database.RunQuery(query, errbuff)) LogFile->write(EQEMuLog::Error, "Unable to clear group main puller: %s\n", errbuff); - safe_delete_array(Query); - if(!toggle) { for(uint32 i = 0; i < MAX_GROUP_MEMBERS; ++i) { if(members[i] && members[i]->IsClient()) @@ -1754,13 +1758,14 @@ void Group::DelegateMarkNPC(const char *NewNPCMarkerName) char errbuff[MYSQL_ERRMSG_SIZE]; - char *Query = 0; + std::string query; - if (!database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE group_leaders SET marknpc='%s' WHERE gid=%i LIMIT 1", - NewNPCMarkerName, GetID()), errbuff)) + StringFormat(query, "UPDATE group_leaders SET marknpc='%s' WHERE gid=%i LIMIT 1", + NewNPCMarkerName, GetID()); + + if (!database.RunQuery(query, errbuff)) LogFile->write(EQEMuLog::Error, "Unable to set group mark npc: %s\n", errbuff); - safe_delete_array(Query); } @@ -1840,13 +1845,14 @@ void Group::UnDelegateMarkNPC(const char *OldNPCMarkerName) char errbuff[MYSQL_ERRMSG_SIZE]; - char *Query = 0; + std::string query; - if (!database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE group_leaders SET marknpc='' WHERE gid=%i LIMIT 1", - GetID()), errbuff)) + StringFormat(query, "UPDATE group_leaders SET marknpc='' WHERE gid=%i LIMIT 1", + GetID()); + + if (!database.RunQuery(query, errbuff)) LogFile->write(EQEMuLog::Error, "Unable to clear group marknpc: %s\n", errbuff); - safe_delete_array(Query); } void Group::SaveGroupLeaderAA() @@ -1854,21 +1860,24 @@ void Group::SaveGroupLeaderAA() // Stores the Group Leaders Leadership AA data from the Player Profile as a blob in the group_leaders table. // This is done so that group members not in the same zone as the Leader still have access to this information. - char *Query = new char[200 + sizeof(GroupLeadershipAA_Struct)*2]; + std::string leaderAABuffer; - char *End = Query; + std::string endingOfQuery; - End += sprintf(End, "UPDATE group_leaders SET leadershipaa='"); + std::string query = "UPDATE group_leaders SET leadershipaa='"; - End += database.DoEscapeString(End, (char*)&LeaderAbilities, sizeof(GroupLeadershipAA_Struct)); + database.DoEscapeString(leaderAABuffer, (char*)&LeaderAbilities, sizeof(GroupLeadershipAA_Struct)); - End += sprintf(End,"' WHERE gid=%i LIMIT 1", GetID()); + query.append(leaderAABuffer); + + StringFormat(endingOfQuery, "' WHERE gid=%i LIMIT 1", GetID()); + + query.append(endingOfQuery); char errbuff[MYSQL_ERRMSG_SIZE]; - if (!database.RunQuery(Query, End - Query, errbuff)) + if (!database.RunQuery(query, errbuff)) LogFile->write(EQEMuLog::Error, "Unable to store LeadershipAA: %s\n", errbuff); - safe_delete_array(Query); } void Group::UnMarkNPC(uint16 ID) diff --git a/zone/guild.cpp b/zone/guild.cpp index 8d041a35a..51a7fb3b0 100644 --- a/zone/guild.cpp +++ b/zone/guild.cpp @@ -381,14 +381,14 @@ void Client::GuildChangeRank(const char* name, uint32 guild_id, uint32 oldrank, bool ZoneDatabase::CheckGuildDoor(uint8 doorid,uint16 guild_id,const char* zone) { MYSQL_ROW row; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; - if (!RunQuery(query, MakeAnyLenString(&query, - "SELECT guild FROM doors where doorid=%i AND zone='%s'", - doorid-128, zone), errbuf, &result)) - { - LogFile->write(EQEMuLog::Error, "Error in CheckGuildDoor query '%s': %s", query, errbuf); - safe_delete_array(query); + + StringFormat(query, "SELECT guild FROM doors where doorid=%i AND zone='%s'", + doorid-128, zone); + + if (!RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in CheckGuildDoor query '%s': %s", query.c_str(), errbuf); return false; } else { if (mysql_num_rows(result) == 1) { @@ -414,21 +414,19 @@ bool ZoneDatabase::CheckGuildDoor(uint8 doorid,uint16 guild_id,const char* zone) bool ZoneDatabase::SetGuildDoor(uint8 doorid,uint16 guild_id, const char* zone) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; if (doorid > 127) doorid = doorid - 128; - if (!RunQuery(query, MakeAnyLenString(&query, - "UPDATE doors SET guild = %i WHERE (doorid=%i) AND (zone='%s')", - guild_id, doorid, zone), errbuf, 0,&affected_rows)) - { - LogFile->write(EQEMuLog::Error, "Error in SetGuildDoor query '%s': %s", query, errbuf); - safe_delete_array(query); + + StringFormat(query, "UPDATE doors SET guild = %i WHERE (doorid=%i) AND (zone='%s')", + guild_id, doorid, zone); + + if (!RunQuery(query, errbuf, nullptr,&affected_rows)) { + LogFile->write(EQEMuLog::Error, "Error in SetGuildDoor query '%s': %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); - return(affected_rows > 0); } diff --git a/zone/guild_mgr.cpp b/zone/guild_mgr.cpp index 19ef5aec3..dd41c2533 100644 --- a/zone/guild_mgr.cpp +++ b/zone/guild_mgr.cpp @@ -646,18 +646,15 @@ GuildBankManager::~GuildBankManager() bool GuildBankManager::Load(uint32 GuildID) { - const char *LoadQuery = "SELECT `area`, `slot`, `itemid`, `qty`, `donator`, `permissions`, `whofor` from `guild_bank` " - "WHERE `guildid` = %i"; - char errbuf[MYSQL_ERRMSG_SIZE]; - - char* query = 0; - + std::string query; MYSQL_RES *result; - MYSQL_ROW row; - if(database.RunQuery(query, MakeAnyLenString(&query, LoadQuery, GuildID), errbuf, &result)) + StringFormat(query, "SELECT `area`, `slot`, `itemid`, `qty`, `donator`, `permissions`, `whofor` " + "FROM `guild_bank` WHERE `guildid` = %i", GuildID); + + if(database.RunQuery(query, errbuf, &result)) { GuildBank *Bank = new GuildBank; @@ -727,15 +724,12 @@ bool GuildBankManager::Load(uint32 GuildID) } mysql_free_result(result); - safe_delete_array(query); Banks.push_back(Bank); } else { - _log(GUILDS__BANK_ERROR, "Error Loading guild bank: %s, %s", query, errbuf); - - safe_delete_array(query); + _log(GUILDS__BANK_ERROR, "Error Loading guild bank: %s, %s", query.c_str(), errbuf); return false; } @@ -930,24 +924,23 @@ bool GuildBankManager::AddItem(uint32 GuildID, uint8 Area, uint32 ItemID, int32 return false; } - const char *Query="INSERT INTO `guild_bank` (`guildid`, `area`, `slot`, `itemid`, `qty`, `donator`, `permissions`, `WhoFor`) " - "VALUES (%i, %i, %i, %i, %i, '%s', %i, '%s')"; - char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; - if(!database.RunQuery(query, MakeAnyLenString(&query, Query, GuildID, Area, Slot, ItemID, QtyOrCharges, Donator, Permissions, WhoFor), errbuf)) + StringFormat(query, "INSERT INTO `guild_bank` " + "(`guildid`, `area`, `slot`, `itemid`, `qty`, `donator`, `permissions`, `WhoFor`) " + "VALUES (%i, %i, %i, %i, %i, '%s', %i, '%s')", + GuildID, Area, Slot, ItemID, QtyOrCharges, + Donator, Permissions, WhoFor); + + if(!database.RunQuery(query, errbuf)) { - _log(GUILDS__BANK_ERROR, "Insert Error: %s : %s", query, errbuf); - - safe_delete_array(query); + _log(GUILDS__BANK_ERROR, "Insert Error: %s : %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); - const Item_Struct *Item = database.GetItem(ItemID); GuildBankItemUpdate_Struct gbius; @@ -1013,23 +1006,20 @@ int GuildBankManager::Promote(uint32 GuildID, int SlotID) strn0cpy((*Iterator)->Items.MainArea[MainSlot].WhoFor, (*Iterator)->Items.DepositArea[SlotID].WhoFor, sizeof((*Iterator)->Items.MainArea[MainSlot].WhoFor)); - const char *Query="UPDATE `guild_bank` SET `area` = 1, `slot` = %i WHERE `guildid` = %i AND `area` = 0 AND `slot` = %i LIMIT 1"; - char errbuf[MYSQL_ERRMSG_SIZE]; + std::string query; - char* query = 0; + StringFormat(query, "UPDATE `guild_bank` SET `area` = 1, `slot` = %i WHERE " + "`guildid` = %i AND `area` = 0 AND `slot` = %i LIMIT 1", + MainSlot, GuildID, SlotID); - if(!database.RunQuery(query, MakeAnyLenString(&query, Query, MainSlot, GuildID, SlotID), errbuf)) + if(!database.RunQuery(query, errbuf)) { - _log(GUILDS__BANK_ERROR, "error promoting item: %s : %s", query, errbuf); - - safe_delete_array(query); + _log(GUILDS__BANK_ERROR, "error promoting item: %s : %s", query.c_str(), errbuf); return -1; } - safe_delete_array(query); - (*Iterator)->Items.DepositArea[SlotID].ItemID = 0; const Item_Struct *Item = database.GetItem((*Iterator)->Items.MainArea[MainSlot].ItemID); @@ -1076,22 +1066,17 @@ void GuildBankManager::SetPermissions(uint32 GuildID, uint16 SlotID, uint32 Perm return; } - const char *Query="UPDATE `guild_bank` SET `permissions` = %i, `whofor` = '%s' WHERE `guildid` = %i AND `area` = 1 AND `slot` = %i LIMIT 1"; - char errbuf[MYSQL_ERRMSG_SIZE]; + std::string query; - char* query = 0; + StringFormat(query, "UPDATE `guild_bank` SET `permissions` = %i, `whofor` = '%s' WHERE `guildid` = %i AND `area` = 1 AND `slot` = %i LIMIT 1",Permissions, MemberName, GuildID, SlotID); - if(!database.RunQuery(query, MakeAnyLenString(&query, Query, Permissions, MemberName, GuildID, SlotID), errbuf)) - { - _log(GUILDS__BANK_ERROR, "error changing permissions: %s : %s", query, errbuf); - - safe_delete_array(query); + if(!database.RunQuery(query, errbuf)) { + _log(GUILDS__BANK_ERROR, "error changing permissions: %s : %s", query.c_str(), errbuf); return; } - safe_delete_array(query); (*Iterator)->Items.MainArea[SlotID].Permissions = Permissions; @@ -1217,7 +1202,7 @@ bool GuildBankManager::DeleteItem(uint32 GuildID, uint16 Area, uint16 SlotID, ui char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; GuildBankItem* BankArea = nullptr; @@ -1243,37 +1228,34 @@ bool GuildBankManager::DeleteItem(uint32 GuildID, uint16 Area, uint16 SlotID, ui if(!Item->Stackable || (Quantity >= BankArea[SlotID].Quantity)) { - const char *Query = "DELETE from `guild_bank` where `guildid` = %i AND `area` = %i AND `slot` = %i LIMIT 1"; + StringFormat(query, "DELETE from `guild_bank` where `guildid` = %i " + "AND `area` = %i AND `slot` = %i LIMIT 1", + GuildID, Area, SlotID); - if(!database.RunQuery(query, MakeAnyLenString(&query, Query, GuildID, Area, SlotID), errbuf)) + if(!database.RunQuery(query, errbuf)) { - _log(GUILDS__BANK_ERROR, "Delete item failed. %s : %s", query, errbuf); - - safe_delete_array(query); + _log(GUILDS__BANK_ERROR, "Delete item failed. %s : %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); - BankArea[SlotID].ItemID = 0; } else { - const char *Query = "UPDATE `guild_bank` SET `qty` = %i where `guildid` = %i AND `area` = %i AND `slot` = %i LIMIT 1"; + std::string query; - if(!database.RunQuery(query, MakeAnyLenString(&query, Query, BankArea[SlotID].Quantity - Quantity, - GuildID, Area, SlotID), errbuf)) + StringFormat(query, "UPDATE `guild_bank` SET `qty` = %i where " + "`guildid` = %i AND `area` = %i AND `slot` = %i LIMIT 1", + BankArea[SlotID].Quantity - Quantity, GuildID, Area, SlotID); + + if(!database.RunQuery(query, errbuf)) { - _log(GUILDS__BANK_ERROR, "Update item failed. %s : %s", query, errbuf); - - safe_delete_array(query); + _log(GUILDS__BANK_ERROR, "Update item failed. %s : %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); - BankArea[SlotID].Quantity -= Quantity; Deleted = false; @@ -1427,21 +1409,19 @@ void GuildBankManager::UpdateItemQuantity(uint32 GuildID, uint16 Area, uint16 Sl // Helper method for MergeStacks. Assuming all passed parameters are valid. // char errbuf[MYSQL_ERRMSG_SIZE]; + std::string query; - char* query = 0; + StringFormat(query, "UPDATE `guild_bank` SET `qty` = %i where " + "`guildid` = %i AND `area` = %i AND `slot` = %i LIMIT 1", + Quantity, GuildID, Area, SlotID); - const char *Query = "UPDATE `guild_bank` SET `qty` = %i where `guildid` = %i AND `area` = %i AND `slot` = %i LIMIT 1"; - - if(!database.RunQuery(query, MakeAnyLenString(&query, Query, Quantity, GuildID, Area, SlotID), errbuf)) + if(!database.RunQuery(query, errbuf)) { - _log(GUILDS__BANK_ERROR, "Update item quantity failed. %s : %s", query, errbuf); - - safe_delete_array(query); + _log(GUILDS__BANK_ERROR, "Update item quantity failed. %s : %s", query.c_str(), errbuf); return; } - safe_delete_array(query); } bool GuildBankManager::AllowedToWithdraw(uint32 GuildID, uint16 Area, uint16 SlotID, const char *Name) diff --git a/zone/horse.cpp b/zone/horse.cpp index e77dd9692..59a264daa 100644 --- a/zone/horse.cpp +++ b/zone/horse.cpp @@ -72,13 +72,14 @@ const NPCType *Horse::BuildHorseType(uint16 spell_id) { char mount_color = 0; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query,MakeAnyLenString(&query, "SELECT race,gender,texture,mountspeed FROM horses WHERE filename='%s'", FileName), errbuf, &result)) { + StringFormat(query, "SELECT race,gender,texture,mountspeed FROM horses WHERE filename='%s'", FileName); + + if (database.RunQuery(query,errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -119,14 +120,12 @@ const NPCType *Horse::BuildHorseType(uint16 spell_id) { else { LogFile->write(EQEMuLog::Error, "No Database entry for mount: %s, check the horses table", FileName); //Message(13, "Unable to find data for mount %s", FileName); - safe_delete_array(query); } mysql_free_result(result); return nullptr; } else { - LogFile->write(EQEMuLog::Error, "Error in Mount query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Mount query '%s': %s", query.c_str(), errbuf); return nullptr; } diff --git a/zone/merc.cpp b/zone/merc.cpp index 0e652ff5a..e98dc75b4 100644 --- a/zone/merc.cpp +++ b/zone/merc.cpp @@ -5928,12 +5928,20 @@ void Client::SendMercAssignPacket(uint32 entityID, uint32 unk01, uint32 unk02) { void NPC::LoadMercTypes(){ std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT DISTINCT MTyp.dbstring, MTyp.clientversion FROM merc_merchant_entries MME, merc_merchant_template_entries MMTE, merc_types MTyp, merc_templates MTem WHERE MME.merchant_id = %i AND MME.merc_merchant_template_id = MMTE.merc_merchant_template_id AND MMTE.merc_template_id = MTem.merc_template_id AND MTem.merc_type_id = MTyp.merc_type_id;", GetNPCTypeID()), TempErrorMessageBuffer, &DatasetResult)) { + + StringFormat(query,"SELECT DISTINCT MTyp.dbstring, MTyp.clientversion FROM " + "merc_merchant_entries MME, merc_merchant_template_entries MMTE, " + "merc_types MTyp, merc_templates MTem WHERE MME.merchant_id = %i " + "AND MME.merc_merchant_template_id = MMTE.merc_merchant_template_id " + "AND MMTE.merc_template_id = MTem.merc_template_id AND " + "MTem.merc_type_id = MTyp.merc_type_id;", + GetNPCTypeID()); + + if(!database.RunQuery(query,TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -5949,9 +5957,6 @@ void NPC::LoadMercTypes(){ mysql_free_result(DatasetResult); } - safe_delete_array(Query); - Query = 0; - if(!errorMessage.empty()) { LogFile->write(EQEMuLog::Error, "Error in NPC::LoadMercTypes()"); } @@ -5960,12 +5965,24 @@ void NPC::LoadMercTypes(){ void NPC::LoadMercs(){ std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT DISTINCT MTem.merc_template_id, MTyp.dbstring AS merc_type_id, MTem.dbstring AS merc_subtype_id, 0 AS CostFormula, CASE WHEN MTem.clientversion > MTyp.clientversion then MTem.clientversion ELSE MTyp.clientversion END AS clientversion, MTem.merc_npc_type_id FROM merc_merchant_entries MME, merc_merchant_template_entries MMTE, merc_types MTyp, merc_templates MTem WHERE MME.merchant_id = %i AND MME.merc_merchant_template_id = MMTE.merc_merchant_template_id AND MMTE.merc_template_id = MTem.merc_template_id AND MTem.merc_type_id = MTyp.merc_type_id;", GetNPCTypeID()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT DISTINCT MTem.merc_template_id, MTyp.dbstring " + "AS merc_type_id, MTem.dbstring AS merc_subtype_id, 0 AS CostFormula, " + "CASE WHEN MTem.clientversion > MTyp.clientversion then " + "MTem.clientversion ELSE MTyp.clientversion END AS " + "clientversion, MTem.merc_npc_type_id FROM " + "merc_merchant_entries MME, merc_merchant_template_entries MMTE, " + "merc_types MTyp, merc_templates MTem WHERE MME.merchant_id = %i " + "AND MME.merc_merchant_template_id = MMTE.merc_merchant_template_id " + "AND MMTE.merc_template_id = MTem.merc_template_id AND " + "MTem.merc_type_id = MTyp.merc_type_id;", + GetNPCTypeID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -5985,8 +6002,6 @@ void NPC::LoadMercs(){ mysql_free_result(DatasetResult); } - safe_delete_array(Query); - Query = 0; if(!errorMessage.empty()) { LogFile->write(EQEMuLog::Error, "Error in NPC::LoadMercTypes()"); diff --git a/zone/mob.cpp b/zone/mob.cpp index 33560ed55..e1299b24d 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -3729,7 +3729,7 @@ void Mob::TarGlobal(const char *varname, const char *value, const char *duration void Mob::DelGlobal(const char *varname) { // delglobal(varname) char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; int qgZoneid=zone->GetZoneID(); int qgCharid=0; int qgNpcid=0; @@ -3748,15 +3748,14 @@ void Mob::DelGlobal(const char *varname) { qgCharid = -qgNpcid; // make char id negative npc id as a fudge } - if (!database.RunQuery(query, - MakeAnyLenString(&query, - "DELETE FROM quest_globals WHERE name='%s'" - " && (npcid=0 || npcid=%i) && (charid=0 || charid=%i) && (zoneid=%i || zoneid=0)", - varname,qgNpcid,qgCharid,qgZoneid),errbuf)) - { + StringFormat(query,"DELETE FROM quest_globals WHERE name='%s' && " + "(npcid=0 || npcid=%i) && " + "(charid=0 || charid=%i) && (zoneid=%i || zoneid=0)", + varname,qgNpcid,qgCharid,qgZoneid); + + if (!database.RunQuery(query,errbuf)) { //_log(QUESTS, "DelGlobal error deleting %s : %s", varname, errbuf); } - safe_delete_array(query); if(zone) { @@ -3779,7 +3778,7 @@ void Mob::DelGlobal(const char *varname) { // Inserts global variable into quest_globals table void Mob::InsertQuestGlobal(int charid, int npcid, int zoneid, const char *varname, const char *varvalue, int duration) { - char *query = 0; + std::string query; char errbuf[MYSQL_ERRMSG_SIZE]; // Make duration string either "unix_timestamp(now()) + xxx" or "NULL" @@ -3797,15 +3796,15 @@ void Mob::InsertQuestGlobal(int charid, int npcid, int zoneid, const char *varna //NOTE: this should be escaping the contents of arglist //npcwise a malicious script can arbitrarily alter the DB uint32 last_id = 0; - if (!database.RunQuery(query, MakeAnyLenString(&query, - "REPLACE INTO quest_globals (charid, npcid, zoneid, name, value, expdate)" - "VALUES (%i, %i, %i, '%s', '%s', %s)", - charid, npcid, zoneid, varname, varvalue, duration_ss.str().c_str() - ), errbuf)) + + StringFormat(query, "REPLACE INTO quest_globals (charid, npcid, zoneid, name, value, expdate)" + "VALUES (%i, %i, %i, '%s', '%s', %s)", + charid, npcid, zoneid, varname, varvalue, duration_ss.str().c_str()); + + if (!database.RunQuery(query, errbuf)) { //_log(QUESTS, "SelGlobal error inserting %s : %s", varname, errbuf); } - safe_delete_array(query); if(zone) { @@ -4675,18 +4674,18 @@ FACTION_VALUE Mob::GetSpecialFactionCon(Mob* iOther) { bool Mob::HasSpellEffect(int effectid) { - int i; + int i; - uint32 buff_count = GetMaxTotalSlots(); - for(i = 0; i < buff_count; i++) - { - if(buffs[i].spellid == SPELL_UNKNOWN) { continue; } + uint32 buff_count = GetMaxTotalSlots(); + for(i = 0; i < buff_count; i++) + { + if(buffs[i].spellid == SPELL_UNKNOWN) { continue; } - if(IsEffectInSpell(buffs[i].spellid, effectid)) - { - return(1); - } - } - return(0); + if(IsEffectInSpell(buffs[i].spellid, effectid)) + { + return(1); + } + } + return(0); } diff --git a/zone/npc.cpp b/zone/npc.cpp index f163743c3..2befbfbcd 100644 --- a/zone/npc.cpp +++ b/zone/npc.cpp @@ -982,7 +982,7 @@ NPC* NPC::SpawnNPC(const char* spawncommand, float in_x, float in_y, float in_z, uint32 ZoneDatabase::NPCSpawnDB(uint8 command, const char* zone, uint32 zone_version, Client *c, NPC* spawn, uint32 extra) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 tmp = 0; @@ -996,7 +996,11 @@ uint32 ZoneDatabase::NPCSpawnDB(uint8 command, const char* zone, uint32 zone_ver { // Set an npc_type ID within the standard range for the current zone if possible (zone_id * 1000) int starting_npc_id = c->GetZoneID() * 1000; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT MAX(id) FROM npc_types WHERE id >= %i AND id < %i", starting_npc_id, (starting_npc_id + 1000)), errbuf, &result)) { + + StringFormat(query, "SELECT MAX(id) FROM npc_types WHERE id >= %i AND id < %i", + starting_npc_id, (starting_npc_id + 1000)); + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if(row) { @@ -1016,66 +1020,105 @@ uint32 ZoneDatabase::NPCSpawnDB(uint8 command, const char* zone, uint32 zone_ver } } - safe_delete_array(query); mysql_free_result(result); } } - char tmpstr[64]; + + char *tmpstr; + EntityList::RemoveNumbers(strn0cpy(tmpstr, spawn->GetName(), sizeof(tmpstr))); if (npc_type_id) { - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO npc_types (id, name, level, race, class, hp, gender, texture, helmtexture, size, loottable_id, merchant_id, face, runspeed, prim_melee_type, sec_melee_type) values(%i,\"%s\",%i,%i,%i,%i,%i,%i,%i,%f,%i,%i,%i,%f,%i,%i)", npc_type_id, tmpstr, spawn->GetLevel(), spawn->GetRace(), spawn->GetClass(), spawn->GetMaxHP(), spawn->GetGender(), spawn->GetTexture(), spawn->GetHelmTexture(), spawn->GetSize(), spawn->GetLoottableID(), spawn->MerchantType, 0, spawn->GetRunspeed(), 28, 28), errbuf, 0, 0, &npc_type_id)) { - LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query, errbuf); - safe_delete(query); + StringFormat(query,"INSERT INTO npc_types " + "(id, name, level, race, class, hp, gender, " + "texture, helmtexture, size, loottable_id, " + "merchant_id, face, runspeed, prim_melee_type, sec_melee_type) " + "values(%i,\"%s\",%i,%i,%i,%i,%i,%i,%i,%f,%i,%i,%i,%f,%i,%i)", + npc_type_id, tmpstr, spawn->GetLevel(), spawn->GetRace(), + spawn->GetClass(), spawn->GetMaxHP(), spawn->GetGender(), + spawn->GetTexture(), spawn->GetHelmTexture(), spawn->GetSize(), + spawn->GetLoottableID(), spawn->MerchantType, 0, spawn->GetRunspeed(), + 28, 28); + + if (!RunQuery(query, errbuf, 0, 0, &npc_type_id)) { + LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query.c_str(), errbuf); return false; } } else { - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO npc_types (name, level, race, class, hp, gender, texture, helmtexture, size, loottable_id, merchant_id, face, runspeed, prim_melee_type, sec_melee_type) values(\"%s\",%i,%i,%i,%i,%i,%i,%i,%f,%i,%i,%i,%f,%i,%i)", tmpstr, spawn->GetLevel(), spawn->GetRace(), spawn->GetClass(), spawn->GetMaxHP(), spawn->GetGender(), spawn->GetTexture(), spawn->GetHelmTexture(), spawn->GetSize(), spawn->GetLoottableID(), spawn->MerchantType, 0, spawn->GetRunspeed(), 28, 28), errbuf, 0, 0, &npc_type_id)) { - LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query, errbuf); - safe_delete(query); + StringFormat(query, "INSERT INTO npc_types " + "(name, level, race, class, hp, gender, texture, " + "helmtexture, size, loottable_id, merchant_id, face, " + "runspeed, prim_melee_type, sec_melee_type) " + "values(\"%s\",%i,%i,%i,%i,%i,%i,%i,%f,%i,%i,%i,%f,%i,%i)", + tmpstr, spawn->GetLevel(), spawn->GetRace(), spawn->GetClass(), + spawn->GetMaxHP(), spawn->GetGender(), spawn->GetTexture(), + spawn->GetHelmTexture(), spawn->GetSize(), spawn->GetLoottableID(), + spawn->MerchantType, 0, spawn->GetRunspeed(), 28, 28); + + if (!RunQuery(query, errbuf, 0, 0, &npc_type_id)) { + LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query.c_str(), errbuf); return false; } } - if(c) c->LogSQL(query); - safe_delete_array(query); - snprintf(tmpstr, sizeof(tmpstr), "%s-%s", zone, spawn->GetName()); - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO spawngroup (id, name) values(%i, '%s')", tmp, tmpstr), errbuf, 0, 0, &spawngroupid)) { - LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query, errbuf); - safe_delete(query); + if(c) + c->LogSQL(query.c_str()); + + std::string spawnIDAndName; + StringFormat(spawnIDAndName, "%s-%s", zone, spawn->GetName()); + + StringFormat(query,"INSERT INTO spawngroup (id, name) values(%i, '%s')", tmp, spawnIDAndName.c_str()); + + if (!RunQuery(query,errbuf, 0, 0, &spawngroupid)) { + LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query.c_str(), errbuf); return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO spawn2 (zone, version, x, y, z, respawntime, heading, spawngroupID) values('%s', %u, %f, %f, %f, %i, %f, %i)", zone, zone_version, spawn->GetX(), spawn->GetY(), spawn->GetZ(), 1200, spawn->GetHeading(), spawngroupid), errbuf, 0, 0, &tmp)) { - LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query, errbuf); - safe_delete(query); + + if(c) + c->LogSQL(query.c_str()); + + StringFormat(query, "INSERT INTO spawn2 " + "(zone, version, x, y, z, respawntime, heading, spawngroupID) " + "values('%s', %u, %f, %f, %f, %i, %f, %i)", + zone, zone_version, spawn->GetX(), spawn->GetY(), + spawn->GetZ(), 1200, spawn->GetHeading(), spawngroupid); + + if (!RunQuery(query, errbuf, 0, 0, &tmp)) { + LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query.c_str(), errbuf); return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO spawnentry (spawngroupID, npcID, chance) values(%i, %i, %i)", spawngroupid, npc_type_id, 100), errbuf, 0)) { - LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query, errbuf); - safe_delete(query); + + if(c) + c->LogSQL(query.c_str()); + + StringFormat(query, "INSERT INTO spawnentry (spawngroupID, npcID, chance) values(%i, %i, %i)", + spawngroupid, npc_type_id, 100); + + if (!RunQuery(query, errbuf, 0)) { + LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query.c_str(), errbuf); return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); + if(c) + c->LogSQL(query.c_str()); return true; break; } case 1:{ // Add new spawn group and spawn point for an existing NPC Type ID tmp2 = spawn->GetNPCTypeID(); - char tmpstr[64]; - snprintf(tmpstr, sizeof(tmpstr), "%s%s%i", zone, spawn->GetName(),Timer::GetCurrentTime()); - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO spawngroup (name) values('%s')", tmpstr), errbuf, 0, 0, &last_insert_id)) { - LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query, errbuf); - safe_delete(query); + std::string zoneSpawnNameTime; + + StringFormat(zoneSpawnNameTime, "%s%s%i", zone, spawn->GetName(),Timer::GetCurrentTime()); + + StringFormat(query, "INSERT INTO spawngroup (name) values('%s')", zoneSpawnNameTime.c_str()); + + if (!RunQuery(query, errbuf, 0, 0, &last_insert_id)) { + LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query.c_str(), errbuf); return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); + if(c) + c->LogSQL(query.c_str()); + uint32 respawntime = 0; uint32 spawnid = 0; @@ -1085,77 +1128,110 @@ uint32 ZoneDatabase::NPCSpawnDB(uint8 command, const char* zone, uint32 zone_ver respawntime = spawn->respawn2->RespawnTimer(); else respawntime = 1200; - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO spawn2 (zone, version, x, y, z, respawntime, heading, spawngroupID) values('%s', %u, %f, %f, %f, %i, %f, %i)", zone, zone_version, spawn->GetX(), spawn->GetY(), spawn->GetZ(), respawntime, spawn->GetHeading(), last_insert_id), errbuf, 0, 0, &spawnid)) { - LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query, errbuf); - safe_delete(query); + + StringFormat(query, "INSERT INTO spawn2 " + "(zone, version, x, y, z, respawntime, heading, spawngroupID) " + "values('%s', %u, %f, %f, %f, %i, %f, %i)", + zone, zone_version, spawn->GetX(), spawn->GetY(), spawn->GetZ(), + respawntime, spawn->GetHeading(), last_insert_id); + + if (!RunQuery(query,errbuf, 0, 0, &spawnid)) { + LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query.c_str(), errbuf); return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); + if(c) + c->LogSQL(query.c_str()); + + StringFormat(query,"INSERT INTO spawnentry " + "(spawngroupID, npcID, chance) " + "values(%i, %i, %i)", + last_insert_id, tmp2, 100); - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO spawnentry (spawngroupID, npcID, chance) values(%i, %i, %i)", last_insert_id, tmp2, 100), errbuf, 0)) { - LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query, errbuf); - safe_delete(query); + if (!RunQuery(query, errbuf, 0)) { + LogFile->write(EQEMuLog::Error, "NPCSpawnDB Error: %s %s", query.c_str(), errbuf); return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); + if(c) + c->LogSQL(query.c_str()); return spawnid; break; } case 2: { // Update npc_type appearance and other data on targeted spawn - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE npc_types SET name=\"%s\", level=%i, race=%i, class=%i, hp=%i, gender=%i, texture=%i, helmtexture=%i, size=%i, loottable_id=%i, merchant_id=%i, face=%i, WHERE id=%i", spawn->GetName(), spawn->GetLevel(), spawn->GetRace(), spawn->GetClass(), spawn->GetMaxHP(), spawn->GetGender(), spawn->GetTexture(), spawn->GetHelmTexture(), spawn->GetSize(), spawn->GetLoottableID(), spawn->MerchantType, spawn->GetNPCTypeID()), errbuf, 0)) { - if(c) c->LogSQL(query); - safe_delete_array(query); + + StringFormat(query, "UPDATE npc_types SET name=\"%s\", level=%i, race=%i, " + "class=%i, hp=%i, gender=%i, texture=%i, helmtexture=%i, " + "size=%i, loottable_id=%i, merchant_id=%i, face=%i, " + "WHERE id=%i", + spawn->GetName(), spawn->GetLevel(), spawn->GetRace(), + spawn->GetClass(), spawn->GetMaxHP(), spawn->GetGender(), + spawn->GetTexture(), spawn->GetHelmTexture(), spawn->GetSize(), + spawn->GetLoottableID(), spawn->MerchantType, spawn->GetNPCTypeID()); + + if (!RunQuery(query, errbuf, 0)) { + if(c) + c->LogSQL(query.c_str()); return true; } - else { - safe_delete_array(query); - return false; - } + return false; break; } case 3: { // delete spawn from spawning, but leave in npc_types table - if (!RunQuery(query, MakeAnyLenString(&query, "SELECT id,spawngroupID from spawn2 where zone='%s' AND spawngroupID=%i", zone, spawn->GetSp2()), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT id,spawngroupID from " + "spawn2 where zone='%s' AND " + "spawngroupID=%i", + zone, spawn->GetSp2()); + + if (!RunQuery(query, errbuf, &result)) { return 0; } - safe_delete_array(query); row = mysql_fetch_row(result); if (row == nullptr) return false; if (row[0]) tmp = atoi(row[0]); if (row[1]) tmp2 = atoi(row[1]); - - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM spawn2 WHERE id='%i'", tmp), errbuf,0)) { - safe_delete(query); + + StringFormat(query, "DELETE FROM spawn2 WHERE id='%i'", tmp); + + if (!RunQuery(query,errbuf,0)) { return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM spawngroup WHERE id='%i'", tmp2), errbuf,0)) { - safe_delete(query); + if(c) + c->LogSQL(query.c_str()); + + StringFormat(query, "DELETE FROM spawngroup WHERE id='%i'", tmp2); + + if (!RunQuery(query, errbuf,0)) { return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM spawnentry WHERE spawngroupID='%i'", tmp2), errbuf,0)) { - safe_delete(query); + + if(c) + c->LogSQL(query.c_str()); + + StringFormat(query, "DELETE FROM spawnentry WHERE spawngroupID='%i'", tmp2); + + if (!RunQuery(query, errbuf,0)) { return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); + + if(c) + c->LogSQL(query.c_str()); + return true; break; } case 4: { //delete spawn from DB (including npc_type) - if (!RunQuery(query, MakeAnyLenString(&query, "SELECT id,spawngroupID from spawn2 where zone='%s' AND version=%u AND spawngroupID=%i", zone, zone_version, spawn->GetSp2()), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query,"SELECT id,spawngroupID from spawn2 " + "where zone='%s' AND version=%u AND " + "spawngroupID=%i", + zone, zone_version, spawn->GetSp2()); + + if (!RunQuery(query, errbuf, &result)) { return(0); } - safe_delete_array(query); row = mysql_fetch_row(result); if (row == nullptr) return false; @@ -1163,40 +1239,59 @@ uint32 ZoneDatabase::NPCSpawnDB(uint8 command, const char* zone, uint32 zone_ver if (row[1]) tmp2 = atoi(row[1]); mysql_free_result(result); - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM spawn2 WHERE id='%i'", tmp), errbuf,0)) { - safe_delete(query); + StringFormat(query,"DELETE FROM spawn2 WHERE id='%i'", tmp); + + if (!RunQuery(query,errbuf,0)) { return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM spawngroup WHERE id='%i'", tmp2), errbuf,0)) { - safe_delete(query); + + if(c) + c->LogSQL(query.c_str()); + + StringFormat(query, "DELETE FROM spawngroup WHERE id='%i'", tmp2); + + if (!RunQuery(query, errbuf,0)) { return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM spawnentry WHERE spawngroupID='%i'", tmp2), errbuf,0)) { - safe_delete(query); + + if(c) + c->LogSQL(query.c_str()); + + StringFormat(query, "DELETE FROM spawnentry WHERE spawngroupID='%i'", tmp2); + + if (!RunQuery(query, errbuf,0)) { return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM npc_types WHERE id='%i'", spawn->GetNPCTypeID()), errbuf,0)) { - safe_delete(query); + + if(c) + c->LogSQL(query.c_str()); + + StringFormat(query,"DELETE FROM npc_types WHERE id='%i'", spawn->GetNPCTypeID()); + + if (!RunQuery(query,errbuf,0)) { return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); + + if(c) + c->LogSQL(query.c_str()); + return true; break; } case 5: { // add a spawn from spawngroup - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO spawn2 (zone, version, x, y, z, respawntime, heading, spawngroupID) values('%s', %u, %f, %f, %f, %i, %f, %i)", zone, zone_version, c->GetX(), c->GetY(), c->GetZ(), 120, c->GetHeading(), extra), errbuf, 0, 0, &tmp)) { - safe_delete(query); + + StringFormat(query, "INSERT INTO spawn2 " + "(zone, version, x, y, z, respawntime, heading, spawngroupID) " + "values('%s', %u, %f, %f, %f, %i, %f, %i)", + zone, zone_version, c->GetX(), c->GetY(), c->GetZ(), 120, c->GetHeading(), extra); + + + if (!RunQuery(query, errbuf, 0, 0, &tmp)) { return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); + + if(c) + c->LogSQL(query.c_str()); return true; break; @@ -1204,14 +1299,31 @@ uint32 ZoneDatabase::NPCSpawnDB(uint8 command, const char* zone, uint32 zone_ver case 6: { // add npc_type uint32 npc_type_id; char tmpstr[64]; + EntityList::RemoveNumbers(strn0cpy(tmpstr, spawn->GetName(), sizeof(tmpstr))); - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO npc_types (name, level, race, class, hp, gender, texture, helmtexture, size, loottable_id, merchant_id, face, runspeed, prim_melee_type, sec_melee_type) values(\"%s\",%i,%i,%i,%i,%i,%i,%i,%f,%i,%i,%i,%f,%i,%i)", tmpstr, spawn->GetLevel(), spawn->GetRace(), spawn->GetClass(), spawn->GetMaxHP(), spawn->GetGender(), spawn->GetTexture(), spawn->GetHelmTexture(), spawn->GetSize(), spawn->GetLoottableID(), spawn->MerchantType, 0, spawn->GetRunspeed(), 28, 28), errbuf, 0, 0, &npc_type_id)) { - safe_delete(query); + + StringFormat(query,"INSERT INTO npc_types " + "(name, level, race, class, hp, gender, " + "texture, helmtexture, size, loottable_id, " + "merchant_id, face, runspeed, prim_melee_type, " + "sec_melee_type) " + "values(\"%s\",%i,%i,%i,%i,%i,%i,%i,%f,%i,%i,%i,%f,%i,%i)", + tmpstr, spawn->GetLevel(), spawn->GetRace(), spawn->GetClass(), + spawn->GetMaxHP(), spawn->GetGender(), spawn->GetTexture(), + spawn->GetHelmTexture(), spawn->GetSize(), spawn->GetLoottableID(), + spawn->MerchantType, 0, spawn->GetRunspeed(), 28, 28); + + + + if (!RunQuery(query, errbuf, 0, 0, &npc_type_id)) { return false; } - if(c) c->LogSQL(query); - safe_delete_array(query); - if(c) c->Message(0, "%s npc_type ID %i created successfully!", tmpstr, npc_type_id); + + if(c) + c->LogSQL(query.c_str()); + + if(c) + c->Message(0, "%s npc_type ID %i created successfully!", tmpstr, npc_type_id); return true; break; } diff --git a/zone/parser.cpp b/zone/parser.cpp index c9198d9fd..b13a9210e 100644 --- a/zone/parser.cpp +++ b/zone/parser.cpp @@ -316,16 +316,16 @@ void Parser::Event(QuestEventID event, uint32 npcid, const char * data, NPC* npc if (npcmob->GetQglobal()) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; char tmpname[65]; int charid=0; - if (mob && mob->IsClient()) // some events like waypoint and spawn don't have a player involved - { - charid=mob->CastToClient()->CharacterID(); - } + if (mob && mob->IsClient()) // some events like waypoint and spawn don't have a player involved + { + charid=mob->CastToClient()->CharacterID(); + } else { @@ -333,11 +333,14 @@ void Parser::Event(QuestEventID event, uint32 npcid, const char * data, NPC* npc } AddVar("charid.g",itoa(charid)); - - database.RunQuery(query, MakeAnyLenString(&query, - "SELECT name,value FROM quest_globals WHERE (npcid=%i || npcid=0) && (charid=%i || charid=0) && (zoneid=%i || zoneid=0) && expdate >= unix_timestamp(now())", - npcmob->GetNPCTypeID(),charid,zone->GetZoneID()), errbuf, &result); - printf("%s\n",query); + + StringFormat(query,"SELECT name, value FROM quest_globals WHERE " + "(npcid=%i || npcid=0) && (charid=%i || charid=0) && " + "(zoneid=%i || zoneid=0) && expdate >= unix_timestamp(now())", + npcmob->GetNPCTypeID(), charid, zone->GetZoneID()); + + database.RunQuery(query, errbuf, &result); + printf("%s\n",query.c_str()); printf("%s\n",errbuf); if (result) { @@ -349,11 +352,6 @@ void Parser::Event(QuestEventID event, uint32 npcid, const char * data, NPC* npc } mysql_free_result(result); } - if (query) - { - safe_delete_array(query); - query=0; - } } if (event == EVENT_TIMER) diff --git a/zone/petitions.cpp b/zone/petitions.cpp index 51910a052..b31cc0e98 100644 --- a/zone/petitions.cpp +++ b/zone/petitions.cpp @@ -217,30 +217,42 @@ void PetitionList::UpdatePetition(Petition* pet) { void ZoneDatabase::DeletePetitionFromDB(Petition* wpet) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; uint8 checkedout = 0; - if (wpet->CheckedOut()) checkedout = 0; - else checkedout = 1; - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE from petitions where petid = %i", wpet->GetID()), errbuf, 0, &affected_rows)) { - LogFile->write(EQEMuLog::Error, "Error in DeletePetitionFromDB query '%s': %s", query, errbuf); + + if (wpet->CheckedOut()) + checkedout = 0; + else + checkedout = 1; + + StringFormat(query, "DELETE from petitions where petid = %i", wpet->GetID()); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { + LogFile->write(EQEMuLog::Error, "Error in DeletePetitionFromDB query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); return; } void ZoneDatabase::UpdatePetitionToDB(Petition* wpet) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; uint8 checkedout = 0; - if (wpet->CheckedOut()) checkedout = 1; - else checkedout = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE petitions set gmtext = '%s', lastgm = '%s', urgency = %i, checkouts = %i, unavailables = %i, ischeckedout = %i where petid = %i", wpet->GetGMText(), wpet->GetLastGM(), wpet->GetUrgency(), wpet->GetCheckouts(), wpet->GetUnavails(), checkedout, wpet->GetID()), errbuf, 0, &affected_rows)) { - LogFile->write(EQEMuLog::Error, "Error in UpdatePetitionToDB query '%s': %s", query, errbuf); + if (wpet->CheckedOut()) + checkedout = 1; + else + checkedout = 0; + + StringFormat(query,"UPDATE petitions set gmtext = '%s', lastgm = '%s', urgency = %i, " + "checkouts = %i, unavailables = %i, ischeckedout = %i where petid = %i", + wpet->GetGMText(), wpet->GetLastGM(), wpet->GetUrgency(), + wpet->GetCheckouts(), wpet->GetUnavails(), checkedout, wpet->GetID()); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { + LogFile->write(EQEMuLog::Error, "Error in UpdatePetitionToDB query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); return; } @@ -249,7 +261,7 @@ void ZoneDatabase::UpdatePetitionToDB(Petition* wpet) { void ZoneDatabase::InsertPetitionToDB(Petition* wpet) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; uint8 checkedout = 0; if (wpet->CheckedOut()) @@ -258,15 +270,22 @@ void ZoneDatabase::InsertPetitionToDB(Petition* wpet) checkedout = 0; uint32 len = strlen(wpet->GetPetitionText()); - char* petitiontext = new char[2*len+1]; - memset(petitiontext, 0, 2*len+1); + std::string petitiontext; DoEscapeString(petitiontext, wpet->GetPetitionText(), len); - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO petitions (petid, charname, accountname, lastgm, petitiontext, zone, urgency, charclass, charrace, charlevel, checkouts, unavailables, ischeckedout, senttime, gmtext) values (%i,'%s','%s','%s','%s',%i,%i,%i,%i,%i,%i,%i,%i,%i, '%s')", wpet->GetID(), wpet->GetCharName(), wpet->GetAccountName(), wpet->GetLastGM(), petitiontext, wpet->GetZone(), wpet->GetUrgency(), wpet->GetCharClass(), wpet->GetCharRace(), wpet->GetCharLevel(), wpet->GetCheckouts(), wpet->GetUnavails(), checkedout, wpet->GetSentTime(), wpet->GetGMText()), errbuf, 0, &affected_rows)) { - LogFile->write(EQEMuLog::Error, "Error in InsertPetitionToDB query '%s': %s", query, errbuf); + + StringFormat(query,"INSERT INTO petitions (petid, charname, accountname, lastgm, " + "petitiontext, zone, urgency, charclass, charrace, charlevel, " + "checkouts, unavailables, ischeckedout, senttime, gmtext) " + "values (%i,'%s','%s','%s','%s',%i,%i,%i,%i,%i,%i,%i,%i,%i, '%s')", + wpet->GetID(), wpet->GetCharName(), wpet->GetAccountName(), wpet->GetLastGM(), + petitiontext.c_str(), wpet->GetZone(), wpet->GetUrgency(), wpet->GetCharClass(), + wpet->GetCharRace(), wpet->GetCharLevel(), wpet->GetCheckouts(), + wpet->GetUnavails(), checkedout, wpet->GetSentTime(), wpet->GetGMText()); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { + LogFile->write(EQEMuLog::Error, "Error in InsertPetitionToDB query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(petitiontext); - safe_delete_array(query); #if EQDEBUG >= 5 LogFile->write(EQEMuLog::Debug, "New petition created"); #endif @@ -276,13 +295,18 @@ void ZoneDatabase::InsertPetitionToDB(Petition* wpet) void ZoneDatabase::RefreshPetitionsFromDB() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; Petition* newpet; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT petid, charname, accountname, lastgm, petitiontext, zone, urgency, charclass, charrace, charlevel, checkouts, unavailables, ischeckedout, senttime, gmtext from petitions order by petid"), errbuf, &result)) + + query ="SELECT petid, charname, accountname, lastgm, " + "petitiontext, zone, urgency, charclass, charrace, " + "charlevel, checkouts, unavailables, ischeckedout, " + "senttime, gmtext from petitions order by petid"; + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while ((row = mysql_fetch_row(result))) { newpet = new Petition(atoi(row[0])); newpet->SetCName(row[1]); @@ -299,15 +323,18 @@ void ZoneDatabase::RefreshPetitionsFromDB() newpet->SetSentTime2(atol(row[13])); newpet->SetGMText(row[14]); std::cout << "Petition " << row[0] << " pettime = " << newpet->GetSentTime() << std::endl; - if (atoi(row[12]) == 1) newpet->SetCheckedOut(true); - else newpet->SetCheckedOut(false); + + if (atoi(row[12]) == 1) + newpet->SetCheckedOut(true); + else + newpet->SetCheckedOut(false); + petition_list.AddPetition(newpet); } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in RefreshPetitionsFromDB query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in RefreshPetitionsFromDB query '%s': %s", query.c_str(), errbuf); return; } diff --git a/zone/pets.cpp b/zone/pets.cpp index 4ea9c8bc1..aca824a4c 100644 --- a/zone/pets.cpp +++ b/zone/pets.cpp @@ -362,18 +362,23 @@ void Mob::MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, c // handle monster summoning pet appearance if(record.monsterflag) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result = nullptr; MYSQL_ROW row = nullptr; uint32 monsterid; + StringFormat(query, "SELECT npcID FROM (spawnentry INNER JOIN spawn2 ON " + "spawn2.spawngroupID = spawnentry.spawngroupID) " + "INNER JOIN npc_types ON npc_types.id = spawnentry.npcID " + "WHERE spawn2.zone = '%s' AND npc_types.bodytype NOT IN (11, 33, 66, 67) " + "AND npc_types.race NOT IN (0,1,2,3,4,5,6,7,8,9,10,11,12,44,55,67," + "71,72,73,77,78,81,90,92,93,94,106,112,114,127,128,130,139,141,183," + "236,237,238,239,254,266,330,378,379,380,381,382,383,404,522) " + "ORDER BY RAND() LIMIT 1", + zone->GetShortName()); + // get a random npc id from the spawngroups assigned to this zone - if (database.RunQuery(query, MakeAnyLenString(&query, - "SELECT npcID FROM (spawnentry INNER JOIN spawn2 ON spawn2.spawngroupID = spawnentry.spawngroupID) " - "INNER JOIN npc_types ON npc_types.id = spawnentry.npcID " - "WHERE spawn2.zone = '%s' AND npc_types.bodytype NOT IN (11, 33, 66, 67) " - "AND npc_types.race NOT IN (0,1,2,3,4,5,6,7,8,9,10,11,12,44,55,67,71,72,73,77,78,81,90,92,93,94,106,112,114,127,128,130,139,141,183,236,237,238,239,254,266,330,378,379,380,381,382,383,404,522) " - "ORDER BY RAND() LIMIT 1", zone->GetShortName()), errbuf, &result)) + if (database.RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if (row) @@ -398,7 +403,6 @@ void Mob::MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, c LogFile->write(EQEMuLog::Error, "Error loading NPC data for monster summoning pet (NPC ID %d)", monsterid); } - safe_delete_array(query); } //this takes ownership of the npc_type data @@ -445,24 +449,28 @@ bool ZoneDatabase::GetPetEntry(const char *pet_type, PetRecord *into) { bool ZoneDatabase::GetPoweredPetEntry(const char *pet_type, int16 petpower, PetRecord *into) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 querylen = 0; MYSQL_RES *result; MYSQL_ROW row; if (petpower <= 0) { - querylen = MakeAnyLenString(&query, - "SELECT npcID, temp, petpower, petcontrol, petnaming, monsterflag, equipmentset FROM pets " - "WHERE type='%s' AND petpower<=0", pet_type); + + StringFormat(query,"SELECT npcID, temp, petpower, petcontrol, " + "petnaming, monsterflag, equipmentset FROM pets " + "WHERE type='%s' AND petpower<=0", + pet_type); + } else { - querylen = MakeAnyLenString(&query, - "SELECT npcID, temp, petpower, petcontrol, petnaming, monsterflag, equipmentset FROM pets " - "WHERE type='%s' AND petpower<=%d ORDER BY petpower DESC LIMIT 1", pet_type, petpower); + StringFormat(query, "SELECT npcID, temp, petpower, petcontrol, " + "petnaming, monsterflag, equipmentset FROM pets " + "WHERE type='%s' AND petpower<=%d ORDER BY petpower " + "DESC LIMIT 1", + pet_type, petpower); } - if (RunQuery(query, querylen, errbuf, &result)) { - safe_delete_array(query); + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -480,8 +488,7 @@ bool ZoneDatabase::GetPoweredPetEntry(const char *pet_type, int16 petpower, PetR mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetPoweredPetEntry query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetPoweredPetEntry query '%s': %s", query.c_str(), errbuf); } return(false); } @@ -653,7 +660,7 @@ bool ZoneDatabase::GetBasePetItems(int32 equipmentset, uint32 *items) { // an equipmentset can overload a slot for the set(s) it includes. char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 querylen = 0; MYSQL_RES *result; MYSQL_ROW row; @@ -670,21 +677,20 @@ bool ZoneDatabase::GetBasePetItems(int32 equipmentset, uint32 *items) { // already. If no, add the item id to the equipment array. while (curset >= 0 && depth < 5) { - if (RunQuery(query, - MakeAnyLenString(&query, "SELECT nested_set FROM pets_equipmentset WHERE set_id='%s'", curset), - errbuf, &result)) + + StringFormat(query,"SELECT nested_set FROM pets_equipmentset WHERE set_id='%s'", curset); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); nextset = atoi(row[0]); mysql_free_result(result); + + StringFormat(query,"SELECT slot, item_id FROM pets_equipmentset_entries WHERE set_id='%s'", curset); - if (RunQuery(query, - MakeAnyLenString(&query, "SELECT slot, item_id FROM pets_equipmentset_entries WHERE set_id='%s'", curset), - errbuf, &result)) + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while ((row = mysql_fetch_row(result))) { slot = atoi(row[0]); @@ -697,8 +703,7 @@ bool ZoneDatabase::GetBasePetItems(int32 equipmentset, uint32 *items) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetBasePetItems query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetBasePetItems query '%s': %s", query.c_str(), errbuf); } curset = nextset; depth++; @@ -713,8 +718,7 @@ bool ZoneDatabase::GetBasePetItems(int32 equipmentset, uint32 *items) { } else { - LogFile->write(EQEMuLog::Error, "Error in GetBasePetItems query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetBasePetItems query '%s': %s", query.c_str(), errbuf); return false; } } // end while diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 7c3522777..cc59bab98 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -1235,13 +1235,10 @@ void QuestManager::setglobal(const char *varname, const char *newvalue, int opti } /* Inserts global variable into quest_globals table */ -int QuestManager::InsertQuestGlobal( - int charid, int npcid, int zoneid, - const char *varname, const char *varvalue, - int duration) +int QuestManager::InsertQuestGlobal(int charid, int npcid, int zoneid,const char *varname, const char *varvalue,int duration) { - char *query = 0; char errbuf[MYSQL_ERRMSG_SIZE]; + std::string query; // Make duration string either "unix_timestamp(now()) + xxx" or "NULL" std::stringstream duration_ss; @@ -1257,15 +1254,14 @@ int QuestManager::InsertQuestGlobal( //NOTE: this should be escaping the contents of arglist //npcwise a malicious script can arbitrarily alter the DB uint32 last_id = 0; - if (!database.RunQuery(query, MakeAnyLenString(&query, - "REPLACE INTO quest_globals (charid, npcid, zoneid, name, value, expdate)" - "VALUES (%i, %i, %i, '%s', '%s', %s)", - charid, npcid, zoneid, varname, varvalue, duration_ss.str().c_str() - ), errbuf, nullptr, nullptr, &last_id)) - { + + StringFormat(query, "REPLACE INTO quest_globals (charid, npcid, zoneid, name, value, expdate)" + "VALUES (%i, %i, %i, '%s', '%s', %s)", + charid, npcid, zoneid, varname, varvalue, duration_ss.str().c_str()); + + if (!database.RunQuery(query, errbuf, nullptr, nullptr, &last_id)) { std::cerr << "setglobal error inserting " << varname << " : " << errbuf << std::endl; } - safe_delete_array(query); if(zone) { @@ -1330,7 +1326,7 @@ void QuestManager::targlobal(const char *varname, const char *value, const char void QuestManager::delglobal(const char *varname) { // delglobal(varname) char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; int qgZoneid=zone->GetZoneID(); int qgCharid=0; int qgNpcid=owner->GetNPCTypeID(); @@ -1343,15 +1339,17 @@ void QuestManager::delglobal(const char *varname) { { qgCharid=-qgNpcid; // make char id negative npc id as a fudge } - if (!database.RunQuery(query, - MakeAnyLenString(&query, - "DELETE FROM quest_globals WHERE name='%s'" - " && (npcid=0 || npcid=%i) && (charid=0 || charid=%i) && (zoneid=%i || zoneid=0)", - varname,qgNpcid,qgCharid,qgZoneid),errbuf)) + + StringFormat(query,"DELETE FROM quest_globals WHERE name='%s' && " + "(npcid=0 || npcid=%i) && " + "(charid=0 || charid=%i) " + "&& (zoneid=%i || zoneid=0)", + varname,qgNpcid,qgCharid,qgZoneid); + + if (!database.RunQuery(query,errbuf)) { std::cerr << "delglobal error deleting " << varname << " : " << errbuf << std::endl; } - safe_delete_array(query); if(zone) { @@ -1563,7 +1561,7 @@ void QuestManager::showgrid(int grid) { return; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -1576,7 +1574,12 @@ void QuestManager::showgrid(int grid) { pts.push_back(pt); // Retrieve all waypoints for this grid - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT `x`,`y`,`z` FROM grid_entries WHERE `gridid`=%i AND `zoneid`=%i ORDER BY `number`",grid,zone->GetZoneID()),errbuf,&result)) + StringFormat(query,"SELECT `x`,`y`,`z` FROM " + "grid_entries WHERE `gridid`=%i " + "AND `zoneid`=%i ORDER BY `number`", + grid,zone->GetZoneID()); + + if(database.RunQuery(query,errbuf,&result)) { while((row = mysql_fetch_row(result))) { @@ -1594,7 +1597,6 @@ void QuestManager::showgrid(int grid) { LogFile->write(EQEMuLog::Quest, "Error loading grid %d for showgrid(): %s", grid, errbuf); return; } - safe_delete_array(query); } //displays an in game path based on path finding. @@ -2137,10 +2139,13 @@ void QuestManager::clearspawntimers() { while (iterator.MoreElements()) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM respawn_times WHERE id=%lu AND " - "instance_id=%lu",(unsigned long)iterator.GetData()->GetID(), (unsigned long)zone->GetInstanceID()), errbuf); - safe_delete_array(query); + std::string query; + + StringFormat(query,"DELETE FROM respawn_times WHERE id=%lu AND instance_id=%lu", + (unsigned long)iterator.GetData()->GetID(), + (unsigned long)zone->GetInstanceID()); + + database.RunQuery(query, errbuf); iterator.Advance(); } } @@ -2473,17 +2478,19 @@ const char* QuestManager::saylink(char* Phrase, bool silent, char* LinkName) { const char *ERR_MYSQLERROR = "Error in saylink phrase queries"; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; int sayid = 0; int sz = strlen(Phrase); - char *escaped_string = new char[sz * 2]; + std::string escaped_string; database.DoEscapeString(escaped_string, Phrase, sz); // Query for an existing phrase and id in the saylink table - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT `id` FROM `saylink` WHERE `phrase` = '%s'", escaped_string),errbuf,&result)) + StringFormat(query,"SELECT `id` FROM `saylink` WHERE `phrase` = '%s'", escaped_string.c_str()); + + if(database.RunQuery(query,errbuf,&result)) { if (mysql_num_rows(result) >= 1) { @@ -2495,12 +2502,13 @@ const char* QuestManager::saylink(char* Phrase, bool silent, char* LinkName) { } else // Add a new saylink entry to the database and query it again for the new sayid number { - safe_delete_array(query); - - database.RunQuery(query,MakeAnyLenString(&query,"INSERT INTO `saylink` (`phrase`) VALUES ('%s')", escaped_string),errbuf); - safe_delete_array(query); - - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT `id` FROM saylink WHERE `phrase` = '%s'", escaped_string),errbuf,&result)) + StringFormat(query,"INSERT INTO `saylink` (`phrase`) VALUES ('%s')", escaped_string.c_str()); + + database.RunQuery(query,errbuf); + + StringFormat(query,"SELECT `id` FROM saylink WHERE `phrase` = '%s'", escaped_string.c_str()); + + if(database.RunQuery(query,errbuf,&result)) { if (mysql_num_rows(result) >= 1) { @@ -2515,19 +2523,16 @@ const char* QuestManager::saylink(char* Phrase, bool silent, char* LinkName) { { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf); } - safe_delete_array(query); } } - safe_delete_array(query); - safe_delete_array(escaped_string); if(silent) sayid = sayid + 750000; else sayid = sayid + 500000; - //Create the say link as an item link hash - char linktext[250]; + //Create the say link as an item link hash + char linktext[250]; if(initiator) { diff --git a/zone/raids.cpp b/zone/raids.cpp index 1a706e41c..9ce00bd4f 100644 --- a/zone/raids.cpp +++ b/zone/raids.cpp @@ -75,13 +75,18 @@ void Raid::AddMember(Client *c, uint32 group, bool rleader, bool groupleader, bo return; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "INSERT INTO raid_members SET raidid=%lu, charid=%lu, groupid=%lu, _class=%d, level=%d, name='%s', isgroupleader=%d, israidleader=%d, islooter=%d", (unsigned long)GetID(), (unsigned long)c->CharacterID(), (unsigned long)group, c->GetClass(), c->GetLevel(), c->GetName(), groupleader, rleader, looter ),errbuf,&result)){ + + StringFormat(query,"INSERT INTO raid_members SET raidid=%lu, charid=%lu, groupid=%lu, " + "_class=%d, level=%d, name='%s', isgroupleader=%d, israidleader=%d, islooter=%d", + (unsigned long)GetID(), (unsigned long)c->CharacterID(), (unsigned long)group, + c->GetClass(), c->GetLevel(), c->GetName(), groupleader, rleader, looter ); + + if (database.RunQuery(query,errbuf,&result)){ mysql_free_result(result); } - safe_delete_array(query); LearnMembers(); VerifyRaid(); if(group < 12) @@ -103,14 +108,16 @@ void Raid::AddMember(Client *c, uint32 group, bool rleader, bool groupleader, bo void Raid::RemoveMember(const char *c) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "DELETE FROM raid_members where name='%s'", c ),errbuf,&result)){ + + StringFormat(query,"DELETE FROM raid_members where name='%s'", c ); + + if (database.RunQuery(query,errbuf,&result)){ mysql_free_result(result); } Client *m = entity_list.GetClientByName(c); - safe_delete_array(query); disbandCheck = true; SendRaidRemoveAll(c); SendRaidDisband(m); @@ -134,13 +141,15 @@ void Raid::RemoveMember(const char *c) void Raid::DisbandRaid() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "DELETE FROM raid_members WHERE raidid=%lu", (unsigned long)GetID()),errbuf,&result)){ + + StringFormat(query,"DELETE FROM raid_members WHERE raidid=%lu", (unsigned long)GetID()); + + if (database.RunQuery(query,errbuf,&result)){ mysql_free_result(result); } - safe_delete_array(query); LearnMembers(); VerifyRaid(); SendRaidDisbandAll(); @@ -160,13 +169,16 @@ void Raid::DisbandRaid() void Raid::MoveMember(const char *name, uint32 newGroup) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "UPDATE raid_members SET groupid=%lu WHERE name='%s'", (unsigned long)newGroup, name),errbuf,&result)){ + + StringFormat(query,"UPDATE raid_members SET groupid=%lu WHERE name='%s'", + (unsigned long)newGroup, name); + + if (database.RunQuery(query,errbuf,&result)){ mysql_free_result(result); } - safe_delete_array(query); LearnMembers(); VerifyRaid(); SendRaidMoveAll(name); @@ -184,13 +196,15 @@ void Raid::MoveMember(const char *name, uint32 newGroup) void Raid::SetGroupLeader(const char *who, bool glFlag) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "UPDATE raid_members SET isgroupleader=%lu WHERE name='%s'", (unsigned long)glFlag, who),errbuf,&result)){ + + StringFormat(query,"UPDATE raid_members SET isgroupleader=%lu WHERE name='%s'", + (unsigned long)glFlag, who); + + if (database.RunQuery(query,errbuf,&result)){ mysql_free_result(result); } - - safe_delete_array(query); LearnMembers(); VerifyRaid(); @@ -211,25 +225,25 @@ void Raid::SetGroupLeader(const char *who, bool glFlag) void Raid::SetRaidLeader(const char *wasLead, const char *name) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (!database.RunQuery(query,MakeAnyLenString(&query, "UPDATE raid_members SET israidleader=0 WHERE name='%s'", wasLead),errbuf,&result)){ + + StringFormat(query,"UPDATE raid_members SET israidleader=0 WHERE name='%s'", wasLead); + + if (!database.RunQuery(query,errbuf,&result)){ printf("Set Raid Leader error: %s\n", errbuf); } else mysql_free_result(result); - safe_delete_array(query); - query = 0; + StringFormat(query,"UPDATE raid_members SET israidleader=1 WHERE name='%s'", name); - if (!database.RunQuery(query,MakeAnyLenString(&query, "UPDATE raid_members SET israidleader=1 WHERE name='%s'", name),errbuf,&result)){ + if (!database.RunQuery(query,errbuf,&result)){ printf("Set Raid Leader error: %s\n", errbuf); } else mysql_free_result(result); - safe_delete_array(query); - strn0cpy(leadername, name, 64); Client *c = entity_list.GetClientByName(name); @@ -265,13 +279,16 @@ bool Raid::IsGroupLeader(const char *who) void Raid::UpdateLevel(const char *name, int newLevel) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "UPDATE raid_members SET level=%lu WHERE name='%s'", (unsigned long)newLevel, name),errbuf,&result)){ + + StringFormat(query,"UPDATE raid_members SET level=%lu WHERE name='%s'", + (unsigned long)newLevel, name); + + if (database.RunQuery(query,errbuf,&result)){ mysql_free_result(result); } - safe_delete_array(query); LearnMembers(); VerifyRaid(); } @@ -720,27 +737,31 @@ void Raid::TeleportRaid(Mob* sender, uint32 zoneID, uint16 instance_id, float x, void Raid::ChangeLootType(uint32 type) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "UPDATE raid_details SET loottype=%lu WHERE raidid=%lu", (unsigned long)type, (unsigned long)GetID()),errbuf,&result)){ + + StringFormat(query,"UPDATE raid_details SET loottype=%lu WHERE raidid=%lu", + (unsigned long)type, (unsigned long)GetID()); + + if (database.RunQuery(query,errbuf,&result)){ mysql_free_result(result); } - - safe_delete_array(query); + LootType = type; } void Raid::AddRaidLooter(const char* looter) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "UPDATE raid_members SET islooter=1 WHERE name='%s'", looter),errbuf,&result)){ + + StringFormat(query,"UPDATE raid_members SET islooter=1 WHERE name='%s'", looter); + + if (database.RunQuery(query,errbuf,&result)){ mysql_free_result(result); } - safe_delete_array(query); - for(int x = 0; x < MAX_RAID_MEMBERS; x++) { if(strcmp(looter, members[x].membername) == 0) @@ -770,14 +791,15 @@ void Raid::AddRaidLooter(const char* looter) void Raid::RemoveRaidLooter(const char* looter) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "UPDATE raid_members SET islooter=0 WHERE name='%s'", looter),errbuf,&result)){ + + StringFormat(query, "UPDATE raid_members SET islooter=0 WHERE name='%s'", looter); + + if (database.RunQuery(query, errbuf,&result)){ mysql_free_result(result); } - safe_delete_array(query); - for(int x = 0; x < MAX_RAID_MEMBERS; x++) { if(strcmp(looter, members[x].membername) == 0) @@ -1226,13 +1248,16 @@ void Raid::SendRaidGroupRemove(const char *who, uint32 gid) void Raid::LockRaid(bool lockFlag) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "UPDATE raid_details SET locked=%d WHERE raidid=%lu", lockFlag, (unsigned long)GetID()),errbuf,&result)){ + + StringFormat(query,"UPDATE raid_details SET locked=%d WHERE raidid=%lu", + lockFlag, (unsigned long)GetID()); + + if (database.RunQuery(query,errbuf,&result)){ mysql_free_result(result); } - safe_delete_array(query); locked = lockFlag; if(lockFlag) SendRaidLock(); @@ -1252,23 +1277,29 @@ void Raid::LockRaid(bool lockFlag) void Raid::SetRaidDetails() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query,MakeAnyLenString(&query, "INSERT INTO raid_details SET raidid=%lu, loottype=4, locked=0", (unsigned long)GetID()),errbuf,&result)){ + + StringFormat(query,"INSERT INTO raid_details SET raidid=%lu, loottype=4, locked=0", + (unsigned long)GetID()); + + if (database.RunQuery(query, errbuf,&result)){ mysql_free_result(result); } - safe_delete_array(query); } void Raid::GetRaidDetails() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query,MakeAnyLenString(&query, "SELECT locked, loottype FROM raid_details WHERE raidid=%lu", (unsigned long)GetID()),errbuf,&result)){ - safe_delete_array(query); + + StringFormat(query,"SELECT locked, loottype FROM raid_details WHERE raidid=%lu", + (unsigned long)GetID()); + + if (database.RunQuery(query,errbuf,&result)){ if(mysql_num_rows(result) < 1) { mysql_free_result(result); LogFile->write(EQEMuLog::Error, "Error getting raid details for raid %lu: %s", (unsigned long)GetID(), errbuf); @@ -1287,11 +1318,15 @@ bool Raid::LearnMembers() { memset(members, 0, (sizeof(RaidMember)*MAX_RAID_MEMBERS)); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query,MakeAnyLenString(&query, "SELECT name, groupid, _class, level, isgroupleader, israidleader, islooter FROM raid_members WHERE raidid=%lu", (unsigned long)GetID()),errbuf,&result)){ - safe_delete_array(query); + + StringFormat(query,"SELECT name, groupid, _class, level, isgroupleader, israidleader, islooter " + "FROM raid_members WHERE raidid=%lu", + (unsigned long)GetID()); + + if (database.RunQuery(query,errbuf,&result)){ if(mysql_num_rows(result) < 1) { mysql_free_result(result); LogFile->write(EQEMuLog::Error, "Error getting raid members for raid %lu: %s", (unsigned long)GetID(), errbuf); @@ -1318,7 +1353,7 @@ bool Raid::LearnMembers() } mysql_free_result(result); } - return(true); + return true; } void Raid::VerifyRaid() diff --git a/zone/spawn2.cpp b/zone/spawn2.cpp index c6da2094f..eba008a56 100644 --- a/zone/spawn2.cpp +++ b/zone/spawn2.cpp @@ -355,16 +355,19 @@ void Spawn2::DeathReset(bool realdeath) bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList &spawn2_list, int16 version, uint32 repopdelay) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; const char *zone_name = database.GetZoneName(zoneid); - MakeAnyLenString(&query, "SELECT id, spawngroupID, x, y, z, heading, respawntime, variance, pathgrid, _condition, cond_value, enabled, animation FROM spawn2 WHERE zone='%s' AND version=%u", zone_name, version); - if (RunQuery(query, strlen(query), errbuf, &result)) + StringFormat(query, "SELECT id, spawngroupID, x, y, z, heading, respawntime, variance, " + "pathgrid, _condition, cond_value, enabled, animation FROM spawn2 " + "WHERE zone='%s' AND version=%u", + zone_name, version); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while((row = mysql_fetch_row(result))) { Spawn2* newSpawn = 0; @@ -378,8 +381,7 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList &spa } else { - LogFile->write(EQEMuLog::Error, "Error in PopulateZoneLists query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in PopulateZoneLists query '%s': %s", query.c_str(), errbuf); return false; } @@ -389,11 +391,15 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList &spa Spawn2* ZoneDatabase::LoadSpawn2(LinkedList &spawn2_list, uint32 spawn2id, uint32 timeleft) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id, spawngroupID, x, y, z, heading, respawntime, variance, pathgrid, _condition, cond_value, enabled, animation FROM spawn2 WHERE id=%i", spawn2id), errbuf, &result)) { + StringFormat(query,"SELECT id, spawngroupID, x, y, z, heading, respawntime, " + "variance, pathgrid, _condition, cond_value, enabled, animation " + "FROM spawn2 WHERE id=%i", spawn2id); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -401,14 +407,12 @@ Spawn2* ZoneDatabase::LoadSpawn2(LinkedList &spawn2_list, uint32 spawn2 Spawn2* newSpawn = new Spawn2(atoi(row[0]), atoi(row[1]), atof(row[2]), atof(row[3]), atof(row[4]), atof(row[5]), atoi(row[6]), atoi(row[7]), timeleft, atoi(row[8]), atoi(row[9]), atoi(row[10]), perl_enabled, (EmuAppearance)atoi(row[12])); spawn2_list.Insert( newSpawn ); mysql_free_result(result); - safe_delete_array(query); return newSpawn; } mysql_free_result(result); } - LogFile->write(EQEMuLog::Error, "Error in LoadSpawn2 query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadSpawn2 query '%s': %s", query.c_str(), errbuf); return 0; } @@ -416,7 +420,7 @@ bool ZoneDatabase::CreateSpawn2(Client *c, uint32 spawngroup, const char* zone, { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; // if(GetInverseXY()==1) { @@ -424,22 +428,22 @@ bool ZoneDatabase::CreateSpawn2(Client *c, uint32 spawngroup, const char* zone, // x=y; // y=temp; // } - if (RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO spawn2 (spawngroupID,zone,x,y,z,heading,respawntime,variance,_condition,cond_value) Values (%i, '%s', %f, %f, %f, %f, %i, %i, %u, %i)", - spawngroup, zone, x, y, z, heading, respawn, variance, condition, cond_value - ), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + + StringFormat(query,"INSERT INTO spawn2 (spawngroupID,zone,x,y,z,heading,respawntime,variance,_condition,cond_value) " + "Values (%i, '%s', %f, %f, %f, %f, %i, %i, %u, %i)", + spawngroup, zone, x, y, z, heading, respawn, variance, condition, cond_value); + + if (RunQuery(query, errbuf, 0, &affected_rows)) { if (affected_rows == 1) { - if(c) c->LogSQL(query); - return true; + if(c) c->LogSQL(query.c_str()); + return true; } else { return false; } } else { - LogFile->write(EQEMuLog::Error, "Error in CreateSpawn2 query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in CreateSpawn2 query '%s': %s", query.c_str(), errbuf); return false; } @@ -691,7 +695,7 @@ void SpawnConditionManager::UpdateDBEvent(SpawnEvent &event) { event.next.minute, event.next.hour, event.next.day, event.next.month, event.next.year, event.enabled?1:0, event.id ); - if(!database.RunQuery(query, len, errbuf)) { + if(!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Unable to update spawn event '%s': %s\n", query, errbuf); } safe_delete_array(query); @@ -699,34 +703,37 @@ void SpawnConditionManager::UpdateDBEvent(SpawnEvent &event) { void SpawnConditionManager::UpdateDBCondition(const char* zone_name, uint32 instance_id, uint16 cond_id, int16 value) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; int len; SpawnCondition cond; - len = MakeAnyLenString(&query, - "REPLACE INTO spawn_condition_values (id, value, zone, instance_id) VALUES(%u, %u, '%s', %u)", - cond_id, value, zone_name, instance_id - ); - if(!database.RunQuery(query, len, errbuf)) { - LogFile->write(EQEMuLog::Error, "Unable to update spawn condition '%s': %s\n", query, errbuf); + StringFormat(query, "REPLACE INTO spawn_condition_values " + "(id, value, zone, instance_id) " + "VALUES(%u, %u, '%s', %u)", + cond_id, value, zone_name, instance_id); + + if(!database.RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Unable to update spawn condition '%s': %s\n", query.c_str(), errbuf); } - safe_delete_array(query); } bool SpawnConditionManager::LoadDBEvent(uint32 event_id, SpawnEvent &event, std::string &zone_name) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; int len; bool ret = false; - len = MakeAnyLenString(&query, - "SELECT id,cond_id,period,next_minute,next_hour,next_day,next_month,next_year,enabled,action,argument,zone " - "FROM spawn_events WHERE id=%d", event_id); - if (database.RunQuery(query, len, errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT id, cond_id, period, " + "next_minute, next_hour, next_day, " + "next_month, next_year, enabled, " + "action, argument,zone " + "FROM spawn_events WHERE id=%d", + event_id); + + if (database.RunQuery(query,errbuf, &result)) { if((row = mysql_fetch_row(result))) { event.id = atoi(row[0]); event.condition_id = atoi(row[1]); @@ -752,8 +759,7 @@ bool SpawnConditionManager::LoadDBEvent(uint32 event_id, SpawnEvent &event, std: } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadDBEvent query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadDBEvent query '%s': %s", query.c_str(), errbuf); } return(ret); } @@ -761,7 +767,7 @@ bool SpawnConditionManager::LoadDBEvent(uint32 event_id, SpawnEvent &event, std: bool SpawnConditionManager::LoadSpawnConditions(const char* zone_name, uint32 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; int len; @@ -771,9 +777,10 @@ bool SpawnConditionManager::LoadSpawnConditions(const char* zone_name, uint32 in //load spawn conditions SpawnCondition cond; - len = MakeAnyLenString(&query, "SELECT id, onchange, value FROM spawn_conditions WHERE zone='%s'", zone_name); - if (database.RunQuery(query, len, errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT id, onchange, value FROM spawn_conditions WHERE zone='%s'", zone_name); + + if (database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { cond.condition_id = atoi(row[0]); cond.value = atoi(row[2]); @@ -784,15 +791,14 @@ bool SpawnConditionManager::LoadSpawnConditions(const char* zone_name, uint32 in } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadSpawnConditions query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadSpawnConditions query '%s': %s", query.c_str(), errbuf); return false; } //load values - len = MakeAnyLenString(&query, "SELECT id, value FROM spawn_condition_values WHERE zone='%s' and instance_id=%u", zone_name, instance_id); - if (database.RunQuery(query, len, errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT id, value FROM spawn_condition_values WHERE zone='%s' and instance_id=%u", zone_name, instance_id); + + if (database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { std::map::iterator iter = spawn_conditions.find(atoi(row[0])); @@ -805,19 +811,19 @@ bool SpawnConditionManager::LoadSpawnConditions(const char* zone_name, uint32 in } else { - LogFile->write(EQEMuLog::Error, "Error in LoadSpawnConditions query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadSpawnConditions query '%s': %s", query.c_str(), errbuf); spawn_conditions.clear(); return false; } //load spawn events SpawnEvent event; - len = MakeAnyLenString(&query, - "SELECT id,cond_id,period,next_minute,next_hour,next_day,next_month,next_year,enabled,action,argument " - "FROM spawn_events WHERE zone='%s'", zone_name); - if (database.RunQuery(query, len, errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT id, cond_id, period, next_minute, " + "next_hour, next_day, next_month, next_year, enabled, action, argument " + "FROM spawn_events WHERE zone='%s'", + zone_name); + + if (database.RunQuery(query,errbuf, &result)) { while((row = mysql_fetch_row(result))) { event.id = atoi(row[0]); event.condition_id = atoi(row[1]); @@ -843,8 +849,7 @@ bool SpawnConditionManager::LoadSpawnConditions(const char* zone_name, uint32 in } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadSpawnConditions events query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadSpawnConditions events query '%s': %s", query.c_str(), errbuf); return false; } @@ -1156,7 +1161,7 @@ int16 SpawnConditionManager::GetCondition(const char *zone_short, uint32 instanc } else { //this is a remote spawn condition, grab it from the DB char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; int len; @@ -1165,10 +1170,11 @@ int16 SpawnConditionManager::GetCondition(const char *zone_short, uint32 instanc //load spawn conditions SpawnCondition cond; - len = MakeAnyLenString(&query, "SELECT value FROM spawn_condition_values WHERE zone='%s' AND instance_id=%u AND id=%d", - zone_short, instance_id, condition_id); - if (database.RunQuery(query, len, errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT value FROM spawn_condition_values " + "WHERE zone='%s' AND instance_id=%u AND id=%d", + zone_short, instance_id, condition_id); + + if (database.RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result))) { value = atoi(row[0]); } else { @@ -1178,7 +1184,6 @@ int16 SpawnConditionManager::GetCondition(const char *zone_short, uint32 instanc mysql_free_result(result); } else { _log(SPAWNS__CONDITIONS, "Unable to query remote condition %d from zone %s in Get request.", condition_id, zone_short); - safe_delete_array(query); value = 0; //dunno a better thing to do... } return(value); diff --git a/zone/spawngroup.cpp b/zone/spawngroup.cpp index 29e82d028..9c877c871 100644 --- a/zone/spawngroup.cpp +++ b/zone/spawngroup.cpp @@ -144,15 +144,21 @@ bool SpawnGroupList::RemoveSpawnGroup(uint32 in_id) { bool ZoneDatabase::LoadSpawnGroups(const char* zone_name, uint16 version, SpawnGroupList* spawn_group_list) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; // CODER new spawn code - query = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT DISTINCT(spawngroupID), spawngroup.name, spawngroup.spawn_limit, spawngroup.dist, spawngroup.max_x, spawngroup.min_x, spawngroup.max_y, spawngroup.min_y, spawngroup.delay, spawngroup.despawn, spawngroup.despawn_timer FROM spawn2,spawngroup WHERE spawn2.spawngroupID=spawngroup.ID and spawn2.version=%u and zone='%s'", version, zone_name), errbuf, &result)) + StringFormat(query, "SELECT DISTINCT(spawngroupID), spawngroup.name, " + "spawngroup.spawn_limit, spawngroup.dist, spawngroup.max_x, " + "spawngroup.min_x, spawngroup.max_y, spawngroup.min_y, " + "spawngroup.delay, spawngroup.despawn, spawngroup.despawn_timer " + "FROM spawn2,spawngroup WHERE spawn2.spawngroupID=spawngroup.ID " + "and spawn2.version=%u and zone='%s'", + version, zone_name); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while((row = mysql_fetch_row(result))) { SpawnGroup* newSpawnGroup = new SpawnGroup( atoi(row[0]), row[1], atoi(row[2]), atof(row[3]), atof(row[4]), atof(row[5]), atof(row[6]), atof(row[7]), atoi(row[8]), atoi(row[9]), atoi(row[10])); spawn_group_list->AddSpawnGroup(newSpawnGroup); @@ -162,18 +168,18 @@ bool ZoneDatabase::LoadSpawnGroups(const char* zone_name, uint16 version, SpawnG else { std::cerr << "Error2 in PopulateZoneLists query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - query = 0; - if (RunQuery(query, MakeAnyLenString(&query, - "SELECT DISTINCT spawnentry.spawngroupID, npcid, chance, " - "npc_types.spawn_limit AS sl " - "FROM spawnentry, spawn2, npc_types " - "WHERE spawnentry.npcID=npc_types.id AND spawnentry.spawngroupID=spawn2.spawngroupID " - "AND zone='%s'", zone_name), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT DISTINCT spawnentry.spawngroupID, npcid, chance, " + "npc_types.spawn_limit AS sl " + "FROM spawnentry, spawn2, npc_types " + "WHERE spawnentry.npcID=npc_types.id AND spawnentry.spawngroupID=spawn2.spawngroupID " + "AND zone='%s'", + zone_name); + + + if (RunQuery(query,errbuf, &result)) { while((row = mysql_fetch_row(result))) { SpawnEntry* newSpawnEntry = new SpawnEntry( atoi(row[1]), atoi(row[2]), row[3]?atoi(row[3]):0); @@ -188,7 +194,6 @@ bool ZoneDatabase::LoadSpawnGroups(const char* zone_name, uint16 version, SpawnG else { std::cerr << "Error3 in PopulateZoneLists query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } @@ -198,16 +203,22 @@ bool ZoneDatabase::LoadSpawnGroups(const char* zone_name, uint16 version, SpawnG bool ZoneDatabase::LoadSpawnGroupsByID(int spawngroupid, SpawnGroupList* spawn_group_list) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; // CODER new spawn code - query = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT DISTINCT spawngroup.id, spawngroup.name, spawngroup.spawn_limit, spawngroup.dist, spawngroup.max_x, spawngroup.min_x, spawngroup.max_y, spawngroup.min_y, spawngroup.delay, spawngroup.despawn, spawngroup.despawn_timer FROM spawngroup WHERE spawngroup.ID='%i'", spawngroupid), errbuf, &result)) + StringFormat(query, "SELECT DISTINCT spawngroup.id, spawngroup.name, " + "spawngroup.spawn_limit, spawngroup.dist, " + "spawngroup.max_x, spawngroup.min_x, spawngroup.max_y, " + "spawngroup.min_y, spawngroup.delay, spawngroup.despawn, " + "spawngroup.despawn_timer FROM spawngroup " + "WHERE spawngroup.ID='%i'", + spawngroupid); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while((row = mysql_fetch_row(result))) { SpawnGroup* newSpawnGroup = new SpawnGroup( atoi(row[0]), row[1], atoi(row[2]), atof(row[3]), atof(row[4]), atof(row[5]), atof(row[6]), atof(row[7]), atoi(row[8]), atoi(row[9]), atoi(row[10])); spawn_group_list->AddSpawnGroup(newSpawnGroup); @@ -217,14 +228,16 @@ bool ZoneDatabase::LoadSpawnGroupsByID(int spawngroupid, SpawnGroupList* spawn_g else { std::cerr << "Error2 in PopulateZoneLists query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - query = 0; - if (RunQuery(query, MakeAnyLenString(&query, - "SELECT DISTINCT spawnentry.spawngroupID, spawnentry.npcid, spawnentry.chance, spawngroup.spawn_limit FROM spawnentry,spawngroup WHERE spawnentry.spawngroupID='%i' AND spawngroup.spawn_limit='0' ORDER by chance", spawngroupid), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT DISTINCT spawnentry.spawngroupID, spawnentry.npcid, " + "spawnentry.chance, spawngroup.spawn_limit " + "FROM spawnentry,spawngroup WHERE spawnentry.spawngroupID='%i' " + "AND spawngroup.spawn_limit='0' ORDER by chance", + spawngroupid); + + if (RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { SpawnEntry* newSpawnEntry = new SpawnEntry( atoi(row[1]), atoi(row[2]), row[3]?atoi(row[3]):0); @@ -239,7 +252,6 @@ bool ZoneDatabase::LoadSpawnGroupsByID(int spawngroupid, SpawnGroupList* spawn_g else { std::cerr << "Error3 in PopulateZoneLists query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } diff --git a/zone/spells.cpp b/zone/spells.cpp index 81d15752a..2f3c86215 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -4606,12 +4606,15 @@ bool Client::SpellGlobalCheck(uint16 Spell_ID, uint16 Char_ID) { int Global_Value; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (database.RunQuery(query,MakeAnyLenString(&query, "SELECT qglobal, value FROM spell_globals WHERE spellid=%i", Spell_ID), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT qglobal, value FROM " + "spell_globals WHERE spellid=%i", + Spell_ID); + + if (database.RunQuery(query,errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -4619,12 +4622,16 @@ bool Client::SpellGlobalCheck(uint16 Spell_ID, uint16 Char_ID) { Spell_Global_Value = atoi(row[1]); mysql_free_result(result); - + + StringFormat(query,"SELECT value FROM " + "quest_globals WHERE " + "charid=%i AND name='%s'", + Char_ID, Spell_Global_Name.c_str()); + if (Spell_Global_Name.empty()) { // If the entry in the spell_globals table has nothing set for the qglobal name return true; } - else if (database.RunQuery(query,MakeAnyLenString(&query, "SELECT value FROM quest_globals WHERE charid=%i AND name='%s'", Char_ID, Spell_Global_Name.c_str()), errbuf, &result)) { - safe_delete_array(query); + else if (database.RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -4645,7 +4652,6 @@ bool Client::SpellGlobalCheck(uint16 Spell_ID, uint16 Char_ID) { } else LogFile->write(EQEMuLog::Error, "Char ID: %i does not have the Qglobal Name: '%s' for Spell ID %i", Char_ID, Spell_Global_Name.c_str(), Spell_ID); - safe_delete_array(query); } else LogFile->write(EQEMuLog::Error, "Spell ID %i query of spell_globals with Name: '%s' Value: '%i' failed", Spell_ID, Spell_Global_Name.c_str(), Spell_Global_Value); @@ -4656,8 +4662,7 @@ bool Client::SpellGlobalCheck(uint16 Spell_ID, uint16 Char_ID) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error while querying Spell ID %i spell_globals table query '%s': %s", Spell_ID, query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error while querying Spell ID %i spell_globals table query '%s': %s", Spell_ID, query.c_str(), errbuf); return false; // Query failed, so prevent spell from scribing just in case } return false; // Default is false diff --git a/zone/tasks.cpp b/zone/tasks.cpp index eec66e57e..2a9f7ea46 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -61,15 +61,8 @@ TaskManager::~TaskManager() { } bool TaskManager::LoadTaskSets() { - - - const char *TaskSetQuery = "SELECT `id`, `taskid` from `tasksets` WHERE `id` > 0 AND `id` < %i " - "AND `taskid` >= 0 AND `taskid` < %i ORDER BY `id`, `taskid` ASC"; - - const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::LoadTaskSets: %s"; - char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -79,7 +72,11 @@ bool TaskManager::LoadTaskSets() { TaskSets[i].clear(); } - if(database.RunQuery(query,MakeAnyLenString(&query,TaskSetQuery,MAXTASKSETS,MAXTASKS),errbuf,&result)) { + StringFormat(query,"SELECT `id`, `taskid` from `tasksets` WHERE `id` > 0 AND `id` < %i " + "AND `taskid` >= 0 AND `taskid` < %i ORDER BY `id`, `taskid` ASC", + MAXTASKSETS, MAXTASKS); + + if(database.RunQuery(query,errbuf,&result)) { while((row = mysql_fetch_row(result))) { int TaskSet = atoi(row[0]); @@ -89,11 +86,9 @@ bool TaskManager::LoadTaskSets() { _log(TASKS__GLOBALLOAD, "Adding TaskID %4i to TaskSet %4i", TaskID, TaskSet); } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "[TASKS]Error in TaskManager::LoadTaskSets: %s", errbuf); return false; } @@ -164,7 +159,7 @@ bool TaskManager::LoadTasks(int SingleTask) { const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::LoadTasks: %s"; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; int QueryLength = 0; MYSQL_RES *result; MYSQL_ROW row; @@ -177,13 +172,15 @@ bool TaskManager::LoadTasks(int SingleTask) { if(!LoadTaskSets()) _log(TASKS__GLOBALLOAD,"TaskManager::LoadTasks LoadTaskSets failed"); - - QueryLength = MakeAnyLenString(&query,AllTaskQuery,MAXTASKS); + + StringFormat(query,AllTaskQuery,MAXTASKS); } else - QueryLength = MakeAnyLenString(&query,SingleTaskQuery,SingleTask); + { + StringFormat(query,SingleTaskQuery,SingleTask); + } - if(database.RunQuery(query,QueryLength,errbuf,&result)) { + if(database.RunQuery(query,errbuf,&result)) { while((row = mysql_fetch_row(result))) { int TaskID = atoi(row[0]); @@ -221,21 +218,23 @@ bool TaskManager::LoadTasks(int SingleTask) { } mysql_free_result(result); - safe_delete_array(query); } else { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf); - safe_delete_array(query); return false; } if(SingleTask==0) - QueryLength = MakeAnyLenString(&query,AllActivityQuery,MAXTASKS, MAXACTIVITIESPERTASK); + { + StringFormat(query, AllActivityQuery,MAXTASKS, MAXACTIVITIESPERTASK); + } else - QueryLength = MakeAnyLenString(&query,SingleTaskActivityQuery, SingleTask, MAXACTIVITIESPERTASK); + { + StringFormat(query, SingleTaskActivityQuery, SingleTask, MAXACTIVITIESPERTASK); + } - if(database.RunQuery(query,QueryLength, errbuf, &result)) { + if(database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { int TaskID = atoi(row[0]); @@ -319,12 +318,9 @@ bool TaskManager::LoadTasks(int SingleTask) { } mysql_free_result(result); - safe_delete_array(query); - } else { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf); - safe_delete_array(query); return false; } return true; @@ -356,7 +352,7 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; if(state->ActiveTaskCount > 0) { for(int Task=0; TaskActiveTasks[Task].AcceptedTime), errbuf)) { - + + StringFormat(query, TaskQuery, CharacterID, + TaskID, Task, state->ActiveTasks[Task].AcceptedTime); + + if(!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf); } else state->ActiveTasks[Task].Updated = false; - safe_delete_array(query); } int UpdatedActivityCount = 0; @@ -415,8 +408,10 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) { if(UpdatedActivityCount > 0) { _log(TASKS__CLIENTSAVE, "Executing query %s", UpdateActivityQuery.c_str()); - if(!database.RunQuery(query,MakeAnyLenString(&query, UpdateActivityQuery.c_str()), - errbuf)) { + + query = UpdateActivityQuery; + + if(!database.RunQuery(query,errbuf)) { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf); } @@ -427,7 +422,6 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) { } - safe_delete_array(query); } } @@ -445,15 +439,16 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) { // This indicates this task was completed at the given time. We infer that all // none optional activities were completed. // - if(!database.RunQuery(query,MakeAnyLenString(&query, CompletedTaskQuery, - CharacterID, - state->CompletedTasks[i].CompletedTime, - TaskID, -1), errbuf)) { + + StringFormat(query,CompletedTaskQuery, CharacterID, + state->CompletedTasks[i].CompletedTime, + TaskID, -1); + + if(!database.RunQuery(query,errbuf)) { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf); continue; } - safe_delete_array(query); // If the Rule to record non-optional task completion is not enabled, don't save it if(!RuleB(TaskSystem, RecordCompletedOptionalActivities)) continue; @@ -462,15 +457,15 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) { for(int j=0; jActivityCount; j++) { if(Tasks[TaskID]->Activity[j].Optional && state->CompletedTasks[i].ActivityDone[j]) { - - if(!database.RunQuery(query,MakeAnyLenString(&query, CompletedTaskQuery, - CharacterID, - state->CompletedTasks[i].CompletedTime, - TaskID, j), errbuf)) { + + StringFormat(query,CompletedTaskQuery, + CharacterID, state->CompletedTasks[i].CompletedTime, + TaskID, j); + + if(!database.RunQuery(query,errbuf)) { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, errbuf); } - safe_delete_array(query); } } } @@ -521,7 +516,7 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { const char *ERR_MYSQLERROR1 = "[TASKS]Error in TaskManager::LoadClientState load Tasks: %s"; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -533,7 +528,9 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { _log(TASKS__CLIENTLOAD, "TaskManager::LoadClientSate for character ID %d", CharacterID); - if(database.RunQuery(query,MakeAnyLenString(&query, TaskQuery, CharacterID), errbuf, &result)) { + StringFormat(query, TaskQuery, CharacterID); + + if(database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -580,11 +577,9 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { CharacterID, TaskID,acceptedtime); } mysql_free_result(result); - safe_delete_array(query); } else { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR1, errbuf); - safe_delete_array(query); safe_delete(state); return false; } @@ -593,7 +588,7 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { const char *ActivityQuery = "SELECT `taskid`, `activityid`, `donecount`, `completed` " " from `character_activities` WHERE `charid` = %i " - "ORDER BY `taskid` ASC, `activityid` ASC"; + "ORDER BY `taskid` ASC, `activityid` ASC"; const char *ERR_TASK_OOR2 = "[TASKS]Task ID %i out of range while loading character activities from database"; @@ -605,11 +600,9 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { _log(TASKS__CLIENTLOAD, "LoadClientState. Loading activities for character ID %d", CharacterID); + StringFormat(query, ActivityQuery, CharacterID); - - if(database.RunQuery(query,MakeAnyLenString(&query, ActivityQuery, - CharacterID), errbuf, &result)) { - + if(database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { int TaskID = atoi(row[0]); @@ -654,11 +647,9 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { } mysql_free_result(result); - safe_delete_array(query); } else { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR2, errbuf); - safe_delete_array(query); safe_delete(state); return false; } @@ -675,8 +666,10 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { if(RuleB(TaskSystem, RecordCompletedTasks)) { - if(database.RunQuery(query,MakeAnyLenString(&query, CompletedTaskQuery, - CharacterID), errbuf, &result)) { + + StringFormat(query, CompletedTaskQuery, CharacterID); + + if(database.RunQuery(query, errbuf, &result)) { CompletedTaskInformation cti; @@ -733,11 +726,9 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { state->LastCompletedTaskLoaded = state->CompletedTasks.size(); mysql_free_result(result); - safe_delete_array(query); } else { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR3, errbuf); - safe_delete_array(query); safe_delete(state); return false; } @@ -748,8 +739,9 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { const char *ERR_MYSQLERROR4 = "[TASKS]Error in TaskManager::LoadClientState load enabled tasks: %s"; - if(database.RunQuery(query,MakeAnyLenString(&query, EnabledTaskQuery, - CharacterID, MAXTASKS), errbuf, &result)) { + StringFormat(query, EnabledTaskQuery, CharacterID, MAXTASKS); + + if(database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { int TaskID = atoi(row[0]); @@ -757,11 +749,9 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { _log(TASKS__CLIENTLOAD, "Adding TaskID %i to enabled tasks", TaskID); } mysql_free_result(result); - safe_delete_array(query); } else { LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR4, errbuf); - safe_delete_array(query); } // Check that there is an entry in the client task state for every activity in each task @@ -849,7 +839,7 @@ void ClientTaskState::EnableTask(int CharID, int TaskCount, int *TaskList) { const char *ERR_MYSQLERROR = "[TASKS]Error in ClientTaskState::EnableTask %s %s"; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; char *buf = 0; @@ -864,13 +854,12 @@ void ClientTaskState::EnableTask(int CharID, int TaskCount, int *TaskList) { } _log(TASKS__UPDATE, "Executing query %s", TaskQuery.c_str()); + query = TaskQuery; + if(!database.RunQuery(query, errbuf)) { - if(!database.RunQuery(query,MakeAnyLenString(&query, TaskQuery.c_str()), errbuf)) { - - LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query, errbuf); + LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query.c_str(), errbuf); } - safe_delete_array(query); } void ClientTaskState::DisableTask(int CharID, int TaskCount, int *TaskList) { @@ -909,7 +898,7 @@ void ClientTaskState::DisableTask(int CharID, int TaskCount, int *TaskList) { const char *ERR_MYSQLERROR = "[TASKS]Error in ClientTaskState::DisableTask %s %s"; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; char *buf = 0; @@ -929,13 +918,14 @@ void ClientTaskState::DisableTask(int CharID, int TaskCount, int *TaskList) { TaskQuery = TaskQuery + ")"; _log(TASKS__UPDATE, "Executing query %s", TaskQuery.c_str()); + + query = TaskQuery; + + if(!database.RunQuery(query, errbuf)) { - if(!database.RunQuery(query,MakeAnyLenString(&query, TaskQuery.c_str()), errbuf)) { - - LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query, errbuf); + LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query.c_str(), errbuf); } - safe_delete_array(query); } bool ClientTaskState::IsTaskEnabled(int TaskID) { @@ -1437,21 +1427,21 @@ int ClientTaskState::GetActiveTaskID(int index) { static void DeleteCompletedTaskFromDatabase(int CharID, int TaskID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; const char *TaskQuery="DELETE FROM completed_tasks WHERE charid=%i AND taskid = %i"; _log(TASKS__UPDATE, "DeleteCompletedTasksFromDatabase. CharID = %i, TaskID = %i", CharID, TaskID); + + StringFormat(query, TaskQuery, CharID, TaskID); + + if(!database.RunQuery(query, errbuf)) { - if(!database.RunQuery(query,MakeAnyLenString(&query, TaskQuery, CharID, TaskID), errbuf)) { - - LogFile->write(EQEMuLog::Error, "[TASKS]Error in CientTaskState::CancelTask %s, %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "[TASKS]Error in CientTaskState::CancelTask %s, %s", query.c_str(), errbuf); return; } - _log(TASKS__UPDATE, "Delete query %s", query); - safe_delete_array(query); + _log(TASKS__UPDATE, "Delete query %s", query.c_str()); } bool ClientTaskState::UnlockActivities(int CharID, int TaskIndex) { @@ -3141,33 +3131,31 @@ void ClientTaskState::RemoveTask(Client *c, int SequenceNumber) { int CharacterID = c->CharacterID(); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; const char *TaskQuery="DELETE FROM character_tasks WHERE charid=%i AND taskid = %i"; const char *ActivityQuery="DELETE FROM character_activities WHERE charid=%i AND taskid = %i"; _log(TASKS__UPDATE, "ClientTaskState Cancel Task %i ", SequenceNumber); - - if(!database.RunQuery(query,MakeAnyLenString(&query, ActivityQuery, - CharacterID, - ActiveTasks[SequenceNumber].TaskID), errbuf)) { + + StringFormat(query,ActivityQuery, CharacterID, ActiveTasks[SequenceNumber].TaskID); + + if(!database.RunQuery(query,errbuf)) { LogFile->write(EQEMuLog::Error, "[TASKS]Error in CientTaskState::CancelTask %s", errbuf); - safe_delete_array(query); return; } - _log(TASKS__UPDATE, "CancelTask: %s", query); - safe_delete_array(query); - if(!database.RunQuery(query,MakeAnyLenString(&query, TaskQuery, - CharacterID, - ActiveTasks[SequenceNumber].TaskID), errbuf)) { + _log(TASKS__UPDATE, "CancelTask: %s", query.c_str()); + + StringFormat(query,TaskQuery, CharacterID, ActiveTasks[SequenceNumber].TaskID); + + if(!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "[TASKS]Error in CientTaskState::CancelTask %s", errbuf); } - _log(TASKS__UPDATE, "CancelTask: %s", query); - safe_delete_array(query); + _log(TASKS__UPDATE, "CancelTask: %s", query.c_str()); ActiveTasks[SequenceNumber].TaskID = TASKSLOTEMPTY; ActiveTaskCount--; @@ -3305,7 +3293,7 @@ bool TaskGoalListManager::LoadLists() { const char *ERR_MYSQLERROR = "Error in TaskGoalListManager::LoadLists: %s %s"; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -3319,8 +3307,10 @@ bool TaskGoalListManager::LoadLists() { safe_delete_array(TaskGoalLists); NumberOfLists = 0; - - if(database.RunQuery(query,MakeAnyLenString(&query,CountQuery),errbuf,&result)) { + + query = CountQuery; + + if(database.RunQuery(query,errbuf,&result)) { NumberOfLists = mysql_num_rows(result); _log(TASKS__GLOBALLOAD, "Database returned a count of %i lists", NumberOfLists); @@ -3342,11 +3332,9 @@ bool TaskGoalListManager::LoadLists() { ListIndex++; } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query.c_str(), errbuf); return false; } @@ -3355,7 +3343,9 @@ bool TaskGoalListManager::LoadLists() { int ListID = TaskGoalLists[ListIndex].ListID; unsigned int Size = TaskGoalLists[ListIndex].Size; - if(database.RunQuery(query,MakeAnyLenString(&query,ListQuery,ListID,Size),errbuf,&result)) { + StringFormat(query,ListQuery,ListID,Size); + + if(database.RunQuery(query,errbuf,&result)) { // This should only happen if a row is deleted in between us retrieving the counts // at the start of this method and getting to here. It should not be possible for // an INSERT to cause a problem, as the SELECT is used with a LIMIT @@ -3379,12 +3369,10 @@ bool TaskGoalListManager::LoadLists() { } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query, errbuf); + LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query.c_str(), errbuf); TaskGoalLists[ListIndex].Size = 0; - safe_delete_array(query); } } return true; @@ -3493,7 +3481,7 @@ bool TaskProximityManager::LoadProximities(int ZoneID) { const char *ERR_MYSQLERROR = "Error in TaskProximityManager::LoadProximities %s %s"; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -3502,8 +3490,10 @@ bool TaskProximityManager::LoadProximities(int ZoneID) { _log(TASKS__GLOBALLOAD, "TaskProximityManager::LoadProximities Called for zone %i", ZoneID); TaskProximities.clear(); - - if(database.RunQuery(query,MakeAnyLenString(&query,ProximityQuery, ZoneID),errbuf,&result)) { + + StringFormat(query,ProximityQuery, ZoneID); + + if(database.RunQuery(query, errbuf,&result)) { while((row = mysql_fetch_row(result))) { Proximity.ExploreID = atoi(row[0]); @@ -3520,11 +3510,9 @@ bool TaskProximityManager::LoadProximities(int ZoneID) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, ERR_MYSQLERROR, query.c_str(), errbuf); return false; } - safe_delete_array(query); return true; diff --git a/zone/titles.cpp b/zone/titles.cpp index c2f5a484d..5eef97039 100644 --- a/zone/titles.cpp +++ b/zone/titles.cpp @@ -34,20 +34,21 @@ bool TitleManager::LoadTitles() TitleEntry Title; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = nullptr; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (!database.RunQuery(query, MakeAnyLenString(&query, - "SELECT `id`, `skill_id`, `min_skill_value`, `max_skill_value`, `min_aa_points`, `max_aa_points`, `class`, `gender`, " - "`char_id`, `status`, `item_id`, `prefix`, `suffix`, `title_set` from titles"), errbuf, &result)) + query = "SELECT `id`, `skill_id`, `min_skill_value`, `max_skill_value`, " + "`min_aa_points`, `max_aa_points`, `class`, `gender`, " + "`char_id`, `status`, `item_id`, `prefix`, `suffix`, " + "`title_set` from titles"; + + if (!database.RunQuery(query, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Unable to load titles: %s : %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Unable to load titles: %s : %s", query.c_str(), errbuf); return(false); } - safe_delete_array(query); while ((row = mysql_fetch_row(result))) { Title.TitleID = atoi(row[0]); @@ -250,42 +251,38 @@ void TitleManager::CreateNewPlayerTitle(Client *c, const char *Title) return; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = nullptr; + std::string query; MYSQL_RES *result; - char *EscTitle = new char[strlen(Title) * 2 + 1]; + std::string escTitle; c->SetAATitle(Title); - database.DoEscapeString(EscTitle, Title, strlen(Title)); - - if (database.RunQuery(query, MakeAnyLenString(&query, - "SELECT `id` from titles where `prefix` = '%s' and char_id = %i", EscTitle, c->CharacterID()), errbuf, &result)) + database.DoEscapeString(escTitle, Title, strlen(Title)); + + StringFormat(query,"SELECT `id` from titles where `prefix` = '%s' and char_id = %i", escTitle.c_str(), c->CharacterID()); + + if (database.RunQuery(query, errbuf, &result)) { if(mysql_num_rows(result) > 0) { mysql_free_result(result); - safe_delete_array(query); - safe_delete_array(EscTitle); return; } mysql_free_result(result); } - safe_delete_array(query); - - if(!database.RunQuery(query,MakeAnyLenString(&query, "INSERT into titles (`char_id`, `prefix`) VALUES(%i, '%s')", - c->CharacterID(), EscTitle), errbuf)) - LogFile->write(EQEMuLog::Error, "Error adding title: %s %s", query, errbuf); + StringFormat(query, "INSERT into titles (`char_id`, `prefix`) VALUES(%i, '%s')", + c->CharacterID(), escTitle.c_str()); + + if(!database.RunQuery(query,errbuf)) + LogFile->write(EQEMuLog::Error, "Error adding title: %s %s", query.c_str(), errbuf); else { ServerPacket* pack = new ServerPacket(ServerOP_ReloadTitles, 0); worldserver.SendPacket(pack); safe_delete(pack); } - safe_delete_array(query); - safe_delete_array(EscTitle); - } void TitleManager::CreateNewPlayerSuffix(Client *c, const char *Suffix) @@ -294,41 +291,39 @@ void TitleManager::CreateNewPlayerSuffix(Client *c, const char *Suffix) return; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = nullptr; + std::string query; MYSQL_RES *result; - char *EscSuffix = new char[strlen(Suffix) * 2 + 1]; + std::string escSuffix; c->SetTitleSuffix(Suffix); - database.DoEscapeString(EscSuffix, Suffix, strlen(Suffix)); + database.DoEscapeString(escSuffix, Suffix, strlen(Suffix)); - if (database.RunQuery(query, MakeAnyLenString(&query, - "SELECT `id` from titles where `suffix` = '%s' and char_id = %i", EscSuffix, c->CharacterID()), errbuf, &result)) + StringFormat(query, "SELECT `id` from titles where `suffix` = '%s' and char_id = %i", + escSuffix.c_str(), c->CharacterID()); + + if (database.RunQuery(query, errbuf, &result)) { if(mysql_num_rows(result) > 0) { mysql_free_result(result); - safe_delete_array(query); - safe_delete_array(EscSuffix); return; } mysql_free_result(result); } - safe_delete_array(query); + StringFormat(query, "INSERT into titles (`char_id`, `suffix`) VALUES(%i, '%s')", + c->CharacterID(), escSuffix.c_str()); - if(!database.RunQuery(query,MakeAnyLenString(&query, "INSERT into titles (`char_id`, `suffix`) VALUES(%i, '%s')", - c->CharacterID(), EscSuffix), errbuf)) - LogFile->write(EQEMuLog::Error, "Error adding title suffix: %s %s", query, errbuf); + if(!database.RunQuery(query, errbuf)) + LogFile->write(EQEMuLog::Error, "Error adding title suffix: %s %s", query.c_str(), errbuf); else { ServerPacket* pack = new ServerPacket(ServerOP_ReloadTitles, 0); worldserver.SendPacket(pack); safe_delete(pack); } - safe_delete_array(query); - safe_delete_array(EscSuffix); } @@ -375,27 +370,31 @@ void Client::EnableTitle(int titleset) { } char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if(!database.RunQuery(query,MakeAnyLenString(&query, "INSERT INTO player_titlesets (char_id, title_set) VALUES (%i, %i)", CharacterID(), titleset), errbuf)) { + StringFormat(query, "INSERT INTO player_titlesets " + "(char_id, title_set) VALUES (%i, %i)", + CharacterID(), titleset); + + if(!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Error in EnableTitle query for titleset %i and charid %i", titleset, CharacterID()); - safe_delete_array(query); - return; - } - else { - safe_delete_array(query); - return; } + + return; } bool Client::CheckTitle(int titleset) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; - if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT `id` FROM player_titlesets WHERE `title_set`=%i AND `char_id`=%i LIMIT 1", titleset, CharacterID()), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT `id` FROM player_titlesets " + "WHERE `title_set`=%i AND " + "`char_id`=%i LIMIT 1", + titleset, CharacterID()); + + if (database.RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) >= 1) { mysql_free_result(result); return(true); @@ -404,11 +403,10 @@ bool Client::CheckTitle(int titleset) { } else { - LogFile->write(EQEMuLog::Error, "Error in CheckTitle query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in CheckTitle query '%s': %s", query.c_str(), errbuf); } - return(false); + return false; } void Client::RemoveTitle(int titleset) { @@ -418,15 +416,14 @@ void Client::RemoveTitle(int titleset) { } char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM player_titlesets WHERE `title_set`=%i AND `char_id`=%i", titleset, CharacterID()), errbuf)) { - safe_delete_array(query); - } + StringFormat(query, "DELETE FROM player_titlesets WHERE " + "`title_set`=%i AND `char_id`=%i", + titleset, CharacterID()); - else { - LogFile->write(EQEMuLog::Error, "Error in RemoveTitle query '%s': %s", query, errbuf); - safe_delete_array(query); + if (!database.RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error in RemoveTitle query '%s': %s", query.c_str(), errbuf); } return; diff --git a/zone/tradeskills.cpp b/zone/tradeskills.cpp index 6eaa717ad..e10d1cade 100644 --- a/zone/tradeskills.cpp +++ b/zone/tradeskills.cpp @@ -393,24 +393,23 @@ void Object::HandleAutoCombine(Client* user, const RecipeAutoCombine_Struct* rac char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - char *query = 0; + std::string query; uint32 qlen = 0; uint8 qcount = 0; //pull the list of components - qlen = MakeAnyLenString(&query, "SELECT tre.item_id,tre.componentcount " - " FROM tradeskill_recipe_entries AS tre " - " WHERE tre.componentcount > 0 AND tre.recipe_id=%u", rac->recipe_id); + StringFormat(query, "SELECT tre.item_id,tre.componentcount " + "FROM tradeskill_recipe_entries AS tre " + "WHERE tre.componentcount > 0 AND " + "tre.recipe_id=%u", rac->recipe_id); - if (!database.RunQuery(query, qlen, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Error in HandleAutoCombine query '%s': %s", query, errbuf); - safe_delete_array(query); + if (!database.RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in HandleAutoCombine query '%s': %s", query.c_str(), errbuf); user->QueuePacket(outapp); safe_delete(outapp); return; } - safe_delete_array(query); qcount = mysql_num_rows(result); if(qcount < 1) { @@ -608,14 +607,13 @@ SkillType Object::TypeToSkill(uint32 type) { return(tradeskill); } -void Client::TradeskillSearchResults(const char *query, unsigned long qlen, unsigned long objtype, unsigned long someid) { - +void Client::TradeskillSearchResults(const std::string query, unsigned long qlen, unsigned long objtype, unsigned long someid) { char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - if (!database.RunQuery(query, qlen, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Error in TradeskillSearchResults query '%s': %s", query, errbuf); + if (!database.RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in TradeskillSearchResults query '%s': %s", query.c_str(), errbuf); return; } @@ -627,7 +625,7 @@ void Client::TradeskillSearchResults(const char *query, unsigned long qlen, unsi return; } if(mysql_num_fields(result) != 6) { - LogFile->write(EQEMuLog::Error, "Error in TradeskillSearchResults query '%s': Invalid column count in result", query); + LogFile->write(EQEMuLog::Error, "Error in TradeskillSearchResults query '%s': Invalid column count in result", query.c_str()); return; } @@ -673,23 +671,21 @@ void Client::SendTradeskillDetails(uint32 recipe_id) { char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - char *query = 0; + std::string query; uint32 qlen = 0; uint8 qcount = 0; //pull the list of components - qlen = MakeAnyLenString(&query, "SELECT tre.item_id,tre.componentcount,i.icon,i.Name " - " FROM tradeskill_recipe_entries AS tre " - " LEFT JOIN items AS i ON tre.item_id = i.id " - " WHERE tre.componentcount > 0 AND tre.recipe_id=%u", recipe_id); + StringFormat(query, "SELECT tre.item_id,tre.componentcount,i.icon,i.Name " + "FROM tradeskill_recipe_entries AS tre " + "LEFT JOIN items AS i ON tre.item_id = i.id " + "WHERE tre.componentcount > 0 AND tre.recipe_id=%u", recipe_id); - if (!database.RunQuery(query, qlen, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Error in SendTradeskillDetails query '%s': %s", query, errbuf); - safe_delete_array(query); + if (!database.RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in SendTradeskillDetails query '%s': %s", query.c_str(), errbuf); return; } - safe_delete_array(query); qcount = mysql_num_rows(result); if(qcount < 1) { @@ -1131,7 +1127,7 @@ bool ZoneDatabase::GetTradeRecipe(const ItemInst* container, uint8 c_type, uint3 char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - char *query = 0; + std::string query; char buf2[4096]; uint32 sum = 0; @@ -1178,20 +1174,19 @@ bool ZoneDatabase::GetTradeRecipe(const ItemInst* container, uint8 c_type, uint3 return(false); //no items == no recipe } - qlen = MakeAnyLenString(&query, "SELECT tre.recipe_id " - " FROM tradeskill_recipe_entries AS tre" - " WHERE ( tre.item_id IN(%s) AND tre.componentcount>0 )" - " OR ( tre.item_id %s AND tre.iscontainer=1 )" - " GROUP BY tre.recipe_id HAVING sum(tre.componentcount) = %u" - " AND sum(tre.item_id * tre.componentcount) = %u", buf2, containers, count, sum); + StringFormat(query, "SELECT tre.recipe_id " + "FROM tradeskill_recipe_entries AS tre " + "WHERE ( tre.item_id IN(%s) AND tre.componentcount>0 ) " + "OR ( tre.item_id %s AND tre.iscontainer=1 ) " + "GROUP BY tre.recipe_id HAVING sum(tre.componentcount) = %u " + "AND sum(tre.item_id * tre.componentcount) = %u", + buf2, containers, count, sum); - if (!RunQuery(query, qlen, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe search, query: %s", query); - safe_delete_array(query); + if (!RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe search, query: %s", query.c_str()); LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe search, error: %s", errbuf); - return(false); + return false; } - safe_delete_array(query); qcount = mysql_num_rows(result); if(qcount > 1) { @@ -1217,19 +1212,18 @@ bool ZoneDatabase::GetTradeRecipe(const ItemInst* container, uint8 c_type, uint3 } } - qlen = MakeAnyLenString(&query, "SELECT tre.recipe_id" - " FROM tradeskill_recipe_entries AS tre" - " WHERE tre.recipe_id IN (%s)" - " GROUP BY tre.recipe_id HAVING sum(tre.componentcount) = %u" - " AND sum(tre.item_id * tre.componentcount) = %u", buf2, count, sum); + StringFormat(query, "SELECT tre.recipe_id " + "FROM tradeskill_recipe_entries AS tre " + "WHERE tre.recipe_id IN (%s) " + "GROUP BY tre.recipe_id HAVING sum(tre.componentcount) = %u " + "AND sum(tre.item_id * tre.componentcount) = %u", + buf2, count, sum); - if (!RunQuery(query, qlen, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe, re-query: %s", query); - safe_delete_array(query); + if (!RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe, re-query: %s", query.c_str()); LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe, error: %s", errbuf); - return(false); + return false; } - safe_delete_array(query); qcount = mysql_num_rows(result); } @@ -1253,22 +1247,22 @@ bool ZoneDatabase::GetTradeRecipe(const ItemInst* container, uint8 c_type, uint3 return(false); } - qlen = MakeAnyLenString(&query,"SELECT tre.recipe_id FROM tradeskill_recipe_entries as tre WHERE tre.recipe_id IN (%s)" - " AND tre.item_id = %u;",buf2,containerId); + StringFormat(query,"SELECT tre.recipe_id FROM " + "tradeskill_recipe_entries as tre WHERE tre.recipe_id IN (%s) " + "AND tre.item_id = %u;", + buf2, containerId); - if (!RunQuery(query, qlen, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe, re-query: %s", query); - safe_delete_array(query); + if (!RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe, re-query: %s", query.c_str()); LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe, error: %s", errbuf); - return(false); + return false; } - safe_delete_array(query); uint32 resultRowTotal = mysql_num_rows(result); if(resultRowTotal == 0) { //Recipe contents matched more than 1 recipe, but not in this container LogFile->write(EQEMuLog::Error, "Combine error: Incorrect container is being used!"); - return(false); + return false; } if(resultRowTotal > 1) { //Recipe contents matched more than 1 recipe in this container LogFile->write(EQEMuLog::Error, "Combine error: Recipe is not unique! %u matches found for container %u. Continuing with first recipe match.", resultRowTotal, containerId); @@ -1284,10 +1278,15 @@ bool ZoneDatabase::GetTradeRecipe(const ItemInst* container, uint8 c_type, uint3 //This is here because something's up with the query above.. it needs to be rethought out bool has_components = true; char TSerrbuf[MYSQL_ERRMSG_SIZE]; - char *TSquery = 0; MYSQL_RES *TSresult; MYSQL_ROW TSrow; - if (RunQuery(TSquery, MakeAnyLenString(&TSquery, "SELECT item_id, componentcount from tradeskill_recipe_entries where recipe_id=%i AND componentcount > 0", recipe_id), TSerrbuf, &TSresult)) { + + StringFormat(query, "SELECT item_id, componentcount from " + "tradeskill_recipe_entries where " + "recipe_id=%i AND componentcount > 0", + recipe_id); + + if (RunQuery(query, TSerrbuf, &TSresult)) { while((TSrow = mysql_fetch_row(TSresult))!=nullptr) { int ccnt = 0; for(int x = 0; x < 10; x++){ @@ -1306,15 +1305,14 @@ bool ZoneDatabase::GetTradeRecipe(const ItemInst* container, uint8 c_type, uint3 } mysql_free_result(TSresult); } else { - LogFile->write(EQEMuLog::Error, "Error in tradeskill verify query: '%s': %s", TSquery, TSerrbuf); + LogFile->write(EQEMuLog::Error, "Error in tradeskill verify query: '%s': %s", query.c_str(), TSerrbuf); } - safe_delete_array(TSquery); + if(has_components == false){ - return false; } - return(GetTradeRecipe(recipe_id, c_type, some_id, char_id, spec)); + return GetTradeRecipe(recipe_id, c_type, some_id, char_id, spec); } bool ZoneDatabase::GetTradeRecipe(uint32 recipe_id, uint8 c_type, uint32 some_id, @@ -1323,7 +1321,7 @@ bool ZoneDatabase::GetTradeRecipe(uint32 recipe_id, uint8 c_type, uint32 some_id char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - char *query = 0; + std::string query; uint32 qcount = 0; uint32 qlen; @@ -1338,22 +1336,24 @@ bool ZoneDatabase::GetTradeRecipe(uint32 recipe_id, uint8 c_type, uint32 some_id snprintf(containers,29, "in (%u,%u)", c_type, some_id); } - qlen = MakeAnyLenString(&query, "SELECT tr.id, tr.tradeskill, tr.skillneeded," - " tr.trivial, tr.nofail, tr.replace_container, tr.name, tr.must_learn, tr.quest, crl.madecount" - " FROM tradeskill_recipe AS tr inner join tradeskill_recipe_entries as tre" - " ON tr.id = tre.recipe_id" - " LEFT JOIN (SELECT recipe_id, madecount from char_recipe_list WHERE char_id = %u) AS crl " - " ON tr.id = crl.recipe_id " - " WHERE tr.id = %lu AND tre.item_id %s" - " GROUP BY tr.id", char_id, (unsigned long)recipe_id, containers); + StringFormat(query, "SELECT tr.id, tr.tradeskill, tr.skillneeded, " + "tr.trivial, tr.nofail, tr.replace_container, " + "tr.name, tr.must_learn, tr.quest, crl.madecount " + "FROM tradeskill_recipe AS tr " + "inner join " + "tradeskill_recipe_entries as tre " + "ON tr.id = tre.recipe_id " + "LEFT JOIN (SELECT recipe_id, madecount from char_recipe_list WHERE char_id = %u) AS crl " + "ON tr.id = crl.recipe_id " + "WHERE tr.id = %lu AND tre.item_id %s " + "GROUP BY tr.id", + char_id, (unsigned long)recipe_id, containers); - if (!RunQuery(query, qlen, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe, query: %s", query); - safe_delete_array(query); + if (!RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe, query: %s", query.c_str()); LogFile->write(EQEMuLog::Error, "Error in GetTradeRecipe, error: %s", errbuf); - return(false); + return false; } - safe_delete_array(query); qcount = mysql_num_rows(result); if(qcount != 1) { @@ -1381,15 +1381,14 @@ bool ZoneDatabase::GetTradeRecipe(uint32 recipe_id, uint8 c_type, uint32 some_id mysql_free_result(result); //Pull the on-success items... - qlen = MakeAnyLenString(&query, "SELECT item_id,successcount FROM tradeskill_recipe_entries" - " WHERE successcount>0 AND recipe_id=%u", recipe_id); + StringFormat(query, "SELECT item_id,successcount FROM tradeskill_recipe_entries " + "WHERE successcount>0 AND recipe_id=%u", + recipe_id); - if (!RunQuery(query, qlen, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Error in GetTradeRecept success query '%s': %s", query, errbuf); - safe_delete_array(query); - return(false); + if (!RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in GetTradeRecept success query '%s': %s", query.c_str(), errbuf); + return false; } - safe_delete_array(query); qcount = mysql_num_rows(result); if(qcount < 1) { @@ -1407,11 +1406,12 @@ bool ZoneDatabase::GetTradeRecipe(uint32 recipe_id, uint8 c_type, uint32 some_id mysql_free_result(result); //Pull the on-fail items... - qlen = MakeAnyLenString(&query, "SELECT item_id,failcount FROM tradeskill_recipe_entries" - " WHERE failcount>0 AND recipe_id=%u", recipe_id); + StringFormat(query, "SELECT item_id,failcount FROM tradeskill_recipe_entries " + "WHERE failcount>0 AND recipe_id=%u", + recipe_id); spec->onfail.clear(); - if (RunQuery(query, qlen, errbuf, &result)) { + if (RunQuery(query, errbuf, &result)) { qcount = mysql_num_rows(result); uint8 r; @@ -1425,11 +1425,14 @@ bool ZoneDatabase::GetTradeRecipe(uint32 recipe_id, uint8 c_type, uint32 some_id } // Pull the salvage list - qlen = MakeAnyLenString(&query, "SELECT item_id,salvagecount FROM tradeskill_recipe_entries WHERE salvagecount>0 AND recipe_id=%u", recipe_id); + StringFormat(query, "SELECT item_id,salvagecount FROM " + "tradeskill_recipe_entries WHERE " + "salvagecount>0 AND recipe_id=%u", + recipe_id); spec->salvage.clear(); // Don't bother with the query if TS is nofail - if (!spec->nofail && RunQuery(query, qlen, errbuf, &result)) { + if (!spec->nofail && RunQuery(query, errbuf, &result)) { qcount = mysql_num_rows(result); uint8 r; for(r = 0; r < qcount; r++) { @@ -1441,46 +1444,45 @@ bool ZoneDatabase::GetTradeRecipe(uint32 recipe_id, uint8 c_type, uint32 some_id mysql_free_result(result); } - safe_delete_array(query); - return(true); + return true; } void ZoneDatabase::UpdateRecipeMadecount(uint32 recipe_id, uint32 char_id, uint32 madecount) { - char *query = 0; + std::string query; uint32 qlen; char errbuf[MYSQL_ERRMSG_SIZE]; - qlen = MakeAnyLenString(&query, "INSERT INTO char_recipe_list " - " SET recipe_id = %u, char_id = %u, madecount = %u " - " ON DUPLICATE KEY UPDATE madecount = %u;" - , recipe_id, char_id, madecount, madecount); + StringFormat(query, "INSERT INTO char_recipe_list " + "SET recipe_id = %u, char_id = %u, madecount = %u " + "ON DUPLICATE KEY UPDATE madecount = %u;", + recipe_id, char_id, madecount, madecount); - if (!RunQuery(query, qlen, errbuf)) { - LogFile->write(EQEMuLog::Error, "Error in UpdateRecipeMadecount query '%s': %s", query, errbuf); + if (!RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error in UpdateRecipeMadecount query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); } void Client::LearnRecipe(uint32 recipeID) { - char *query = 0; + std::string query; uint32 qlen; uint32 qcount = 0; char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - qlen = MakeAnyLenString(&query, "SELECT tr.name, crl.madecount " - " FROM tradeskill_recipe as tr " - " LEFT JOIN (SELECT recipe_id, madecount FROM char_recipe_list WHERE char_id = %u) AS crl " - " ON tr.id = crl.recipe_id " - " WHERE tr.id = %u ;", CharacterID(), recipeID); + StringFormat(query, "SELECT tr.name, crl.madecount " + "FROM tradeskill_recipe as tr " + "LEFT JOIN (SELECT recipe_id, madecount " + "FROM char_recipe_list WHERE char_id = %u) AS crl " + "ON tr.id = crl.recipe_id " + "WHERE tr.id = %u ;", + CharacterID(), recipeID); - if (!database.RunQuery(query, qlen, errbuf, &result)) { - LogFile->write(EQEMuLog::Error, "Error in Client::LearnRecipe query '%s': %s", query, errbuf); - safe_delete_array(query); + if (!database.RunQuery(query, errbuf, &result)) { + LogFile->write(EQEMuLog::Error, "Error in Client::LearnRecipe query '%s': %s", query.c_str(), errbuf); return; } @@ -1488,10 +1490,8 @@ void Client::LearnRecipe(uint32 recipeID) if (qcount != 1) { LogFile->write(EQEMuLog::Normal, "Client::LearnRecipe - RecipeID: %d had %d occurences.", recipeID, qcount); mysql_free_result(result); - safe_delete_array(query); return; } - safe_delete_array(query); row = mysql_fetch_row(result); @@ -1500,15 +1500,14 @@ void Client::LearnRecipe(uint32 recipeID) if (row[1] == nullptr) { Message_StringID(4, TRADESKILL_LEARN_RECIPE, row[0]); // Actually learn the recipe now - qlen = MakeAnyLenString(&query, "INSERT INTO char_recipe_list " - " SET recipe_id = %u, char_id = %u, madecount = 0 " - " ON DUPLICATE KEY UPDATE madecount = madecount;" - , recipeID, CharacterID()); + StringFormat(query, "INSERT INTO char_recipe_list " + "SET recipe_id = %u, char_id = %u, madecount = 0 " + "ON DUPLICATE KEY UPDATE madecount = madecount;", + recipeID, CharacterID()); - if (!database.RunQuery(query, qlen, errbuf)) { - LogFile->write(EQEMuLog::Error, "Error in LearnRecipe query '%s': %s", query, errbuf); + if (!database.RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error in LearnRecipe query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); } } diff --git a/zone/trading.cpp b/zone/trading.cpp index c0e5bd89f..07ff845d2 100644 --- a/zone/trading.cpp +++ b/zone/trading.cpp @@ -1188,19 +1188,21 @@ static void BazaarAuditTrail(const char *Seller, const char *Buyer, const char * "VALUES (NOW(), '%s', '%s', '%s', %i, %i, %i)"; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; - if(!database.RunQuery(query, MakeAnyLenString(&query, AuditQuery, Seller, Buyer, ItemName, Quantity, TotalCost, TranType), errbuf)) - _log(TRADING__CLIENT, "Audit write error: %s : %s", query, errbuf); + StringFormat(query, AuditQuery, Seller, Buyer, ItemName, Quantity, TotalCost, TranType); + + if(!database.RunQuery(query, errbuf)) + _log(TRADING__CLIENT, "Audit write error: %s : %s", query.c_str(), errbuf); - safe_delete_array(query); } void Client::BuyTraderItem(TraderBuy_Struct* tbs,Client* Trader,const EQApplicationPacket* app){ - if(!Trader) return; + if(!Trader) + return; if(!Trader->IsTrader()) { TradeRequestFailed(app); @@ -1334,14 +1336,12 @@ void Client::BuyTraderItem(TraderBuy_Struct* tbs,Client* Trader,const EQApplicat void Client::SendBazaarWelcome(){ char errbuf[MYSQL_ERRMSG_SIZE]; - - char* query = 0; - MYSQL_RES *result; - MYSQL_ROW row; - if (database.RunQuery(query,MakeAnyLenString(&query, "select count(distinct char_id),count(char_id) from trader"),errbuf,&result)){ + std::string query = "select count(distinct char_id),count(char_id) from trader"; + + if (database.RunQuery(query,errbuf,&result)){ if(mysql_num_rows(result)==1){ row = mysql_fetch_row(result); @@ -1364,9 +1364,10 @@ void Client::SendBazaarWelcome(){ } mysql_free_result(result); } - safe_delete_array(query); + + query = "select count(distinct charid) from buyer"; - if (database.RunQuery(query,MakeAnyLenString(&query, "select count(distinct charid) from buyer"),errbuf,&result)){ + if (database.RunQuery(query,errbuf,&result)){ if(mysql_num_rows(result)==1) { row = mysql_fetch_row(result); @@ -1376,14 +1377,13 @@ void Client::SendBazaarWelcome(){ } mysql_free_result(result); } - safe_delete_array(query); } void Client::SendBazaarResults(uint32 TraderID, uint32 Class_, uint32 Race, uint32 ItemStat, uint32 Slot, uint32 Type, char Name[64], uint32 MinPrice, uint32 MaxPrice) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; std::string Search, Values; MYSQL_RES *Result; MYSQL_ROW Row; @@ -1573,11 +1573,13 @@ void Client::SendBazaarResults(uint32 TraderID, uint32 Class_, uint32 Race, uint Values.append(",sum(charges), items.stackable "); - if (database.RunQuery(Query,MakeAnyLenString(&Query, "select %s from trader,items %s group by items.id,charges,char_id limit %i", - Values.c_str(),Search.c_str(), RuleI(Bazaar, MaxSearchResults)),errbuf,&Result)){ + StringFormat(query, "select %s from trader,items %s group by " + "items.id,charges,char_id limit %i", + Values.c_str(),Search.c_str(), RuleI(Bazaar, MaxSearchResults)); - _log(TRADING__CLIENT, "SRCH: %s", Query); - safe_delete_array(Query); + if (database.RunQuery(query,errbuf,&Result)){ + + _log(TRADING__CLIENT, "SRCH: %s", query.c_str()); int Size = 0; uint32 ID = 0; @@ -1686,8 +1688,7 @@ void Client::SendBazaarResults(uint32 TraderID, uint32 Class_, uint32 Race, uint } else{ - _log(TRADING__CLIENT, "Failed to retrieve Bazaar Search!! %s %s\n", Query, errbuf); - safe_delete_array(Query); + _log(TRADING__CLIENT, "Failed to retrieve Bazaar Search!! %s %s\n", query.c_str(), errbuf); return; } } @@ -2018,17 +2019,19 @@ void Client::SendBuyerResults(char* SearchString, uint32 SearchID) { _log(TRADING__BARTER, "Client::SendBuyerResults %s\n", SearchString); char errbuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; char ItemName[64]; std::string Search, Values; MYSQL_RES *Result; MYSQL_ROW Row; - char*EscSearchString = new char[strlen(SearchString) * 2 + 1]; - database.DoEscapeString(EscSearchString, SearchString, strlen(SearchString)); + std::string escSearchString; + database.DoEscapeString(escSearchString, SearchString, strlen(SearchString)); - if (database.RunQuery(Query,MakeAnyLenString(&Query, "select * from buyer where itemname like '%%%s%%' order by charid limit %i", - EscSearchString, RuleI(Bazaar, MaxBarterSearchResults)), errbuf, &Result)) { + StringFormat(query, "select * from buyer where itemname like '%%%s%%' order by charid limit %i", + escSearchString.c_str(), RuleI(Bazaar, MaxBarterSearchResults)); + + if (database.RunQuery(query,errbuf, &Result)) { int NumberOfRows = mysql_num_rows(Result); @@ -2044,7 +2047,6 @@ void Client::SendBuyerResults(char* SearchString, uint32 SearchID) { if(NumberOfRows == 0) { mysql_free_result(Result); - safe_delete_array(Query); return; } @@ -2104,10 +2106,8 @@ void Client::SendBuyerResults(char* SearchString, uint32 SearchID) { mysql_free_result(Result); } else{ - _log(TRADING__CLIENT, "Failed to retrieve Barter Search!! %s %s\n", Query, errbuf); + _log(TRADING__CLIENT, "Failed to retrieve Barter Search!! %s %s\n", query.c_str(), errbuf); } - safe_delete_array(Query); - safe_delete_array(EscSearchString); } void Client::ShowBuyLines(const EQApplicationPacket *app) { @@ -2151,19 +2151,18 @@ void Client::ShowBuyLines(const EQApplicationPacket *app) { safe_delete(outapp); char errbuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; char ItemName[64]; std::string Search, Values; MYSQL_RES *Result; MYSQL_ROW Row; - if (database.RunQuery(Query,MakeAnyLenString(&Query, "select * from buyer where charid = %i", - Buyer->CharacterID()),errbuf,&Result)){ + StringFormat(query, "select * from buyer where charid = %i", + Buyer->CharacterID()); + + if (database.RunQuery(query,errbuf,&Result)){ if(mysql_num_rows(Result) == 0) { - - safe_delete_array(Query); - mysql_free_result(Result); return; @@ -2203,7 +2202,6 @@ void Client::ShowBuyLines(const EQApplicationPacket *app) { } mysql_free_result(Result); } - safe_delete_array(Query); } void Client::SellToBuyer(const EQApplicationPacket *app) { diff --git a/zone/trap.cpp b/zone/trap.cpp index f8818d9f9..b606d608d 100644 --- a/zone/trap.cpp +++ b/zone/trap.cpp @@ -267,15 +267,20 @@ Mob* EntityList::GetTrapTrigger(Trap* trap) { //todo: rewrite this to not need direct access to trap members. bool ZoneDatabase::LoadTraps(const char* zonename, int16 version) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; // int char_num = 0; unsigned long* lengths; - - if (RunQuery(query, MakeAnyLenString(&query, "SELECT id,x,y,z,effect,effectvalue,effectvalue2,skill,maxzdiff,radius,chance,message,respawn_time,respawn_var,level FROM traps WHERE zone='%s' AND version=%u", zonename, version), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT id, x, y, z, effect, effectvalue, " + "effectvalue2, skill, maxzdiff, radius, " + "chance, message, respawn_time, respawn_var, " + "level FROM traps WHERE zone='%s' " + "AND version=%u", + zonename, version); + + if (RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { lengths = mysql_fetch_lengths(result); @@ -301,8 +306,7 @@ bool ZoneDatabase::LoadTraps(const char* zonename, int16 version) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadTraps query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadTraps query '%s': %s", query.c_str(), errbuf); return false; } diff --git a/zone/tribute.cpp b/zone/tribute.cpp index 2f25fc660..6b20e1824 100644 --- a/zone/tribute.cpp +++ b/zone/tribute.cpp @@ -388,8 +388,9 @@ bool ZoneDatabase::LoadTributes() { tribute_list.clear(); - const char *query = "SELECT id,name,descr,unknown,isguild FROM tributes"; - if (RunQuery(query, strlen(query), errbuf, &result)) { + std::string query = "SELECT id,name,descr,unknown,isguild FROM tributes"; + + if (RunQuery(query, errbuf, &result)) { int r; while ((row = mysql_fetch_row(result))) { r = 0; @@ -403,13 +404,14 @@ bool ZoneDatabase::LoadTributes() { } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadTributes first query '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in LoadTributes first query '%s': %s", query.c_str(), errbuf); return false; } - const char *query2 = "SELECT tribute_id,level,cost,item_id FROM tribute_levels ORDER BY tribute_id,level"; - if (RunQuery(query2, strlen(query2), errbuf, &result)) { + std::string query2 = "SELECT tribute_id,level,cost,item_id FROM tribute_levels ORDER BY tribute_id,level"; + + if (RunQuery(query2, errbuf, &result)) { int r; while ((row = mysql_fetch_row(result))) { r = 0; @@ -436,7 +438,7 @@ bool ZoneDatabase::LoadTributes() { } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadTributes level query '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in LoadTributes level query '%s': %s", query.c_str(), errbuf); return false; } diff --git a/zone/waypoints.cpp b/zone/waypoints.cpp index 3046a8ad0..b995288bb 100644 --- a/zone/waypoints.cpp +++ b/zone/waypoints.cpp @@ -839,7 +839,7 @@ void NPC::AssignWaypoints(int32 grid) { } char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -847,7 +847,11 @@ void NPC::AssignWaypoints(int32 grid) { Waypoints.clear(); // Retrieve the wander and pause types for this grid - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT `type`,`type2` FROM `grid` WHERE `id`=%i AND `zoneid`=%i",grid,zone->GetZoneID()),errbuf, &result)) + StringFormat(query, "SELECT `type`,`type2` FROM `grid` " + "WHERE `id`=%i AND `zoneid`=%i", + grid, zone->GetZoneID()); + + if(database.RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result))) { @@ -869,7 +873,6 @@ void NPC::AssignWaypoints(int32 grid) { GridErr = true; LogFile->write(EQEMuLog::Error, "MySQL Error while trying to assign grid %u to mob %s: %s", grid, name, errbuf); } - safe_delete_array(query); if(!GridErr) { @@ -877,7 +880,12 @@ void NPC::AssignWaypoints(int32 grid) { adverrorinfo = 7561; // Retrieve all waypoints for this grid - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT `x`,`y`,`z`,`pause`,`heading` FROM grid_entries WHERE `gridid`=%i AND `zoneid`=%i ORDER BY `number`",grid,zone->GetZoneID()),errbuf,&result)) + StringFormat(query, "SELECT `x`,`y`,`z`,`pause`,`heading` FROM " + "grid_entries WHERE `gridid`=%i AND " + "`zoneid`=%i ORDER BY `number`", + grid,zone->GetZoneID()); + + if(database.RunQuery(query,errbuf,&result)) { roamer = true; max_wp = -1; // Initialize it; will increment it for each waypoint successfully added to the list @@ -919,7 +927,6 @@ void NPC::AssignWaypoints(int32 grid) { WPErr = true; LogFile->write(EQEMuLog::Error, "MySQL Error while trying to assign waypoints from grid %u to mob %s: %s", grid, name, errbuf); } - safe_delete_array(query); } // end if (!GridErr) if(Waypoints.size() < 2) { roamer = false; @@ -989,44 +996,46 @@ void Mob::SendToFixZ(float new_x, float new_y, float new_z) { } int ZoneDatabase::GetHighestGrid(uint32 zoneid) { - char *query = 0; + std::string query; char errbuff[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; int res = 0; - if (RunQuery(query, MakeAnyLenString(&query, - "SELECT COALESCE(MAX(id), 0) FROM grid WHERE zoneid = %i", - zoneid),errbuff,&result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT COALESCE(MAX(id), 0) FROM grid WHERE zoneid = %i", + zoneid); + + if (RunQuery(query, errbuff,&result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); res = atoi( row[0] ); } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetHighestGrid query '%s': %s", query, errbuff); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetHighestGrid query '%s': %s", query.c_str(), errbuff); } return(res); } uint8 ZoneDatabase::GetGridType2(uint32 grid, uint16 zoneid) { - char *query = 0; + std::string query; char errbuff[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; int type2 = 0; - if (RunQuery(query, MakeAnyLenString(&query,"SELECT type2 from grid where id = %i and zoneid = %i",grid,zoneid),errbuff,&result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT type2 from grid where id = %i and zoneid = %i", + grid,zoneid); + + if (RunQuery(query, errbuff,&result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); type2 = atoi( row[0] ); } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetGridType2 query '%s': %s", query, errbuff); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetGridType2 query '%s': %s", query.c_str(), errbuff); } return(type2); @@ -1034,12 +1043,16 @@ uint8 ZoneDatabase::GetGridType2(uint32 grid, uint16 zoneid) { bool ZoneDatabase::GetWaypoints(uint32 grid, uint16 zoneid, uint32 num, wplist* wp) { _CP(Database_GetWaypoints); - char *query = 0; + std::string query; char errbuff[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query,"SELECT x, y, z, pause, heading from grid_entries where gridid = %i and number = %i and zoneid = %i",grid,num,zoneid),errbuff,&result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT x, y, z, pause, heading from grid_entries where " + "gridid = %i and number = %i and zoneid = %i", + grid,num,zoneid); + + if (RunQuery(query, errbuff,&result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); if ( wp ) { @@ -1055,15 +1068,14 @@ bool ZoneDatabase::GetWaypoints(uint32 grid, uint16 zoneid, uint32 num, wplist* mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetWaypoints query '%s': %s", query, errbuff); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetWaypoints query '%s': %s", query.c_str(), errbuff); } return false; } void ZoneDatabase::AssignGrid(Client *client, float x, float y, uint32 grid) { - char *query = 0; + std::string query; char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; @@ -1073,42 +1085,31 @@ void ZoneDatabase::AssignGrid(Client *client, float x, float y, uint32 grid) // looks like most of the stuff in spawn2 is straight integers // so let's try that first - if(!RunQuery( - query, - MakeAnyLenString( - &query, - "SELECT id,x,y FROM spawn2 WHERE zone='%s' AND x=%i AND y=%i", - zone->GetShortName(), (int)x, (int)y - ), - errbuf, - &result - )) { - LogFile->write(EQEMuLog::Error, "Error querying spawn2 '%s': '%s'", query, errbuf); - return; + + StringFormat(query, "SELECT id,x,y FROM spawn2 WHERE zone='%s' AND x=%i AND y=%i", + zone->GetShortName(), (int)x, (int)y); + + if(!RunQuery(query,errbuf,&result)) { + LogFile->write(EQEMuLog::Error, "Error querying spawn2 '%s': '%s'", query.c_str(), errbuf); + return; } - safe_delete_array(query); // how much it's allowed to be off by #define _GASSIGN_TOLERANCE 1.0 if(!(matches = mysql_num_rows(result))) // try a fuzzy match if that didn't find it { mysql_free_result(result); - if(!RunQuery( - query, - MakeAnyLenString( - &query, - "SELECT id,x,y FROM spawn2 WHERE zone='%s' AND " - "ABS( ABS(x) - ABS(%f) ) < %f AND " - "ABS( ABS(y) - ABS(%f) ) < %f", - zone->GetShortName(), x, _GASSIGN_TOLERANCE, y, _GASSIGN_TOLERANCE - ), - errbuf, - &result - )) { - LogFile->write(EQEMuLog::Error, "Error querying fuzzy spawn2 '%s': '%s'", query, errbuf); + + StringFormat(query, "SELECT id,x,y FROM spawn2 WHERE zone='%s' AND " + "ABS( ABS(x) - ABS(%f) ) < %f AND " + "ABS( ABS(y) - ABS(%f) ) < %f", + zone->GetShortName(), x, _GASSIGN_TOLERANCE, + y, _GASSIGN_TOLERANCE); + + if(!RunQuery(query,errbuf,&result)) { + LogFile->write(EQEMuLog::Error, "Error querying fuzzy spawn2 '%s': '%s'", query.c_str(), errbuf); return; } - safe_delete_array(query); fuzzy = 1; if(!(matches = mysql_num_rows(result))) mysql_free_result(result); @@ -1126,30 +1127,22 @@ void ZoneDatabase::AssignGrid(Client *client, float x, float y, uint32 grid) spawn2id = atoi(row[0]); dbx = atof(row[1]); dby = atof(row[2]); - if(!RunQuery( - query, - MakeAnyLenString( - &query, - "UPDATE spawn2 SET pathgrid = %d WHERE id = %d", grid, spawn2id - ), - errbuf, - &result, - &affected_rows - )) { - LogFile->write(EQEMuLog::Error, "Error updating spawn2 '%s': '%s'", query, errbuf); + + StringFormat(query, "UPDATE spawn2 SET pathgrid = %d WHERE id = %d", grid, spawn2id); + + if(!RunQuery(query,errbuf,&result, &affected_rows)) { + LogFile->write(EQEMuLog::Error, "Error updating spawn2 '%s': '%s'", query.c_str(), errbuf); return; } if(affected_rows == 1) { - if(client) client->LogSQL(query); + if(client) client->LogSQL(query.c_str()); if(fuzzy) { float difference; difference = sqrtf(pow(fabs(x-dbx),2) + pow(fabs(y-dby),2)); - client->Message(0, - "Grid assign: spawn2 id = %d updated - fuzzy match: deviation %f", - spawn2id, difference - ); + client->Message(0,"Grid assign: spawn2 id = %d updated - fuzzy match: deviation %f", + spawn2id, difference); } else { @@ -1177,32 +1170,43 @@ void ZoneDatabase::AssignGrid(Client *client, float x, float y, uint32 grid) */ void ZoneDatabase::ModifyGrid(Client *c, bool remove, uint32 id, uint8 type, uint8 type2, uint16 zoneid) { - char *query = 0; + std::string query; char errbuf[MYSQL_ERRMSG_SIZE]; if (!remove) { - if(!RunQuery(query, MakeAnyLenString(&query,"INSERT INTO grid(id,zoneid,type,type2) VALUES(%i,%i,%i,%i)",id,zoneid,type,type2), errbuf)) { - LogFile->write(EQEMuLog::Error, "Error creating grid entry '%s': '%s'", query, errbuf); - } else { - if(c) c->LogSQL(query); + + StringFormat(query, "INSERT INTO grid(id,zoneid,type,type2) " + "VALUES(%i,%i,%i,%i)", + id,zoneid,type,type2); + + if(!RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error creating grid entry '%s': '%s'", query.c_str(), errbuf); + } + else { + if(c) + c->LogSQL(query.c_str()); } - safe_delete_array(query); } else { - if(!RunQuery(query, MakeAnyLenString(&query,"DELETE FROM grid where id=%i",id), errbuf)) { - LogFile->write(EQEMuLog::Error, "Error deleting grid '%s': '%s'", query, errbuf); + + StringFormat(query, "DELETE FROM grid where id=%i",id); + + if(!RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error deleting grid '%s': '%s'", query.c_str(), errbuf); } else { - if(c) c->LogSQL(query); + if(c) + c->LogSQL(query.c_str()); } - safe_delete_array(query); - query = 0; - if(!RunQuery(query, MakeAnyLenString(&query,"DELETE FROM grid_entries WHERE zoneid=%i AND gridid=%i",zoneid,id), errbuf)) { - LogFile->write(EQEMuLog::Error, "Error deleting grid entries '%s': '%s'", query, errbuf); + + StringFormat(query, "DELETE FROM grid_entries WHERE zoneid=%i AND gridid=%i", zoneid, id); + + if(!RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error deleting grid entries '%s': '%s'", query.c_str(), errbuf); } else { - if(c) c->LogSQL(query); + if(c) + c->LogSQL(query.c_str()); } - safe_delete_array(query); } } /*** END ZoneDatabase::ModifyGrid() ***/ @@ -1212,15 +1216,19 @@ void ZoneDatabase::ModifyGrid(Client *c, bool remove, uint32 id, uint8 type, uin void ZoneDatabase::AddWP(Client *c, uint32 gridid, uint32 wpnum, float xpos, float ypos, float zpos, uint32 pause, uint16 zoneid, float heading) { - char *query = 0; + std::string query; char errbuf[MYSQL_ERRMSG_SIZE]; - if(!RunQuery(query,MakeAnyLenString(&query,"INSERT INTO grid_entries (gridid,zoneid,`number`,x,y,z,pause,heading) values (%i,%i,%i,%f,%f,%f,%i,%f)",gridid,zoneid,wpnum,xpos,ypos,zpos,pause,heading), errbuf)) { - LogFile->write(EQEMuLog::Error, "Error adding waypoint '%s': '%s'", query, errbuf); + StringFormat(query, "INSERT INTO grid_entries (gridid,zoneid,`number`,x,y,z,pause,heading) " + "values (%i, %i, %i, %f, %f, %f, %i, %f)", + gridid, zoneid, wpnum, xpos, ypos, zpos, pause, heading); + + if(!RunQuery(query,errbuf)) { + LogFile->write(EQEMuLog::Error, "Error adding waypoint '%s': '%s'", query.c_str(), errbuf); } else { - if(c) c->LogSQL(query); + if(c) + c->LogSQL(query.c_str()); } - safe_delete_array(query); } /*** END ZoneDatabase::AddWP() ***/ @@ -1237,15 +1245,21 @@ void ZoneDatabase::AddWP(Client *c, uint32 gridid, uint32 wpnum, float xpos, flo void ZoneDatabase::DeleteWaypoint(Client *c, uint32 grid_num, uint32 wp_num, uint16 zoneid) { - char *query=0; + std::string query; char errbuf[MYSQL_ERRMSG_SIZE]; - if(!RunQuery(query, MakeAnyLenString(&query,"DELETE FROM grid_entries where gridid=%i and zoneid=%i and `number`=%i",grid_num,zoneid,wp_num), errbuf)) { - LogFile->write(EQEMuLog::Error, "Error deleting waypoint '%s': '%s'", query, errbuf); - } else { - if(c) c->LogSQL(query); + StringFormat(query, "DELETE FROM grid_entries where " + "gridid=%i and zoneid=%i and `number`=%i", + grid_num,zoneid,wp_num); + + if(!RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error deleting waypoint '%s': '%s'", query.c_str(), errbuf); + } + else { + if(c) + c->LogSQL(query.c_str()); } - safe_delete_array(query); + } /*** END ZoneDatabase::DeleteWaypoint() ***/ @@ -1258,30 +1272,31 @@ void ZoneDatabase::DeleteWaypoint(Client *c, uint32 grid_num, uint32 wp_num, uin */ uint32 ZoneDatabase::AddWPForSpawn(Client *c, uint32 spawn2id, float xpos, float ypos, float zpos, uint32 pause, int type1, int type2, uint16 zoneid, float heading) { - char *query = 0; - uint32 grid_num, // The grid number the spawn is assigned to (if spawn has no grid, will be the grid number we end up creating) - next_wp_num; // The waypoint number we should be assigning to the new waypoint + std::string query; + uint32 grid_num, // The grid number the spawn is assigned to (if spawn has no grid, will be the grid number we end up creating) + next_wp_num; // The waypoint number we should be assigning to the new waypoint bool CreatedNewGrid; // Did we create a new grid in this function? MYSQL_RES *result; MYSQL_ROW row; char errbuf[MYSQL_ERRMSG_SIZE]; // See what grid number our spawn is assigned - if(RunQuery(query, MakeAnyLenString(&query,"SELECT pathgrid FROM spawn2 WHERE id=%i",spawn2id),errbuf,&result)) + StringFormat(query, "SELECT pathgrid FROM spawn2 WHERE id=%i",spawn2id); + + if(RunQuery(query, errbuf,&result)) { - safe_delete_array(query); if(mysql_num_rows(result) > 0) { row = mysql_fetch_row(result); grid_num = atoi(row[0]); } else // This spawn ID was not found in the `spawn2` table - return 0; + return 0; mysql_free_result(result); } else { // Query error - LogFile->write(EQEMuLog::Error, "Error setting pathgrid '%s': '%s'", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error setting pathgrid '%s': '%s'", query.c_str(), errbuf); return 0; } @@ -1289,52 +1304,63 @@ uint32 ZoneDatabase::AddWPForSpawn(Client *c, uint32 spawn2id, float xpos, float { CreatedNewGrid = true; if((grid_num = GetFreeGrid(zoneid)) == 0) // There are no grids for the current zone -- create Grid #1 - grid_num = 1; - - if(!RunQuery(query, MakeAnyLenString(&query,"insert into grid set id='%i',zoneid= %i, type='%i', type2='%i'",grid_num,zoneid,type1,type2), errbuf)) { - LogFile->write(EQEMuLog::Error, "Error adding grid '%s': '%s'", query, errbuf); + grid_num = 1; + + StringFormat(query,"insert into grid set id='%i',zoneid= %i, type='%i', type2='%i'", + grid_num,zoneid,type1,type2); + + if(!RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error adding grid '%s': '%s'", query.c_str(), errbuf); } else { - if(c) c->LogSQL(query); + if(c) + c->LogSQL(query.c_str()); } - safe_delete_array(query); - query = 0; - if(!RunQuery(query, MakeAnyLenString(&query,"update spawn2 set pathgrid='%i' where id='%i'",grid_num,spawn2id), errbuf)) { - LogFile->write(EQEMuLog::Error, "Error updating spawn2 pathing '%s': '%s'", query, errbuf); + StringFormat(query, "update spawn2 set pathgrid='%i' where id='%i'", + grid_num, spawn2id); + + if(!RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error updating spawn2 pathing '%s': '%s'", query.c_str(), errbuf); } else { - if(c) c->LogSQL(query); + if(c) + c->LogSQL(query.c_str()); } - safe_delete_array(query); } else // NPC had a grid assigned to it CreatedNewGrid = false; // Find out what the next waypoint is for this grid - query = 0; - if(RunQuery(query, MakeAnyLenString(&query,"SELECT max(`number`) FROM grid_entries WHERE zoneid='%i' AND gridid='%i'",zoneid,grid_num),errbuf,&result)) + StringFormat(query,"SELECT max(`number`) FROM " + "grid_entries WHERE zoneid='%i' " + "AND gridid='%i'", + zoneid, grid_num); + + if(RunQuery(query,errbuf,&result)) { - safe_delete_array(query); row = mysql_fetch_row(result); if(row[0] != 0) - next_wp_num = atoi(row[0]) + 1; + next_wp_num = atoi(row[0]) + 1; else // No waypoints in this grid yet - next_wp_num = 1; + next_wp_num = 1; mysql_free_result(result); } else { // Query error - LogFile->write(EQEMuLog::Error, "Error getting next waypoint id '%s': '%s'", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error getting next waypoint id '%s': '%s'", query.c_str(), errbuf); return 0; } - query = 0; - if(!RunQuery(query, MakeAnyLenString(&query,"INSERT INTO grid_entries(gridid,zoneid,`number`,x,y,z,pause,heading) VALUES (%i,%i,%i,%f,%f,%f,%i,%f)",grid_num,zoneid,next_wp_num,xpos,ypos,zpos,pause,heading), errbuf)) { - LogFile->write(EQEMuLog::Error, "Error adding grid entry '%s': '%s'", query, errbuf); + StringFormat(query, "INSERT INTO grid_entries(gridid,zoneid,`number`,x,y,z,pause,heading) " + "VALUES (%i,%i,%i,%f,%f,%f,%i,%f)", + grid_num, zoneid, next_wp_num, xpos, ypos, zpos, pause, heading); + + if(!RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error adding grid entry '%s': '%s'", query.c_str(), errbuf); } else { - if(c) c->LogSQL(query); + if(c) + c->LogSQL(query.c_str()); } - safe_delete_array(query); if(CreatedNewGrid) return grid_num; @@ -1344,12 +1370,14 @@ uint32 ZoneDatabase::AddWPForSpawn(Client *c, uint32 spawn2id, float xpos, float uint32 ZoneDatabase::GetFreeGrid(uint16 zoneid) { - char *query = 0; + std::string query; char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query,"SELECT max(id) from grid where zoneid = %i",zoneid),errbuf,&result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT max(id) from grid where zoneid = %i",zoneid); + + if (RunQuery(query, errbuf,&result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); uint32 tmp=0; @@ -1362,30 +1390,30 @@ uint32 ZoneDatabase::GetFreeGrid(uint16 zoneid) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetFreeGrid query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetFreeGrid query '%s': %s", query.c_str(), errbuf); } return 0; } int ZoneDatabase::GetHighestWaypoint(uint32 zoneid, uint32 gridid) { - char *query = 0; + std::string query; char errbuff[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; int res = 0; - if (RunQuery(query, MakeAnyLenString(&query, - "SELECT COALESCE(MAX(number), 0) FROM grid_entries WHERE zoneid = %i AND gridid = %i", - zoneid, gridid),errbuff,&result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT COALESCE(MAX(number), 0) FROM " + "grid_entries WHERE zoneid = %i AND gridid = %i", + zoneid, gridid); + + if (RunQuery(query,errbuff,&result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); res = atoi( row[0] ); } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in GetHighestWaypoint query '%s': %s", query, errbuff); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetHighestWaypoint query '%s': %s", query.c_str(), errbuff); } return(res); diff --git a/zone/zone.cpp b/zone/zone.cpp index 8733814ec..f6adaf27f 100644 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -178,17 +178,17 @@ bool Zone::Bootup(uint32 iZoneID, uint32 iInstanceID, bool iStaticZone) { //this really loads the objects into entity_list bool Zone::LoadZoneObjects() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = nullptr; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - uint32 len_query = MakeAnyLenString(&query, "SELECT " - "id,zoneid,xpos,ypos,zpos,heading,itemid,charges,objectname,type,icon," - "unknown08,unknown10,unknown20,unknown24,unknown76" - " from object where zoneid=%i and (version=%u or version=-1)", zoneid, instanceversion); + StringFormat(query, "SELECT id, zoneid, xpos, ypos, zpos, " + "heading, itemid, charges, objectname, type, icon, " + "unknown08, unknown10, unknown20, unknown24, unknown76 " + "from object where zoneid=%i and (version=%u or version=-1)", + zoneid, instanceversion); - if (database.RunQuery(query, len_query, errbuf, &result)) { - safe_delete_array(query); + if (database.RunQuery(query, errbuf, &result)) { LogFile->write(EQEMuLog::Status, "Loading Objects from DB..."); while ((row = mysql_fetch_row(result))) { if (atoi(row[9]) == 0) @@ -306,11 +306,10 @@ bool Zone::LoadZoneObjects() { mysql_free_result(result); } else { - safe_delete_array(query); LogFile->write(EQEMuLog::Error, "Error Loading Objects from DB: %s",errbuf); - return(false); + return false; } - return(true); + return true; } //this also just loads into entity_list, not really into zone @@ -436,57 +435,30 @@ uint32 Zone::GetTempMerchantQuantity(uint32 NPCID, uint32 Slot) { void Zone::LoadTempMerchantData(){ LogFile->write(EQEMuLog::Status, "Loading Temporary Merchant Lists..."); - char* query = 0; + std::string query; uint32_breakdown workpt; workpt.b4() = DBA_b4_Zone; workpt.w2_3() = 0; workpt.b1() = DBA_b1_Zone_MerchantListsTemp; DBAsyncWork* dbaw = new DBAsyncWork(&database, &MTdbafq, workpt, DBAsync::Read); - dbaw->AddQuery(1, &query, MakeAnyLenString(&query, - "select ml.npcid,ml.slot,ml.itemid,ml.charges " - "from " - " merchantlist_temp ml, " - " spawnentry se, " - " spawn2 s2 " - "where " - " ml.npcid=se.npcid " - " and se.spawngroupid=s2.spawngroupid " - " and s2.zone='%s' and s2.version=%u", GetShortName(), GetInstanceVersion())); + + StringFormat(query, "select ml.npcid,ml.slot,ml.itemid,ml.charges " + "from " + " merchantlist_temp ml, " + " spawnentry se, " + " spawn2 s2 " + "where " + " ml.npcid=se.npcid " + " and se.spawngroupid=s2.spawngroupid " + " and s2.zone='%s' and s2.version=%u", + GetShortName(), GetInstanceVersion()); + + dbaw->AddQuery(1, query); if (!(pQueuedMerchantsWorkID = dbasync->AddWork(&dbaw))) { safe_delete(dbaw); LogFile->write(EQEMuLog::Error, "dbasync->AddWork() failed adding merchant list query"); return; } -/* char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - MYSQL_RES *result; - MYSQL_ROW row; - std::list merlist; - if (database.RunQuery(query, MakeAnyLenString(&query, "select ml.npcid,ml.slot,ml.itemid,ml.charges from merchantlist_temp ml, npc_types nt, spawnentry se, spawn2 s2 where nt.id=ml.npcid and nt.id=se.npcid and se.spawngroupid=s2.spawngroupid and s2.zone='%s' group by ml.npcid,slot order by npcid,slot asc", GetShortName()), errbuf, &result)) { - uint32 npcid = 0; - while((row = mysql_fetch_row(result))) { - if(npcid != atoul(row[0])){ - if(npcid > 0) - tmpmerchanttable[npcid] = merlist; - npcid = atoul(row[0]); - merlist.clear(); - } - TempMerchantList ml; - ml.npcid = npcid; - ml.slot = atoul(row[1]); - ml.item = atoul(row[2]); - ml.charges = atoul(row[3]); - ml.origslot = ml.slot; - merlist.push_back(ml); - } - if(npcid > 0) - tmpmerchanttable[npcid] = merlist; - mysql_free_result(result); - } - else - cerr << "Error in LoadTempMerchantData query '" << query << "' " << errbuf << endl; - safe_delete_array(query); -*/ } void Zone::LoadTempMerchantData_result(MYSQL_RES* result) { @@ -511,18 +483,22 @@ void Zone::LoadTempMerchantData_result(MYSQL_RES* result) { ml.origslot = ml.slot; cur->second.push_back(ml); } - //mysql_free_result(result); - //LogFile->write(EQEMuLog::Status, "Finished Loading Temporary Merchant Lists..."); } //there should prolly be a temp counterpart of this... void Zone::LoadNewMerchantData(uint32 merchantid){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; std::list merlist; - if (database.RunQuery(query, MakeAnyLenString(&query, "SELECT item, slot, faction_required, level_required, alt_currency_cost FROM merchantlist WHERE merchantid=%d", merchantid), errbuf, &result)) { + + StringFormat(query,"SELECT item, slot, faction_required, " + "level_required, alt_currency_cost " + "FROM merchantlist WHERE merchantid=%d", + merchantid); + + if (database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { MerchantList ml; ml.id = merchantid; @@ -537,8 +513,7 @@ void Zone::LoadNewMerchantData(uint32 merchantid){ mysql_free_result(result); } else - LogFile->write(EQEMuLog::Error, "Error in LoadNewMerchantData query '%s' %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadNewMerchantData query '%s' %s", query.c_str(), errbuf); } void Zone::LoadMerchantData_result(MYSQL_RES* result) { @@ -583,65 +558,45 @@ void Zone::LoadMerchantData_result(MYSQL_RES* result) { void Zone::GetMerchantDataForZoneLoad(){ LogFile->write(EQEMuLog::Status, "Loading Merchant Lists..."); - char* query = 0; + std::string query; uint32_breakdown workpt; workpt.b4() = DBA_b4_Zone; workpt.w2_3() = 0; workpt.b1() = DBA_b1_Zone_MerchantLists; DBAsyncWork* dbaw = new DBAsyncWork(&database, &MTdbafq, workpt, DBAsync::Read); - dbaw->AddQuery(1, &query, MakeAnyLenString(&query, - "select ml.merchantid,ml.slot,ml.item,ml.faction_required,ml.level_required,ml.alt_currency_cost " - "from merchantlist ml, npc_types nt, spawnentry se, spawn2 s2 " - "where nt.merchant_id=ml.merchantid and nt.id=se.npcid " - "and se.spawngroupid=s2.spawngroupid and s2.zone='%s' and s2.version=%u " - //"group by ml.merchantid,slot order by merchantid,slot asc" //this made the query use a temp table/filesort (very slow)... so we handle unsorted data on our end. - , GetShortName(), GetInstanceVersion())); + + StringFormat(query,"select ml.merchantid,ml.slot,ml.item,ml.faction_required,ml.level_required, " + "ml.alt_currency_cost " + "from merchantlist ml, npc_types nt, spawnentry se, spawn2 s2 " + "where nt.merchant_id=ml.merchantid and nt.id=se.npcid " + "and se.spawngroupid=s2.spawngroupid and s2.zone='%s' and s2.version=%u ", + // + //"group by ml.merchantid,slot order by merchantid,slot asc" + // + //this made the query use a temp table/filesort (very slow)... + //so we handle unsorted data on our end. + GetShortName(), GetInstanceVersion()); + + dbaw->AddQuery(1, query); if (!(pQueuedMerchantsWorkID = dbasync->AddWork(&dbaw))) { safe_delete(dbaw); LogFile->write(EQEMuLog::Error,"dbasync->AddWork() failed adding merchant list query"); return; } -/* char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - MYSQL_RES *result; - MYSQL_ROW row; - std::list merlist; - if (database.RunQuery(query, MakeAnyLenString(&query, "select ml.merchantid,ml.slot,ml.item from merchantlist ml, npc_types nt, spawnentry se, spawn2 s2 where nt.merchant_id=ml.merchantid and nt.id=se.npcid and se.spawngroupid=s2.spawngroupid and s2.zone='%s' group by ml.merchantid,slot order by merchantid,slot asc", GetShortName()), errbuf, &result)) { - uint32 npcid = 0; - while((row = mysql_fetch_row(result))) { - if(npcid != atoul(row[0])){ - if(npcid > 0) - merchanttable[npcid] = merlist; - npcid = atoul(row[0]); - merlist.clear(); - } - MerchantList ml; - ml.id = npcid; - ml.slot = atoul(row[1]); - ml.item = atoul(row[2]); - merlist.push_back(ml); - } - if(npcid > 0) - merchanttable[npcid] = merlist; - mysql_free_result(result); - } - else - cerr << "Error in GetMerchantDataForZoneLoad query '" << query << "' " << errbuf << endl; - safe_delete_array(query); -*/ } void Zone::LoadMercTemplates(){ - std::string errorMessage; - char* Query = 0; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; std::list merc_stances; merc_templates.clear(); - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT `class_id`, `proficiency_id`, `stance_id`, `isdefault` FROM `merc_stance_entries` order by `class_id`, `proficiency_id`, `stance_id`"), TempErrorMessageBuffer, &DatasetResult)) { + std::string query = "SELECT `class_id`, `proficiency_id`, `stance_id`, `isdefault` " + "FROM `merc_stance_entries` order by `class_id`, `proficiency_id`, `stance_id`"; + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -659,7 +614,14 @@ void Zone::LoadMercTemplates(){ mysql_free_result(DatasetResult); } - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT DISTINCT MTem.merc_template_id, MTyp.dbstring AS merc_type_id, MTem.dbstring AS merc_subtype_id, MTyp.race_id, MS.class_id, MTyp.proficiency_id, MS.tier_id, 0 AS CostFormula, MTem.clientversion, MTem.merc_npc_type_id FROM merc_types MTyp, merc_templates MTem, merc_subtypes MS WHERE MTem.merc_type_id = MTyp.merc_type_id AND MTem.merc_subtype_id = MS.merc_subtype_id ORDER BY MTyp.race_id, MS.class_id, MTyp.proficiency_id;"), TempErrorMessageBuffer, &DatasetResult)) { + query = "SELECT DISTINCT MTem.merc_template_id, MTyp.dbstring AS merc_type_id, MTem.dbstring AS " + "merc_subtype_id, MTyp.race_id, MS.class_id, MTyp.proficiency_id, MS.tier_id, 0 AS " + "CostFormula, MTem.clientversion, MTem.merc_npc_type_id FROM merc_types MTyp, " + "merc_templates MTem, merc_subtypes MS WHERE " + "MTem.merc_type_id = MTyp.merc_type_id AND MTem.merc_subtype_id = MS.merc_subtype_id " + "ORDER BY MTyp.race_id, MS.class_id, MTyp.proficiency_id;"; + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -696,9 +658,6 @@ void Zone::LoadMercTemplates(){ mysql_free_result(DatasetResult); } - safe_delete_array(Query); - Query = 0; - if(!errorMessage.empty()) { LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::LoadMercTemplates()"); } @@ -707,13 +666,14 @@ void Zone::LoadMercTemplates(){ void Zone::LoadLevelEXPMods(){ std::string errorMessage; - char* Query = 0; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; level_exp_mod.clear(); - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT level, exp_mod, aa_exp_mod FROM level_exp_mods"), TempErrorMessageBuffer, &DatasetResult)) { + std::string query = "SELECT level, exp_mod, aa_exp_mod FROM level_exp_mods"; + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -727,9 +687,6 @@ void Zone::LoadLevelEXPMods(){ mysql_free_result(DatasetResult); } - safe_delete(Query); - Query = 0; - if(!errorMessage.empty()) { LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::LoadEXPLevelMods()"); } @@ -737,13 +694,14 @@ void Zone::LoadLevelEXPMods(){ void Zone::LoadMercSpells(){ std::string errorMessage; - char* Query = 0; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; merc_spells_list.clear(); - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT msl.class_id, msl.proficiency_id, msle.spell_id, msle.spell_type, msle.stance_id, msle.minlevel, msle.maxlevel, msle.slot, msle.procChance FROM merc_spell_lists msl, merc_spell_list_entries msle WHERE msle.merc_spell_list_id = msl.merc_spell_list_id ORDER BY msl.class_id, msl.proficiency_id, msle.spell_type, msle.minlevel, msle.slot;"), TempErrorMessageBuffer, &DatasetResult)) { + std::string query = "SELECT msl.class_id, msl.proficiency_id, msle.spell_id, msle.spell_type, msle.stance_id, msle.minlevel, msle.maxlevel, msle.slot, msle.procChance FROM merc_spell_lists msl, merc_spell_list_entries msle WHERE msle.merc_spell_list_id = msl.merc_spell_list_id ORDER BY msl.class_id, msl.proficiency_id, msle.spell_type, msle.minlevel, msle.slot;"; + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -770,9 +728,6 @@ void Zone::LoadMercSpells(){ LogFile->write(EQEMuLog::Debug, "Mercenary Debug: Loaded %i merc spells.", merc_spells_list[1].size() + merc_spells_list[2].size() + merc_spells_list[9].size() + merc_spells_list[12].size()); } - safe_delete_array(Query); - Query = 0; - if(!errorMessage.empty()) { LogFile->write(EQEMuLog::Error, "Error in Zone::LoadMercSpells()"); } @@ -1684,18 +1639,20 @@ ZonePoint* Zone::GetClosestZonePointWithoutZone(float x, float y, float z, Clien bool ZoneDatabase::LoadStaticZonePoints(LinkedList* zone_point_list, const char* zonename, uint32 version) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; zone_point_list->Clear(); zone->numzonepoints = 0; - MakeAnyLenString(&query, "SELECT x, y, z, target_x, target_y, " - "target_z, target_zone_id, heading, target_heading, number, " - "target_instance, client_version_mask FROM zone_points " - "WHERE zone='%s' AND (version=%i OR version=-1) order by number", zonename, version); - if (RunQuery(query, strlen(query), errbuf, &result)) + + StringFormat(query, "SELECT x, y, z, target_x, target_y, " + "target_z, target_zone_id, heading, target_heading, number, " + "target_instance, client_version_mask FROM zone_points " + "WHERE zone='%s' AND (version=%i OR version=-1) order by number", + zonename, version); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while((row = mysql_fetch_row(result))) { ZonePoint* zp = new ZonePoint; @@ -1719,24 +1676,21 @@ bool ZoneDatabase::LoadStaticZonePoints(LinkedList* zone_point_list, else { std::cerr << "Error1 in LoadStaticZonePoints query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } -return true; + return true; } bool ZoneDatabase::DumpZoneState() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM zone_state_dump WHERE zonename='%s'", zone->GetShortName()), errbuf)) { + StringFormat(query, "DELETE FROM zone_state_dump WHERE zonename='%s'", zone->GetShortName()); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in DumpZoneState query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); - - uint32 spawn2_count = zone->CountSpawn2(); uint32 npc_count = 0; @@ -1774,47 +1728,61 @@ bool ZoneDatabase::DumpZoneState() { } entity_list.DoZoneDump(spawn2_dump, npc_dump, npcloot_dump, gmspawntype_dump); - query = new char[512 + ((sizeof(ZSDump_Spawn2) * spawn2_count + sizeof(ZSDump_NPC) * npc_count + sizeof(ZSDump_NPC_Loot) * npcloot_count + sizeof(NPCType) * gmspawntype_count) * 2)]; - char* end = query; - - end += sprintf(end, "Insert Into zone_state_dump (zonename, spawn2_count, npc_count, npcloot_count, gmspawntype_count, spawn2, npcs, npc_loot, gmspawntype) values ('%s', %i, %i, %i, %i, ", zone->GetShortName(), spawn2_count, npc_count, npcloot_count, gmspawntype_count); - *end++ = '\''; + + // Should be more than enough. need to come back and + // clean this up further. + std::string spawn2Buffer; + std::string zsDumpNPCBuffer; + std::string zsDumpNPCLootBuffer; + std::string gmspawnTypeBuffer; + + + StringFormat(query, "Insert Into zone_state_dump " + "(zonename, spawn2_count, npc_count, npcloot_count, " + "gmspawntype_count, spawn2, npcs, npc_loot, gmspawntype) " + "values ('%s', %i, %i, %i, %i, \'", + zone->GetShortName(), spawn2_count, npc_count, npcloot_count, gmspawntype_count); + + if (spawn2_dump != 0) { - end += DoEscapeString(end, (char*)spawn2_dump, sizeof(ZSDump_Spawn2) * spawn2_count); + + DoEscapeString(spawn2Buffer, (char*)spawn2_dump, sizeof(ZSDump_Spawn2) * spawn2_count); + query.append(spawn2Buffer); safe_delete_array(spawn2_dump); + } - *end++ = '\''; - end += sprintf(end, ", "); - *end++ = '\''; + + query.append("\', \'"); + if (npc_dump != 0) { - end += DoEscapeString(end, (char*)npc_dump, sizeof(ZSDump_NPC) * npc_count); + + DoEscapeString(zsDumpNPCBuffer, (char*)npc_dump, sizeof(ZSDump_NPC) * npc_count); + query.append(zsDumpNPCBuffer); safe_delete_array(npc_dump); } - *end++ = '\''; - end += sprintf(end, ", "); - *end++ = '\''; + query.append("\', \'"); + if (npcloot_dump != 0) { - end += DoEscapeString(end, (char*)npcloot_dump, sizeof(ZSDump_NPC_Loot) * npcloot_count); + + DoEscapeString(zsDumpNPCLootBuffer, (char*)npcloot_dump, sizeof(ZSDump_NPC_Loot) * npcloot_count); + query.append(zsDumpNPCLootBuffer); safe_delete_array(npcloot_dump); } - *end++ = '\''; - end += sprintf(end, ", "); - *end++ = '\''; + query.append("\', \'"); + if (gmspawntype_dump != 0) { - end += DoEscapeString(end, (char*)gmspawntype_dump, sizeof(NPCType) * gmspawntype_count); + + DoEscapeString(gmspawnTypeBuffer, (char*)gmspawntype_dump, sizeof(NPCType) * gmspawntype_count); + query.append(gmspawnTypeBuffer); safe_delete_array(gmspawntype_dump); } - *end++ = '\''; - end += sprintf(end, ")"); + query.append("\')"); uint32 affected_rows = 0; - if (!RunQuery(query, (uint32) (end - query), errbuf, 0, &affected_rows)) { - // if (DoEscapeString(query, (unsigned int) (end - query))) { - safe_delete_array(query); + if (!RunQuery(query, errbuf, 0, &affected_rows)) { std::cerr << "Error in ZoneDump query " << errbuf << std::endl; return false; } - safe_delete_array(query); if (affected_rows == 0) { std::cerr << "Zone dump failed. (affected rows = 0)" << std::endl; @@ -1825,7 +1793,7 @@ bool ZoneDatabase::DumpZoneState() { int8 ZoneDatabase::LoadZoneState(const char* zonename, LinkedList& spawn2_list) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -1843,8 +1811,11 @@ int8 ZoneDatabase::LoadZoneState(const char* zonename, LinkedList& spaw Spawn2** spawn2_loaded = 0; NPC** npc_loaded = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT spawn2_count, npc_count, npcloot_count, gmspawntype_count, spawn2, npcs, npc_loot, gmspawntype, (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(time)) as elapsedtime FROM zone_state_dump WHERE zonename='%s'", zonename), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT spawn2_count, npc_count, npcloot_count, gmspawntype_count, spawn2, " + "npcs, npc_loot, gmspawntype, (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(time)) " + "as elapsedtime FROM zone_state_dump WHERE zonename='%s'", zonename); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); std::cout << "Elapsed time: " << row[8] << std::endl; @@ -1997,7 +1968,6 @@ int8 ZoneDatabase::LoadZoneState(const char* zonename, LinkedList& spaw else { std::cerr << "Error in LoadZoneState query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return -1; } @@ -2144,13 +2114,13 @@ bool Zone::RemoveSpawnGroup(uint32 in_id) { // Added By Hogie bool ZoneDatabase::GetDecayTimes(npcDecayTimes_Struct* npcCorpseDecayTimes) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; int i = 0; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT varname, value FROM variables WHERE varname like 'decaytime%%' ORDER BY varname"), errbuf, &result)) { - safe_delete_array(query); + std::string query = "SELECT varname, value FROM variables WHERE varname like 'decaytime%%' ORDER BY varname"; + + if (RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { Seperator sep(row[0]); npcCorpseDecayTimes[i].minlvl = atoi(sep.arg[1]); @@ -2164,7 +2134,6 @@ bool ZoneDatabase::GetDecayTimes(npcDecayTimes_Struct* npcCorpseDecayTimes) { mysql_free_result(result); } else { - safe_delete_array(query); return false; } return true; @@ -2355,12 +2324,13 @@ void Zone::SetInstanceTimer(uint32 new_duration) void Zone::LoadLDoNTraps() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT id, type, spell_id, " - "skill, locked FROM ldon_trap_templates"), errbuf, &result)) + std::string query = "SELECT id, type, spell_id, " + "skill, locked FROM ldon_trap_templates"; + + if(database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -2374,12 +2344,10 @@ void Zone::LoadLDoNTraps() ldon_trap_list[lt->id] = lt; } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, "Error in Zone::LoadLDoNTraps: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Zone::LoadLDoNTraps: %s (%s)", query.c_str(), errbuf); return; } } @@ -2387,11 +2355,12 @@ void Zone::LoadLDoNTraps() void Zone::LoadLDoNTrapEntries() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT id, trap_id FROM ldon_trap_entries"),errbuf,&result)) { + std::string query = "SELECT id, trap_id FROM ldon_trap_entries"; + + if(database.RunQuery(query,errbuf,&result)) { while((row = mysql_fetch_row(result))) { uint32 id = atoi(row[0]); @@ -2426,12 +2395,10 @@ void Zone::LoadLDoNTrapEntries() } } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, "Error in Zone::LoadLDoNTrapEntries: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Zone::LoadLDoNTrapEntries: %s (%s)", query.c_str(), errbuf); return; } } @@ -2440,7 +2407,6 @@ void Zone::LoadVeteranRewards() { VeteranRewards.clear(); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; InternalVeteranReward current_reward; @@ -2448,10 +2414,11 @@ void Zone::LoadVeteranRewards() current_reward.claim_id = 0; + std::string query = "SELECT claim_id, name, item_id, charges FROM " + "veteran_reward_templates WHERE reward_slot < 8 " + "and claim_id > 0 ORDER by claim_id, reward_slot"; - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT claim_id, name, item_id, charges FROM" - " veteran_reward_templates WHERE reward_slot < 8 and claim_id > 0 ORDER by claim_id, reward_slot"), - errbuf,&result)) + if(database.RunQuery(query,errbuf,&result)) { while((row = mysql_fetch_row(result))) { @@ -2482,12 +2449,10 @@ void Zone::LoadVeteranRewards() VeteranRewards.push_back(current_reward); } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, "Error in Zone::LoadVeteranRewards: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Zone::LoadVeteranRewards: %s (%s)", query.c_str(), errbuf); } } @@ -2495,13 +2460,13 @@ void Zone::LoadAlternateCurrencies() { AlternateCurrencies.clear(); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; AltCurrencyDefinition_Struct current_currency; - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT id, item_id from alternate_currency"), - errbuf,&result)) + std::string query = "SELECT id, item_id from alternate_currency"; + + if(database.RunQuery(query,errbuf,&result)) { while((row = mysql_fetch_row(result))) { @@ -2511,12 +2476,10 @@ void Zone::LoadAlternateCurrencies() } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, "Error in Zone::LoadAlternateCurrencies: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Zone::LoadAlternateCurrencies: %s (%s)", query.c_str(), errbuf); } } @@ -2553,11 +2516,12 @@ void Zone::DeleteQGlobal(std::string name, uint32 npcID, uint32 charID, uint32 z void Zone::LoadAdventureFlavor() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT id, text FROM adventure_template_entry_flavor"), errbuf, &result)) + std::string query = "SELECT id, text FROM adventure_template_entry_flavor"; + + if(database.RunQuery(query,errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -2566,12 +2530,10 @@ void Zone::LoadAdventureFlavor() adventure_entry_list_flavor[id] = in_str; } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, "Error in Zone::LoadAdventureFlavor: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Zone::LoadAdventureFlavor: %s (%s)", query.c_str(), errbuf); return; } } @@ -2636,12 +2598,13 @@ void Zone::DoAdventureActions() void Zone::LoadNPCEmotes(LinkedList* NPCEmoteList) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; MYSQL_RES *result; MYSQL_ROW row; NPCEmoteList->Clear(); - if(database.RunQuery(query,MakeAnyLenString(&query,"SELECT emoteid, event_, type, text FROM npc_emotes"), errbuf, &result)) + std::string query = "SELECT emoteid, event_, type, text FROM npc_emotes"; + + if(database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -2653,12 +2616,10 @@ void Zone::LoadNPCEmotes(LinkedList* NPCEmoteList) NPCEmoteList->Insert(nes); } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, "Error in Zone::LoadNPCEmotes: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Zone::LoadNPCEmotes: %s (%s)", query.c_str(), errbuf); } } @@ -2672,12 +2633,14 @@ void Zone::ReloadWorld(uint32 Option){ void Zone::LoadTickItems() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; tick_items.clear(); - if(database.RunQuery(query, MakeAnyLenString(&query, "SELECT it_itemid, it_chance, it_level, it_qglobal, it_bagslot FROM item_tick"), errbuf, &result)) + query = "SELECT it_itemid, it_chance, it_level, it_qglobal, it_bagslot FROM item_tick"; + + if(database.RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))) { @@ -2693,12 +2656,10 @@ void Zone::LoadTickItems() } } mysql_free_result(result); - safe_delete_array(query); } else { - LogFile->write(EQEMuLog::Error, "Error in Zone::LoadTickItems: %s (%s)", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in Zone::LoadTickItems: %s (%s)", query.c_str(), errbuf); } } @@ -2720,12 +2681,14 @@ uint32 Zone::GetSpawnKillCount(uint32 in_spawnid) { void Zone::UpdateHotzone() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; bool updh; - if(database.RunQuery(query, MakeAnyLenString(&query,"SELECT hotzone FROM zone WHERE short_name = '%s'", GetShortName()), errbuf, &result) ) + StringFormat(query, "SELECT hotzone FROM zone WHERE short_name = '%s'",GetShortName()); + + if(database.RunQuery(query, errbuf, &result) ) { if( (row = mysql_fetch_row(result)) ) { @@ -2738,5 +2701,4 @@ void Zone::UpdateHotzone() } mysql_free_result(result); } - safe_delete_array(query); } diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index 6b08d98c2..e43912283 100644 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -60,43 +60,51 @@ ZoneDatabase::~ZoneDatabase() { bool ZoneDatabase::SaveZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct* zd){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "update zone set underworld=%f,minclip=%f," - "maxclip=%f,fog_minclip=%f,fog_maxclip=%f,fog_blue=%i,fog_red=%i,fog_green=%i,sky=%i," - "ztype=%i,zone_exp_multiplier=%f,safe_x=%f,safe_y=%f,safe_z=%f " - "where zoneidnumber=%i and version=%i", - zd->underworld,zd->minclip, - zd->maxclip,zd->fog_minclip[0],zd->fog_maxclip[0],zd->fog_blue[0],zd->fog_red[0],zd->fog_green[0],zd->sky, - zd->ztype,zd->zone_exp_multiplier, - zd->safe_x,zd->safe_y,zd->safe_z, - zoneid, instance_id),errbuf)) { - LogFile->write(EQEMuLog::Error, "Error in SaveZoneCFG query %s: %s", query, errbuf); - safe_delete_array(query); + std::string query; + + StringFormat(query, "update zone set underworld=%f,minclip=%f, " + "maxclip=%f,fog_minclip=%f,fog_maxclip=%f, " + "fog_blue=%i,fog_red=%i,fog_green=%i,sky=%i, " + "ztype=%i,zone_exp_multiplier=%f,safe_x=%f, " + "safe_y=%f,safe_z=%f " + "where zoneidnumber=%i and version=%i", + zd->underworld, zd->minclip, zd->maxclip, + zd->fog_minclip[0], zd->fog_maxclip[0], + zd->fog_blue[0], zd->fog_red[0], zd->fog_green[0], + zd->sky, zd->ztype, zd->zone_exp_multiplier, + zd->safe_x, zd->safe_y, zd->safe_z, zoneid, instance_id); + + if (!RunQuery(query,errbuf)) { + LogFile->write(EQEMuLog::Error, "Error in SaveZoneCFG query %s: %s", query.c_str(), errbuf); return false; } - safe_delete_array(query); return true; } bool ZoneDatabase::GetZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct *zone_data, bool &can_bind, bool &can_combat, bool &can_levitate, bool &can_castoutdoor, bool &is_city, bool &is_hotzone, bool &allow_mercs, int &ruleset, char **map_filename) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; int i=0; int b=0; bool good = false; *map_filename = new char[100]; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT ztype," - "fog_red,fog_green,fog_blue,fog_minclip,fog_maxclip," - "fog_red2,fog_green2,fog_blue2,fog_minclip2,fog_maxclip2," - "fog_red3,fog_green3,fog_blue3,fog_minclip3,fog_maxclip3," - "fog_red4,fog_green4,fog_blue4,fog_minclip4,fog_maxclip4,fog_density," - "sky,zone_exp_multiplier,safe_x,safe_y,safe_z,underworld," - "minclip,maxclip,time_type,canbind,cancombat,canlevitate," - "castoutdoor,hotzone,ruleset,suspendbuffs,map_file_name,short_name" - " from zone where zoneidnumber=%i and version=%i",zoneid, instance_id), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT ztype, fog_red, fog_green, fog_blue, " + "fog_minclip, fog_maxclip, fog_red2, fog_green2, " + "fog_blue2, fog_minclip2, fog_maxclip2, fog_red3, " + "fog_green3, fog_blue3, fog_minclip3, fog_maxclip3, " + "fog_red4, fog_green4, fog_blue4, fog_minclip4, " + "fog_maxclip4, fog_density, sky,zone_exp_multiplier, " + "safe_x, safe_y, safe_z, underworld, minclip, " + "maxclip, time_type, canbind, cancombat, canlevitate, " + "castoutdoor, hotzone, ruleset, suspendbuffs, " + "map_file_name, short_name " + "from zone where zoneidnumber=%i and version=%i", + zoneid, instance_id); + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if(row) { @@ -151,10 +159,9 @@ bool ZoneDatabase::GetZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct } else { - LogFile->write(EQEMuLog::Error, "Error in GetZoneCFG query %s: %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in GetZoneCFG query %s: %s", query.c_str(), errbuf); strcpy(*map_filename, "default"); } - safe_delete_array(query); zone_data->zone_id = zoneid; @@ -169,27 +176,34 @@ void ZoneDatabase::UpdateSpawn2Timeleft(uint32 id, uint16 instance_id, uint32 ti uint32 cur = tv.tv_sec; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; //if we pass timeleft as 0 that means we clear from respawn time //otherwise we update with a REPLACE INTO if(timeleft == 0) { - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM respawn_times WHERE id=%lu " - "AND instance_id=%lu",(unsigned long)id, (unsigned long)instance_id),errbuf)) + + StringFormat(query, "DELETE FROM respawn_times WHERE id=%lu " + "AND instance_id=%lu", + (unsigned long)id, (unsigned long)instance_id); + + if (!RunQuery(query,errbuf)) { - LogFile->write(EQEMuLog::Error, "Error in UpdateTimeLeft query %s: %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in UpdateTimeLeft query %s: %s", query.c_str(), errbuf); } - safe_delete_array(query); } else { - if (!RunQuery(query, MakeAnyLenString(&query, "REPLACE INTO respawn_times (id,start,duration,instance_id) " - "VALUES(%lu,%lu,%lu,%lu)",(unsigned long)id, (unsigned long)cur, (unsigned long)timeleft, (unsigned long)instance_id),errbuf)) + + StringFormat(query, "REPLACE INTO respawn_times (id,start,duration,instance_id) " + "VALUES (%lu, %lu, %lu, %lu)", + (unsigned long)id, (unsigned long)cur, + (unsigned long)timeleft, (unsigned long)instance_id); + + if (!RunQuery(query,errbuf)) { - LogFile->write(EQEMuLog::Error, "Error in UpdateTimeLeft query %s: %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in UpdateTimeLeft query %s: %s", query.c_str(), errbuf); } - safe_delete_array(query); } return; } @@ -198,16 +212,15 @@ void ZoneDatabase::UpdateSpawn2Timeleft(uint32 id, uint16 instance_id, uint32 ti uint32 ZoneDatabase::GetSpawnTimeLeft(uint32 id, uint16 instance_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - MakeAnyLenString(&query, "SELECT start, duration FROM respawn_times WHERE id=%lu AND instance_id=%lu", - (unsigned long)id, (unsigned long)zone->GetInstanceID()); + StringFormat(query, "SELECT start, duration FROM respawn_times WHERE id=%lu AND instance_id=%lu", + (unsigned long)id, (unsigned long)zone->GetInstanceID()); - if (RunQuery(query, strlen(query), errbuf, &result)) + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); row = mysql_fetch_row(result); if(row) { @@ -238,8 +251,7 @@ uint32 ZoneDatabase::GetSpawnTimeLeft(uint32 id, uint16 instance_id) } else { - LogFile->write(EQEMuLog::Error, "Error in GetSpawnTimeLeft query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in GetSpawnTimeLeft query '%s': %s", query.c_str(), errbuf); return 0; } return 0; @@ -248,96 +260,94 @@ uint32 ZoneDatabase::GetSpawnTimeLeft(uint32 id, uint16 instance_id) void ZoneDatabase::UpdateSpawn2Status(uint32 id, uint8 new_status) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if(!RunQuery(query, MakeAnyLenString(&query, "UPDATE spawn2 SET enabled=%i WHERE id=%lu", new_status, (unsigned long)id),errbuf)) + StringFormat(query, "UPDATE spawn2 SET enabled=%i WHERE id=%lu", + new_status, (unsigned long)id); + + if(!RunQuery(query, errbuf)) { - LogFile->write(EQEMuLog::Error, "Error in UpdateSpawn2Status query %s: %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in UpdateSpawn2Status query %s: %s", query.c_str(), errbuf); } - safe_delete_array(query); return; } bool ZoneDatabase::logevents(const char* accountname,uint32 accountid,uint8 status,const char* charname, const char* target,const char* descriptiontype, const char* description,int event_nid){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 len = strlen(description); uint32 len2 = strlen(target); - char* descriptiontext = new char[2*len+1]; - char* targetarr = new char[2*len2+1]; - memset(descriptiontext, 0, 2*len+1); - memset(targetarr, 0, 2*len2+1); + std::string descriptiontext; + std::string targetarr; DoEscapeString(descriptiontext, description, len); DoEscapeString(targetarr, target, len2); - if (!RunQuery(query, MakeAnyLenString(&query, "Insert into eventlog (accountname,accountid,status,charname,target,descriptiontype,description,event_nid) values('%s',%i,%i,'%s','%s','%s','%s','%i')", accountname,accountid,status,charname,targetarr,descriptiontype,descriptiontext,event_nid), errbuf)) { + + StringFormat(query, "Insert into eventlog " + "(accountname,accountid,status,charname,target,descriptiontype,description,event_nid) " + "values('%s', %i, %i, '%s', '%s', '%s', '%s', '%i')", + accountname, accountid, status, charname, targetarr.c_str(), descriptiontype, descriptiontext.c_str(), event_nid); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in logevents" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); - safe_delete_array(descriptiontext); - safe_delete_array(targetarr); return true; } void ZoneDatabase::UpdateBug(BugStruct* bug){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 len = strlen(bug->bug); - char* bugtext = nullptr; + std::string bugText; if(len > 0) { - bugtext = new char[2*len+1]; - memset(bugtext, 0, 2*len+1); - DoEscapeString(bugtext, bug->bug, len); + DoEscapeString(bugText, bug->bug, len); } len = strlen(bug->ui); - char* uitext = nullptr; + std::string uiText; if(len > 0) { - uitext = new char[2*len+1]; - memset(uitext, 0, 2*len+1); - DoEscapeString(uitext, bug->ui, len); + DoEscapeString(uiText, bug->ui, len); } len = strlen(bug->target_name); - char* targettext = nullptr; + std::string targetText; if(len > 0) { - targettext = new char[2*len+1]; - memset(targettext, 0, 2*len+1); - DoEscapeString(targettext, bug->target_name, len); + DoEscapeString(targetText, bug->target_name, len); } //x and y are intentionally swapped because eq is inversexy coords - if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO bugs (zone, name, ui, x, y, z, type, flag, target, bug, date) " - "values('%s', '%s', '%s', '%.2f', '%.2f', '%.2f', '%s', %d, '%s', '%s', CURDATE())", zone->GetShortName(), bug->name, - uitext==nullptr?"":uitext, bug->y, bug->x, bug->z, bug->chartype, bug->type, targettext==nullptr?"Unknown Target":targettext, - bugtext==nullptr?"":bugtext), errbuf)) { + + StringFormat(query, "INSERT INTO bugs (zone, name, ui, x, y, z, type, flag, target, bug, date) " + "values('%s', '%s', '%s', '%.2f', '%.2f', '%.2f', '%s', %d, '%s', '%s', CURDATE())", + zone->GetShortName(), bug->name, uiText.c_str(), + bug->y, bug->x, bug->z, bug->chartype, bug->type, targetText==""?"Unknown Target":targetText.c_str(), + bugText.c_str()); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in UpdateBug" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); - safe_delete_array(bugtext); - safe_delete_array(uitext); - safe_delete_array(targettext); } void ZoneDatabase::UpdateBug(PetitionBug_Struct* bug){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 len = strlen(bug->text); - char* bugtext = new char[2*len+1]; - memset(bugtext, 0, 2*len+1); - DoEscapeString(bugtext, bug->text, len); - if (!RunQuery(query, MakeAnyLenString(&query, "Insert into bugs (type,name,bugtext,flag) values('%s','%s','%s',%i)","Petition",bug->name,bugtext,25), errbuf)) { + std::string bugText; + DoEscapeString(bugText, bug->text, len); + + StringFormat(query,"Insert into bugs (type,name,bugtext,flag) " + "values('%s', '%s', '%s', %i)","Petition", + bug->name, bugText.c_str(),25); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in UpdateBug" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); - safe_delete_array(bugtext); } @@ -377,14 +387,15 @@ bool ZoneDatabase::GetAccountInfoForLogin_result(MYSQL_RES* result, int16* admin bool ZoneDatabase::SetSpecialAttkFlag(uint8 id, const char* flag) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE npc_types SET npcspecialattks='%s' WHERE id=%i;",flag,id), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + StringFormat(query, "UPDATE npc_types SET npcspecialattks='%s' WHERE id=%i;", + flag, id); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { return false; } - safe_delete_array(query); if (affected_rows == 0) { return false; @@ -413,12 +424,13 @@ void ZoneDatabase::SetDoorPlace(uint8 value,uint8 door_id,const char* zone_name) void ZoneDatabase::GetEventLogs(const char* name,char* target,uint32 account_id,uint8 eventid,char* detail,char* timestamp, CharacterEventLog_Struct* cel) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; query = new char[256]; uint32 count = 0; char modifications[200]; + if(strlen(name) != 0) sprintf(modifications,"charname=\'%s\'",name); else if(account_id != 0) @@ -437,10 +449,13 @@ void ZoneDatabase::GetEventLogs(const char* name,char* target,uint32 account_id, eventid =1; sprintf(modifications,"%s AND event_nid=%i",modifications,eventid); - MakeAnyLenString(&query, "SELECT id,accountname,accountid,status,charname,target,time,descriptiontype,description FROM eventlog where %s",modifications); - if (RunQuery(query, strlen(query), errbuf, &result)) + StringFormat(query, "SELECT id, accountname, accountid, status, charname, " + "target, time, descriptiontype, description " + "FROM eventlog where %s", + modifications); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while((row = mysql_fetch_row(result))) { if(count > 255) @@ -463,7 +478,6 @@ void ZoneDatabase::GetEventLogs(const char* name,char* target,uint32 account_id, else { // TODO: Invalid item length in database - safe_delete_array(query); } } @@ -476,16 +490,19 @@ void ZoneDatabase::LoadWorldContainer(uint32 parentid, ItemInst* container) } char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; //const Item_Struct* item = nullptr; //ItemInst* inst = nullptr; - uint32 len_query = MakeAnyLenString(&query, "select " - "bagidx,itemid,charges,augslot1,augslot2,augslot3,augslot4,augslot5 from object_contents where parentid=%i", parentid); + StringFormat(query, "select bagidx, itemid, charges, " + "augslot1, augslot2, augslot3, " + "augslot4, augslot5 from " + "object_contents where parentid=%i", + parentid); - if (RunQuery(query, len_query, errbuf, &result)) { + if (RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { uint8 index = (uint8)atoi(row[0]); uint32 item_id = (uint32)atoi(row[1]); @@ -517,14 +534,13 @@ void ZoneDatabase::LoadWorldContainer(uint32 parentid, ItemInst* container) LogFile->write(EQEMuLog::Error, "Error in DB::LoadWorldContainer: %s", errbuf); } - safe_delete_array(query); } // Save child objects for a world container (i.e., forge, bag dropped to ground, etc) void ZoneDatabase::SaveWorldContainer(uint32 zone_id, uint32 parent_id, const ItemInst* container) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; // Since state is not saved for each world container action, we'll just delete // all and save from scratch .. we may come back later to optimize @@ -547,15 +563,16 @@ void ZoneDatabase::SaveWorldContainer(uint32 zone_id, uint32 parent_id, const It augslot[i]=(auginst && auginst->GetItem()) ? auginst->GetItem()->ID : 0; } } - uint32 len_query = MakeAnyLenString(&query, + StringFormat(query, "replace into object_contents " + "(zoneid, parentid, bagidx, itemid, charges, " + "augslot1, augslot2, augslot3, augslot4, augslot5, droptime) " + "values (%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, now())", + zone_id, parent_id, index, item_id, inst->GetCharges(), + augslot[0], augslot[1], augslot[2], augslot[3], augslot[4]); - "replace into object_contents (zoneid,parentid,bagidx,itemid,charges,augslot1,augslot2,augslot3,augslot4,augslot5,droptime) values (%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,now())", - zone_id, parent_id, index, item_id, inst->GetCharges(),augslot[0],augslot[1],augslot[2],augslot[3],augslot[4]); - - if (!RunQuery(query, len_query, errbuf)) { + if (!RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::SaveWorldContainer: %s", errbuf); } - safe_delete_array(query); } } @@ -565,26 +582,28 @@ void ZoneDatabase::SaveWorldContainer(uint32 zone_id, uint32 parent_id, const It void ZoneDatabase::DeleteWorldContainer(uint32 parent_id,uint32 zone_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; - uint32 len_query = MakeAnyLenString(&query, - "delete from object_contents where parentid=%i and zoneid=%i", parent_id,zone_id); - if (!RunQuery(query, len_query, errbuf)) { + StringFormat(query, "delete from object_contents where parentid=%i and zoneid=%i", + parent_id,zone_id); + + if (!RunQuery(query,errbuf)) { LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::DeleteWorldContainer: %s", errbuf); } - safe_delete_array(query); } Trader_Struct* ZoneDatabase::LoadTraderItem(uint32 char_id){ char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; Trader_Struct* loadti = new Trader_Struct; memset(loadti,0,sizeof(Trader_Struct)); - if (RunQuery(query,MakeAnyLenString(&query, "select * from trader where char_id=%i order by slot_id limit 80",char_id),errbuf,&result)){ - safe_delete_array(query); + + StringFormat(query, "select * from trader where char_id=%i order by slot_id limit 80", char_id); + + if (RunQuery(query,errbuf,&result)){ loadti->Code = BazaarTrader_ShowItems; while ((row = mysql_fetch_row(result))) { if(atoi(row[5])>=80 || atoi(row[4])<0) @@ -597,7 +616,6 @@ Trader_Struct* ZoneDatabase::LoadTraderItem(uint32 char_id){ mysql_free_result(result); } else{ - safe_delete_array(query); _log(TRADING__CLIENT, "Failed to load trader information!\n"); } return loadti; @@ -605,13 +623,15 @@ Trader_Struct* ZoneDatabase::LoadTraderItem(uint32 char_id){ TraderCharges_Struct* ZoneDatabase::LoadTraderItemWithCharges(uint32 char_id){ char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; TraderCharges_Struct* loadti = new TraderCharges_Struct; memset(loadti,0,sizeof(TraderCharges_Struct)); - if (RunQuery(query,MakeAnyLenString(&query, "select * from trader where char_id=%i order by slot_id limit 80",char_id),errbuf,&result)){ - safe_delete_array(query); + + StringFormat(query, "select * from trader where char_id=%i order by slot_id limit 80", char_id); + + if (RunQuery(query,errbuf,&result)){ while ((row = mysql_fetch_row(result))) { if(atoi(row[5])>=80 || atoi(row[5])<0) _log(TRADING__CLIENT, "Bad Slot number when trying to load trader information!\n"); @@ -625,7 +645,6 @@ TraderCharges_Struct* ZoneDatabase::LoadTraderItemWithCharges(uint32 char_id){ mysql_free_result(result); } else{ - safe_delete_array(query); _log(TRADING__CLIENT, "Failed to load trader information!\n"); } return loadti; @@ -634,13 +653,14 @@ TraderCharges_Struct* ZoneDatabase::LoadTraderItemWithCharges(uint32 char_id){ ItemInst* ZoneDatabase::LoadSingleTraderItem(uint32 CharID, int SerialNumber) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query,MakeAnyLenString(&query, "select * from trader where char_id=%i and serialnumber=%i order by slot_id limit 80", - CharID, SerialNumber),errbuf,&result)){ - safe_delete_array(query); + StringFormat(query, "select * from trader where char_id=%i and serialnumber=%i order by slot_id limit 80", + CharID, SerialNumber); + + if (RunQuery(query, errbuf,&result)){ if (mysql_num_rows(result) != 1) { _log(TRADING__CLIENT, "Bad result from query\n"); fflush(stdout); @@ -684,25 +704,28 @@ ItemInst* ZoneDatabase::LoadSingleTraderItem(uint32 CharID, int SerialNumber) { void ZoneDatabase::SaveTraderItem(uint32 CharID, uint32 ItemID, uint32 SerialNumber, int32 Charges, uint32 ItemCost, uint8 Slot){ char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; - if (!(RunQuery(query,MakeAnyLenString(&query, "replace INTO trader VALUES(%i,%i,%i,%i,%i,%i)", - CharID, ItemID, SerialNumber, Charges, ItemCost, Slot),errbuf))) + std::string query; + + StringFormat(query, "replace INTO trader VALUES (%i, %i, %i, %i, %i, %i)", + CharID, ItemID, SerialNumber, Charges, ItemCost, Slot); + + if (!RunQuery(query,errbuf)) _log(TRADING__CLIENT, "Failed to save trader item: %i for char_id: %i, the error was: %s\n", ItemID, CharID, errbuf); - safe_delete_array(query); } void ZoneDatabase::UpdateTraderItemCharges(int CharID, uint32 SerialNumber, int32 Charges) { _log(TRADING__CLIENT, "ZoneDatabase::UpdateTraderItemCharges(%i, %i, %i)", CharID, SerialNumber, Charges); char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; - if (!(RunQuery(query,MakeAnyLenString(&query, "update trader set charges=%i where char_id=%i and serialnumber=%i", - Charges, CharID, SerialNumber),errbuf))) + std::string query; + + StringFormat(query, "update trader set charges=%i where char_id=%i and serialnumber=%i", + Charges, CharID, SerialNumber); + + if (!(RunQuery(query,errbuf))) _log(TRADING__CLIENT, "Failed to update charges for trader item: %i for char_id: %i, the error was: %s\n", - SerialNumber, CharID, errbuf); - - safe_delete_array(query); + SerialNumber, CharID, errbuf); } @@ -717,98 +740,118 @@ void ZoneDatabase::UpdateTraderItemPrice(int CharID, uint32 ItemID, uint32 Charg char errbuf[MYSQL_ERRMSG_SIZE]; - char* Query = 0; + std::string query; if(NewPrice == 0) { _log(TRADING__CLIENT, "Removing Trader items from the DB for CharID %i, ItemID %i", CharID, ItemID); - if (!(RunQuery(Query,MakeAnyLenString(&Query, "delete from trader where char_id=%i and item_id=%i", - CharID, ItemID),errbuf))) + StringFormat(query, "delete from trader where char_id=%i and item_id=%i", + CharID, ItemID); + if (!RunQuery(query,errbuf)) { _log(TRADING__CLIENT, "Failed to remove trader item(s): %i for char_id: %i, the error was: %s\n", - ItemID, CharID, errbuf); - - safe_delete_array(Query); - + ItemID, CharID, errbuf); + } return; } else { if(!item->Stackable) { - if (!(RunQuery(Query,MakeAnyLenString(&Query, "update trader set item_cost=%i where char_id=%i and item_id=%i" - " and charges=%i", NewPrice, CharID, ItemID, Charges),errbuf))) - + + StringFormat(query, "update trader set item_cost=%i where char_id=%i " + "and item_id=%i and charges=%i", + NewPrice, CharID, ItemID, Charges); + + if (!RunQuery(query,errbuf)) { _log(TRADING__CLIENT, "Failed to update price for trader item: %i for char_id: %i, the error was: %s\n", - ItemID, CharID, errbuf); + ItemID, CharID, errbuf); + } } else { - if (!(RunQuery(Query,MakeAnyLenString(&Query, "update trader set item_cost=%i where char_id=%i and item_id=%i", - NewPrice, CharID, ItemID),errbuf))) - + + StringFormat(query, "update trader set item_cost=%i where char_id=%i and item_id=%i", + NewPrice, CharID, ItemID); + + if (!RunQuery(query,errbuf)) { _log(TRADING__CLIENT, "Failed to update price for trader item: %i for char_id: %i, the error was: %s\n", - ItemID, CharID, errbuf); + ItemID, CharID, errbuf); + } } - - safe_delete_array(Query); } } void ZoneDatabase::DeleteTraderItem(uint32 char_id){ char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; if(char_id==0){ - if (!(RunQuery(query,MakeAnyLenString(&query, "delete from trader"),errbuf))) + + query = "delete from trader"; + + if (!RunQuery(query,errbuf)) _log(TRADING__CLIENT, "Failed to delete all trader items data, the error was: %s\n",errbuf); + } - else{ - if (!(RunQuery(query,MakeAnyLenString(&query, "delete from trader where char_id=%i",char_id),errbuf))) + else { + + StringFormat(query, "delete from trader where char_id=%i", char_id); + + if (!RunQuery(query,errbuf)) _log(TRADING__CLIENT, "Failed to delete trader item data for char_id: %i, the error was: %s\n",char_id,errbuf); } - safe_delete_array(query); } void ZoneDatabase::DeleteTraderItem(uint32 CharID,uint16 SlotID){ char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; - if (!(RunQuery(query,MakeAnyLenString(&query, "delete from trader where char_id=%i and slot_id=%i",CharID, SlotID),errbuf))) + std::string query; + + StringFormat(query, "delete from trader where char_id=%i and slot_id=%i",CharID, SlotID); + + if (!RunQuery(query,errbuf)) _log(TRADING__CLIENT, "Failed to delete trader item data for char_id: %i, the error was: %s\n",CharID, errbuf); - safe_delete_array(query); } void ZoneDatabase::DeleteBuyLines(uint32 CharID){ char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; if(CharID==0){ - if (!(RunQuery(query,MakeAnyLenString(&query, "delete from buyer"),errbuf))) + + query = "delete from buyer"; + + if (!RunQuery(query,errbuf)) _log(TRADING__CLIENT, "Failed to delete all buyer items data, the error was: %s\n",errbuf); } else{ - if (!(RunQuery(query,MakeAnyLenString(&query, "delete from buyer where charid=%i",CharID),errbuf))) + + StringFormat(query, "delete from buyer where charid=%i", CharID); + + if (!(RunQuery(query,errbuf))) _log(TRADING__CLIENT, "Failed to delete buyer item data for charid: %i, the error was: %s\n",CharID,errbuf); } - safe_delete_array(query); } void ZoneDatabase::AddBuyLine(uint32 CharID, uint32 BuySlot, uint32 ItemID, const char* ItemName, uint32 Quantity, uint32 Price) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; - if (!(RunQuery(query,MakeAnyLenString(&query, "replace INTO buyer VALUES(%i,%i, %i,\"%s\",%i,%i)", - CharID, BuySlot, ItemID, ItemName, Quantity, Price),errbuf))) + std::string query; + + StringFormat(query, "replace INTO buyer VALUES(%i,%i, %i,\"%s\",%i,%i)", + CharID, BuySlot, ItemID, ItemName, Quantity, Price); + + if (!RunQuery(query,errbuf)) _log(TRADING__CLIENT, "Failed to save buline item: %i for char_id: %i, the error was: %s\n", ItemID, CharID, errbuf); - safe_delete_array(query); } void ZoneDatabase::RemoveBuyLine(uint32 CharID, uint32 BuySlot) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; - if (!(RunQuery(query,MakeAnyLenString(&query, "delete from buyer where charid=%i and buyslot=%i", CharID, BuySlot), errbuf))) + StringFormat(query, "delete from buyer where charid=%i and buyslot=%i", CharID, BuySlot); + + if (!(RunQuery(query,errbuf))) _log(TRADING__CLIENT, "Failed to delete buyslot %i for charid: %i, the error was: %s\n", BuySlot, CharID, errbuf); - safe_delete_array(query); } void ZoneDatabase::UpdateBuyLine(uint32 CharID, uint32 BuySlot, uint32 Quantity) { @@ -819,14 +862,14 @@ void ZoneDatabase::UpdateBuyLine(uint32 CharID, uint32 BuySlot, uint32 Quantity) } char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; - if (!(RunQuery(query,MakeAnyLenString(&query, "update buyer set quantity=%i where charid=%i and buyslot=%i", - Quantity, CharID, BuySlot), errbuf))) + StringFormat(query, "update buyer set quantity=%i where charid=%i and buyslot=%i", + Quantity, CharID, BuySlot); + + if (!(RunQuery(query,errbuf))) _log(TRADING__CLIENT, "Failed to update quantity in buyslot %i for charid: %i, the error was: %s\n", BuySlot, CharID, errbuf); - safe_delete_array(query); - } bool ZoneDatabase::GetCharacterInfoForLogin(const char* name, uint32* character_id, @@ -835,7 +878,7 @@ uint32* pplen, uint32* guilddbid, uint8* guildrank, uint8 *class_, uint8 *level, bool *LFP, bool *LFG, uint8 *NumXTargets, uint8 *firstlogon) { _CP(Database_GetCharacterInfoForLogin); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 querylen; MYSQL_RES *result; @@ -845,21 +888,27 @@ uint8 *class_, uint8 *level, bool *LFP, bool *LFG, uint8 *NumXTargets, uint8 *fi if (character_id && *character_id) { // searching by ID should be a lil bit faster - querylen = MakeAnyLenString(&query, "SELECT id,profile,zonename,x,y,z,guild_id,rank,extprofile,class,level,lfp,lfg,instanceid,xtargets,firstlogon FROM character_ LEFT JOIN guild_members ON id=char_id WHERE id=%i", *character_id); + + StringFormat(query, "SELECT id, profile, zonename, x, y, z, guild_id, rank, extprofile, " + "class, level, lfp, lfg, instanceid, xtargets, firstlogon " + "FROM character_ LEFT JOIN guild_members ON id=char_id WHERE id=%i", *character_id); } else { - querylen = MakeAnyLenString(&query, "SELECT id,profile,zonename,x,y,z,guild_id,rank,extprofile,class,level,lfp,lfg,instanceid,xtargets,firstlogon FROM character_ LEFT JOIN guild_members ON id=char_id WHERE name='%s'", name); + + StringFormat(query, "SELECT id, profile, zonename, x, y, z, guild_id, rank, extprofile, " + "class, level, lfp, lfg, instanceid, xtargets, firstlogon FROM " + "character_ LEFT JOIN guild_members ON id=char_id WHERE name='%s'", + name); } - if (RunQuery(query, querylen, errbuf, &result)) { + if (RunQuery(query, errbuf, &result)) { ret = GetCharacterInfoForLogin_result(result, character_id, current_zone, pp, inv, ext, pplen, guilddbid, guildrank, class_, level, LFP, LFG, NumXTargets, firstlogon); mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "GetCharacterInfoForLogin query '%s' %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "GetCharacterInfoForLogin query '%s' %s", query.c_str(), errbuf); } - safe_delete_array(query); return ret; } @@ -965,11 +1014,13 @@ bool ZoneDatabase::GetCharacterInfoForLogin_result(MYSQL_RES* result, bool ZoneDatabase::NoRentExpired(const char* name){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "Select (UNIX_TIMESTAMP(NOW())-timelaston) from character_ where name='%s'", name), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "Select (UNIX_TIMESTAMP(NOW())-timelaston) from character_ where name='%s'", name); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); uint32 seconds = atoi(row[0]); @@ -987,6 +1038,7 @@ bool ZoneDatabase::NoRentExpired(const char* name){ const NPCType* ZoneDatabase::GetNPCType (uint32 id) { const NPCType *npc=nullptr; std::map::iterator itr; + std::string query; // If NPC is already in tree, return it. if((itr = zone->npctable.find(id)) != zone->npctable.end()) @@ -994,99 +1046,51 @@ const NPCType* ZoneDatabase::GetNPCType (uint32 id) { // Otherwise, get NPCs from database. char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + MYSQL_RES *result; MYSQL_ROW row; // If id is 0, load all npc_types for the current zone, // according to spawn2. - const char *basic_query = "SELECT " - "npc_types.id," - "npc_types.name," - "npc_types.level," - "npc_types.race," - "npc_types.class," - "npc_types.hp," - "npc_types.mana," - "npc_types.gender," - "npc_types.texture," - "npc_types.helmtexture," - "npc_types.size," - "npc_types.loottable_id," - "npc_types.merchant_id," - "npc_types.alt_currency_id," - "npc_types.adventure_template_id," - "npc_types.trap_template," - "npc_types.attack_speed," - "npc_types.STR," - "npc_types.STA," - "npc_types.DEX," - "npc_types.AGI," - "npc_types._INT," - "npc_types.WIS," - "npc_types.CHA," - "npc_types.MR," - "npc_types.CR," - "npc_types.DR," - "npc_types.FR," - "npc_types.PR," - "npc_types.Corrup," - "npc_types.mindmg," - "npc_types.maxdmg," - "npc_types.attack_count," - "npc_types.npcspecialattks," - "npc_types.npc_spells_id," - "npc_types.d_meele_texture1," - "npc_types.d_meele_texture2," - "npc_types.prim_melee_type," - "npc_types.sec_melee_type," - "npc_types.runspeed," - "npc_types.findable," - "npc_types.trackable," - "npc_types.hp_regen_rate," - "npc_types.mana_regen_rate," - "npc_types.aggroradius," - "npc_types.bodytype," - "npc_types.npc_faction_id," - "npc_types.face," - "npc_types.luclin_hairstyle," - "npc_types.luclin_haircolor," - "npc_types.luclin_eyecolor," - "npc_types.luclin_eyecolor2," - "npc_types.luclin_beardcolor," - "npc_types.luclin_beard," - "npc_types.drakkin_heritage," - "npc_types.drakkin_tattoo," - "npc_types.drakkin_details," - "npc_types.armortint_id," - "npc_types.armortint_red," - "npc_types.armortint_green," - "npc_types.armortint_blue," - "npc_types.see_invis," - "npc_types.see_invis_undead," - "npc_types.lastname," - "npc_types.qglobal," - "npc_types.AC," - "npc_types.npc_aggro," - "npc_types.spawn_limit," - "npc_types.see_hide," - "npc_types.see_improved_hide," - "npc_types.ATK," - "npc_types.Accuracy," - "npc_types.slow_mitigation," - "npc_types.maxlevel," - "npc_types.scalerate," - "npc_types.private_corpse," - "npc_types.unique_spawn_by_name," - "npc_types.underwater," - "npc_types.emoteid," - "npc_types.spellscale," - "npc_types.healscale"; + StringFormat(query, "SELECT npc_types.id, npc_types.name, npc_types.level, " + "npc_types.race, npc_types.class, npc_types.hp, " + "npc_types.mana, npc_types.gender, npc_types.texture, " + "npc_types.helmtexture, npc_types.size, npc_types.loottable_id," + "npc_types.merchant_id, npc_types.alt_currency_id," + "npc_types.adventure_template_id, npc_types.trap_template," + "npc_types.attack_speed, npc_types.STR, npc_types.STA," + "npc_types.DEX, npc_types.AGI, npc_types._INT, npc_types.WIS," + "npc_types.CHA, npc_types.MR, npc_types.CR, npc_types.DR," + "npc_types.FR, npc_types.PR, npc_types.Corrup, npc_types.mindmg," + "npc_types.maxdmg, npc_types.attack_count, npc_types.npcspecialattks," + "npc_types.npc_spells_id, npc_types.d_meele_texture1," + "npc_types.d_meele_texture2, npc_types.prim_melee_type," + "npc_types.sec_melee_type, npc_types.runspeed," + "npc_types.findable, npc_types.trackable," + "npc_types.hp_regen_rate, npc_types.mana_regen_rate," + "npc_types.aggroradius, npc_types.bodytype," + "npc_types.npc_faction_id, npc_types.face," + "npc_types.luclin_hairstyle, npc_types.luclin_haircolor," + "npc_types.luclin_eyecolor, npc_types.luclin_eyecolor2," + "npc_types.luclin_beardcolor, npc_types.luclin_beard," + "npc_types.drakkin_heritage, npc_types.drakkin_tattoo," + "npc_types.drakkin_details, npc_types.armortint_id," + "npc_types.armortint_red, npc_types.armortint_green," + "npc_types.armortint_blue, npc_types.see_invis," + "npc_types.see_invis_undead, npc_types.lastname," + "npc_types.qglobal, npc_types.AC," + "npc_types.npc_aggro, npc_types.spawn_limit," + "npc_types.see_hide, npc_types.see_improved_hide," + "npc_types.ATK, npc_types.Accuracy," + "npc_types.slow_mitigation, npc_types.maxlevel," + "npc_types.scalerate, npc_types.private_corpse," + "npc_types.unique_spawn_by_name, npc_types.underwater," + "npc_types.emoteid, npc_types.spellscale," + "npc_types.healscale FROM npc_types WHERE id=%d", + id); - MakeAnyLenString(&query, "%s FROM npc_types WHERE id=%d", basic_query, id); - - if (RunQuery(query, strlen(query), errbuf, &result)) { + if (RunQuery(query, errbuf, &result)) { // Process each row returned. while((row = mysql_fetch_row(result))) { NPCType *tmpNPCType; @@ -1177,24 +1181,23 @@ const NPCType* ZoneDatabase::GetNPCType (uint32 id) { if (tmpNPCType->armor_tint[0] == 0) { char at_errbuf[MYSQL_ERRMSG_SIZE]; - char *at_query = nullptr; MYSQL_RES *at_result = nullptr; MYSQL_ROW at_row; - MakeAnyLenString(&at_query, - "SELECT " - "red1h,grn1h,blu1h," - "red2c,grn2c,blu2c," - "red3a,grn3a,blu3a," - "red4b,grn4b,blu4b," - "red5g,grn5g,blu5g," - "red6l,grn6l,blu6l," - "red7f,grn7f,blu7f," - "red8x,grn8x,blu8x," - "red9x,grn9x,blu9x " - "FROM npc_types_tint WHERE id=%d", armor_tint_id); + StringFormat(query, "SELECT " + "red1h, grn1h, blu1h," + "red2c, grn2c, blu2c," + "red3a, grn3a, blu3a," + "red4b, grn4b, blu4b," + "red5g, grn5g, blu5g," + "red6l, grn6l, blu6l," + "red7f, grn7f, blu7f," + "red8x, grn8x, blu8x," + "red9x, grn9x, blu9x " + "FROM npc_types_tint WHERE id=%d", + armor_tint_id); - if (RunQuery(at_query, strlen(at_query), at_errbuf, &at_result)) + if (RunQuery(query, at_errbuf, &at_result)) { if ((at_row = mysql_fetch_row(at_result))) { @@ -1221,7 +1224,6 @@ const NPCType* ZoneDatabase::GetNPCType (uint32 id) { mysql_free_result(at_result); } - safe_delete_array(at_query); } else { @@ -1281,7 +1283,6 @@ const NPCType* ZoneDatabase::GetNPCType (uint32 id) { } } else std::cerr << "Error loading NPCs from database. Bad query: " << errbuf << std::endl; - safe_delete_array(query); return npc; } @@ -1299,213 +1300,127 @@ const NPCType* ZoneDatabase::GetMercType(uint32 id, uint16 raceid, uint32 client return itr->second; //If the NPC type is 0, return nullptr. (sanity check) if(id == 0) - return nullptr; + return nullptr; // Otherwise, get NPCs from database. - char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - MYSQL_RES *result; - MYSQL_ROW row; + char errbuf[MYSQL_ERRMSG_SIZE]; + std::string query; + MYSQL_RES *result; + MYSQL_ROW row; - // If id is 0, load all npc_types for the current zone, - // according to spawn2. - const char *basic_query = "SELECT " - "vwMercNpcTypes.merc_npc_type_id," - "vwMercNpcTypes.name," - //"vwMercNpcTypes.clientlevel," - "vwMercNpcTypes.level," - "vwMercNpcTypes.race_id," - "vwMercNpcTypes.class_id," - "vwMercNpcTypes.hp," - "vwMercNpcTypes.mana," - "vwMercNpcTypes.gender," - "vwMercNpcTypes.texture," - "vwMercNpcTypes.helmtexture," - //"vwMercNpcTypes.size," - // "vwMercNpcTypes.loottable_id," - // "vwMercNpcTypes.merchant_id," - // "vwMercNpcTypes.alt_currency_id," - // "vwMercNpcTypes.adventure_template_id," - // "vwMercNpcTypes.trap_template," - "vwMercNpcTypes.attack_speed," - "vwMercNpcTypes.STR," - "vwMercNpcTypes.STA," - "vwMercNpcTypes.DEX," - "vwMercNpcTypes.AGI," - "vwMercNpcTypes._INT," - "vwMercNpcTypes.WIS," - "vwMercNpcTypes.CHA," - "vwMercNpcTypes.MR," - "vwMercNpcTypes.CR," - "vwMercNpcTypes.DR," - "vwMercNpcTypes.FR," - "vwMercNpcTypes.PR," - "vwMercNpcTypes.Corrup," - "vwMercNpcTypes.mindmg," - "vwMercNpcTypes.maxdmg," - "vwMercNpcTypes.attack_count," - "vwMercNpcTypes.npcspecialattks," - // "vwMercNpcTypes.npc_spells_id," - "vwMercNpcTypes.d_meele_texture1," - "vwMercNpcTypes.d_meele_texture2," - "vwMercNpcTypes.prim_melee_type," - "vwMercNpcTypes.sec_melee_type," - "vwMercNpcTypes.runspeed," - // "vwMercNpcTypes.findable," - // "vwMercNpcTypes.trackable," - "vwMercNpcTypes.hp_regen_rate," - "vwMercNpcTypes.mana_regen_rate," - // "vwMercNpcTypes.aggroradius," - "vwMercNpcTypes.bodytype," - // "vwMercNpcTypes.npc_faction_id," - //"vwMercNpcTypes.face," - //"vwMercNpcTypes.luclin_hairstyle," - //"vwMercNpcTypes.luclin_haircolor," - //"vwMercNpcTypes.luclin_eyecolor," - //"vwMercNpcTypes.luclin_eyecolor2," - //"vwMercNpcTypes.luclin_beardcolor," - //"vwMercNpcTypes.luclin_beard," - //"vwMercNpcTypes.drakkin_heritage," - //"vwMercNpcTypes.drakkin_tattoo," - //"vwMercNpcTypes.drakkin_details," - "vwMercNpcTypes.armortint_id," - "vwMercNpcTypes.armortint_red," - "vwMercNpcTypes.armortint_green," - "vwMercNpcTypes.armortint_blue," - // "vwMercNpcTypes.see_invis," - // "vwMercNpcTypes.see_invis_undead," - // "vwMercNpcTypes.lastname," - // "vwMercNpcTypes.qglobal," - "vwMercNpcTypes.AC," - // "vwMercNpcTypes.npc_aggro," - // "vwMercNpcTypes.spawn_limit," - // "vwMercNpcTypes.see_hide," - // "vwMercNpcTypes.see_improved_hide," - "vwMercNpcTypes.ATK," - "vwMercNpcTypes.Accuracy," - "vwMercNpcTypes.spellscale," - "vwMercNpcTypes.healscale"; - // "vwMercNpcTypes.slow_mitigation," - // "vwMercNpcTypes.maxlevel," - // "vwMercNpcTypes.scalerate," - // "vwMercNpcTypes.private_corpse," - // "vwMercNpcTypes.unique_spawn_by_name," - // "vwMercNpcTypes.underwater," - // "vwMercNpcTypes.emoteid"; + // If id is 0, load all npc_types for the current zone, + // according to spawn2. + StringFormat(query, "SELECT vwMercNpcTypes.merc_npc_type_id, " + "vwMercNpcTypes.name, vwMercNpcTypes.level, " + "vwMercNpcTypes.race_id, vwMercNpcTypes.class_id, " + "vwMercNpcTypes.hp, vwMercNpcTypes.mana, " + "vwMercNpcTypes.gender, vwMercNpcTypes.texture, " + "vwMercNpcTypes.helmtexture, vwMercNpcTypes.attack_speed, " + "vwMercNpcTypes.STR, vwMercNpcTypes.STA, " + "vwMercNpcTypes.DEX, vwMercNpcTypes.AGI, " + "vwMercNpcTypes._INT, vwMercNpcTypes.WIS, " + "vwMercNpcTypes.CHA, vwMercNpcTypes.MR, " + "vwMercNpcTypes.CR, vwMercNpcTypes.DR, " + "vwMercNpcTypes.FR, vwMercNpcTypes.PR, " + "vwMercNpcTypes.Corrup, vwMercNpcTypes.mindmg, " + "vwMercNpcTypes.maxdmg, vwMercNpcTypes.attack_count, " + "vwMercNpcTypes.npcspecialattks, vwMercNpcTypes.d_meele_texture1, " + "vwMercNpcTypes.d_meele_texture2, vwMercNpcTypes.prim_melee_type, " + "vwMercNpcTypes.sec_melee_type, vwMercNpcTypes.runspeed, " + "vwMercNpcTypes.hp_regen_rate, vwMercNpcTypes.mana_regen_rate, " + "vwMercNpcTypes.bodytype, vwMercNpcTypes.armortint_id, " + "vwMercNpcTypes.armortint_red, vwMercNpcTypes.armortint_green, " + "vwMercNpcTypes.armortint_blue, vwMercNpcTypes.AC, " + "vwMercNpcTypes.ATK, vwMercNpcTypes.Accuracy, " + "vwMercNpcTypes.spellscale, vwMercNpcTypes.healscale " + "FROM vwMercNpcTypes " + "WHERE merc_npc_type_id=%d AND clientlevel=%d AND race_id = %d", + id, clientlevel, raceid); //dual primary keys. one is ID, one is level. - MakeAnyLenString(&query, "%s FROM vwMercNpcTypes WHERE merc_npc_type_id=%d AND clientlevel=%d AND race_id = %d", basic_query, id, clientlevel, raceid); //dual primary keys. one is ID, one is level. + if (RunQuery(query, errbuf, &result)) { + // Process each row returned. + while((row = mysql_fetch_row(result))) { + NPCType *tmpNPCType; + tmpNPCType = new NPCType; + memset (tmpNPCType, 0, sizeof *tmpNPCType); - if (RunQuery(query, strlen(query), errbuf, &result)) { - // Process each row returned. - while((row = mysql_fetch_row(result))) { - NPCType *tmpNPCType; - tmpNPCType = new NPCType; - memset (tmpNPCType, 0, sizeof *tmpNPCType); + int r = 0; + tmpNPCType->npc_id = atoi(row[r++]); - int r = 0; - tmpNPCType->npc_id = atoi(row[r++]); + strn0cpy(tmpNPCType->name, row[r++], 50); - strn0cpy(tmpNPCType->name, row[r++], 50); + tmpNPCType->level = atoi(row[r++]); + tmpNPCType->race = atoi(row[r++]); + tmpNPCType->class_ = atoi(row[r++]); + tmpNPCType->max_hp = atoi(row[r++]); + tmpNPCType->cur_hp = tmpNPCType->max_hp; + tmpNPCType->Mana = atoi(row[r++]); + tmpNPCType->gender = atoi(row[r++]); + tmpNPCType->texture = atoi(row[r++]); + tmpNPCType->helmtexture = atoi(row[r++]); + tmpNPCType->attack_speed = atof(row[r++]); + tmpNPCType->STR = atoi(row[r++]); + tmpNPCType->STA = atoi(row[r++]); + tmpNPCType->DEX = atoi(row[r++]); + tmpNPCType->AGI = atoi(row[r++]); + tmpNPCType->INT = atoi(row[r++]); + tmpNPCType->WIS = atoi(row[r++]); + tmpNPCType->CHA = atoi(row[r++]); + tmpNPCType->MR = atoi(row[r++]); + tmpNPCType->CR = atoi(row[r++]); + tmpNPCType->DR = atoi(row[r++]); + tmpNPCType->FR = atoi(row[r++]); + tmpNPCType->PR = atoi(row[r++]); + tmpNPCType->Corrup = atoi(row[r++]); + tmpNPCType->min_dmg = atoi(row[r++]); + tmpNPCType->max_dmg = atoi(row[r++]); + tmpNPCType->attack_count = atoi(row[r++]); + strcpy(tmpNPCType->npc_attacks,row[r++]); + tmpNPCType->d_meele_texture1 = atoi(row[r++]); + tmpNPCType->d_meele_texture2 = atoi(row[r++]); + tmpNPCType->prim_melee_type = atoi(row[r++]); + tmpNPCType->sec_melee_type = atoi(row[r++]); + tmpNPCType->runspeed= atof(row[r++]); + tmpNPCType->hp_regen = atoi(row[r++]); + tmpNPCType->mana_regen = atoi(row[r++]); + tmpNPCType->aggroradius = RuleI(Mercs, AggroRadius); - tmpNPCType->level = atoi(row[r++]); - tmpNPCType->race = atoi(row[r++]); - tmpNPCType->class_ = atoi(row[r++]); - tmpNPCType->max_hp = atoi(row[r++]); - tmpNPCType->cur_hp = tmpNPCType->max_hp; - tmpNPCType->Mana = atoi(row[r++]); - tmpNPCType->gender = atoi(row[r++]); - tmpNPCType->texture = atoi(row[r++]); - tmpNPCType->helmtexture = atoi(row[r++]); - //tmpNPCType->size = atof(row[r++]); - //tmpNPCType->loottable_id = atoi(row[r++]); - //tmpNPCType->merchanttype = atoi(row[r++]); - //tmpNPCType->alt_currency_type = atoi(row[r++]); - //tmpNPCType->adventure_template = atoi(row[r++]); - //tmpNPCType->trap_template = atoi(row[r++]); - tmpNPCType->attack_speed = atof(row[r++]); - tmpNPCType->STR = atoi(row[r++]); - tmpNPCType->STA = atoi(row[r++]); - tmpNPCType->DEX = atoi(row[r++]); - tmpNPCType->AGI = atoi(row[r++]); - tmpNPCType->INT = atoi(row[r++]); - tmpNPCType->WIS = atoi(row[r++]); - tmpNPCType->CHA = atoi(row[r++]); - tmpNPCType->MR = atoi(row[r++]); - tmpNPCType->CR = atoi(row[r++]); - tmpNPCType->DR = atoi(row[r++]); - tmpNPCType->FR = atoi(row[r++]); - tmpNPCType->PR = atoi(row[r++]); - tmpNPCType->Corrup = atoi(row[r++]); - tmpNPCType->min_dmg = atoi(row[r++]); - tmpNPCType->max_dmg = atoi(row[r++]); - tmpNPCType->attack_count = atoi(row[r++]); - strcpy(tmpNPCType->npc_attacks,row[r++]); - //tmpNPCType->npc_spells_id = atoi(row[r++]); - tmpNPCType->d_meele_texture1 = atoi(row[r++]); - tmpNPCType->d_meele_texture2 = atoi(row[r++]); - tmpNPCType->prim_melee_type = atoi(row[r++]); - tmpNPCType->sec_melee_type = atoi(row[r++]); - tmpNPCType->runspeed= atof(row[r++]); - //tmpNPCType->findable = atoi(row[r++]) == 0? false : true; - //tmpNPCType->trackable = atoi(row[r++]) == 0? false : true; - tmpNPCType->hp_regen = atoi(row[r++]); - tmpNPCType->mana_regen = atoi(row[r++]); + if (row[r] && strlen(row[r])) + tmpNPCType->bodytype = (uint8)atoi(row[r]); + else + tmpNPCType->bodytype = 1; + r++; - //tmpNPCType->aggroradius = (int32)atoi(row[r++]); - tmpNPCType->aggroradius = RuleI(Mercs, AggroRadius); - // set defaultvalue for aggroradius - //if (tmpNPCType->aggroradius <= 0) - // tmpNPCType->aggroradius = 70; + uint32 armor_tint_id = atoi(row[r++]); + tmpNPCType->armor_tint[0] = (atoi(row[r++]) & 0xFF) << 16; + tmpNPCType->armor_tint[0] |= (atoi(row[r++]) & 0xFF) << 8; + tmpNPCType->armor_tint[0] |= (atoi(row[r++]) & 0xFF); + tmpNPCType->armor_tint[0] |= (tmpNPCType->armor_tint[0]) ? (0xFF << 24) : 0; - if (row[r] && strlen(row[r])) - tmpNPCType->bodytype = (uint8)atoi(row[r]); - else - tmpNPCType->bodytype = 1; - r++; - - //tmpNPCType->npc_faction_id = atoi(row[r++]); - - //tmpNPCType->luclinface = atoi(row[r++]); - //tmpNPCType->hairstyle = atoi(row[r++]); - //tmpNPCType->haircolor = atoi(row[r++]); - //tmpNPCType->eyecolor1 = atoi(row[r++]); - //tmpNPCType->eyecolor2 = atoi(row[r++]); - //tmpNPCType->beardcolor = atoi(row[r++]); - //tmpNPCType->beard = atoi(row[r++]); - //tmpNPCType->drakkin_heritage = atoi(row[r++]); - //tmpNPCType->drakkin_tattoo = atoi(row[r++]); - //tmpNPCType->drakkin_details = atoi(row[r++]); - uint32 armor_tint_id = atoi(row[r++]); - tmpNPCType->armor_tint[0] = (atoi(row[r++]) & 0xFF) << 16; - tmpNPCType->armor_tint[0] |= (atoi(row[r++]) & 0xFF) << 8; - tmpNPCType->armor_tint[0] |= (atoi(row[r++]) & 0xFF); - tmpNPCType->armor_tint[0] |= (tmpNPCType->armor_tint[0]) ? (0xFF << 24) : 0; - - int i; - if (armor_tint_id > 0) + int i; + if (armor_tint_id > 0) + { + if (tmpNPCType->armor_tint[0] == 0) { - if (tmpNPCType->armor_tint[0] == 0) - { - char at_errbuf[MYSQL_ERRMSG_SIZE]; - char *at_query = nullptr; - MYSQL_RES *at_result = nullptr; - MYSQL_ROW at_row; + char at_errbuf[MYSQL_ERRMSG_SIZE]; + MYSQL_RES *at_result = nullptr; + MYSQL_ROW at_row; - MakeAnyLenString(&at_query, - "SELECT " - "red1h,grn1h,blu1h," - "red2c,grn2c,blu2c," - "red3a,grn3a,blu3a," - "red4b,grn4b,blu4b," - "red5g,grn5g,blu5g," - "red6l,grn6l,blu6l," - "red7f,grn7f,blu7f," - "red8x,grn8x,blu8x," - "red9x,grn9x,blu9x " - "FROM npc_types_tint WHERE id=%d", armor_tint_id); + StringFormat(query, "SELECT " + "red1h, grn1h, blu1h," + "red2c, grn2c, blu2c," + "red3a, grn3a, blu3a," + "red4b, grn4b, blu4b," + "red5g, grn5g, blu5g," + "red6l, grn6l, blu6l," + "red7f, grn7f, blu7f," + "red8x, grn8x, blu8x," + "red9x, grn9x, blu9x " + "FROM npc_types_tint WHERE id=%d", + armor_tint_id); - if (RunQuery(at_query, strlen(at_query), at_errbuf, &at_result)) + if (RunQuery(query, at_errbuf, &at_result)) { if ((at_row = mysql_fetch_row(at_result))) { @@ -1532,7 +1447,6 @@ const NPCType* ZoneDatabase::GetMercType(uint32 id, uint16 raceid, uint32 client mysql_free_result(at_result); } - safe_delete_array(at_query); } else { @@ -1548,27 +1462,10 @@ const NPCType* ZoneDatabase::GetMercType(uint32 id, uint16 raceid, uint32 client } } - //tmpNPCType->see_invis = atoi(row[r++]); - //tmpNPCType->see_invis_undead = atoi(row[r++])==0?false:true; // Set see_invis_undead flag - //if (row[r] != nullptr) - // strn0cpy(tmpNPCType->lastname, row[r], 32); - //r++; - - //tmpNPCType->qglobal = atoi(row[r++])==0?false:true; // qglobal tmpNPCType->AC = atoi(row[r++]); - //tmpNPCType->npc_aggro = atoi(row[r++])==0?false:true; - //tmpNPCType->spawn_limit = atoi(row[r++]); - //tmpNPCType->see_hide = atoi(row[r++])==0?false:true; - //tmpNPCType->see_improved_hide = atoi(row[r++])==0?false:true; tmpNPCType->ATK = atoi(row[r++]); tmpNPCType->accuracy_rating = atoi(row[r++]); - //tmpNPCType->slow_mitigation = atof(row[r++]); - //tmpNPCType->maxlevel = atoi(row[r++]); tmpNPCType->scalerate = RuleI(Mercs, ScaleRate); - //tmpNPCType->private_corpse = atoi(row[r++]) == 1 ? true : false; - //tmpNPCType->unique_spawn_by_name = atoi(row[r++]) == 1 ? true : false; - //tmpNPCType->underwater = atoi(row[r++]) == 1 ? true : false; - //tmpNPCType->emoteid = atoi(row[r++]); tmpNPCType->spellscale = atoi(row[r++]); tmpNPCType->healscale = atoi(row[r++]); @@ -1591,7 +1488,6 @@ const NPCType* ZoneDatabase::GetMercType(uint32 id, uint16 raceid, uint32 client } } else std::cerr << "Error loading NPCs from database. Bad query: " << errbuf << std::endl; - safe_delete_array(query); return npc; } @@ -1601,7 +1497,7 @@ bool ZoneDatabase::LoadMercInfo(Client *c) { if(c->GetEPP().merc_name[0] != 0) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; @@ -1609,7 +1505,14 @@ bool ZoneDatabase::LoadMercInfo(Client *c) { //CleanMobName(c->GetEPP().merc_name, name); - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT MercID, Slot, Name, TemplateID, SuspendedTime, IsSuspended, TimerRemaining, Gender, StanceID, HP, Mana, Endurance, Face, LuclinHairStyle, LuclinHairColor, LuclinEyeColor, LuclinEyeColor2, LuclinBeardColor, LuclinBeard, DrakkinHeritage, DrakkinTattoo, DrakkinDetails FROM mercs WHERE OwnerCharacterID = '%i' ORDER BY Slot", c->CharacterID()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT MercID, Slot, Name, TemplateID, SuspendedTime, IsSuspended, " + "TimerRemaining, Gender, StanceID, HP, Mana, Endurance, Face, " + "LuclinHairStyle, LuclinHairColor, LuclinEyeColor, LuclinEyeColor2, " + "LuclinBeardColor, LuclinBeard, DrakkinHeritage, DrakkinTattoo, " + "DrakkinDetails FROM mercs WHERE OwnerCharacterID = '%i' ORDER BY Slot", + c->CharacterID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -1649,7 +1552,6 @@ bool ZoneDatabase::LoadMercInfo(Client *c) { mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return loaded; @@ -1660,7 +1562,7 @@ bool ZoneDatabase::LoadCurrentMerc(Client *c) { if(c->GetEPP().merc_name[0] != 0) { std::string errorMessage; - char* Query = 0; + std::string query ; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; @@ -1672,7 +1574,14 @@ bool ZoneDatabase::LoadCurrentMerc(Client *c) { return false; } - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT MercID, Name, TemplateID, SuspendedTime, IsSuspended, TimerRemaining, Gender, StanceID, HP, Mana, Endurance, Face, LuclinHairStyle, LuclinHairColor, LuclinEyeColor, LuclinEyeColor2, LuclinBeardColor, LuclinBeard, DrakkinHeritage, DrakkinTattoo, DrakkinDetails FROM mercs WHERE OwnerCharacterID = '%i' AND Slot = '%u'", c->CharacterID(), slot), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query, "SELECT MercID, Name, TemplateID, SuspendedTime, IsSuspended, " + "TimerRemaining, Gender, StanceID, HP, Mana, Endurance, Face, " + "LuclinHairStyle, LuclinHairColor, LuclinEyeColor, LuclinEyeColor2, " + "LuclinBeardColor, LuclinBeard, DrakkinHeritage, DrakkinTattoo, " + "DrakkinDetails FROM mercs WHERE OwnerCharacterID = '%i' AND Slot = '%u'", + c->CharacterID(), slot); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -1705,7 +1614,6 @@ bool ZoneDatabase::LoadCurrentMerc(Client *c) { mysql_free_result(DatasetResult); } - safe_delete_array(Query); } return loaded; @@ -1720,14 +1628,32 @@ bool ZoneDatabase::SaveMerc(Merc *merc) { return false; } - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; uint32 affectedRows = 0; if(merc->GetMercID() == 0) { // New merc record uint32 TempNewMercID = 0; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO mercs (OwnerCharacterID, Slot, Name, TemplateID, SuspendedTime, IsSuspended, TimerRemaining, Gender, StanceID, HP, Mana, Endurance, Face, LuclinHairStyle, LuclinHairColor, LuclinEyeColor, LuclinEyeColor2, LuclinBeardColor, LuclinBeard, DrakkinHeritage, DrakkinTattoo, DrakkinDetails) VALUES('%u', '%u', '%s', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%i')", merc->GetMercCharacterID(), owner->GetNumMercs(), merc->GetCleanName(), merc->GetMercTemplateID(), owner->GetMercInfo().SuspendedTime, merc->IsSuspended(), owner->GetMercInfo().MercTimerRemaining, merc->GetGender(), merc->GetStance(), merc->GetHP(), merc->GetMana(), merc->GetEndurance(), merc->GetLuclinFace(), merc->GetHairStyle(), merc->GetHairColor(), merc->GetEyeColor1(), merc->GetEyeColor2(), merc->GetBeardColor(), merc->GetBeard(), merc->GetDrakkinHeritage(), merc->GetDrakkinTattoo(), merc->GetDrakkinDetails() ), TempErrorMessageBuffer, 0, &affectedRows, &TempNewMercID)) { + + StringFormat(query, "INSERT INTO mercs (OwnerCharacterID, Slot, Name, TemplateID, " + "SuspendedTime, IsSuspended, TimerRemaining, Gender, StanceID, " + "HP, Mana, Endurance, Face, LuclinHairStyle, LuclinHairColor, " + "LuclinEyeColor, LuclinEyeColor2, LuclinBeardColor, LuclinBeard, " + "DrakkinHeritage, DrakkinTattoo, DrakkinDetails) " + "VALUES('%u', '%u', '%s', '%u', '%u', '%u', '%u', '%u', '%u', " + "'%u', '%u', '%u', '%i', '%i', '%i', '%i', '%i', '%i', '%i', " + "'%i', '%i', '%i')", + merc->GetMercCharacterID(), owner->GetNumMercs(), merc->GetCleanName(), + merc->GetMercTemplateID(), owner->GetMercInfo().SuspendedTime, + merc->IsSuspended(), owner->GetMercInfo().MercTimerRemaining, + merc->GetGender(), merc->GetStance(), merc->GetHP(), merc->GetMana(), + merc->GetEndurance(), merc->GetLuclinFace(), merc->GetHairStyle(), + merc->GetHairColor(), merc->GetEyeColor1(), merc->GetEyeColor2(), + merc->GetBeardColor(), merc->GetBeard(), merc->GetDrakkinHeritage(), + merc->GetDrakkinTattoo(), merc->GetDrakkinDetails()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, 0, &affectedRows, &TempNewMercID)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -1737,7 +1663,24 @@ bool ZoneDatabase::SaveMerc(Merc *merc) { } else { // Update existing merc record - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "UPDATE mercs SET OwnerCharacterID = '%u', Slot = '%u', Name = '%s', TemplateID = '%u', SuspendedTime = '%u', IsSuspended = '%u', TimerRemaining = '%u', Gender = '%u', StanceID = '%u', HP = '%u', Mana = '%u', Endurance = '%u', Face = '%i', LuclinHairStyle = '%i', LuclinHairColor = '%i', LuclinEyeColor = '%i', LuclinEyeColor2 = '%i', LuclinBeardColor = '%i', LuclinBeard = '%i', DrakkinHeritage = '%i', DrakkinTattoo = '%i', DrakkinDetails = '%i' WHERE MercID = '%u'", merc->GetMercCharacterID(), owner->GetMercSlot(), merc->GetCleanName(), merc->GetMercTemplateID(), owner->GetMercInfo().SuspendedTime, merc->IsSuspended(), owner->GetMercInfo().MercTimerRemaining, merc->GetGender(), merc->GetStance(), merc->GetHP(), merc->GetMana(), merc->GetEndurance(), merc->GetLuclinFace(), merc->GetHairStyle(), merc->GetHairColor(), merc->GetEyeColor1(), merc->GetEyeColor2(), merc->GetBeardColor(), merc->GetBeard(), merc->GetDrakkinHeritage(), merc->GetDrakkinTattoo(), merc->GetDrakkinDetails(), merc->GetMercID()), TempErrorMessageBuffer, 0, &affectedRows)) { + + StringFormat(query,"UPDATE mercs SET OwnerCharacterID = '%u', Slot = '%u', Name = '%s', " + "TemplateID = '%u', SuspendedTime = '%u', IsSuspended = '%u', " + "TimerRemaining = '%u', Gender = '%u', StanceID = '%u', HP = '%u', " + "Mana = '%u', Endurance = '%u', Face = '%i', LuclinHairStyle = '%i', " + "LuclinHairColor = '%i', LuclinEyeColor = '%i', LuclinEyeColor2 = '%i', " + "LuclinBeardColor = '%i', LuclinBeard = '%i', DrakkinHeritage = '%i', " + "DrakkinTattoo = '%i', DrakkinDetails = '%i' WHERE MercID = '%u'", + merc->GetMercCharacterID(), owner->GetMercSlot(), merc->GetCleanName(), + merc->GetMercTemplateID(), owner->GetMercInfo().SuspendedTime, + merc->IsSuspended(), owner->GetMercInfo().MercTimerRemaining, + merc->GetGender(), merc->GetStance(), merc->GetHP(), merc->GetMana(), + merc->GetEndurance(), merc->GetLuclinFace(), merc->GetHairStyle(), + merc->GetHairColor(), merc->GetEyeColor1(), merc->GetEyeColor2(), + merc->GetBeardColor(), merc->GetBeard(), merc->GetDrakkinHeritage(), + merc->GetDrakkinTattoo(), merc->GetDrakkinDetails(), merc->GetMercID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, 0, &affectedRows)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -1746,7 +1689,6 @@ bool ZoneDatabase::SaveMerc(Merc *merc) { } } - safe_delete_array(Query); if(!errorMessage.empty() || (Result && affectedRows != 1)) { if(owner && !errorMessage.empty()) @@ -1769,7 +1711,7 @@ bool ZoneDatabase::SaveMerc(Merc *merc) { void ZoneDatabase::SaveMercBuffs(Merc *merc) { Buffs_Struct *buffs = merc->GetBuffs(); std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; int BuffCount = 0; int InsertCount = 0; @@ -1779,10 +1721,11 @@ void ZoneDatabase::SaveMercBuffs(Merc *merc) { if(buffs[BuffCount].spellid > 0 && buffs[BuffCount].spellid != SPELL_UNKNOWN) { if(InsertCount == 0) { // Remove any existing buff saves - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM merc_buffs WHERE MercId = %u", merc->GetMercID()), TempErrorMessageBuffer)) { + + StringFormat(query,"DELETE FROM merc_buffs WHERE MercId = %u", merc->GetMercID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; break; } } @@ -1794,26 +1737,26 @@ void ZoneDatabase::SaveMercBuffs(Merc *merc) { else IsPersistent = 0; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "INSERT INTO merc_buffs (MercId, SpellId, CasterLevel, DurationFormula, " - "TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, HitCount, MeleeRune, MagicRune, " - "DeathSaveSuccessChance, CasterAARank, Persistent) VALUES (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u);", - merc->GetMercID(), buffs[BuffCount].spellid, buffs[BuffCount].casterlevel, spells[buffs[BuffCount].spellid].buffdurationformula, - buffs[BuffCount].ticsremaining, - CalculatePoisonCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, - CalculateDiseaseCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, - CalculateCurseCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, - CalculateCorruptionCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, - buffs[BuffCount].numhits, buffs[BuffCount].melee_rune, buffs[BuffCount].magic_rune, - buffs[BuffCount].deathSaveSuccessChance, - buffs[BuffCount].deathsaveCasterAARank, IsPersistent), TempErrorMessageBuffer)) { + StringFormat(query, "INSERT INTO merc_buffs (MercId, SpellId, CasterLevel, DurationFormula, " + "TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, " + "CorruptionCounters, HitCount, MeleeRune, MagicRune, " + "DeathSaveSuccessChance, CasterAARank, Persistent) VALUES " + "(%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u);", + merc->GetMercID(), buffs[BuffCount].spellid, buffs[BuffCount].casterlevel, + spells[buffs[BuffCount].spellid].buffdurationformula, + buffs[BuffCount].ticsremaining, + CalculatePoisonCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, + CalculateDiseaseCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, + CalculateCurseCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, + CalculateCorruptionCounters(buffs[BuffCount].spellid) > 0 ? buffs[BuffCount].counters : 0, + buffs[BuffCount].numhits, buffs[BuffCount].melee_rune, buffs[BuffCount].magic_rune, + buffs[BuffCount].deathSaveSuccessChance, buffs[BuffCount].deathsaveCasterAARank, IsPersistent); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); - safe_delete(Query); - Query = 0; break; } else { - safe_delete(Query); - Query = 0; InsertCount++; } } @@ -1830,14 +1773,20 @@ void ZoneDatabase::LoadMercBuffs(Merc *merc) { Buffs_Struct *buffs = merc->GetBuffs(); uint32 max_slots = merc->GetMaxBuffSlots(); std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; bool BuffsLoaded = false; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT SpellId, CasterLevel, DurationFormula, TicsRemaining, PoisonCounters, DiseaseCounters, CurseCounters, CorruptionCounters, HitCount, MeleeRune, MagicRune, DeathSaveSuccessChance, CasterAARank, Persistent FROM merc_buffs WHERE MercId = %u", merc->GetMercID()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT SpellId, CasterLevel, DurationFormula, TicsRemaining, " + "PoisonCounters, DiseaseCounters, CurseCounters, " + "CorruptionCounters, HitCount, MeleeRune, MagicRune, " + "DeathSaveSuccessChance, CasterAARank, Persistent " + "FROM merc_buffs WHERE MercId = %u", merc->GetMercID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -1882,13 +1831,13 @@ void ZoneDatabase::LoadMercBuffs(Merc *merc) { BuffsLoaded = true; } - safe_delete_array(Query); - if(errorMessage.empty() && BuffsLoaded) { - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM merc_buffs WHERE MercId = %u", merc->GetMercID()), TempErrorMessageBuffer)) { + + StringFormat(query,"DELETE FROM merc_buffs WHERE MercId = %u", merc->GetMercID()); + + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); } - safe_delete_array(Query); } if(!errorMessage.empty()) { @@ -1902,26 +1851,25 @@ bool ZoneDatabase::DeleteMerc(uint32 merc_id) { int TempCounter = 0; if(merc_id > 0) { - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; // TODO: These queries need to be ran together as a transaction.. ie, if one or more fail then they all will fail to commit to the database. - - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM merc_buffs WHERE MercID = '%u'", merc_id), TempErrorMessageBuffer)) { + StringFormat(query, "DELETE FROM merc_buffs WHERE MercID = '%u'", merc_id); + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); } else TempCounter++; - safe_delete_array(Query); + StringFormat(query, "DELETE FROM mercs WHERE MercID = '%u'", merc_id); - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "DELETE FROM mercs WHERE MercID = '%u'", merc_id), TempErrorMessageBuffer)) { + if(!database.RunQuery(query, TempErrorMessageBuffer)) { errorMessage = std::string(TempErrorMessageBuffer); } else TempCounter++; - safe_delete_array(Query); if(TempCounter == 2) Result = true; @@ -1936,12 +1884,18 @@ bool ZoneDatabase::DeleteMerc(uint32 merc_id) { void ZoneDatabase::LoadMercEquipment(Merc *merc) { std::string errorMessage; - char* Query = 0; + std::string query; char TempErrorMessageBuffer[MYSQL_ERRMSG_SIZE]; MYSQL_RES* DatasetResult; MYSQL_ROW DataRow; - if(!database.RunQuery(Query, MakeAnyLenString(&Query, "SELECT item_id FROM merc_inventory WHERE merc_subtype_id = (SELECT merc_subtype_id FROM merc_subtypes WHERE class_id = '%u' AND tier_id = '%u') AND min_level <= %u AND max_level >= %u", merc->GetClass(), merc->GetTierID(), merc->GetLevel(), merc->GetLevel()), TempErrorMessageBuffer, &DatasetResult)) { + StringFormat(query,"SELECT item_id FROM merc_inventory WHERE " + "merc_subtype_id = (SELECT merc_subtype_id FROM " + "merc_subtypes WHERE class_id = '%u' AND tier_id = '%u') " + "AND min_level <= %u AND max_level >= %u", + merc->GetClass(), merc->GetTierID(), merc->GetLevel(), merc->GetLevel()); + + if(!database.RunQuery(query, TempErrorMessageBuffer, &DatasetResult)) { errorMessage = std::string(TempErrorMessageBuffer); } else { @@ -1961,22 +1915,21 @@ void ZoneDatabase::LoadMercEquipment(Merc *merc) { mysql_free_result(DatasetResult); } - safe_delete_array(Query); - Query = 0; - if(!errorMessage.empty()) { LogFile->write(EQEMuLog::Error, "Error Loading Merc Inventory: %s", errorMessage.c_str()); } } uint8 ZoneDatabase::GetGridType(uint32 grid, uint32 zoneid ) { - char *query = 0; + std::string query; char errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *result; MYSQL_ROW row; int type = 0; - if (RunQuery(query, MakeAnyLenString(&query,"SELECT type from grid where id = %i and zoneid = %i",grid,zoneid),errbuf,&result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT type from grid where id = %i and zoneid = %i", grid, zoneid); + + if (RunQuery(query, errbuf,&result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); type = atoi( row[0] ); @@ -1984,7 +1937,6 @@ uint8 ZoneDatabase::GetGridType(uint32 grid, uint32 zoneid ) { mysql_free_result(result); } else { std::cerr << "Error in GetGridType query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return type; } @@ -1993,34 +1945,42 @@ uint8 ZoneDatabase::GetGridType(uint32 grid, uint32 zoneid ) { void ZoneDatabase::SaveMerchantTemp(uint32 npcid, uint32 slot, uint32 item, uint32 charges){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "replace into merchantlist_temp (npcid,slot,itemid,charges) values(%d,%d,%d,%d)", npcid, slot, item, charges), errbuf)) { + StringFormat(query,"replace into merchantlist_temp " + "(npcid, slot, itemid, charges) " + "values(%d, %d, %d, %d)", + npcid, slot, item, charges); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in SaveMerchantTemp query '" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); } + void ZoneDatabase::DeleteMerchantTemp(uint32 npcid, uint32 slot){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "delete from merchantlist_temp where npcid=%d and slot=%d", npcid, slot), errbuf)) { + StringFormat(query, "delete from merchantlist_temp where npcid=%d and slot=%d", npcid, slot); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in DeleteMerchantTemp query '" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); } bool ZoneDatabase::UpdateZoneSafeCoords(const char* zonename, float x=0, float y=0, float z=0) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE zone SET safe_x='%f', safe_y='%f', safe_z='%f' WHERE short_name='%s';", x, y, z, zonename), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + StringFormat(query, "UPDATE zone SET safe_x='%f', safe_y='%f', safe_z='%f' " + "WHERE short_name='%s';", + x, y, z, zonename); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { return false; } - safe_delete_array(query); if (affected_rows == 0) { @@ -2034,11 +1994,12 @@ bool ZoneDatabase::UpdateZoneSafeCoords(const char* zonename, float x=0, float y uint8 ZoneDatabase::GetUseCFGSafeCoords() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT value FROM variables WHERE varname='UseCFGSafeCoords'"), errbuf, &result)) { - safe_delete_array(query); + + std::string query = "SELECT value FROM variables WHERE varname='UseCFGSafeCoords'"; + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); @@ -2056,9 +2017,7 @@ uint8 ZoneDatabase::GetUseCFGSafeCoords() } else { - std::cerr << "Error in GetUseCFGSafeCoords query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } @@ -2069,16 +2028,14 @@ uint8 ZoneDatabase::GetUseCFGSafeCoords() uint32 ZoneDatabase::GetServerFilters(char* name, ServerSideFilters_Struct *ssfs) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; - MYSQL_ROW row; - - unsigned long* lengths; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT serverfilters FROM account WHERE name='%s'", name), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT serverfilters FROM account WHERE name='%s'", name); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) == 1) { row = mysql_fetch_row(result); lengths = mysql_fetch_lengths(result); @@ -2102,7 +2059,6 @@ uint32 ZoneDatabase::GetServerFilters(char* name, ServerSideFilters_Struct *ssfs } else { std::cerr << "Error in ServerSideFilters query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return 0; } @@ -2111,29 +2067,19 @@ uint32 ZoneDatabase::GetServerFilters(char* name, ServerSideFilters_Struct *ssfs bool ZoneDatabase::SetServerFilters(char* name, ServerSideFilters_Struct *ssfs) { char errbuf[MYSQL_ERRMSG_SIZE]; - char query[256+sizeof(ServerSideFilters_Struct)*2+1]; - char* end = query; - - //if (strlen(name) > 15) - // return false; - - /*for (int i=0; i 'z') && - (name[i] < 'A' || name[i] > 'Z') && - (name[i] < '0' || name[i] > '9')) - return 0; -}*/ - - - end += sprintf(end, "UPDATE account SET serverfilters="); - *end++ = '\''; - end += DoEscapeString(end, (char*)ssfs, sizeof(ServerSideFilters_Struct)); - *end++ = '\''; - end += sprintf(end," WHERE name='%s'", name); - + std::string serverSideFilterBuffer; uint32 affected_rows = 0; - if (!RunQuery(query, (uint32) (end - query), errbuf, 0, &affected_rows)) { + + std::string query = "UPDATE account SET serverfilters=\'"; + DoEscapeString(serverSideFilterBuffer, (char*)ssfs, sizeof(ServerSideFilters_Struct)); + query.append(serverSideFilterBuffer); + query.append("\' "); + + std::string endOfQuery; + StringFormat(endOfQuery, "WHERE name='%s'", name); + query.append(endOfQuery); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { std::cerr << "Error in SetServerSideFilters query " << errbuf << std::endl; return false; } @@ -2149,13 +2095,16 @@ bool ZoneDatabase::SetServerFilters(char* name, ServerSideFilters_Struct *ssfs) //New functions for timezone uint32 ZoneDatabase::GetZoneTZ(uint32 zoneid, uint32 version) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; + + StringFormat(query, "SELECT timezone FROM zone WHERE " + "zoneidnumber=%i AND (version=%i OR version=0) " + "ORDER BY version DESC", zoneid, version); - if (RunQuery(query, MakeAnyLenString(&query, "SELECT timezone FROM zone WHERE zoneidnumber=%i AND (version=%i OR version=0) ORDER BY version DESC", zoneid, version), errbuf, &result)) + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) > 0) { row = mysql_fetch_row(result); uint32 tmp = atoi(row[0]); @@ -2166,18 +2115,19 @@ uint32 ZoneDatabase::GetZoneTZ(uint32 zoneid, uint32 version) { } else { std::cerr << "Error in GetZoneTZ query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return 0; } bool ZoneDatabase::SetZoneTZ(uint32 zoneid, uint32 version, uint32 tz) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - if (RunQuery(query, MakeAnyLenString(&query, "UPDATE zone SET timezone=%i WHERE zoneidnumber=%i AND version=%i", tz, zoneid, version), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + StringFormat(query,"UPDATE zone SET timezone=%i WHERE zoneidnumber=%i AND version=%i", + tz, zoneid, version); + + if (RunQuery(query, errbuf, 0, &affected_rows)) { if (affected_rows == 1) return true; @@ -2186,7 +2136,6 @@ bool ZoneDatabase::SetZoneTZ(uint32 zoneid, uint32 version, uint32 tz) { } else { std::cerr << "Error in SetZoneTZ query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } @@ -2198,13 +2147,16 @@ bool ZoneDatabase::SetZoneTZ(uint32 zoneid, uint32 version, uint32 tz) { //Functions for weather uint8 ZoneDatabase::GetZoneWeather(uint32 zoneid, uint32 version) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT weather FROM zone WHERE zoneidnumber=%i AND (version=%i OR version=0) ORDER BY version DESC", zoneid, version), errbuf, &result)) + StringFormat(query, "SELECT weather FROM zone WHERE zoneidnumber=%i AND " + "(version=%i OR version=0) ORDER BY version DESC", + zoneid, version); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); if (mysql_num_rows(result) > 0) { row = mysql_fetch_row(result); uint8 tmp = atoi(row[0]); @@ -2216,18 +2168,19 @@ uint8 ZoneDatabase::GetZoneWeather(uint32 zoneid, uint32 version) { else { std::cerr << "Error in GetZoneWeather query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return 0; } -bool ZoneDatabase::SetZoneWeather(uint32 zoneid, uint32 version, uint8 w) { +bool ZoneDatabase::SetZoneWeather(uint32 zoneid, uint32 version, uint8 weatherID) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - if (RunQuery(query, MakeAnyLenString(&query, "UPDATE zone SET weather=%i WHERE zoneidnumber=%i AND version=%i", w, zoneid, version), errbuf, 0, &affected_rows)) { - safe_delete_array(query); + StringFormat(query, "UPDATE zone SET weather=%i WHERE zoneidnumber=%i AND version=%i", + weatherID, zoneid, version); + + if (RunQuery(query, errbuf, 0, &affected_rows)) { if (affected_rows == 1) return true; else @@ -2235,7 +2188,6 @@ bool ZoneDatabase::SetZoneWeather(uint32 zoneid, uint32 version, uint8 w) { } else { std::cerr << "Error in SetZoneWeather query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } @@ -2249,19 +2201,21 @@ bool ZoneDatabase::SetZoneWeather(uint32 zoneid, uint32 version, uint8 w) { */ bool ZoneDatabase::GetAccountInfoForLogin(uint32 account_id, int16* admin, char* account_name, uint32* lsaccountid, uint8* gmspeed, bool* revoked,bool* gmhideme) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT status, name, lsaccount_id, gmspeed, revoked, hideme FROM account WHERE id=%i", account_id), errbuf, &result)) { - safe_delete_array(query); - bool ret = GetAccountInfoForLogin_result(result, admin, account_name, lsaccountid, gmspeed, revoked,gmhideme); + + StringFormat(query, "SELECT status, name, lsaccount_id, gmspeed, revoked, hideme " + "FROM account WHERE id=%i", account_id); + + if (RunQuery(query, errbuf, &result)) { + bool ret = GetAccountInfoForLogin_result(result, admin, account_name, lsaccountid, gmspeed, revoked, gmhideme); mysql_free_result(result); return ret; } else { std::cerr << "Error in GetAccountInfoForLogin query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } @@ -2283,16 +2237,18 @@ void ZoneDatabase::RefreshGroupFromDB(Client *c){ GroupUpdate2_Struct* gu = (GroupUpdate2_Struct*)outapp->pBuffer; gu->action = groupActUpdate; char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; strcpy(gu->yourname, c->GetName()); GetGroupLeadershipInfo(g->GetID(), gu->leadersname, nullptr, nullptr, nullptr, nullptr, &gu->leader_aas); gu->NPCMarkerID = g->GetNPCMarkerID(); - int index = 0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT name from group_id where groupid=%d", g->GetID()), errbuf, &result)) { + + StringFormat(query, "SELECT name from group_id where groupid=%d", g->GetID()); + + if (RunQuery(query, errbuf, &result)) { while((row = mysql_fetch_row(result))){ if(index < 6){ if(strcmp(c->GetName(), row[0]) != 0){ @@ -2307,7 +2263,6 @@ void ZoneDatabase::RefreshGroupFromDB(Client *c){ { printf("Error in group update query: %s\n", errbuf); } - safe_delete_array(query); c->QueuePacket(outapp); safe_delete(outapp); @@ -2329,50 +2284,55 @@ void ZoneDatabase::RefreshGroupFromDB(Client *c){ uint8 ZoneDatabase::GroupCount(uint32 groupid){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint8 count=0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT count(charid) FROM group_id WHERE groupid=%d", groupid), errbuf, &result)) { + + StringFormat(query, "SELECT count(charid) FROM group_id WHERE groupid=%d", groupid); + + if (RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result))!=nullptr) count = atoi(row[0]); mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::GroupCount query '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::GroupCount query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); return count; } uint8 ZoneDatabase::RaidGroupCount(uint32 raidid, uint32 groupid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint8 count=0; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT count(charid) FROM raid_members WHERE raidid=%d AND groupid=%d;", raidid, groupid), errbuf, &result)) { + + StringFormat(query, "SELECT count(charid) FROM raid_members " + "WHERE raidid=%d AND groupid=%d;", raidid, groupid); + + if (RunQuery(query, errbuf, &result)) { if((row = mysql_fetch_row(result))!=nullptr) count = atoi(row[0]); mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::RaidGroupCount query '%s': %s", query, errbuf); + LogFile->write(EQEMuLog::Error, "Error in ZoneDatabase::RaidGroupCount query '%s': %s", query.c_str(), errbuf); } - safe_delete_array(query); return count; } int32 ZoneDatabase::GetBlockedSpellsCount(uint32 zoneid) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - query = new char[256]; - sprintf(query, "SELECT count(*) FROM blocked_spells WHERE zoneid=%d", zoneid); - if (RunQuery(query, strlen(query), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT count(*) FROM blocked_spells WHERE zoneid=%d", zoneid); + + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if (row != nullptr && row[0] != 0) { int32 ret = atoi(row[0]); @@ -2383,7 +2343,6 @@ int32 ZoneDatabase::GetBlockedSpellsCount(uint32 zoneid) } else { std::cerr << "Error in GetBlockedSpellsCount query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return -1; } @@ -2395,14 +2354,14 @@ bool ZoneDatabase::LoadBlockedSpells(int32 blockedSpellsCount, ZoneSpellsBlocked LogFile->write(EQEMuLog::Status, "Loading Blocked Spells from database..."); char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - MakeAnyLenString(&query, "SELECT id, spellid, type, x, y, z, x_diff, y_diff, z_diff, message " - "FROM blocked_spells WHERE zoneid=%d ORDER BY id asc", zoneid); - if (RunQuery(query, strlen(query), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query, "SELECT id, spellid, type, x, y, z, x_diff, y_diff, z_diff, message " + "FROM blocked_spells WHERE zoneid=%d ORDER BY id asc", zoneid); + + if (RunQuery(query, errbuf, &result)) { int32 r; for(r = 0; (row = mysql_fetch_row(result)); r++) { if(r >= blockedSpellsCount) { @@ -2427,7 +2386,6 @@ bool ZoneDatabase::LoadBlockedSpells(int32 blockedSpellsCount, ZoneSpellsBlocked else { std::cerr << "Error in LoadBlockedSpells query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } return true; @@ -2436,30 +2394,31 @@ bool ZoneDatabase::LoadBlockedSpells(int32 blockedSpellsCount, ZoneSpellsBlocked int ZoneDatabase::getZoneShutDownDelay(uint32 zoneID, uint32 version) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT shutdowndelay FROM zone WHERE zoneidnumber=%i AND (version=%i OR version=0) ORDER BY version DESC", zoneID, version), errbuf, &result)) + StringFormat(query,"SELECT shutdowndelay FROM zone WHERE " + "zoneidnumber=%i AND (version=%i OR version=0) ORDER BY version DESC", + zoneID, version); + + if (RunQuery(query, errbuf, &result)) { if (mysql_num_rows(result) > 0) { row = mysql_fetch_row(result); int retVal = atoi(row[0]); mysql_free_result(result); - safe_delete_array(query); return (retVal); } else { std::cerr << "Error in getZoneShutDownDelay no result '" << query << "' " << errbuf << std::endl; mysql_free_result(result); - safe_delete_array(query); return (RuleI(Zone, AutoShutdownDelay)); } } else { std::cerr << "Error in getZoneShutDownDelay query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return (RuleI(Zone, AutoShutdownDelay)); } @@ -2467,19 +2426,19 @@ int ZoneDatabase::getZoneShutDownDelay(uint32 zoneID, uint32 version) uint32 ZoneDatabase::GetKarma(uint32 acct_id) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; uint32 ret_val = 0; - if (!RunQuery(query,MakeAnyLenString(&query, "select `karma` from `account` where `id`='%i' limit 1", - acct_id),errbuf,&result)) + StringFormat(query, "select `karma` from `account` where `id`='%i' limit 1", + acct_id); + + if (!RunQuery(query,errbuf,&result)) { - safe_delete_array(query); return 0; } - safe_delete_array(query); row = mysql_fetch_row(result); ret_val = atoi(row[0]); @@ -2492,14 +2451,13 @@ uint32 ZoneDatabase::GetKarma(uint32 acct_id) void ZoneDatabase::UpdateKarma(uint32 acct_id, uint32 amount) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - if (RunQuery(query, MakeAnyLenString(&query, "UPDATE account set karma=%i where id=%i", amount, acct_id), errbuf, 0, &affected_rows)){ - safe_delete_array(query);} - else { + StringFormat(query, "UPDATE account set karma=%i where id=%i", amount, acct_id); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { std::cerr << "Error in UpdateKarma query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } } @@ -2509,16 +2467,16 @@ void ZoneDatabase::ListAllInstances(Client* c, uint32 charid) return; char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - - if (RunQuery(query,MakeAnyLenString(&query, "SELECT instance_lockout.id, zone, version FROM instance_lockout JOIN" - " instance_lockout_player ON instance_lockout.id = instance_lockout_player.id" - " WHERE instance_lockout_player.charid=%lu", (unsigned long)charid),errbuf,&result)) + StringFormat(query, "SELECT instance_lockout.id, zone, version FROM instance_lockout JOIN " + "instance_lockout_player ON instance_lockout.id = instance_lockout_player.id " + "WHERE instance_lockout_player.charid=%lu", (unsigned long)charid); + + if (RunQuery(query,errbuf,&result)) { - safe_delete_array(query); char name[64]; database.GetCharName(charid, name); @@ -2531,38 +2489,51 @@ void ZoneDatabase::ListAllInstances(Client* c, uint32 charid) mysql_free_result(result); } - else - { - safe_delete_array(query); - } } void ZoneDatabase::QGlobalPurge() { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; - database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM quest_globals WHERE expdate < UNIX_TIMESTAMP()"), - errbuf); - safe_delete_array(query); + + std::string query = "DELETE FROM quest_globals WHERE expdate < UNIX_TIMESTAMP()"; + + database.RunQuery(query, errbuf); } void ZoneDatabase::InsertDoor(uint32 ddoordbid, uint16 ddoorid, const char* ddoor_name, float dxpos, float dypos, float dzpos, float dheading, uint8 dopentype, uint16 dguildid, uint32 dlockpick, uint32 dkeyitem, uint8 ddoor_param, uint8 dinvert, int dincline, uint16 dsize){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; - if (!RunQuery(query, MakeAnyLenString(&query, "replace into doors (id, doorid,zone,version,name,pos_x,pos_y,pos_z,heading,opentype,guild,lockpick,keyitem,door_param,invert_state,incline,size) values('%i','%i','%s','%i', '%s','%f','%f','%f','%f','%i','%i','%i', '%i','%i','%i','%i','%i')", ddoordbid ,ddoorid ,zone->GetShortName(), zone->GetInstanceVersion(), ddoor_name, dxpos, dypos, dzpos, dheading, dopentype, dguildid, dlockpick, dkeyitem, ddoor_param, dinvert, dincline, dsize), errbuf)) { + std::string query; + + StringFormat(query,"replace into doors " + "(id, doorid, zone, version, name, " + "pos_x, pos_y, pos_z, heading, opentype, " + "guild, lockpick, keyitem, door_param, " + "invert_state, incline, size) " + "values ('%i','%i','%s','%i', '%s','%f'," + "'%f','%f','%f','%i','%i','%i', '%i','%i'," + "'%i','%i','%i')", + ddoordbid ,ddoorid ,zone->GetShortName(), + zone->GetInstanceVersion(), ddoor_name, + dxpos, dypos, dzpos, dheading, dopentype, + dguildid, dlockpick, dkeyitem, ddoor_param, + dinvert, dincline, dsize); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in InsertDoor" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); } void ZoneDatabase::LoadAltCurrencyValues(uint32 char_id, std::map ¤cy) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT currency_id, amount FROM character_alt_currency where char_id='%u'", char_id), errbuf, &result)) { - safe_delete_array(query); + StringFormat(query,"SELECT currency_id, amount FROM " + "character_alt_currency where char_id='%u'", + char_id); + + if (RunQuery(query, errbuf, &result)) { while ((row = mysql_fetch_row(result))) { currency[atoi(row[0])] = atoi(row[1]); @@ -2570,43 +2541,52 @@ void ZoneDatabase::LoadAltCurrencyValues(uint32 char_id, std::mapwrite(EQEMuLog::Error, "Error in LoadAltCurrencyValues query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadAltCurrencyValues query '%s': %s", query.c_str(), errbuf); } } void ZoneDatabase::UpdateAltCurrencyValue(uint32 char_id, uint32 currency_id, uint32 value) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; - database.RunQuery(query, MakeAnyLenString(&query, "REPLACE INTO character_alt_currency (char_id, currency_id, amount)" - " VALUES('%u', '%u', '%u')", char_id, currency_id, value), - errbuf); - safe_delete_array(query); + std::string query; + + StringFormat(query, "REPLACE INTO character_alt_currency (char_id, currency_id, amount)" + " VALUES('%u', '%u', '%u')", char_id, currency_id, value); + + database.RunQuery(query, errbuf); } void ZoneDatabase::SaveBuffs(Client *c) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; - database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM `character_buffs` WHERE `character_id`='%u'", c->CharacterID()), - errbuf); + StringFormat(query, "DELETE FROM `character_buffs` " + "WHERE `character_id`='%u'", c->CharacterID()); + + database.RunQuery(query, errbuf); uint32 buff_count = c->GetMaxBuffSlots(); Buffs_Struct *buffs = c->GetBuffs(); for (int i = 0; i < buff_count; i++) { if(buffs[i].spellid != SPELL_UNKNOWN) { - if(!database.RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `character_buffs` (character_id, slot_id, spell_id, " - "caster_level, caster_name, ticsremaining, counters, numhits, melee_rune, magic_rune, persistent, death_save_chance, " - "death_save_aa_chance) VALUES('%u', '%u', '%u', '%u', '%s', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", - c->CharacterID(), i, buffs[i].spellid, buffs[i].casterlevel, buffs[i].caster_name, buffs[i].ticsremaining, - buffs[i].counters, buffs[i].numhits, buffs[i].melee_rune, buffs[i].magic_rune, buffs[i].persistant_buff, - buffs[i].deathSaveSuccessChance, buffs[i].deathsaveCasterAARank), - errbuf)) { - LogFile->write(EQEMuLog::Error, "Error in SaveBuffs query '%s': %s", query, errbuf); + + StringFormat(query, "INSERT INTO `character_buffs` " + "(character_id, slot_id, spell_id, " + "caster_level, caster_name, ticsremaining, " + "counters, numhits, melee_rune, magic_rune, " + "persistent, death_save_chance, death_save_aa_chance) " + "VALUES('%u', '%u', '%u', '%u', '%s', '%u', " + "'%u', '%u', '%u', '%u', '%u', '%u', '%u')", + c->CharacterID(), i, buffs[i].spellid, buffs[i].casterlevel, + buffs[i].caster_name, buffs[i].ticsremaining, + buffs[i].counters, buffs[i].numhits, buffs[i].melee_rune, + buffs[i].magic_rune, buffs[i].persistant_buff, + buffs[i].deathSaveSuccessChance, buffs[i].deathsaveCasterAARank); + + if(!database.RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error in SaveBuffs query '%s': %s", query.c_str(), errbuf); } } } - safe_delete_array(query); } void ZoneDatabase::LoadBuffs(Client *c) { @@ -2618,15 +2598,17 @@ void ZoneDatabase::LoadBuffs(Client *c) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT spell_id, slot_id, caster_level, caster_name, ticsremaining, counters, " - "numhits, melee_rune, magic_rune, persistent, death_save_chance, death_save_aa_chance FROM `character_buffs` WHERE " - "`character_id`='%u'", - c->CharacterID()), errbuf, &result)) + + StringFormat(query, "SELECT spell_id, slot_id, caster_level, caster_name, ticsremaining, counters, " + "numhits, melee_rune, magic_rune, persistent, death_save_chance, death_save_aa_chance " + "FROM `character_buffs` WHERE `character_id`='%u'", + c->CharacterID()); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while ((row = mysql_fetch_row(result))) { uint32 slot_id = atoul(row[1]); @@ -2678,17 +2660,11 @@ void ZoneDatabase::LoadBuffs(Client *c) { c->SetHasSpellRune(true); } - /* - if(IsDeathSaveSpell(spell_id)) { - c->SetDeathSaveChance(true); - } - */ } mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadBuffs query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadBuffs query '%s': %s", query.c_str(), errbuf); return; } @@ -2722,92 +2698,99 @@ void ZoneDatabase::LoadBuffs(Client *c) { void ZoneDatabase::SavePetInfo(Client *c) { char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; int i = 0; PetInfo *petinfo = c->GetPetInfo(0); PetInfo *suspended = c->GetPetInfo(1); - if(!database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM `character_pet_buffs` WHERE `char_id`=%u", c->CharacterID()), - errbuf)) { - safe_delete_array(query); + StringFormat(query, "DELETE FROM `character_pet_buffs` WHERE `char_id`=%u", c->CharacterID()); + + if(!database.RunQuery(query, errbuf)) { return; } - safe_delete_array(query); - if (!database.RunQuery(query, MakeAnyLenString(&query, "DELETE FROM `character_pet_inventory` WHERE `char_id`=%u", c->CharacterID()), - errbuf)) { - safe_delete_array(query); + + StringFormat(query, "DELETE FROM `character_pet_inventory` WHERE `char_id`=%u", c->CharacterID()); + + if (!database.RunQuery(query, errbuf)) { // error report return; } - safe_delete_array(query); - - if(!database.RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO `character_pet_info` (`char_id`, `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`) " - "values (%u, 0, '%s', %i, %u, %u, %u) " - "ON DUPLICATE KEY UPDATE `petname`='%s', `petpower`=%i, `spell_id`=%u, `hp`=%u, `mana`=%u", - c->CharacterID(), petinfo->Name, petinfo->petpower, petinfo->SpellID, petinfo->HP, petinfo->Mana, - petinfo->Name, petinfo->petpower, petinfo->SpellID, petinfo->HP, petinfo->Mana), - errbuf)) + + StringFormat(query, "INSERT INTO `character_pet_info` " + "(`char_id`, `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`) " + "values (%u, 0, '%s', %i, %u, %u, %u) " + "ON DUPLICATE KEY UPDATE " + "`petname`='%s', `petpower`=%i, `spell_id`=%u, `hp`=%u, `mana`=%u", + c->CharacterID(), petinfo->Name, petinfo->petpower, petinfo->SpellID, petinfo->HP, petinfo->Mana, + petinfo->Name, petinfo->petpower, petinfo->SpellID, petinfo->HP, petinfo->Mana); + + if(!database.RunQuery(query, errbuf)) { - safe_delete_array(query); return; } - safe_delete_array(query); for(i=0; i < RuleI(Spells, MaxTotalSlotsPET); i++) { if (petinfo->Buffs[i].spellid != SPELL_UNKNOWN && petinfo->Buffs[i].spellid != 0) { - database.RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO `character_pet_buffs` (`char_id`, `pet`, `slot`, `spell_id`, `caster_level`, " - "`ticsremaining`, `counters`) values " - "(%u, 0, %u, %u, %u, %u, %d)", - c->CharacterID(), i, petinfo->Buffs[i].spellid, petinfo->Buffs[i].level, petinfo->Buffs[i].duration, - petinfo->Buffs[i].counters), - errbuf); - safe_delete_array(query); + + StringFormat(query, "INSERT INTO `character_pet_buffs` " + "(`char_id`, `pet`, `slot`, `spell_id`, `caster_level`, " + "`ticsremaining`, `counters`) " + "values (%u, 0, %u, %u, %u, %u, %d)", + c->CharacterID(), i, petinfo->Buffs[i].spellid, petinfo->Buffs[i].level, + petinfo->Buffs[i].duration, petinfo->Buffs[i].counters); + + database.RunQuery(query, errbuf); } if (suspended->Buffs[i].spellid != SPELL_UNKNOWN && suspended->Buffs[i].spellid != 0) { - database.RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO `character_pet_buffs` (`char_id`, `pet`, `slot`, `spell_id`, `caster_level`, " - "`ticsremaining`, `counters`) values " - "(%u, 1, %u, %u, %u, %u, %d)", - c->CharacterID(), i, suspended->Buffs[i].spellid, suspended->Buffs[i].level, suspended->Buffs[i].duration, - suspended->Buffs[i].counters), - errbuf); - safe_delete_array(query); + + StringFormat(query, "INSERT INTO `character_pet_buffs` " + "(`char_id`, `pet`, `slot`, `spell_id`, " + "`caster_level`, `ticsremaining`, `counters`) " + "values (%u, 1, %u, %u, %u, %u, %d)", + c->CharacterID(), i, suspended->Buffs[i].spellid, + suspended->Buffs[i].level, suspended->Buffs[i].duration, + suspended->Buffs[i].counters); + + database.RunQuery(query, errbuf); } } for(i=0; iItems[i]) { - database.RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO `character_pet_inventory` (`char_id`, `pet`, `slot`, `item_id`) values (%u, 0, %u, %u)", - c->CharacterID(), i, petinfo->Items[i]), errbuf); + + StringFormat(query, "INSERT INTO `character_pet_inventory` " + "(`char_id`, `pet`, `slot`, `item_id`) " + "values (%u, 0, %u, %u)", + c->CharacterID(), i, petinfo->Items[i]); + + database.RunQuery(query, errbuf); // should check for errors - safe_delete_array(query); } } + + StringFormat(query, "INSERT INTO `character_pet_info` " + "(`char_id`, `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`) " + "values (%u, 1, '%s', %u, %u, %u, %u) " + "ON DUPLICATE KEY UPDATE " + "`petname`='%s', `petpower`=%i, `spell_id`=%u, `hp`=%u, `mana`=%u", + c->CharacterID(), suspended->Name, suspended->petpower, suspended->SpellID, suspended->HP, suspended->Mana, + suspended->Name, suspended->petpower, suspended->SpellID, suspended->HP, suspended->Mana); - - if(!database.RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO `character_pet_info` (`char_id`, `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`) " - "values (%u, 1, '%s', %u, %u, %u, %u) " - "ON DUPLICATE KEY UPDATE `petname`='%s', `petpower`=%i, `spell_id`=%u, `hp`=%u, `mana`=%u", - c->CharacterID(), suspended->Name, suspended->petpower, suspended->SpellID, suspended->HP, suspended->Mana, - suspended->Name, suspended->petpower, suspended->SpellID, suspended->HP, suspended->Mana), - errbuf)) + if(!database.RunQuery(query, errbuf)) { - safe_delete_array(query); return; } - safe_delete_array(query); for(i=0; iItems[i]) { - database.RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO `character_pet_inventory` (`char_id`, `pet`, `slot`, `item_id`) values (%u, 1, %u, %u)", - c->CharacterID(), i, suspended->Items[i]), errbuf); + + StringFormat(query, "INSERT INTO `character_pet_inventory` " + "(`char_id`, `pet`, `slot`, `item_id`) " + "values (%u, 1, %u, %u)", + c->CharacterID(), i, suspended->Items[i]); + + database.RunQuery(query, errbuf); // should check for errors - safe_delete_array(query); } } @@ -2815,18 +2798,19 @@ void ZoneDatabase::SavePetInfo(Client *c) { void ZoneDatabase::RemoveTempFactions(Client *c){ char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; - if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM faction_values WHERE temp = 1 AND char_id=%u", c->CharacterID()), errbuf)) { + StringFormat(query, "DELETE FROM faction_values WHERE temp = 1 AND char_id=%u", c->CharacterID()); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in RemoveTempFactions query '" << query << "' " << errbuf << std::endl; } - safe_delete_array(query); } void ZoneDatabase::LoadPetInfo(Client *c) { // Load current pet and suspended pet char errbuf[MYSQL_ERRMSG_SIZE]; - char* query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; @@ -2838,11 +2822,12 @@ void ZoneDatabase::LoadPetInfo(Client *c) { memset(petinfo, 0, sizeof(PetInfo)); memset(suspended, 0, sizeof(PetInfo)); - if(database.RunQuery(query, MakeAnyLenString(&query, - "SELECT `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana` from `character_pet_info` where `char_id`=%u", - c->CharacterID()), errbuf, &result)) + StringFormat(query, "SELECT `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana` " + "from `character_pet_info` where `char_id`=%u", + c->CharacterID()); + + if(database.RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while ((row = mysql_fetch_row(result))) { pet = atoi(row[0]); if (pet == 0) @@ -2862,19 +2847,16 @@ void ZoneDatabase::LoadPetInfo(Client *c) { } else { - LogFile->write(EQEMuLog::Error, "Error in LoadPetInfo query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadPetInfo query '%s': %s", query.c_str(), errbuf); return; } - - if (RunQuery(query, MakeAnyLenString(&query, - "SELECT `pet`, `slot`, `spell_id`, `caster_level`, `castername`, " - "`ticsremaining`, `counters` FROM `character_pet_buffs` " - "WHERE `char_id`=%u", - c->CharacterID()), errbuf, &result)) + StringFormat(query,"SELECT `pet`, `slot`, `spell_id`, `caster_level`, `castername`, " + "`ticsremaining`, `counters` FROM `character_pet_buffs` " + "WHERE `char_id`=%u", c->CharacterID()); + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while ((row = mysql_fetch_row(result))) { pet = atoi(row[0]); @@ -2913,16 +2895,17 @@ void ZoneDatabase::LoadPetInfo(Client *c) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadPetInfo query '%s': %s", query, errbuf); - safe_delete_array(query); + LogFile->write(EQEMuLog::Error, "Error in LoadPetInfo query '%s': %s", query.c_str(), errbuf); return; } - if (database.RunQuery(query, MakeAnyLenString(&query, - "SELECT `pet`, `slot`, `item_id` FROM `character_pet_inventory` WHERE `char_id`=%u", - c->CharacterID()), errbuf, &result)) + StringFormat(query,"SELECT `pet`, `slot`, `item_id` " + "FROM `character_pet_inventory` " + "WHERE `char_id`=%u", + c->CharacterID()); + + if (database.RunQuery(query, errbuf,&result)) { - safe_delete_array(query); while((row = mysql_fetch_row(result))) { pet = atoi(row[0]); if (pet == 0) @@ -2941,9 +2924,8 @@ void ZoneDatabase::LoadPetInfo(Client *c) { mysql_free_result(result); } else { - LogFile->write(EQEMuLog::Error, "Error in LoadPetInfo query '%s': %s", query, errbuf); - safe_delete_array(query); - return; + LogFile->write(EQEMuLog::Error, "Error in LoadPetInfo query '%s': %s", query.c_str(), errbuf); + return; } } @@ -3004,17 +2986,18 @@ bool ZoneDatabase::GetFactionData(FactionMods* fm, uint32 class_mod, uint32 race bool ZoneDatabase::LoadFactionValues(uint32 char_id, faction_map & val_list) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; - if (RunQuery(query, MakeAnyLenString(&query, "SELECT faction_id,current_value FROM faction_values WHERE char_id = %i",char_id), errbuf, &result)) { - safe_delete_array(query); + + StringFormat(query, "SELECT faction_id,current_value FROM faction_values WHERE char_id = %i",char_id); + + if (RunQuery(query, errbuf, &result)) { bool ret = LoadFactionValues_result(result, val_list); mysql_free_result(result); return ret; } else { std::cerr << "Error in LoadFactionValues query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); } return false; } @@ -3075,20 +3058,20 @@ bool ZoneDatabase::GetNPCFactionList(uint32 npcfaction_id, int32* faction_id, in bool ZoneDatabase::SetCharacterFactionLevel(uint32 char_id, int32 faction_id, int32 value, uint8 temp, faction_map &val_list) { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; uint32 affected_rows = 0; - if (!RunQuery(query, MakeAnyLenString(&query, - "DELETE FROM faction_values WHERE char_id=%i AND faction_id = %i", - char_id, faction_id), errbuf)) { + StringFormat(query,"DELETE FROM faction_values " + "WHERE char_id=%i AND faction_id = %i", + char_id, faction_id); + + if (!RunQuery(query, errbuf)) { std::cerr << "Error in SetCharacterFactionLevel query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } if(value == 0) { - safe_delete_array(query); return true; } @@ -3098,37 +3081,36 @@ bool ZoneDatabase::SetCharacterFactionLevel(uint32 char_id, int32 faction_id, in if(temp == 3) temp = 1; - if (!RunQuery(query, MakeAnyLenString(&query, - "INSERT INTO faction_values (char_id,faction_id,current_value,temp) VALUES (%i,%i,%i,%i)", - char_id, faction_id,value,temp), errbuf, 0, &affected_rows)) { + StringFormat(query, "INSERT INTO faction_values " + "(char_id, faction_id, current_value, temp) " + "VALUES (%i, %i, %i, %i)", + char_id, faction_id, value, temp); + + if (!RunQuery(query, errbuf, 0, &affected_rows)) { std::cerr << "Error in SetCharacterFactionLevel query '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } - safe_delete_array(query); - if (affected_rows == 0) { return false; } val_list[faction_id] = value; - return(true); + return true; } bool ZoneDatabase::LoadFactionData() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; - query = new char[256]; - strcpy(query, "SELECT MAX(id) FROM faction_list"); + + query = "SELECT MAX(id) FROM faction_list"; - if (RunQuery(query, strlen(query), errbuf, &result)) { - safe_delete_array(query); + if (RunQuery(query, errbuf, &result)) { row = mysql_fetch_row(result); if (row && row[0]) { @@ -3139,11 +3121,11 @@ bool ZoneDatabase::LoadFactionData() faction_array[i] = nullptr; } mysql_free_result(result); - - MakeAnyLenString(&query, "SELECT id,name,base FROM faction_list"); - if (RunQuery(query, strlen(query), errbuf, &result)) + + query ="SELECT id,name,base FROM faction_list"; + + if (RunQuery(query, errbuf, &result)) { - safe_delete_array(query); while((row = mysql_fetch_row(result))) { uint32 index = atoi(row[0]); @@ -3154,21 +3136,24 @@ bool ZoneDatabase::LoadFactionData() char sec_errbuf[MYSQL_ERRMSG_SIZE]; MYSQL_RES *sec_result; MYSQL_ROW sec_row; - MakeAnyLenString(&query, "SELECT `mod`, `mod_name` FROM `faction_list_mod` WHERE faction_id=%u", index); - if (RunQuery(query, strlen(query), sec_errbuf, &sec_result)) { + + StringFormat(query, "SELECT `mod`, `mod_name` " + "FROM `faction_list_mod` " + "WHERE faction_id=%u", + index); + + if (RunQuery(query, sec_errbuf, &sec_result)) { while((sec_row = mysql_fetch_row(sec_result))) { faction_array[index]->mods[sec_row[1]] = atoi(sec_row[0]); } mysql_free_result(sec_result); } - safe_delete_array(query); } mysql_free_result(result); } else { std::cerr << "Error in LoadFactionData '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } } @@ -3178,7 +3163,6 @@ bool ZoneDatabase::LoadFactionData() } else { std::cerr << "Error in LoadFactionData '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return false; } return true; diff --git a/zone/zonedbasync.cpp b/zone/zonedbasync.cpp index e07b28d6e..d9a9881d3 100644 --- a/zone/zonedbasync.cpp +++ b/zone/zonedbasync.cpp @@ -57,7 +57,7 @@ bool DBAsyncCB_CharacterBackup(DBAsyncWork* iWork) { // return true means delete char errbuf[MYSQL_ERRMSG_SIZE] = "dbaq == 0"; MYSQL_RES* result = 0; MYSQL_ROW row; - char* query = 0; + std::string query; uint32 i; uint8 ToDeleteIndex = 0; uint32 ToDelete[MAX_TO_DELETE]; @@ -90,16 +90,22 @@ bool DBAsyncCB_CharacterBackup(DBAsyncWork* iWork) { // return true means delete } if (ToDelete[0]) { uint32 len = 0, size = 0; - AppendAnyLenString(&query, &size, &len, "Delete from character_backup where id=%u", ToDelete[0]); + + std::string toAppend; + + StringFormat(toAppend, "Delete from character_backup where id=%u", ToDelete[0]); + query.append(toAppend); + for (uint8 i=1; iwrite(EQEMuLog::Error, "Error in DBAsyncCB_CharacterBackup query2 '%s' %s", query, errbuf); - safe_delete_array(query); + if (!database.RunQuery(query, errbuf)) { + LogFile->write(EQEMuLog::Error, "Error in DBAsyncCB_CharacterBackup query2 '%s' %s", query.c_str(), errbuf); return true; } - safe_delete_array(query); } bool needtoinsert = false; for (i=0; iWPT()), errbuf)) { + + StringFormat(query, "Insert Delayed into character_backup " + "(charid, account_id, name, profile, level, class, x, y, z, zoneid) " + "select id, account_id, name, profile, level, class, x, y, z, zoneid " + "from character_ where id=%u", iWork->WPT()); + + if (!database.RunQuery(query, errbuf)) { std::cout << "Error in DBAsyncCB_CharacterBackup query3 '" << query << "' " << errbuf << std::endl; - safe_delete_array(query); return true; } - safe_delete_array(query); } } else { // cout << "Error in DBAsyncCB_CharacterBackup query1 '" << query << "' " << errbuf << endl; - safe_delete_array(query); return true; } return true; diff --git a/zone/zoning.cpp b/zone/zoning.cpp index 7daea8e65..1816aaa48 100644 --- a/zone/zoning.cpp +++ b/zone/zoning.cpp @@ -731,12 +731,14 @@ void Client::SetZoneFlag(uint32 zone_id) { //update the DB char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; // Retrieve all waypoints for this grid - if(!database.RunQuery(query,MakeAnyLenString(&query, - "INSERT INTO zone_flags (charID,zoneID) VALUES(%d,%d)", - CharacterID(),zone_id),errbuf)) { + + StringFormat(query, "INSERT INTO zone_flags (charID,zoneID) VALUES(%d,%d)", + CharacterID(),zone_id); + + if(!database.RunQuery(query, errbuf)) { LogFile->write(EQEMuLog::Error, "MySQL Error while trying to set zone flag for %s: %s", GetName(), errbuf); } } @@ -749,26 +751,30 @@ void Client::ClearZoneFlag(uint32 zone_id) { //update the DB char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; // Retrieve all waypoints for this grid - if(!database.RunQuery(query,MakeAnyLenString(&query, - "DELETE FROM zone_flags WHERE charID=%d AND zoneID=%d", - CharacterID(),zone_id),errbuf)) { + + StringFormat(query, "DELETE FROM zone_flags WHERE charID=%d AND zoneID=%d", + CharacterID(),zone_id); + + if(!database.RunQuery(query,errbuf)) { LogFile->write(EQEMuLog::Error, "MySQL Error while trying to clear zone flag for %s: %s", GetName(), errbuf); } } void Client::LoadZoneFlags() { char errbuf[MYSQL_ERRMSG_SIZE]; - char *query = 0; + std::string query; MYSQL_RES *result; MYSQL_ROW row; // Retrieve all waypoints for this grid - if(database.RunQuery(query,MakeAnyLenString(&query, - "SELECT zoneID from zone_flags WHERE charID=%d", - CharacterID()),errbuf,&result)) + + StringFormat(query,"SELECT zoneID from zone_flags WHERE charID=%d", + CharacterID()); + + if(database.RunQuery(query,errbuf,&result)) { while((row = mysql_fetch_row(result))) { zone_flags.insert(atoi(row[0])); @@ -779,7 +785,6 @@ void Client::LoadZoneFlags() { { LogFile->write(EQEMuLog::Error, "MySQL Error while trying to load zone flags for %s: %s", GetName(), errbuf); } - safe_delete_array(query); } bool Client::HasZoneFlag(uint32 zone_id) const {