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 e.insert("player", sqlite3_column_int(stmt, 2));
65 e.insert("type", (const char *)sqlite3_column_text(stmt, 3));
66 events_per_match[match]->push_back(std::move(e));
67 } else if (ret == SQLITE_DONE) {
70 fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
74 ret = sqlite3_finalize(stmt);
75 if (ret != SQLITE_OK) {
76 fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
80 // Load the matches themselves.
81 ret = sqlite3_prepare_v2(db, "SELECT match, description FROM match ORDER BY match", -1, &stmt, 0);
82 if (ret != SQLITE_OK) {
83 fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
87 ret = sqlite3_step(stmt);
88 if (ret == SQLITE_ROW) {
89 int match = sqlite3_column_int(stmt, 0);
91 m.insert("match_id", match);
92 m.insert("description", (const char *)sqlite3_column_text(stmt, 1));
93 if (events_per_match.count(match)) {
94 m.insert("events", std::move(*events_per_match[match]));
95 delete events_per_match[match];
97 m.insert("events", QJsonArray());
99 matches.push_back(std::move(m));
100 } else if (ret == SQLITE_DONE) {
103 fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
107 ret = sqlite3_finalize(stmt);
108 if (ret != SQLITE_OK) {
109 fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
116 void export_to_json(sqlite3 *db, const char *filename)
119 obj.insert("players", export_players_to_json(db));
120 obj.insert("matches", export_matches_to_json(db));
122 QByteArray serialized = QString(QJsonDocument(obj).toJson(QJsonDocument::Compact)).toUtf8();
123 FILE *fp = fopen("ultimate.json", "w");
125 perror("ultimate.json");
128 if (fwrite(serialized.data(), serialized.size(), 1, fp) != 1) {
132 if (fclose(fp) != 0) {