internal override async Task <PartitionedQueryExecutionInfo> ExecuteQueryPlanRequestAsync( Uri resourceUri, ResourceType resourceType, OperationType operationType, SqlQuerySpec sqlQuerySpec, Action <CosmosRequestMessage> requestEnricher, CancellationToken cancellationToken) { PartitionedQueryExecutionInfo partitionedQueryExecutionInfo; using (CosmosResponseMessage message = await this.clientContext.ProcessResourceOperationStreamAsync( resourceUri: resourceUri, resourceType: resourceType, operationType: operationType, requestOptions: null, partitionKey: null, cosmosContainerCore: this.cosmosContainerCore, streamPayload: this.clientContext.CosmosSerializer.ToStream <SqlQuerySpec>(sqlQuerySpec), requestEnricher: requestEnricher, cancellationToken: cancellationToken)) { // Syntax exception are argument exceptions and thrown to the user. message.EnsureSuccessStatusCode(); partitionedQueryExecutionInfo = this.clientContext.CosmosSerializer.FromStream <PartitionedQueryExecutionInfo>(message.Content); } return(partitionedQueryExecutionInfo); }
internal T ToObjectInternal <T>(CosmosResponseMessage cosmosResponseMessage, CosmosJsonSerializer jsonSerializer) { // Not finding something is part of a normal work-flow and should not be an exception. // This prevents the unnecessary overhead of an exception if (cosmosResponseMessage.StatusCode == HttpStatusCode.NotFound) { return(default(T)); } //Throw the exception cosmosResponseMessage.EnsureSuccessStatusCode(); if (cosmosResponseMessage.Content == null) { return(default(T)); } return(jsonSerializer.FromStream <T>(cosmosResponseMessage.Content)); }
internal static CosmosQueryResponse <T> CreateCosmosQueryResponse( CosmosResponseMessage cosmosResponseMessage, CosmosJsonSerializer jsonSerializer) { using (cosmosResponseMessage) { // Throw the exception if the query failed. cosmosResponseMessage.EnsureSuccessStatusCode(); string continuationToken = CosmosFeedResultSetIteratorCore.GetContinuationToken(cosmosResponseMessage); bool hasMoreResults = CosmosFeedResultSetIteratorCore.GetHasMoreResults(continuationToken, cosmosResponseMessage.StatusCode); return(CosmosQueryResponse <T> .CreateResponse <T>( stream : cosmosResponseMessage.Content, jsonSerializer : jsonSerializer, continuationToken : continuationToken, hasMoreResults : hasMoreResults)); } }
internal static CosmosQueryResponse <TInput> CreateCosmosQueryFeedResponse <TInput>( CosmosResponseMessage cosmosResponseMessage, CosmosJsonSerializer jsonSerializer) { using (cosmosResponseMessage) { // Throw the exception if the query failed: EnsureSuccessStatusCode only // validates 200-299. 304 is valid for Changefeed so do not throw on that. if (cosmosResponseMessage.StatusCode != HttpStatusCode.NotModified) { cosmosResponseMessage.EnsureSuccessStatusCode(); } string continuationToken = cosmosResponseMessage.Headers.ETag; bool hasMoreResults = ChangeFeedResultSetStreamIterator.GetHasMoreResults(continuationToken, cosmosResponseMessage.StatusCode); return(CosmosQueryResponse <TInput> .CreateResponse <TInput>( stream : cosmosResponseMessage.Content, jsonSerializer : jsonSerializer, continuationToken : continuationToken, hasMoreResults : hasMoreResults)); } }
private FeedResponse <CosmosElement> GetFeedResponse( CosmosQueryRequestOptions requestOptions, ResourceType resourceType, CosmosResponseMessage cosmosResponseMessage) { using (cosmosResponseMessage) { // DEVNOTE: For now throw the exception. Needs to be converted to handle exceptionless path. cosmosResponseMessage.EnsureSuccessStatusCode(); // Execute the callback an each element of the page // For example just could get a response like this // { // "_rid": "qHVdAImeKAQ=", // "Documents": [{ // "id": "03230", // "_rid": "qHVdAImeKAQBAAAAAAAAAA==", // "_self": "dbs\/qHVdAA==\/colls\/qHVdAImeKAQ=\/docs\/qHVdAImeKAQBAAAAAAAAAA==\/", // "_etag": "\"410000b0-0000-0000-0000-597916b00000\"", // "_attachments": "attachments\/", // "_ts": 1501107886 // }], // "_count": 1 // } // And you should execute the callback on each document in "Documents". MemoryStream memoryStream = new MemoryStream(); cosmosResponseMessage.Content.CopyTo(memoryStream); long responseLengthBytes = memoryStream.Length; byte[] content = memoryStream.ToArray(); IJsonNavigator jsonNavigator = null; // Use the users custom navigator first. If it returns null back try the // internal override navigator. if (requestOptions.CosmosSerializationOptions != null) { jsonNavigator = requestOptions.CosmosSerializationOptions.CreateCustomNavigatorCallback(content); if (jsonNavigator == null) { throw new InvalidOperationException("The CosmosSerializationOptions did not return a JSON navigator."); } } else { jsonNavigator = JsonNavigator.Create(content); } string resourceName = this.GetRootNodeName(resourceType); if (!jsonNavigator.TryGetObjectProperty( jsonNavigator.GetRootNode(), resourceName, out ObjectProperty objectProperty)) { throw new InvalidOperationException($"Response Body Contract was violated. QueryResponse did not have property: {resourceName}"); } IJsonNavigatorNode cosmosElements = objectProperty.ValueNode; if (!(CosmosElement.Dispatch( jsonNavigator, cosmosElements) is CosmosArray cosmosArray)) { throw new InvalidOperationException($"QueryResponse did not have an array of : {resourceName}"); } int itemCount = cosmosArray.Count; return(new FeedResponse <CosmosElement>( result: cosmosArray, count: itemCount, responseHeaders: cosmosResponseMessage.Headers.CosmosMessageHeaders, responseLengthBytes: responseLengthBytes)); } }