working commit
This commit is contained in:
@@ -1 +1,76 @@
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user