@ -43,7 +43,7 @@ init_db(Database) ->
{ blue_2 , text , [ not_null ] } ] ,
{ blue_2 , text , [ not_null ] } ] ,
[ { primary_key , [ division , type , number ] } ,
[ { primary_key , [ division , type , number ] } ,
{ check , " type IN ('practice', 'qualification', 'elimination') " } ,
{ check , " type IN ('practice', 'qualification', 'elimination') " } ,
{ foreign_key , { [ division ] , divisions , [ division ] , " "} } ,
{ foreign_key , { [ division ] , divisions , [ division ] , " ON DELETE CASCADE "} } ,
{ foreign_key , { [ blue_1 ] , teams , [ team ] , " " } } ,
{ foreign_key , { [ blue_1 ] , teams , [ team ] , " " } } ,
{ foreign_key , { [ blue_2 ] , teams , [ team ] , " " } } ,
{ foreign_key , { [ blue_2 ] , teams , [ team ] , " " } } ,
{ foreign_key , { [ red_1 ] , teams , [ team ] , " " } } ,
{ foreign_key , { [ red_1 ] , teams , [ team ] , " " } } ,
@ -55,7 +55,7 @@ init_db(Database) ->
{ instance , integer , [ not_null ] } ,
{ instance , integer , [ not_null ] } ,
{ score , blob , [ not_null ] } ] ,
{ score , blob , [ not_null ] } ] ,
[ { primary_key , [ division , type , number , instance ] } ,
[ { primary_key , [ division , type , number , instance ] } ,
{ foreign_key , { [ division , type , number ] , matches , [ division , type , number ] , " "} } ] ) ,
{ foreign_key , { [ division , type , number ] , matches , [ division , type , number ] , " ON DELETE CASCADE "} } ] ) ,
ok = sqlite3 : create_table ( Database , match_states , [ { division , integer , [ not_null ] } ,
ok = sqlite3 : create_table ( Database , match_states , [ { division , integer , [ not_null ] } ,
{ type , text , [ not_null ] } ,
{ type , text , [ not_null ] } ,
@ -63,7 +63,7 @@ init_db(Database) ->
{ time , integer , [ not_null ] } ,
{ time , integer , [ not_null ] } ,
{ state , blob , [ not_null ] } ] ,
{ state , blob , [ not_null ] } ] ,
[ { primary_key , [ division , type , number , time ] } ,
[ { primary_key , [ division , type , number , time ] } ,
{ foreign_key , { [ division , type , number ] , matches , [ division , type , number ] , " "} } ] ) ,
{ foreign_key , { [ division , type , number ] , matches , [ division , type , number ] , " ON DELETE CASCADE "} } ] ) ,
ok = sqlite3 : create_table ( Database , finals , [ { number , integer , [ not_null ] } ,
ok = sqlite3 : create_table ( Database , finals , [ { number , integer , [ not_null ] } ,
{ red_1 , text , [ not_null ] } ,
{ red_1 , text , [ not_null ] } ,
@ -183,6 +183,12 @@ handle_call({add_teams, Teams}, _, State) ->
handle_call ( { assign_divisions , Teams } , _ , State ) - >
handle_call ( { assign_divisions , Teams } , _ , State ) - >
ok = assign_divisions ( State #state.database , Teams ) ,
ok = assign_divisions ( State #state.database , Teams ) ,
{ reply , ok , State } ;
{ reply , ok , State } ;
handle_call ( split_teams , _ , State ) - >
Teams = [ X | | { _ , X } < - lists : sort ( [ { rand : uniform ( ) , N } | | N < - get_teams ( State #state.database ) ] ) ] ,
[ { columns , _ } , { rows , Divisions } ] = sqlite3 : sql_exec ( State #state.database , " SELECT division FROM divisions; " ) ,
Assignments = [ { Team , ( I rem length ( Divisions ) ) + 1 } | | { I , Team } < - lists : enumerate ( Teams ) ] ,
ok = assign_divisions ( State #state.database , Assignments ) ,
{ reply , ok , State } ;
handle_call ( { delete_teams , Removed } , _ , State ) - >
handle_call ( { delete_teams , Removed } , _ , State ) - >
ok = delete_teams ( State #state.database , Removed ) ,
ok = delete_teams ( State #state.database , Removed ) ,
{ reply , ok , State } ;
{ reply , ok , State } ;
@ -202,7 +208,7 @@ handle_call({edit_division, Division, PSize, QSize, ESize}, _, State) ->
[ PSize , QSize , ESize , Division ] ) ) ,
[ PSize , QSize , ESize , Division ] ) ) ,
{ reply , ok , State } ;
{ reply , ok , State } ;
handle_call ( { delete_division , Division } , _ , State ) - >
handle_call ( { delete_division , Division } , _ , State ) - >
ok = sqlite3 : sql_exec ( State #state.database , io_lib : format ( " DELETE FROM divisions WHERE division = ~p ; " , [ Division ]) ) ,
ok = first_error ( sqlite3 : sql_exec _script ( State #state.database , io_lib : format ( " UPDATE teams SET division = NULL WHERE division = ~p ; DELETE FROM divisions WHERE division = ~p ; " , [ Division , Division ]) ) ) ,
{ reply , ok , State } ;
{ reply , ok , State } ;
handle_call ( { generate_division , Division , Round , Seed } , _ , State ) - >
handle_call ( { generate_division , Division , Round , Seed } , _ , State ) - >
Size = get_div_size ( State #state.database , Division , Round ) ,
Size = get_div_size ( State #state.database , Division , Round ) ,
@ -224,5 +230,9 @@ get_div_teams(Database, Division) ->
[ { columns , Columns } , { rows , Rows } ] = sqlite3 : sql_exec ( Database , io_lib : format ( " SELECT team FROM teams WHERE division = ~p ; " , [ Division ] ) ) ,
[ { columns , Columns } , { rows , Rows } ] = sqlite3 : sql_exec ( Database , io_lib : format ( " SELECT team FROM teams WHERE division = ~p ; " , [ Division ] ) ) ,
get_column ( " team " , Columns , Rows ) .
get_column ( " team " , Columns , Rows ) .
get_teams ( Database ) - >
[ { columns , Columns } , { rows , Rows } ] = sqlite3 : sql_exec ( Database , " SELECT team FROM teams; " ) ,
get_column ( " team " , Columns , Rows ) .
handle_cast ( _ , State ) - >
handle_cast ( _ , State ) - >
{ noreply , State } .
{ noreply , State } .