public Task <int> BulkUpsertAsync <TEntity>( IEnumerable <TEntity> items, BulkUpsertOptions options, CancellationToken cancellationToken) where TEntity : class { BulkUpsertAsyncCallCount++; return(Task.FromResult(items.Count())); }
public static async Task <IEnumerable <DailyLeaderboard> > GetDailyLeaderboardsAsync(ISteamClientApiClient steamClient) { var expectedDailyLeaderboards = new DailyLeaderboardsEnumerable(DateTime.UtcNow.Date); var missingDaily = expectedDailyLeaderboards.First(d => d.Date == new DateTime(2017, 10, 3, 0, 0, 0, DateTimeKind.Utc)); // Add leaderboards found in local cache. // This does not perform updates since the local cache may contain bad data due to bugs from previous builds. var cachedDailyLeaderboards = JsonConvert.DeserializeObject <IEnumerable <DailyLeaderboard> >(Resources.DailyLeaderboards); var connectionString = ConfigurationManager.ConnectionStrings[nameof(LeaderboardsContext)].ConnectionString; using (var storeClient = new LeaderboardsStoreClient(connectionString)) { var options = new BulkUpsertOptions { UpdateWhenMatched = false }; await storeClient.BulkUpsertAsync(cachedDailyLeaderboards, options, default).ConfigureAwait(false); } using (var db = new LeaderboardsContext()) { // Exclude existing daily leaderboards var dailyLeaderboards = db.DailyLeaderboards.ToList(); var missingDailyLeaderboards = expectedDailyLeaderboards.Except(dailyLeaderboards, new DailyLeaderboardEqualityComparer()).ToList(); if (missingDailyLeaderboards.Any()) { // Get the leaderboard IDs for the missing leaderboards await UpdateDailyLeaderboardsAsync(steamClient, missingDailyLeaderboards).ConfigureAwait(false); // Store the new leaderboards foreach (var dailyLeaderboard in missingDailyLeaderboards) { if (dailyLeaderboard.LeaderboardId == 0) { continue; } db.DailyLeaderboards.Add(dailyLeaderboard); } db.SaveChanges(); } return((from l in db.DailyLeaderboards orderby l.Date, l.ProductId, l.IsProduction select l) .ToList()); } }
public async Task StoreDailyLeaderboardsAsync( IEnumerable <DailyLeaderboard> leaderboards, CancellationToken cancellationToken) { using (var operation = telemetryClient.StartOperation <RequestTelemetry>("Store daily leaderboards")) { try { using (var activity = new StoreActivity(Log, "daily leaderboards")) { var rowsAffected = await storeClient.BulkUpsertAsync(leaderboards, cancellationToken).ConfigureAwait(false); activity.Report(rowsAffected); } using (var activity = new StoreActivity(Log, "players")) { var players = leaderboards .SelectMany(l => l.Entries) .Select(e => e.SteamId) .Distinct() .Select(s => new Player { SteamId = s }); var options = new BulkUpsertOptions { UpdateWhenMatched = false }; var rowsAffected = await storeClient.BulkUpsertAsync(players, options, cancellationToken).ConfigureAwait(false); activity.Report(rowsAffected); } using (var activity = new StoreActivity(Log, "replays")) { var replays = leaderboards .SelectMany(l => l.Entries) .Where(e => e.ReplayId != null) .Select(e => e.ReplayId.Value) .Distinct() .Select(r => new Replay { ReplayId = r }); var options = new BulkUpsertOptions { UpdateWhenMatched = false }; var rowsAffected = await storeClient.BulkUpsertAsync(replays, options, cancellationToken).ConfigureAwait(false); activity.Report(rowsAffected); } using (var activity = new StoreActivity(Log, "daily entries")) { var entries = leaderboards.SelectMany(e => e.Entries); var rowsAffected = await storeClient.BulkUpsertAsync(entries, cancellationToken).ConfigureAwait(false); activity.Report(rowsAffected); } operation.Telemetry.Success = true; } catch (Exception) when(operation.Telemetry.MarkAsUnsuccessful()) { } } }