From eb2cbb15fbea6dd6f800598329cd5cc892090d7b Mon Sep 17 00:00:00 2001 From: Ilion Beyst Date: Thu, 13 Oct 2022 22:22:45 +0200 Subject: [PATCH] save matchplayer had_errors in database --- .../down.sql | 1 + .../up.sql | 1 + planetwars-server/src/db/matches.rs | 21 ++++++++++++++++++- planetwars-server/src/modules/matches.rs | 12 ++++++++--- planetwars-server/src/schema.rs | 1 + 5 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/down.sql create mode 100644 planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/up.sql diff --git a/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/down.sql b/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/down.sql new file mode 100644 index 0000000..41ee396 --- /dev/null +++ b/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/down.sql @@ -0,0 +1 @@ +ALTER TABLE match_players DROP COLUMN had_errors; \ No newline at end of file diff --git a/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/up.sql b/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/up.sql new file mode 100644 index 0000000..68ac0b7 --- /dev/null +++ b/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/up.sql @@ -0,0 +1 @@ +ALTER TABLE match_players ADD COLUMN had_errors boolean; \ No newline at end of file diff --git a/planetwars-server/src/db/matches.rs b/planetwars-server/src/db/matches.rs index d628b14..43e93a3 100644 --- a/planetwars-server/src/db/matches.rs +++ b/planetwars-server/src/db/matches.rs @@ -55,6 +55,7 @@ pub struct MatchPlayer { pub match_id: i32, pub player_id: i32, pub code_bundle_id: Option, + pub had_errors: Option, } pub struct MatchPlayerData { @@ -190,7 +191,7 @@ pub fn list_bot_matches( amount, }; - let matches = lbm.get_results::(conn)?; + let matches = lbm.get_results(conn)?; fetch_full_match_data(matches, conn) } @@ -294,6 +295,24 @@ pub fn save_match_result(id: i32, result: MatchResult, conn: &mut PgConnection) Ok(()) } +pub fn set_player_had_errors( + match_id: i32, + player_id: i32, + had_errors: bool, + conn: &mut PgConnection, +) -> QueryResult<()> { + let num_modified = diesel::update(match_players::table) + .filter(match_players::match_id.eq(match_id)) + .filter(match_players::player_id.eq(player_id)) + .set(match_players::had_errors.eq(had_errors)) + .execute(conn)?; + if num_modified == 0 { + Err(diesel::result::Error::NotFound) + } else { + Ok(()) + } +} + #[derive(QueryableByName)] pub struct BotStatsRecord { #[diesel(sql_type = Text)] diff --git a/planetwars-server/src/modules/matches.rs b/planetwars-server/src/modules/matches.rs index 71e8a98..489a9fa 100644 --- a/planetwars-server/src/modules/matches.rs +++ b/planetwars-server/src/modules/matches.rs @@ -1,4 +1,4 @@ -use diesel::{PgConnection, QueryResult}; +use diesel::{Connection, PgConnection, QueryResult}; use planetwars_matchrunner::{self as runner, docker_runner::DockerBotSpec, BotSpec, MatchConfig}; use runner::MatchOutcome; use std::{path::PathBuf, sync::Arc}; @@ -176,8 +176,14 @@ async fn run_match_task( winner: outcome.winner.map(|w| (w - 1) as i32), // player numbers in matchrunner start at 1 }; - db::matches::save_match_result(match_id, result, &mut conn) - .expect("could not save match result"); + conn.transaction(|conn| { + for (player_id, player_outcome) in outcome.player_outcomes.iter().enumerate() { + let had_errors = player_outcome.had_errors || player_outcome.crashed; + db::matches::set_player_had_errors(match_id, player_id as i32, had_errors, conn)?; + } + db::matches::save_match_result(match_id, result, conn) + }) + .expect("could not save match result"); outcome } diff --git a/planetwars-server/src/schema.rs b/planetwars-server/src/schema.rs index 27ebebe..2c5ab2a 100644 --- a/planetwars-server/src/schema.rs +++ b/planetwars-server/src/schema.rs @@ -53,6 +53,7 @@ diesel::table! { match_id -> Int4, player_id -> Int4, bot_version_id -> Nullable, + had_errors -> Nullable, } }