public static Document GetDocumentFromEntity(ITableEntity entity, OperationContext context, TableRequestOptions options)
 {
     if (entity == null)
     {
         throw new ArgumentException("Entity should not be null.");
     }
     TableEntityValidationHelper.ValidatePartitionKey(entity.PartitionKey);
     TableEntityValidationHelper.ValidateRowKey(entity.RowKey);
     return(EntityTranslator.GetDocumentFromEntityProperties(entity.WriteEntity(context), entity.PartitionKey, entity.RowKey, removeSystemGeneratedProperties: false));
 }
        public static ITableEntity GetEntityFromDocument(Document document, OperationContext context, IList <string> selectColumns)
        {
            string         partitionKey = null;
            string         rowKey       = null;
            string         eTag         = null;
            DateTimeOffset timestamp    = default(DateTimeOffset);
            IDictionary <string, EntityProperty> entityProperties = null;

            EntityTranslator.GetEntityPropertiesFromDocument(document, selectColumns, out partitionKey, out rowKey, out eTag, out timestamp, out entityProperties);
            DynamicTableEntity dynamicTableEntity = new DynamicTableEntity(partitionKey, rowKey);

            dynamicTableEntity.ETag         = eTag;
            dynamicTableEntity.Timestamp    = timestamp;
            dynamicTableEntity.PartitionKey = partitionKey;
            dynamicTableEntity.ReadEntity(entityProperties, context);
            return(dynamicTableEntity);
        }
Example #3
0
        internal static async Task <TableQuerySegment <TResult> > QueryDocumentsAsync <TResult>(int?maxItemCount, string filterString, IList <string> selectColumns, TableContinuationToken token, CloudTableClient client, CloudTable table, EntityResolver <TResult> resolver, TableRequestOptions requestOptions, OperationContext operationContext, bool isLinqExpression, IList <OrderByItem> orderByItems, string tombstoneKey)
        {
            ValidateContinuationToken(token);
            selectColumns = ((selectColumns != null) ? new List <string>(selectColumns) : null);
            Dictionary <string, bool> selectedSystemProperties = new Dictionary <string, bool>();
            string      sqlQuery           = QueryTranslator.GetSqlQuery(GetSelectList(selectColumns, requestOptions, out selectedSystemProperties), filterString, isLinqExpression, isTableQuery: false, orderByItems, tombstoneKey, enableTimestampQuery: true);
            FeedOptions defaultFeedOptions = GetDefaultFeedOptions(requestOptions);

            if (maxItemCount.HasValue)
            {
                defaultFeedOptions.MaxItemCount = maxItemCount;
            }
            defaultFeedOptions.SessionToken        = requestOptions.SessionToken;
            defaultFeedOptions.RequestContinuation = token?.NextRowKey;
            FeedResponse <Document> feedResponse = await client.DocumentClient.CreateDocumentQuery <Document>(table.GetCollectionUri(), sqlQuery, defaultFeedOptions).AsDocumentQuery().ExecuteNextAsync <Document>();

            operationContext.RequestResults.Add(feedResponse.ToRequestResult());
            List <TResult> list = new List <TResult>();

            foreach (Document item in feedResponse)
            {
                var itemETag = EtagHelper.ConvertFromBackEndETagFormat(item.ETag);
                item.SetPropertyValue("_etag", itemETag);
                IDictionary <string, EntityProperty> entityPropertiesFromDocument = EntityTranslator.GetEntityPropertiesFromDocument(item, selectColumns);
                list.Add(resolver(selectedSystemProperties["PartitionKey"] ? item.GetPropertyValue <string>("$pk") : null, selectedSystemProperties["RowKey"] ? item.GetPropertyValue <string>("$id") : null, selectedSystemProperties["Timestamp"] ? ((DateTimeOffset)item.Timestamp) : default(DateTimeOffset), entityPropertiesFromDocument, selectedSystemProperties["Etag"] ? item.ETag : null));
            }
            TableQuerySegment <TResult> tableQuerySegment = new TableQuerySegment <TResult>(list);

            if (!string.IsNullOrEmpty(feedResponse.ResponseContinuation))
            {
                tableQuerySegment.ContinuationToken = new TableContinuationToken
                {
                    NextRowKey = feedResponse.ResponseContinuation
                };
            }
            tableQuerySegment.RequestCharge = feedResponse.RequestCharge;
            return(tableQuerySegment);
        }
 protected override string TranslateMemberName(string memberName)
 {
     return(EntityTranslator.GetPropertyName(memberName));
 }
        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;
            }
        }
        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);
        }