// Update information about existing object in database void ZoneDatabase::UpdateObject(uint32 id, uint32 type, uint32 icon, const Object_Struct& object, const ItemInst* inst) { uint32 item_id = 0; int16 charges = 0; if (inst && inst->GetItem()) { item_id = inst->GetItem()->ID; charges = inst->GetCharges(); } // SQL Escape object_name uint32 len = strlen(object.object_name) * 2 + 1; char* object_name = new char[len]; DoEscapeString(object_name, object.object_name, strlen(object.object_name)); // Save new record for object std::string query = StringFormat("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); safe_delete_array(object_name); auto results = QueryDatabase(query); if (!results.Success()) { LogFile->write(EQEMuLog::Error, "Unable to update object: %s", results.ErrorMessage().c_str()); return; } // Save container contents, if container if (inst && inst->IsType(ItemClassContainer)) SaveWorldContainer(object.zone_id, id, inst); }
// Add new Zone Object (theoretically only called for items dropped to ground) uint32 ZoneDatabase::AddObject(uint32 type, uint32 icon, const Object_Struct& object, const ItemInst* inst) { char errbuf[MYSQL_ERRMSG_SIZE]; char* query = 0; uint32 database_id = 0; uint32 item_id = 0; int16 charges = 0; if (inst && inst->GetItem()) { item_id = inst->GetItem()->ID; charges = inst->GetCharges(); } // SQL Escape object_name uint32 len = strlen(object.object_name) * 2 + 1; char* object_name = new char[len]; 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); // Save new record for object if (!RunQuery(query, len_query, errbuf, nullptr, nullptr, &database_id)) { LogFile->write(EQEMuLog::Error, "Unable to insert object: %s", errbuf); } else { // Save container contents, if container if (inst && inst->IsType(ItemClassContainer)) { SaveWorldContainer(object.zone_id, database_id, inst); } } safe_delete_array(object_name); safe_delete_array(query); return database_id; }
// Update information about existing object in database void ZoneDatabase::UpdateObject(uint32 id, uint32 type, uint32 icon, const Object_Struct& object, const ItemInst* inst) { char errbuf[MYSQL_ERRMSG_SIZE]; char* query = 0; uint32 item_id = 0; int16 charges = 0; if (inst && inst->GetItem()) { item_id = inst->GetItem()->ID; charges = inst->GetCharges(); } // SQL Escape object_name uint32 len = strlen(object.object_name) * 2 + 1; char* object_name = new char[len]; 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); // Save new record for object if (!RunQuery(query, len_query, errbuf)) { LogFile->write(EQEMuLog::Error, "Unable to update object: %s", errbuf); } else { // Save container contents, if container if (inst && inst->IsType(ItemClassContainer)) { SaveWorldContainer(object.zone_id, id, inst); } } safe_delete_array(object_name); safe_delete_array(query); }
// Add new Zone Object (theoretically only called for items dropped to ground) uint32 ZoneDatabase::AddObject(uint32 type, uint32 icon, const Object_Struct& object, const ItemInst* inst) { uint32 database_id = 0; uint32 item_id = 0; int16 charges = 0; if (inst && inst->GetItem()) { item_id = inst->GetItem()->ID; charges = inst->GetCharges(); } // SQL Escape object_name uint32 len = strlen(object.object_name) * 2 + 1; char* object_name = new char[len]; DoEscapeString(object_name, object.object_name, strlen(object.object_name)); // Save new record for object std::string query = StringFormat("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); safe_delete_array(object_name); auto results = QueryDatabase(query); if (!results.Success()) { LogFile->write(EQEMuLog::Error, "Unable to insert object: %s", results.ErrorMessage().c_str()); return 0; } // Save container contents, if container if (inst && inst->IsType(ItemClassContainer)) SaveWorldContainer(object.zone_id, database_id, inst); return database_id; }