/** * @return void * @param Match $o_match * @desc Save the result and player(s) of the match to the database */ public function SaveHighlights(Match $o_match) { # To add a result there must always already be a match to update if (!$o_match->GetId()) { return; } require_once "stoolball/player-manager.class.php"; $player_manager = new PlayerManager($this->GetSettings(), $this->GetDataConnection()); # build query $s_match = $this->GetSettings()->GetTable('Match'); $statistics = $this->GetSettings()->GetTable('PlayerMatch'); $i_result = $o_match->Result()->GetResultType() <= 0 ? null : $o_match->Result()->GetResultType(); $player_of_match = $player_manager->SaveOrMatchPlayer($o_match->Result()->GetPlayerOfTheMatch()); $player_of_match_home = $player_manager->SaveOrMatchPlayer($o_match->Result()->GetPlayerOfTheMatchHome()); $player_of_match_away = $player_manager->SaveOrMatchPlayer($o_match->Result()->GetPlayerOfTheMatchAway()); # Check whether anything's changed and don't re-save if not $s_sql = 'SELECT match_id FROM ' . $s_match . ' '; $s_where = $this->SqlAddCondition("", 'match_result_id' . Sql::ProtectNumeric($i_result, true, true)); $s_where = $this->SqlAddCondition($s_where, 'player_of_match_id ' . Sql::ProtectNumeric($player_of_match, true, true)); $s_where = $this->SqlAddCondition($s_where, 'player_of_match_home_id ' . Sql::ProtectNumeric($player_of_match_home, true, true)); $s_where = $this->SqlAddCondition($s_where, 'player_of_match_away_id ' . Sql::ProtectNumeric($player_of_match_away, true, true)); $s_where = $this->SqlAddCondition($s_where, 'match_id = ' . Sql::ProtectNumeric($o_match->GetId())); $s_sql = $this->SqlAddWhereClause($s_sql, $s_where); $o_result = $this->GetDataConnection()->query($s_sql); if ($o_result->fetch()) { return; } # Should the match_title be regenerated? $s_sql = "SELECT custom_title FROM {$s_match} WHERE {$s_match}.match_id = " . Sql::ProtectNumeric($o_match->GetId()); $o_result = $this->GetDataConnection()->query($s_sql); $o_row = $o_result->fetch(); if (!is_null($o_row)) { $o_match->SetUseCustomTitle($o_row->custom_title); } # Save IDs of players affected by any change $affected_players = array(); if (!is_null($player_of_match)) { $affected_players[] = $player_of_match; } if (!is_null($player_of_match_home)) { $affected_players[] = $player_of_match_home; } if (!is_null($player_of_match_away)) { $affected_players[] = $player_of_match_away; } $s_sql = "SELECT player_of_match_id, player_of_match_home_id, player_of_match_away_id FROM {$s_match} WHERE {$s_match}.match_id = " . Sql::ProtectNumeric($o_match->GetId()); $o_result = $this->GetDataConnection()->query($s_sql); $row = $o_result->fetch(); if (!is_null($row)) { if (!is_null($row->player_of_match_id)) { $affected_players[] = $row->player_of_match_id; } if (!is_null($row->player_of_match_home_id)) { $affected_players[] = $row->player_of_match_home_id; } if (!is_null($row->player_of_match_away_id)) { $affected_players[] = $row->player_of_match_away_id; } } # Update the main match record # All changes from here to master data are logged, because this method can be called from the public interface $sql = "UPDATE {$s_match} SET "; if (!$o_match->GetUseCustomTitle()) { $sql .= "match_title = " . Sql::ProtectString($this->GetDataConnection(), $o_match->GetTitle()) . ", "; } $sql .= 'match_result_id = ' . Sql::ProtectNumeric($i_result, true) . ",\r\n\t\t\tplayer_of_match_id = " . Sql::ProtectNumeric($player_of_match, true) . ', ' . "player_of_match_home_id = " . Sql::ProtectNumeric($player_of_match_home, true) . ', ' . "player_of_match_away_id = " . Sql::ProtectNumeric($player_of_match_away, true) . ', update_search = 1, date_changed = ' . gmdate('U') . ", \r\n modified_by_id = " . Sql::ProtectNumeric(AuthenticationManager::GetUser()->GetId()) . ' ' . 'WHERE match_id = ' . Sql::ProtectNumeric($o_match->GetId()); $this->LoggedQuery($sql); # Copy updated match to statistics require_once 'stoolball/statistics/statistics-manager.class.php'; $statistics_manager = new StatisticsManager($this->GetSettings(), $this->GetDataConnection()); $statistics_manager->UpdateMatchDataInStatistics($this, $o_match->GetId()); # Save IDs of players affected by any change if (count($affected_players)) { $statistics_manager->UpdatePlayerOfTheMatchStatistics($o_match->GetId()); $statistics_manager->DeleteObsoleteStatistics($o_match->GetId()); $statistics_manager->UpdatePlayerStatistics($affected_players); } unset($statistics_manager); # Match data has changed so notify moderator $this->QueueForNotification($o_match->GetId(), false); }