public static IReadOnlyList <Record> GetRecords(this ReadFeedPage page) { using (MemoryStream memoryStream = new MemoryStream()) { page.Content.CopyTo(memoryStream); CosmosObject responseEnvolope = CosmosObject.CreateFromBuffer(memoryStream.ToArray()); if (!responseEnvolope.TryGetValue("Documents", out CosmosArray documents)) { throw new InvalidOperationException(); } List <Record> records = new List <Record>(); foreach (CosmosElement document in documents) { CosmosObject documentObject = (CosmosObject)document; ResourceId rid = ResourceId.Parse(((CosmosString)documentObject["_rid"]).Value); long ticks = Number64.ToLong(((CosmosNumber)documentObject["_ts"]).Value); string id = ((CosmosString)documentObject["id"]).Value; CosmosObject payload = documentObject; Record record = new Record(rid, new DateTime(ticks: ticks, DateTimeKind.Utc), id, payload); records.Add(record); } return(records); } }
/// <summary> /// Get the next set of results from the cosmos service /// </summary> /// <param name="cancellationToken">(Optional) <see cref="CancellationToken"/> representing request cancellation.</param> /// <returns>A query response from cosmos service</returns> public override async Task <ResponseMessage> ReadNextAsync(CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); if (!this.hasMoreResults) { throw new InvalidOperationException("Should not be calling FeedIterator that does not have any more results"); } if (this.monadicEnumerator.Failed) { this.hasMoreResults = false; CosmosException cosmosException = ExceptionToCosmosException.CreateFromException(this.monadicEnumerator.Exception); return(new ResponseMessage( statusCode: System.Net.HttpStatusCode.BadRequest, requestMessage: null, headers: cosmosException.Headers, cosmosException: cosmosException, diagnostics: cosmosException.DiagnosticsContext)); } CrossPartitionReadFeedAsyncEnumerator enumerator = this.monadicEnumerator.Result; TryCatch <ReadFeedPage> monadicPage; try { if (!await enumerator.MoveNextAsync()) { throw new InvalidOperationException("Should not be calling enumerator that does not have any more results"); } monadicPage = enumerator.Current; } catch (Exception ex) { monadicPage = TryCatch <ReadFeedPage> .FromException(ex); } if (monadicPage.Failed) { CosmosException cosmosException = ExceptionToCosmosException.CreateFromException(monadicPage.Exception); if (!IsRetriableException(cosmosException)) { this.hasMoreResults = false; } return(new ResponseMessage( statusCode: cosmosException.StatusCode, requestMessage: null, headers: cosmosException.Headers, cosmosException: cosmosException, diagnostics: cosmosException.DiagnosticsContext)); } ReadFeedPage readFeedPage = monadicPage.Result; if (readFeedPage.State == default) { this.hasMoreResults = false; } // Make the continuation token match the older format: string continuationToken; if (readFeedPage.State != null) { List <CompositeContinuationToken> compositeContinuationTokens = new List <CompositeContinuationToken>(); CosmosArray compositeContinuationTokensCosmosArray = (CosmosArray)readFeedPage.State.ContinuationToken; foreach (CosmosElement arrayItem in compositeContinuationTokensCosmosArray) { ReadFeedContinuationToken readFeedContinuationToken = ReadFeedContinuationToken.MonadicConvertFromCosmosElement(arrayItem).Result; FeedRangeEpk feedRangeEpk = (FeedRangeEpk)readFeedContinuationToken.Range; ReadFeedState readFeedState = readFeedContinuationToken.State; CompositeContinuationToken compositeContinuationToken = new CompositeContinuationToken() { Range = feedRangeEpk.Range, Token = readFeedState.ContinuationToken.ToString(), }; compositeContinuationTokens.Add(compositeContinuationToken); } FeedRangeCompositeContinuation feedRangeCompositeContinuation = new FeedRangeCompositeContinuation( containerRid: string.Empty, feedRange: FeedRangeEpk.FullRange, compositeContinuationTokens); continuationToken = feedRangeCompositeContinuation.ToString(); } else { continuationToken = null; } return(new ResponseMessage( statusCode: System.Net.HttpStatusCode.OK, requestMessage: default,