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_formations_to_json(sqlite3 *db)
44 QJsonArray formations;
47 int ret = sqlite3_prepare_v2(db, "SELECT formation, offense, name FROM formation ORDER BY name", -1, &stmt, 0);
48 if (ret != SQLITE_OK) {
49 fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
53 ret = sqlite3_step(stmt);
54 if (ret == SQLITE_ROW) {
56 f.insert("formation_id", sqlite3_column_int(stmt, 0));
57 f.insert("offense", bool(sqlite3_column_int(stmt, 1)));
58 f.insert("name", (const char *)sqlite3_column_text(stmt, 2));
59 formations.push_back(std::move(f));
60 } else if (ret == SQLITE_DONE) {
63 fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
67 ret = sqlite3_finalize(stmt);
68 if (ret != SQLITE_OK) {
69 fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
76 QJsonArray export_matches_to_json(sqlite3 *db)
80 // Load the events, splitting them into matches as we go.
81 std::map<int, QJsonArray *> events_per_match;
83 int ret = sqlite3_prepare_v2(db, "SELECT match, t, player, formation, type FROM event ORDER BY t", -1, &stmt, 0);
84 if (ret != SQLITE_OK) {
85 fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
89 ret = sqlite3_step(stmt);
90 if (ret == SQLITE_ROW) {
91 int match = sqlite3_column_int(stmt, 0);
92 if (events_per_match.count(match) == 0) {
93 events_per_match[match] = new QJsonArray;
97 e.insert("t", sqlite3_column_int(stmt, 1));
98 if (sqlite3_column_type(stmt, 2) == SQLITE_INTEGER) {
99 e.insert("player", sqlite3_column_int(stmt, 2));
101 e.insert("player", QJsonValue()); // null
103 if (sqlite3_column_type(stmt, 3) == SQLITE_INTEGER) {
104 e.insert("formation", sqlite3_column_int(stmt, 3));
106 e.insert("formation", QJsonValue()); // null
108 e.insert("type", (const char *)sqlite3_column_text(stmt, 4));
109 events_per_match[match]->push_back(std::move(e));
110 } else if (ret == SQLITE_DONE) {
113 fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
117 ret = sqlite3_finalize(stmt);
118 if (ret != SQLITE_OK) {
119 fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
123 // Load the matches themselves.
124 ret = sqlite3_prepare_v2(db, "SELECT match, description FROM match ORDER BY match", -1, &stmt, 0);
125 if (ret != SQLITE_OK) {
126 fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
130 ret = sqlite3_step(stmt);
131 if (ret == SQLITE_ROW) {
132 int match = sqlite3_column_int(stmt, 0);
134 m.insert("match_id", match);
135 m.insert("description", (const char *)sqlite3_column_text(stmt, 1));
136 if (events_per_match.count(match)) {
137 m.insert("events", std::move(*events_per_match[match]));
138 delete events_per_match[match];
140 m.insert("events", QJsonArray());
142 matches.push_back(std::move(m));
143 } else if (ret == SQLITE_DONE) {
146 fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
150 ret = sqlite3_finalize(stmt);
151 if (ret != SQLITE_OK) {
152 fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
159 void export_to_json(sqlite3 *db, const char *filename)
162 obj.insert("players", export_players_to_json(db));
163 obj.insert("formations", export_formations_to_json(db));
164 obj.insert("matches", export_matches_to_json(db));
166 QByteArray serialized = QString(QJsonDocument(obj).toJson(QJsonDocument::Compact)).toUtf8();
167 FILE *fp = fopen("ultimate.json", "w");
169 perror("ultimate.json");
172 if (fwrite(serialized.data(), serialized.size(), 1, fp) != 1) {
176 if (fclose(fp) != 0) {