bool IOMapSerialize::saveHouseItems() { int64_t start = OTSYS_TIME(); Database& db = Database::getInstance(); std::ostringstream query; //Start the transaction DBTransaction transaction; if (!transaction.begin()) { return false; } //clear old tile data if (!db.executeQuery("DELETE FROM `tile_store`")) { return false; } DBInsert stmt("INSERT INTO `tile_store` (`house_id`, `data`) VALUES "); PropWriteStream stream; for (const auto& it : g_game.map.houses.getHouses()) { //save house items House* house = it.second; for (HouseTile* tile : house->getTiles()) { saveTile(stream, tile); size_t attributesSize; const char* attributes = stream.getStream(attributesSize); if (attributesSize > 0) { query << house->getId() << ',' << db.escapeBlob(attributes, attributesSize); if (!stmt.addRow(query)) { return false; } stream.clear(); } } } if (!stmt.execute()) { return false; } //End the transaction bool success = transaction.commit(); std::cout << "> Saved house items in: " << (OTSYS_TIME() - start) / (1000.) << " s" << std::endl; return success; }
bool IOMapSerialize::saveHouseInfo() { Database& db = Database::getInstance(); DBTransaction transaction; if (!transaction.begin()) { return false; } if (!db.executeQuery("DELETE FROM `house_lists`")) { return false; } std::ostringstream query; for (const auto& it : g_game.map.houses.getHouses()) { House* house = it.second; query << "SELECT `id` FROM `houses` WHERE `id` = " << house->getId(); DBResult_ptr result = db.storeQuery(query.str()); if (result) { query.str(std::string()); query << "UPDATE `houses` SET `owner` = " << house->getOwner() << ", `paid` = " << house->getPaidUntil() << ", `warnings` = " << house->getPayRentWarnings() << ", `name` = " << db.escapeString(house->getName()) << ", `town_id` = " << house->getTownId() << ", `rent` = " << house->getRent() << ", `size` = " << house->getTiles().size() << ", `beds` = " << house->getBedCount() << " WHERE `id` = " << house->getId(); } else { query.str(std::string()); query << "INSERT INTO `houses` (`id`, `owner`, `paid`, `warnings`, `name`, `town_id`, `rent`, `size`, `beds`) VALUES (" << house->getId() << ',' << house->getOwner() << ',' << house->getPaidUntil() << ',' << house->getPayRentWarnings() << ',' << db.escapeString(house->getName()) << ',' << house->getTownId() << ',' << house->getRent() << ',' << house->getTiles().size() << ',' << house->getBedCount() << ')'; } db.executeQuery(query.str()); query.str(std::string()); } DBInsert stmt("INSERT INTO `house_lists` (`house_id` , `listid` , `list`) VALUES "); for (const auto& it : g_game.map.houses.getHouses()) { House* house = it.second; std::string listText; if (house->getAccessList(GUEST_LIST, listText) && !listText.empty()) { query << house->getId() << ',' << GUEST_LIST << ',' << db.escapeString(listText); if (!stmt.addRow(query)) { return false; } listText.clear(); } if (house->getAccessList(SUBOWNER_LIST, listText) && !listText.empty()) { query << house->getId() << ',' << SUBOWNER_LIST << ',' << db.escapeString(listText); if (!stmt.addRow(query)) { return false; } listText.clear(); } for (Door* door : house->getDoors()) { if (door->getAccessList(listText) && !listText.empty()) { query << house->getId() << ',' << door->getDoorId() << ',' << db.escapeString(listText); if (!stmt.addRow(query)) { return false; } listText.clear(); } } } if (!stmt.execute()) { return false; } return transaction.commit(); }