@@ -2,59 +2,81 @@ package memory
22
33import (
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}
0 commit comments