private static TableResult GetTableResultFromResponse(TableOperation operation, ResourceResponse <Document> response, OperationContext context, TableRequestOptions options, List <string> selectColumns, string sessionToken)
        {
            TableResult tableResult = new TableResult();

            tableResult.Etag           = EtagHelper.ConvertFromBackEndETagFormat(response.ResponseHeaders["ETag"]);
            tableResult.HttpStatusCode = (int)response.StatusCode;
            tableResult.SessionToken   = sessionToken;
            tableResult.RequestCharge  = response.RequestCharge;
            if (operation.Entity != null && !string.IsNullOrEmpty(tableResult.Etag))
            {
                operation.Entity.ETag = tableResult.Etag;
            }
            if (operation.OperationType == TableOperationType.InsertOrReplace || operation.OperationType == TableOperationType.Replace || !operation.EchoContent)
            {
                tableResult.HttpStatusCode = 204;
            }
            if (operation.OperationType != TableOperationType.Retrieve)
            {
                if (operation.OperationType != TableOperationType.Delete)
                {
                    tableResult.Result = operation.Entity;
                    ITableEntity tableEntity = tableResult.Result as ITableEntity;
                    if (tableEntity != null)
                    {
                        if (tableResult.Etag != null)
                        {
                            tableEntity.ETag = tableResult.Etag;
                        }
                        tableEntity.Timestamp = response.Resource.Timestamp;
                    }
                }
            }
            else if (response.Resource != null)
            {
                if (operation.RetrieveResolver == null)
                {
                    tableResult.Result = EntityHelpers.GetEntityFromResourceStream(response.ResponseStream, context, operation.SelectColumns);
                }
                else
                {
                    EntityHelpers.GetPropertiesFromResourceStream(response.ResponseStream, operation.SelectColumns, out IDictionary <string, EntityProperty> entityProperties, out IDictionary <string, EntityProperty> documentDBProperties);
                    if (options.ProjectSystemProperties.Value)
                    {
                        EdmConverter.ValidateDocumentDBProperties(documentDBProperties);
                        EntityProperty entityProperty  = documentDBProperties["$pk"];
                        EntityProperty entityProperty2 = documentDBProperties["$id"];
                        EntityProperty entityProperty3 = documentDBProperties["_etag"];
                        EntityProperty entityProperty4 = documentDBProperties["_ts"];
                        string         arg             = EtagHelper.ConvertFromBackEndETagFormat(entityProperty3.StringValue);
                        DateTime       dateTime        = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(entityProperty4.DoubleValue.Value);
                        tableResult.Result = operation.RetrieveResolver(entityProperty.StringValue, entityProperty2.StringValue, dateTime, entityProperties, arg);
                    }
                    else
                    {
                        tableResult.Result = operation.RetrieveResolver(null, null, default(DateTimeOffset), entityProperties, null);
                    }
                }
            }
            return(tableResult);
        }
        private static TableResult GetTableResultFromDocument(TableOperation operation, Document response, OperationContext context, TableRequestOptions requestOptions, string sessionToken, double requestCharge)
        {
            var responseETag = EtagHelper.ConvertFromBackEndETagFormat(response.ETag);

            response.SetPropertyValue("_etag", responseETag);
            TableResult tableResult = new TableResult();

            tableResult.Etag           = response.ETag;
            tableResult.HttpStatusCode = GetSuccessStatusCodeFromOperationType(operation.OperationType);
            tableResult.SessionToken   = sessionToken;
            tableResult.RequestCharge  = requestCharge;
            if (operation.OperationType != TableOperationType.Retrieve)
            {
                operation.Entity.ETag = response.ETag;
                tableResult.Result    = operation.Entity;
            }
            else if (operation.RetrieveResolver != null)
            {
                tableResult.Result = operation.RetrieveResolver(response.GetPropertyValue <string>("$pk"), response.Id, response.Timestamp, EntityTranslator.GetEntityPropertiesFromDocument(response, operation.SelectColumns), response.ETag);
            }
            else
            {
                tableResult.Result = EntityHelpers.GetEntityFromDocument(response, context, operation.SelectColumns);
            }
            return(tableResult);
        }
        private static async Task <TableResult> HandleReadAsync(TableOperation operation, CloudTableClient client, CloudTable table, TableRequestOptions options, OperationContext context, CancellationToken cancellationToken)
        {
            try
            {
                if (operation.IsTableEntity)
                {
                    return(EntityHelpers.GetTableResultFromResponse(await DocumentCollectionBaseHelpers.HandleDocumentCollectionRetrieveAsync(operation.GetCosmosTableName(), client.DocumentClient), context));
                }
                RequestOptions requestOptions = GetRequestOptions(operation, options);
                ResourceResponse <Document> resourceResponse = await DocumentEntityCollectionBaseHelpers.HandleEntityRetrieveAsync(table.Name, operation.PartitionKey, operation.RowKey, client.DocumentClient, requestOptions, cancellationToken);

                return(GetTableResultFromResponse(operation, resourceResponse, context, options, operation.SelectColumns, resourceResponse.SessionToken));
            }
            catch (DocumentClientException ex)
            {
                if (ex.StatusCode == HttpStatusCode.NotFound)
                {
                    return(new TableResult
                    {
                        HttpStatusCode = 404,
                        RequestCharge = ex.RequestCharge
                    });
                }
                throw;
            }
        }
        private static async Task <TableResult> HandleReplaceAsync(TableOperation operation, CloudTableClient client, CloudTable table, TableRequestOptions options, OperationContext context, CancellationToken cancellationToken)
        {
            Document       documentFromEntity            = EntityHelpers.GetDocumentFromEntity(operation.Entity, context, options);
            RequestOptions requestOptions                = GetRequestOptions(operation, options);
            ResourceResponse <Document> resourceResponse = await DocumentEntityCollectionBaseHelpers.HandleEntityReplaceOnlyAsync(table.Name, operation.PartitionKey, operation.RowKey, EtagHelper.ConvertToBackEndETagFormat(operation.ETag), client.DocumentClient, documentFromEntity, requestOptions, cancellationToken);

            return(GetTableResultFromResponse(operation, resourceResponse, context, options, operation.SelectColumns, resourceResponse.SessionToken));
        }
        private static async Task <TableResult> HandleUpsertAsync(TableOperation operation, CloudTableClient client, CloudTable table, TableRequestOptions options, OperationContext context, CancellationToken cancellationToken)
        {
            Document       documentFromEntity            = EntityHelpers.GetDocumentFromEntity(operation.Entity, context, options);
            RequestOptions requestOptions                = GetRequestOptions(operation, options);
            ResourceResponse <Document> resourceResponse = await client.DocumentClient.UpsertDocumentAsync(table.GetCollectionUri(), documentFromEntity, requestOptions, disableAutomaticIdGeneration : true, cancellationToken);

            return(GetTableResultFromResponse(operation, resourceResponse, context, options, operation.SelectColumns, resourceResponse.SessionToken));
        }
        private static async Task <TableResult> HandleMergeAsync(TableOperation operation, CloudTableClient client, CloudTable table, TableRequestOptions options, OperationContext context, CancellationToken cancellationToken)
        {
            Document       documentFromEntity = EntityHelpers.GetDocumentFromEntity(operation.Entity, context, options);
            RequestOptions requestOptions     = GetRequestOptions(operation, options);
            StoredProcedureResponse <string> storedProcedureResponse = await DocumentEntityCollectionBaseHelpers.HandleEntityMergeAsync(table.Name, operation.OperationType, operation.PartitionKey, EtagHelper.ConvertToBackEndETagFormat(operation.ETag), client.DocumentClient, documentFromEntity, requestOptions, cancellationToken);

            Document response = JsonConvert.DeserializeObject <List <Document> >(storedProcedureResponse.Response).FirstOrDefault();

            return(GetTableResultFromDocument(operation, response, context, options, storedProcedureResponse.SessionToken, storedProcedureResponse.RequestCharge));
        }
        internal static async Task <TResult> ExecuteOperationAsync <TResult>(TableOperation operation, CloudTableClient client, CloudTable table, TableRequestOptions requestOptions, OperationContext operationContext, CancellationToken cancellationToken) where TResult : class
        {
            TableResult tableResult;

            try
            {
                switch (operation.OperationType)
                {
                case TableOperationType.Insert:
                    tableResult = await HandleInsertAsync(operation, client, table, requestOptions, operationContext, cancellationToken);

                    break;

                case TableOperationType.Merge:
                case TableOperationType.InsertOrMerge:
                    tableResult = await HandleMergeAsync(operation, client, table, requestOptions, operationContext, cancellationToken);

                    break;

                case TableOperationType.Delete:
                    tableResult = await HandleDeleteAsync(operation, client, table, requestOptions, operationContext, cancellationToken);

                    break;

                case TableOperationType.InsertOrReplace:
                    tableResult = await HandleUpsertAsync(operation, client, table, requestOptions, operationContext, cancellationToken);

                    break;

                case TableOperationType.Replace:
                    tableResult = await HandleReplaceAsync(operation, client, table, requestOptions, operationContext, cancellationToken);

                    break;

                case TableOperationType.Retrieve:
                    tableResult = await HandleReadAsync(operation, client, table, requestOptions, operationContext, cancellationToken);

                    break;

                default:
                    throw new NotSupportedException();
                }
            }
            catch (Exception exception)
            {
                StorageException tableResultFromException = EntityHelpers.GetTableResultFromException(exception, operation);
                operationContext.RequestResults.Add(tableResultFromException.RequestInformation);
                throw tableResultFromException;
            }
            operationContext.FireRequestCompleted(new RequestEventArgs(operationContext.LastResult));
            return(tableResult as TResult);
        }
        private static async Task <TableResult> HandleDeleteAsync(TableOperation operation, CloudTableClient client, CloudTable table, TableRequestOptions options, OperationContext context, CancellationToken cancellationToken)
        {
            if (operation.IsTableEntity)
            {
                string stringValue           = ((DynamicTableEntity)operation.Entity).Properties["TableName"].StringValue;
                Uri    documentCollectionUri = UriFactory.CreateDocumentCollectionUri("TablesDB", stringValue);
                return(EntityHelpers.GetTableResultFromResponse(await client.DocumentClient.DeleteDocumentCollectionAsync(documentCollectionUri), context));
            }
            RequestOptions requestOptions = GetRequestOptions(operation, options);
            ResourceResponse <Document> resourceResponse = await DocumentEntityCollectionBaseHelpers.HandleEntityDeleteAsync(table.Name, operation.PartitionKey, operation.RowKey, EtagHelper.ConvertToBackEndETagFormat(operation.ETag), client.DocumentClient, requestOptions, cancellationToken);

            return(GetTableResultFromResponse(operation, resourceResponse, context, options, operation.SelectColumns, resourceResponse.SessionToken));
        }
 private Task <TableQuerySegment <TResult> > ExecuteQuerySegmentedInternalAsync <TResult>(TableQuery query, TableContinuationToken token, CloudTableClient client, CloudTable table, EntityResolver <TResult> resolver, TableRequestOptions requestOptions, OperationContext operationContext, CancellationToken cancellationToken, bool isLinq)
 {
     operationContext = (operationContext ?? new OperationContext());
     return(TableExtensionRetryPolicy.Execute(async delegate
     {
         try
         {
             return await TableExtensionQueryHelper.QueryDocumentsAsync(query.TakeCount, string.IsNullOrEmpty(query.FilterString) ? query.FilterString : ODataV3Translator.TranslateFilter(query.FilterString, useUtcTicks: false), query.SelectColumns, token, client, table, resolver, requestOptions, operationContext, isLinq, query.OrderByEntities, TombstoneFieldName);
         }
         catch (Exception exception)
         {
             StorageException tableResultFromException = EntityHelpers.GetTableResultFromException(exception);
             operationContext.RequestResults.Add(tableResultFromException.RequestInformation);
             throw tableResultFromException;
         }
     }, cancellationToken, operationContext, requestOptions));
 }
        private static async Task <TableResult> HandleInsertAsync(TableOperation operation, CloudTableClient client, CloudTable table, TableRequestOptions options, OperationContext context, CancellationToken cancellationToken)
        {
            if (operation.IsTableEntity)
            {
                DynamicTableEntity tblEntity             = (DynamicTableEntity)operation.Entity;
                string             cosmosTableName       = tblEntity.GetCosmosTableName();
                int?           cosmosTableThroughput     = tblEntity.GetCosmosTableThroughput();
                IndexingPolicy cosmosTableIndexingPolicy = tblEntity.GetCosmosTableIndexingPolicy();
                RequestOptions defaultRequestOptions     = GetDefaultRequestOptions(null, cosmosTableThroughput);
                return(EntityHelpers.GetTableResultFromResponse(await DocumentCollectionBaseHelpers.HandleCollectionFeedInsertAsync(client.DocumentClient, cosmosTableName, cosmosTableIndexingPolicy, defaultRequestOptions, cancellationToken), context));
            }
            Document       documentFromEntity            = EntityHelpers.GetDocumentFromEntity(operation.Entity, context, options);
            RequestOptions requestOptions                = GetRequestOptions(operation, options);
            ResourceResponse <Document> resourceResponse = await DocumentEntityCollectionBaseHelpers.HandleEntityFeedInsertAsync(table.Name, client.DocumentClient, documentFromEntity, requestOptions, cancellationToken);

            return(GetTableResultFromResponse(operation, resourceResponse, context, options, operation.SelectColumns, resourceResponse.SessionToken));
        }
        internal static async Task <TResult> ExecuteBatchOperationAsync <TResult>(TableBatchOperation batch, CloudTableClient client, CloudTable table, TableRequestOptions requestOptions, OperationContext operationContext, CancellationToken cancellationToken) where TResult : class
        {
            TableOperationType currentOperationType = batch.First().OperationType;

            batch.First();
            try
            {
                List <Document>           list  = new List <Document>();
                List <TableOperationType> list2 = new List <TableOperationType>();
                List <string>             list3 = new List <string>();
                foreach (TableOperation item2 in batch)
                {
                    currentOperationType = item2.OperationType;
                    Document item = (item2.OperationType != TableOperationType.Retrieve) ? EntityHelpers.GetDocumentFromEntity(item2.Entity, operationContext, requestOptions) : EntityTranslator.GetDocumentWithPartitionAndRowKey(item2.RetrievePartitionKey, item2.RetrieveRowKey);
                    list.Add(item);
                    list2.Add(item2.OperationType);
                    list3.Add((item2.Entity == null) ? string.Empty : EtagHelper.ConvertToBackEndETagFormat(item2.Entity.ETag));
                }
                RequestOptions requestOptions2    = GetRequestOptions(batch.batchPartitionKey, requestOptions);
                Uri            storedProcedureUri = UriFactory.CreateStoredProcedureUri("TablesDB", table.Name, "__.sys.tablesBatchOperation");
                StoredProcedureResponse <string> storedProcedureResponse = await table.ServiceClient.DocumentClient.ExecuteStoredProcedureAsync <string>(storedProcedureUri, requestOptions2, new object[3]
                {
                    list.ToArray(),
                    list2.ToArray(),
                    list3.ToArray()
                });

                JArray           jArray           = JArray.Parse(storedProcedureResponse.Response);
                TableBatchResult tableBatchResult = new TableBatchResult();
                tableBatchResult.RequestCharge = storedProcedureResponse.RequestCharge;
                for (int i = 0; i < jArray.Count; i++)
                {
                    tableBatchResult.Add(GetTableResultFromDocument(batch[i], jArray[i].ToObject <Document>(), operationContext, requestOptions, storedProcedureResponse.SessionToken, 0.0));
                }
                return(tableBatchResult as TResult);
            }
            catch (Exception ex)
            {
                DocumentClientException ex2 = ex as DocumentClientException;
                if (ex2 != null && ex2.StatusCode == HttpStatusCode.BadRequest && ex2.Message.Contains("Resource Not Found") && currentOperationType == TableOperationType.Retrieve)
                {
                    TableBatchResult tableBatchResult2 = new TableBatchResult();
                    tableBatchResult2.Add(new TableResult
                    {
                        Etag           = null,
                        HttpStatusCode = 404,
                        Result         = null
                    });
                    tableBatchResult2.RequestCharge = ex2.RequestCharge;
                    return(tableBatchResult2 as TResult);
                }
                TableErrorResult tableErrorResult = ex.TranslateDocumentErrorForStoredProcs(null, batch.Count);
                RequestResult    requestResult    = GenerateRequestResult(tableErrorResult.ExtendedErroMessage, tableErrorResult.HttpStatusCode, tableErrorResult.ExtendedErrorCode, tableErrorResult.ExtendedErroMessage, tableErrorResult.ServiceRequestID, tableErrorResult.RequestCharge);
                StorageException ex3 = new StorageException(requestResult, requestResult.ExtendedErrorInformation.ErrorMessage, ex);
                if (ex2 != null)
                {
                    PopulateOperationContextForBatchOperations(operationContext, ex3, ex2.ActivityId);
                }
                throw ex3;
            }
        }