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
14 changes: 14 additions & 0 deletions src/SqlStreamStore.Http/HttpClientSqlStreamStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,20 @@ public async Task<long> ReadHeadPosition(CancellationToken cancellationToken = d
return headPosition;
}

public async Task<long> ReadStreamHeadPosition(StreamId streamId, CancellationToken cancellationToken = default)
{
GuardAgainstDisposed();

return (await ReadStreamBackwards(streamId, StreamVersion.End, 1, false, cancellationToken)).LastStreamPosition;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

If this could be solved in a more optimized way for the http provider, please show me how.

}

public async Task<int> ReadStreamHeadVersion(StreamId streamId, CancellationToken cancellationToken = default)
{
GuardAgainstDisposed();

return (await ReadStreamBackwards(streamId, StreamVersion.End, 1, false, cancellationToken)).LastStreamVersion;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

If this could be solved in a more optimized way for the http provider, please show me how.

}

private static void ThrowOnError(IHalClient client)
{
switch(client.StatusCode ?? default)
Expand Down
53 changes: 52 additions & 1 deletion src/SqlStreamStore.MsSql/MsSqlStreamStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using SqlStreamStore.Imports.Ensure.That;
using SqlStreamStore.Infrastructure;
using SqlStreamStore.ScriptsV2;
using SqlStreamStore.Streams;
using SqlStreamStore.Subscriptions;

/// <summary>
Expand Down Expand Up @@ -280,13 +281,63 @@ protected override async Task<long> ReadHeadPositionInternal(CancellationToken c

if(result == DBNull.Value)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I've left this in - but the test for the new operations seem to suggest this path will never be hit (since result is either null or a value, not DBNull.Value). Similar remark in other relational store implementations.

{
return -1;
return Position.End;
}
return (long) result;
}
}
}

protected override async Task<long> ReadStreamHeadPositionInternal(string streamId, CancellationToken cancellationToken)
{
GuardAgainstDisposed();

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

using(var command = new SqlCommand(_scripts.ReadStreamHeadPosition, connection))
{
command.CommandTimeout = _commandTimeout;
command.Parameters.Add(new SqlParameter("streamId", SqlDbType.Char, 42) { Value = new StreamIdInfo(streamId).SqlStreamId.Id });
var result = await command
.ExecuteScalarAsync(cancellationToken)
.NotOnCapturedContext();

if(result == null)
{
return Position.End;
}
return (long) result;
}
}
}

protected override async Task<int> ReadStreamHeadVersionInternal(string streamId, CancellationToken cancellationToken)
{
GuardAgainstDisposed();

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

using(var command = new SqlCommand(_scripts.ReadStreamHeadVersion, connection))
{
command.CommandTimeout = _commandTimeout;
command.Parameters.Add(new SqlParameter("streamId", SqlDbType.Char, 42) { Value = new StreamIdInfo(streamId).SqlStreamId.Id });
var result = await command
.ExecuteScalarAsync(cancellationToken)
.NotOnCapturedContext();

if(result == null)
{
return StreamVersion.End;
}
return (int) result;
}
}
}

protected override void Dispose(bool disposing)
{
if(disposing)
Expand Down
53 changes: 52 additions & 1 deletion src/SqlStreamStore.MsSql/MsSqlStreamStoreV3.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using SqlStreamStore.Infrastructure;
using SqlStreamStore.Logging;
using SqlStreamStore.ScriptsV3;
using SqlStreamStore.Streams;
using SqlStreamStore.Subscriptions;

/// <summary>
Expand Down Expand Up @@ -327,13 +328,63 @@ protected override async Task<long> ReadHeadPositionInternal(CancellationToken c

if(result == DBNull.Value)
{
return -1;
return Position.End;
}
return (long) result;
}
}
}

protected override async Task<long> ReadStreamHeadPositionInternal(string streamId, CancellationToken cancellationToken)
{
GuardAgainstDisposed();

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

using(var command = new SqlCommand(_scripts.ReadStreamHeadPosition, connection))
{
command.CommandTimeout = _commandTimeout;
command.Parameters.Add(new SqlParameter("streamId", SqlDbType.Char, 42) { Value = new StreamIdInfo(streamId).SqlStreamId.Id });
var result = await command
.ExecuteScalarAsync(cancellationToken)
.NotOnCapturedContext();

if(result == null)
{
return Position.End;
}
return (long) result;
}
}
}

protected override async Task<int> ReadStreamHeadVersionInternal(string streamId, CancellationToken cancellationToken)
{
GuardAgainstDisposed();

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

using(var command = new SqlCommand(_scripts.ReadStreamHeadVersion, connection))
{
command.CommandTimeout = _commandTimeout;
command.Parameters.Add(new SqlParameter("streamId", SqlDbType.Char, 42) { Value = new StreamIdInfo(streamId).SqlStreamId.Id });
var result = await command
.ExecuteScalarAsync(cancellationToken)
.NotOnCapturedContext();

if(result == null)
{
return StreamVersion.End;
}
return (int) result;
}
}
}

protected override void Dispose(bool disposing)
{
if(disposing)
Expand Down
3 changes: 3 additions & 0 deletions src/SqlStreamStore.MsSql/ScriptsV2/ReadStreamHeadPosition.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT dbo.Streams.Position
FROM dbo.Streams
WHERE dbo.Streams.Id = @streamId
3 changes: 3 additions & 0 deletions src/SqlStreamStore.MsSql/ScriptsV2/ReadStreamHeadVersion.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT dbo.Streams.[Version]
FROM dbo.Streams
WHERE dbo.Streams.Id = @streamId
4 changes: 4 additions & 0 deletions src/SqlStreamStore.MsSql/ScriptsV2/Scripts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ internal Scripts(string schema)

internal string ReadHeadPosition => GetScript(nameof(ReadHeadPosition));

internal string ReadStreamHeadPosition => GetScript(nameof(ReadStreamHeadPosition));

internal string ReadStreamHeadVersion => GetScript(nameof(ReadStreamHeadVersion));

internal string ReadAllForward => GetScript(nameof(ReadAllForward));

internal string ReadAllForwardWithData => GetScript(nameof(ReadAllForwardWithData));
Expand Down
3 changes: 3 additions & 0 deletions src/SqlStreamStore.MsSql/ScriptsV3/ReadStreamHeadPosition.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT dbo.Streams.Position
FROM dbo.Streams
WHERE dbo.Streams.Id = @streamId
3 changes: 3 additions & 0 deletions src/SqlStreamStore.MsSql/ScriptsV3/ReadStreamHeadVersion.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT dbo.Streams.[Version]
FROM dbo.Streams
WHERE dbo.Streams.Id = @streamId
4 changes: 4 additions & 0 deletions src/SqlStreamStore.MsSql/ScriptsV3/Scripts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ internal Scripts(string schema)

internal string ReadHeadPosition => GetScript(nameof(ReadHeadPosition));

internal string ReadStreamHeadPosition => GetScript(nameof(ReadStreamHeadPosition));

internal string ReadStreamHeadVersion => GetScript(nameof(ReadStreamHeadVersion));

internal string ReadAllForward => GetScript(nameof(ReadAllForward));

internal string ReadAllForwardWithData => GetScript(nameof(ReadAllForwardWithData));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
DROP PROCEDURE IF EXISTS read_stream_head_position;

CREATE PROCEDURE read_stream_head_position(_stream_id CHAR(42))

BEGIN
SELECT streams.position
FROM streams
WHERE streams.id = _stream_id;
END;
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
DROP PROCEDURE IF EXISTS read_stream_head_version;

CREATE PROCEDURE read_stream_head_version(_stream_id CHAR(42))

BEGIN
SELECT streams.version
FROM streams
WHERE streams.id = _stream_id;
END;
2 changes: 2 additions & 0 deletions src/SqlStreamStore.MySql/MySqlScripts/Schema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ internal class Schema
public string Read => "`read`";
public string ReadAll => "read_all";
public string ReadAllHeadPosition => "read_head_position";
public string ReadStreamHeadPosition => "read_stream_head_position";
public string ReadStreamHeadVersion => "read_stream_head_version";
public string ReadJsonData => "read_json_data";
public string ReadProperties => "read_properties";

Expand Down
6 changes: 6 additions & 0 deletions src/SqlStreamStore.MySql/MySqlScripts/Scripts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ private readonly ConcurrentDictionary<string, string> _scripts

private string ReadHeadPosition => GetScript(nameof(ReadHeadPosition));

private string ReadStreamHeadPosition => GetScript(nameof(ReadStreamHeadPosition));

private string ReadStreamHeadVersion => GetScript(nameof(ReadStreamHeadVersion));

private string ReadProperties => GetScript(nameof(ReadProperties));

private string ReadStreamVersionOfMessageId => GetScript(nameof(ReadStreamVersionOfMessageId));
Expand Down Expand Up @@ -72,6 +76,8 @@ private readonly ConcurrentDictionary<string, string> _scripts
ReadAll,
ReadJsonData,
ReadHeadPosition,
ReadStreamHeadPosition,
ReadStreamHeadVersion,
ReadProperties,
ReadStreamVersionOfMessageId,
Scavenge,
Expand Down
42 changes: 42 additions & 0 deletions src/SqlStreamStore.MySql/MySqlStreamStore.Read.cs
Original file line number Diff line number Diff line change
Expand Up @@ -267,5 +267,47 @@ protected override async Task<long> ReadHeadPositionInternal(CancellationToken c
throw new ObjectDisposedException(disposedException.Message, exception);
}
}

protected override async Task<long> ReadStreamHeadPositionInternal(string streamId, CancellationToken cancellationToken)
{
try
{
using(var connection = await OpenConnection(cancellationToken))
using(var transaction = connection.BeginTransaction())
using(var command = BuildStoredProcedureCall(_schema.ReadStreamHeadPosition, transaction, Parameters.StreamId(new MySqlStreamId(streamId))))
{
var result = await command.ExecuteScalarAsync(cancellationToken).NotOnCapturedContext();

return result == null
? Position.End
: ConvertPosition.FromMySqlToStreamStore((long) result);
}
}
catch(MySqlException exception) when(exception.InnerException is ObjectDisposedException disposedException)
{
throw new ObjectDisposedException(disposedException.Message, exception);
}
}

protected override async Task<int> ReadStreamHeadVersionInternal(string streamId, CancellationToken cancellationToken)
{
try
{
using(var connection = await OpenConnection(cancellationToken))
using(var transaction = connection.BeginTransaction())
using(var command = BuildStoredProcedureCall(_schema.ReadStreamHeadVersion, transaction, Parameters.StreamId(new MySqlStreamId(streamId))))
{
var result = await command.ExecuteScalarAsync(cancellationToken).NotOnCapturedContext();

return result == null
? StreamVersion.End
: (int) result;
}
}
catch(MySqlException exception) when(exception.InnerException is ObjectDisposedException disposedException)
{
throw new ObjectDisposedException(disposedException.Message, exception);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CREATE OR REPLACE FUNCTION __schema__.read_stream_head_position(
_stream_id CHAR(42)
)
RETURNS BIGINT
AS $F$
BEGIN
RETURN (SELECT (__schema__.streams.position) FROM __schema__.streams WHERE __schema__.streams.id = _stream_id);
END;
$F$
LANGUAGE 'plpgsql';
10 changes: 10 additions & 0 deletions src/SqlStreamStore.Postgres/PgSqlScripts/ReadStreamHeadVersion.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CREATE OR REPLACE FUNCTION __schema__.read_stream_head_version(
_stream_id CHAR(42)
)
RETURNS INT
AS $F$
BEGIN
RETURN (SELECT (__schema__.streams.version) FROM __schema__.streams WHERE __schema__.streams.id = _stream_id);
END;
$F$
LANGUAGE 'plpgsql';
2 changes: 2 additions & 0 deletions src/SqlStreamStore.Postgres/PgSqlScripts/Schema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ internal class Schema
public string Read => $"{_schema}.read";
public string ReadAll => $"{_schema}.read_all";
public string ReadAllHeadPosition => $"{_schema}.read_head_position";
public string ReadStreamHeadPosition => $"{_schema}.read_stream_head_position";
public string ReadStreamHeadVersion => $"{_schema}.read_stream_head_version";
public string ReadJsonData => $"{_schema}.read_json_data";
public string ReadSchemaVersion => $"{_schema}.read_schema_version";
public string ReadStreamMessageBeforeCreatedCount => $"{_schema}.read_stream_message_before_created_count";
Expand Down
6 changes: 6 additions & 0 deletions src/SqlStreamStore.Postgres/PgSqlScripts/Scripts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ public Scripts(string schema)

private string ReadHeadPosition => GetScript(nameof(ReadHeadPosition));

private string ReadStreamHeadPosition => GetScript(nameof(ReadStreamHeadPosition));

private string ReadStreamHeadVersion => GetScript(nameof(ReadStreamHeadVersion));

private string ReadSchemaVersion => GetScript(nameof(ReadSchemaVersion));

private string ReadStreamVersionOfMessageId => GetScript(nameof(ReadStreamVersionOfMessageId));
Expand All @@ -66,6 +70,8 @@ public Scripts(string schema)
ReadAll,
ReadJsonData,
ReadHeadPosition,
ReadStreamHeadPosition,
ReadStreamHeadVersion,
ReadSchemaVersion,
ReadStreamVersionOfMessageId,
Scavenge,
Expand Down
24 changes: 24 additions & 0 deletions src/SqlStreamStore.Postgres/PostgresStreamStore.Read.cs
Original file line number Diff line number Diff line change
Expand Up @@ -251,5 +251,29 @@ protected override async Task<long> ReadHeadPositionInternal(CancellationToken c
return result == DBNull.Value ? Position.End : (long) result;
}
}

protected override async Task<long> ReadStreamHeadPositionInternal(string streamId, CancellationToken cancellationToken)
{
using(var connection = await OpenConnection(cancellationToken))
using(var transaction = connection.BeginTransaction())
using(var command = BuildFunctionCommand(_schema.ReadStreamHeadPosition, transaction, Parameters.StreamId(new PostgresqlStreamId(streamId))))
{
var result = await command.ExecuteScalarAsync(cancellationToken).NotOnCapturedContext();

return result == DBNull.Value ? Position.End : (long) result;
}
}

protected override async Task<int> ReadStreamHeadVersionInternal(string streamId, CancellationToken cancellationToken)
{
using(var connection = await OpenConnection(cancellationToken))
using(var transaction = connection.BeginTransaction())
using(var command = BuildFunctionCommand(_schema.ReadStreamHeadVersion, transaction, Parameters.StreamId(new PostgresqlStreamId(streamId))))
{
var result = await command.ExecuteScalarAsync(cancellationToken).NotOnCapturedContext();

return result == DBNull.Value ? StreamVersion.End : (int) result;
}
}
}
}
Loading