This commit is contained in:
78
pkg/storage/disk-storage.go
Normal file
78
pkg/storage/disk-storage.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
)
|
||||
|
||||
var (
|
||||
DiskStorageBasePath = []string{"data"}
|
||||
)
|
||||
|
||||
type DiskStorage struct {
|
||||
dir string
|
||||
}
|
||||
|
||||
func NewDiskStorage(ids []string) (Storage, error) {
|
||||
pth := path.Join(DiskStorageBasePath...)
|
||||
idPth := path.Join(ids...)
|
||||
dir := path.Join(pth, idPth)
|
||||
s := &DiskStorage{dir: dir}
|
||||
err := s.ensureDir()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (ds *DiskStorage) ensureDir() error {
|
||||
pth := path.Dir(ds.dir + "/")
|
||||
return os.MkdirAll(pth, 0777)
|
||||
}
|
||||
|
||||
func (ds *DiskStorage) Get(key string) (io.Reader, error) {
|
||||
if err := ds.ensureDir(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
f, err := os.Open(path.Join(ds.dir, key))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return f, nil
|
||||
}
|
||||
|
||||
func (ds *DiskStorage) Put(key string, data []byte) error {
|
||||
if err := ds.ensureDir(); err != nil {
|
||||
return err
|
||||
}
|
||||
f, err := os.Open(path.Join(ds.dir, key))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = f.Write(data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return f.Close()
|
||||
}
|
||||
|
||||
func (ds *DiskStorage) Delete(key string) error {
|
||||
// Implement disk storage delete logic here
|
||||
return os.Remove(path.Join(ds.dir, key))
|
||||
}
|
||||
|
||||
func (ds *DiskStorage) List(prefix string) ([]string, error) {
|
||||
if err := ds.ensureDir(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
data, err := os.ReadDir(path.Join(ds.dir, prefix))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
res := make([]string, 0, len(data))
|
||||
for _, file := range data {
|
||||
res = append(res, file.Name())
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
44
pkg/storage/mem-storage.go
Normal file
44
pkg/storage/mem-storage.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"os"
|
||||
)
|
||||
|
||||
type MemoryStorage struct {
|
||||
cache map[string][]byte
|
||||
}
|
||||
|
||||
func NewMemoryStorage(ids []string) (Storage, error) {
|
||||
s := &MemoryStorage{
|
||||
cache: make(map[string][]byte),
|
||||
}
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (ms *MemoryStorage) Get(key string) (io.Reader, error) {
|
||||
content, ok := ms.cache[key]
|
||||
if !ok {
|
||||
return nil, os.ErrNotExist
|
||||
}
|
||||
return bytes.NewReader(content), nil
|
||||
}
|
||||
|
||||
func (ms *MemoryStorage) Put(key string, data []byte) error {
|
||||
ms.cache[key] = data
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ms *MemoryStorage) Delete(key string) error {
|
||||
delete(ms.cache, key)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ms *MemoryStorage) List(prefix string) ([]string, error) {
|
||||
res := make([]string, 0, len(ms.cache))
|
||||
for file, _ := range ms.cache {
|
||||
res = append(res, file)
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
12
pkg/storage/storage.go
Normal file
12
pkg/storage/storage.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"io"
|
||||
)
|
||||
|
||||
type Storage interface {
|
||||
Get(key string) (io.Reader, error)
|
||||
Put(key string, data []byte) error
|
||||
Delete(key string) error
|
||||
List(prefix string) ([]string, error)
|
||||
}
|
||||
Reference in New Issue
Block a user