Implement minio

master
Bel LaPointe 2019-03-20 09:55:31 -06:00
parent b7a231feaf
commit 4e596f683b
3 changed files with 62 additions and 0 deletions

2
db.go
View File

@ -25,6 +25,8 @@ func New(key Type, params ...string) (db DB, err error) {
err = nil
case BOLT:
db, err = NewBolt(params[0])
case MINIO:
db, err = NewMinio(params[0], params[1], params[2])
case CACHE:
db, err = NewCache(params...)
case LEVELDB:

57
minio.go Normal file
View File

@ -0,0 +1,57 @@
package storage
import (
"bytes"
"io/ioutil"
"strings"
minio "github.com/minio/minio-go"
)
type Minio struct {
db *minio.Client
}
func NewMinio(addr, user, pass string) (*Minio, error) {
db, err := minio.New(addr, user, pass, strings.HasPrefix(addr, "https://"))
return &Minio{db: db}, err
}
func (m *Minio) Get(key string, ns ...string) ([]byte, error) {
namespace := resolveNamespace(ns)
obj, err := m.db.GetObject(namespace, key, minio.GetObjectOptions{})
if err == nil {
var stat minio.ObjectInfo
if stat, err = obj.Stat(); err == nil {
err = stat.Err
}
}
if isNotExistErr(err) {
return nil, ErrNotFound
} else if err != nil {
return nil, err
}
return ioutil.ReadAll(obj)
}
func (m *Minio) Set(key string, value []byte, ns ...string) error {
namespace := resolveNamespace(ns)
if ok, err := m.db.BucketExists(namespace); err != nil {
return err
} else if !ok {
if err := m.db.MakeBucket(namespace, ""); err != nil {
return err
}
}
_, err := m.db.PutObject(namespace, key, bytes.NewBuffer(value), int64(len(value)), minio.PutObjectOptions{})
return err
}
func (m *Minio) Close() error {
m.db = nil
return nil
}
func isNotExistErr(err error) bool {
return err != nil && strings.Contains(err.Error(), "does not exist")
}

View File

@ -14,6 +14,7 @@ const (
MEMCACHE = Type(iota)
MEMCACHECLUSTER = Type(iota)
MONGO = Type(iota)
MINIO = Type(iota)
)
func (t Type) String() string {
@ -22,6 +23,8 @@ func (t Type) String() string {
return "map"
case BOLT:
return "bolt"
case MINIO:
return "minio"
case CACHE:
return "cache"
case LEVELDB: