func()

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
}