in nimo-shake/writer/dynamo_proxy.go [238:282]
func (dpw *DynamoProxyWriter) Update(input []interface{}, index []interface{}) error {
if len(input) == 0 {
return nil
}
// fmt.Println(input, index)
for i := range input {
val := input[i].(map[string]*dynamodb.AttributeValue)
key := index[i].(map[string]*dynamodb.AttributeValue)
// why no update interface like BatchWriteItem !!!!
// generate new map(expression-attribute-values) and expression(update-expression)
newMap := make(map[string]*dynamodb.AttributeValue, len(val))
expressionBuffer := new(bytes.Buffer)
expressionBuffer.WriteString("SET")
cnt := 1
for k, v := range val {
newKey := fmt.Sprintf(":v%d", cnt)
newMap[newKey] = v
if cnt == 1 {
expressionBuffer.WriteString(fmt.Sprintf(" %s=%s", k, newKey))
} else {
expressionBuffer.WriteString(fmt.Sprintf(",%s=%s", k, newKey))
}
cnt++
}
// fmt.Println(newMap)
_, err := dpw.svc.UpdateItem(&dynamodb.UpdateItemInput{
TableName: aws.String(dpw.ns.Collection),
Key: key,
UpdateExpression: aws.String(expressionBuffer.String()),
ExpressionAttributeValues: newMap,
})
if err != nil && utils.DynamoIgnoreError(err, "u", true) {
LOG.Warn("%s ignore error[%v] when insert", dpw, err)
return nil
}
}
return nil
}