コード例 #1
0
        public void AddFile(FileSegment segment, CancellationToken cancellationToken, IProgressHandler progress)
        {
            string name = segment.Name;
            string path = segment.Path;

            Guard.IsNotNullOrEmpty(name, nameof(name));
            Guard.IsNotNullOrEmpty(path, nameof(path));

            stream.Write(StreamKind.FS_CODE);
            stream.Write(2 * name.Length);
            for (int n = 0; n < name.Length; n++)
            {
                stream.Write(name[n]);
            }
            IStreamPosition sizePosition = stream.SavePosition();

            stream.Write(0L);

            using (FileEncodingInputStream fileStream = new FileEncodingInputStream(path, platform)) {
                long sequenceLength = encoder.Encode(fileStream, stream, encodingToken, cancellationToken, progress);
                LayoutStreamInMemory(sequenceLength);
                IStreamPosition endPosition = stream.SavePosition();
                stream.RestorePosition(sizePosition);
                stream.Write(sequenceLength);
                stream.RestorePosition(endPosition);
            }
        }
コード例 #2
0
        public void SaveRestorePositionTest1()
        {
            MemoryStream memoryStream = new MemoryStream();

            using (FileEncodingOutputStream stream = CreateFileEncodingOutputStream(memoryStream)) {
                IStreamPosition position = stream.SavePosition();
                Assert.IsNotNull(position);
                stream.RestorePosition(position);

                WriteBitString(stream, "11111111");
                Assert.AreEqual(new byte[] { 0xFF }, memoryStream.ToArray());
            }
        }
コード例 #3
0
        public async Task SubscribeToStreams(IStreamPosition streamPosition, params SubscriptionInfo[] eventTypes)
        {
            var           methods       = new Dictionary <string, Func <IStreamSubscription, ResolvedEvent, CancellationToken, Task> >();
            var           prefixes      = eventTypes.Select(x => x.EventType.Name).ToArray();
            var           filter        = EventTypeFilter.Prefix(prefixes);
            FilterOptions filterOptions = new FilterOptions(filter);

            var esStreamPosition = ((StreamPosition)(streamPosition)).GlobalPosition;

            var handlers = eventTypes.ToDictionary(x => x.EventType.Name, x => x.HandlerType);
            var dict     = eventTypes.Select(x => x.EventType).ToDictionary(x => x.Name);
            await _connection.SubscribeToAllAsync(esStreamPosition, async (s, r, c) =>
            {
                await OnEventAppearead(s, r, methods, handlers, dict, c);
            }, true, OnDropped, filterOptions);
        }
コード例 #4
0
ファイル: EventStore.cs プロジェクト: marciogoularte/Revo
        public async Task <EventStreamSlice> GetAllEventsBackwardsAsync(IStreamPosition position = null, int?maxCount = null)
        {
            var rows = crudRepository.FindAll <EventStreamRow>();

            rows = rows.OrderByDescending(x => x.GlobalSequenceNumber);

            if (position != null)
            {
                GlobalEventStreamPosition globalPosition = position as GlobalEventStreamPosition;
                if (globalPosition == null)
                {
                    throw new ArgumentException("Invalid IStreamPosition handle passed to EventStore.GetAllEventsBackwardsAsync");
                }

                rows = rows.Where(x => x.GlobalSequenceNumber < globalPosition.LastGlobalSequenceNumberRead);
            }

            if (maxCount != null)
            {
                rows = rows.Take(maxCount.Value);
            }

            var eventRows = await rows.ToListAsync(crudRepository);

            var events = Enumerable.Range(1, eventRows.Count)
                         .Select(i => eventRows[eventRows.Count - i]) //reverse order - despite reading from the end, we still want events to be in oldest-to-newest order
                         .Select(SelectEventRecordFromRow)
                         .ToList();

            IStreamPosition newPosition = null;

            if (maxCount == 0)
            {
                newPosition = position;
            }
            else if (events.Count > 0 && events[0].StreamSequenceNumber > 1)
            {
                newPosition = new GlobalEventStreamPosition(events[0].StreamSequenceNumber);
            }

            EventStreamSlice slice = new EventStreamSlice(events, newPosition);

            return(slice);
        }
コード例 #5
0
        public void SaveRestorePositionTest2()
        {
            MemoryStream memoryStream = new MemoryStream();

            using (FileEncodingOutputStream stream = CreateFileEncodingOutputStream(memoryStream)) {
                IStreamPosition p1 = stream.SavePosition();
                WriteBitString(stream, "11111111");
                IStreamPosition p2 = stream.SavePosition();
                WriteBitString(stream, "00000000");
                IStreamPosition p3 = stream.SavePosition();
                WriteBitString(stream, "11111111");
                IStreamPosition p4 = stream.SavePosition();

                stream.RestorePosition(p2);
                WriteBitString(stream, "10010110");
                stream.RestorePosition(p1);
                WriteBitString(stream, "10011001");
                stream.RestorePosition(p4);
                WriteBitString(stream, "00000001");
                stream.RestorePosition(p3);
                WriteBitString(stream, "00001111");
                Assert.AreEqual(new byte[] { 0x99, 0x69, 0xF0, 0x80 }, memoryStream.ToArray());
            }
        }
コード例 #6
0
 void IEncodingOutputStream.RestorePosition(IStreamPosition position)
 {
     index = ((StreamPosition)position).Index;
 }
コード例 #7
0
 public void RestorePosition(IStreamPosition position)
 {
     Guard.IsNotNull(position, nameof(position));
     fileStream.Position = ((StreamPosition)position).Position;
 }
コード例 #8
0
 public EventStreamSlice(IEnumerable <IEventStoreRecord> events, IStreamPosition nextPosition)
 {
     Events       = events;
     NextPosition = nextPosition;
 }