/* =========================================================================== oastat - a program for parsing log files and write the result to a database Copyright (C) 2012 Poul Sander This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ Source information and contacts persons can be found at https://github.com/sago007/oastat/ =========================================================================== */ #include #include #include #include #include #include "db/DbExtra.hpp" static void AppendGamesWithNoKills(cppdb::session& session, std::vector& inout) { const char* sqlSelect = "select gamenumber from oastat_games where gamenumber not in (select gamenumber from oastat_kills)"; cppdb::result res = session << sqlSelect; while(res.next()) { int gamenumber = -1; res >> gamenumber; inout.push_back(gamenumber); } } static void AppendGamesWithNoHumanKills(cppdb::session& session, std::vector& inout) { const char* sqlSelect = "select gamenumber from oastat_games where gamenumber not in (" " select k.gamenumber" " from oastat_kills k, oastat_players p" " where p.playerid = k.attacker and p.isbot = 'n' and k.target <> k.attacker and p.guid <> 'WORLD')"; cppdb::result res = session << sqlSelect; while(res.next()) { int gamenumber = -1; res >> gamenumber; inout.push_back(gamenumber); } } int main (int argc, const char* argv[]) { std::string connectstring; std::vector games_to_delete; std::shared_ptr session; try { boost::program_options::options_description desc("Allowed options"); desc.add_options() ("help,h", "Print basic usage information to stdout and quits") ("dbargs", boost::program_options::value(), "Arguments passed to the DB backend") ("delete-game,d", boost::program_options::value>(), "Delete game with a given number from the database") ("delete-games-with-no-kills", "Delete games with no kills at all") ("delete-games-with-no-human-kills", "Delete games with no kills by a human") ("config,c", boost::program_options::value >(), "Read a config file with the values. Can be given multiple times") ; boost::program_options::variables_map vm; boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm); boost::program_options::notify(vm); if (vm.count("config")) { std::vector config_filenames = vm["config"].as >(); for ( const std::string& s : config_filenames) { std::ifstream config_file(s); store(parse_config_file(config_file, desc), vm); notify(vm); } } if (vm.count("help")) { std::cout << desc << "\n"; return 1; } if (vm.count("dbargs")) { connectstring = vm["dbargs"].as(); } if (vm.count("delete-game")) { games_to_delete = vm["delete-game"].as>(); } session = std::make_shared(connectstring); if (vm.count("delete-games-with-no-kills")) { AppendGamesWithNoKills(*session, games_to_delete); } if (vm.count("delete-games-with-no-human-kills")) { AppendGamesWithNoHumanKills(*session, games_to_delete); } int deletes_since_last_commit = 0; cppdb::transaction my_scope(*session.get()); for (int game : games_to_delete) { std::cout << "Deleting " << game << "..." << std::flush; deleteGame(session.get(), game); std::cout << "done!\n"; ++deletes_since_last_commit; if (deletes_since_last_commit >= 100) { std::cout << "Commit!\n"; deletes_since_last_commit = 0; my_scope.commit(); } } session->commit(); } catch (std::exception& e) { std::cerr << "Failed!\n" << e.what() << "\n"; return 1; } return 0; }