]> git.sesse.net Git - pkanalytics/blobdiff - players.cpp
For the short ID of player lists, allow using the gender as group identifier.
[pkanalytics] / players.cpp
index 1854408d1bac295bce03337b5e4e28405375a721..ae60e11700d0305e54d549070eb4edde231cce0c 100644 (file)
@@ -10,7 +10,7 @@ string format_timestamp(uint64_t pos);
 
 PlayersModel::PlayersModel(sqlite3 *db) : db(db)
 {
-       load_data();
+       players = load_data();
 }
 
 QVariant PlayersModel::headerData(int section, Qt::Orientation orientation, int role) const
@@ -59,13 +59,62 @@ QVariant PlayersModel::data(const QModelIndex &index, int role) const
 
 string PlayersModel::get_player_name_by_id(unsigned player_id)
 {
-       auto it = find_if(players.begin(), players.end(), [player_id](const Player &p) { return p.player_id == player_id; });
+       auto it = find_if(players.begin(), players.end(), [player_id](const Player &p) { return p.player_id == int(player_id); });
        return it->name;
 }
 
-void PlayersModel::load_data()
+string PlayersModel::get_player_gender_by_id(unsigned player_id)
 {
-       players.clear();
+       auto it = find_if(players.begin(), players.end(), [player_id](const Player &p) { return p.player_id == int(player_id); });
+       return it->gender;
+}
+
+void PlayersModel::edit_player(int player_id, const string &number, const string &gender, const string &name)
+{
+       auto it = find_if(players.begin(), players.end(), [player_id](const Player &p) { return p.player_id == int(player_id); });
+       int old_row = distance(players.begin(), it);
+
+       sqlite3_stmt *stmt;
+       int ret = sqlite3_prepare_v2(db, "UPDATE player SET number=?, gender=?, name=? WHERE player=?", -1, &stmt, 0);
+       if (ret != SQLITE_OK) {
+               fprintf(stderr, "UPDATE prepare: %s\n", sqlite3_errmsg(db));
+               abort();
+       }
+
+       sqlite3_bind_text(stmt, 1, number.data(), number.size(), SQLITE_STATIC);
+       sqlite3_bind_text(stmt, 2, gender.data(), gender.size(), SQLITE_STATIC);
+       sqlite3_bind_text(stmt, 3, name.data(), name.size(), SQLITE_STATIC);
+       sqlite3_bind_int64(stmt, 4, player_id);
+
+       ret = sqlite3_step(stmt);
+       if (ret != SQLITE_DONE) {
+               fprintf(stderr, "UPDATE step: %s\n", sqlite3_errmsg(db));
+               abort();
+       }
+
+       ret = sqlite3_finalize(stmt);
+       if (ret != SQLITE_OK) {
+               fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
+               abort();
+       }
+
+       vector<Player> new_players = load_data();
+       it = find_if(new_players.begin(), new_players.end(), [player_id](const Player &p) { return p.player_id == int(player_id); });
+       int new_row = distance(new_players.begin(), it);
+
+       if (old_row == new_row) {
+               players = std::move(new_players);
+               emit dataChanged(createIndex(old_row, 0), createIndex(old_row, 2));
+       } else {
+               emit beginMoveRows(QModelIndex(), old_row, old_row, QModelIndex(), new_row);
+               players = std::move(new_players);
+               emit endInsertRows();
+       }
+}
+
+std::vector<PlayersModel::Player> PlayersModel::load_data()
+{
+       std::vector<Player> new_players;
 
        // Read the players.
        sqlite3_stmt *stmt;
@@ -82,7 +131,7 @@ void PlayersModel::load_data()
                        p.number = (const char *)sqlite3_column_text(stmt, 1);
                        p.name = (const char *)sqlite3_column_text(stmt, 2);
                        p.gender = (const char *)sqlite3_column_text(stmt, 3);
-                       players.push_back(p);
+                       new_players.push_back(p);
                } else if (ret == SQLITE_DONE) {
                        break;
                } else {
@@ -95,4 +144,6 @@ void PlayersModel::load_data()
                fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
                abort();
        }
+
+       return new_players;
 }