public TableEntityPath Bind(IReadOnlyDictionary <string, object> bindingData) { string tableName = _tableNameTemplate.Bind(bindingData); string partitionKey = _partitionKeyTemplate.Bind(bindingData); string rowKey = _rowKeyTemplate.Bind(bindingData); TableClient.ValidateAzureTableName(tableName); TableClient.ValidateAzureTableKeyValue(partitionKey); TableClient.ValidateAzureTableKeyValue(rowKey); return(new TableEntityPath(tableName, partitionKey, rowKey)); }
public Task <IValueProvider> BindAsync(object value, ValueBindingContext context) { TableEntityContext entityContext = null; if (!_converter.TryConvert(value, out entityContext)) { throw new InvalidOperationException("Unable to convert value to TableEntityContext."); } TableClient.ValidateAzureTableKeyValue(entityContext.PartitionKey); TableClient.ValidateAzureTableKeyValue(entityContext.RowKey); return(BindEntityAsync(entityContext, context)); }
public static IBindableTableEntityPath Create(string tableNamePattern, string partitionKeyPattern, string rowKeyPattern) { BindingTemplate tableNameTemplate = BindingTemplate.FromString(tableNamePattern); BindingTemplate partitionKeyTemplate = BindingTemplate.FromString(partitionKeyPattern); BindingTemplate rowKeyTemplate = BindingTemplate.FromString(rowKeyPattern); if (tableNameTemplate.HasParameters || partitionKeyTemplate.HasParameters || rowKeyTemplate.HasParameters) { return(new ParameterizedTableEntityPath(tableNameTemplate, partitionKeyTemplate, rowKeyTemplate)); } TableClient.ValidateAzureTableName(tableNamePattern); TableClient.ValidateAzureTableKeyValue(partitionKeyPattern); TableClient.ValidateAzureTableKeyValue(rowKeyPattern); TableEntityPath innerPath = new TableEntityPath(tableNamePattern, partitionKeyPattern, rowKeyPattern); return(new BoundTableEntityPath(innerPath)); }
public async Task AddAsync(T item, CancellationToken cancellationToken = default(CancellationToken)) { // Careful: // 1. even with upsert, all rowkeys within a batch must be unique. If they aren't, the previous items // will be flushed. // 2. Capture at time of Add, in case item is mutated after add. // 3. Validate rowkey on the client so we get a nice error instead of the cryptic 400 from auzre. string partitionKey = item.PartitionKey; string rowKey = item.RowKey; TableClient.ValidateAzureTableKeyValue(partitionKey); TableClient.ValidateAzureTableKeyValue(rowKey); Dictionary <string, IStorageTableOperation> partition; if (!_map.TryGetValue(partitionKey, out partition)) { if (_map.Count >= MaxPartitionWidth) { // Offline cache is too large. Clear some room await FlushAsync(cancellationToken); } partition = new Dictionary <string, IStorageTableOperation>(); _map[partitionKey] = partition; } var itemCopy = Copy(item); if (partition.ContainsKey(rowKey)) { // Replacing item forces a flush to ensure correct eTag behaviour. await FlushPartitionAsync(partition, cancellationToken); // Reinitialize partition partition = new Dictionary <string, IStorageTableOperation>(); _map[partitionKey] = partition; } _log.EntitiesWritten++; if (String.IsNullOrEmpty(itemCopy.ETag)) { partition.Add(rowKey, _table.CreateInsertOperation(itemCopy)); } else if (itemCopy.ETag.Equals("*")) { partition.Add(rowKey, _table.CreateInsertOrReplaceOperation(itemCopy)); } else { partition.Add(rowKey, _table.CreateReplaceOperation(itemCopy)); } if (partition.Count >= MaxBatchSize) { await FlushPartitionAsync(partition, cancellationToken); _map.Remove(partitionKey); } }