working commit
This commit is contained in:
+130
-51
@@ -3,6 +3,7 @@ package storage
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
@@ -12,6 +13,12 @@ import (
|
||||
"mstore/pkg/auxuuid"
|
||||
)
|
||||
|
||||
const (
|
||||
sha256prefix = "sha256:"
|
||||
filesubdir = "files"
|
||||
tmpsubdir = "tmps"
|
||||
)
|
||||
|
||||
type Storage struct {
|
||||
basepath string
|
||||
logg *logger.Logger
|
||||
@@ -25,11 +32,6 @@ func NewStorage(basepath string) *Storage {
|
||||
return res
|
||||
}
|
||||
|
||||
const (
|
||||
filesubdir = "files"
|
||||
tmpsubdir = "tmps"
|
||||
)
|
||||
|
||||
func (store *Storage) makeCollecionpath(collection string) string {
|
||||
return filepath.Join(store.basepath, filesubdir, collection)
|
||||
}
|
||||
@@ -63,10 +65,51 @@ func (store *Storage) GetFileReader(collection, filename string) (io.ReadCloser,
|
||||
return res, err
|
||||
}
|
||||
|
||||
func (store *Storage) WriteTempFile(source io.Reader) (string, int64, string, error) {
|
||||
var err error
|
||||
var size int64
|
||||
var csum string
|
||||
|
||||
tmpname := auxuuid.NewUUID()
|
||||
tmpname = fmt.Sprintf("file-%s.tmp", tmpname)
|
||||
tmppath := store.makeTmppath(tmpname)
|
||||
|
||||
tmpdirpath := store.makeTmpsubdir()
|
||||
err = os.MkdirAll(tmpdirpath, 0750)
|
||||
if err != nil {
|
||||
return tmpname, size, csum, err
|
||||
}
|
||||
|
||||
file, err := os.OpenFile(tmppath, os.O_WRONLY|os.O_CREATE, 0640)
|
||||
if err != nil {
|
||||
return tmpname, size, csum, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
hasher := sha256.New()
|
||||
writer := io.MultiWriter(file, hasher)
|
||||
|
||||
size, err = io.Copy(writer, source)
|
||||
if err != nil {
|
||||
return tmpname, size, csum, err
|
||||
}
|
||||
csum = hex.EncodeToString(hasher.Sum(nil))
|
||||
csum = sha256prefix + csum
|
||||
|
||||
return tmpname, size, csum, err
|
||||
}
|
||||
|
||||
func (store *Storage) HardlinkFile(tmpname, collection, filename string) error {
|
||||
var err error
|
||||
|
||||
dirname := store.makeCollecionpath(collection)
|
||||
err = os.MkdirAll(dirname, 0750)
|
||||
_, err = os.Stat(dirname)
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
err = os.MkdirAll(dirname, 0750)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -86,40 +129,6 @@ func (store *Storage) HardlinkFile(tmpname, collection, filename string) error {
|
||||
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 := store.makeTmppath(tmpname)
|
||||
|
||||
tmpdirpath := store.makeTmpsubdir()
|
||||
err = os.MkdirAll(tmpdirpath, 0750)
|
||||
if err != nil {
|
||||
return tmpname, size, digest, err
|
||||
}
|
||||
|
||||
file, err := os.OpenFile(tmppath, os.O_WRONLY|os.O_CREATE, 0640)
|
||||
if err != nil {
|
||||
return tmpname, size, digest, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
hasher := sha256.New()
|
||||
writer := io.MultiWriter(file, hasher)
|
||||
|
||||
size, err = io.Copy(writer, source)
|
||||
if err != nil {
|
||||
return tmpname, size, digest, err
|
||||
}
|
||||
digest = hex.EncodeToString(hasher.Sum(nil))
|
||||
digest = fmt.Sprintf("sha256:%s", digest)
|
||||
|
||||
return tmpname, size, digest, err
|
||||
}
|
||||
|
||||
func (store *Storage) DeleteFile(collection, filename string) error {
|
||||
var err error
|
||||
filename = store.makeFilepath(collection, filename)
|
||||
@@ -127,10 +136,8 @@ func (store *Storage) DeleteFile(collection, filename string) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO: more safe removing
|
||||
// TODO: safe dir removing
|
||||
dirname := store.makeCollecionpath(collection)
|
||||
|
||||
err = os.RemoveAll(dirname)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -159,20 +166,27 @@ func (store *Storage) makeBlobsubdir() string {
|
||||
return filepath.Join(store.basepath, blobsubdir)
|
||||
}
|
||||
|
||||
func (store *Storage) WriteUpload(digest string, source io.Reader) (int64, error) {
|
||||
func (store *Storage) WriteUpload(uploadID string, source io.Reader) (int64, string, error) {
|
||||
var err error
|
||||
var recsize int64
|
||||
var recsum string
|
||||
|
||||
uploadDir := store.makeUpsubdir()
|
||||
err = os.MkdirAll(uploadDir, 0750)
|
||||
_, err = os.Stat(uploadDir)
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
err = os.MkdirAll(uploadDir, 0750)
|
||||
if err != nil {
|
||||
return recsize, recsum, err
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return recsize, err
|
||||
return recsize, recsum, err
|
||||
}
|
||||
|
||||
uploadPath := store.makeUppath(digest)
|
||||
uploadPath := store.makeUppath(uploadID)
|
||||
uploadFile, err := os.OpenFile(uploadPath, os.O_WRONLY|os.O_CREATE, 0644)
|
||||
if err != nil {
|
||||
return recsize, err
|
||||
return recsize, recsum, err
|
||||
}
|
||||
defer uploadFile.Close()
|
||||
|
||||
@@ -180,9 +194,12 @@ func (store *Storage) WriteUpload(digest string, source io.Reader) (int64, error
|
||||
streamWriter := io.MultiWriter(uploadFile, hasher)
|
||||
recsize, err = io.Copy(streamWriter, source)
|
||||
if err != nil {
|
||||
return recsize, err
|
||||
return recsize, recsum, err
|
||||
}
|
||||
return recsize, err
|
||||
recsum = hex.EncodeToString(hasher.Sum(nil))
|
||||
recsum = sha256prefix + recsum
|
||||
|
||||
return recsize, recsum, err
|
||||
}
|
||||
|
||||
func (store *Storage) LinkUpload(reference, digest string) error {
|
||||
@@ -191,7 +208,13 @@ func (store *Storage) LinkUpload(reference, digest string) error {
|
||||
blobPath := store.makeBlobpath(digest)
|
||||
|
||||
blobdir := store.makeBlobsubdir()
|
||||
err = os.MkdirAll(blobdir, 0750)
|
||||
_, err = os.Stat(blobdir)
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
err = os.MkdirAll(blobdir, 0750)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -216,3 +239,59 @@ func (store *Storage) RemoveUpload(digest string) error {
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (store *Storage) WriteBlob(digest string, source io.Reader) (int64, string, error) {
|
||||
var err error
|
||||
var recsize int64
|
||||
var recsum string
|
||||
|
||||
//defer source.Close()
|
||||
|
||||
blobdir := store.makeBlobsubdir()
|
||||
_, err = os.Stat(blobdir)
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
err = os.MkdirAll(blobdir, 0750)
|
||||
if err != nil {
|
||||
return recsize, digest, err
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return recsize, digest, err
|
||||
}
|
||||
|
||||
blobpath := store.makeBlobpath(digest)
|
||||
blobfile, err := os.OpenFile(blobpath, os.O_WRONLY|os.O_CREATE, 0644)
|
||||
if err != nil {
|
||||
return recsize, digest, err
|
||||
}
|
||||
defer blobfile.Close()
|
||||
|
||||
hasher := sha256.New() // TODO
|
||||
multiWriter := io.MultiWriter(blobfile, hasher)
|
||||
recsize, err = io.Copy(multiWriter, source)
|
||||
if err != nil {
|
||||
return recsize, digest, err
|
||||
}
|
||||
recsum = hex.EncodeToString(hasher.Sum(nil))
|
||||
recsum = sha256prefix + recsum
|
||||
|
||||
return recsize, recsum, err
|
||||
}
|
||||
|
||||
func (st *Storage) BlobFileExists(digest string) (bool, int64, error) {
|
||||
var err error
|
||||
var fileSize int64
|
||||
|
||||
blobPath := st.makeBlobpath(digest)
|
||||
|
||||
fileStat, err := os.Stat(blobPath)
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
return false, 0, nil
|
||||
}
|
||||
if err != nil {
|
||||
return false, 0, err
|
||||
}
|
||||
|
||||
fileSize = fileStat.Size()
|
||||
return true, fileSize, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user