-
Notifications
You must be signed in to change notification settings - Fork 0
/
objectstore.go
109 lines (91 loc) · 2.58 KB
/
objectstore.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package rig
import (
"bytes"
"errors"
"io"
"io/ioutil"
"os"
"path/filepath"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/s3"
)
var errDoesNotExist = errors.New("rig: (internal) does not exist")
type ObjectStore interface {
GetObject(name string) (io.ReadCloser, error)
DeleteObject(name string) error
PutObject(name string, data io.ReadSeeker, size int64) error
}
type DirectoryCreator interface {
CreateDirectory(string) error
}
func NewS3ObjectStore(s3 *s3.S3, bucket string) ObjectStore {
return &s3ObjectStore{
s3: s3,
bucket: bucket,
}
}
func NewFileObjectStore(basePath string) ObjectStore {
return &fileObjectStore{
basePath: basePath,
}
}
func (objectStore *fileObjectStore) CreateDirectory(path string) error {
return os.MkdirAll(filepath.Join(objectStore.basePath, path), 0755)
}
type s3ObjectStore struct {
s3 *s3.S3
bucket string
}
func (objectStore *s3ObjectStore) GetObject(name string) (io.ReadCloser, error) {
input := &s3.GetObjectInput{}
input = input.SetBucket(objectStore.bucket).SetKey(name)
output, err := objectStore.s3.GetObject(input)
if err != nil {
if aerr, ok := err.(awserr.Error); ok && aerr.Code() == s3.ErrCodeNoSuchKey {
return nil, errDoesNotExist
}
return nil, err
}
return output.Body, nil
}
func (objectStore *s3ObjectStore) DeleteObject(name string) error {
input := &s3.DeleteObjectInput{}
input = input.SetBucket(objectStore.bucket).SetKey(name)
_, err := objectStore.s3.DeleteObject(input)
return err
}
func (objectStore *s3ObjectStore) PutObject(name string, data io.ReadSeeker, size int64) error {
input := &s3.PutObjectInput{}
input = input.SetBucket(objectStore.bucket).SetKey(name).SetContentLength(size).SetBody(data)
_, err := objectStore.s3.PutObject(input)
return err
}
type fileObjectStore struct {
basePath string
}
type nopCloser struct {
io.Reader
}
func (_ nopCloser) Close() error {
return nil
}
func (objectStore fileObjectStore) GetObject(name string) (io.ReadCloser, error) {
res, err := ioutil.ReadFile(filepath.Join(objectStore.basePath, name))
if err != nil {
if os.IsNotExist(err) {
return nil, errDoesNotExist
}
return nil, err
}
return nopCloser{bytes.NewReader(res)}, nil
}
func (objectStore fileObjectStore) PutObject(name string, data io.ReadSeeker, size int64) error {
buf, err := ioutil.ReadAll(data)
if err != nil {
return err
}
return ioutil.WriteFile(filepath.Join(objectStore.basePath, name), buf, 0666)
}
func (objectStore fileObjectStore) DeleteObject(name string) error {
return os.Remove(filepath.Join(objectStore.basePath, name))
}