diff options
Diffstat (limited to 'vendor/github.com/goamz/goamz/dynamodb/table.go')
-rwxr-xr-x | vendor/github.com/goamz/goamz/dynamodb/table.go | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/vendor/github.com/goamz/goamz/dynamodb/table.go b/vendor/github.com/goamz/goamz/dynamodb/table.go new file mode 100755 index 000000000..541433c13 --- /dev/null +++ b/vendor/github.com/goamz/goamz/dynamodb/table.go @@ -0,0 +1,259 @@ +package dynamodb + +import ( + "encoding/json" + "errors" + "fmt" + simplejson "github.com/bitly/go-simplejson" +) + +type Table struct { + Server *Server + Name string + Key PrimaryKey +} + +type AttributeDefinitionT struct { + Name string `json:"AttributeName"` + Type string `json:"AttributeType"` +} + +type KeySchemaT struct { + AttributeName string + KeyType string +} + +type ProjectionT struct { + ProjectionType string +} + +type GlobalSecondaryIndexT struct { + IndexName string + IndexSizeBytes int64 + ItemCount int64 + KeySchema []KeySchemaT + Projection ProjectionT + ProvisionedThroughput ProvisionedThroughputT +} + +type LocalSecondaryIndexT struct { + IndexName string + IndexSizeBytes int64 + ItemCount int64 + KeySchema []KeySchemaT + Projection ProjectionT +} + +type ProvisionedThroughputT struct { + NumberOfDecreasesToday int64 + ReadCapacityUnits int64 + WriteCapacityUnits int64 +} + +type StreamSpecificationT struct { + StreamEnabled bool + StreamViewType string +} + +type TableDescriptionT struct { + AttributeDefinitions []AttributeDefinitionT + CreationDateTime float64 + ItemCount int64 + KeySchema []KeySchemaT + GlobalSecondaryIndexes []GlobalSecondaryIndexT + LocalSecondaryIndexes []LocalSecondaryIndexT + ProvisionedThroughput ProvisionedThroughputT + StreamSpecification StreamSpecificationT + TableName string + TableSizeBytes int64 + TableStatus string + LatestStreamArn string + LatestStreamLabel string +} + +type describeTableResponse struct { + Table TableDescriptionT +} + +func findAttributeDefinitionByName(ads []AttributeDefinitionT, name string) *AttributeDefinitionT { + for _, a := range ads { + if a.Name == name { + return &a + } + } + return nil +} + +func (a *AttributeDefinitionT) GetEmptyAttribute() *Attribute { + switch a.Type { + case "S": + return NewStringAttribute(a.Name, "") + case "N": + return NewNumericAttribute(a.Name, "") + case "B": + return NewBinaryAttribute(a.Name, "") + default: + return nil + } +} + +func (t *TableDescriptionT) BuildPrimaryKey() (pk PrimaryKey, err error) { + for _, k := range t.KeySchema { + var attr *Attribute + ad := findAttributeDefinitionByName(t.AttributeDefinitions, k.AttributeName) + if ad == nil { + return pk, errors.New("An inconsistency found in TableDescriptionT") + } + attr = ad.GetEmptyAttribute() + if attr == nil { + return pk, errors.New("An inconsistency found in TableDescriptionT") + } + + switch k.KeyType { + case "HASH": + pk.KeyAttribute = attr + case "RANGE": + pk.RangeAttribute = attr + } + } + return +} + +func (s *Server) NewTable(name string, key PrimaryKey) *Table { + return &Table{s, name, key} +} + +func (s *Server) ListTables() ([]string, error) { + var tables []string + + query := NewEmptyQuery() + + jsonResponse, err := s.queryServer(target("ListTables"), query) + + if err != nil { + return nil, err + } + + json, err := simplejson.NewJson(jsonResponse) + + if err != nil { + return nil, err + } + + response, err := json.Get("TableNames").Array() + + if err != nil { + message := fmt.Sprintf("Unexpected response %s", jsonResponse) + return nil, errors.New(message) + } + + for _, value := range response { + if t, ok := (value).(string); ok { + tables = append(tables, t) + } + } + + return tables, nil +} + +func (s *Server) CreateTable(tableDescription TableDescriptionT) (string, error) { + query := NewEmptyQuery() + query.AddCreateRequestTable(tableDescription) + + jsonResponse, err := s.queryServer(target("CreateTable"), query) + + if err != nil { + return "unknown", err + } + + json, err := simplejson.NewJson(jsonResponse) + + if err != nil { + return "unknown", err + } + + return json.Get("TableDescription").Get("TableStatus").MustString(), nil +} + +func (s *Server) DeleteTable(tableDescription TableDescriptionT) (string, error) { + query := NewEmptyQuery() + query.AddDeleteRequestTable(tableDescription) + + jsonResponse, err := s.queryServer(target("DeleteTable"), query) + + if err != nil { + return "unknown", err + } + + json, err := simplejson.NewJson(jsonResponse) + + if err != nil { + return "unknown", err + } + + return json.Get("TableDescription").Get("TableStatus").MustString(), nil +} + +func (t *Table) DescribeTable() (*TableDescriptionT, error) { + return t.Server.DescribeTable(t.Name) +} + +func (s *Server) DescribeTable(name string) (*TableDescriptionT, error) { + q := NewEmptyQuery() + q.addTableByName(name) + + jsonResponse, err := s.queryServer(target("DescribeTable"), q) + if err != nil { + return nil, err + } + + var r describeTableResponse + err = json.Unmarshal(jsonResponse, &r) + if err != nil { + return nil, err + } + + return &r.Table, nil +} + +func (s *Server) UpdateTable(tableDescription TableDescriptionT) (string, error) { + query := NewEmptyQuery() + query.AddUpdateRequestTable(tableDescription) + + jsonResponse, err := s.queryServer(target("UpdateTable"), query) + + if err != nil { + return "unknown", err + } + + json, err := simplejson.NewJson(jsonResponse) + + if err != nil { + return "unknown", err + } + + return json.Get("TableDescription").Get("TableStatus").MustString(), nil +} + +func (t *Table) ListStreams(startArn string) ([]StreamListItemT, error) { + return t.Server.ListTableStreams(t.Name, startArn) +} + +func (t *Table) LimitedListStreams(startArn string, limit int64) ([]StreamListItemT, error) { + return t.Server.LimitedListTableStreams(t.Name, startArn, limit) +} + +func keyParam(k *PrimaryKey, hashKey string, rangeKey string) string { + value := fmt.Sprintf("{\"HashKeyElement\":{%s}", keyValue(k.KeyAttribute.Type, hashKey)) + + if k.RangeAttribute != nil { + value = fmt.Sprintf("%s,\"RangeKeyElement\":{%s}", value, + keyValue(k.RangeAttribute.Type, rangeKey)) + } + + return fmt.Sprintf("\"Key\":%s}", value) +} + +func keyValue(key string, value string) string { + return fmt.Sprintf("\"%s\":\"%s\"", key, value) +} |