
commit
34efe6ac4a
6 changed files with 143 additions and 0 deletions
@ -0,0 +1,111 @@
@@ -0,0 +1,111 @@
|
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <stdbool.h> |
||||
#include <string.h> |
||||
#include <sqlite3.h> |
||||
|
||||
typedef enum { |
||||
MAP, |
||||
PLAYER, |
||||
OVERVIEW, |
||||
NONE |
||||
} Querytype; |
||||
|
||||
inline char *get_filename(const char c, Querytype *q) { |
||||
char *qout; |
||||
switch(c) { |
||||
default: |
||||
qout = "queries/mranks.sql"; |
||||
*q = OVERVIEW; |
||||
break; |
||||
case 'm': |
||||
qout = "queries/mleaderboard-ojoin.sql"; |
||||
*q = MAP; |
||||
break; |
||||
case 'p': |
||||
qout = "queries/rplayers.sql"; |
||||
*q = PLAYER; |
||||
break; |
||||
case 't': |
||||
qout = "queries/test.txt"; |
||||
*q = NONE; |
||||
break; |
||||
} |
||||
return qout; |
||||
} |
||||
|
||||
bool executequery(const char *sql, const char *p, int tbl) { |
||||
sqlite3 *db; |
||||
char *error; |
||||
int con = sqlite3_open("db/cts.db", &db); |
||||
if (con != SQLITE_OK) { |
||||
fprintf(stderr, "Can not open database: %s\n", sqlite3_errmsg(db)); |
||||
return false; |
||||
} |
||||
sqlite3_stmt *s; |
||||
// prepare sql to s, reading until null character.
|
||||
con = sqlite3_prepare_v2(db, sql, -1, &s, NULL); |
||||
if (con != SQLITE_OK) { |
||||
fprintf(stderr, "Could not prepare SQL statement: %s\n", sqlite3_errmsg(db)); |
||||
return false; |
||||
} |
||||
// bind parameter with a string length that is the # of bytes to null char.
|
||||
con = sqlite3_bind_text(s, 1, p, -1, NULL); |
||||
int e; |
||||
unsigned int cc, i; |
||||
while ((e = sqlite3_step(s)) == SQLITE_ROW) { |
||||
cc = sqlite3_column_count(s); |
||||
for (i = 0; i < cc; i++) { |
||||
printf("%s, ", sqlite3_column_text(s, i)); |
||||
} |
||||
printf("\n"); |
||||
} |
||||
sqlite3_finalize(s); |
||||
sqlite3_close(db); |
||||
return true; |
||||
} |
||||
|
||||
// both allocates and frees memory used up by the string..
|
||||
// containing the data from query files.
|
||||
void getquery(const char *qs) { |
||||
char *qf, *qp; |
||||
Querytype qt; |
||||
char *fname = get_filename(qs[0], &qt); |
||||
if (fname != NULL) { |
||||
FILE *f = fopen(fname, "r"); |
||||
if (f != NULL && qf != NULL) { |
||||
// change from fseek/SEEK_END when sql queries are >2 GB in size.
|
||||
fseek(f, 0, SEEK_END); // go to the end of file
|
||||
unsigned int size = ftell(f); |
||||
qf = malloc(size); |
||||
if (qf != NULL) { |
||||
fseek(f, 0, SEEK_SET); // go to the start of file
|
||||
fread(qf, sizeof(char), size, f); |
||||
} |
||||
} |
||||
} |
||||
qp = strchr(qs, '=') + 1; // increment to exclude '='
|
||||
printf("%s\n", qf); |
||||
executequery(qf, qp, qt); |
||||
free(qf); |
||||
} |
||||
|
||||
void html(void) { |
||||
const char *html_top = "Content-Type: text/html\n\n\
|
||||
<html><head><meta content=\"text/html; charset=UTF-8\" />\
|
||||
<link rel=\"stylesheet\" type=\"text/css\" href=\"page.css\">\
|
||||
<title>/v/ - Xonotic</title>\ |
||||
<p class='hidden'>:-) / nice one<br></p>"; |
||||
const char *html_bot = "<br><br><p classname='footer'>Pages under construction.<br>\
|
||||
Service may sporadically become unavailable.<br>\ |
||||
In-game database is not directly synced with this web server.\ |
||||
</p>\ |
||||
</body></html>"; |
||||
getquery(getenv("QUERY_STRING")); |
||||
printf("%s %s", html_top, html_bot); |
||||
return; |
||||
} |
||||
|
||||
int main(void) { |
||||
getquery("map=pornstar-kaine"); |
||||
} |
@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
|
||||
select trank, tvalue, ifnull(alias, "Unregistered Player") |
||||
from Cts_times, Cts_ranks |
||||
left join Id2alias |
||||
on idvalue = cryptokey |
||||
where trank = idrank and Cts_times.mapid = Cts_ranks.mapid and Cts_times.mapid = ? |
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
select trank, idvalue, tvalue |
||||
from Cts_times, Cts_ranks |
||||
where trank = idrank and Cts_times.mapid = Cts_ranks.mapid and Cts_times.mapid = ? |
||||
order by trank |
||||
|
||||
-- get full leaderboard of the map |
||||
-- aliases are not included because |
||||
-- not ever player has a registered alias. |
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
select idrank, idvalue, alias |
||||
from Cts_ranks, Id2alias |
||||
where idvalue = cryptokey and mapid = ? |
||||
order by idrank |
||||
|
||||
-- get registered/aliased players who have played on |
||||
-- the specified map. |
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
select Cts_ranks.mapid, max(trank), min(tvalue), alias |
||||
from Cts_ranks, Cts_times, Id2alias |
||||
where Cts_ranks.mapid = Cts_times.mapid |
||||
and tvalue != 0 |
||||
and cryptokey = idvalue |
||||
and idrank = 1 |
||||
group by Cts_ranks.mapid |
||||
order by max(trank); |
Loading…
Reference in new issue