コード例 #1
0
        private TableRow CreateAndPopulateSqlEntity(UtilityRow utilRow)
        {
            TableRow tableRow = new TableRow()
            {
                AccountName  = this.AccountName,
                TableName    = this.m_currentResourceContainer.Name.ToLowerInvariant(),
                PartitionKey = DevelopmentStorageDbDataContext.EncodeKeyString(utilRow.PartitionKey),
                RowKey       = DevelopmentStorageDbDataContext.EncodeKeyString(utilRow.RowKey),
                Data         = XmlUtility.GetXmlFromUtilityRow(utilRow)
            };

            return(tableRow);
        }
コード例 #2
0
        internal static XElement MergeXmlProperties(UtilityRow deltaRow, XElement existingRowXml)
        {
            UtilityRow value      = deltaRow.Clone();
            UtilityRow utilityRow = new UtilityRow();

            XmlUtility.AddObjectsToDictionaryFromXml(existingRowXml, utilityRow, true);
            foreach (KeyValuePair <string, object> columnValue in utilityRow.ColumnValues)
            {
                if (value.ColumnValues.ContainsKey(columnValue.Key) && value[columnValue.Key] != null)
                {
                    continue;
                }
                value[columnValue.Key] = columnValue.Value;
            }
            return(XmlUtility.GetXmlFromUtilityRow(value));
        }
コード例 #3
0
        private void ProcessChange(ChangeDescription changeDescription)
        {
            TableRow           sqlEntity          = null;
            PointQueryTracker  pointQuery         = null;
            DbTableDataContext failedCommandIndex = this;

            failedCommandIndex.FailedCommandIndex = failedCommandIndex.FailedCommandIndex + 1;
            switch (changeDescription.UpdateType)
            {
            case UpdateKind.Insert:
            {
                this.CheckPermissions(null, changeDescription);
                this.CheckPartitionAndRowKeys(((UtilityRow)changeDescription.Row).PartitionKey, ((UtilityRow)changeDescription.Row).RowKey, changeDescription.UpdateType);
                DateTime?nullable = null;
                sqlEntity = this.GetSqlEntity(((UtilityRow)changeDescription.Row).PartitionKey, ((UtilityRow)changeDescription.Row).RowKey, nullable);
                if (sqlEntity != null)
                {
                    throw new TableServiceGeneralException(TableServiceError.EntityAlreadyExists, null);
                }
                UtilityRow row = (UtilityRow)changeDescription.Row;
                this.AddChangeToMap(DevelopmentStorageDbDataContext.EncodeKeyString(row.PartitionKey), DevelopmentStorageDbDataContext.EncodeKeyString(row.RowKey), changeDescription);
                this.m_dbContext.TableRows.InsertOnSubmit(this.CreateAndPopulateSqlEntity(row));
                return;
            }

            case UpdateKind.Delete:
            {
                if (changeDescription.IfMatchHeaderMissing)
                {
                    throw new XStoreArgumentException("If-Match header is mandatory when deleting an entity.");
                }
                sqlEntity = this.CheckAndGetEntity(changeDescription, true);
                this.AddChangeToMap(sqlEntity.PartitionKey, sqlEntity.RowKey, changeDescription);
                this.m_dbContext.TableRows.DeleteOnSubmit(sqlEntity);
                return;
            }

            case UpdateKind.Replace:
            {
                sqlEntity = this.CheckAndGetEntity(changeDescription, true);
                this.AddChangeToMap(sqlEntity.PartitionKey, sqlEntity.RowKey, changeDescription);
                sqlEntity.Data = XmlUtility.GetXmlFromUtilityRow(changeDescription.Row as UtilityRow);
                return;
            }

            case UpdateKind.Merge:
            {
                sqlEntity = this.CheckAndGetEntity(changeDescription, true);
                this.AddChangeToMap(sqlEntity.PartitionKey, sqlEntity.RowKey, changeDescription);
                sqlEntity.Data = XmlUtility.MergeXmlProperties(changeDescription.Row as UtilityRow, sqlEntity.Data);
                return;
            }

            case UpdateKind.InsertOrMerge:
            {
                this.ExecuteQuery <UtilityRow>(changeDescription);
                pointQuery = ((DbTableRowQueryProvider <UtilityRow>)changeDescription.QueryableRow.Provider).PointQuery;
                if (pointQuery == null)
                {
                    throw new DataServiceException(400, "PK and RK not present in the required format");
                }
                (changeDescription.Row as UtilityRow).PartitionKey = pointQuery.PartitionKey;
                (changeDescription.Row as UtilityRow).RowKey       = pointQuery.RowKey;
                sqlEntity = this.CheckAndGetEntity(changeDescription, false);
                this.AddChangeToMap(DevelopmentStorageDbDataContext.EncodeKeyString(pointQuery.PartitionKey), DevelopmentStorageDbDataContext.EncodeKeyString(pointQuery.RowKey), changeDescription);
                if (sqlEntity != null)
                {
                    sqlEntity.Data = XmlUtility.MergeXmlProperties(changeDescription.Row as UtilityRow, sqlEntity.Data);
                    return;
                }
                this.m_dbContext.TableRows.InsertOnSubmit(this.CreateAndPopulateSqlEntity(changeDescription.Row as UtilityRow));
                return;
            }

            case UpdateKind.InsertOrReplace:
            {
                this.ExecuteQuery <UtilityRow>(changeDescription);
                pointQuery = ((DbTableRowQueryProvider <UtilityRow>)changeDescription.QueryableRow.Provider).PointQuery;
                if (pointQuery == null)
                {
                    throw new DataServiceException(400, "PK and RK not present in the required format");
                }
                (changeDescription.Row as UtilityRow).PartitionKey = pointQuery.PartitionKey;
                (changeDescription.Row as UtilityRow).RowKey       = pointQuery.RowKey;
                sqlEntity = this.CheckAndGetEntity(changeDescription, false);
                this.AddChangeToMap(DevelopmentStorageDbDataContext.EncodeKeyString(pointQuery.PartitionKey), DevelopmentStorageDbDataContext.EncodeKeyString(pointQuery.RowKey), changeDescription);
                if (sqlEntity != null)
                {
                    sqlEntity.Data = XmlUtility.GetXmlFromUtilityRow(changeDescription.Row as UtilityRow);
                    return;
                }
                this.m_dbContext.TableRows.InsertOnSubmit(this.CreateAndPopulateSqlEntity(changeDescription.Row as UtilityRow));
                return;
            }

            default:
            {
                return;
            }
            }
        }