]> git.sesse.net Git - pkanalytics/blobdiff - json.cpp
IN and OUT may be reserved words.
[pkanalytics] / json.cpp
index 56b2000da510bb15acfb76a4fe22c0eb7ed5656d..2e3398d9057d8f431aa3251ad3bb2eea42f45b38 100644 (file)
--- a/json.cpp
+++ b/json.cpp
@@ -39,6 +39,40 @@ QJsonArray export_players_to_json(sqlite3 *db)
        return players;
 }
 
+QJsonArray export_formations_to_json(sqlite3 *db)
+{
+       QJsonArray formations;
+
+       sqlite3_stmt *stmt;
+       int ret = sqlite3_prepare_v2(db, "SELECT formation, offense, name FROM formation ORDER BY name", -1, &stmt, 0);
+       if (ret != SQLITE_OK) {
+               fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
+               abort();
+       }
+       for ( ;; ) {
+               ret = sqlite3_step(stmt);
+               if (ret == SQLITE_ROW) {
+                       QJsonObject f;
+                       f.insert("formation_id", sqlite3_column_int(stmt, 0));
+                       f.insert("offense", bool(sqlite3_column_int(stmt, 1)));
+                       f.insert("name", (const char *)sqlite3_column_text(stmt, 2));
+                       formations.push_back(std::move(f));
+               } else if (ret == SQLITE_DONE) {
+                       break;
+               } else {
+                       fprintf(stderr, "SELECT 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();
+       }
+
+       return formations;
+}
+
 QJsonArray export_matches_to_json(sqlite3 *db)
 {
        QJsonArray matches;
@@ -46,7 +80,7 @@ QJsonArray export_matches_to_json(sqlite3 *db)
        // Load the events, splitting them into matches as we go.
        std::map<int, QJsonArray *> events_per_match;
        sqlite3_stmt *stmt;
-       int ret = sqlite3_prepare_v2(db, "SELECT match, t, player, type FROM event ORDER BY t", -1, &stmt, 0);
+       int ret = sqlite3_prepare_v2(db, "SELECT match, t, player, formation, type FROM event ORDER BY t", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
                abort();
@@ -61,8 +95,17 @@ QJsonArray export_matches_to_json(sqlite3 *db)
 
                        QJsonObject e;
                        e.insert("t", sqlite3_column_int(stmt, 1));
-                       e.insert("player", sqlite3_column_int(stmt, 2));
-                       e.insert("type", (const char *)sqlite3_column_text(stmt, 3));
+                       if (sqlite3_column_type(stmt, 2) == SQLITE_INTEGER) {
+                               e.insert("player", sqlite3_column_int(stmt, 2));
+                       } else {
+                               e.insert("player", QJsonValue());  // null
+                       }
+                       if (sqlite3_column_type(stmt, 3) == SQLITE_INTEGER) {
+                               e.insert("formation", sqlite3_column_int(stmt, 3));
+                       } else {
+                               e.insert("formation", QJsonValue());  // null
+                       }
+                       e.insert("type", (const char *)sqlite3_column_text(stmt, 4));
                        events_per_match[match]->push_back(std::move(e));
                } else if (ret == SQLITE_DONE) {
                        break;
@@ -78,7 +121,7 @@ QJsonArray export_matches_to_json(sqlite3 *db)
        }
 
        // Load the matches themselves.
-       ret = sqlite3_prepare_v2(db, "SELECT match, description FROM match ORDER BY match", -1, &stmt, 0);
+       ret = sqlite3_prepare_v2(db, "SELECT match, description, gender_rule_a, gender_pull_rule FROM match ORDER BY match", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
                abort();
@@ -90,6 +133,8 @@ QJsonArray export_matches_to_json(sqlite3 *db)
                        QJsonObject m;
                        m.insert("match_id", match);
                        m.insert("description", (const char *)sqlite3_column_text(stmt, 1));
+                       m.insert("gender_rule_a", (bool)sqlite3_column_int64(stmt, 2));
+                       m.insert("gender_pull_rule", (bool)sqlite3_column_int64(stmt, 3));
                        if (events_per_match.count(match)) {
                                m.insert("events", std::move(*events_per_match[match]));
                                delete events_per_match[match];
@@ -117,6 +162,7 @@ void export_to_json(sqlite3 *db, const char *filename)
 {
        QJsonObject obj;
        obj.insert("players", export_players_to_json(db));
+       obj.insert("formations", export_formations_to_json(db));
        obj.insert("matches", export_matches_to_json(db));
 
        QByteArray serialized = QString(QJsonDocument(obj).toJson(QJsonDocument::Compact)).toUtf8();