-
Notifications
You must be signed in to change notification settings - Fork 0
/
dynamodb.go
67 lines (54 loc) · 1.42 KB
/
dynamodb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package db
import (
"encoding/json"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/guregu/dynamo"
)
type entry struct {
Key string
Value string
}
// DynamoDBStore reads and writes data to a DynamoDB table
type DynamoDBStore struct {
table dynamo.Table
}
// NewDynamoDBStore creates a new DynamoDBStore for the specified table
func NewDynamoDBStore(session *session.Session, table string) *DynamoDBStore {
return &DynamoDBStore{
table: dynamo.New(session).Table(table),
}
}
// Keys lists all of the keys in the store
func (d *DynamoDBStore) Keys() ([]string, error) {
entries := []entry{}
if err := d.table.Scan().
Consistent(false).
All(&entries); err != nil {
return nil, err
}
keys := make([]string, len(entries))
for i, entry := range entries {
keys[i] = entry.Key
}
return keys, nil
}
// Read will populate v with the entry at the specified key
func (d *DynamoDBStore) Read(key string, v interface{}) error {
var e entry
if err := d.table.Get("Key", key).Consistent(true).One(&e); err != nil {
if err.Error() == "dynamo: no item found" {
return NewMissingEntryError(key)
}
return err
}
return json.Unmarshal([]byte(e.Value), &v)
}
// Write will populate the entry at the specified key with v
func (d *DynamoDBStore) Write(key string, v interface{}) error {
b, err := json.Marshal(v)
if err != nil {
return err
}
e := entry{Key: key, Value: string(b)}
return d.table.Put(e).Run()
}