public async Task <int> SaveStreamEntriesAsync(IEnumerable <IRawStreamEntry> rawStreamEntries) { int result; using (var transaction = new AsyncTransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })) using (var scope = dbContextScopeFactory.Create()) { var dbContext = scope.DbContexts.Get <TDbContext>(); var commitId = Guid.NewGuid().ToString(); foreach (var rawStreamEntry in rawStreamEntries) { rawStreamEntry.CommitId = commitId; } dbContext.BulkInsert(rawStreamEntries.Cast <RawStreamEntry>()); result = await GetCurrentEventStoreCheckpointNumberInternalAsync(dbContext); transaction.Complete(); } return(result); }
public async Task InitializeAsync() { using (var transaction = new AsyncTransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) using (var scope = dbContextScopeFactory.Create()) { try { var dbContext = scope.DbContexts.Get <TDbContext>(); if (!CheckTableExists <RawStreamEntry>(dbContext)) { var script = dbContext.GetService <IRelationalDatabaseCreator>().GenerateCreateScript(); var steps = script.Split(new[] { "GO" }, StringSplitOptions.RemoveEmptyEntries); foreach (var step in steps) { if (string.IsNullOrWhiteSpace(step)) { continue; } dbContext.Database.ExecuteSqlRaw(step); } } await scope.SaveChangesAsync().ConfigureAwait(false); } catch (Exception e) { Debug.WriteLine(e.ToString()); throw; } transaction.Complete(); } }
public async IAsyncEnumerable <IRawStreamEntry> LoadStreamEntriesByStreamAsync(string group, string category, string streamName, int minRevision = 0, int maxRevision = int.MaxValue, Type[] payloadTypes = null, bool ascending = true, int take = int.MaxValue) { var taken = 0; List <RawStreamEntry> rawStreamEntries = null; var payloadValues = GetPayloadValues(payloadTypes); while (true) { using (var transaction = new AsyncTransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead })) using (var scope = dbContextScopeFactory.Create()) { var dbContext = scope.DbContexts.Get <TDbContext>(); try { IQueryable <RawStreamEntry> query = dbContext.Set <RawStreamEntry>().AsNoTracking(); query = query.Where(x => x.StreamRevision >= minRevision && x.StreamRevision <= maxRevision); if (!string.IsNullOrWhiteSpace(streamName)) { query = query.Where(x => x.StreamName == streamName); } if (payloadValues is object) { query = query.Where(x => payloadValues.Contains(x.PayloadType)); } if (group != null && group != GroupConstants.All) { query = query.Where(x => x.Group == group); } if (category != null) { query = query.Where(x => x.Category == category); } if (ascending) { query = query.OrderBy(x => x.CheckpointNumber); } else { query = query.OrderByDescending(x => x.CheckpointNumber); } var nextBatchSize = Math.Min(take - taken, batchSize); query = query.Take(nextBatchSize); rawStreamEntries = await query.ToListAsync(); } finally { transaction.Complete(); } } if (rawStreamEntries.Count == 0) { yield break; } foreach (var streamEntry in rawStreamEntries) { yield return(streamEntry); } taken += rawStreamEntries.Count; if (taken >= take) { yield break; } if (ascending) { minRevision = rawStreamEntries[rawStreamEntries.Count - 1].StreamRevision + 1; } else { maxRevision -= take; } } }
public async IAsyncEnumerable <IRawStreamEntry> LoadStreamEntriesAsync(string group, string category, int minCheckpointNumber = 0, int maxCheckpointNumber = int.MaxValue, Type[] payloadTypes = null, bool ascending = true, int take = int.MaxValue) { var taken = 0; List <RawStreamEntry> rawStreamEntries = null; var payloadValues = GetPayloadValues(payloadTypes); if (!ascending && maxCheckpointNumber == int.MaxValue) { maxCheckpointNumber = await GetCurrentEventStoreCheckpointNumberAsync(); } while (true) { using (var transaction = new AsyncTransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead })) using (var scope = dbContextScopeFactory.Create()) { var dbContext = scope.DbContexts.Get <TDbContext>(); IQueryable <RawStreamEntry> query = dbContext.Set <RawStreamEntry>().AsNoTracking(); query = query.Where(x => x.CheckpointNumber >= minCheckpointNumber && x.CheckpointNumber <= maxCheckpointNumber); if (payloadValues is object) { query = query.Where(x => payloadValues.Contains(x.PayloadType)); } if (group != null && group != GroupConstants.All) { query = query.Where(x => x.Group == group); } if (category != null) { query = query.Where(x => x.Category == category); } if (ascending) { query = query.OrderBy(x => x.CheckpointNumber); } else { query = query.OrderByDescending(x => x.CheckpointNumber); } var nextBatchSize = Math.Min(take - taken, batchSize); query = query.Take(nextBatchSize); try { rawStreamEntries = await query.ToListAsync(); } catch (Exception e) { Debug.WriteLine(e.ToString()); throw; } transaction.Complete(); } if (rawStreamEntries.Count == 0) { yield break; } foreach (var streamEntry in rawStreamEntries) { yield return(streamEntry); } taken += rawStreamEntries.Count; if (taken >= take) { yield break; } if (ascending) { minCheckpointNumber = rawStreamEntries[rawStreamEntries.Count - 1].CheckpointNumber + 1; } else { maxCheckpointNumber -= take; } } }