protected override async Task SetStreamMetadataInternal(
            string streamId,
            int expectedStreamMetadataVersion,
            int?maxAge,
            int?maxCount,
            string metadataJson,
            CancellationToken cancellationToken)
        {
            using (_lock.UseWriteLock())
            {
                string metaStreamId = $"$${streamId}";

                var metadataMessage = new MetadataMessage
                {
                    StreamId = streamId,
                    MaxAge   = maxAge,
                    MaxCount = maxCount,
                    MetaJson = metadataJson
                };
                var json       = SimpleJson.SerializeObject(metadataMessage);
                var newmessage = new NewStreamMessage(Guid.NewGuid(), "$stream-metadata", json);

                AppendToStreamInternal(metaStreamId, expectedStreamMetadataVersion, new[] { newmessage });

                await CheckStreamMaxCount(streamId, metadataMessage.MaxCount, cancellationToken);
            }
        }
        protected override async Task <SetStreamMetadataResult> SetStreamMetadataInternal(
            string streamId,
            int expectedStreamMetadataVersion,
            int?maxAge,
            int?maxCount,
            string metadataJson,
            CancellationToken cancellationToken)
        {
            using (_lock.UseWriteLock())
            {
                string metaStreamId = $"$${streamId}";

                var metadataMessage = new MetadataMessage
                {
                    StreamId = streamId,
                    MaxAge   = maxAge,
                    MaxCount = maxCount,
                    MetaJson = metadataJson
                };
                var json             = SimpleJson.SerializeObject(metadataMessage);
                var messageId        = MetadataMessageIdGenerator.Create(metaStreamId, expectedStreamMetadataVersion, json);
                var newStreamMessage = new NewStreamMessage(messageId, "$stream-metadata", json);

                var result = AppendToStreamInternal(metaStreamId, expectedStreamMetadataVersion, new[] { newStreamMessage });

                await CheckStreamMaxCount(streamId, metadataMessage.MaxCount, cancellationToken);

                return(new SetStreamMetadataResult(result.CurrentVersion));
            }
        }
        protected override async Task <SetStreamMetadataResult> SetStreamMetadataInternal(
            string streamId,
            int expectedStreamMetadataVersion,
            int?maxAge,
            int?maxCount,
            string metadataJson,
            CancellationToken cancellationToken)
        {
            MsSqlAppendResult result;

            using (var connection = _createConnection())
            {
                var streamIdInfo = new StreamIdInfo(streamId);

                await connection.OpenAsync(cancellationToken).NotOnCapturedContext();

                using (var transaction = connection.BeginTransaction())
                {
                    var metadataMessage = new MetadataMessage
                    {
                        StreamId = streamId,
                        MaxAge   = maxAge,
                        MaxCount = maxCount,
                        MetaJson = metadataJson
                    };
                    var json      = SimpleJson.SerializeObject(metadataMessage);
                    var messageId = MetadataMessageIdGenerator.Create(
                        streamId,
                        expectedStreamMetadataVersion,
                        json);
                    var newmessage = new NewStreamMessage(messageId, "$stream-metadata", json);

                    result = await AppendToStreamInternal(
                        connection,
                        transaction,
                        streamIdInfo.MetadataSqlStreamId,
                        expectedStreamMetadataVersion,
                        new[] { newmessage },
                        cancellationToken);

                    using (var command = new SqlCommand(_scripts.SetStreamMetadata, connection, transaction))
                    {
                        command.Parameters.AddWithValue("streamId", streamIdInfo.SqlStreamId.Id);
                        command.Parameters.AddWithValue("streamIdOriginal", streamIdInfo.SqlStreamId.IdOriginal);
                        command.Parameters.Add("maxAge", SqlDbType.Int);
                        command.Parameters["maxAge"].Value = maxAge ?? -1;
                        command.Parameters.Add("maxCount", SqlDbType.Int);
                        command.Parameters["maxCount"].Value = maxCount ?? -1;
                        await command.ExecuteNonQueryAsync(cancellationToken);
                    }

                    transaction.Commit();
                }
            }

            await CheckStreamMaxCount(streamId, maxCount, cancellationToken);

            return(new SetStreamMetadataResult(result.CurrentVersion));
        }
        protected override async Task <SetStreamMetadataResult> SetStreamMetadataInternal(
            string streamId,
            int expectedStreamMetadataVersion,
            int?maxAge,
            int?maxCount,
            string metadataJson,
            CancellationToken cancellationToken)
        {
            MsSqlAppendResult result;

            using (var connection = _createConnection())
            {
                await connection.OpenAsync(cancellationToken).NotOnCapturedContext();

                using (var transaction = connection.BeginTransaction())
                {
                    var streamIdInfo = new StreamIdInfo(streamId);

                    var metadataMessage = new MetadataMessage
                    {
                        StreamId = streamId,
                        MaxAge   = maxAge,
                        MaxCount = maxCount,
                        MetaJson = metadataJson
                    };
                    var json      = SimpleJson.SerializeObject(metadataMessage);
                    var messageId = MetadataMessageIdGenerator.Create(
                        streamIdInfo.MetadataSqlStreamId.IdOriginal,
                        expectedStreamMetadataVersion,
                        json);
                    var message = new NewStreamMessage(messageId, "$stream-metadata", json);

                    result = await AppendToStreamInternal(
                        connection,
                        transaction,
                        streamIdInfo.MetadataSqlStreamId,
                        expectedStreamMetadataVersion,
                        new[] { message },
                        cancellationToken);

                    transaction.Commit();
                }
            }

            await CheckStreamMaxCount(streamId, maxCount, cancellationToken);

            return(new SetStreamMetadataResult(result.CurrentVersion));
        }
Esempio n. 5
0
        public static NpgsqlParameter MetadataStreamMessage(
            PostgresqlStreamId streamId,
            int expectedVersion,
            MetadataMessage value)
        {
            var jsonData = SimpleJson.SerializeObject(value);

            return(new NpgsqlParameter <PostgresNewStreamMessage>
            {
                TypedValue = PostgresNewStreamMessage.FromNewStreamMessage(
                    new NewStreamMessage(
                        MetadataMessageIdGenerator.Create(streamId.IdOriginal, expectedVersion, jsonData),
                        "$stream-metadata",
                        jsonData))
            });
        }
        protected override async Task <SetStreamMetadataResult> SetStreamMetadataInternal(
            string streamId,
            int expectedStreamMetadataVersion,
            int?maxAge,
            int?maxCount,
            string metadataJson,
            CancellationToken cancellationToken)
        {
            int currentVersion;

            var metadata = new MetadataMessage
            {
                StreamId = streamId,
                MaxAge   = maxAge,
                MaxCount = maxCount,
                MetaJson = metadataJson
            };

            var streamIdInfo = new StreamIdInfo(streamId);

            using (var connection = await OpenConnection(cancellationToken))
                using (var transaction = connection.BeginTransaction())
                    using (var command = BuildFunctionCommand(
                               _schema.SetStreamMetadata,
                               transaction,
                               Parameters.StreamId(streamIdInfo.PostgresqlStreamId),
                               Parameters.StreamIdOriginal(streamIdInfo.PostgresqlStreamId),
                               Parameters.MetadataStreamId(streamIdInfo.MetadataPosgresqlStreamId),
                               Parameters.MetadataStreamIdOriginal(streamIdInfo.MetadataPosgresqlStreamId),
                               Parameters.OptionalMaxAge(metadata.MaxAge),
                               Parameters.OptionalMaxCount(metadata.MaxCount),
                               Parameters.ExpectedVersion(expectedStreamMetadataVersion),
                               Parameters.CreatedUtc(_settings.GetUtcNow?.Invoke()),
                               Parameters.MetadataStreamMessage(
                                   streamIdInfo.MetadataPosgresqlStreamId,
                                   expectedStreamMetadataVersion,
                                   metadata)))
                    {
                        currentVersion = (int)await command.ExecuteScalarAsync(cancellationToken).NotOnCapturedContext();

                        await transaction.CommitAsync(cancellationToken).NotOnCapturedContext();
                    }

            await TryScavenge(streamIdInfo, cancellationToken);

            return(new SetStreamMetadataResult(currentVersion));
        }
Esempio n. 7
0
        protected override async Task <SetStreamMetadataResult> SetStreamMetadataInternal(
            string streamId,
            int expectedStreamMetadataVersion,
            int?maxAge,
            int?maxCount,
            string metadataJson,
            CancellationToken cancellationToken)
        {
            Tuple <int?, int> result;

            using (var connection = _createConnection())
            {
                await connection.OpenAsync(cancellationToken);

                using (var transaction = connection.BeginTransaction())
                {
                    var streamIdInfo = new StreamIdInfo(streamId);

                    var metadataMessage = new MetadataMessage
                    {
                        StreamId = streamId,
                        MaxAge   = maxAge,
                        MaxCount = maxCount,
                        MetaJson = metadataJson
                    };
                    var json       = SimpleJson.SerializeObject(metadataMessage);
                    var newmessage = new NewStreamMessage(Guid.NewGuid(), "$stream-metadata", json);

                    result = await AppendToStreamInternal(
                        connection,
                        transaction,
                        streamIdInfo.MetadataSqlStreamId,
                        expectedStreamMetadataVersion,
                        new[] { newmessage },
                        cancellationToken);

                    transaction.Commit();
                }
            }

            await CheckStreamMaxCount(streamId, maxCount, cancellationToken);

            return(new SetStreamMetadataResult(result.Item2)); //Item2 = CurrentVersion
        }
        protected override async Task <SetStreamMetadataResult> SetStreamMetadataInternal(
            string streamId,
            int expectedVersion,
            int?maxAge,
            int?maxCount,
            string metadataJson,
            CancellationToken cancellationToken)
        {
            GuardAgainstDisposed();
            cancellationToken.ThrowIfCancellationRequested();

            var metadataMessage = new MetadataMessage
            {
                StreamId = streamId,
                MaxAge   = maxAge,
                MaxCount = maxCount,
                MetaJson = metadataJson
            };
            var json      = SimpleJson.SerializeObject(metadataMessage);
            var messageId = MetadataMessageIdGenerator.Create(
                streamId,
                expectedVersion,
                json
                );
            var message = new NewStreamMessage(messageId, "$stream-metadata", json);

            var idinfo = new StreamIdInfo(streamId);
            var result = await AppendToStreamInternal(
                idinfo.MetadataSqlStreamId.IdOriginal,
                expectedVersion,
                new[] { message },
                cancellationToken).NotOnCapturedContext();


            CheckStreamMaxCount(streamId, maxCount, cancellationToken).Wait(cancellationToken);

            return(new SetStreamMetadataResult(result.CurrentVersion));
        }
        protected override async Task <SetStreamMetadataResult> SetStreamMetadataInternal(
            string streamId,
            int expectedStreamMetadataVersion,
            int?maxAge,
            int?maxCount,
            string metadataJson,
            CancellationToken cancellationToken)
        {
            var metadata = new MetadataMessage
            {
                StreamId = streamId,
                MaxAge   = maxAge,
                MaxCount = maxCount,
                MetaJson = metadataJson
            };

            var metadataMessageJsonData = SimpleJson.SerializeObject(metadata);

            var streamIdInfo = new StreamIdInfo(streamId);

            var currentVersion = Parameters.CurrentVersion();

            try
            {
                using (var connection = await OpenConnection(cancellationToken))
                    using (var transaction = await connection.BeginTransactionAsync(cancellationToken).ConfigureAwait(false))
                        using (var command = BuildStoredProcedureCall(
                                   _schema.SetStreamMetadata,
                                   transaction,
                                   Parameters.StreamId(streamIdInfo.MySqlStreamId),
                                   Parameters.MetadataStreamId(streamIdInfo.MetadataMySqlStreamId),
                                   Parameters.MetadataStreamIdOriginal(streamIdInfo.MetadataMySqlStreamId),
                                   Parameters.OptionalMaxAge(metadata.MaxAge),
                                   Parameters.OptionalMaxCount(metadata.MaxCount),
                                   Parameters.ExpectedVersion(expectedStreamMetadataVersion),
                                   Parameters.CreatedUtc(_settings.GetUtcNow?.Invoke()),
                                   Parameters.MetadataMessageMessageId(
                                       streamIdInfo.MetadataMySqlStreamId,
                                       expectedStreamMetadataVersion,
                                       metadataMessageJsonData),
                                   Parameters.MetadataMessageType(),
                                   Parameters.MetadataMessageJsonData(metadataMessageJsonData),
                                   currentVersion,
                                   Parameters.CurrentPosition()))
                        {
                            await command.ExecuteNonQueryAsync(cancellationToken).NotOnCapturedContext();

                            await transaction.CommitAsync(cancellationToken).NotOnCapturedContext();
                        }

                await TryScavenge(streamIdInfo, cancellationToken);

                return(new SetStreamMetadataResult((int)currentVersion.Value));
            }
            catch (MySqlException ex) when(ex.IsWrongExpectedVersion())
            {
                throw new WrongExpectedVersionException(
                          ErrorMessages.AppendFailedWrongExpectedVersion(
                              streamIdInfo.MetadataMySqlStreamId.IdOriginal,
                              expectedStreamMetadataVersion),
                          streamIdInfo.MetadataMySqlStreamId.IdOriginal,
                          ExpectedVersion.Any,
                          ex);
            }
        }