wesnoth/utils/stats/db2wml.c
Rusty Russell b1a0af242c Statistics CGI program and hacky display code.
This is what is running on stats.wesnoth.org.
2007-12-26 07:13:19 +00:00

121 lines
3.9 KiB
C

/* Create WML upload file for a given game. */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "database.h"
#include "utils.h"
#define DATABASE_FILE "/home/rusty/wesnoth/wesnoth-uploads.db"
int log_fd = STDERR_FILENO;
int main(int argc, char *argv[])
{
void *h;
char *q, *filename;
unsigned int i;
int level;
struct db_query *query;
if (argc != 3)
barf("Usage: %s <database> <games.rowid>\n", argv[0]);
h = db_open(argv[1]);
/*
campaign="CAMPAIGN_HEIR_TO_THE_THRONE"
difficulty="NORMAL"
scenario="Mountain_Pass"
gold="549"
time="2052"
num_turns="25"
start_turn="10"
version="1.1-svn"
*/
q = aprintf("SELECT campaign_names.name,difficulty_names.name,scenario_names.name,games.gold,games.start_time,games.start_turn,version_names.name,games.result,games.end_time,games.end_gold,games.game_number,players.id FROM players,campaign_names,difficulty_names,scenario_names,campaigns,scenarios,games,version_names WHERE games.rowid='%s' AND games.scenario_ref = scenarios.rowid AND scenarios.campaign_ref = campaigns.rowid AND campaigns.difficulty_name_ref = difficulty_names.rowid AND campaigns.campaign_name_ref = campaign_names.rowid AND games.version_name_ref = version_names.rowid AND campaigns.player_ref = players.rowid AND scenario_names.rowid = scenarios.scenario_name_ref;", argv[2]);
query = db_query(h, q);
if (atoi(query->rows[0][8]) - atoi(query->rows[0][4]) < 100) {
fprintf(stderr, "Only lasted from '%s' to '%s'\n",
query->rows[0][4], query->rows[0][8]);
exit(0);
}
filename = aprintf("%08i", atoi(query->rows[0][10]));
dup2(open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0666), STDOUT_FILENO);
printf("format_version=\"1\"\n"
"version=\"%s\"\n"
"id=\"%s\"\n",
query->rows[0][6],
query->rows[0][11]);
printf("[game]\n"
"\tcampaign=\"%s\"\n"
"\tdifficulty=\"%s\"\n"
"\tscenario=\"%s\"\n"
"\tgold=\"%s\"\n"
"\ttime=\"%s\"\n"
"\tstart_turn=\"%s\"\n",
query->rows[0][0],
query->rows[0][1],
query->rows[0][2],
query->rows[0][3],
query->rows[0][4],
query->rows[0][5]);
if (streq(query->rows[0][7], "0")) {
printf("\t[quit]\n"
"\t\ttime=\"%s\"\n"
"\t[/quit]\n",
query->rows[0][8]);
} else if (streq(query->rows[0][7], "1")) {
printf("\t[victory]\n"
"\t\ttime=\"%s\"\n"
"\t\tgold=\"%s\"\n"
"\t[/victory]\n",
query->rows[0][8],
query->rows[0][9]);
} else {
printf("\t[defeat]\n"
"\t\ttime=\"%s\"\n"
"\t[/defeat]\n",
query->rows[0][8]);
}
q = aprintf("SELECT unit_names.name,special_units.level,special_units.experience FROM unit_names,special_units WHERE special_units.game_ref = '%s' AND unit_names.rowid = special_units.unit_name_ref;", argv[2]);
query = db_query(h, q);
for (i = 0; i < query->num_rows; i++)
printf("\t[special-unit]\n"
"\t\tname=\"%s\"\n"
"\t\tlevel=\"%s\"\n"
"\t\texperience=\"%s\"\n"
"\t[/special-unit]\n",
query->rows[i][0], query->rows[i][1],query->rows[i][2]);
level = -1;
printf("\t[units-by-level]\n");
q = aprintf("SELECT unit_types.level,unit_types.name,unit_tallies.count FROM unit_tallies,unit_types WHERE unit_tallies.game_ref = '%s' AND unit_types.rowid = unit_tallies.unit_type_ref ORDER BY unit_types.level ASC;", argv[2]);
query = db_query(h, q);
for (i = 0; i < query->num_rows; i++) {
if (atoi(query->rows[i][0]) != level) {
if (i != 0)
printf("\t\t[/%i]\n", level);
level = atoi(query->rows[i][0]);
printf("\t\t[%i]\n", level);
}
printf("\t\t\t[%s]\n"
"\t\t\t\tcount=\"%s\"\n"
"\t\t\t[/%s]\n",
query->rows[i][1], query->rows[i][2],query->rows[i][1]);
}
if (i != 0)
printf("\t\t[/%i]\n", level);
printf("\t[/units-by-level]\n"
"[/game]\n");
return 0;
}