77 lines
1.5 KiB
Go
77 lines
1.5 KiB
Go
package storage
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"mstore/app/logger"
|
|
"mstore/pkg/auxuuid"
|
|
)
|
|
|
|
type Storage struct {
|
|
basepath string
|
|
logg *logger.Logger
|
|
}
|
|
|
|
func NewStorage(basepath string) *Storage {
|
|
res := &Storage{
|
|
basepath: basepath,
|
|
}
|
|
res.logg = logger.NewLogger("storage")
|
|
return res
|
|
}
|
|
|
|
func (store *Storage) LinkFile(tmpname, collection, filename string) error {
|
|
var err error
|
|
dirname := filepath.Join(store.basepath, collection)
|
|
err = os.MkdirAll(dirname, 0750)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
filename = filepath.Join(store.basepath, collection, filename)
|
|
os.Remove(filename)
|
|
|
|
err = os.Link(tmpname, filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = os.Remove(tmpname)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (store *Storage) WriteTempFile(source io.Reader) (string, int64, string, error) {
|
|
var err error
|
|
var size int64
|
|
var digest string
|
|
|
|
tmpname := auxuuid.NewUUID()
|
|
tmpname = fmt.Sprintf("file-%s.tmp", tmpname)
|
|
tmppath := filepath.Join(store.basepath, tmpname)
|
|
|
|
file, err := os.OpenFile(tmppath, os.O_WRONLY|os.O_CREATE, 0640)
|
|
if err != nil {
|
|
return tmppath, size, digest, err
|
|
}
|
|
defer file.Close()
|
|
|
|
hasher := sha256.New()
|
|
writer := io.MultiWriter(file, hasher)
|
|
|
|
size, err = io.Copy(writer, source)
|
|
if err != nil {
|
|
return tmppath, size, digest, err
|
|
}
|
|
digest = hex.EncodeToString(hasher.Sum(nil))
|
|
digest = fmt.Sprintf("sha256:%s", digest)
|
|
|
|
return tmppath, size, digest, err
|
|
}
|