From: Steinar H. Gunderson Date: Mon, 1 May 2023 12:58:58 +0000 (+0200) Subject: Connect insertions/type changes to the database. X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=28ad46bcaad05cd2e55ad74977053bedd3070070;p=pkanalytics Connect insertions/type changes to the database. --- diff --git a/events.cpp b/events.cpp index 414c157..381991a 100644 --- a/events.cpp +++ b/events.cpp @@ -89,7 +89,7 @@ void EventsModel::refresh_if_needed() const } // Read the events. - ret = sqlite3_prepare_v2(db, "SELECT t, player, type FROM event", -1, &stmt, 0); + ret = sqlite3_prepare_v2(db, "SELECT event, t, player, type FROM event", -1, &stmt, 0); if (ret != SQLITE_OK) { fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db)); abort(); @@ -98,9 +98,10 @@ void EventsModel::refresh_if_needed() const ret = sqlite3_step(stmt); if (ret == SQLITE_ROW) { Event e; - e.t = sqlite3_column_int(stmt, 0); - e.player_id = sqlite3_column_int(stmt, 1); - e.type = (const char *)sqlite3_column_text(stmt, 2); + e.event_id = sqlite3_column_int(stmt, 0); + e.t = sqlite3_column_int(stmt, 1); + e.player_id = sqlite3_column_int(stmt, 2); + e.type = (const char *)sqlite3_column_text(stmt, 3); events.push_back(std::move(e)); } else if (ret == SQLITE_DONE) { break; @@ -124,7 +125,7 @@ int EventsModel::insert_event(uint64_t t, int player_id) auto it = lower_bound(events.begin(), events.end(), t, [](const Event &e, uint64_t t) { return e.t < t; }); int pos = distance(events.begin(), it); - beginInsertRows(QModelIndex(), pos, pos + 1); + beginInsertRows(QModelIndex(), pos, pos); Event e; e.t = t; @@ -134,8 +135,31 @@ int EventsModel::insert_event(uint64_t t, int player_id) endInsertRows(); - // FIXME sqlite + // Insert the new row into the database. + sqlite3_stmt *stmt; + int ret = sqlite3_prepare_v2(db, "INSERT INTO event (t, player, type) VALUES (?, ?, ?)", -1, &stmt, 0); + if (ret != SQLITE_OK) { + fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db)); + abort(); + } + + sqlite3_bind_int64(stmt, 1, t); + sqlite3_bind_int64(stmt, 2, player_id); + sqlite3_bind_text(stmt, 3, e.type.data(), e.type.size(), SQLITE_STATIC); + + ret = sqlite3_step(stmt); + if (ret == SQLITE_ROW) { + fprintf(stderr, "INSERT step: %s\n", sqlite3_errmsg(db)); + abort(); + } + + ret = sqlite3_finalize(stmt); + if (ret != SQLITE_OK) { + fprintf(stderr, "INSERT finalize: %s\n", sqlite3_errmsg(db)); + abort(); + } + events[pos].event_id = sqlite3_last_insert_rowid(db); return pos; } @@ -144,5 +168,25 @@ void EventsModel::set_event_type(unsigned pos, const string &type) events[pos].type = type; emit dataChanged(createIndex(pos, 0), createIndex(pos, 2)); - // FIXME sqlite + sqlite3_stmt *stmt; + int ret = sqlite3_prepare_v2(db, "UPDATE event SET type=? WHERE event=?", -1, &stmt, 0); + if (ret != SQLITE_OK) { + fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db)); + abort(); + } + + sqlite3_bind_text(stmt, 1, type.data(), type.size(), SQLITE_STATIC); + sqlite3_bind_int64(stmt, 2, events[pos].event_id); + + ret = sqlite3_step(stmt); + if (ret == SQLITE_ROW) { + fprintf(stderr, "UPDATE step: %s\n", sqlite3_errmsg(db)); + abort(); + } + + ret = sqlite3_finalize(stmt); + if (ret != SQLITE_OK) { + fprintf(stderr, "UPDATE finalize: %s\n", sqlite3_errmsg(db)); + abort(); + } } diff --git a/events.h b/events.h index e86d02b..2652468 100644 --- a/events.h +++ b/events.h @@ -37,6 +37,7 @@ private: mutable std::map players; struct Event { + int event_id; uint64_t t; std::optional player_id; std::string type; diff --git a/stats.cpp b/stats.cpp index 9d62124..6a96266 100644 --- a/stats.cpp +++ b/stats.cpp @@ -152,7 +152,7 @@ sqlite3 *open_db(const char *filename) )", nullptr, nullptr, nullptr); // Ignore errors. sqlite3_exec(db, R"( - CREATE TABLE IF NOT EXISTS event (t INTEGER, player INTEGER, type VARCHAR, FOREIGN KEY (player) REFERENCES player(player)); + CREATE TABLE IF NOT EXISTS event (event INTEGER PRIMARY KEY, t INTEGER, player INTEGER, type VARCHAR, FOREIGN KEY (player) REFERENCES player(player)); )", nullptr, nullptr, nullptr); // Ignore errors. sqlite3_exec(db, "PRAGMA journal_mode=WAL", nullptr, nullptr, nullptr); // Ignore errors.