public virtual async Task <TransactionalBatchOperationResult> AddAsync( ItemBatchOperation operation, ITrace trace, ItemRequestOptions itemRequestOptions = null, CancellationToken cancellationToken = default) { if (operation == null) { throw new ArgumentNullException(nameof(operation)); } await this.ValidateOperationAsync(operation, itemRequestOptions, cancellationToken); string resolvedPartitionKeyRangeId = await this.ResolvePartitionKeyRangeIdAsync( operation, trace, cancellationToken).ConfigureAwait(false); BatchAsyncStreamer streamer = this.GetOrAddStreamerForPartitionKeyRange(resolvedPartitionKeyRangeId); ItemBatchOperationContext context = new ItemBatchOperationContext( resolvedPartitionKeyRangeId, trace, BatchAsyncContainerExecutor.GetRetryPolicy(this.cosmosContainer, operation.OperationType, this.retryOptions)); if (itemRequestOptions != null && itemRequestOptions.AddRequestHeaders != null) { // get the header value if any, passed by the encryption package. Headers encryptionHeaders = new Headers(); itemRequestOptions.AddRequestHeaders?.Invoke(encryptionHeaders); // make sure we set the Intended Collection Rid header when we have encrypted payload. // This primarily would allow CosmosDB Encryption package to detect change in container referenced by a Client // and prevent creating data with wrong Encryption Policy. if (encryptionHeaders.TryGetValue(HttpConstants.HttpHeaders.IsClientEncrypted, out string encrypted)) { context.IsClientEncrypted = bool.Parse(encrypted); if (context.IsClientEncrypted && encryptionHeaders.TryGetValue(WFConstants.BackendHeaders.IntendedCollectionRid, out string ridValue)) { context.IntendedCollectionRidValue = ridValue; } } } operation.AttachContext(context); streamer.Add(operation); return(await context.OperationTask); }
public virtual async Task <TransactionalBatchOperationResult> AddAsync( ItemBatchOperation operation, ItemRequestOptions itemRequestOptions = null, CancellationToken cancellationToken = default) { if (operation == null) { throw new ArgumentNullException(nameof(operation)); } await this.ValidateOperationAsync(operation, itemRequestOptions, cancellationToken); string resolvedPartitionKeyRangeId = await this.ResolvePartitionKeyRangeIdAsync(operation, cancellationToken).ConfigureAwait(false); BatchAsyncStreamer streamer = this.GetOrAddStreamerForPartitionKeyRange(resolvedPartitionKeyRangeId); ItemBatchOperationContext context = new ItemBatchOperationContext(resolvedPartitionKeyRangeId, BatchAsyncContainerExecutor.GetRetryPolicy(this.cosmosContainer, operation.OperationType, this.retryOptions)); operation.AttachContext(context); streamer.Add(operation); return(await context.OperationTask); }
public async Task <BatchOperationResult> AddAsync( ItemBatchOperation operation, ItemRequestOptions itemRequestOptions = null, CancellationToken cancellationToken = default(CancellationToken)) { if (operation == null) { throw new ArgumentNullException(nameof(operation)); } await this.ValidateOperationAsync(operation, itemRequestOptions, cancellationToken); string resolvedPartitionKeyRangeId = await this.ResolvePartitionKeyRangeIdAsync(operation, cancellationToken).ConfigureAwait(false); BatchAsyncStreamer streamer = this.GetOrAddStreamerForPartitionKeyRange(resolvedPartitionKeyRangeId); ItemBatchOperationContext context = new ItemBatchOperationContext(resolvedPartitionKeyRangeId); operation.AttachContext(context); streamer.Add(operation); return(await context.Task); }