-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #7 from xxxsen/xxxsen/feature/store_impl
Xxxsen/feature/store impl
- Loading branch information
Showing
12 changed files
with
185 additions
and
221 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package hasher | ||
|
||
import ( | ||
"crypto/md5" | ||
"encoding/hex" | ||
) | ||
|
||
func ToMD5(in string) string { | ||
h := md5.New() | ||
_, _ = h.Write([]byte(in)) | ||
return hex.EncodeToString(h.Sum(nil)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
package store | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
"os" | ||
"path/filepath" | ||
"yamdc/hasher" | ||
) | ||
|
||
type diskStorage struct { | ||
dir string | ||
} | ||
|
||
func NewDiskStorage(dir string) IStorage { | ||
return &diskStorage{dir: dir} | ||
} | ||
|
||
func (s *diskStorage) generateStorePath(key string) string { | ||
save := hasher.ToMD5(key) | ||
p1 := save[:2] | ||
p2 := save[2:4] | ||
p3 := save[4:6] | ||
return filepath.Join(s.dir, p1, p2, p3, save) | ||
} | ||
|
||
func (s *diskStorage) GetData(ctx context.Context, key string) ([]byte, error) { | ||
return os.ReadFile(s.generateStorePath(key)) | ||
} | ||
|
||
func (s *diskStorage) PutData(ctx context.Context, key string, value []byte) error { | ||
p := s.generateStorePath(key) | ||
dir := filepath.Dir(p) | ||
if err := os.MkdirAll(dir, 0755); err != nil { | ||
return fmt.Errorf("create dir failed, err:%w", err) | ||
} | ||
if err := os.WriteFile(p, value, 0644); err != nil { | ||
return fmt.Errorf("write data failed, err:%w", err) | ||
} | ||
return nil | ||
} | ||
|
||
func (s *diskStorage) IsDataExist(ctx context.Context, key string) (bool, error) { | ||
p := s.generateStorePath(key) | ||
_, err := os.Stat(p) | ||
if err == nil { | ||
return true, nil | ||
} | ||
if os.IsNotExist(err) { | ||
return false, nil | ||
} | ||
return false, err | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package store | ||
|
||
import ( | ||
"context" | ||
"os" | ||
"path/filepath" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
func TestDiskStorage(t *testing.T) { | ||
dir := filepath.Join(os.TempDir(), "storage") | ||
st := NewDiskStorage(dir) | ||
ctx := context.Background() | ||
key := "aaa" | ||
value := []byte("hello world") | ||
err := st.PutData(ctx, key, value) | ||
assert.NoError(t, err) | ||
exist, err := st.IsDataExist(ctx, key) | ||
assert.NoError(t, err) | ||
assert.True(t, exist) | ||
data, err := st.GetData(ctx, key) | ||
assert.NoError(t, err) | ||
assert.Equal(t, value, data) | ||
|
||
//check not exist | ||
exist, err = st.IsDataExist(ctx, "hello") | ||
assert.NoError(t, err) | ||
assert.False(t, exist) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
package store | ||
|
||
import ( | ||
"context" | ||
|
||
"github.com/google/uuid" | ||
) | ||
|
||
type DataRewriteFunc func(ctx context.Context, data []byte) ([]byte, error) | ||
|
||
type IStorage interface { | ||
GetData(ctx context.Context, key string) ([]byte, error) | ||
PutData(ctx context.Context, key string, value []byte) error | ||
IsDataExist(ctx context.Context, key string) (bool, error) | ||
} | ||
|
||
var defaultInst IStorage | ||
|
||
func SetStorage(impl IStorage) { | ||
defaultInst = impl | ||
} | ||
|
||
func getDefaultInst() IStorage { | ||
return defaultInst | ||
} | ||
|
||
func PutData(ctx context.Context, key string, value []byte) error { | ||
return getDefaultInst().PutData(ctx, key, value) | ||
} | ||
|
||
func AnonymousPutData(ctx context.Context, value []byte) (string, error) { | ||
key := uuid.NewString() | ||
if err := PutData(ctx, key, value); err != nil { | ||
return "", err | ||
} | ||
return key, nil | ||
} | ||
|
||
func GetData(ctx context.Context, key string) ([]byte, error) { | ||
return getDefaultInst().GetData(ctx, key) | ||
} | ||
|
||
func IsDataExist(ctx context.Context, key string) (bool, error) { | ||
return getDefaultInst().IsDataExist(ctx, key) | ||
} | ||
|
||
func AnonymousDataRewrite(ctx context.Context, key string, fn DataRewriteFunc) (string, error) { | ||
raw, err := GetData(ctx, key) | ||
if err != nil { | ||
return key, err | ||
} | ||
newData, err := fn(ctx, raw) | ||
if err != nil { | ||
return key, err | ||
} | ||
newKey, err := AnonymousPutData(ctx, newData) | ||
if err != nil { | ||
return key, err | ||
} | ||
return newKey, nil | ||
} |
Oops, something went wrong.