private string ResolveEventText(string link)
        {
            var stream      = SystemEventTypes.StreamReferenceEventToStreamId(SystemEventTypes.LinkTo, link);
            var eventNumber = SystemEventTypes.EventLinkToEventNumber(link);

            return(_streams[stream][eventNumber].EventType + ":"
                   + Encoding.UTF8.GetString(_streams[stream][eventNumber].Data));
        }
 private string TransformCatalogEvent(CheckpointTag position, ResolvedEvent resolvedEvent)
 {
     if (_definesCatalogTransform)
     {
         return(_container.TransformCatalogEvent(position, resolvedEvent));
     }
     return(SystemEventTypes.StreamReferenceEventToStreamId(resolvedEvent.EventType, resolvedEvent.Data));
 }
示例#3
0
            public void BeginRead()
            {
                _streamId = SystemEventTypes.StreamReferenceEventToStreamId(_event.EventType, _event.Data);
                var requestId = _ioDispatcher.ReadBackward(
                    SystemStreams.MetastreamOf(_streamId), -1, 1, false, Reader.ReadAs, ReadCompleted);

                if (requestId != Guid.Empty)
                {
                    Reader._activeReads.Add(requestId);
                }
            }
示例#4
0
        private void EnqueueStreamForProcessing(EventStore.Core.Data.ResolvedEvent resolvedEvent)
        {
            //TODO: consider catalog referring to earlier written events (should we check here?)
            if (resolvedEvent.OriginalEvent.LogPosition > _limitingCommitPosition)
            {
                return;
            }
            var streamId = SystemEventTypes.StreamReferenceEventToStreamId(resolvedEvent.Event.EventType, resolvedEvent.Event.Data);

            _pendingStreams.Enqueue(streamId);
            _catalogNextSequenceNumber = resolvedEvent.OriginalEventNumber;
        }
        protected override void ProcessEvent()
        {
            var channelGroup  = _slaves.Channels["slave"];
            var resolvedEvent = _message.Data;
            var streamId      = SystemEventTypes.StreamReferenceEventToStreamId(resolvedEvent.EventType, resolvedEvent.Data);

            _loadBalancer.ScheduleTask(
                streamId, (streamId_, workerIndex) =>
            {
                var channel     = channelGroup[workerIndex];
                _spoolRequestId = _spoolProcessingResponseDispatcher.PublishSubscribe(
                    channel.PublishEnvelope,
                    new ReaderSubscriptionManagement.SpoolStreamReading(
                        channel.SubscriptionId, Guid.NewGuid(), streamId_, resolvedEvent.PositionSequenceNumber,
                        _limitingCommitPosition), this);
            });
        }
示例#6
0
        public ResolvedEvent(EventStore.Core.Data.ResolvedEvent resolvedEvent, byte[] streamMetadata)
        {
            var positionEvent = resolvedEvent.Link ?? resolvedEvent.Event;

            _linkOrEventPosition = resolvedEvent.OriginalPosition.GetValueOrDefault();
            var @event = resolvedEvent.Event;

            _positionStreamId       = positionEvent.EventStreamId;
            _positionSequenceNumber = positionEvent.EventNumber;
            _eventStreamId          = @event != null ? @event.EventStreamId : null;
            _eventSequenceNumber    = @event != null ? @event.EventNumber : -1;
            _resolvedLinkTo         = positionEvent != @event;
            _position = resolvedEvent.OriginalPosition ?? new TFPos(-1, positionEvent.LogPosition);
            EventId   = @event != null ? @event.EventId : Guid.Empty;
            EventType = @event != null ? @event.EventType : null;
            IsJson    = @event != null && (@event.Flags & PrepareFlags.IsJson) != 0;
            Timestamp = positionEvent.TimeStamp;

            //TODO: handle utf-8 conversion exception
            Data = @event != null && @event.Data != null?Helper.UTF8NoBom.GetString(@event.Data) : null;

            Metadata = @event != null && @event.Metadata != null?Helper.UTF8NoBom.GetString(@event.Metadata) : null;

            PositionMetadata = _resolvedLinkTo
                ? (positionEvent.Metadata != null ? Helper.UTF8NoBom.GetString(positionEvent.Metadata) : null)
                : null;
            StreamMetadata = streamMetadata != null?Helper.UTF8NoBom.GetString(streamMetadata) : null;

            TFPos eventOrLinkTargetPosition;

            if (_resolvedLinkTo)
            {
                Dictionary <string, JToken> extraMetadata = null;
                if (positionEvent.Metadata != null && positionEvent.Metadata.Length > 0)
                {
                    //TODO: parse JSON only when unresolved link and just tag otherwise
                    CheckpointTag tag;
                    if (resolvedEvent.Link != null && resolvedEvent.Event == null)
                    {
                        var checkpointTagJson =
                            positionEvent.Metadata.ParseCheckpointTagVersionExtraJson(default(ProjectionVersion));
                        tag           = checkpointTagJson.Tag;
                        extraMetadata = checkpointTagJson.ExtraMetadata;

                        var parsedPosition = tag.Position;

                        eventOrLinkTargetPosition = parsedPosition != new TFPos(long.MinValue, long.MinValue)
                            ? parsedPosition
                            : new TFPos(-1, positionEvent.LogPosition);
                    }
                    else
                    {
                        tag = positionEvent.Metadata.ParseCheckpointTagJson();
                        var parsedPosition = tag.Position;
                        if (parsedPosition == new TFPos(long.MinValue, long.MinValue) && @event.Metadata.IsValidJson())
                        {
                            tag = @event.Metadata.ParseCheckpointTagJson();
                            if (tag != null)
                            {
                                parsedPosition = tag.Position;
                            }
                        }

                        eventOrLinkTargetPosition = parsedPosition != new TFPos(long.MinValue, long.MinValue)
                            ? parsedPosition
                            : new TFPos(-1, resolvedEvent.Event.LogPosition);
                    }
                }
                else
                {
                    eventOrLinkTargetPosition = @event != null ? new TFPos(-1, @event.LogPosition) : new TFPos(-1, positionEvent.LogPosition);
                }

                JToken deletedValue;
                IsLinkToDeletedStreamTombstone = extraMetadata != null &&
                                                 extraMetadata.TryGetValue("$deleted", out deletedValue);
                if (resolvedEvent.ResolveResult == ReadEventResult.NoStream ||
                    resolvedEvent.ResolveResult == ReadEventResult.StreamDeleted || IsLinkToDeletedStreamTombstone)
                {
                    IsLinkToDeletedStream = true;
                    var streamId = SystemEventTypes.StreamReferenceEventToStreamId(
                        SystemEventTypes.LinkTo, resolvedEvent.Link.Data);
                    _eventStreamId = streamId;
                }
            }
            else
            {
                // not a link
                eventOrLinkTargetPosition = resolvedEvent.OriginalPosition ?? new TFPos(-1, positionEvent.LogPosition);
            }
            _eventOrLinkTargetPosition = eventOrLinkTargetPosition;
        }