TradeskillSearchResults converted to const std::string query instead of const *char query

This commit is contained in:
Arthur Ice 2014-10-08 15:00:34 -07:00
parent 0fde0fbd23
commit 7656b9b928
3 changed files with 48 additions and 62 deletions

View File

@ -681,7 +681,7 @@ public:
inline uint16 MaxSkill(SkillUseTypes skillid) const { return MaxSkill(skillid, GetClass(), GetLevel()); } inline uint16 MaxSkill(SkillUseTypes skillid) const { return MaxSkill(skillid, GetClass(), GetLevel()); }
uint8 SkillTrainLevel(SkillUseTypes skillid, uint16 class_); uint8 SkillTrainLevel(SkillUseTypes skillid, uint16 class_);
void TradeskillSearchResults(const char *query, unsigned long objtype, unsigned long someid); void TradeskillSearchResults(const std::string query, unsigned long objtype, unsigned long someid);
void SendTradeskillDetails(uint32 recipe_id); void SendTradeskillDetails(uint32 recipe_id);
bool TradeskillExecute(DBTradeskillRecipe_Struct *spec); bool TradeskillExecute(DBTradeskillRecipe_Struct *spec);
void CheckIncreaseTradeskill(int16 bonusstat, int16 stat_modifier, float skillup_modifier, uint16 success_modifier, SkillUseTypes tradeskill); void CheckIncreaseTradeskill(int16 bonusstat, int16 stat_modifier, float skillup_modifier, uint16 success_modifier, SkillUseTypes tradeskill);

View File

@ -11311,56 +11311,46 @@ void Client::Handle_OP_RecipesFavorite(const EQApplicationPacket *app)
// some_id = 0 if world combiner, item number otherwise // some_id = 0 if world combiner, item number otherwise
// make where clause segment for container(s) // make where clause segment for container(s)
char containers[30]; std::string containers;
if (tsf->some_id == 0) { if (tsf->some_id == 0)
// world combiner so no item number containers += StringFormat(" = %u ", tsf->object_type); // world combiner so no item number
snprintf(containers, 29, "= %u", tsf->object_type); else
} containers += StringFormat(" in (%u, %u) ", tsf->object_type, tsf->some_id); // container in inventory
else {
// container in inventory
snprintf(containers, 29, "in (%u,%u)", tsf->object_type, tsf->some_id);
}
char *query = 0;
char buf[5500]; //gotta be big enough for 500 IDs
std::string favoriteIDs; //gotta be big enough for 500 IDs
bool first = true; bool first = true;
uint16 r;
char *pos = buf;
//Assumes item IDs are <10 characters long //Assumes item IDs are <10 characters long
for (r = 0; r < 500; r++) { for (uint16 favoriteIndex = 0; favoriteIndex < 500; ++favoriteIndex) {
if (tsf->favorite_recipes[r] == 0) if (tsf->favorite_recipes[favoriteIndex] == 0)
continue; continue;
if (first) { if (first) {
pos += snprintf(pos, 10, "%u", tsf->favorite_recipes[r]); favoriteIDs += StringFormat("%u", tsf->favorite_recipes[favoriteIndex]);
first = false; first = false;
} }
else { else
pos += snprintf(pos, 10, ",%u", tsf->favorite_recipes[r]); favoriteIDs += StringFormat(",%u", tsf->favorite_recipes[favoriteIndex]);
}
} }
if (first) //no favorites.... if (first) //no favorites....
return; return;
//To be a good kid, I should move this SQL somewhere else... const std::string query = StringFormat("SELECT tr.id, tr.name, tr.trivial, "
//but im lazy right now, so it stays here "SUM(tre.componentcount), crl.madecount,tr.tradeskill "
uint32 qlen = 0; "FROM tradeskill_recipe AS tr "
qlen = MakeAnyLenString(&query, "SELECT tr.id,tr.name,tr.trivial,SUM(tre.componentcount),crl.madecount,tr.tradeskill " "LEFT JOIN tradeskill_recipe_entries AS tre ON tr.id=tre.recipe_id "
" FROM tradeskill_recipe AS tr " "LEFT JOIN (SELECT recipe_id, madecount "
" LEFT JOIN tradeskill_recipe_entries AS tre ON tr.id=tre.recipe_id " "FROM char_recipe_list "
" LEFT JOIN (SELECT recipe_id, madecount FROM char_recipe_list WHERE char_id = %u) AS crl ON tr.id=crl.recipe_id " "WHERE char_id = %u) AS crl ON tr.id=crl.recipe_id "
" WHERE tr.enabled <> 0 AND tr.id IN (%s) " "WHERE tr.enabled <> 0 AND tr.id IN (%s) "
" AND tr.must_learn & 0x20 <> 0x20 AND ((tr.must_learn & 0x3 <> 0 AND crl.madecount IS NOT NULL) OR (tr.must_learn & 0x3 = 0)) " "AND tr.must_learn & 0x20 <> 0x20 AND "
" GROUP BY tr.id " "((tr.must_learn & 0x3 <> 0 AND crl.madecount IS NOT NULL) "
" HAVING sum(if(tre.item_id %s AND tre.iscontainer > 0,1,0)) > 0 " "OR (tr.must_learn & 0x3 = 0)) "
" LIMIT 100 ", CharacterID(), buf, containers); "GROUP BY tr.id "
"HAVING sum(if(tre.item_id %s AND tre.iscontainer > 0,1,0)) > 0 "
"LIMIT 100 ", CharacterID(), favoriteIDs.c_str(), containers.c_str());
TradeskillSearchResults(query, tsf->object_type, tsf->some_id); TradeskillSearchResults(query, tsf->object_type, tsf->some_id);
safe_delete_array(query);
return; return;
} }
@ -11389,36 +11379,33 @@ void Client::Handle_OP_RecipesSearch(const EQApplicationPacket *app)
snprintf(containers, 29, "in (%u,%u)", rss->object_type, rss->some_id); snprintf(containers, 29, "in (%u,%u)", rss->object_type, rss->some_id);
} }
char *query = 0; std::string searchClause;
char searchclause[140]; //2X rss->query + SQL crap
//omit the rlike clause if query is empty //omit the rlike clause if query is empty
if (rss->query[0] != 0) { if (rss->query[0] != 0) {
char buf[120]; //larger than 2X rss->query char buf[120]; //larger than 2X rss->query
database.DoEscapeString(buf, rss->query, strlen(rss->query)); database.DoEscapeString(buf, rss->query, strlen(rss->query));
searchClause = StringFormat("name rlike '%s' AND", buf);
snprintf(searchclause, 139, "name rlike '%s' AND", buf);
} }
else {
searchclause[0] = '\0';
}
uint32 qlen = 0;
//arbitrary limit of 200 recipes, makes sense to me. //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 " const std::string query = StringFormat("SELECT tr.id, tr.name, tr.trivial, "
" FROM tradeskill_recipe AS tr " "SUM(tre.componentcount), crl.madecount,tr.tradeskill "
" LEFT JOIN tradeskill_recipe_entries AS tre ON tr.id=tre.recipe_id " "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 " "LEFT JOIN tradeskill_recipe_entries AS tre ON tr.id = tre.recipe_id "
" WHERE %s tr.trivial >= %u AND tr.trivial <= %u AND tr.enabled <> 0 " "LEFT JOIN (SELECT recipe_id, madecount "
" AND tr.must_learn & 0x20 <> 0x20 AND((tr.must_learn & 0x3 <> 0 AND crl.madecount IS NOT NULL) OR (tr.must_learn & 0x3 = 0)) " "FROM char_recipe_list WHERE char_id = %u) AS crl ON tr.id=crl.recipe_id "
" GROUP BY tr.id " "WHERE %s tr.trivial >= %u AND tr.trivial <= %u AND tr.enabled <> 0 "
" HAVING sum(if(tre.item_id %s AND tre.iscontainer > 0,1,0)) > 0 " "AND tr.must_learn & 0x20 <> 0x20 "
" LIMIT 200 " "AND ((tr.must_learn & 0x3 <> 0 "
, CharacterID(), searchclause, rss->mintrivial, rss->maxtrivial, containers); "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.c_str(),
rss->mintrivial, rss->maxtrivial, containers);
TradeskillSearchResults(query, rss->object_type, rss->some_id); TradeskillSearchResults(query, rss->object_type, rss->some_id);
safe_delete_array(query);
return; return;
} }

View File

@ -636,12 +636,11 @@ SkillUseTypes Object::TypeToSkill(uint32 type)
return TradeskillUnknown; return TradeskillUnknown;
} }
void Client::TradeskillSearchResults(const char *query, unsigned long objtype, unsigned long someid) { void Client::TradeskillSearchResults(const std::string query, unsigned long objtype, unsigned long someid) {
std::string internalQuery(query); auto results = database.QueryDatabase(query);
auto results = database.QueryDatabase(internalQuery);
if (!results.Success()) { if (!results.Success()) {
LogFile->write(EQEMuLog::Error, "Error in TradeskillSearchResults query '%s': %s", internalQuery.c_str(), results.ErrorMessage().c_str()); LogFile->write(EQEMuLog::Error, "Error in TradeskillSearchResults query '%s': %s", query.c_str(), results.ErrorMessage().c_str());
return; return;
} }
@ -649,7 +648,7 @@ void Client::TradeskillSearchResults(const char *query, unsigned long objtype, u
return; //search gave no results... not an error return; //search gave no results... not an error
if(results.ColumnCount() != 6) { if(results.ColumnCount() != 6) {
LogFile->write(EQEMuLog::Error, "Error in TradeskillSearchResults query '%s': Invalid column count in result", internalQuery.c_str()); LogFile->write(EQEMuLog::Error, "Error in TradeskillSearchResults query '%s': Invalid column count in result", query.c_str());
return; return;
} }