PDA

View Full Version : Small fix for Database::StoreCharacter for MSVC


BatCountry
04-30-2008, 07:01 PM
VS.NET Professional 2005 builds of eqemu seem to barf when provided a very large color number for an item (namely the default value) as it's above the signed max value. As the number is stored as a uint32, that shouldn't be a problem, but the StoreCharacter command uses a format string with %d as the value for the number.

On at least my install of VS.NET 2k5, this causes the number to be automatically cast to a signed int, converting it to a bad value, which MySQL complains (in strict mode) is out of range.

A simple fix is replacing the values which might be very large with %0u rather than %d fixes this without complaint in STRICT mode.

Also of note is that the query string is deleted before the debug message about the query string, resulting in a debug message which says that query "<NULL>" is invalid.

Original code at line database.cpp 557-571

MakeAnyLenString
(
&invquery,
"INSERT INTO inventory SET "
"charid=%d, slotid=%d, itemid=%d, charges=%d, color=%d",
charid, i, newinv->GetItem()->ID,
newinv->GetCharges(), newinv->GetColor()
);

RunQuery(invquery, strlen(invquery), errbuf, 0, &affected_rows);
safe_delete_array(invquery);
if(!affected_rows)
{
LogFile->write(EQEMuLog::Error, "StoreCharacter inventory failed. Query '%s' %s", invquery, errbuf);
}


Simple fix:

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);
if(!affected_rows)
{
LogFile->write(EQEMuLog::Error, "StoreCharacter inventory failed. Query '%s' %s", invquery, errbuf);
}
safe_delete_array(invquery);


Not a super large priority, but it does fix a potential problem with Windows builds, as well as a small debug bug. :)