working commit

This commit is contained in:
2026-02-04 21:43:26 +02:00
parent 55e8abcdd3
commit 3900d93559
7 changed files with 340 additions and 68 deletions
+130 -51
View File
@@ -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
}