]> git.sesse.net Git - pkanalytics/blobdiff - events.cpp
Connect insertions/type changes to the database.
[pkanalytics] / events.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();
+       }
 }