init
This commit is contained in:
71
internal/filesystem/fs_storage.go
Normal file
71
internal/filesystem/fs_storage.go
Normal file
@@ -0,0 +1,71 @@
|
||||
package filesystem
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
func Open(path string) (*Storage, error) {
|
||||
info, err := os.Stat(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if !info.IsDir() {
|
||||
return nil, fmt.Errorf("provided path %s is not a directory", path)
|
||||
}
|
||||
|
||||
abs, err := filepath.Abs(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not tarnslate %s to absolute path", path)
|
||||
}
|
||||
|
||||
return &Storage{prefix: abs}, nil
|
||||
}
|
||||
|
||||
type Storage struct {
|
||||
prefix string
|
||||
}
|
||||
|
||||
func (s *Storage) Save(key string, data []byte) error {
|
||||
path := s.toAbs(key)
|
||||
|
||||
if err := os.WriteFile(path, data, 0664); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Storage) Load(key string) ([]byte, error) {
|
||||
path := s.toAbs(key)
|
||||
|
||||
b, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func (s *Storage) Delete(key string) error {
|
||||
path := s.toAbs(key)
|
||||
|
||||
err := os.Remove(path)
|
||||
if err != nil && os.IsNotExist(err) {
|
||||
return nil
|
||||
} else if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Storage) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Storage) toAbs(path string) string {
|
||||
return filepath.Join(s.prefix, path)
|
||||
}
|
45
internal/filesystem/fs_storage_test.go
Normal file
45
internal/filesystem/fs_storage_test.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package filesystem
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestStorageMethods(t *testing.T) {
|
||||
st, err := Open("./testdata")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
name := "mytestfile"
|
||||
data := []byte("contents of my test file")
|
||||
|
||||
defer os.Remove(name) // just in case
|
||||
|
||||
if err := st.Save(name, data); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := st.Save(name, data); err != nil {
|
||||
t.Errorf("rewrite operatoin failed: %v", err)
|
||||
}
|
||||
|
||||
b, err := st.Load(name)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if !bytes.Equal(data, b) {
|
||||
t.Error("loaded file differs from original")
|
||||
}
|
||||
|
||||
if err := st.Delete(name); err != nil {
|
||||
t.Errorf("delete failed: %v", err)
|
||||
}
|
||||
|
||||
if err := st.Delete(name); err != nil {
|
||||
t.Errorf("delete of non-existent failed: %v", err)
|
||||
}
|
||||
|
||||
}
|
69
internal/natsobj/nats_store.go
Normal file
69
internal/natsobj/nats_store.go
Normal file
@@ -0,0 +1,69 @@
|
||||
package natsobj
|
||||
|
||||
import (
|
||||
"github.com/nats-io/nats.go"
|
||||
)
|
||||
|
||||
type Storage struct {
|
||||
store nats.ObjectStore
|
||||
conn *nats.Conn
|
||||
}
|
||||
|
||||
func Open(bucket, url string) (*Storage, error) {
|
||||
nc, err := nats.Connect(url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
js, err := nc.JetStream()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cfg := &nats.ObjectStoreConfig{
|
||||
Bucket: bucket,
|
||||
Description: "microkv bucket",
|
||||
MaxBytes: -1,
|
||||
Storage: nats.FileStorage,
|
||||
Compression: true,
|
||||
}
|
||||
|
||||
store, err := js.CreateObjectStore(cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
st := &Storage{store: store, conn: nc}
|
||||
|
||||
return st, nil
|
||||
}
|
||||
|
||||
func (n *Storage) Save(key string, data []byte) error {
|
||||
if _, err := n.store.PutBytes(key, data); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *Storage) Load(key string) ([]byte, error) {
|
||||
b, err := n.store.GetBytes(key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func (n *Storage) Delete(key string) error {
|
||||
if err := n.store.Delete(key); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *Storage) Close() error {
|
||||
n.conn.Close()
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user