From 662ac7f14c3d201b06e25fccc259251e87c57795 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Sun, 20 Sep 2015 20:56:25 -0400 Subject: Quick and dirty import program. This imports players and results into the AGA database format. --- scheduling/sql-import.cc | 169 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 scheduling/sql-import.cc diff --git a/scheduling/sql-import.cc b/scheduling/sql-import.cc new file mode 100644 index 0000000..6f58b2f --- /dev/null +++ b/scheduling/sql-import.cc @@ -0,0 +1,169 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using std::string; +using std::vector; +using std::map; +using std::cerr; +using std::cout; + +vector Split(const string& message, char deliminator) { + std::istringstream stream(message); + vector result; + string tmp; + while (std::getline(stream, tmp, deliminator)) { + result.emplace_back(tmp); + } + return result; +} + +struct Player { + Player(const string id, const int rank, const int desired_games) + : id_(id), rank_(rank), desired_games_(desired_games) {} + Player() = default; + Player(const Player& other) = default; + Player& operator=(const Player& other) = default; + + string id_; + int rank_; + int desired_games_; + + string DebugString() const { + std::ostringstream output; + output << "Player(id=" << id_ << ", rank=" << rank_ + << ", desired_games=" << desired_games_ << ")"; + return output.str(); + } + + string PrintRank() const { + std::ostringstream output; + output << std::abs(rank_) << (rank_ > 0 ? 'd' : 'k'); + return output.str(); + } + + string ToString() const { + std::ostringstream output; + output << id_ << " (" << std::abs(rank_) << (rank_ > 0 ? 'd' : 'k') + << ")"; + return output.str(); + } +}; + +std::unique_ptr ParsePlayer(const vector& data, int round) { + const int kPlayerTokens = 7; + if (data.size() < kPlayerTokens) { + return nullptr; + } + string id = data[0]; + std::istringstream rank_stream(data[2]); + int rank; + rank_stream >> rank; + char sign; + rank_stream >> sign; + if (sign != 'k' && sign != 'd') { + return nullptr; + } + if (sign == 'k') { + rank = -rank; + } + std::istringstream desired_games_stream(data[3 + round]); + int desired_games; + desired_games_stream >> desired_games; + return std::unique_ptr(new Player(id, rank, desired_games)); +} + + +int main() { + const string kDate = "2015-09-01"; + map players; + map player_ids; + int current_id = 1; + string line; + cerr << "Input players from sheet. End with an empty line.\n"; + while (std::getline(std::cin, line) && !line.empty()) { + std::unique_ptr player = ParsePlayer(Split(line, '\t'), 1); + if (player) { + cerr << player->DebugString() << "\n"; + players[player->id_] = *player; + player_ids[player->id_] = current_id++; + } else { + cerr << "Failed to parse player: " << line; + } + } + + cout << "insert into players (Pin_Player,Name,Rating) values "; + bool first = true; + for (const auto& e : players) { + const Player& player = e.second; + int id = player_ids[player.id_]; + if (first) { + first = false; + } else { + cout << ","; + } + cout << "(" << id << ",\"" << player.id_ << "\"," << player.rank_ << ")"; + } + cout << ";\n"; + + cerr << "Input tournament code:\n"; + std::getline(std::cin, line); + string tournament_code = line; + cerr << "Tournament " << tournament_code << "\n"; + + cerr << "Input results from sheet. End with an empty line.\n"; + cout << "insert into games (Tournament_Code,Game_Date,Pin_Player_1," + << "Color_1,Rank_1,Pin_Player_2,Color_2,Rank_2,Handicap,Komi,Result) values"; + first = true; + while (std::getline(std::cin, line) && !line.empty()) { + vector data = Split(line, '\t'); + if (data.size() < 5) { + cerr << "Error parsing result: " << line << "\n"; + continue; + } + string p1 = data[0]; + string p2 = data[1]; + std::istringstream handicap_stream(data[2]); + char dropper; + handicap_stream >> dropper; + int handicap; + handicap_stream >> handicap; + int komi; + std::istringstream komi_stream(data[3]); + komi_stream >> komi; + char result = data[4][0]; + if (result != 'W' && result != 'B') { + cerr << "Error parsing result: " << line << "\n"; + continue; + } + if (first) { + first = false; + } else { + cout << ","; + } + cout << "("; + cout << "\"" << tournament_code << "\"," + << "\"" << kDate << "\"," + << player_ids[p1] << "," + << "'W'," + << "\"" << players[p1].PrintRank() << "\"," + << player_ids[p2] << "," + << "'B'," + << "\"" << players[p2].PrintRank() << "\"," + << handicap << "," + << komi << "," + << "\"" << result << "\""; + cout << ")"; + } + cout << ";"; +} -- cgit v1.2.3