Skip to content

Commit 0dabf1d

Browse files
author
neocxf
authored
Merge pull request #7 from fastone-open/topic/neo/fix-mem
fix(memory): add generic memory support
2 parents 202e446 + bd87dc5 commit 0dabf1d

File tree

6 files changed

+184
-63
lines changed

6 files changed

+184
-63
lines changed

services/fs/utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type Service struct {
2727

2828
// String implements Service.String.
2929
func (s *Service) String() string {
30-
return fmt.Sprintf("Servicer qingstor {AccessKey: %s}", "")
30+
return fmt.Sprintf("Servicer fs {WorkDir: %s}", s.workDir)
3131
}
3232

3333
// Std{in/out/err} support

services/memory/generated.go

Lines changed: 72 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

services/memory/internal/cmd/meta.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,16 @@ var Metadata = def.Metadata{
1111
Infos: []def.Info{},
1212
Factory: []def.Pair{
1313
def.PairWorkDir,
14+
def.PairName,
15+
},
16+
Service: def.Service{
17+
Features: types.ServiceFeatures{
18+
Create: true,
19+
Delete: true,
20+
Get: true,
21+
List: true,
22+
},
1423
},
15-
Service: def.Service{},
1624
Storage: def.Storage{
1725
Features: types.StorageFeatures{
1826
WriteEmptyObject: true,

services/memory/service.go

Lines changed: 62 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,59 +2,81 @@ package memory
22

33
import (
44
"context"
5-
"errors"
6-
"sync"
5+
"path"
76

7+
"github.com/fastone-open/go-storage/services"
88
"github.com/fastone-open/go-storage/types"
99
)
1010

11-
var _ types.Servicer = &BucketService{}
11+
func (s *Service) create(ctx context.Context, name string, opt pairServiceCreate) (store types.Storager, err error) {
12+
// ServicePairCreate requires location, so we don't need to add location into pairs
13+
// pairs := append(opt.pairs, ps.WithName(name))
14+
st, err := s.newStorage(name)
15+
if err != nil {
16+
return
17+
}
1218

13-
type BucketService struct {
14-
types.UnimplementedServicer
15-
sync.RWMutex
16-
buckets map[string]types.Storager
19+
s.Lock()
20+
defer s.Unlock()
21+
s.buckets[name] = st
22+
return st, nil
1723
}
1824

19-
func NewBucketService() types.Servicer {
20-
return &BucketService{
21-
buckets: make(map[string]types.Storager),
22-
}
25+
func (s *Service) delete(ctx context.Context, name string, opt pairServiceDelete) (err error) {
26+
s.Lock()
27+
defer s.Unlock()
28+
delete(s.buckets, name)
29+
return nil
2330
}
2431

25-
func (m *BucketService) String() string {
26-
return "BucketService"
27-
}
28-
func (m *BucketService) Create(name string, pairs ...types.Pair) (store types.Storager, err error) {
29-
m.Lock()
30-
defer m.Unlock()
31-
if _, found := m.buckets[name]; found {
32-
return nil, errors.New("bucket already exists")
32+
func (s *Service) formatError(op string, err error, name string) error {
33+
if err == nil {
34+
return nil
35+
}
36+
37+
return services.ServiceError{
38+
Op: op,
39+
Err: formatError(err),
40+
Servicer: s,
41+
Name: name,
3342
}
34-
sto, err := NewStorager(pairs...)
35-
m.buckets[name] = sto
36-
return sto, err
37-
}
38-
func (m *BucketService) CreateWithContext(ctx context.Context, name string, pairs ...types.Pair) (store types.Storager, err error) {
39-
return m.Create(name, pairs...)
4043
}
41-
func (m *BucketService) Delete(name string, pairs ...types.Pair) (err error) {
42-
m.Lock()
43-
defer m.Unlock()
44-
delete(m.buckets, name)
45-
return nil
44+
45+
func (s *Service) get(ctx context.Context, name string, opt pairServiceGet) (store types.Storager, err error) {
46+
store, err = s.newStorage(name)
47+
if err != nil {
48+
return
49+
}
50+
return
4651
}
47-
func (m *BucketService) DeleteWithContext(ctx context.Context, name string, pairs ...types.Pair) (err error) {
48-
return m.Delete(name, pairs...)
52+
53+
func (s *Service) list(ctx context.Context, opt pairServiceList) (it *types.StoragerIterator, err error) {
54+
return types.NewStoragerIterator(ctx, s.nextStoragePage, nil), nil
4955
}
50-
func (m *BucketService) Get(name string, pairs ...types.Pair) (store types.Storager, err error) {
51-
m.RLock()
52-
defer m.RUnlock()
53-
if sto, found := m.buckets[name]; found {
54-
return sto, nil
56+
57+
func (s *Service) newStorage(name string) (store *Storage, err error) {
58+
s.Lock()
59+
defer s.Unlock()
60+
store, ok := s.buckets[name]
61+
if ok {
62+
return store, nil
63+
}
64+
65+
store = &Storage{
66+
f: s.f,
67+
workDir: path.Join(s.f.WorkDir, name),
5568
}
56-
return nil, errors.New("bucket not found")
69+
return store, nil
5770
}
58-
func (m *BucketService) GetWithContext(ctx context.Context, name string, pairs ...types.Pair) (store types.Storager, err error) {
59-
return m.Get(name, pairs...)
71+
72+
func (s *Service) nextStoragePage(ctx context.Context, page *types.StoragerPage) error {
73+
for name := range s.buckets {
74+
store, err := s.newStorage(name)
75+
if err != nil {
76+
return err
77+
}
78+
page.Data = append(page.Data, store)
79+
}
80+
81+
return types.IterateDone
6082
}

services/memory/tests/utils_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package tests
22

33
import (
4-
"github.com/stretchr/testify/require"
54
"testing"
65

6+
"github.com/stretchr/testify/require"
7+
8+
"github.com/fastone-open/go-storage/services"
79
"github.com/fastone-open/go-storage/types"
810

911
"github.com/fastone-open/go-storage/services/memory"
@@ -26,3 +28,12 @@ func TestService(t *testing.T) {
2628
require.NoError(t, err)
2729
t.Log(store)
2830
}
31+
32+
func TestService2(t *testing.T) {
33+
servicer, err := services.NewServicerFromString("memory:///mock/?credential=hmac::&endpoint=")
34+
require.NoError(t, err)
35+
store, err := servicer.Create("demo")
36+
require.NoError(t, err)
37+
t.Log(store)
38+
39+
}

0 commit comments

Comments
 (0)