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); }
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); }