mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-31 22:52:25 +00:00
TradeskillSearchResults converted to const std::string query instead of const *char query
This commit is contained in:
parent
0fde0fbd23
commit
7656b9b928
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user