2 #include <QJsonDocument>
7 QJsonArray export_players_to_json(sqlite3 *db)
12 int ret = sqlite3_prepare_v2(db, "SELECT player, number, name, gender FROM player ORDER BY (number+0), number", -1, &stmt, 0);
13 if (ret != SQLITE_OK) {
14 fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
18 ret = sqlite3_step(stmt);
19 if (ret == SQLITE_ROW) {
21 p.insert("player_id", sqlite3_column_int(stmt, 0));
22 p.insert("number", (const char *)sqlite3_column_text(stmt, 1));
23 p.insert("name", (const char *)sqlite3_column_text(stmt, 2));
24 p.insert("gender", (const char *)sqlite3_column_text(stmt, 3));
25 players.push_back(std::move(p));
26 } else if (ret == SQLITE_DONE) {
29 fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
33 ret = sqlite3_finalize(stmt);
34 if (ret != SQLITE_OK) {
35 fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
42 QJsonArray export_matches_to_json(sqlite3 *db)
46 // Load the events, splitting them into matches as we go.
47 std::map<int, QJsonArray *> events_per_match;
49 int ret = sqlite3_prepare_v2(db, "SELECT match, t, player, type FROM event ORDER BY t", -1, &stmt, 0);
50 if (ret != SQLITE_OK) {
51 fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
55 ret = sqlite3_step(stmt);
56 if (ret == SQLITE_ROW) {
57 int match = sqlite3_column_int(stmt, 0);
58 if (events_per_match.count(match) == 0) {
59 events_per_match[match] = new QJsonArray;
63 e.insert("t", sqlite3_column_int(stmt, 1));
64 if (sqlite3_column_type(stmt, 2) == SQLITE_INTEGER) {
65 e.insert("player", sqlite3_column_int(stmt, 2));
67 e.insert("player", QJsonValue()); // null
69 e.insert("type", (const char *)sqlite3_column_text(stmt, 3));
70 events_per_match[match]->push_back(std::move(e));
71 } else if (ret == SQLITE_DONE) {
74 fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
78 ret = sqlite3_finalize(stmt);
79 if (ret != SQLITE_OK) {
80 fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
84 // Load the matches themselves.
85 ret = sqlite3_prepare_v2(db, "SELECT match, description FROM match ORDER BY match", -1, &stmt, 0);
86 if (ret != SQLITE_OK) {
87 fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
91 ret = sqlite3_step(stmt);
92 if (ret == SQLITE_ROW) {
93 int match = sqlite3_column_int(stmt, 0);
95 m.insert("match_id", match);
96 m.insert("description", (const char *)sqlite3_column_text(stmt, 1));
97 if (events_per_match.count(match)) {
98 m.insert("events", std::move(*events_per_match[match]));
99 delete events_per_match[match];
101 m.insert("events", QJsonArray());
103 matches.push_back(std::move(m));
104 } else if (ret == SQLITE_DONE) {
107 fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
111 ret = sqlite3_finalize(stmt);
112 if (ret != SQLITE_OK) {
113 fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
120 void export_to_json(sqlite3 *db, const char *filename)
123 obj.insert("players", export_players_to_json(db));
124 obj.insert("matches", export_matches_to_json(db));
126 QByteArray serialized = QString(QJsonDocument(obj).toJson(QJsonDocument::Compact)).toUtf8();
127 FILE *fp = fopen("ultimate.json", "w");
129 perror("ultimate.json");
132 if (fwrite(serialized.data(), serialized.size(), 1, fp) != 1) {
136 if (fclose(fp) != 0) {