private Tournament findAndLockTournament(int tournamentId) { Tournament tournament = null; using (var db = new SSBPDContext()) { tournament = db.Tournaments.Find(tournamentId); if (tournament.locked) { throw new TournamentLockedException(); } tournament.locked = true; db.SaveChanges(); db.Dispose(); } return(tournament); }
/** * this should only be used followed immediately by a call to "process all tournaments" */ public void ResetAllEloScores() { using (var db = new SSBPDContext()) { var allPlayers = from p in db.Players select p; foreach (Player player in allPlayers) { player.ELO = STARTING_ELO; } var allTournaments = from t in db.Tournaments select t; foreach (Tournament tournament in allTournaments) { tournament.eloProcessed = false; } db.Database.ExecuteSqlCommand("DELETE FROM EloScores"); db.SaveChanges(); } }
private void saveEloScores(IEnumerable <RatingsPlayer> players, Tournament tournament) { int i = 0; using (var db = new SSBPDContext()) { foreach (var player in players) { if (i % 20 == 0) { GC.Collect(); } // log("in save elo scores: " + GC.GetTotalMemory(false)); i++; db.Database.ExecuteSqlCommand("INSERT INTO EloScores (ELO, Date, TournamentID, PlayerID) VALUES ({0}, {1}, {2}, {3})", player.ELO, tournament.Date, tournament.TournamentID, player.PlayerId); } } }
public void adjustEloScoresForTournament(int tournamentId) { log("adjusting scores for tournament id = " + tournamentId); Tournament tournament = findAndLockTournament(tournamentId); //log("after tournament locked and disposal: " + GC.GetTotalMemory(false)); var db = new SSBPDContext(); IEnumerable <RatingsSet> sets; sets = from s in db.Sets where s.TournamentID == tournamentId select new RatingsSet() { WinnerID = s.WinnerID, LoserID = s.LoserID, isDraw = s.isDraw }; HashSet <int> playerIDs = new HashSet <int>(); foreach (RatingsSet set in sets) { playerIDs.Add(set.WinnerID); playerIDs.Add(set.LoserID); } var players = (from p in db.Players where playerIDs.Contains(p.PlayerId) select new RatingsPlayer() { PlayerId = p.PlayerId, ELO = p.ELO }).ToList(); // log("after getting players: " + GC.GetTotalMemory(false)); playerIDs = null; GC.Collect(); // log("after cleaning up playerIds: " + GC.GetTotalMemory(false)); var playerToEloChange = new Dictionary <int, double>(); foreach (var player in players) { // log("adding to playerToEloChange, memory: " + GC.GetTotalMemory(false)); playerToEloChange[player.PlayerId] = calculator.calculateRatingChangeForPlayer(player, sets, players); } // log("after calculating upcoming elo changes: " + GC.GetTotalMemory(false)); int i = 0; using (var tdb = new SSBPDContext()) { string updateSql = ""; foreach (var player in players) { var newElo = player.ELO + playerToEloChange[player.PlayerId]; if (newElo < 100) { newElo = 100; } //updateSql += String.Format("UPDATE Players SET ELO = {0} WHERE PlayerId = {1};", newElo, player.PlayerId); tdb.Database.ExecuteSqlCommand("UPDATE Players SET ELO = {0} WHERE PlayerId = {1}", newElo, player.PlayerId); } //tdb.Database.ExecuteSqlCommand(updateSql); } // log("after updating elos: " + GC.GetTotalMemory(false)); tournament = db.Tournaments.Find(tournamentId); foreach (var player in players) { player.ELO += playerToEloChange[player.PlayerId]; } playerToEloChange = null; saveEloScores(players, tournament); // log("after saving elos: " + GC.GetTotalMemory(false)); tournament.locked = false; tournament.eloProcessed = true; db.SaveChanges(); db.Dispose(); // log("Exiting method for tournament id= " + tournament.TournamentID + ": " + GC.GetTotalMemory(false)); GC.Collect(); }