✏ return nil for notfound

This commit is contained in:
Fenny
2020-11-23 09:30:50 +01:00
parent fd56bd28da
commit ab94351a60
35 changed files with 109 additions and 134 deletions

View File

@@ -14,8 +14,6 @@ A fast key-value DB using [dgraph-io/badger](https://github.com/dgraph-io/badger
```go ```go
func New(config ...Config) Storage func New(config ...Config) Storage
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
func (s *Storage) Get(key string) ([]byte, error) func (s *Storage) Get(key string) ([]byte, error)
func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Set(key string, val []byte, exp time.Duration) error

View File

@@ -16,9 +16,7 @@ type Storage struct {
} }
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
var ErrKeyNotExist = ErrNotFound
// New creates a new memory storage // New creates a new memory storage
func New(config ...Config) *Storage { func New(config ...Config) *Storage {
@@ -56,7 +54,7 @@ func New(config ...Config) *Storage {
// Get value by key // Get value by key
func (s *Storage) Get(key string) ([]byte, error) { func (s *Storage) Get(key string) ([]byte, error) {
if len(key) <= 0 { if len(key) <= 0 {
return nil, ErrNotFound return nil, nil
} }
var data []byte var data []byte
err := s.db.View(func(txn *badger.Txn) error { err := s.db.View(func(txn *badger.Txn) error {

View File

@@ -65,14 +65,14 @@ func Test_Badger_Get_Expired(t *testing.T) {
) )
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
func Test_Badger_Get_NotExist(t *testing.T) { func Test_Badger_Get_NotExist(t *testing.T) {
result, err := testStore.Get("notexist") result, err := testStore.Get("notexist")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -89,7 +89,7 @@ func Test_Badger_Delete(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -108,11 +108,11 @@ func Test_Badger_Reset(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
result, err = testStore.Get("john2") result, err = testStore.Get("john2")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }

View File

@@ -14,8 +14,6 @@
```go ```go
func New(config Config) Storage func New(config Config) Storage
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
func (s *Storage) Get(key string) ([]byte, error) func (s *Storage) Get(key string) ([]byte, error)
func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Set(key string, val []byte, exp time.Duration) error

View File

@@ -18,11 +18,6 @@ type Storage struct {
table string table string
} }
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
var ErrKeyNotExist = ErrNotFound
// New creates a new storage // New creates a new storage
func New(config Config) *Storage { func New(config Config) *Storage {
// Set default config // Set default config
@@ -114,11 +109,11 @@ func (s *Storage) Get(key string) ([]byte, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} else if getItemOutput.Item == nil { } else if getItemOutput.Item == nil {
return nil, ErrNotFound return nil, nil
} }
attributeVal := getItemOutput.Item[valAttrName] attributeVal := getItemOutput.Item[valAttrName]
if attributeVal == nil { if attributeVal == nil {
return nil, ErrNotFound return nil, nil
} }
return attributeVal.B, nil return attributeVal.B, nil
} }

View File

@@ -2,4 +2,4 @@ module github.com/gofiber/storage/dynamodb
go 1.14 go 1.14
require github.com/aws/aws-sdk-go v1.35.26 require github.com/aws/aws-sdk-go v1.35.33

View File

@@ -1,5 +1,7 @@
github.com/aws/aws-sdk-go v1.35.26 h1:MawRvDpAp/Ai859dPC1xo1fdU/BIkijoHj0DwXLXXkI= github.com/aws/aws-sdk-go v1.35.26 h1:MawRvDpAp/Ai859dPC1xo1fdU/BIkijoHj0DwXLXXkI=
github.com/aws/aws-sdk-go v1.35.26/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/aws/aws-sdk-go v1.35.26/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
github.com/aws/aws-sdk-go v1.35.33 h1:8qPRZqCRok5i7VNN51k/Ky7CuyoXMdSs4mUfKyCqvPw=
github.com/aws/aws-sdk-go v1.35.33/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
@@ -12,11 +14,18 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

View File

@@ -13,8 +13,6 @@ A Memcache storage driver using [`bradfitz/gomemcache`](https://github.com/bradf
```go ```go
func New(config ...Config) Storage func New(config ...Config) Storage
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
func (s *Storage) Get(key string) ([]byte, error) func (s *Storage) Get(key string) ([]byte, error)
func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Set(key string, val []byte, exp time.Duration) error

View File

@@ -1,7 +1,6 @@
package memcache package memcache
import ( import (
"errors"
"strings" "strings"
"sync" "sync"
"time" "time"
@@ -16,11 +15,6 @@ type Storage struct {
items *sync.Pool items *sync.Pool
} }
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
var ErrKeyNotExist = ErrNotFound
// New creates a new storage // New creates a new storage
func New(config ...Config) *Storage { func New(config ...Config) *Storage {
// Set default config // Set default config
@@ -63,11 +57,11 @@ func New(config ...Config) *Storage {
// Get value by key // Get value by key
func (s *Storage) Get(key string) ([]byte, error) { func (s *Storage) Get(key string) ([]byte, error) {
if len(key) <= 0 { if len(key) <= 0 {
return nil, ErrNotFound return nil, nil
} }
item, err := s.db.Get(key) item, err := s.db.Get(key)
if err == mc.ErrCacheMiss { if err == mc.ErrCacheMiss {
return nil, ErrNotFound return nil, nil
} else if err != nil { } else if err != nil {
return nil, err return nil, err
} }

View File

@@ -65,14 +65,14 @@ func Test_Memcache_Get_Expired(t *testing.T) {
) )
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
func Test_Memcache_Get_NotExist(t *testing.T) { func Test_Memcache_Get_NotExist(t *testing.T) {
result, err := testStore.Get("notexist") result, err := testStore.Get("notexist")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -89,7 +89,7 @@ func Test_Memcache_Delete(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -108,11 +108,11 @@ func Test_Memcache_Reset(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
result, err = testStore.Get("john2") result, err = testStore.Get("john2")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }

View File

@@ -14,8 +14,6 @@ An in-memory storage driver.
```go ```go
func New(config ...Config) Storage func New(config ...Config) Storage
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
func (s *Storage) Get(key string) ([]byte, error) func (s *Storage) Get(key string) ([]byte, error)
func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Set(key string, val []byte, exp time.Duration) error

View File

@@ -1,7 +1,6 @@
package memory package memory
import ( import (
"errors"
"sync" "sync"
"time" "time"
) )
@@ -14,11 +13,6 @@ type Storage struct {
done chan struct{} done chan struct{}
} }
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
var ErrKeyNotExist = ErrNotFound
type entry struct { type entry struct {
data []byte data []byte
expiry int64 expiry int64
@@ -45,13 +39,13 @@ func New(config ...Config) *Storage {
// Get value by key // Get value by key
func (s *Storage) Get(key string) ([]byte, error) { func (s *Storage) Get(key string) ([]byte, error) {
if len(key) <= 0 { if len(key) <= 0 {
return nil, ErrNotFound return nil, nil
} }
s.mux.RLock() s.mux.RLock()
v, ok := s.db[key] v, ok := s.db[key]
s.mux.RUnlock() s.mux.RUnlock()
if !ok || v.expiry != 0 && v.expiry <= time.Now().Unix() { if !ok || v.expiry != 0 && v.expiry <= time.Now().Unix() {
return nil, ErrNotFound return nil, nil
} }
return v.data, nil return v.data, nil

View File

@@ -65,14 +65,14 @@ func Test_Memory_Get_Expired(t *testing.T) {
) )
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
func Test_Memory_Get_NotExist(t *testing.T) { func Test_Memory_Get_NotExist(t *testing.T) {
result, err := testStore.Get("notexist") result, err := testStore.Get("notexist")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -89,7 +89,7 @@ func Test_Memory_Delete(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -108,11 +108,11 @@ func Test_Memory_Reset(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
result, err = testStore.Get("john2") result, err = testStore.Get("john2")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }

View File

@@ -13,8 +13,6 @@ A MongoDB storage driver using [mongodb/mongo-go-driver](https://github.com/mong
```go ```go
func New(config ...Config) Storage func New(config ...Config) Storage
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
func (s *Storage) Get(key string) ([]byte, error) func (s *Storage) Get(key string) ([]byte, error)
func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Set(key string, val []byte, exp time.Duration) error

View File

@@ -3,6 +3,12 @@ module github.com/gofiber/storage/mongodb
go 1.14 go 1.14
require ( require (
github.com/aws/aws-sdk-go v1.35.33 // indirect
github.com/gofiber/utils v0.1.2 github.com/gofiber/utils v0.1.2
github.com/golang/snappy v0.0.2 // indirect
github.com/klauspost/compress v1.11.3 // indirect
go.mongodb.org/mongo-driver v1.4.3 go.mongodb.org/mongo-driver v1.4.3
golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9 // indirect
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 // indirect
golang.org/x/text v0.3.4 // indirect
) )

View File

@@ -1,6 +1,8 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/aws/aws-sdk-go v1.34.28 h1:sscPpn/Ns3i0F4HPEWAVcwdIRaZZCuL7llJ2/60yPIk= github.com/aws/aws-sdk-go v1.34.28 h1:sscPpn/Ns3i0F4HPEWAVcwdIRaZZCuL7llJ2/60yPIk=
github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
github.com/aws/aws-sdk-go v1.35.33 h1:8qPRZqCRok5i7VNN51k/Ky7CuyoXMdSs4mUfKyCqvPw=
github.com/aws/aws-sdk-go v1.35.33/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -35,6 +37,8 @@ github.com/gofiber/utils v0.1.2 h1:1SH2YEz4RlNS0tJlMJ0bGwO0JkqPqvq6TbHK9tXZKtk=
github.com/gofiber/utils v0.1.2/go.mod h1:pacRFtghAE3UoknMOUiXh2Io/nLWSUHtQCi/3QASsOc= github.com/gofiber/utils v0.1.2/go.mod h1:pacRFtghAE3UoknMOUiXh2Io/nLWSUHtQCi/3QASsOc=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw=
github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
@@ -47,6 +51,8 @@ github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaR
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M= github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M=
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.11.3 h1:dB4Bn0tN3wdCzQxnS8r06kV74qN/TAfaIS0bVE8h3jc=
github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
@@ -91,15 +97,21 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc=
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9 h1:phUcVbl53swtrUN8kQEXFhUxPlIlWyBfKmidCu7P95o=
golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -107,9 +119,14 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=

View File

@@ -2,7 +2,6 @@ package mongodb
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"net/url" "net/url"
"sync" "sync"
@@ -21,11 +20,6 @@ type Storage struct {
items *sync.Pool items *sync.Pool
} }
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
var ErrKeyNotExist = ErrNotFound
type item struct { type item struct {
ObjectID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"` ObjectID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
Key string `json:"key" bson:"key"` Key string `json:"key" bson:"key"`
@@ -114,14 +108,14 @@ func New(config ...Config) *Storage {
// Get value by key // Get value by key
func (s *Storage) Get(key string) ([]byte, error) { func (s *Storage) Get(key string) ([]byte, error) {
if len(key) <= 0 { if len(key) <= 0 {
return nil, ErrNotFound return nil, nil
} }
res := s.col.FindOne(context.Background(), bson.M{"key": key}) res := s.col.FindOne(context.Background(), bson.M{"key": key})
item := s.acquireItem() item := s.acquireItem()
if err := res.Err(); err != nil { if err := res.Err(); err != nil {
if err == mongo.ErrNoDocuments { if err == mongo.ErrNoDocuments {
return nil, ErrNotFound return nil, nil
} }
return nil, err return nil, err
} }
@@ -130,7 +124,7 @@ func (s *Storage) Get(key string) ([]byte, error) {
} }
if !item.Expiration.IsZero() && item.Expiration.Unix() <= time.Now().Unix() { if !item.Expiration.IsZero() && item.Expiration.Unix() <= time.Now().Unix() {
return nil, ErrNotFound return nil, nil
} }
// // not safe? // // not safe?
// res := item.Val // res := item.Val

View File

@@ -67,14 +67,14 @@ func Test_MongoDB_Get_Expired(t *testing.T) {
) )
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
func Test_MongoDB_Get_NotExist(t *testing.T) { func Test_MongoDB_Get_NotExist(t *testing.T) {
result, err := testStore.Get("notexist") result, err := testStore.Get("notexist")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -91,7 +91,7 @@ func Test_MongoDB_Delete(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -110,11 +110,11 @@ func Test_MongoDB_Reset(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
result, err = testStore.Get("john2") result, err = testStore.Get("john2")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }

View File

@@ -13,8 +13,6 @@ A MySQL storage driver using `database/sql` and [go-sql-driver/mysql](https://gi
```go ```go
func New(config ...Config) Storage func New(config ...Config) Storage
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
func (s *Storage) Get(key string) ([]byte, error) func (s *Storage) Get(key string) ([]byte, error)
func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Set(key string, val []byte, exp time.Duration) error

View File

@@ -2,7 +2,6 @@ package mysql
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"time" "time"
@@ -23,11 +22,6 @@ type Storage struct {
sqlGC string sqlGC string
} }
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
var ErrKeyNotExist = ErrNotFound
var ( var (
dropQuery = "DROP TABLE IF EXISTS %s;" dropQuery = "DROP TABLE IF EXISTS %s;"
initQuery = []string{ initQuery = []string{
@@ -102,7 +96,7 @@ var noRows = "sql: no rows in result set"
// Get value by key // Get value by key
func (s *Storage) Get(key string) ([]byte, error) { func (s *Storage) Get(key string) ([]byte, error) {
if len(key) <= 0 { if len(key) <= 0 {
return nil, ErrNotFound return nil, nil
} }
row := s.db.QueryRow(s.sqlSelect, key) row := s.db.QueryRow(s.sqlSelect, key)
@@ -115,14 +109,14 @@ func (s *Storage) Get(key string) ([]byte, error) {
if err := row.Scan(&data, &exp); err != nil { if err := row.Scan(&data, &exp); err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return nil, ErrNotFound return nil, nil
} }
return nil, err return nil, err
} }
// If the expiration time has already passed, then return nil // If the expiration time has already passed, then return nil
if exp != 0 && exp <= time.Now().Unix() { if exp != 0 && exp <= time.Now().Unix() {
return nil, ErrNotFound return nil, nil
} }
return data, nil return data, nil

View File

@@ -71,14 +71,14 @@ func Test_MYSQL_Get_Expired(t *testing.T) {
) )
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
func Test_MYSQL_Get_NotExist(t *testing.T) { func Test_MYSQL_Get_NotExist(t *testing.T) {
result, err := testStore.Get("notexist") result, err := testStore.Get("notexist")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -95,7 +95,7 @@ func Test_MYSQL_Delete(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -114,11 +114,11 @@ func Test_MYSQL_Reset(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
result, err = testStore.Get("john2") result, err = testStore.Get("john2")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }

View File

@@ -13,8 +13,6 @@ A Postgres storage driver using [lib/pq](https://github.com/lib/pq).
```go ```go
func New(config ...Config) Storage func New(config ...Config) Storage
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
func (s *Storage) Get(key string) ([]byte, error) func (s *Storage) Get(key string) ([]byte, error)
func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Set(key string, val []byte, exp time.Duration) error

View File

@@ -24,10 +24,6 @@ type Storage struct {
sqlGC string sqlGC string
} }
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
var ErrKeyNotExist = ErrNotFound
var ( var (
dropQuery = `DROP TABLE IF EXISTS %s;` dropQuery = `DROP TABLE IF EXISTS %s;`
initQuery = []string{ initQuery = []string{
@@ -90,7 +86,7 @@ func New(config ...Config) *Storage {
for _, query := range initQuery { for _, query := range initQuery {
if _, err := db.Exec(fmt.Sprintf(query, cfg.Table)); err != nil { if _, err := db.Exec(fmt.Sprintf(query, cfg.Table)); err != nil {
_ = db.Close() _ = db.Close()
fmt.Println(fmt.Sprintf(query, cfg.Table))
panic(err) panic(err)
} }
} }
@@ -118,7 +114,7 @@ var noRows = errors.New("sql: no rows in result set")
// Get value by key // Get value by key
func (s *Storage) Get(key string) ([]byte, error) { func (s *Storage) Get(key string) ([]byte, error) {
if len(key) <= 0 { if len(key) <= 0 {
return nil, ErrNotFound return nil, nil
} }
row := s.db.QueryRow(s.sqlSelect, key) row := s.db.QueryRow(s.sqlSelect, key)
// Add db response to data // Add db response to data
@@ -128,14 +124,14 @@ func (s *Storage) Get(key string) ([]byte, error) {
) )
if err := row.Scan(&data, &exp); err != nil { if err := row.Scan(&data, &exp); err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return nil, ErrNotFound return nil, nil
} }
return nil, err return nil, err
} }
// If the expiration time has already passed, then return nil // If the expiration time has already passed, then return nil
if exp != 0 && exp <= time.Now().Unix() { if exp != 0 && exp <= time.Now().Unix() {
return nil, ErrNotFound return nil, nil
} }
return data, nil return data, nil

View File

@@ -71,14 +71,14 @@ func Test_Postgres_Get_Expired(t *testing.T) {
) )
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
func Test_Postgres_Get_NotExist(t *testing.T) { func Test_Postgres_Get_NotExist(t *testing.T) {
result, err := testStore.Get("notexist") result, err := testStore.Get("notexist")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -95,7 +95,7 @@ func Test_Postgres_Delete(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -114,11 +114,11 @@ func Test_Postgres_Reset(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
result, err = testStore.Get("john2") result, err = testStore.Get("john2")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }

View File

@@ -13,8 +13,6 @@ A Redis storage driver using [go-redis/redis](github.com/go-redis/redis).
```go ```go
func New(config ...Config) Storage func New(config ...Config) Storage
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
func (s *Storage) Get(key string) ([]byte, error) func (s *Storage) Get(key string) ([]byte, error)
func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Set(key string, val []byte, exp time.Duration) error

View File

@@ -3,6 +3,6 @@ module github.com/gofiber/storage/redis
go 1.14 go 1.14
require ( require (
github.com/go-redis/redis/v8 v8.3.3 github.com/go-redis/redis/v8 v8.4.0
github.com/gofiber/utils v0.1.2 github.com/gofiber/utils v0.1.2
) )

View File

@@ -9,6 +9,8 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/go-redis/redis/v8 v8.3.3 h1:e0CL9fsFDK92pkIJH2XAeS/NwO2VuIOAoJvI6yktZFk= github.com/go-redis/redis/v8 v8.3.3 h1:e0CL9fsFDK92pkIJH2XAeS/NwO2VuIOAoJvI6yktZFk=
github.com/go-redis/redis/v8 v8.3.3/go.mod h1:jszGxBCez8QA1HWSmQxJO9Y82kNibbUmeYhKWrBejTU= github.com/go-redis/redis/v8 v8.3.3/go.mod h1:jszGxBCez8QA1HWSmQxJO9Y82kNibbUmeYhKWrBejTU=
github.com/go-redis/redis/v8 v8.4.0 h1:J5NCReIgh3QgUJu398hUncxDExN4gMOHI11NVbVicGQ=
github.com/go-redis/redis/v8 v8.4.0/go.mod h1:A1tbYoHSa1fXwN+//ljcCYYJeLmVrwL9hbQN45Jdy0M=
github.com/gofiber/utils v0.1.2 h1:1SH2YEz4RlNS0tJlMJ0bGwO0JkqPqvq6TbHK9tXZKtk= github.com/gofiber/utils v0.1.2 h1:1SH2YEz4RlNS0tJlMJ0bGwO0JkqPqvq6TbHK9tXZKtk=
github.com/gofiber/utils v0.1.2/go.mod h1:pacRFtghAE3UoknMOUiXh2Io/nLWSUHtQCi/3QASsOc= github.com/gofiber/utils v0.1.2/go.mod h1:pacRFtghAE3UoknMOUiXh2Io/nLWSUHtQCi/3QASsOc=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -24,6 +26,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
@@ -42,6 +45,8 @@ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
go.opentelemetry.io/otel v0.13.0 h1:2isEnyzjjJZq6r2EKMsFj4TxiQiexsM04AVhwbR/oBA= go.opentelemetry.io/otel v0.13.0 h1:2isEnyzjjJZq6r2EKMsFj4TxiQiexsM04AVhwbR/oBA=
go.opentelemetry.io/otel v0.13.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY= go.opentelemetry.io/otel v0.13.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY=
go.opentelemetry.io/otel v0.14.0 h1:YFBEfjCk9MTjaytCNSUkp9Q8lF7QJezA06T71FbQxLQ=
go.opentelemetry.io/otel v0.14.0/go.mod h1:vH5xEuwy7Rts0GNtsCW3HYQoZDY+OmBJ6t1bFGGlxgw=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=

View File

@@ -2,7 +2,6 @@ package redis
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"time" "time"
@@ -14,10 +13,6 @@ type Storage struct {
db *redis.Client db *redis.Client
} }
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
var ErrKeyNotExist = ErrNotFound
// New creates a new redis storage // New creates a new redis storage
func New(config ...Config) *Storage { func New(config ...Config) *Storage {
// Set default config // Set default config
@@ -52,11 +47,11 @@ func New(config ...Config) *Storage {
// Get value by key // Get value by key
func (s *Storage) Get(key string) ([]byte, error) { func (s *Storage) Get(key string) ([]byte, error) {
if len(key) <= 0 { if len(key) <= 0 {
return nil, ErrNotFound return nil, nil
} }
val, err := s.db.Get(context.Background(), key).Bytes() val, err := s.db.Get(context.Background(), key).Bytes()
if err == redis.Nil { if err == redis.Nil {
return nil, ErrNotFound return nil, nil
} }
return val, err return val, err
} }

View File

@@ -67,13 +67,13 @@ func Test_Redis_Get_Expired(t *testing.T) {
) )
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
func Test_Redis_Get_NotExist(t *testing.T) { func Test_Redis_Get_NotExist(t *testing.T) {
result, err := testStore.Get("notexist") result, err := testStore.Get("notexist")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -90,7 +90,7 @@ func Test_Redis_Delete(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -109,11 +109,11 @@ func Test_Redis_Reset(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
result, err = testStore.Get("john2") result, err = testStore.Get("john2")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }

View File

@@ -13,8 +13,6 @@ A SQLite3 storage driver using [mattn/go-sqlite3](https://github.com/mattn/go-sq
```go ```go
func New(config ...Config) Storage func New(config ...Config) Storage
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
func (s *Storage) Get(key string) ([]byte, error) func (s *Storage) Get(key string) ([]byte, error)
func (s *Storage) Set(key string, val []byte, exp time.Duration) error func (s *Storage) Set(key string, val []byte, exp time.Duration) error

View File

@@ -4,5 +4,5 @@ go 1.14
require ( require (
github.com/gofiber/utils v0.1.2 github.com/gofiber/utils v0.1.2
github.com/mattn/go-sqlite3 v1.14.4 github.com/mattn/go-sqlite3 v1.14.5
) )

View File

@@ -2,3 +2,5 @@ github.com/gofiber/utils v0.1.2 h1:1SH2YEz4RlNS0tJlMJ0bGwO0JkqPqvq6TbHK9tXZKtk=
github.com/gofiber/utils v0.1.2/go.mod h1:pacRFtghAE3UoknMOUiXh2Io/nLWSUHtQCi/3QASsOc= github.com/gofiber/utils v0.1.2/go.mod h1:pacRFtghAE3UoknMOUiXh2Io/nLWSUHtQCi/3QASsOc=
github.com/mattn/go-sqlite3 v1.14.4 h1:4rQjbDxdu9fSgI/r3KN72G3c2goxknAqHHgPWWs8UlI= github.com/mattn/go-sqlite3 v1.14.4 h1:4rQjbDxdu9fSgI/r3KN72G3c2goxknAqHHgPWWs8UlI=
github.com/mattn/go-sqlite3 v1.14.4/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-sqlite3 v1.14.4/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI=
github.com/mattn/go-sqlite3 v1.14.5 h1:1IdxlwTNazvbKJQSxoJ5/9ECbEeaTTyeU7sEAZ5KKTQ=
github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI=

View File

@@ -2,7 +2,6 @@ package sqlite3
import ( import (
"database/sql" "database/sql"
"errors"
"fmt" "fmt"
"time" "time"
@@ -24,10 +23,6 @@ type Storage struct {
sqlGC string sqlGC string
} }
// ErrNotFound means that a get call did not find the requested key.
var ErrNotFound = errors.New("key not found")
var ErrKeyNotExist = ErrNotFound
var ( var (
dropQuery = `DROP TABLE IF EXISTS %s;` dropQuery = `DROP TABLE IF EXISTS %s;`
initQuery = []string{ initQuery = []string{
@@ -73,7 +68,6 @@ func New(config ...Config) *Storage {
for _, query := range initQuery { for _, query := range initQuery {
if _, err := db.Exec(fmt.Sprintf(query, cfg.Table)); err != nil { if _, err := db.Exec(fmt.Sprintf(query, cfg.Table)); err != nil {
_ = db.Close() _ = db.Close()
fmt.Println(fmt.Sprintf(query, cfg.Table))
panic(err) panic(err)
} }
} }
@@ -99,7 +93,7 @@ func New(config ...Config) *Storage {
// Get value by key // Get value by key
func (s *Storage) Get(key string) ([]byte, error) { func (s *Storage) Get(key string) ([]byte, error) {
if len(key) <= 0 { if len(key) <= 0 {
return nil, ErrNotFound return nil, nil
} }
row := s.db.QueryRow(s.sqlSelect, key) row := s.db.QueryRow(s.sqlSelect, key)
// Add db response to data // Add db response to data
@@ -109,13 +103,13 @@ func (s *Storage) Get(key string) ([]byte, error) {
) )
if err := row.Scan(&data, &exp); err != nil { if err := row.Scan(&data, &exp); err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return nil, ErrNotFound return nil, nil
} }
return nil, err return nil, err
} }
// If the expiration time has already passed, then return nil // If the expiration time has already passed, then return nil
if exp != 0 && exp <= time.Now().Unix() { if exp != 0 && exp <= time.Now().Unix() {
return nil, ErrNotFound return nil, nil
} }
return data, nil return data, nil

View File

@@ -68,14 +68,14 @@ func Test_SQLite3_Get_Expired(t *testing.T) {
) )
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
func Test_SQLite3_Get_NotExist(t *testing.T) { func Test_SQLite3_Get_NotExist(t *testing.T) {
result, err := testStore.Get("notexist") result, err := testStore.Get("notexist")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -92,7 +92,7 @@ func Test_SQLite3_Delete(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get(key) result, err := testStore.Get(key)
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }
@@ -111,11 +111,11 @@ func Test_SQLite3_Reset(t *testing.T) {
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
result, err = testStore.Get("john2") result, err = testStore.Get("john2")
utils.AssertEqual(t, ErrNotFound, err) utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, true, len(result) == 0) utils.AssertEqual(t, true, len(result) == 0)
} }

View File

@@ -6,13 +6,13 @@ import "time"
// providers. Visit https://github.com/gofiber/storage for more info. // providers. Visit https://github.com/gofiber/storage for more info.
type Storage interface { type Storage interface {
// Get gets the value for the given key. // Get gets the value for the given key.
// It returns ErrNotFound if the storage does not contain the key. // `nil, nil` is returned when the key does not exist
Get(key string) ([]byte, error) Get(key string) ([]byte, error)
// Set stores the given value for the given key along with a // Set stores the given value for the given key along
// time-to-live expiration value, 0 means live for ever // with an expiration value, 0 means no expiration.
// Empty key or value will be ignored without an error. // Empty key or value will be ignored without an error.
Set(key string, val []byte, ttl time.Duration) error Set(key string, val []byte, exp time.Duration) error
// Delete deletes the value for the given key. // Delete deletes the value for the given key.
// It returns no error if the storage does not contain the key, // It returns no error if the storage does not contain the key,