void UpdateSummoner(Summoner summoner, AllPublicSummonerDataDTO publicSummonerData, AggregatedStats[] aggregatedStats, PlayerLifeTimeStats lifeTimeStatistics, RecentGames recentGames, DbConnection connection) { int accountId = summoner.AccountId; lock (ActiveAccountIds) { // Avoid concurrent updates of the same account, it's asking for trouble and is redundant anyways // We might obtain outdated results in one query but that's a minor issue in comparison to corrupted database results if (ActiveAccountIds.Contains(accountId)) return; ActiveAccountIds.Add(accountId); } // Use a transaction because we're going to insert a fair amount of data using (var transaction = connection.BeginTransaction()) { UpdateSummonerFields(summoner, connection, true); UpdateRunes(summoner, publicSummonerData, connection); UpdateSummonerRatings(summoner, lifeTimeStatistics, connection); // A season value of zero indicates the current season only for (int season = 0; season < aggregatedStats.Length; season++) UpdateSummonerRankedStatistics(summoner, season, aggregatedStats[season], connection); UpdateSummonerGames(summoner, recentGames, connection); transaction.Commit(); } lock (ActiveAccountIds) ActiveAccountIds.Remove(accountId); }
void UpdateRunes(Summoner summoner, AllPublicSummonerDataDTO publicSummonerData, DbConnection connection) { //Remove old rune pages from the database first using (var delete = Command("delete from rune_page where summoner_id = :summoner_id", connection)) { delete.Set("summoner_id", summoner.Id); delete.Execute(); } foreach (var page in publicSummonerData.spellBook.bookPages) { string[] pageFields = { "summoner_id", "name", "is_current_rune_page", "time_created", }; using (var insert = Command("insert into rune_page ({0}) values ({1})", connection, GetGroupString(pageFields), GetPlaceholderString(pageFields))) { insert.SetFieldNames(pageFields); insert.Set(summoner.Id); insert.Set(page.name); insert.Set(page.current); insert.Set(page.createDate.ToUnixTime()); insert.Execute(); } int runePageId = GetInsertId(connection); string[] runeFields = { "rune_page_id", "rune_slot", "rune", }; foreach (var rune in page.slotEntries) { using (var insert = Command("insert into rune_slot ({0}) values ({1})", connection, GetGroupString(runeFields), GetPlaceholderString(runeFields))) { insert.SetFieldNames(runeFields); insert.Set(runePageId); insert.Set(rune.runeSlotId); insert.Set(rune.runeId); insert.Execute(); } } } }
void GetPublicSummonerData(AllPublicSummonerDataDTO publicSummonerData) { PublicSummonerData = publicSummonerData; ProcessReply(); }