Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on Aug 15, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 20 additions & 16 deletions src/SqlStreamStore.MySql/MySqlScripts/DeleteStream.sql
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ DROP PROCEDURE IF EXISTS delete_stream;
CREATE PROCEDURE delete_stream(_stream_id CHAR(42),
_expected_version INT,
_created_utc TIMESTAMP(6),
_deletion_tracking_disabled BOOLEAN,
_deleted_stream_id CHAR(42),
_deleted_stream_id_original NVARCHAR(1000),
_deleted_metadata_stream_id CHAR(42),
Expand Down Expand Up @@ -55,24 +56,27 @@ BEGIN

DELETE FROM streams WHERE streams.id = _stream_id;

SELECT ROW_COUNT() INTO _affected;

IF _affected > 0
IF _deletion_tracking_disabled = FALSE
THEN
CALL append_to_stream_expected_version_any
(
_deleted_stream_id,
_deleted_stream_id_original,
_deleted_metadata_stream_id,
_created_utc,
_deleted_stream_message_message_id,
_deleted_stream_message_type,
_deleted_stream_message_json_data,
NULL,
_,
__,
___);
SELECT ROW_COUNT() INTO _affected;

IF _affected > 0
THEN
CALL append_to_stream_expected_version_any
(
_deleted_stream_id,
_deleted_stream_id_original,
_deleted_metadata_stream_id,
_created_utc,
_deleted_stream_message_message_id,
_deleted_stream_message_type,
_deleted_stream_message_json_data,
NULL,
_,
__,
___);

END IF;
END IF;
END;

Expand Down
37 changes: 21 additions & 16 deletions src/SqlStreamStore.MySql/MySqlScripts/DeleteStreamMessage.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ DROP PROCEDURE IF EXISTS delete_stream_message;

CREATE PROCEDURE delete_stream_message(_stream_id CHAR(42),
_message_id BINARY(16),
_deletion_tracking_disabled BOOLEAN,
_deleted_stream_id CHAR(42),
_deleted_stream_id_original NVARCHAR(1000),
_deleted_metadata_stream_id CHAR(42),
Expand All @@ -24,23 +25,27 @@ BEGIN
WHERE messages.stream_id_internal = _stream_id_internal
AND messages.message_id = _message_id;

IF ROW_COUNT() > 0
IF _deletion_tracking_disabled = FALSE
THEN
IF _created_utc IS NULL THEN
SET _created_utc = UTC_TIMESTAMP(6);
END IF;

CALL append_to_stream_expected_version_any(
_deleted_stream_id,
_deleted_stream_id_original,
_deleted_metadata_stream_id,
_created_utc,
_deleted_message_message_id,
_deleted_message_type,
_deleted_message_json_data,
NULL,
_,
__,
___);
IF ROW_COUNT() > 0
THEN
IF _created_utc IS NULL THEN
SET _created_utc = UTC_TIMESTAMP(6);
END IF;

CALL append_to_stream_expected_version_any(
_deleted_stream_id,
_deleted_stream_id_original,
_deleted_metadata_stream_id,
_created_utc,
_deleted_message_message_id,
_deleted_message_type,
_deleted_message_json_data,
NULL,
_,
__,
___);
END IF;
END IF;
END;
16 changes: 16 additions & 0 deletions src/SqlStreamStore.MySql/MySqlScripts/Parameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,22 @@ public static MySqlParameter MessageExists()
Direction = ParameterDirection.Output
};

public static MySqlParameter DeletionTrackingDisabled(bool value)
=> new MySqlParameter
{
MySqlDbType = MySqlDbType.Bool,
ParameterName = "_deletion_tracking_disabled",
Value = value
};

public static MySqlParameter Empty(this MySqlParameter parameter)
=> new MySqlParameter
{
ParameterName = parameter.ParameterName,
MySqlDbType = MySqlDbType.Null,
Value = DBNull.Value
};

private static MySqlParameter StreamIdInternal(MySqlStreamId streamId, string parameterName)
=> new MySqlParameter
{
Expand Down
44 changes: 32 additions & 12 deletions src/SqlStreamStore.MySql/MySqlStreamStore.Delete.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,30 @@ private async Task DeleteStreamInternal(
{
var deletedStreamMessage = Deleted.CreateStreamDeletedMessage(streamId.IdOriginal);

var deletedStreamId = Parameters.DeletedStreamId();
var deletedStreamIdOriginal = Parameters.DeletedStreamIdOriginal();
var deletedMetadataStreamId = Parameters.DeletedMetadataStreamId();
var deletedStreamMessageMessageId = Parameters.DeletedStreamMessageMessageId(deletedStreamMessage);
var deletedStreamMessageType = Parameters.DeletedStreamMessageType(deletedStreamMessage);
var deletedStreamMessageJsonData = Parameters.DeletedStreamMessageJsonData(deletedStreamMessage);

using(var command = BuildStoredProcedureCall(
_schema.DeleteStream,
transaction,
Parameters.StreamId(streamId),
Parameters.ExpectedVersion(expectedVersion),
Parameters.CreatedUtc(_settings.GetUtcNow?.Invoke()),
Parameters.DeletedStreamId(),
Parameters.DeletedStreamIdOriginal(),
Parameters.DeletedMetadataStreamId(),
Parameters.DeletedStreamMessageMessageId(deletedStreamMessage),
Parameters.DeletedStreamMessageType(deletedStreamMessage),
Parameters.DeletedStreamMessageJsonData(deletedStreamMessage)))
Parameters.DeletionTrackingDisabled(_settings.DisableDeletionTracking),
_settings.DisableDeletionTracking ? deletedStreamId.Empty() : deletedStreamId,
_settings.DisableDeletionTracking ? deletedStreamIdOriginal.Empty() : deletedStreamIdOriginal,
_settings.DisableDeletionTracking ? deletedMetadataStreamId.Empty() : deletedMetadataStreamId,
_settings.DisableDeletionTracking
? deletedStreamMessageMessageId.Empty()
: deletedStreamMessageMessageId,
_settings.DisableDeletionTracking ? deletedStreamMessageType.Empty() : deletedStreamMessageType,
_settings.DisableDeletionTracking
? deletedStreamMessageJsonData.Empty()
: deletedStreamMessageJsonData))
{
try
{
Expand Down Expand Up @@ -100,18 +112,26 @@ private async Task DeleteEventInternal(
streamIdInfo.MySqlStreamId.IdOriginal,
eventId);

var deletedStreamId = Parameters.DeletedStreamId();
var deletedStreamIdOriginal = Parameters.DeletedStreamIdOriginal();
var deletedMetadataStreamId = Parameters.DeletedMetadataStreamId();
var deletedMessageMessageId = Parameters.DeletedMessageMessageId(deletedMessageMessage);
var deletedMessageType = Parameters.DeletedMessageType(deletedMessageMessage);
var deletedMessageJsonData = Parameters.DeletedMessageJsonData(deletedMessageMessage);

using(var command = BuildStoredProcedureCall(
_schema.DeleteStreamMessage,
transaction,
Parameters.StreamId(streamIdInfo.MySqlStreamId),
Parameters.MessageId(eventId),
Parameters.DeletedStreamId(),
Parameters.DeletedStreamIdOriginal(),
Parameters.DeletedMetadataStreamId(),
Parameters.CreatedUtc(_settings.GetUtcNow?.Invoke()),
Parameters.DeletedMessageMessageId(deletedMessageMessage),
Parameters.DeletedMessageType(deletedMessageMessage),
Parameters.DeletedMessageJsonData(deletedMessageMessage)))
Parameters.DeletionTrackingDisabled(_settings.DisableDeletionTracking),
_settings.DisableDeletionTracking ? deletedStreamId.Empty() : deletedStreamId,
_settings.DisableDeletionTracking ? deletedStreamIdOriginal.Empty() : deletedStreamIdOriginal,
_settings.DisableDeletionTracking ? deletedMetadataStreamId.Empty() : deletedMetadataStreamId,
_settings.DisableDeletionTracking ? deletedMessageMessageId.Empty() : deletedMessageMessageId,
_settings.DisableDeletionTracking ? deletedMessageType.Empty() : deletedMessageType,
_settings.DisableDeletionTracking ? deletedMessageJsonData.Empty() : deletedMessageJsonData))
{
await command.ExecuteNonQueryAsync(cancellationToken).NotOnCapturedContext();
}
Expand Down
7 changes: 7 additions & 0 deletions src/SqlStreamStore.MySql/MySqlStreamStoreSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,5 +75,12 @@ public Func<string, MySqlConnection> ConnectionFactory
_connectionFactory = value;
}
}

/// <summary>
/// Disables stream and message deletion tracking. Will increase
/// performance, however subscribers won't know if a stream or a
/// message has been deleted. This can be modified at runtime.
/// </summary>
public bool DisableDeletionTracking { get; set; }
Copy link
Contributor

@pgermishuys pgermishuys May 23, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DisableDeletionTracking sounds like an operation I can perform whereas DeletionTrackingEnabled tells me it's a property that I am able to get/ set. (sorry if this comes across as nitpicking)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, but then it would not align with what's already in there for MsSqlV3. I know that people are using the beta in production and I am reluctant to break them

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gotcha!

}
}
6 changes: 6 additions & 0 deletions src/SqlStreamStore.Postgres/PgSqlScripts/DeleteStream.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ CREATE OR REPLACE FUNCTION __schema__.delete_stream(
_stream_id CHAR(42),
_expected_version INT,
_created_utc TIMESTAMP,
_deletion_tracking_disabled BOOLEAN,
_deleted_stream_id CHAR(42),
_deleted_stream_id_original VARCHAR(1000),
_deleted_stream_message __schema__.new_stream_message)
Expand Down Expand Up @@ -48,6 +49,11 @@ BEGIN

DELETE FROM __schema__.streams WHERE __schema__.streams.id = _stream_id;

IF (_deletion_tracking_disabled = TRUE)
THEN
RETURN;
END IF;

GET DIAGNOSTICS _affected = ROW_COUNT;

IF _affected > 0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
CREATE OR REPLACE FUNCTION __schema__.delete_stream_messages(
_stream_id CHAR(42),
_message_ids UUID [],
_deletion_tracking_disabled BOOLEAN,
_deleted_stream_id CHAR(42),
_deleted_stream_id_original VARCHAR(1000),
_created_utc TIMESTAMP,
Expand Down Expand Up @@ -29,7 +30,7 @@ BEGIN
FROM deleted
INTO _deleted_count;

IF _deleted_count > 0
IF (_deletion_tracking_disabled = FALSE AND _deleted_count > 0)
THEN
PERFORM __schema__.append_to_stream(
_deleted_stream_id,
Expand Down
17 changes: 17 additions & 0 deletions src/SqlStreamStore.Postgres/PgSqlScripts/Parameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -251,5 +251,22 @@ public static NpgsqlParameter Pattern(string value)
NpgsqlDbType = NpgsqlDbType.Varchar
};
}

public static NpgsqlParameter DeletionTrackingDisabled(bool deletionTrackingDisabled)
{
return new NpgsqlParameter<bool>
{
TypedValue = deletionTrackingDisabled,
NpgsqlDbType = NpgsqlDbType.Boolean
};
}

public static NpgsqlParameter Empty()
{
return new NpgsqlParameter<DBNull>
{
TypedValue = DBNull.Value
};
}
}
}
16 changes: 10 additions & 6 deletions src/SqlStreamStore.Postgres/PostgresStreamStore.Delete.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,10 @@ private async Task DeleteStreamInternal(
Parameters.StreamId(streamId),
Parameters.ExpectedVersion(expectedVersion),
Parameters.CreatedUtc(_settings.GetUtcNow?.Invoke()),
Parameters.DeletedStreamId,
Parameters.DeletedStreamIdOriginal,
Parameters.DeletedStreamMessage(streamId)))
Parameters.DeletionTrackingDisabled(_settings.DisableDeletionTracking),
_settings.DisableDeletionTracking ? Parameters.Empty() : Parameters.DeletedStreamId,
_settings.DisableDeletionTracking ? Parameters.Empty() : Parameters.DeletedStreamIdOriginal,
_settings.DisableDeletionTracking ? Parameters.Empty() : Parameters.DeletedStreamMessage(streamId)))
{
try
{
Expand Down Expand Up @@ -96,10 +97,13 @@ private async Task DeleteEventsInternal(
transaction,
Parameters.StreamId(streamIdInfo.PostgresqlStreamId),
Parameters.MessageIds(eventIds),
Parameters.DeletedStreamId,
Parameters.DeletedStreamIdOriginal,
Parameters.DeletionTrackingDisabled(_settings.DisableDeletionTracking),
_settings.DisableDeletionTracking ? Parameters.Empty() : Parameters.DeletedStreamId,
_settings.DisableDeletionTracking ? Parameters.Empty() : Parameters.DeletedStreamIdOriginal,
Parameters.CreatedUtc(_settings.GetUtcNow?.Invoke()),
Parameters.DeletedMessages(streamIdInfo.PostgresqlStreamId, eventIds)))
_settings.DisableDeletionTracking
? Parameters.Empty()
: Parameters.DeletedMessages(streamIdInfo.PostgresqlStreamId, eventIds)))
{
await command.ExecuteNonQueryAsync(cancellationToken).NotOnCapturedContext();
}
Expand Down
7 changes: 7 additions & 0 deletions src/SqlStreamStore.Postgres/PostgresStreamStoreSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,5 +89,12 @@ public Func<string, NpgsqlConnection> ConnectionFactory
_connectionFactory = value;
}
}

/// <summary>
/// Disables stream and message deletion tracking. Will increase
/// performance, however subscribers won't know if a stream or a
/// message has been deleted. This can be modified at runtime.
/// </summary>
public bool DisableDeletionTracking { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -125,12 +125,13 @@ public async Task When_delete_all_messages_from_stream_with_multiple_messages_th
[Theory, Trait("Category", "DeleteEvent")]
[InlineData("stream/id")]
[InlineData("stream%id")]
public async Task When_delete_stream_message_with_url_encodable_characters_then_should_not_throw(string streamId)
public async Task When_delete_stream_message_with_url_encodable_characters_then_should_not_throw(
string streamId)
{
var newStreamMessages = CreateNewStreamMessages(1);
await store.AppendToStream(streamId, ExpectedVersion.NoStream, newStreamMessages);

await store.DeleteMessage(streamId, newStreamMessages[0].MessageId);
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
namespace SqlStreamStore
{
using System.Threading.Tasks;
using Shouldly;
using SqlStreamStore.Streams;
using Xunit;
using static Streams.Deleted;

partial class AcceptanceTests
{
[Fact]
public async Task When_deletion_tracking_is_disabled_deleted_message_should_not_be_tracked()
{
_fixture.DisableDeletionTracking = true;

var messages = CreateNewStreamMessages(1);

await _fixture.Store.AppendToStream("stream", ExpectedVersion.NoStream, messages);

await _fixture.Store.DeleteMessage("stream", messages[0].MessageId);

var page = await store.ReadStreamBackwards(DeletedStreamId, StreamVersion.End, 1);

page.Messages.Length.ShouldBe(0);
}

[Fact]
public async Task When_deletion_tracking_is_disabled_deleted_stream_should_not_be_tracked()
{
_fixture.DisableDeletionTracking = true;

var messages = CreateNewStreamMessages(1);

await fixture.Store.AppendToStream("stream", ExpectedVersion.NoStream, messages);

await fixture.Store.DeleteStream("stream");

var page = await store.ReadStreamBackwards(DeletedStreamId, StreamVersion.End, 1);

page.Messages.Length.ShouldBe(0);
}
}
}
2 changes: 0 additions & 2 deletions tests/SqlStreamStore.AcceptanceTests/AcceptanceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,5 @@ public static StreamMessage ExpectedStreamMessage(
var id = Guid.Parse("00000000-0000-0000-0000-" + messageNumber.ToString().PadLeft(12, '0'));
return new StreamMessage(streamId, id, sequenceNumber, 0, created, "type", DefaultJsonMetadata, DefaultJsonData);
}


}
}
2 changes: 2 additions & 0 deletions tests/SqlStreamStore.AcceptanceTests/IStreamStoreFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,7 @@ public interface IStreamStoreFixture : IDisposable
long MinPosition { get; set; }

int MaxSubscriptionCount { get; set; }

bool DisableDeletionTracking { get; set; }
}
}
Loading