]> git.sesse.net Git - pkanalytics/commitdiff
Connect insertions/type changes to the database.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Mon, 1 May 2023 12:58:58 +0000 (14:58 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Mon, 1 May 2023 12:58:58 +0000 (14:58 +0200)
events.cpp
events.h
stats.cpp

index 414c1572d1ac08cf958f04dad74c28e861810437..381991a2a211603d7323c2c8efb12fe94ea3cf4f 100644 (file)
@@ -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();
+       }
 }
index e86d02bf0b1273bc11d05ebd252d5f6b641ef862..26524687ca3003741cd4bdbd04f184949b10df73 100644 (file)
--- a/events.h
+++ b/events.h
@@ -37,6 +37,7 @@ private:
        mutable std::map<int, Player> players;
 
        struct Event {
+               int event_id;
                uint64_t t;
                std::optional<int> player_id;
                std::string type;
index 9d621249cdafdb873b627bb20bb8f3fcfea4f823..6a96266a217806839237cd4ded48047266fd29c9 100644 (file)
--- 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.