void SqlObjDataSource::populateTraderObjects( int characterId, ServerObjectsQueue& queue ) { auto worldObjsRes = getDB()->queryParams("SELECT `id`, `item`, `qty`, `buy`, `sell`, `order`, `tid`, `afile` FROM `Traders_DATA` WHERE `tid`=%d", characterId); while (worldObjsRes->fetchRow()) { auto row = worldObjsRes->fields(); Sqf::Parameters objParams; objParams.push_back(row[0].getInt32()); // `item` varchar(255) NOT NULL COMMENT '[Class Name,1 = CfgMagazines | 2 = Vehicle | 3 = Weapon]', // `qty` int(8) NOT NULL COMMENT 'amount in stock available to buy', // `buy` varchar(255) NOT NULL COMMENT '[[Qty,Class,Type],]', // `sell` varchar(255) NOT NULL COMMENT '[[Qty,Class,Type],]', // `order` int(2) NOT NULL DEFAULT '0' COMMENT '# sort order for addAction menu', // `tid` int(8) NOT NULL COMMENT 'Trader Menu ID', // `afile` varchar(64) NOT NULL DEFAULT 'trade_items', //get stuff from row objParams.push_back(lexical_cast<Sqf::Value>(row[1].getString())); // item objParams.push_back(row[2].getInt32()); // qty objParams.push_back(lexical_cast<Sqf::Value>(row[3].getString())); // buy objParams.push_back(lexical_cast<Sqf::Value>(row[4].getString())); // sell objParams.push_back(row[5].getInt32()); // order objParams.push_back(row[6].getInt32()); // tid objParams.push_back(row[7].getString()); // afile queue.push(objParams); } }
void SqlObjDataSource::populateObjects( int serverId, ServerObjectsQueue& queue ) { if (_cleanupPlacedDays >= 0) { string commonSql = "FROM `"+_objTableName+"` WHERE `Instance` = " + lexical_cast<string>(serverId) + " AND `ObjectUID` <> 0 AND `CharacterID` <> 0" + " AND `Datestamp` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL "+lexical_cast<string>(_cleanupPlacedDays)+" DAY)" + " AND ( (`Inventory` IS NULL) OR (`Inventory` = '[]') )"; int numCleaned = 0; { auto numObjsToClean = getDB()->query(("SELECT COUNT(*) "+commonSql).c_str()); if (numObjsToClean && numObjsToClean->fetchRow()) numCleaned = numObjsToClean->at(0).getInt32(); } if (numCleaned > 0) { _logger.information("Removing " + lexical_cast<string>(numCleaned) + " empty placed objects older than " + lexical_cast<string>(_cleanupPlacedDays) + " days"); auto stmt = getDB()->makeStatement(_stmtDeleteOldObject, "DELETE "+commonSql); if (!stmt->directExecute()) _logger.error("Error executing placed objects cleanup statement"); } } auto worldObjsRes = getDB()->queryParams("SELECT `ObjectID`, `Classname`, `CharacterID`, `Worldspace`, `Inventory`, `Hitpoints`, `Fuel`, `Damage` FROM `%s` WHERE `Instance`=%d AND `Classname` IS NOT NULL", _objTableName.c_str(), serverId); if (!worldObjsRes) { _logger.error("Failed to fetch objects from database"); return; } while (worldObjsRes->fetchRow()) { auto row = worldObjsRes->fields(); Sqf::Parameters objParams; objParams.push_back(string("OBJ")); int objectId = row[0].getInt32(); objParams.push_back(lexical_cast<string>(objectId)); //objectId should be stringified try { objParams.push_back(row[1].getString()); //classname objParams.push_back(lexical_cast<string>(row[2].getInt32())); //ownerId should be stringified Sqf::Value worldSpace = lexical_cast<Sqf::Value>(row[3].getString()); if (_vehicleOOBReset && row[2].getInt32() == 0) // no owner = vehicle { PositionInfo posInfo = FixOOBWorldspace(worldSpace); if (posInfo.is_initialized()) _logger.information("Reset ObjectID " + lexical_cast<string>(objectId) + " (" + row[1].getString() + ") from position " + lexical_cast<string>(*posInfo)); } objParams.push_back(worldSpace); //Inventory can be NULL { string invStr = "[]"; if (!row[4].isNull()) invStr = row[4].getString(); objParams.push_back(lexical_cast<Sqf::Value>(invStr)); } objParams.push_back(lexical_cast<Sqf::Value>(row[5].getCStr())); objParams.push_back(row[6].getDouble()); objParams.push_back(row[7].getDouble()); } catch (const bad_lexical_cast&) { _logger.error("Skipping ObjectID " + lexical_cast<string>(objectId) + " load because of invalid data in db"); continue; } queue.push(objParams); } }