diff --git a/src/Benchmarks/Benchmarks/SignerBenchmark.cs b/src/Benchmarks/Benchmarks/SignerBenchmark.cs index da9cc554..eb059d1d 100644 --- a/src/Benchmarks/Benchmarks/SignerBenchmark.cs +++ b/src/Benchmarks/Benchmarks/SignerBenchmark.cs @@ -35,7 +35,7 @@ public async Task SetupAsync() ReturnConsumedCapacity = ReturnConsumedCapacity.Total }; - var httpContent = new GetItemHttpContent(request, request.TableName, request.Key.PartitionKeyName!, request.Key.SortKeyName); + var httpContent = new GetItemHttpContent(request, null, request.Key.PartitionKeyName!, request.Key.SortKeyName); _httpRequest = new HttpRequestMessage(HttpMethod.Post, RegionEndpoint.USEast1.RequestUri) { Content = httpContent diff --git a/src/EfficientDynamoDb/Configs/ITableNameFormatter.cs b/src/EfficientDynamoDb/Configs/ITableNameFormatter.cs new file mode 100644 index 00000000..a08b3ed1 --- /dev/null +++ b/src/EfficientDynamoDb/Configs/ITableNameFormatter.cs @@ -0,0 +1,19 @@ +using System; + +namespace EfficientDynamoDb.Configs +{ + public readonly struct TableNameFormatterContext + { + public TableNameFormatterContext(string tableName) { + TableName = tableName; + } + + public string TableName { get; } + } + + public interface ITableNameFormatter + { + int CalculateLength(ref TableNameFormatterContext context); + bool TryFormat(Span buffer, ref TableNameFormatterContext context, out int length); + } +} diff --git a/src/EfficientDynamoDb/Configs/PrefixTableNameFormatter.cs b/src/EfficientDynamoDb/Configs/PrefixTableNameFormatter.cs new file mode 100644 index 00000000..71930b6d --- /dev/null +++ b/src/EfficientDynamoDb/Configs/PrefixTableNameFormatter.cs @@ -0,0 +1,27 @@ +using System; +using System.Runtime.CompilerServices; + +namespace EfficientDynamoDb.Configs +{ + public class PrefixTableNameFormatter : ITableNameFormatter + { + public string Prefix { get; } + + public PrefixTableNameFormatter(string prefix) { + Prefix = prefix; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int CalculateLength(ref TableNameFormatterContext context) => Prefix.Length + context.TableName.Length; + + public bool TryFormat(Span buffer, ref TableNameFormatterContext context, out int length) { + length = CalculateLength(ref context); + if( buffer.Length < length ) { + return false; + } + Prefix.AsSpan().CopyTo(buffer); + context.TableName.AsSpan().CopyTo(buffer[Prefix.Length..]); + return true; + } + } +} diff --git a/src/EfficientDynamoDb/Configs/TableNameFormatterExtensions.cs b/src/EfficientDynamoDb/Configs/TableNameFormatterExtensions.cs new file mode 100644 index 00000000..822d9aa6 --- /dev/null +++ b/src/EfficientDynamoDb/Configs/TableNameFormatterExtensions.cs @@ -0,0 +1,39 @@ +using System; +using System.Buffers; +using System.Runtime.CompilerServices; +using EfficientDynamoDb.Exceptions; +using EfficientDynamoDb.Internal.Core; + +namespace EfficientDynamoDb.Configs +{ + internal static class TableNameFormatterExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void WriteTableName(this ITableNameFormatter tableNameFormatter, string tableName, TState state, SpanAction writer) { + var tableNameContext = new TableNameFormatterContext(tableName); + var length = tableNameFormatter.CalculateLength(ref tableNameContext); + + char[]? pooledArray = null; + var arr = length < NoAllocStringBuilder.MaxStackAllocSize + ? stackalloc char[length] + : pooledArray = ArrayPool.Shared.Rent(length); + + try + { + if( !tableNameFormatter.TryFormat(arr, ref tableNameContext, out length) ) { + throw new DdbException($"Couldn't format table name '{tableName}' using the provided formatter"); + } + + writer(arr[..length], state); + } + finally + { + if (pooledArray != null) + { + pooledArray.AsSpan(0, length).Clear(); + ArrayPool.Shared.Return(pooledArray); + } + } + } + } +} diff --git a/src/EfficientDynamoDb/DynamoDbContext/DynamoDbContext,BatchWriteItem.cs b/src/EfficientDynamoDb/DynamoDbContext/DynamoDbContext,BatchWriteItem.cs index 11f88022..9bfac0c4 100644 --- a/src/EfficientDynamoDb/DynamoDbContext/DynamoDbContext,BatchWriteItem.cs +++ b/src/EfficientDynamoDb/DynamoDbContext/DynamoDbContext,BatchWriteItem.cs @@ -22,7 +22,7 @@ public partial class DynamoDbContext internal async Task BatchWriteItemAsync(BuilderNode node, CancellationToken cancellationToken = default) { - using var httpContent = new BatchWriteItemHighLevelHttpContent(this, node, Config.TableNamePrefix); + using var httpContent = new BatchWriteItemHighLevelHttpContent(this, node, Config.TableNameFormatter); using var response = await Api.SendAsync(Config, httpContent, cancellationToken).ConfigureAwait(false); var documentResult = await DynamoDbLowLevelContext.ReadDocumentAsync(response, BatchWriteItemParsingOptions.Instance, cancellationToken).ConfigureAwait(false); @@ -47,7 +47,7 @@ internal async Task BatchWriteItemAsync(BuilderNode node, CancellationToken canc internal async Task BatchWriteItemResponseAsync(BuilderNode node, CancellationToken cancellationToken = default) { - using var httpContent = new BatchWriteItemHighLevelHttpContent(this, node, Config.TableNamePrefix); + using var httpContent = new BatchWriteItemHighLevelHttpContent(this, node, Config.TableNameFormatter); using var response = await Api.SendAsync(Config, httpContent, cancellationToken).ConfigureAwait(false); var documentResult = await DynamoDbLowLevelContext.ReadDocumentAsync(response, BatchWriteItemParsingOptions.Instance, cancellationToken).ConfigureAwait(false); diff --git a/src/EfficientDynamoDb/DynamoDbContext/DynamoDbLowLevelContext.cs b/src/EfficientDynamoDb/DynamoDbContext/DynamoDbLowLevelContext.cs index deebe4a6..ba90ded9 100644 --- a/src/EfficientDynamoDb/DynamoDbContext/DynamoDbLowLevelContext.cs +++ b/src/EfficientDynamoDb/DynamoDbContext/DynamoDbLowLevelContext.cs @@ -57,7 +57,7 @@ public async Task GetItemAsync(GetItemRequest request, Cancella public async Task BatchGetItemAsync(BatchGetItemRequest request, CancellationToken cancellationToken = default) { - using var httpContent = new BatchGetItemHttpContent(request, Config.TableNamePrefix); + using var httpContent = new BatchGetItemHttpContent(request, Config.TableNameFormatter); using var response = await Api.SendAsync(Config, httpContent, cancellationToken).ConfigureAwait(false); var result = await ReadDocumentAsync(response, BatchGetItemParsingOptions.Instance, cancellationToken).ConfigureAwait(false); @@ -67,7 +67,7 @@ public async Task BatchGetItemAsync(BatchGetItemRequest re public async Task BatchWriteItemAsync(BatchWriteItemRequest request, CancellationToken cancellationToken = default) { - using var httpContent = new BatchWriteItemHttpContent(request, Config.TableNamePrefix); + using var httpContent = new BatchWriteItemHttpContent(request, Config.TableNameFormatter); using var response = await Api.SendAsync(Config, httpContent, cancellationToken).ConfigureAwait(false); var result = await ReadDocumentAsync(response, BatchWriteItemParsingOptions.Instance, cancellationToken).ConfigureAwait(false); @@ -77,7 +77,7 @@ public async Task BatchWriteItemAsync(BatchWriteItemRequ public async Task QueryAsync(QueryRequest request, CancellationToken cancellationToken = default) { - using var httpContent = new QueryHttpContent(request, Config.TableNamePrefix); + using var httpContent = new QueryHttpContent(request, Config.TableNameFormatter); using var response = await Api.SendAsync(Config, httpContent, cancellationToken).ConfigureAwait(false); var result = await ReadDocumentAsync(response, QueryParsingOptions.Instance, cancellationToken).ConfigureAwait(false); @@ -87,7 +87,7 @@ public async Task QueryAsync(QueryRequest request, CancellationTo public async Task ScanAsync(ScanRequest request, CancellationToken cancellationToken = default) { - using var httpContent = new ScanHttpContent(request, Config.TableNamePrefix); + using var httpContent = new ScanHttpContent(request, Config.TableNameFormatter); using var response = await Api.SendAsync(Config, httpContent, cancellationToken).ConfigureAwait(false); var result = await ReadDocumentAsync(response, QueryParsingOptions.Instance, cancellationToken).ConfigureAwait(false); @@ -97,7 +97,7 @@ public async Task ScanAsync(ScanRequest request, CancellationToken public async Task TransactGetItemsAsync(TransactGetItemsRequest request, CancellationToken cancellationToken = default) { - using var httpContent = new TransactGetItemsHttpContent(request, Config.TableNamePrefix); + using var httpContent = new TransactGetItemsHttpContent(request, Config.TableNameFormatter); using var response = await Api.SendAsync(Config, httpContent, cancellationToken).ConfigureAwait(false); var result = await ReadDocumentAsync(response, TransactGetItemsParsingOptions.Instance, cancellationToken).ConfigureAwait(false); @@ -107,7 +107,7 @@ public async Task TransactGetItemsAsync(TransactGetIte public async Task PutItemAsync(PutItemRequest request, CancellationToken cancellationToken = default) { - using var httpContent = new PutItemHttpContent(request, Config.TableNamePrefix); + using var httpContent = new PutItemHttpContent(request, Config.TableNameFormatter); using var response = await Api.SendAsync(Config, httpContent, cancellationToken).ConfigureAwait(false); var result = await ReadDocumentAsync(response, PutItemParsingOptions.Instance, cancellationToken).ConfigureAwait(false); @@ -131,7 +131,7 @@ public async Task DeleteItemAsync(DeleteItemRequest request, ? (request.Key.PartitionKeyName!, request.Key.SortKeyName) : await GetKeyNamesAsync(request.TableName).ConfigureAwait(false); - using var httpContent = new DeleteItemHttpContent(request, pkName, skName, Config.TableNamePrefix); + using var httpContent = new DeleteItemHttpContent(request, pkName, skName, Config.TableNameFormatter); using var response = await Api.SendAsync(Config, httpContent, cancellationToken).ConfigureAwait(false); var result = await ReadDocumentAsync(response, PutItemParsingOptions.Instance, cancellationToken).ConfigureAwait(false); @@ -141,7 +141,7 @@ public async Task DeleteItemAsync(DeleteItemRequest request, public async Task TransactWriteItemsAsync(TransactWriteItemsRequest request, CancellationToken cancellationToken = default) { - using var httpContent = new TransactWriteItemsHttpContent(request, Config.TableNamePrefix); + using var httpContent = new TransactWriteItemsHttpContent(request, Config.TableNameFormatter); using var response = await Api.SendAsync(Config, httpContent, cancellationToken).ConfigureAwait(false); var result = await ReadDocumentAsync(response, TransactWriteItemsParsingOptions.Instance, cancellationToken).ConfigureAwait(false); @@ -165,19 +165,19 @@ private async ValueTask GetItemInternalAsync(HttpContent httpCo private async ValueTask BuildHttpContentAsync(GetItemRequest request) { if (request.Key!.HasKeyNames) - return new GetItemHttpContent(request, Config.TableNamePrefix, request.Key.PartitionKeyName!, request.Key.SortKeyName!); + return new GetItemHttpContent(request, Config.TableNameFormatter, request.Key.PartitionKeyName!, request.Key.SortKeyName!); var (remotePkName, remoteSkName) = await GetKeyNamesAsync(request.TableName); - return new GetItemHttpContent(request, Config.TableNamePrefix, remotePkName, remoteSkName!); + return new GetItemHttpContent(request, Config.TableNameFormatter, remotePkName, remoteSkName!); } private async ValueTask BuildHttpContentAsync(UpdateItemRequest request) { if (request.Key!.HasKeyNames) - return new UpdateItemHttpContent(request, Config.TableNamePrefix, request.Key.PartitionKeyName!, request.Key.SortKeyName!); + return new UpdateItemHttpContent(request, Config.TableNameFormatter, request.Key.PartitionKeyName!, request.Key.SortKeyName!); var (remotePkName, remoteSkName) = await GetKeyNamesAsync(request.TableName); - return new UpdateItemHttpContent(request, Config.TableNamePrefix, remotePkName, remoteSkName!); + return new UpdateItemHttpContent(request, Config.TableNameFormatter, remotePkName, remoteSkName!); } private async ValueTask<(string Pk, string? Sk)> GetKeyNamesAsync(string tableName) @@ -192,7 +192,7 @@ private async ValueTask BuildHttpContentAsync(UpdateItemRequest req async Task<(string Pk, string? Sk)> CreateKeyNamesTaskAsync(string table) { - var response = await Api.SendAsync(Config, new DescribeTableRequestHttpContent(Config.TableNamePrefix, tableName)) + var response = await Api.SendAsync(Config, new DescribeTableRequestHttpContent(Config.TableNameFormatter, tableName)) .ConfigureAwait(false); var keySchema = response.Table.KeySchema; diff --git a/src/EfficientDynamoDb/DynamoDbContextConfig.cs b/src/EfficientDynamoDb/DynamoDbContextConfig.cs index 940f7331..179ab7c4 100644 --- a/src/EfficientDynamoDb/DynamoDbContextConfig.cs +++ b/src/EfficientDynamoDb/DynamoDbContextConfig.cs @@ -13,7 +13,13 @@ public class DynamoDbContextConfig internal DynamoDbContextMetadata Metadata { get; private set; } - public string? TableNamePrefix { get; set; } + [Obsolete("Use TableNameFormatter property instead")] + public string? TableNamePrefix { + get => TableNameFormatter is PrefixTableNameFormatter f ? f.Prefix : null; + set => TableNameFormatter = value == null ? null : new PrefixTableNameFormatter(value); + } + + public ITableNameFormatter? TableNameFormatter { get; set; } public RetryStrategies RetryStrategies { get; } = new RetryStrategies(); diff --git a/src/EfficientDynamoDb/DynamoDbManagementContext.cs b/src/EfficientDynamoDb/DynamoDbManagementContext.cs index 6afe46a8..a839e899 100644 --- a/src/EfficientDynamoDb/DynamoDbManagementContext.cs +++ b/src/EfficientDynamoDb/DynamoDbManagementContext.cs @@ -19,7 +19,7 @@ public DynamoDbManagementContext(DynamoDbContextConfig config) public async Task DescribeTableAsync(string tableName, CancellationToken cancellationToken = default) { - var httpContent = new DescribeTableRequestHttpContent(_config.TableNamePrefix, tableName); + var httpContent = new DescribeTableRequestHttpContent(_config.TableNameFormatter, tableName); var response = await _api.SendAsync(_config, httpContent, cancellationToken).ConfigureAwait(false); diff --git a/src/EfficientDynamoDb/Internal/Extensions/Utf8JsonWriterExtensions.UpdateItem.cs b/src/EfficientDynamoDb/Internal/Extensions/Utf8JsonWriterExtensions.UpdateItem.cs index e689c5bd..d19be933 100644 --- a/src/EfficientDynamoDb/Internal/Extensions/Utf8JsonWriterExtensions.UpdateItem.cs +++ b/src/EfficientDynamoDb/Internal/Extensions/Utf8JsonWriterExtensions.UpdateItem.cs @@ -51,7 +51,7 @@ public static void WriteUpdateItem(this in DdbWriter ddbWriter, DynamoDbContextC break; } case BuilderNodeType.TableName: - ((TableNameNode) currentNode).WriteTableName(in ddbWriter, ref writeState, config.TableNamePrefix); + ((TableNameNode) currentNode).WriteTableName(in ddbWriter, ref writeState, config.TableNameFormatter); break; default: { diff --git a/src/EfficientDynamoDb/Internal/Extensions/Utf8JsonWriterExtensions.cs b/src/EfficientDynamoDb/Internal/Extensions/Utf8JsonWriterExtensions.cs index 59996d0b..798803ef 100644 --- a/src/EfficientDynamoDb/Internal/Extensions/Utf8JsonWriterExtensions.cs +++ b/src/EfficientDynamoDb/Internal/Extensions/Utf8JsonWriterExtensions.cs @@ -4,8 +4,10 @@ using System.Runtime.CompilerServices; using System.Text.Json; using System.Threading.Tasks; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.DocumentModel; +using EfficientDynamoDb.Exceptions; using EfficientDynamoDb.FluentCondition.Core; using EfficientDynamoDb.FluentCondition.Factories; using EfficientDynamoDb.Internal.Core; @@ -43,36 +45,16 @@ public static void WriteAttributesDictionary(this Utf8JsonWriter writer, IReadOn writer.WriteEndObject(); } - public static void WriteTableName(this Utf8JsonWriter writer, string? prefix, string tableName) + public static void WriteTableName(this Utf8JsonWriter writer, ITableNameFormatter? tableNameFormatter, string tableName) { const string tableNameKey = "TableName"; - if (prefix == null) + if (tableNameFormatter == null) { writer.WriteString(tableNameKey, tableName); return; } - var fullLength = prefix.Length + tableName.Length; - - char[]? pooledArray = null; - var arr = fullLength < NoAllocStringBuilder.MaxStackAllocSize - ? stackalloc char[fullLength] - : pooledArray = ArrayPool.Shared.Rent(fullLength); - - try - { - prefix.AsSpan().CopyTo(arr); - tableName.AsSpan().CopyTo(arr.Slice(prefix.Length)); - writer.WriteString(tableNameKey, arr); - } - finally - { - if (pooledArray != null) - { - pooledArray.AsSpan(0, fullLength).Clear(); - ArrayPool.Shared.Return(pooledArray); - } - } + tableNameFormatter.WriteTableName(tableName, writer, (arr, w) => w.WriteString(tableNameKey, arr)); } /// diff --git a/src/EfficientDynamoDb/Internal/Operations/BatchGetItem/BatchGetItemHighLevelHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/BatchGetItem/BatchGetItemHighLevelHttpContent.cs index a5c44510..8ce7f45a 100644 --- a/src/EfficientDynamoDb/Internal/Operations/BatchGetItem/BatchGetItemHighLevelHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/BatchGetItem/BatchGetItemHighLevelHttpContent.cs @@ -101,7 +101,7 @@ private async Task WriteItems(DdbWriter ddbWriter, BatchItemsNode(); - writer.WriteTableName(_config.TableNamePrefix, classInfo.TableName!); + writer.WriteTableName(_config.TableNameFormatter, classInfo.TableName!); writer.WritePropertyName("Key"); writer.WriteStartObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/DeleteItem/DeleteItemHighLevelHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/DeleteItem/DeleteItemHighLevelHttpContent.cs index 29d82abe..44a3c389 100644 --- a/src/EfficientDynamoDb/Internal/Operations/DeleteItem/DeleteItemHighLevelHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/DeleteItem/DeleteItemHighLevelHttpContent.cs @@ -43,7 +43,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) writeState = writeState.SetBit(NodeBits.Condition); break; case BuilderNodeType.TableName: - ((TableNameNode) node).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNamePrefix); + ((TableNameNode) node).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNameFormatter); break; default: node.WriteValue(in ddbWriter, ref writeState); @@ -52,7 +52,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) } if(!writeState.IsBitSet(NodeBits.TableName)) - writer.WriteTableName(_context.Config.TableNamePrefix, _classInfo.TableName!); + writer.WriteTableName(_context.Config.TableNameFormatter, _classInfo.TableName!); writer.WriteEndObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/DeleteItem/DeleteItemHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/DeleteItem/DeleteItemHttpContent.cs index 63239fdf..561af1fe 100644 --- a/src/EfficientDynamoDb/Internal/Operations/DeleteItem/DeleteItemHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/DeleteItem/DeleteItemHttpContent.cs @@ -1,6 +1,7 @@ using System.Runtime.CompilerServices; using System.Text.Json; using System.Threading.Tasks; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.Internal.Extensions; using EfficientDynamoDb.Internal.Operations.Shared; @@ -14,14 +15,14 @@ internal class DeleteItemHttpContent : DynamoDbHttpContent private readonly DeleteItemRequest _request; private readonly string _pkName; private readonly string? _skName; - private readonly string? _tablePrefix; + private readonly ITableNameFormatter? _tableNameFormatter; - public DeleteItemHttpContent(DeleteItemRequest request, string pkName, string? skName, string? tablePrefix) : base("DynamoDB_20120810.DeleteItem") + public DeleteItemHttpContent(DeleteItemRequest request, string pkName, string? skName, ITableNameFormatter? tableNameFormatter) : base("DynamoDB_20120810.DeleteItem") { _request = request; _pkName = pkName; _skName = skName; - _tablePrefix = tablePrefix; + _tableNameFormatter = tableNameFormatter; } protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) @@ -31,7 +32,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) WritePrimaryKey(writer); - writer.WriteTableName(_tablePrefix, _request.TableName); + writer.WriteTableName(_tableNameFormatter, _request.TableName); if (_request.ExpressionAttributeNames?.Count > 0) writer.WriteExpressionAttributeNames(_request.ExpressionAttributeNames); diff --git a/src/EfficientDynamoDb/Internal/Operations/DescribeTable/DescribeTableRequestHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/DescribeTable/DescribeTableRequestHttpContent.cs index 1d35d027..60cd3c24 100644 --- a/src/EfficientDynamoDb/Internal/Operations/DescribeTable/DescribeTableRequestHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/DescribeTable/DescribeTableRequestHttpContent.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.Internal.Extensions; using EfficientDynamoDb.Internal.Operations.Shared; @@ -8,11 +9,11 @@ namespace EfficientDynamoDb.Internal.Operations.DescribeTable internal class DescribeTableRequestHttpContent : DynamoDbHttpContent { private readonly string _tableName; - private readonly string? _tablePrefix; + private readonly ITableNameFormatter? _tableNameFormatter; - public DescribeTableRequestHttpContent(string? tablePrefix, string tableName) : base("DynamoDB_20120810.DescribeTable") + public DescribeTableRequestHttpContent(ITableNameFormatter? tableNameFormatter, string tableName) : base("DynamoDB_20120810.DescribeTable") { - _tablePrefix = tablePrefix; + _tableNameFormatter = tableNameFormatter; _tableName = tableName; } @@ -20,7 +21,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) { var writer = ddbWriter.JsonWriter; writer.WriteStartObject(); - writer.WriteTableName(_tablePrefix, _tableName); + writer.WriteTableName(_tableNameFormatter, _tableName); writer.WriteEndObject(); return default; diff --git a/src/EfficientDynamoDb/Internal/Operations/GetItem/GetItemHighLevelHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/GetItem/GetItemHighLevelHttpContent.cs index ccd3ca87..961cb474 100644 --- a/src/EfficientDynamoDb/Internal/Operations/GetItem/GetItemHighLevelHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/GetItem/GetItemHighLevelHttpContent.cs @@ -61,7 +61,7 @@ protected override ValueTask WriteDataAsync(DdbWriter writer) break; case BuilderNodeType.TableName: - ((TableNameNode) node).WriteTableName(in writer, ref writeState, _context.Config.TableNamePrefix); + ((TableNameNode) node).WriteTableName(in writer, ref writeState, _context.Config.TableNameFormatter); break; default: node.WriteValue(in writer, ref writeState); @@ -70,7 +70,7 @@ protected override ValueTask WriteDataAsync(DdbWriter writer) } if(!writeState.IsBitSet(NodeBits.TableName)) - writer.JsonWriter.WriteTableName(_context.Config.TableNamePrefix, _classInfo.TableName!); + writer.JsonWriter.WriteTableName(_context.Config.TableNameFormatter, _classInfo.TableName!); writer.JsonWriter.WriteEndObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/GetItem/GetItemHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/GetItem/GetItemHttpContent.cs index 36e9c037..ab34661e 100644 --- a/src/EfficientDynamoDb/Internal/Operations/GetItem/GetItemHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/GetItem/GetItemHttpContent.cs @@ -1,4 +1,5 @@ using System.Runtime.CompilerServices; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.Operations.GetItem; @@ -9,7 +10,7 @@ internal sealed class GetItemHttpContent : GetItemHttpContentBase : DynamoDbHttpContent where TRequest : GetItemRequestBase { - private readonly string? _tablePrefix; + private readonly ITableNameFormatter? _tableNameFormatter; protected TRequest Request { get; } - public GetItemHttpContentBase(TRequest request, string? tablePrefix) : base("DynamoDB_20120810.GetItem") + public GetItemHttpContentBase(TRequest request, ITableNameFormatter? tableNameFormatter) : base("DynamoDB_20120810.GetItem") { Request = request; - _tablePrefix = tablePrefix; + _tableNameFormatter = tableNameFormatter; } protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) @@ -27,7 +28,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) WritePrimaryKey(in ddbWriter); - writer.WriteTableName(_tablePrefix, Request.TableName); + writer.WriteTableName(_tableNameFormatter, Request.TableName); if (Request.ConsistentRead) writer.WriteBoolean("ConsistentRead", true); diff --git a/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHighLevelHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHighLevelHttpContent.cs index 0d039c2b..2c77a29d 100644 --- a/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHighLevelHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHighLevelHttpContent.cs @@ -58,7 +58,7 @@ protected override async ValueTask WriteDataAsync(DdbWriter ddbWriter) break; } case BuilderNodeType.TableName: - ((TableNameNode) currentNode).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNamePrefix); + ((TableNameNode) currentNode).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNameFormatter); break; default: { @@ -71,7 +71,7 @@ protected override async ValueTask WriteDataAsync(DdbWriter ddbWriter) } if(!writeState.IsBitSet(NodeBits.TableName) && tableName != null) - writer.WriteTableName(_context.Config.TableNamePrefix, tableName); + writer.WriteTableName(_context.Config.TableNameFormatter, tableName); writer.WriteEndObject(); } diff --git a/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHttpContent.cs index 0a796790..f1a5b075 100644 --- a/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHttpContent.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.Internal.Extensions; using EfficientDynamoDb.Operations.PutItem; @@ -7,7 +8,7 @@ namespace EfficientDynamoDb.Internal.Operations.PutItem { internal sealed class PutItemHttpContent : PutItemHttpContentBase { - public PutItemHttpContent(PutItemRequest request, string? tablePrefix) : base(request, tablePrefix) + public PutItemHttpContent(PutItemRequest request, ITableNameFormatter? tableNameFormatter) : base(request, tableNameFormatter) { } diff --git a/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHttpContentBase.cs b/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHttpContentBase.cs index 4ec402c5..ca039efd 100644 --- a/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHttpContentBase.cs +++ b/src/EfficientDynamoDb/Internal/Operations/PutItem/PutItemHttpContentBase.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.Internal.Extensions; using EfficientDynamoDb.Internal.Operations.Shared; @@ -9,14 +10,14 @@ namespace EfficientDynamoDb.Internal.Operations.PutItem { internal abstract class PutItemHttpContentBase : DynamoDbHttpContent where TRequest: PutItemRequestBase { - private readonly string? _tablePrefix; + private readonly ITableNameFormatter? _tableNameFormatter; protected TRequest Request { get; } - protected PutItemHttpContentBase(TRequest request, string? tablePrefix) : base("DynamoDB_20120810.PutItem") + protected PutItemHttpContentBase(TRequest request, ITableNameFormatter? tableNameFormatter) : base("DynamoDB_20120810.PutItem") { Request = request; - _tablePrefix = tablePrefix; + _tableNameFormatter = tableNameFormatter; } protected abstract ValueTask WriteItemAsync(DdbWriter writer); @@ -29,7 +30,7 @@ protected override async ValueTask WriteDataAsync(DdbWriter ddbWriter) writer.WritePropertyName("Item"); await WriteItemAsync(ddbWriter).ConfigureAwait(false); - writer.WriteTableName(_tablePrefix, Request.TableName); + writer.WriteTableName(_tableNameFormatter, Request.TableName); if (Request.ConditionExpression != null) writer.WriteString("ConditionExpression", Request.ConditionExpression); diff --git a/src/EfficientDynamoDb/Internal/Operations/Query/QueryHighLevelHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/Query/QueryHighLevelHttpContent.cs index dcf23d7d..bc1b6c38 100644 --- a/src/EfficientDynamoDb/Internal/Operations/Query/QueryHighLevelHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/Query/QueryHighLevelHttpContent.cs @@ -48,7 +48,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) break; } case BuilderNodeType.TableName: - ((TableNameNode)currentNode).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNamePrefix); + ((TableNameNode)currentNode).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNameFormatter); break; default: { @@ -61,7 +61,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) } if (!writeState.IsBitSet(NodeBits.TableName)) - writer.WriteTableName(_context.Config.TableNamePrefix, + writer.WriteTableName(_context.Config.TableNameFormatter, _tableName ?? throw new DdbException("Table name has to be specified either using the DynamoDbTable attribute or WithTableName extension method.")); writer.WriteEndObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/Query/QueryHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/Query/QueryHttpContent.cs index d11ac1cf..82666762 100644 --- a/src/EfficientDynamoDb/Internal/Operations/Query/QueryHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/Query/QueryHttpContent.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.Internal.Extensions; using EfficientDynamoDb.Operations.Query; @@ -9,12 +10,12 @@ namespace EfficientDynamoDb.Internal.Operations.Query internal class QueryHttpContent : IterableHttpContent { private readonly QueryRequest _request; - private readonly string? _tablePrefix; + private readonly ITableNameFormatter? _tableNameFormatter; - public QueryHttpContent(QueryRequest request, string? tablePrefix) : base("DynamoDB_20120810.Query") + public QueryHttpContent(QueryRequest request, ITableNameFormatter? tableNameFormatter) : base("DynamoDB_20120810.Query") { _request = request; - _tablePrefix = tablePrefix; + _tableNameFormatter = tableNameFormatter; } protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) @@ -22,7 +23,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) var writer = ddbWriter.JsonWriter; writer.WriteStartObject(); - writer.WriteTableName(_tablePrefix, _request.TableName); + writer.WriteTableName(_tableNameFormatter, _request.TableName); writer.WriteString("KeyConditionExpression", _request.KeyConditionExpression); if(_request.IndexName != null) diff --git a/src/EfficientDynamoDb/Internal/Operations/Scan/ScanHighLevelHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/Scan/ScanHighLevelHttpContent.cs index afd6d980..10b4d589 100644 --- a/src/EfficientDynamoDb/Internal/Operations/Scan/ScanHighLevelHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/Scan/ScanHighLevelHttpContent.cs @@ -46,7 +46,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) projectedAttributesStart ??= node; break; case BuilderNodeType.TableName: - ((TableNameNode) node).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNamePrefix); + ((TableNameNode) node).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNameFormatter); break; default: node.WriteValue(in ddbWriter, ref writeState); @@ -59,7 +59,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) } if (!writeState.IsBitSet(NodeBits.TableName)) - writer.WriteTableName(_context.Config.TableNamePrefix, + writer.WriteTableName(_context.Config.TableNameFormatter, _tableName ?? throw new DdbException("Table name has to be specified either using the DynamoDbTable attribute or WithTableName extension method.")); writer.WriteEndObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/Scan/ScanHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/Scan/ScanHttpContent.cs index 760779ba..899d852d 100644 --- a/src/EfficientDynamoDb/Internal/Operations/Scan/ScanHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/Scan/ScanHttpContent.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.Internal.Extensions; using EfficientDynamoDb.Internal.Operations.Query; @@ -10,12 +11,12 @@ namespace EfficientDynamoDb.Internal.Operations.Scan internal class ScanHttpContent : IterableHttpContent { private readonly ScanRequest _request; - private readonly string? _tablePrefix; + private readonly ITableNameFormatter? _tableNameFormatter; - public ScanHttpContent(ScanRequest request, string? tablePrefix) : base("DynamoDB_20120810.Scan") + public ScanHttpContent(ScanRequest request, ITableNameFormatter? tableNameFormatter) : base("DynamoDB_20120810.Scan") { _request = request; - _tablePrefix = tablePrefix; + _tableNameFormatter = tableNameFormatter; } protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) @@ -23,7 +24,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) var writer = ddbWriter.JsonWriter; writer.WriteStartObject(); - writer.WriteTableName(_tablePrefix, _request.TableName); + writer.WriteTableName(_tableNameFormatter, _request.TableName); if (_request.IndexName != null) writer.WriteString("IndexName", _request.IndexName); diff --git a/src/EfficientDynamoDb/Internal/Operations/Shared/BatchItemHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/Shared/BatchItemHttpContent.cs index da584f90..7eba957f 100644 --- a/src/EfficientDynamoDb/Internal/Operations/Shared/BatchItemHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/Shared/BatchItemHttpContent.cs @@ -1,7 +1,5 @@ -using System; -using System.Buffers; using System.Text.Json; -using EfficientDynamoDb.Internal.Core; +using EfficientDynamoDb.Configs; namespace EfficientDynamoDb.Internal.Operations.Shared { @@ -11,35 +9,16 @@ protected BatchItemHttpContent(string amzTarget) : base(amzTarget) { } - protected static void WriteTableNameAsKey(Utf8JsonWriter writer, string? prefix, string tableName) + protected static void WriteTableNameAsKey(Utf8JsonWriter writer, ITableNameFormatter? tableNameFormatter, string tableName) { - if (prefix == null) + if (tableNameFormatter == null) { writer.WritePropertyName(tableName); return; } - var fullLength = prefix.Length + tableName.Length; - char[]? pooledArray = null; - var arr = fullLength < NoAllocStringBuilder.MaxStackAllocSize - ? stackalloc char[fullLength] - : pooledArray = ArrayPool.Shared.Rent(fullLength); - - try - { - prefix.AsSpan().CopyTo(arr); - tableName.AsSpan().CopyTo(arr.Slice(prefix.Length)); - writer.WritePropertyName(arr); - } - finally - { - if (pooledArray != null) - { - pooledArray.AsSpan(0, fullLength).Clear(); - ArrayPool.Shared.Return(pooledArray); - } - } + tableNameFormatter.WriteTableName(tableName, writer, (arr, w) => w.WritePropertyName(arr)); } } } \ No newline at end of file diff --git a/src/EfficientDynamoDb/Internal/Operations/Shared/PkAndSkObjectHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/Shared/PkAndSkObjectHttpContent.cs index 7e2ba028..13a36097 100644 --- a/src/EfficientDynamoDb/Internal/Operations/Shared/PkAndSkObjectHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/Shared/PkAndSkObjectHttpContent.cs @@ -24,7 +24,7 @@ protected sealed override ValueTask WriteDataAsync(DdbWriter ddbWriter) var classInfo = _context.Config.Metadata.GetOrAddClassInfo(); - writer.WriteTableName(_context.Config.TableNamePrefix, classInfo.TableName!); + writer.WriteTableName(_context.Config.TableNameFormatter, classInfo.TableName!); writer.WritePropertyName("Key"); writer.WriteStartObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/Shared/PkObjectHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/Shared/PkObjectHttpContent.cs index 55fa60e8..4b1d616e 100644 --- a/src/EfficientDynamoDb/Internal/Operations/Shared/PkObjectHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/Shared/PkObjectHttpContent.cs @@ -22,7 +22,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) var classInfo = _context.Config.Metadata.GetOrAddClassInfo(); - writer.WriteTableName(_context.Config.TableNamePrefix, classInfo.TableName!); + writer.WriteTableName(_context.Config.TableNameFormatter, classInfo.TableName!); writer.WritePropertyName("Key"); writer.WriteStartObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/TransactGetItems/TransactGetItemsHighLevelHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/TransactGetItems/TransactGetItemsHighLevelHttpContent.cs index 7bffa61d..07f015a0 100644 --- a/src/EfficientDynamoDb/Internal/Operations/TransactGetItems/TransactGetItemsHighLevelHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/TransactGetItems/TransactGetItemsHighLevelHttpContent.cs @@ -101,13 +101,13 @@ private bool WriteGetItems(in DdbWriter ddbWriter, ref DdbExpressionVisitor? vis projectionWritten = true; break; case BuilderNodeType.TableName: - ((TableNameNode) getNode).WriteTableName(in ddbWriter, ref getWriteState, _context.Config.TableNamePrefix); + ((TableNameNode) getNode).WriteTableName(in ddbWriter, ref getWriteState, _context.Config.TableNameFormatter); break; } } if(!getWriteState.IsBitSet(NodeBits.TableName)) - writer.WriteTableName(_context.Config.TableNamePrefix, classInfo.TableName!); + writer.WriteTableName(_context.Config.TableNameFormatter, classInfo.TableName!); writer.WriteEndObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/TransactGetItems/TransactGetItemsHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/TransactGetItems/TransactGetItemsHttpContent.cs index 18ea2d34..3a4681f2 100644 --- a/src/EfficientDynamoDb/Internal/Operations/TransactGetItems/TransactGetItemsHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/TransactGetItems/TransactGetItemsHttpContent.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.Internal.Extensions; using EfficientDynamoDb.Internal.Operations.Shared; @@ -10,12 +11,12 @@ namespace EfficientDynamoDb.Internal.Operations.TransactGetItems internal class TransactGetItemsHttpContent : DynamoDbHttpContent { private readonly TransactGetItemsRequest _request; - private readonly string? _tableNamePrefix; + private readonly ITableNameFormatter? _tableNameFormatter; - public TransactGetItemsHttpContent(TransactGetItemsRequest request, string? tableNamePrefix) : base("DynamoDB_20120810.TransactGetItems") + public TransactGetItemsHttpContent(TransactGetItemsRequest request, ITableNameFormatter? tableNameFormatter) : base("DynamoDB_20120810.TransactGetItems") { _request = request; - _tableNamePrefix = tableNamePrefix; + _tableNameFormatter = tableNameFormatter; } protected override async ValueTask WriteDataAsync(DdbWriter ddbWriter) @@ -43,7 +44,7 @@ protected override async ValueTask WriteDataAsync(DdbWriter ddbWriter) if (transactItem.ProjectionExpression != null) writer.WriteString("ProjectionExpression", transactItem.ProjectionExpression); - writer.WriteTableName(_tableNamePrefix, transactItem.TableName); + writer.WriteTableName(_tableNameFormatter, transactItem.TableName); writer.WritePrimaryKey(transactItem.Key!); writer.WriteEndObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/TransactWriteItems/TransactWriteItemsHighLevelHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/TransactWriteItems/TransactWriteItemsHighLevelHttpContent.cs index 9c036c38..f618d106 100644 --- a/src/EfficientDynamoDb/Internal/Operations/TransactWriteItems/TransactWriteItemsHighLevelHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/TransactWriteItems/TransactWriteItemsHighLevelHttpContent.cs @@ -111,7 +111,7 @@ private void WriteUpdateItem(in DdbWriter ddbWriter, ref NoAllocStringBuilder bu ddbWriter.WriteUpdateItem(_context.Config, ref builder, visitor, classInfo, item.GetNode(), ref writeState); if (!writeState.IsBitSet(NodeBits.TableName)) - ddbWriter.JsonWriter.WriteTableName(_context.Config.TableNamePrefix, classInfo.TableName!); + ddbWriter.JsonWriter.WriteTableName(_context.Config.TableNameFormatter, classInfo.TableName!); ddbWriter.JsonWriter.WriteEndObject(); @@ -146,7 +146,7 @@ private void WriteDeleteItem(in DdbWriter ddbWriter, ref NoAllocStringBuilder bu writeState = writeState.SetBit(NodeBits.Condition); break; case BuilderNodeType.TableName: - ((TableNameNode) node).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNamePrefix); + ((TableNameNode) node).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNameFormatter); break; default: node.WriteValue(in ddbWriter, ref writeState); @@ -155,7 +155,7 @@ private void WriteDeleteItem(in DdbWriter ddbWriter, ref NoAllocStringBuilder bu } if(!writeState.IsBitSet(NodeBits.TableName)) - ddbWriter.JsonWriter.WriteTableName(_context.Config.TableNamePrefix, classInfo.TableName!); + ddbWriter.JsonWriter.WriteTableName(_context.Config.TableNameFormatter, classInfo.TableName!); ddbWriter.JsonWriter.WriteEndObject(); @@ -196,7 +196,7 @@ private void WritePutItem(in DdbWriter ddbWriter, ref NoAllocStringBuilder build writeState = writeState.SetBit(NodeBits.Condition); break; case BuilderNodeType.TableName: - ((TableNameNode) node).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNamePrefix); + ((TableNameNode) node).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNameFormatter); break; default: node.WriteValue(in ddbWriter, ref writeState); @@ -207,7 +207,7 @@ private void WritePutItem(in DdbWriter ddbWriter, ref NoAllocStringBuilder build if (!writeState.IsBitSet(NodeBits.TableName)) { var classInfo = _context.Config.Metadata.GetOrAddClassInfo(item.GetEntityType()); - ddbWriter.JsonWriter.WriteTableName(_context.Config.TableNamePrefix, classInfo.TableName!); + ddbWriter.JsonWriter.WriteTableName(_context.Config.TableNameFormatter, classInfo.TableName!); } ddbWriter.JsonWriter.WriteEndObject(); @@ -243,7 +243,7 @@ private void WriteConditionCheck(in DdbWriter ddbWriter, ref NoAllocStringBuilde writeState = writeState.SetBit(NodeBits.Condition); break; case BuilderNodeType.TableName: - ((TableNameNode) node).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNamePrefix); + ((TableNameNode) node).WriteTableName(in ddbWriter, ref writeState, _context.Config.TableNameFormatter); break; default: node.WriteValue(in ddbWriter, ref writeState); @@ -252,7 +252,7 @@ private void WriteConditionCheck(in DdbWriter ddbWriter, ref NoAllocStringBuilde } if(!writeState.IsBitSet(NodeBits.TableName)) - ddbWriter.JsonWriter.WriteTableName(_context.Config.TableNamePrefix, classInfo.TableName!); + ddbWriter.JsonWriter.WriteTableName(_context.Config.TableNameFormatter, classInfo.TableName!); ddbWriter.JsonWriter.WriteEndObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/TransactWriteItems/TransactWriteItemsHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/TransactWriteItems/TransactWriteItemsHttpContent.cs index ced62ba0..c9adc7cf 100644 --- a/src/EfficientDynamoDb/Internal/Operations/TransactWriteItems/TransactWriteItemsHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/TransactWriteItems/TransactWriteItemsHttpContent.cs @@ -1,6 +1,7 @@ using System.Runtime.CompilerServices; using System.Text.Json; using System.Threading.Tasks; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.Internal.Extensions; using EfficientDynamoDb.Internal.Operations.Shared; @@ -12,12 +13,12 @@ namespace EfficientDynamoDb.Internal.Operations.TransactWriteItems internal class TransactWriteItemsHttpContent : DynamoDbHttpContent { private readonly TransactWriteItemsRequest _request; - private readonly string? _tablePrefix; + private readonly ITableNameFormatter? _tableNameFormatter; - public TransactWriteItemsHttpContent(TransactWriteItemsRequest request, string? tablePrefix) : base("DynamoDB_20120810.TransactWriteItems") + public TransactWriteItemsHttpContent(TransactWriteItemsRequest request, ITableNameFormatter? tableNameFormatter) : base("DynamoDB_20120810.TransactWriteItems") { _request = request; - _tablePrefix = tablePrefix; + _tableNameFormatter = tableNameFormatter; } protected override async ValueTask WriteDataAsync(DdbWriter ddbWriter) @@ -64,7 +65,7 @@ protected override async ValueTask WriteDataAsync(DdbWriter ddbWriter) writer.WriteStartObject(); - writer.WriteTableName(_tablePrefix, transactItem.Put.TableName); + writer.WriteTableName(_tableNameFormatter, transactItem.Put.TableName); if (transactItem.Put.ConditionExpression != null) writer.WriteString("ConditionExpression", transactItem.Put.ConditionExpression); @@ -135,7 +136,7 @@ private void WriteDelete(Utf8JsonWriter writer, TransactDeleteItem deleteItem) writer.WriteStartObject(); - writer.WriteTableName(_tablePrefix, deleteItem.TableName); + writer.WriteTableName(_tableNameFormatter, deleteItem.TableName); if (deleteItem.ConditionExpression != null) writer.WriteString("ConditionExpression", deleteItem.ConditionExpression); @@ -162,7 +163,7 @@ private void WriteUpdate(Utf8JsonWriter writer, TransactUpdateItem updateItem) writer.WriteStartObject(); - writer.WriteTableName(_tablePrefix, updateItem.TableName); + writer.WriteTableName(_tableNameFormatter, updateItem.TableName); if (updateItem.ConditionExpression != null) writer.WriteString("ConditionExpression", updateItem.ConditionExpression); diff --git a/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemHighLevelHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemHighLevelHttpContent.cs index 1a959b9c..2641e8b5 100644 --- a/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemHighLevelHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemHighLevelHttpContent.cs @@ -32,7 +32,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) WriteUpdateItem(in ddbWriter, ref writeState); if (!writeState.IsBitSet(NodeBits.TableName)) - ddbWriter.JsonWriter.WriteTableName(_context.Config.TableNamePrefix, _classInfo.TableName!); + ddbWriter.JsonWriter.WriteTableName(_context.Config.TableNameFormatter, _classInfo.TableName!); ddbWriter.JsonWriter.WriteEndObject(); diff --git a/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemHttpContent.cs index 450b01ed..18c3655e 100644 --- a/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemHttpContent.cs @@ -1,6 +1,7 @@ using System.Runtime.CompilerServices; using System.Text.Json; using System.Threading.Tasks; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.Internal.Extensions; using EfficientDynamoDb.Internal.Operations.Shared; @@ -14,12 +15,12 @@ internal class UpdateItemHttpContent : DynamoDbHttpContent private readonly string _pkName; private readonly string _skName; private readonly UpdateItemRequest _request; - private readonly string? _tablePrefix; + private readonly ITableNameFormatter? _tableNameFormatter; - public UpdateItemHttpContent(UpdateItemRequest request, string? tablePrefix, string pkName, string skName) : base("DynamoDB_20120810.UpdateItem") + public UpdateItemHttpContent(UpdateItemRequest request, ITableNameFormatter? tableNameFormatter, string pkName, string skName) : base("DynamoDB_20120810.UpdateItem") { _request = request; - _tablePrefix = tablePrefix; + _tableNameFormatter = tableNameFormatter; _pkName = pkName; _skName = skName; } @@ -31,7 +32,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) WritePrimaryKey(writer); - writer.WriteTableName(_tablePrefix, _request.TableName); + writer.WriteTableName(_tableNameFormatter, _request.TableName); if (_request.ConditionExpression != null) writer.WriteString("ConditionExpression", _request.ConditionExpression); diff --git a/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemSaveHttpContent.cs b/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemSaveHttpContent.cs index 14a67eb9..38cf3950 100644 --- a/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemSaveHttpContent.cs +++ b/src/EfficientDynamoDb/Internal/Operations/UpdateItem/UpdateItemSaveHttpContent.cs @@ -41,7 +41,7 @@ protected override ValueTask WriteDataAsync(DdbWriter ddbWriter) { ddbWriter.JsonWriter.WriteStartObject(); - ddbWriter.JsonWriter.WriteTableName(_config.TableNamePrefix, _classInfo.TableName!); + ddbWriter.JsonWriter.WriteTableName(_config.TableNameFormatter, _classInfo.TableName!); ddbWriter.JsonWriter.WritePropertyName("Key"); ddbWriter.JsonWriter.WriteStartObject(); diff --git a/src/EfficientDynamoDb/Operations/Query/QueryBuilderNodes.cs b/src/EfficientDynamoDb/Operations/Query/QueryBuilderNodes.cs index 1c7fe69a..33478854 100644 --- a/src/EfficientDynamoDb/Operations/Query/QueryBuilderNodes.cs +++ b/src/EfficientDynamoDb/Operations/Query/QueryBuilderNodes.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq.Expressions; +using EfficientDynamoDb.Configs; using EfficientDynamoDb.Converters; using EfficientDynamoDb.FluentCondition; using EfficientDynamoDb.FluentCondition.Core; @@ -692,12 +693,12 @@ public TableNameNode(string value, BuilderNode? next) : base(value, next) public override void WriteValue(in DdbWriter writer, ref int state) => throw new NotImplementedException(); - public void WriteTableName(in DdbWriter writer, ref int state, string? prefix) + public void WriteTableName(in DdbWriter writer, ref int state, ITableNameFormatter? tableNameFormatter) { if (state.IsBitSet(NodeBits.TableName)) return; - writer.JsonWriter.WriteTableName(prefix, Value); + writer.JsonWriter.WriteTableName(tableNameFormatter, Value); state = state.SetBit(NodeBits.TableName); }