1
// Copyright 2014 Canonical Ltd.
2
// Licensed under the LGPLv3, see LICENCE file for details.
9
"github.com/juju/errors"
10
"github.com/juju/loggo"
14
var logger = loggo.GetLogger("juju.storage")
16
type gridFSStorage struct {
22
var _ ResourceStorage = (*gridFSStorage)(nil)
24
// NewGridFS returns a ResourceStorage instance backed by a mongo GridFS.
25
// namespace is used to segregate different sets of data.
26
func NewGridFS(dbName, namespace string, session *mgo.Session) ResourceStorage {
27
return &gridFSStorage{
34
func (g *gridFSStorage) db() *mgo.Database {
35
return g.session.DB(g.dbName)
38
func (g *gridFSStorage) gridFS() *mgo.GridFS {
39
return g.db().GridFS(g.namespace)
42
// Get is defined on ResourceStorage.
43
func (g *gridFSStorage) Get(path string) (io.ReadCloser, error) {
44
file, err := g.gridFS().Open(path)
46
return nil, errors.Annotatef(err, "failed to open GridFS file %q", path)
51
// Put is defined on ResourceStorage.
52
func (g *gridFSStorage) Put(path string, r io.Reader, length int64) (checksum string, err error) {
53
file, err := g.gridFS().Create(path)
55
return "", errors.Annotatef(err, "failed to create GridFS file %q", path)
60
if removeErr := g.Remove(path); removeErr != nil {
61
logger.Warningf("error cleaning up after failed write: %v", removeErr)
65
if _, err = io.CopyN(file, r, length); err != nil {
66
return "", errors.Annotatef(err, "failed to write data")
68
if err = file.Close(); err != nil {
69
return "", errors.Annotatef(err, "failed to flush data")
71
return file.MD5(), nil
74
// Remove is defined on ResourceStorage.
75
func (g *gridFSStorage) Remove(path string) error {
76
return g.gridFS().Remove(path)