提交 33d41285 作者: Tommi Virtanen 提交者: Jeromy

thirdparty/s3-datastore: Datastore keys can be binary, hex encode them for S3

License: MIT
Signed-off-by: 's avatarTommi Virtanen <tv@eagain.net>
上级 9497e26f
package s3datastore package s3datastore
import ( import (
"encoding/hex"
"errors" "errors"
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/crowdmob/goamz/s3" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/crowdmob/goamz/s3"
...@@ -19,25 +20,42 @@ type S3Datastore struct { ...@@ -19,25 +20,42 @@ type S3Datastore struct {
Bucket string Bucket string
} }
func (ds *S3Datastore) encode(key datastore.Key) string {
return hex.EncodeToString(key.Bytes())
}
func (ds *S3Datastore) decode(raw string) (datastore.Key, bool) {
k, err := hex.DecodeString(raw)
if err != nil {
return datastore.Key{}, false
}
return datastore.NewKey(string(k)), true
}
func (ds *S3Datastore) Put(key datastore.Key, value interface{}) (err error) { func (ds *S3Datastore) Put(key datastore.Key, value interface{}) (err error) {
data, ok := value.([]byte) data, ok := value.([]byte)
if !ok { if !ok {
return ErrInvalidType return ErrInvalidType
} }
// TODO extract perms and s3 options // TODO extract perms and s3 options
return ds.Client.Bucket(ds.Bucket).Put(key.String(), data, "application/protobuf", s3.PublicRead, s3.Options{})
k := ds.encode(key)
return ds.Client.Bucket(ds.Bucket).Put(k, data, "application/protobuf", s3.PublicRead, s3.Options{})
} }
func (ds *S3Datastore) Get(key datastore.Key) (value interface{}, err error) { func (ds *S3Datastore) Get(key datastore.Key) (value interface{}, err error) {
return ds.Client.Bucket(ds.Bucket).Get(key.String()) k := ds.encode(key)
return ds.Client.Bucket(ds.Bucket).Get(k)
} }
func (ds *S3Datastore) Has(key datastore.Key) (exists bool, err error) { func (ds *S3Datastore) Has(key datastore.Key) (exists bool, err error) {
return ds.Client.Bucket(ds.Bucket).Exists(key.String()) k := ds.encode(key)
return ds.Client.Bucket(ds.Bucket).Exists(k)
} }
func (ds *S3Datastore) Delete(key datastore.Key) (err error) { func (ds *S3Datastore) Delete(key datastore.Key) (err error) {
return ds.Client.Bucket(ds.Bucket).Del(key.String()) k := ds.encode(key)
return ds.Client.Bucket(ds.Bucket).Del(k)
} }
func (ds *S3Datastore) Query(q query.Query) (query.Results, error) { func (ds *S3Datastore) Query(q query.Query) (query.Results, error) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论