private Document UpdateHelper(Document doc, Key key, UpdateItemOperationConfig config) { var currentConfig = config ?? new UpdateItemOperationConfig(); var attributeUpdates = doc.ToAttributeUpdateMap(true); foreach (var keyName in this.keyNames) { if (keyName != null) { attributeUpdates.Remove(keyName); } } UpdateItemRequest req = new UpdateItemRequest { TableName = TableName, Key = key, AttributeUpdates = attributeUpdates, ReturnValues = EnumToStringMapper.Convert(currentConfig.ReturnValues) }; req.BeforeRequestEvent += new RequestEventHandler(this.UserAgentRequestEventHandler); if (currentConfig.Expected != null) req.Expected = currentConfig.Expected.ToExpectedAttributeMap(); var resp = DDBClient.UpdateItem(req); doc.CommitChanges(); Document ret = null; if (currentConfig.ReturnValues != ReturnValues.None) { ret = Document.FromAttributeMap(resp.UpdateItemResult.Attributes); } return ret; }
internal Document UpdateHelper(Document doc, Key key, UpdateItemOperationConfig config, bool isAsync) { var currentConfig = config ?? new UpdateItemOperationConfig(); // If the keys have been changed, treat entire document as having changed bool haveKeysChanged = HaveKeysChanged(doc); bool updateChangedAttributesOnly = !haveKeysChanged; var attributeUpdates = doc.ToAttributeUpdateMap(updateChangedAttributesOnly); foreach (var keyName in this.keyNames) { attributeUpdates.Remove(keyName); } UpdateItemRequest req = new UpdateItemRequest { TableName = TableName, Key = key, AttributeUpdates = attributeUpdates.Count == 0 ? new Dictionary<string,AttributeValueUpdate>() : attributeUpdates, ReturnValues = EnumToStringMapper.Convert(currentConfig.ReturnValues) }; req.BeforeRequestEvent += isAsync ? new RequestEventHandler(UserAgentRequestEventHandlerAsync) : new RequestEventHandler(UserAgentRequestEventHandlerSync); if (currentConfig.Expected != null) req.Expected = currentConfig.Expected.ToExpectedAttributeMap(); var resp = DDBClient.UpdateItem(req); var returnedAttributes = resp.UpdateItemResult.Attributes; doc.CommitChanges(); Document ret = null; if (currentConfig.ReturnValues != ReturnValues.None) { ret = Document.FromAttributeMap(returnedAttributes); } return ret; }
internal Document UpdateHelper(Document doc, Key key, UpdateItemOperationConfig config, bool isAsync) { var currentConfig = config ?? new UpdateItemOperationConfig(); var attributeUpdates = doc.ToAttributeUpdateMap(true); foreach (var keyName in this.keyNames) { attributeUpdates.Remove(keyName); } ReturnValues currentReturnValue = currentConfig.ReturnValues; bool keysOnlyUpdate = attributeUpdates.Count == 0; // If there are no non-key attributes, make an Update call with AllNewAttributes // return value. If no attributes returned, the item doesn't exist yet, so // make a Put call. if (keysOnlyUpdate) { currentReturnValue = ReturnValues.AllNewAttributes; } UpdateItemRequest req = new UpdateItemRequest { TableName = TableName, Key = key, AttributeUpdates = attributeUpdates, ReturnValues = EnumToStringMapper.Convert(currentReturnValue) }; req.BeforeRequestEvent += isAsync ? new RequestEventHandler(UserAgentRequestEventHandlerAsync) : new RequestEventHandler(UserAgentRequestEventHandlerSync); if (currentConfig.Expected != null) req.Expected = currentConfig.Expected.ToExpectedAttributeMap(); var resp = DDBClient.UpdateItem(req); var returnedAttributes = resp.UpdateItemResult.Attributes; doc.CommitChanges(); if (keysOnlyUpdate) { if (returnedAttributes == null || returnedAttributes.Count == 0) { // if only keys were specified and no attributes are returned, we must issue a Put return CallKeysOnlyPut(key, currentConfig, isAsync); } else { // update was called with AllNewAttributes, item exists // return correct set of attributes // [None] is handled at the end // [AllNewAttributes, AllOldAttributes] are equivalent in this case, no-op // [UpdatedNewAttributes, UpdatedOldAttributes] must return no attributes switch (currentConfig.ReturnValues) { case ReturnValues.UpdatedNewAttributes: case ReturnValues.UpdatedOldAttributes: returnedAttributes = new Dictionary<string,AttributeValue>(); break; } } } Document ret = null; if (currentConfig.ReturnValues != ReturnValues.None) { ret = Document.FromAttributeMap(returnedAttributes); } return ret; }