summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/goamz/goamz/dynamodb/table.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/goamz/goamz/dynamodb/table.go')
-rwxr-xr-xvendor/github.com/goamz/goamz/dynamodb/table.go259
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)
+}