コード例 #1
0
        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);
        }
コード例 #2
0
        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();
                }
        }
コード例 #3
0
        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;
                }
            }
        }
コード例 #4
0
        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;
                }
            }
        }