🧹 introduce reset and close

This commit is contained in:
Fenny
2020-11-06 01:41:46 +01:00
parent 1634e44e61
commit f9a30234b9
28 changed files with 125 additions and 87 deletions

View File

@@ -51,10 +51,10 @@ type Config struct {
// Optional. Default is "127.0.0.1:11211" // Optional. Default is "127.0.0.1:11211"
Servers string Servers string
// Clear any existing keys in existing Table // Reset clears any existing keys in existing Table
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
} }
``` ```

View File

@@ -10,10 +10,10 @@ type Config struct {
// Optional. Default is "127.0.0.1:11211" // Optional. Default is "127.0.0.1:11211"
Servers string Servers string
// Clear any existing keys in existing Table // Reset clears any existing keys in existing Table
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
// The socket read/write timeout. // The socket read/write timeout.
// //

View File

@@ -39,7 +39,7 @@ func New(config ...Config) *Storage {
panic(err) panic(err)
} }
if cfg.Clear { if cfg.Reset {
if err := db.DeleteAll(); err != nil { if err := db.DeleteAll(); err != nil {
panic(err) panic(err)
} }
@@ -93,11 +93,16 @@ func (s *Storage) Delete(key string) error {
return s.db.Delete(key) return s.db.Delete(key)
} }
// Clear all keys // Reset all keys
func (s *Storage) Clear() error { func (s *Storage) Reset() error {
return s.db.DeleteAll() return s.db.DeleteAll()
} }
// Close the database
func (s *Storage) Close() error {
return nil
}
// Acquire item from pool // Acquire item from pool
func (s *Storage) acquireItem() *mc.Item { func (s *Storage) acquireItem() *mc.Item {
return s.items.Get().(*mc.Item) return s.items.Get().(*mc.Item)

View File

@@ -104,7 +104,7 @@ func Test_Memcache_Clear(t *testing.T) {
err = testStore.Set("john2", val, 0) err = testStore.Set("john2", val, 0)
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
err = testStore.Clear() err = testStore.Reset()
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")

View File

@@ -19,7 +19,7 @@ var ErrNotExist = errors.New("key does not exist")
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
func (s *Storage) Delete(key string) error func (s *Storage) Delete(key string) error
func (s *Storage) Clear() error func (s *Storage) Reset() error
``` ```
### Installation ### Installation

View File

@@ -75,14 +75,19 @@ func (s *Storage) Delete(key string) error {
return nil return nil
} }
// Clear all keys // Reset all keys
func (s *Storage) Clear() error { func (s *Storage) Reset() error {
s.mux.Lock() s.mux.Lock()
s.db = make(map[string]entry) s.db = make(map[string]entry)
s.mux.Unlock() s.mux.Unlock()
return nil return nil
} }
// Close the database
func (s *Storage) Close() error {
return nil
}
func (s *Storage) gc() { func (s *Storage) gc() {
for t := range time.NewTicker(s.gcInterval).C { for t := range time.NewTicker(s.gcInterval).C {
now := t.Unix() now := t.Unix()

View File

@@ -104,7 +104,7 @@ func Test_Memory_Clear(t *testing.T) {
err = testStore.Set("john2", val, 0) err = testStore.Set("john2", val, 0)
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
err = testStore.Clear() err = testStore.Reset()
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")

View File

@@ -18,7 +18,7 @@ var ErrNotExist = errors.New("key does not exist")
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
func (s *Storage) Delete(key string) error func (s *Storage) Delete(key string) error
func (s *Storage) Clear() error func (s *Storage) Reset() error
``` ```
### Installation ### Installation
MongoDB is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet: MongoDB is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet:
@@ -47,7 +47,7 @@ store := mongodb.New(mongodb.Config{
Port: 27017, Port: 27017,
Database: "fiber", Database: "fiber",
Collection: "fiber_storage", Collection: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
}) })
``` ```
@@ -85,10 +85,10 @@ type Config struct {
// Optional. Default is "fiber_storage" // Optional. Default is "fiber_storage"
Collection string Collection string
// Clear any existing keys in existing Table // Reset clears any existing keys in existing Table
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
// Time before deleting expired keys // Time before deleting expired keys
// //
@@ -104,7 +104,7 @@ var ConfigDefault = Config{
Port: 27017, Port: 27017,
Database: "fiber", Database: "fiber",
Collection: "fiber_storage", Collection: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
} }
``` ```

View File

@@ -36,10 +36,10 @@ type Config struct {
// Optional. Default is "fiber_storage" // Optional. Default is "fiber_storage"
Collection string Collection string
// Clear any existing keys in existing Table // Reset clears any existing keys in existing Table
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
// Time before deleting expired keys // Time before deleting expired keys
// //
@@ -53,7 +53,7 @@ var ConfigDefault = Config{
Port: 27017, Port: 27017,
Database: "fiber", Database: "fiber",
Collection: "fiber_storage", Collection: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
} }

View File

@@ -152,11 +152,16 @@ func (s *Storage) Delete(key string) error {
return err return err
} }
// Clear all keys by drop collection // Reset all keys by drop collection
func (s *Storage) Clear() error { func (s *Storage) Reset() error {
return s.col.Drop(context.Background()) return s.col.Drop(context.Background())
} }
// Close the database
func (s *Storage) Close() error {
return s.db.Client().Disconnect(context.Background())
}
// Acquire item from pool // Acquire item from pool
func (s *Storage) acquireItem() *item { func (s *Storage) acquireItem() *item {
return s.items.Get().(*item) return s.items.Get().(*item)

View File

@@ -8,7 +8,7 @@ import (
) )
var testStore = New(Config{ var testStore = New(Config{
Clear: true, Reset: true,
}) })
func Test_MongoDB_Set(t *testing.T) { func Test_MongoDB_Set(t *testing.T) {
@@ -106,7 +106,7 @@ func Test_MongoDB_Clear(t *testing.T) {
err = testStore.Set("john2", val, 0) err = testStore.Set("john2", val, 0)
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
err = testStore.Clear() err = testStore.Reset()
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")

View File

@@ -18,7 +18,7 @@ var ErrNotExist = errors.New("key does not exist")
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
func (s *Storage) Delete(key string) error func (s *Storage) Delete(key string) error
func (s *Storage) Clear() error func (s *Storage) Reset() error
``` ```
### Installation ### Installation
MySQL is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet: MySQL is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet:
@@ -47,7 +47,7 @@ store := mysql.New(mysql.Config{
Port: 3306, Port: 3306,
Database: "fiber", Database: "fiber",
Table: "fiber_storage", Table: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
}) })
``` ```
@@ -85,10 +85,10 @@ type Config struct {
// Optional. Default is "fiber_storage" // Optional. Default is "fiber_storage"
Table string Table string
// Clear any existing keys in existing Table // Reset clears any existing keys in existing Table
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
// Time before deleting expired keys // Time before deleting expired keys
// //
@@ -104,7 +104,7 @@ var ConfigDefault = Config{
Port: 3306, Port: 3306,
Database: "fiber", Database: "fiber",
Table: "fiber_storage", Table: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
} }
``` ```

View File

@@ -37,10 +37,10 @@ type Config struct {
// Optional. Default is "fiber_storage" // Optional. Default is "fiber_storage"
Table string Table string
// Clear any existing keys in existing Table // Reset clears any existing keys in existing Table
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
// Time before deleting expired keys // Time before deleting expired keys
// //
@@ -62,7 +62,7 @@ var ConfigDefault = Config{
Port: 3306, Port: 3306,
Database: "fiber", Database: "fiber",
Table: "fiber_storage", Table: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
maxOpenConns: 100, maxOpenConns: 100,
maxIdleConns: 100, maxIdleConns: 100,

View File

@@ -18,7 +18,7 @@ type Storage struct {
sqlSelect string sqlSelect string
sqlInsert string sqlInsert string
sqlDelete string sqlDelete string
sqlClear string sqlReset string
sqlGC string sqlGC string
} }
@@ -59,7 +59,7 @@ func New(config ...Config) *Storage {
} }
// Drop table if Clear set to true // Drop table if Clear set to true
if cfg.Clear { if cfg.Reset {
query := fmt.Sprintf(dropQuery, cfg.Table) query := fmt.Sprintf(dropQuery, cfg.Table)
if _, err = db.Exec(query); err != nil { if _, err = db.Exec(query); err != nil {
_ = db.Close() _ = db.Close()
@@ -83,7 +83,7 @@ func New(config ...Config) *Storage {
sqlSelect: fmt.Sprintf("SELECT v, e FROM %s WHERE k=?;", cfg.Table), sqlSelect: fmt.Sprintf("SELECT v, e FROM %s WHERE k=?;", cfg.Table),
sqlInsert: fmt.Sprintf("INSERT INTO %s (k, v, e) VALUES (?,?,?) ON DUPLICATE KEY UPDATE v = ?, e = ?", cfg.Table), sqlInsert: fmt.Sprintf("INSERT INTO %s (k, v, e) VALUES (?,?,?) ON DUPLICATE KEY UPDATE v = ?, e = ?", cfg.Table),
sqlDelete: fmt.Sprintf("DELETE FROM %s WHERE k=?", cfg.Table), sqlDelete: fmt.Sprintf("DELETE FROM %s WHERE k=?", cfg.Table),
sqlClear: fmt.Sprintf("DELETE FROM %s;", cfg.Table), sqlReset: fmt.Sprintf("DELETE FROM %s;", cfg.Table),
sqlGC: fmt.Sprintf("DELETE FROM %s WHERE e <= ?", cfg.Table), sqlGC: fmt.Sprintf("DELETE FROM %s WHERE e <= ?", cfg.Table),
} }
@@ -142,12 +142,17 @@ func (s *Storage) Delete(key string) error {
return err return err
} }
// Clear all keys // Reset all keys
func (s *Storage) Clear() error { func (s *Storage) Reset() error {
_, err := s.db.Exec(s.sqlClear) _, err := s.db.Exec(s.sqlReset)
return err return err
} }
// Close the database
func (s *Storage) Close() error {
return s.db.Close()
}
// Garbage collector to delete expired keys // Garbage collector to delete expired keys
func (s *Storage) gc() { func (s *Storage) gc() {
tick := time.NewTicker(s.gcInterval) tick := time.NewTicker(s.gcInterval)

View File

@@ -12,7 +12,7 @@ var testStore = New(Config{
Database: os.Getenv("MYSQL_DATABASE"), Database: os.Getenv("MYSQL_DATABASE"),
Username: os.Getenv("MYSQL_USERNAME"), Username: os.Getenv("MYSQL_USERNAME"),
Password: os.Getenv("MYSQL_PASSWORD"), Password: os.Getenv("MYSQL_PASSWORD"),
Clear: true, Reset: true,
}) })
func Test_MYSQL_Set(t *testing.T) { func Test_MYSQL_Set(t *testing.T) {
@@ -110,7 +110,7 @@ func Test_MYSQL_Clear(t *testing.T) {
err = testStore.Set("john2", val, 0) err = testStore.Set("john2", val, 0)
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
err = testStore.Clear() err = testStore.Reset()
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")

View File

@@ -18,7 +18,7 @@ var ErrNotExist = errors.New("key does not exist")
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
func (s *Storage) Delete(key string) error func (s *Storage) Delete(key string) error
func (s *Storage) Clear() error func (s *Storage) Reset() error
``` ```
### Installation ### Installation
Postgres is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet: Postgres is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet:
@@ -47,7 +47,7 @@ store := postgres.New(postgres.Config{
Port: 5432, Port: 5432,
Database: "fiber", Database: "fiber",
Table: "fiber_storage", Table: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
}) })
``` ```
@@ -86,10 +86,10 @@ type Config struct {
// Optional. Default is "fiber_storage" // Optional. Default is "fiber_storage"
Table string Table string
// Clear any existing keys in existing Table // Reset clears any existing keys in existing Table
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
// Time before deleting expired keys // Time before deleting expired keys
// //
@@ -105,7 +105,7 @@ var ConfigDefault = Config{
Port: 5432, Port: 5432,
Database: "fiber", Database: "fiber",
Table: "fiber_storage", Table: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
} }
``` ```

View File

@@ -36,10 +36,10 @@ type Config struct {
// Optional. Default is "fiber_storage" // Optional. Default is "fiber_storage"
Table string Table string
// Clear any existing keys in existing Table // Reset clears any existing keys in existing Table
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
// Time before deleting expired keys // Time before deleting expired keys
// //
@@ -89,7 +89,7 @@ var ConfigDefault = Config{
Port: 5432, Port: 5432,
Database: "fiber", Database: "fiber",
Table: "fiber_storage", Table: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
maxOpenConns: 100, maxOpenConns: 100,
maxIdleConns: 100, maxIdleConns: 100,

View File

@@ -19,7 +19,7 @@ type Storage struct {
sqlSelect string sqlSelect string
sqlInsert string sqlInsert string
sqlDelete string sqlDelete string
sqlClear string sqlReset string
sqlGC string sqlGC string
} }
@@ -77,7 +77,7 @@ func New(config ...Config) *Storage {
} }
// Drop table if set to true // Drop table if set to true
if cfg.Clear { if cfg.Reset {
if _, err = db.Exec(fmt.Sprintf(dropQuery, cfg.Table)); err != nil { if _, err = db.Exec(fmt.Sprintf(dropQuery, cfg.Table)); err != nil {
_ = db.Close() _ = db.Close()
panic(err) panic(err)
@@ -100,7 +100,7 @@ func New(config ...Config) *Storage {
sqlSelect: fmt.Sprintf(`SELECT v, e FROM %s WHERE k=$1;`, cfg.Table), sqlSelect: fmt.Sprintf(`SELECT v, e FROM %s WHERE k=$1;`, cfg.Table),
sqlInsert: fmt.Sprintf("INSERT INTO %s (k, v, e) VALUES ($1, $2, $3) ON CONFLICT (k) DO UPDATE SET v = $4, e = $5", cfg.Table), sqlInsert: fmt.Sprintf("INSERT INTO %s (k, v, e) VALUES ($1, $2, $3) ON CONFLICT (k) DO UPDATE SET v = $4, e = $5", cfg.Table),
sqlDelete: fmt.Sprintf("DELETE FROM %s WHERE k=$1", cfg.Table), sqlDelete: fmt.Sprintf("DELETE FROM %s WHERE k=$1", cfg.Table),
sqlClear: fmt.Sprintf("DELETE FROM %s;", cfg.Table), sqlReset: fmt.Sprintf("DELETE FROM %s;", cfg.Table),
sqlGC: fmt.Sprintf("DELETE FROM %s WHERE e <= $1", cfg.Table), sqlGC: fmt.Sprintf("DELETE FROM %s WHERE e <= $1", cfg.Table),
} }
@@ -156,12 +156,17 @@ func (s *Storage) Delete(key string) error {
return err return err
} }
// Clear all entries, including unexpired // Reset all entries, including unexpired
func (s *Storage) Clear() error { func (s *Storage) Reset() error {
_, err := s.db.Exec(s.sqlClear) _, err := s.db.Exec(s.sqlReset)
return err return err
} }
// Close the database
func (s *Storage) Close() error {
return s.db.Close()
}
// GC deletes all expired entries // GC deletes all expired entries
func (s *Storage) gc() { func (s *Storage) gc() {
tick := time.NewTicker(s.gcInterval) tick := time.NewTicker(s.gcInterval)

View File

@@ -12,7 +12,7 @@ var testStore = New(Config{
Database: os.Getenv("POSTGRES_DATABASE"), Database: os.Getenv("POSTGRES_DATABASE"),
Username: os.Getenv("POSTGRES_USERNAME"), Username: os.Getenv("POSTGRES_USERNAME"),
Password: os.Getenv("POSTGRES_PASSWORD"), Password: os.Getenv("POSTGRES_PASSWORD"),
Clear: true, Reset: true,
}) })
func Test_Postgres_Set(t *testing.T) { func Test_Postgres_Set(t *testing.T) {
@@ -110,7 +110,7 @@ func Test_Postgres_Clear(t *testing.T) {
err = testStore.Set("john2", val, 0) err = testStore.Set("john2", val, 0)
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
err = testStore.Clear() err = testStore.Reset()
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")

View File

@@ -18,7 +18,7 @@ var ErrNotExist = errors.New("key does not exist")
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
func (s *Storage) Delete(key string) error func (s *Storage) Delete(key string) error
func (s *Storage) Clear() error func (s *Storage) Reset() error
``` ```
### Installation ### Installation
Redis is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet: Redis is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet:
@@ -48,7 +48,7 @@ store := redis.New(redis.Config{
Username: "", Username: "",
Password: "", Password: "",
Database: 0, Database: 0,
Clear: false, Reset: false,
}) })
``` ```
@@ -80,10 +80,10 @@ type Config struct {
// Optional. Default is 0 // Optional. Default is 0
Database int Database int
// Clear any existing keys in existing Collection // Reset clears any existing keys in existing Collection
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
} }
``` ```
@@ -96,6 +96,6 @@ var ConfigDefault = Config{
Username: "", Username: "",
Password: "", Password: "",
Database: 0, Database: 0,
Clear: false, Reset: false,
} }
``` ```

View File

@@ -27,10 +27,10 @@ type Config struct {
// Optional. Default is 0 // Optional. Default is 0
Database int Database int
// Clear any existing keys in existing Collection // Reset clears any existing keys in existing Collection
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
//////////////////////////////////// ////////////////////////////////////
// Adaptor related config options // // Adaptor related config options //
@@ -46,7 +46,7 @@ var ConfigDefault = Config{
Username: "", Username: "",
Password: "", Password: "",
Database: 0, Database: 0,
Clear: false, Reset: false,
} }
// Helper function to set default values // Helper function to set default values

View File

@@ -36,7 +36,7 @@ func New(config ...Config) *Storage {
} }
// Empty collection if Clear is true // Empty collection if Clear is true
if cfg.Clear { if cfg.Reset {
if err := db.FlushDB(context.Background()).Err(); err != nil { if err := db.FlushDB(context.Background()).Err(); err != nil {
panic(err) panic(err)
} }
@@ -71,7 +71,12 @@ func (s *Storage) Delete(key string) error {
return s.db.Del(context.Background(), key).Err() return s.db.Del(context.Background(), key).Err()
} }
// Clear all keys // Reset all keys
func (s *Storage) Clear() error { func (s *Storage) Reset() error {
return s.db.FlushDB(context.Background()).Err() return s.db.FlushDB(context.Background()).Err()
} }
// Close the database
func (s *Storage) Close() error {
return s.db.Close()
}

View File

@@ -8,7 +8,7 @@ import (
) )
var testStore = New(Config{ var testStore = New(Config{
Clear: true, Reset: true,
}) })
func Test_Redis_Set(t *testing.T) { func Test_Redis_Set(t *testing.T) {
@@ -105,7 +105,7 @@ func Test_Redis_Clear(t *testing.T) {
err = testStore.Set("john2", val, 0) err = testStore.Set("john2", val, 0)
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
err = testStore.Clear() err = testStore.Reset()
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")

View File

@@ -18,7 +18,7 @@ var ErrNotExist = errors.New("key does not exist")
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
func (s *Storage) Delete(key string) error func (s *Storage) Delete(key string) error
func (s *Storage) Clear() error func (s *Storage) Reset() error
``` ```
### Installation ### Installation
SQLite3 is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet: SQLite3 is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet:
@@ -45,7 +45,7 @@ store := sqlite3.New()
store := sqlite3.New(sqlite3.Config{ store := sqlite3.New(sqlite3.Config{
Database: "./fiber.sqlite3", Database: "./fiber.sqlite3",
Table: "fiber_storage", Table: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
}) })
``` ```
@@ -63,10 +63,10 @@ type Config struct {
// Optional. Default is "fiber_storage" // Optional. Default is "fiber_storage"
Table string Table string
// Clear any existing keys in existing Table // Reset clears any existing keys in existing Table
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
// Time before deleting expired keys // Time before deleting expired keys
// //
@@ -80,7 +80,7 @@ type Config struct {
var ConfigDefault = Config{ var ConfigDefault = Config{
Database: "./fiber.sqlite3", Database: "./fiber.sqlite3",
Table: "fiber_storage", Table: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
} }
``` ```

View File

@@ -14,10 +14,10 @@ type Config struct {
// Optional. Default is "fiber_storage" // Optional. Default is "fiber_storage"
Table string Table string
// Clear any existing keys in existing Table // Reset clears any existing keys in existing Table
// //
// Optional. Default is false // Optional. Default is false
Clear bool Reset bool
// Time before deleting expired keys // Time before deleting expired keys
// //
@@ -38,7 +38,7 @@ var ConfigDefault = Config{
// General config options // General config options
Database: "./fiber.sqlite3", Database: "./fiber.sqlite3",
Table: "fiber_storage", Table: "fiber_storage",
Clear: false, Reset: false,
GCInterval: 10 * time.Second, GCInterval: 10 * time.Second,
// Adaptor related config options // Adaptor related config options

View File

@@ -19,7 +19,7 @@ type Storage struct {
sqlSelect string sqlSelect string
sqlInsert string sqlInsert string
sqlDelete string sqlDelete string
sqlClear string sqlReset string
sqlGC string sqlGC string
} }
@@ -60,7 +60,7 @@ func New(config ...Config) *Storage {
} }
// Drop table if set to true // Drop table if set to true
if cfg.Clear { if cfg.Reset {
if _, err = db.Exec(fmt.Sprintf(dropQuery, cfg.Table)); err != nil { if _, err = db.Exec(fmt.Sprintf(dropQuery, cfg.Table)); err != nil {
_ = db.Close() _ = db.Close()
panic(err) panic(err)
@@ -83,7 +83,7 @@ func New(config ...Config) *Storage {
sqlSelect: fmt.Sprintf(`SELECT v, e FROM %s WHERE k=?;`, cfg.Table), sqlSelect: fmt.Sprintf(`SELECT v, e FROM %s WHERE k=?;`, cfg.Table),
sqlInsert: fmt.Sprintf("INSERT OR REPLACE INTO %s (k, v, e) VALUES (?,?,?)", cfg.Table), sqlInsert: fmt.Sprintf("INSERT OR REPLACE INTO %s (k, v, e) VALUES (?,?,?)", cfg.Table),
sqlDelete: fmt.Sprintf("DELETE FROM %s WHERE k=?", cfg.Table), sqlDelete: fmt.Sprintf("DELETE FROM %s WHERE k=?", cfg.Table),
sqlClear: fmt.Sprintf("DELETE FROM %s;", cfg.Table), sqlReset: fmt.Sprintf("DELETE FROM %s;", cfg.Table),
sqlGC: fmt.Sprintf("DELETE FROM %s WHERE e <= ?", cfg.Table), sqlGC: fmt.Sprintf("DELETE FROM %s WHERE e <= ?", cfg.Table),
} }
@@ -135,12 +135,17 @@ func (s *Storage) Delete(key string) error {
return err return err
} }
// Clear all entries, including unexpired // Reset all entries, including unexpired
func (s *Storage) Clear() error { func (s *Storage) Reset() error {
_, err := s.db.Exec(s.sqlClear) _, err := s.db.Exec(s.sqlReset)
return err return err
} }
// Close the database
func (s *Storage) Close() error {
return s.db.Close()
}
// GC deletes all expired entries // GC deletes all expired entries
func (s *Storage) gc() { func (s *Storage) gc() {
tick := time.NewTicker(s.gcInterval) tick := time.NewTicker(s.gcInterval)

View File

@@ -9,7 +9,7 @@ import (
) )
var testStore = New(Config{ var testStore = New(Config{
Clear: true, Reset: true,
}) })
func Test_SQLite3_Set(t *testing.T) { func Test_SQLite3_Set(t *testing.T) {
@@ -107,7 +107,7 @@ func Test_SQLite3_Clear(t *testing.T) {
err = testStore.Set("john2", val, 0) err = testStore.Set("john2", val, 0)
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
err = testStore.Clear() err = testStore.Reset()
utils.AssertEqual(t, nil, err) utils.AssertEqual(t, nil, err)
result, err := testStore.Get("john1") result, err := testStore.Get("john1")

View File

@@ -19,6 +19,9 @@ type Storage interface {
// The key must not be "". // The key must not be "".
Delete(key string) error Delete(key string) error
// Clear storage // Reset the storage
Clear() error Reset() error
// Close the storage
Close() error
} }