|
|
|
package donut
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"github.com/minio-io/iodine"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"path"
|
|
|
|
)
|
|
|
|
|
|
|
|
func newDonutObjectWriter(objectDir string) (Writer, error) {
|
|
|
|
dataFile, err := os.OpenFile(path.Join(objectDir, "data"), os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600)
|
|
|
|
if err != nil {
|
|
|
|
return nil, iodine.New(err, map[string]string{"objectDir": objectDir})
|
|
|
|
}
|
|
|
|
return donutObjectWriter{
|
|
|
|
root: objectDir,
|
|
|
|
file: dataFile,
|
|
|
|
metadata: make(map[string]string),
|
|
|
|
donutMetadata: make(map[string]string),
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type donutObjectWriter struct {
|
|
|
|
root string
|
|
|
|
file *os.File
|
|
|
|
metadata map[string]string
|
|
|
|
donutMetadata map[string]string
|
|
|
|
err error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d donutObjectWriter) Write(data []byte) (int, error) {
|
|
|
|
written, err := d.file.Write(data)
|
|
|
|
return written, iodine.New(err, nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d donutObjectWriter) Close() error {
|
|
|
|
if d.err != nil {
|
|
|
|
return iodine.New(d.err, nil)
|
|
|
|
}
|
|
|
|
metadata, _ := json.Marshal(d.metadata)
|
|
|
|
ioutil.WriteFile(path.Join(d.root, "metadata.json"), metadata, 0600)
|
|
|
|
donutMetadata, _ := json.Marshal(d.donutMetadata)
|
|
|
|
ioutil.WriteFile(path.Join(d.root, "donutMetadata.json"), donutMetadata, 0600)
|
|
|
|
|
|
|
|
return iodine.New(d.file.Close(), nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d donutObjectWriter) CloseWithError(err error) error {
|
|
|
|
if d.err != nil {
|
|
|
|
d.err = err
|
|
|
|
}
|
|
|
|
return iodine.New(d.Close(), nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d donutObjectWriter) SetMetadata(metadata map[string]string) error {
|
|
|
|
for k := range d.metadata {
|
|
|
|
delete(d.metadata, k)
|
|
|
|
}
|
|
|
|
for k, v := range metadata {
|
|
|
|
d.metadata[k] = v
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d donutObjectWriter) GetMetadata() (map[string]string, error) {
|
|
|
|
metadata := make(map[string]string)
|
|
|
|
for k, v := range d.metadata {
|
|
|
|
metadata[k] = v
|
|
|
|
}
|
|
|
|
return metadata, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d donutObjectWriter) SetDonutMetadata(metadata map[string]string) error {
|
|
|
|
for k := range d.donutMetadata {
|
|
|
|
delete(d.donutMetadata, k)
|
|
|
|
}
|
|
|
|
for k, v := range metadata {
|
|
|
|
d.donutMetadata[k] = v
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d donutObjectWriter) GetDonutMetadata() (map[string]string, error) {
|
|
|
|
donutMetadata := make(map[string]string)
|
|
|
|
for k, v := range d.donutMetadata {
|
|
|
|
donutMetadata[k] = v
|
|
|
|
}
|
|
|
|
return donutMetadata, nil
|
|
|
|
}
|