package dynamodb import simplejson "github.com/bitly/go-simplejson" /* Construct an update item query. The query can be composed via chaining and then executed via Execute() Usage: update := table.UpdateItem(key) .ReturnValues(dynamodb.UPDATED_NEW) .UpdateExpression("SET Counter = Counter + :incr") .UpdateCondition("Counter < :checkVal") .ExpressionAttributes(NewNumberAttribute(":incr", "1"), NewNumberAttribute(":checkVal", 42)) result, err := update.Execute() if err == nil { log.Printf("Counter is now %v", result.Attributes["Counter"].Value) } */ func (t *Table) UpdateItem(key *Key) *UpdateItem { q := NewQuery(t) q.AddKey(t, key) return &UpdateItem{table: t, query: q} } type UpdateItem struct { table *Table query *Query hasReturnValues bool } // Specify how return values are to be provided. func (u *UpdateItem) ReturnValues(returnValues ReturnValues) *UpdateItem { u.hasReturnValues = (returnValues != NONE) u.query.AddReturnValues(returnValues) return u } /* Specify an update expression and optional attribute settings at the same time. update.UpdateExpression("SET Foo = Foo + :incr", dynamodb.NewNumberAttribute(":incr", "7")) is equivalent to update.UpdateExpression("SET Foo = Foo + :incr") .ExpressionAttributes(NewNumberAttribute(":incr", "7")) */ func (u *UpdateItem) UpdateExpression(expression string, attributes ...Attribute) *UpdateItem { u.query.AddUpdateExpression(expression) u.ExpressionAttributes(attributes...) return u } // Specify attribute substitutions to be used in expressions. func (u *UpdateItem) ExpressionAttributes(attributes ...Attribute) *UpdateItem { u.query.AddExpressionAttributes(attributes) return u } // Specify a check condition for conditional updates. func (u *UpdateItem) ConditionExpression(expression string) *UpdateItem { u.query.AddConditionExpression(expression) return u } // Execute this query. func (u *UpdateItem) Execute() (*UpdateResult, error) { jsonResponse, err := u.table.Server.queryServer(target("UpdateItem"), u.query) if err != nil { return nil, err } if u.hasReturnValues { resp, err := simplejson.NewJson(jsonResponse) if err != nil { return nil, err } attrib, err := resp.Get("Attributes").Map() if err != nil { return nil, err } return &UpdateResult{parseAttributes(attrib)}, nil } return nil, nil } type UpdateResult struct { Attributes map[string]*Attribute }