vg_strnull( &q, buf, 512 );
vg_strcat( &q, "SELECT * FROM \"" );
vg_strcat( &q, table_name );
- vg_strcat( &q, "\" ORDER BY time DESC LIMIT 10;" );
+ vg_strcat( &q, "\" ORDER BY time ASC LIMIT 10;" );
if( !vg_strgood(&q) )
return k_request_status_out_of_memory;
}
static void test_runner( db_request *req ){
+#if 0
vg_warn( "RUNNER\n" );
char table[DB_TABLE_UID_MAX];
if( db_get_highscore_table_name( "sr002-local-mp_mtzero",
vg_success( "Returned time: %u\n", v );
}
}
+#endif
}
+#define SIDELOAD
+#ifdef SIDELOAD
+#include "gameserver_sideload.h"
+static int bsideload = 0;
+const char *sideload_path = NULL;
+#endif
+
int main( int argc, char *argv[] ){
signal( SIGINT, inthandler );
signal( SIGQUIT, inthandler );
if( vg_long_opt( "noauth" ) )
gameserver.auth_mode = eServerModeNoAuthentication;
- /* TODO: Options to override, ammend, remove etc */
+#ifdef SIDELOAD
+ if( (arg = vg_long_opt_arg( "sideload" )) ){
+ sideload_path = arg;
+ bsideload = 1;
+ }
+#endif
}
vg_set_mem_quota( 80*1024*1024 );
db_send_request(req);
}
+#ifdef SIDELOAD
+ if( bsideload ){
+ sideload( sideload_path );
+ db_kill();
+ db_free();
+ return 0;
+ }
+#endif
+
monitor_start_server(); /* UNIX socket monitor */
/* steamworks init
--- /dev/null
+#include "gameserver.h"
+
+/* read entire binary file */
+static void *sl_file_read( const char *path, u32 *size ){
+ FILE *f = fopen( path, "rb" );
+ if( f ){
+ void *buffer = malloc(0);
+ u64 current = 0;
+
+ /* read in chunks */
+ for( u32 i=0; 1; i++ ){
+ buffer = realloc( buffer, current+VG_FILE_IO_CHUNK_SIZE );
+ u64 l = fread( buffer + current, 1, VG_FILE_IO_CHUNK_SIZE, f );
+ current += l;
+ if( l != VG_FILE_IO_CHUNK_SIZE ){
+ if( feof( f ) ){
+ break;
+ }
+ else{
+ if( ferror( f ) ){
+ fclose(f);
+ vg_fatal_error( "read error" );
+ }
+ else{
+ fclose(f);
+ vg_fatal_error( "unknown error codition" );
+ }
+ }
+ }
+ }
+
+ buffer = realloc( buffer, vg_align8(current) );
+ fclose( f );
+
+ *size = (u32)current;
+ return buffer;
+ }
+ else{
+ vg_error( "vg_disk_open_read: %s\n", strerror(errno) );
+ return NULL;
+ }
+}
+
+/* read entire file and append a null on the end */
+static char *sl_file_read_text( const char *path, u32 *sz ){
+ u32 size;
+ char *str = sl_file_read( path, &size );
+
+ if( !str )
+ return NULL;
+
+ /* include null terminator */
+ str = realloc( str, size+1 );
+ str[ size ] = '\0';
+ *sz = size+1;
+
+ return str;
+}
+
+static void sideload( const char *folder ){
+ char buf[ 4096 ];
+ vg_str str;
+ vg_strnull( &str, buf, 4096 );
+ vg_strcat( &str, folder );
+ vg_strcat( &str, "/users.csv" );
+
+ u32 sz;
+ char *data = sl_file_read_text( buf, &sz );
+ char *_c = data, *lstart = NULL;
+
+ while( *_c ){
+ char c = *_c;
+
+ if( lstart == NULL ){
+ lstart = _c;
+ }
+
+ if( c == '\n' ){
+ *_c = '\0';
+ u64 steamid;
+ char uname[48];
+ sscanf( lstart, "%lu,%s", &steamid, uname );
+ for( int i=0; i<48; i ++ ){
+ if( uname[i] == '\0' ) break;
+ if( uname[i] < ' ' || uname[i] > '~' ) uname[i] = '?';
+ }
+ lstart = NULL;
+ db_updateuser( steamid, uname, 1 );
+ }
+
+ _c ++;
+ }
+
+ free( data );
+
+ char *names[] = {
+ "sr002-local-mp_mtzero:Megapark Green",
+ "sr002-local-mp_mtzero:Megapark Blue",
+ "sr002-local-mp_mtzero:Megapark Yellow",
+ "sr002-local-mp_mtzero:Megapark Red",
+ "sr002-local-mp_mtzero:Coastal Run",
+ "sr002-local-mp_mtzero:Docks Jumps",
+ };
+
+ for( int i=0; i<6; i++ ){
+ char fn[ 4096 ];
+ sprintf( fn, "%s/00%d-track.csv", folder,i );
+
+ data = sl_file_read_text( fn, &sz );
+ _c = data, lstart = NULL;
+
+ while( *_c ){
+ char c = *_c;
+
+ if( lstart == NULL ){
+ lstart = _c;
+ }
+
+ if( c == '\n' ){
+ *_c = '\0';
+ int id, s0, score;
+ u64 steamid;
+
+ sscanf( lstart, "%d,%d,%d,%lu", &id, &s0, &score, &steamid );
+ lstart = NULL;
+ db_writeusertime( names[i], steamid, score, 1 );
+ }
+
+ _c ++;
+ }
+
+ free( data );
+
+ }
+}