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; }
IAsyncResult invokeUpdateItem(UpdateItemRequest updateItemRequest, AsyncCallback callback, object state, bool synchronized) { IRequest irequest = new UpdateItemRequestMarshaller().Marshall(updateItemRequest); var unmarshaller = UpdateItemResponseUnmarshaller.GetInstance(); AsyncResult result = new AsyncResult(irequest, callback, state, synchronized, signer, unmarshaller); Invoke(result); return result; }
/// <summary> /// <para>Edits an existing item's attributes.</para> <para>You can perform a conditional update (insert a new attribute name-value pair if it /// doesn't exist, or replace an existing name-value pair if it has certain expected attribute values).</para> /// </summary> /// /// <param name="updateItemRequest">Container for the necessary parameters to execute the UpdateItem service method on AmazonDynamoDB.</param> /// /// <returns>The response from the UpdateItem service method, as returned by AmazonDynamoDB.</returns> /// /// <exception cref="ProvisionedThroughputExceededException"/> /// <exception cref="ConditionalCheckFailedException"/> /// <exception cref="InternalServerErrorException"/> /// <exception cref="ResourceNotFoundException"/> public UpdateItemResponse UpdateItem(UpdateItemRequest updateItemRequest) { IAsyncResult asyncResult = invokeUpdateItem(updateItemRequest, null, null, true); return EndUpdateItem(asyncResult); }
/// <summary> /// Initiates the asynchronous execution of the UpdateItem operation. /// <seealso cref="Amazon.DynamoDB.AmazonDynamoDB.UpdateItem"/> /// </summary> /// /// <param name="updateItemRequest">Container for the necessary parameters to execute the UpdateItem operation on AmazonDynamoDB.</param> /// <param name="callback">An AsyncCallback delegate that is invoked when the operation completes.</param> /// <param name="state">A user-defined state object that is passed to the callback procedure. Retrieve this object from within the callback /// procedure using the AsyncState property.</param> /// /// <returns>An IAsyncResult that can be used to poll or wait for results, or both; this value is also needed when invoking EndUpdateItem /// operation.</returns> public IAsyncResult BeginUpdateItem(UpdateItemRequest updateItemRequest, AsyncCallback callback, object state) { return invokeUpdateItem(updateItemRequest, callback, state, false); }
/// <summary> /// <para> Edits an existing item's attributes. You can perform a conditional update (insert a new attribute name-value pair if it doesn't /// exist, or replace an existing name-value pair if it has certain expected attribute values). </para> /// </summary> /// /// <param name="updateItemRequest">Container for the necessary parameters to execute the UpdateItem service method on AmazonDynamoDB.</param> /// /// <returns>The response from the UpdateItem service method, as returned by AmazonDynamoDB.</returns> /// /// <exception cref="ProvisionedThroughputExceededException"/> /// <exception cref="ConditionalCheckFailedException"/> /// <exception cref="InternalServerErrorException"/> /// <exception cref="ResourceNotFoundException"/> public UpdateItemResponse UpdateItem(UpdateItemRequest updateItemRequest) { IRequest<UpdateItemRequest> request = new UpdateItemRequestMarshaller().Marshall(updateItemRequest); UpdateItemResponse response = Invoke<UpdateItemRequest, UpdateItemResponse> (request, this.signer, UpdateItemResponseUnmarshaller.GetInstance()); return response; }