Removed 'EchoVault' from all executable code

This commit is contained in:
Kelvin Clement Mwinuka
2024-09-22 06:58:34 +08:00
parent 5b5f4f099a
commit f9340e630b
41 changed files with 956 additions and 956 deletions
+1 -1
View File
@@ -5,5 +5,5 @@ internal/volumes/nodes
dist/
dump.rdb
**/*/testdata
echovault/aof
sugardb/aof
aof
+4 -4
View File
@@ -16,9 +16,9 @@ package main
import (
"context"
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/sugardb"
"log"
"os"
"os/signal"
@@ -36,9 +36,9 @@ func main() {
cancelCh := make(chan os.Signal, 1)
signal.Notify(cancelCh, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
server, err := echovault.NewEchoVault(
echovault.WithContext(ctx),
echovault.WithConfig(conf),
server, err := sugardb.NewSugarDB(
sugardb.WithContext(ctx),
sugardb.WithConfig(conf),
)
if err != nil {
-331
View File
@@ -1,331 +0,0 @@
// Copyright 2024 Kelvin Clement Mwinuka
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
import (
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"time"
)
// DefaultConfig returns the default configuration.
// This should be used when using EchoVault as an embedded library.
func DefaultConfig() config.Config {
return config.DefaultConfig()
}
func (server *EchoVault) GetServerInfo() internal.ServerInfo {
return internal.ServerInfo{
Server: "echovault",
Version: constants.Version,
Id: server.config.ServerID,
Mode: func() string {
if server.isInCluster() {
return "cluster"
}
return "standalone"
}(),
Role: func() string {
if !server.isInCluster() {
return "master"
}
if server.raft.IsRaftLeader() {
return "master"
}
return "replica"
}(),
Modules: server.ListModules(),
}
}
// WithTLS is an option to the NewEchoVault function that allows you to pass a
// custom TLS to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithTLS(b ...bool) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
if len(b) > 0 {
echovault.config.TLS = b[0]
} else {
echovault.config.TLS = true
}
}
}
// WithMTLS is an option to the NewEchoVault function that allows you to pass a
// custom MTLS to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithMTLS(b ...bool) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
if len(b) > 0 {
echovault.config.MTLS = b[0]
} else {
echovault.config.MTLS = true
}
}
}
// CertKeyPair defines the paths to the cert and key pair files respectively.
type CertKeyPair struct {
Cert string
Key string
}
// WithCertKeyPairs is an option to the NewEchoVault function that allows you to pass a
// custom CertKeyPairs to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithCertKeyPairs(certKeyPairs []CertKeyPair) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
for _, pair := range certKeyPairs {
echovault.config.CertKeyPairs = append(echovault.config.CertKeyPairs, []string{pair.Cert, pair.Key})
}
}
}
// WithClientCAs is an option to the NewEchoVault function that allows you to pass a
// custom ClientCAs to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithClientCAs(clientCAs []string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.ClientCAs = clientCAs
}
}
// WithPort is an option to the NewEchoVault function that allows you to pass a
// custom Port to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithPort(port uint16) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.Port = port
}
}
// WithServerID is an option to the NewEchoVault function that allows you to pass a
// custom ServerID to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithServerID(serverID string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.ServerID = serverID
}
}
// WithJoinAddr is an option to the NewEchoVault function that allows you to pass a
// custom JoinAddr to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithJoinAddr(joinAddr string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.JoinAddr = joinAddr
}
}
// WithBindAddr is an option to the NewEchoVault function that allows you to pass a
// custom BindAddr to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithBindAddr(bindAddr string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.BindAddr = bindAddr
}
}
// WithDataDir is an option to the NewEchoVault function that allows you to pass a
// custom DataDir to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithDataDir(dataDir string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.DataDir = dataDir
}
}
// WithBootstrapCluster is an option to the NewEchoVault function that allows you to pass a
// custom BootstrapCluster to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithBootstrapCluster(b ...bool) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
if len(b) > 0 {
echovault.config.BootstrapCluster = b[0]
} else {
echovault.config.BootstrapCluster = true
}
}
}
// WithAclConfig is an option to the NewEchoVault function that allows you to pass a
// custom AclConfig to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithAclConfig(aclConfig string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.AclConfig = aclConfig
}
}
// WithForwardCommand is an option to the NewEchoVault function that allows you to pass a
// custom ForwardCommand to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithForwardCommand(b ...bool) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
if len(b) > 0 {
echovault.config.ForwardCommand = b[0]
} else {
echovault.config.ForwardCommand = true
}
}
}
// WithRequirePass is an option to the NewEchoVault function that allows you to pass a
// custom RequirePass to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithRequirePass(b ...bool) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
if len(b) > 0 {
echovault.config.RequirePass = b[0]
} else {
echovault.config.RequirePass = true
}
}
}
// WithPassword is an option to the NewEchoVault function that allows you to pass a
// custom Password to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithPassword(password string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.Password = password
}
}
// WithSnapShotThreshold is an option to the NewEchoVault function that allows you to pass a
// custom SnapShotThreshold to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithSnapShotThreshold(snapShotThreshold uint64) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.SnapShotThreshold = snapShotThreshold
}
}
// WithSnapshotInterval is an option to the NewEchoVault function that allows you to pass a
// custom SnapshotInterval to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithSnapshotInterval(snapshotInterval time.Duration) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.SnapshotInterval = snapshotInterval
}
}
// WithRestoreSnapshot is an option to the NewEchoVault function that allows you to pass a
// custom RestoreSnapshot to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithRestoreSnapshot(b ...bool) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
if len(b) > 0 {
echovault.config.RestoreSnapshot = b[0]
} else {
echovault.config.RestoreSnapshot = true
}
}
}
// WithRestoreAOF is an option to the NewEchoVault function that allows you to pass a
// custom RestoreAOF to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithRestoreAOF(b ...bool) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
if len(b) > 0 {
echovault.config.RestoreAOF = b[0]
} else {
echovault.config.RestoreAOF = true
}
}
}
// WithAOFSyncStrategy is an option to the NewEchoVault function that allows you to pass a
// custom AOFSyncStrategy to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithAOFSyncStrategy(aOFSyncStrategy string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.AOFSyncStrategy = aOFSyncStrategy
}
}
// WithMaxMemory is an option to the NewEchoVault function that allows you to pass a
// custom MaxMemory to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithMaxMemory(maxMemory uint64) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.MaxMemory = maxMemory
}
}
// WithEvictionPolicy is an option to the NewEchoVault function that allows you to pass a
// custom EvictionPolicy to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithEvictionPolicy(evictionPolicy string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.EvictionPolicy = evictionPolicy
}
}
// WithEvictionSample is an option to the NewEchoVault function that allows you to pass a
// custom EvictionSample to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithEvictionSample(evictionSample uint) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.EvictionSample = evictionSample
}
}
// WithEvictionInterval is an option to the NewEchoVault function that allows you to pass a
// custom EvictionInterval to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithEvictionInterval(evictionInterval time.Duration) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.EvictionInterval = evictionInterval
}
}
// WithModules is an option to the NewEchoVault function that allows you to pass a
// custom Modules to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithModules(modules []string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.Modules = modules
}
}
// WithDiscoveryPort is an option to the NewEchoVault function that allows you to pass a
// custom DiscoveryPort to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithDiscoveryPort(discoveryPort uint16) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.DiscoveryPort = discoveryPort
}
}
// WithRaftBindAddr is an option to the NewEchoVault function that allows you to pass a
// custom RaftBindAddr to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithRaftBindAddr(raftBindAddr string) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.RaftBindAddr = raftBindAddr
}
}
// WithRaftBindPort is an option to the NewEchoVault function that allows you to pass a
// custom RaftBindPort to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithRaftBindPort(raftBindPort uint16) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.config.RaftBindPort = raftBindPort
}
}
+29 -29
View File
@@ -18,10 +18,10 @@ import (
"crypto/sha256"
"encoding/hex"
"fmt"
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"github.com/echovault/echovault/sugardb"
"github.com/tidwall/resp"
"os"
"path"
@@ -31,7 +31,7 @@ import (
"testing"
)
func setUpServer(port int, requirePass bool, aclConfig string) (*echovault.EchoVault, error) {
func setUpServer(port int, requirePass bool, aclConfig string) (*sugardb.SugarDB, error) {
conf := config.Config{
BindAddr: "localhost",
Port: uint16(port),
@@ -42,8 +42,8 @@ func setUpServer(port int, requirePass bool, aclConfig string) (*echovault.EchoV
AclConfig: aclConfig,
}
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(conf),
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(conf),
)
if err != nil {
return nil, err
@@ -67,8 +67,8 @@ func setUpServer(port int, requirePass bool, aclConfig string) (*echovault.EchoV
return mockServer, nil
}
func generateInitialTestUsers() []echovault.User {
return []echovault.User{
func generateInitialTestUsers() []sugardb.User {
return []sugardb.User{
{
// User with both hash password and plaintext password.
Username: "with_password_user",
@@ -215,7 +215,7 @@ func Test_ACL(t *testing.T) {
})
// Add users to be used in test cases.
users := []echovault.User{
users := []sugardb.User{
{
// User with nokeys flag enables.
Username: "test_nokeys",
@@ -648,7 +648,7 @@ func Test_ACL(t *testing.T) {
tests := []struct {
name string
presetUser *echovault.User
presetUser *sugardb.User
cmd []resp.Value
wantRes string
wantErr string
@@ -720,7 +720,7 @@ func Test_ACL(t *testing.T) {
},
{
name: "4. Remove plaintext and SHA256 password from existing user",
presetUser: &echovault.User{
presetUser: &sugardb.User{
Username: "set_user_4",
Enabled: true,
AddPlainPasswords: []string{"set_user_4_plaintext_password_1", "set_user_4_plaintext_password_2"},
@@ -1033,7 +1033,7 @@ func Test_ACL(t *testing.T) {
},
{
name: "17. Delete all existing users passwords using 'nopass'",
presetUser: &echovault.User{
presetUser: &sugardb.User{
Username: "set_user_17",
Enabled: true,
NoPassword: true,
@@ -1060,7 +1060,7 @@ func Test_ACL(t *testing.T) {
},
{
name: "18. Clear all of an existing user's passwords using 'resetpass'",
presetUser: &echovault.User{
presetUser: &sugardb.User{
Username: "set_user_18",
Enabled: true,
NoPassword: true,
@@ -1087,7 +1087,7 @@ func Test_ACL(t *testing.T) {
},
{
name: "19. Clear all of an existing user's command privileges using 'nocommands'",
presetUser: &echovault.User{
presetUser: &sugardb.User{
Username: "set_user_19",
Enabled: true,
IncludeCommands: []string{"acl|getuser", "acl|setuser", "acl|deluser"},
@@ -1113,7 +1113,7 @@ func Test_ACL(t *testing.T) {
},
{
name: "20. Clear all of an existing user's allowed keys using 'resetkeys'",
presetUser: &echovault.User{
presetUser: &sugardb.User{
Username: "set_user_20",
Enabled: true,
IncludeWriteKeys: []string{"key1", "key2", "key3", "key4", "key5", "key6"},
@@ -1139,7 +1139,7 @@ func Test_ACL(t *testing.T) {
},
{
name: "21. Allow user to access all channels using 'resetchannels'",
presetUser: &echovault.User{
presetUser: &sugardb.User{
Username: "set_user_21",
Enabled: true,
IncludeChannels: []string{"channel1", "channel2"},
@@ -1242,14 +1242,14 @@ func Test_ACL(t *testing.T) {
tests := []struct {
name string
presetUser *echovault.User
presetUser *sugardb.User
cmd []resp.Value
wantRes []resp.Value
wantErr string
}{
{
name: "1. Get the user and all their details",
presetUser: &echovault.User{
presetUser: &sugardb.User{
Username: "get_user_1",
Enabled: true,
NoPassword: false,
@@ -1410,14 +1410,14 @@ func Test_ACL(t *testing.T) {
tests := []struct {
name string
presetUser *echovault.User
presetUser *sugardb.User
cmd []resp.Value
wantRes string
wantErr string
}{
{
name: "1. Delete existing user while skipping default user and non-existent user",
presetUser: &echovault.User{
presetUser: &sugardb.User{
Username: "user_to_delete",
Enabled: true,
},
@@ -1592,14 +1592,14 @@ func Test_ACL(t *testing.T) {
tests := []struct {
name string
presetUsers []*echovault.User
presetUsers []*sugardb.User
cmd []resp.Value
wantRes []string
wantErr string
}{
{
name: "1. Get the user and all their details",
presetUsers: []*echovault.User{
presetUsers: []*sugardb.User{
{
Username: "list_user_1",
Enabled: true,
@@ -1762,7 +1762,7 @@ func Test_ACL(t *testing.T) {
},
}
servers := make([]*echovault.EchoVault, len(tests))
servers := make([]*sugardb.SugarDB, len(tests))
mut := sync.Mutex{}
t.Cleanup(func() {
_ = os.RemoveAll(baseDir)
@@ -1896,14 +1896,14 @@ func Test_ACL(t *testing.T) {
tests := []struct {
name string
path string
users []echovault.User // Add users after server startup.
cmd []resp.Value // Command to load users from ACL config.
users []sugardb.User // Add users after server startup.
cmd []resp.Value // Command to load users from ACL config.
want []string
}{
{
name: "1. Load config from the .json file",
path: path.Join(baseDir, "json_test.json"),
users: []echovault.User{
users: []sugardb.User{
{Username: "user1", Enabled: true},
},
cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("LOAD"), resp.StringValue("REPLACE")},
@@ -1919,7 +1919,7 @@ func Test_ACL(t *testing.T) {
{
name: "2. Load users from the .yaml file",
path: path.Join(baseDir, "yaml_test.yaml"),
users: []echovault.User{
users: []sugardb.User{
{Username: "user1", Enabled: true},
},
cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("LOAD"), resp.StringValue("REPLACE")},
@@ -1935,7 +1935,7 @@ func Test_ACL(t *testing.T) {
{
name: "3. Load users from the .yml file",
path: path.Join(baseDir, "yml_test.yml"),
users: []echovault.User{
users: []sugardb.User{
{Username: "user1", Enabled: true},
},
cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("LOAD"), resp.StringValue("REPLACE")},
@@ -1951,7 +1951,7 @@ func Test_ACL(t *testing.T) {
{
name: "4. Merge loaded users",
path: path.Join(baseDir, "merge.yml"),
users: []echovault.User{
users: []sugardb.User{
{ // Disable user1.
Username: "user1",
Enabled: false,
@@ -1979,7 +1979,7 @@ func Test_ACL(t *testing.T) {
{
name: "5. Replace loaded users",
path: path.Join(baseDir, "replace.yml"),
users: []echovault.User{
users: []sugardb.User{
{ // Disable user1.
Username: "user1",
Enabled: false,
@@ -2006,7 +2006,7 @@ func Test_ACL(t *testing.T) {
},
}
servers := make([]*echovault.EchoVault, len(tests))
servers := make([]*sugardb.SugarDB, len(tests))
mut := sync.Mutex{}
t.Cleanup(func() {
_ = os.RemoveAll(baseDir)
+17 -17
View File
@@ -17,7 +17,6 @@ package admin_test
import (
"errors"
"fmt"
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/clock"
"github.com/echovault/echovault/internal/constants"
@@ -31,6 +30,7 @@ import (
"github.com/echovault/echovault/internal/modules/set"
"github.com/echovault/echovault/internal/modules/sorted_set"
str "github.com/echovault/echovault/internal/modules/string"
"github.com/echovault/echovault/sugardb"
"github.com/tidwall/resp"
"os"
"path"
@@ -40,13 +40,13 @@ import (
"time"
)
func setupServer(port uint16) (*echovault.EchoVault, error) {
cfg := echovault.DefaultConfig()
func setupServer(port uint16) (*sugardb.SugarDB, error) {
cfg := sugardb.DefaultConfig()
cfg.DataDir = ""
cfg.BindAddr = "localhost"
cfg.Port = port
cfg.EvictionPolicy = constants.NoEviction
return echovault.NewEchoVault(echovault.WithConfig(cfg))
return sugardb.NewSugarDB(sugardb.WithConfig(cfg))
}
func Test_AdminCommands(t *testing.T) {
@@ -688,8 +688,8 @@ func Test_AdminCommands(t *testing.T) {
name string
dataDir string
values map[string]string
snapshotFunc func(mockServer *echovault.EchoVault, port int) error
lastSaveFunc func(mockServer *echovault.EchoVault, port int) (int, error)
snapshotFunc func(mockServer *sugardb.SugarDB, port int) error
lastSaveFunc func(mockServer *sugardb.SugarDB, port int) (int, error)
wantLastSave int
}{
{
@@ -701,7 +701,7 @@ func Test_AdminCommands(t *testing.T) {
"key3": "value3",
"key4": "value4",
},
snapshotFunc: func(mockServer *echovault.EchoVault, port int) error {
snapshotFunc: func(mockServer *sugardb.SugarDB, port int) error {
// Start the server's TCP listener
go func() {
mockServer.Start()
@@ -726,7 +726,7 @@ func Test_AdminCommands(t *testing.T) {
}
return nil
},
lastSaveFunc: func(mockServer *echovault.EchoVault, port int) (int, error) {
lastSaveFunc: func(mockServer *sugardb.SugarDB, port int) (int, error) {
conn, err := internal.GetConnection("localhost", port)
if err != nil {
return 0, err
@@ -758,13 +758,13 @@ func Test_AdminCommands(t *testing.T) {
return
}
conf := echovault.DefaultConfig()
conf := sugardb.DefaultConfig()
conf.DataDir = test.dataDir
conf.BindAddr = "localhost"
conf.Port = uint16(port)
conf.RestoreSnapshot = true
mockServer, err := echovault.NewEchoVault(echovault.WithConfig(conf))
mockServer, err := sugardb.NewSugarDB(sugardb.WithConfig(conf))
if err != nil {
t.Error(err)
return
@@ -776,7 +776,7 @@ func Test_AdminCommands(t *testing.T) {
// Trigger some write commands
for key, value := range test.values {
if _, _, err = mockServer.Set(key, value, echovault.SETOptions{}); err != nil {
if _, _, err = mockServer.Set(key, value, sugardb.SETOptions{}); err != nil {
t.Error(err)
return
}
@@ -793,7 +793,7 @@ func Test_AdminCommands(t *testing.T) {
ticker.Stop()
// Restart server with the same config. This should restore the snapshot
mockServer, err = echovault.NewEchoVault(echovault.WithConfig(conf))
mockServer, err = sugardb.NewSugarDB(sugardb.WithConfig(conf))
if err != nil {
t.Error(err)
return
@@ -867,7 +867,7 @@ func Test_AdminCommands(t *testing.T) {
return
}
conf := echovault.DefaultConfig()
conf := sugardb.DefaultConfig()
conf.BindAddr = "localhost"
conf.Port = uint16(port)
conf.RestoreAOF = true
@@ -875,7 +875,7 @@ func Test_AdminCommands(t *testing.T) {
conf.AOFSyncStrategy = "always"
// Start new server
mockServer, err := echovault.NewEchoVault(echovault.WithConfig(conf))
mockServer, err := sugardb.NewSugarDB(sugardb.WithConfig(conf))
if err != nil {
t.Error(err)
return
@@ -952,12 +952,12 @@ func Test_AdminCommands(t *testing.T) {
// Yield
<-ticker.C
// Shutdown the EchoVault instance and close current client connection
// Shutdown the SugarDB instance and close current client connection
mockServer.ShutDown()
_ = conn.Close()
// Start another instance of EchoVault
mockServer, err = echovault.NewEchoVault(echovault.WithConfig(conf))
// Start another instance of SugarDB
mockServer, err = sugardb.NewSugarDB(sugardb.WithConfig(conf))
if err != nil {
t.Error(err)
return
+9 -9
View File
@@ -27,14 +27,14 @@ import (
"strings"
"testing"
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"github.com/echovault/echovault/sugardb"
"github.com/tidwall/resp"
)
func setUpServer(port int, requirePass bool, aclConfig string) (*echovault.EchoVault, error) {
func setUpServer(port int, requirePass bool, aclConfig string) (*sugardb.SugarDB, error) {
conf := config.Config{
BindAddr: "localhost",
Port: uint16(port),
@@ -45,8 +45,8 @@ func setUpServer(port int, requirePass bool, aclConfig string) (*echovault.EchoV
AclConfig: aclConfig,
}
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(conf),
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(conf),
)
if err != nil {
return nil, err
@@ -62,8 +62,8 @@ func setUpServer(port int, requirePass bool, aclConfig string) (*echovault.EchoV
return mockServer, nil
}
func generateInitialTestUsers() []echovault.User {
return []echovault.User{
func generateInitialTestUsers() []sugardb.User {
return []sugardb.User{
{
// User with both hash password and plaintext password.
Username: "with_password_user",
@@ -323,8 +323,8 @@ func Test_Connection(t *testing.T) {
expectedErr error
}{
{
command: []resp.Value{resp.StringValue("ECHO"), resp.StringValue("Hello, EchoVault!")},
expected: "Hello, EchoVault!",
command: []resp.Value{resp.StringValue("ECHO"), resp.StringValue("Hello, SugarDB!")},
expected: "Hello, SugarDB!",
expectedErr: nil,
},
{
@@ -335,7 +335,7 @@ func Test_Connection(t *testing.T) {
{
command: []resp.Value{
resp.StringValue("ECHO"),
resp.StringValue("Hello, EchoVault!"),
resp.StringValue("Hello, SugarDB!"),
resp.StringValue("Once more"),
},
expected: "",
+11 -11
View File
@@ -22,13 +22,13 @@ import (
"testing"
"time"
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/clock"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"github.com/echovault/echovault/internal/modules/set"
"github.com/echovault/echovault/internal/modules/sorted_set"
"github.com/echovault/echovault/sugardb"
"github.com/tidwall/resp"
)
@@ -46,8 +46,8 @@ func Test_Generic(t *testing.T) {
return
}
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(config.Config{
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
DataDir: "",
@@ -2634,8 +2634,8 @@ func Test_Generic(t *testing.T) {
t.Error(err)
return
}
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(config.Config{
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
DataDir: "",
@@ -2662,7 +2662,7 @@ func Test_Generic(t *testing.T) {
_, _, _ = mockServer.Set(
fmt.Sprintf("key%d", k),
fmt.Sprintf("value%d", k),
echovault.SETOptions{},
sugardb.SETOptions{},
)
}
}
@@ -2768,7 +2768,7 @@ func Test_Generic(t *testing.T) {
_, _, err := mockServer.Set(
fmt.Sprintf("RandomKey%d", i),
fmt.Sprintf("Value%d", i),
echovault.SETOptions{},
sugardb.SETOptions{},
)
if err != nil {
t.Error(err)
@@ -3346,8 +3346,8 @@ func Test_LFU_Generic(t *testing.T) {
duration := time.Duration(30) * time.Second
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(config.Config{
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
DataDir: "",
@@ -3527,8 +3527,8 @@ func Test_LRU_Generic(t *testing.T) {
duration := time.Duration(30) * time.Second
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(config.Config{
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
DataDir: "",
+3 -3
View File
@@ -16,10 +16,10 @@ package hash_test
import (
"errors"
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"github.com/echovault/echovault/sugardb"
"github.com/tidwall/resp"
"slices"
"strconv"
@@ -34,8 +34,8 @@ func Test_Hash(t *testing.T) {
return
}
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(config.Config{
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
DataDir: "",
+3 -3
View File
@@ -16,10 +16,10 @@ package list_test
import (
"errors"
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"github.com/echovault/echovault/sugardb"
"github.com/tidwall/resp"
"go/types"
"slices"
@@ -35,8 +35,8 @@ func Test_List(t *testing.T) {
return
}
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(config.Config{
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
DataDir: "",
+4 -4
View File
@@ -15,10 +15,10 @@
package pubsub_test
import (
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"github.com/echovault/echovault/sugardb"
"github.com/tidwall/resp"
"net"
"slices"
@@ -27,9 +27,9 @@ import (
"testing"
)
func setUpServer(port int) (*echovault.EchoVault, error) {
return echovault.NewEchoVault(
echovault.WithConfig(config.Config{
func setUpServer(port int) (*sugardb.SugarDB, error) {
return sugardb.NewSugarDB(
sugardb.WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
DataDir: "",
+3 -3
View File
@@ -16,11 +16,11 @@ package set_test
import (
"errors"
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"github.com/echovault/echovault/internal/modules/set"
"github.com/echovault/echovault/sugardb"
"github.com/tidwall/resp"
"slices"
"strconv"
@@ -35,8 +35,8 @@ func Test_Set(t *testing.T) {
return
}
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(config.Config{
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
DataDir: "",
+3 -3
View File
@@ -22,11 +22,11 @@ import (
"strings"
"testing"
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"github.com/echovault/echovault/internal/modules/sorted_set"
"github.com/echovault/echovault/sugardb"
"github.com/tidwall/resp"
)
@@ -37,8 +37,8 @@ func Test_SortedSet(t *testing.T) {
return
}
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(config.Config{
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
DataDir: "",
+3 -3
View File
@@ -20,10 +20,10 @@ import (
"strings"
"testing"
"github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"github.com/echovault/echovault/sugardb"
"github.com/tidwall/resp"
)
@@ -34,8 +34,8 @@ func Test_String(t *testing.T) {
return
}
mockServer, err := echovault.NewEchoVault(
echovault.WithConfig(config.Config{
mockServer, err := sugardb.NewSugarDB(
sugardb.WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
DataDir: "",
+10 -10
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"bytes"
@@ -117,13 +117,13 @@ type User struct {
// `category` - ...string - an optional string specifying the category. If more than one category is passed,
// only the first one will be used.
//
// Returns: string slice of categories loaded in EchoVault if category is not specified. Otherwise, returns string
// Returns: string slice of categories loaded in SugarDB if category is not specified. Otherwise, returns string
// slice of commands within the specified category.
//
// Errors:
//
// "category <category> not found" - when the provided category is not found in the loaded commands.
func (server *EchoVault) ACLCat(category ...string) ([]string, error) {
func (server *SugarDB) ACLCat(category ...string) ([]string, error) {
cmd := []string{"ACL", "CAT"}
if len(category) > 0 {
cmd = append(cmd, category[0])
@@ -136,7 +136,7 @@ func (server *EchoVault) ACLCat(category ...string) ([]string, error) {
}
// ACLUsers returns a string slice containing the usernames of all the loaded users in the ACL module.
func (server *EchoVault) ACLUsers() ([]string, error) {
func (server *SugarDB) ACLUsers() ([]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"ACL", "USERS"}), nil, false, true)
if err != nil {
return nil, err
@@ -152,7 +152,7 @@ func (server *EchoVault) ACLUsers() ([]string, error) {
// `user` - User - The user object to add/update.
//
// Returns: true if the user is successfully created/updated.
func (server *EchoVault) ACLSetUser(user User) (bool, error) {
func (server *SugarDB) ACLSetUser(user User) (bool, error) {
cmd := []string{"ACL", "SETUSER", user.Username}
if user.Enabled {
@@ -290,7 +290,7 @@ func (server *EchoVault) ACLSetUser(user User) (bool, error) {
// Errors:
//
// "user not found" - if the user requested does not exist in the ACL rules.
func (server *EchoVault) ACLGetUser(username string) (map[string][]string, error) {
func (server *SugarDB) ACLGetUser(username string) (map[string][]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"ACL", "GETUSER", username}), nil, false, true)
if err != nil {
return nil, err
@@ -327,7 +327,7 @@ func (server *EchoVault) ACLGetUser(username string) (map[string][]string, error
// `usernames` - ...string - A string of usernames to delete from the ACL module.
//
// Returns: true if the deletion is successful.
func (server *EchoVault) ACLDelUser(usernames ...string) (bool, error) {
func (server *SugarDB) ACLDelUser(usernames ...string) (bool, error) {
cmd := append([]string{"ACL", "DELUSER"}, usernames...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -338,7 +338,7 @@ func (server *EchoVault) ACLDelUser(usernames ...string) (bool, error) {
}
// ACLList lists all the currently loaded ACL users and their rules.
func (server *EchoVault) ACLList() ([]string, error) {
func (server *SugarDB) ACLList() ([]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"ACL", "LIST"}), nil, false, true)
if err != nil {
return nil, err
@@ -354,7 +354,7 @@ func (server *EchoVault) ACLList() ([]string, error) {
// `options` - ACLLoadOptions - modifies the load behaviour.
//
// Returns: true if the load is successful.
func (server *EchoVault) ACLLoad(options ACLLoadOptions) (bool, error) {
func (server *SugarDB) ACLLoad(options ACLLoadOptions) (bool, error) {
cmd := []string{"ACL", "LOAD"}
switch {
case options.Merge:
@@ -377,7 +377,7 @@ func (server *EchoVault) ACLLoad(options ACLLoadOptions) (bool, error) {
// ACLSave saves the current ACL configuration to the configured ACL file.
//
// Returns: true if the save is successful.
func (server *EchoVault) ACLSave() (bool, error) {
func (server *SugarDB) ACLSave() (bool, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"ACL", "SAVE"}), nil, false, true)
if err != nil {
return false, err
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"crypto/sha256"
@@ -124,8 +124,8 @@ func generateSHA256Password(plain string) string {
return hex.EncodeToString(h.Sum(nil))
}
func TestEchoVault_ACLCat(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ACLCat(t *testing.T) {
server := createSugarDB()
getCategoryCommands := func(category string) []string {
var commands []string
@@ -264,8 +264,8 @@ func TestEchoVault_ACLCat(t *testing.T) {
}
}
func TestEchoVault_ACLUsers(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ACLUsers(t *testing.T) {
server := createSugarDB()
// Set Users
users := []User{
@@ -369,7 +369,7 @@ func TestEchoVault_ACLUsers(t *testing.T) {
}
}
func TestEchoVault_ACLConfig(t *testing.T) {
func TestSugarDB_ACLConfig(t *testing.T) {
t.Run("Test_HandleSave", func(t *testing.T) {
baseDir := path.Join(".", "testdata", "save")
t.Cleanup(func() {
@@ -422,7 +422,7 @@ func TestEchoVault_ACLConfig(t *testing.T) {
conf := DefaultConfig()
conf.DataDir = ""
conf.AclConfig = test.path
server := createEchoVaultWithConfig(conf)
server := createSugarDBWithConfig(conf)
// Add the initial test users to the ACL module.
for _, user := range generateInitialTestUsers() {
if _, err := server.ACLSetUser(user); err != nil {
@@ -444,7 +444,7 @@ func TestEchoVault_ACLConfig(t *testing.T) {
server.ShutDown()
// Restart server
server = createEchoVaultWithConfig(conf)
server = createSugarDBWithConfig(conf)
// Get users rules list.
list, err := server.ACLList()
@@ -474,8 +474,8 @@ func TestEchoVault_ACLConfig(t *testing.T) {
tests := []struct {
name string
path string
users []User // Add users after server startup.
loadFunc func(server *EchoVault) (bool, error) // Function to load users from ACL config.
users []User // Add users after server startup.
loadFunc func(server *SugarDB) (bool, error) // Function to load users from ACL config.
want []string
}{
{
@@ -484,7 +484,7 @@ func TestEchoVault_ACLConfig(t *testing.T) {
users: []User{
{Username: "user1", Enabled: true},
},
loadFunc: func(server *EchoVault) (bool, error) {
loadFunc: func(server *SugarDB) (bool, error) {
return server.ACLLoad(ACLLoadOptions{})
},
want: []string{
@@ -502,7 +502,7 @@ func TestEchoVault_ACLConfig(t *testing.T) {
users: []User{
{Username: "user1", Enabled: true},
},
loadFunc: func(server *EchoVault) (bool, error) {
loadFunc: func(server *SugarDB) (bool, error) {
return server.ACLLoad(ACLLoadOptions{})
},
want: []string{
@@ -520,7 +520,7 @@ func TestEchoVault_ACLConfig(t *testing.T) {
users: []User{
{Username: "user1", Enabled: true},
},
loadFunc: func(server *EchoVault) (bool, error) {
loadFunc: func(server *SugarDB) (bool, error) {
return server.ACLLoad(ACLLoadOptions{})
},
want: []string{
@@ -550,7 +550,7 @@ func TestEchoVault_ACLConfig(t *testing.T) {
ExcludeChannels: []string{"channel[34]"},
},
},
loadFunc: func(server *EchoVault) (bool, error) {
loadFunc: func(server *SugarDB) (bool, error) {
return server.ACLLoad(ACLLoadOptions{Merge: true, Replace: false})
},
want: []string{
@@ -580,7 +580,7 @@ func TestEchoVault_ACLConfig(t *testing.T) {
ExcludeChannels: []string{"channel[34]"},
},
},
loadFunc: func(server *EchoVault) (bool, error) {
loadFunc: func(server *SugarDB) (bool, error) {
return server.ACLLoad(ACLLoadOptions{Replace: true, Merge: false})
},
want: []string{
@@ -600,7 +600,7 @@ func TestEchoVault_ACLConfig(t *testing.T) {
conf := DefaultConfig()
conf.DataDir = ""
conf.AclConfig = test.path
server := createEchoVaultWithConfig(conf)
server := createSugarDBWithConfig(conf)
// Add the initial test users to the ACL module.
for _, user := range generateInitialTestUsers() {
if _, err := server.ACLSetUser(user); err != nil {
+17 -17
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
@@ -53,7 +53,7 @@ type CommandKeyExtractionFunc func(cmd []string) (CommandKeyExtractionFuncResult
// This function must return a byte slice containing a valid RESP2 response, or an error.
type CommandHandlerFunc func(params CommandHandlerFuncParams) ([]byte, error)
// CommandHandlerFuncParams contains the helper parameters passed to the command's handler by EchoVault.
// CommandHandlerFuncParams contains the helper parameters passed to the command's handler by SugarDB.
//
// Command is the string slice command containing the command that triggered this handler.
//
@@ -71,7 +71,7 @@ type CommandHandlerFuncParams struct {
SetValues func(ctx context.Context, entries map[string]interface{}) error
}
// CommandOptions provides the specification of the command to be added to the EchoVault instance.
// CommandOptions provides the specification of the command to be added to the SugarDB instance.
//
// Command is the keyword used to trigger this command (e.g. LPUSH, ZADD, ACL ...).
//
@@ -132,14 +132,14 @@ type SubCommandOptions struct {
HandlerFunc CommandHandlerFunc
}
// CommandList returns the list of commands currently loaded in the EchoVault instance.
// CommandList returns the list of commands currently loaded in the SugarDB instance.
//
// Parameters:
//
// `options` - CommandListOptions.
//
// Returns: a string slice of all the loaded commands. SubCommands are represented as "command|subcommand".
func (server *EchoVault) CommandList(options ...CommandListOptions) ([]string, error) {
func (server *SugarDB) CommandList(options ...CommandListOptions) ([]string, error) {
cmd := []string{"COMMAND", "LIST"}
if len(options) > 0 {
@@ -161,10 +161,10 @@ func (server *EchoVault) CommandList(options ...CommandListOptions) ([]string, e
return internal.ParseStringArrayResponse(b)
}
// CommandCount returns the number of commands currently loaded in the EchoVault instance.
// CommandCount returns the number of commands currently loaded in the SugarDB instance.
//
// Returns: integer representing the count of all available commands.
func (server *EchoVault) CommandCount() (int, error) {
func (server *SugarDB) CommandCount() (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"COMMAND", "COUNT"}), nil, false, true)
if err != nil {
return 0, err
@@ -176,7 +176,7 @@ func (server *EchoVault) CommandCount() (int, error) {
//
// Returns: true if the save was started. The OK response does not confirm that the save was successfully synced to
// file. Only that the background process has started.
func (server *EchoVault) Save() (bool, error) {
func (server *SugarDB) Save() (bool, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"SAVE"}), nil, false, true)
if err != nil {
return false, err
@@ -186,7 +186,7 @@ func (server *EchoVault) Save() (bool, error) {
}
// LastSave returns the unix epoch milliseconds timestamp of the last save.
func (server *EchoVault) LastSave() (int, error) {
func (server *SugarDB) LastSave() (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"LASTSAVE"}), nil, false, true)
if err != nil {
return 0, err
@@ -195,7 +195,7 @@ func (server *EchoVault) LastSave() (int, error) {
}
// RewriteAOF triggers a compaction of the AOF file.
func (server *EchoVault) RewriteAOF() (string, error) {
func (server *SugarDB) RewriteAOF() (string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"REWRITEAOF"}), nil, false, true)
if err != nil {
return "", err
@@ -203,7 +203,7 @@ func (server *EchoVault) RewriteAOF() (string, error) {
return internal.ParseStringResponse(b)
}
// AddCommand adds a new command to EchoVault. The added command can be executed using the ExecuteCommand method.
// AddCommand adds a new command to SugarDB. The added command can be executed using the ExecuteCommand method.
//
// Parameters:
//
@@ -212,7 +212,7 @@ func (server *EchoVault) RewriteAOF() (string, error) {
// Errors:
//
// "command <command> already exists" - If a command with the same command name as the passed command already exists.
func (server *EchoVault) AddCommand(command CommandOptions) error {
func (server *SugarDB) AddCommand(command CommandOptions) error {
server.commandsRWMut.Lock()
defer server.commandsRWMut.Unlock()
// Check if command already exists
@@ -330,8 +330,8 @@ func (server *EchoVault) AddCommand(command CommandOptions) error {
return nil
}
// ExecuteCommand executes the command passed to it. If 1 string is passed, EchoVault will try to
// execute the command. If 2 strings are passed, EchoVault will attempt to execute the subcommand of the command.
// ExecuteCommand executes the command passed to it. If 1 string is passed, SugarDB will try to
// execute the command. If 2 strings are passed, SugarDB will attempt to execute the subcommand of the command.
// If more than 2 strings are provided, all additional strings will be ignored.
//
// This method returns the raw RESP response from the command handler. You will have to parse the RESP response if
@@ -353,11 +353,11 @@ func (server *EchoVault) AddCommand(command CommandOptions) error {
// "command <command> not supported" - If the command does not exist.
//
// "command <command> <subcommand> not supported" - If the command exists but the subcommand does not exist for that command.
func (server *EchoVault) ExecuteCommand(command ...string) ([]byte, error) {
func (server *SugarDB) ExecuteCommand(command ...string) ([]byte, error) {
return server.handleCommand(server.context, internal.EncodeCommand(command), nil, false, true)
}
// RemoveCommand removes the specified command or subcommand from EchoVault.
// RemoveCommand removes the specified command or subcommand from SugarDB.
// When commands are removed, they will no longer be available for both the embedded instance and for TCP clients.
//
// Note: If a command is removed, the API wrapper for the command will also be unusable.
@@ -371,7 +371,7 @@ func (server *EchoVault) ExecuteCommand(command ...string) ([]byte, error) {
// Parameters:
//
// `command` - ...string.
func (server *EchoVault) RemoveCommand(command ...string) {
func (server *SugarDB) RemoveCommand(command ...string) {
server.commandsRWMut.Lock()
defer server.commandsRWMut.Unlock()
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"bytes"
@@ -31,7 +31,7 @@ import (
"time"
)
func TestEchoVault_AddCommand(t *testing.T) {
func TestSugarDB_AddCommand(t *testing.T) {
type args struct {
command CommandOptions
}
@@ -176,7 +176,7 @@ The value passed must be an integer.`,
},
}
for _, tt := range tests {
server := createEchoVault()
server := createSugarDB()
t.Run(tt.name, func(t *testing.T) {
if err := server.AddCommand(tt.args.command); (err != nil) != tt.wantErr {
t.Errorf("AddCommand() error = %v, wantErr %v", err, tt.wantErr)
@@ -199,7 +199,7 @@ The value passed must be an integer.`,
}
}
func TestEchoVault_ExecuteCommand(t *testing.T) {
func TestSugarDB_ExecuteCommand(t *testing.T) {
type args struct {
key string
presetValue []string
@@ -233,7 +233,7 @@ func TestEchoVault_ExecuteCommand(t *testing.T) {
},
}
for _, tt := range tests {
server := createEchoVault()
server := createSugarDB()
t.Run(tt.name, func(t *testing.T) {
if tt.args.presetValue != nil {
_, _ = server.LPush(tt.args.key, tt.args.presetValue...)
@@ -253,7 +253,7 @@ func TestEchoVault_ExecuteCommand(t *testing.T) {
}
}
func TestEchoVault_RemoveCommand(t *testing.T) {
func TestSugarDB_RemoveCommand(t *testing.T) {
type args struct {
removeCommand []string
executeCommand []string
@@ -289,7 +289,7 @@ func TestEchoVault_RemoveCommand(t *testing.T) {
},
}
for _, tt := range tests {
server := createEchoVault()
server := createSugarDB()
t.Run(tt.name, func(t *testing.T) {
server.RemoveCommand(tt.args.removeCommand...)
_, err := server.ExecuteCommand(tt.args.executeCommand...)
@@ -302,12 +302,12 @@ func TestEchoVault_RemoveCommand(t *testing.T) {
}
}
func TestEchoVault_Plugins(t *testing.T) {
func TestSugarDB_Plugins(t *testing.T) {
t.Cleanup(func() {
_ = os.RemoveAll("./testdata/modules")
})
server := createEchoVault()
server := createSugarDB()
moduleSet := path.Join(".", "testdata", "modules", "module_set", "module_set.so")
moduleGet := path.Join(".", "testdata", "modules", "module_get", "module_get.so")
@@ -378,8 +378,8 @@ func TestEchoVault_Plugins(t *testing.T) {
}
}
func TestEchoVault_CommandList(t *testing.T) {
server := createEchoVault()
func TestSugarDB_CommandList(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -468,8 +468,8 @@ func TestEchoVault_CommandList(t *testing.T) {
}
}
func TestEchoVault_CommandCount(t *testing.T) {
server := createEchoVault()
func TestSugarDB_CommandCount(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -508,11 +508,11 @@ func TestEchoVault_CommandCount(t *testing.T) {
}
}
func TestEchoVault_Save(t *testing.T) {
func TestSugarDB_Save(t *testing.T) {
conf := DefaultConfig()
conf.DataDir = path.Join(".", "testdata", "data")
conf.EvictionPolicy = constants.NoEviction
server := createEchoVaultWithConfig(conf)
server := createSugarDBWithConfig(conf)
tests := []struct {
name string
@@ -539,8 +539,8 @@ func TestEchoVault_Save(t *testing.T) {
}
}
func TestEchoVault_LastSave(t *testing.T) {
server := createEchoVault()
func TestSugarDB_LastSave(t *testing.T) {
server := createSugarDB()
server.setLatestSnapshot(clock.NewClock().Now().Add(5 * time.Minute).UnixMilli())
tests := []struct {
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"errors"
@@ -29,7 +29,7 @@ import (
// Errors:
//
// "protocol must be either 2 or 3" - When the provided protocol is not either 2 or 3.
func (server *EchoVault) SetProtocol(protocol int) error {
func (server *SugarDB) SetProtocol(protocol int) error {
if !slices.Contains([]int{2, 3}, protocol) {
return errors.New("protocol must be either 2 or 3")
}
@@ -50,7 +50,7 @@ func (server *EchoVault) SetProtocol(protocol int) error {
// Errors:
//
// "database index must be 0 or higher" - When the database index is less than 0.
func (server *EchoVault) SelectDB(database int) error {
func (server *SugarDB) SelectDB(database int) error {
if database < 0 {
return errors.New("database index must be 0 or higher")
}
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"bufio"
@@ -25,7 +25,7 @@ import (
"testing"
)
func TestEchoVault_Hello(t *testing.T) {
func TestSugarDB_Hello(t *testing.T) {
t.Parallel()
port, err := internal.GetFreePort()
@@ -38,7 +38,7 @@ func TestEchoVault_Hello(t *testing.T) {
conf.Port = uint16(port)
conf.RequirePass = false
mockServer := createEchoVaultWithConfig(conf)
mockServer := createSugarDBWithConfig(conf)
if err != nil {
t.Error(err)
return
@@ -147,7 +147,7 @@ func TestEchoVault_Hello(t *testing.T) {
}
}
func TestEchoVault_SelectDB(t *testing.T) {
func TestSugarDB_SelectDB(t *testing.T) {
t.Parallel()
tests := []struct {
name string
@@ -184,7 +184,7 @@ func TestEchoVault_SelectDB(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
server := createEchoVault()
server := createSugarDB()
if tt.presetValues != nil {
for db, data := range tt.presetValues {
@@ -237,9 +237,9 @@ func TestEchoVault_SelectDB(t *testing.T) {
}
}
func TestEchoVault_SetProtocol(t *testing.T) {
func TestSugarDB_SetProtocol(t *testing.T) {
t.Parallel()
server := createEchoVault()
server := createSugarDB()
tests := []struct {
name string
protocol int
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"fmt"
@@ -152,7 +152,7 @@ func (x GetExOpt) isGetExOpt() GetExOpt { return x }
// "key <key> does not exist"" - when the XX flag is set to true and the key does not exist.
//
// "key <key> does already exists" - when the NX flag is set to true and the key already exists.
func (server *EchoVault) Set(key, value string, options SETOptions) (string, bool, error) {
func (server *SugarDB) Set(key, value string, options SETOptions) (string, bool, error) {
cmd := []string{"SET", key, value}
if options.WriteOpt != nil {
@@ -195,7 +195,7 @@ func (server *EchoVault) Set(key, value string, options SETOptions) (string, boo
// Errors:
//
// "key <key> already exists" - when the NX flag is set to true and the key already exists.
func (server *EchoVault) MSet(kvPairs map[string]string) (bool, error) {
func (server *SugarDB) MSet(kvPairs map[string]string) (bool, error) {
cmd := []string{"MSET"}
for k, v := range kvPairs {
@@ -223,7 +223,7 @@ func (server *EchoVault) MSet(kvPairs map[string]string) (bool, error) {
//
// Returns: A string representing the value at the specified key. If the value does not exist, an empty
// string is returned.
func (server *EchoVault) Get(key string) (string, error) {
func (server *SugarDB) Get(key string) (string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"GET", key}), nil, false, true)
if err != nil {
return "", err
@@ -239,7 +239,7 @@ func (server *EchoVault) Get(key string) (string, error) {
// `keys` - []string - a string slice of all the keys.
//
// Returns: a string slice of all the values.
func (server *EchoVault) MGet(keys ...string) ([]string, error) {
func (server *SugarDB) MGet(keys ...string) ([]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand(append([]string{"MGET"}, keys...)), nil, false, true)
if err != nil {
return []string{}, err
@@ -254,7 +254,7 @@ func (server *EchoVault) MGet(keys ...string) ([]string, error) {
// `keys` - []string - the keys to delete from the store.
//
// Returns: The number of keys that were successfully deleted.
func (server *EchoVault) Del(keys ...string) (int, error) {
func (server *SugarDB) Del(keys ...string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand(append([]string{"DEL"}, keys...)), nil, false, true)
if err != nil {
return 0, err
@@ -270,7 +270,7 @@ func (server *EchoVault) Del(keys ...string) (int, error) {
// `key` - string - the key to persist.
//
// Returns: true if the keys is successfully persisted.
func (server *EchoVault) Persist(key string) (bool, error) {
func (server *SugarDB) Persist(key string) (bool, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"PERSIST", key}), nil, false, true)
if err != nil {
return false, err
@@ -285,7 +285,7 @@ func (server *EchoVault) Persist(key string) (bool, error) {
// `key` - string.
//
// Returns: -2 if the keys does not exist, -1 if the key exists but has no expiry time, seconds if the key has an expiry.
func (server *EchoVault) ExpireTime(key string) (int, error) {
func (server *SugarDB) ExpireTime(key string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"EXPIRETIME", key}), nil, false, true)
if err != nil {
return 0, err
@@ -300,7 +300,7 @@ func (server *EchoVault) ExpireTime(key string) (int, error) {
// `key` - string.
//
// Returns: -2 if the keys does not exist, -1 if the key exists but has no expiry time, seconds if the key has an expiry.
func (server *EchoVault) PExpireTime(key string) (int, error) {
func (server *SugarDB) PExpireTime(key string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"PEXPIRETIME", key}), nil, false, true)
if err != nil {
return 0, err
@@ -315,7 +315,7 @@ func (server *EchoVault) PExpireTime(key string) (int, error) {
// `key` - string.
//
// Returns: -2 if the keys does not exist, -1 if the key exists but has no expiry time, seconds if the key has an expiry.
func (server *EchoVault) TTL(key string) (int, error) {
func (server *SugarDB) TTL(key string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"TTL", key}), nil, false, true)
if err != nil {
return 0, err
@@ -330,7 +330,7 @@ func (server *EchoVault) TTL(key string) (int, error) {
// `key` - string.
//
// Returns: -2 if the keys does not exist, -1 if the key exists but has no expiry time, seconds if the key has an expiry.
func (server *EchoVault) PTTL(key string) (int, error) {
func (server *SugarDB) PTTL(key string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"PTTL", key}), nil, false, true)
if err != nil {
return 0, err
@@ -350,7 +350,7 @@ func (server *EchoVault) PTTL(key string) (int, error) {
// `options` - ExpireOptions - One of NX, GT, LT. XX can be passed with GT OR LT optionally.
//
// Returns: true if the key's expiry was successfully updated.
func (server *EchoVault) Expire(key string, seconds int, options ...ExpireOptions) (bool, error) {
func (server *SugarDB) Expire(key string, seconds int, options ...ExpireOptions) (bool, error) {
cmd := []string{"EXPIRE", key, strconv.Itoa(seconds)}
for _, opt := range options {
@@ -379,7 +379,7 @@ func (server *EchoVault) Expire(key string, seconds int, options ...ExpireOption
// `options` - PExpireOptions
//
// Returns: true if the key's expiry was successfully updated.
func (server *EchoVault) PExpire(key string, milliseconds int, options ...ExpireOptions) (bool, error) {
func (server *SugarDB) PExpire(key string, milliseconds int, options ...ExpireOptions) (bool, error) {
cmd := []string{"PEXPIRE", key, strconv.Itoa(milliseconds)}
for _, opt := range options {
@@ -408,7 +408,7 @@ func (server *EchoVault) PExpire(key string, milliseconds int, options ...Expire
// `options` - ExpireAtOptions
//
// Returns: true if the key's expiry was successfully updated.
func (server *EchoVault) ExpireAt(key string, unixSeconds int, options ...ExpireOptions) (int, error) {
func (server *SugarDB) ExpireAt(key string, unixSeconds int, options ...ExpireOptions) (int, error) {
cmd := []string{"EXPIREAT", key, strconv.Itoa(unixSeconds)}
for _, opt := range options {
@@ -437,7 +437,7 @@ func (server *EchoVault) ExpireAt(key string, unixSeconds int, options ...Expire
// `options` - PExpireAtOptions
//
// Returns: true if the key's expiry was successfully updated.
func (server *EchoVault) PExpireAt(key string, unixMilliseconds int, options ...ExpireOptions) (int, error) {
func (server *SugarDB) PExpireAt(key string, unixMilliseconds int, options ...ExpireOptions) (int, error) {
cmd := []string{"PEXPIREAT", key, strconv.Itoa(unixMilliseconds)}
for _, opt := range options {
@@ -462,7 +462,7 @@ func (server *EchoVault) PExpireAt(key string, unixMilliseconds int, options ...
// `key` - string
//
// Returns: The new value as an integer.
func (server *EchoVault) Incr(key string) (int, error) {
func (server *SugarDB) Incr(key string) (int, error) {
// Construct the command
cmd := []string{"INCR", key}
@@ -484,7 +484,7 @@ func (server *EchoVault) Incr(key string) (int, error) {
// `key` - string
//
// Returns: The new value as an integer.
func (server *EchoVault) Decr(key string) (int, error) {
func (server *SugarDB) Decr(key string) (int, error) {
// Construct the command
cmd := []string{"DECR", key}
@@ -509,7 +509,7 @@ func (server *EchoVault) Decr(key string) (int, error) {
// `increment` - int - The amount by which to increment the key's value. This can be a positive or negative integer.
//
// Returns: The new value of the key after the increment operation as an integer.
func (server *EchoVault) IncrBy(key string, value string) (int, error) {
func (server *SugarDB) IncrBy(key string, value string) (int, error) {
// Construct the command
cmd := []string{"INCRBY", key, value}
// Execute the command
@@ -532,7 +532,7 @@ func (server *EchoVault) IncrBy(key string, value string) (int, error) {
// `increment` - float64 - The amount by which to increment the key's value. This can be a positive or negative float.
//
// Returns: The new value of the key after the increment operation as a float64.
func (server *EchoVault) IncrByFloat(key string, value string) (float64, error) {
func (server *SugarDB) IncrByFloat(key string, value string) (float64, error) {
// Construct the command
cmd := []string{"INCRBYFLOAT", key, value}
// Execute the command
@@ -555,7 +555,7 @@ func (server *EchoVault) IncrByFloat(key string, value string) (float64, error)
// `increment` - int - The amount by which to decrement the key's value. This can be a positive or negative integer.
//
// Returns: The new value of the key after the decrement operation as an integer.
func (server *EchoVault) DecrBy(key string, value string) (int, error) {
func (server *SugarDB) DecrBy(key string, value string) (int, error) {
// Construct the command
cmd := []string{"DECRBY", key, value}
// Execute the command
@@ -577,7 +577,7 @@ func (server *EchoVault) DecrBy(key string, value string) (int, error) {
// `newKey` - string - The new name for the key.
//
// Returns: A string indicating the success of the operation.
func (server *EchoVault) Rename(oldKey string, newKey string) (string, error) {
func (server *SugarDB) Rename(oldKey string, newKey string) (string, error) {
// Construct the command
cmd := []string{"RENAME", oldKey, newKey}
// Execute the command
@@ -591,7 +591,7 @@ func (server *EchoVault) Rename(oldKey string, newKey string) (string, error) {
// RandomKey returns a random key from the current active database.
// If no keys present in db returns an empty string.
func (server *EchoVault) RandomKey() (string, error) {
func (server *SugarDB) RandomKey() (string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"RANDOMKEY"}), nil, false, true)
if err != nil {
return "", err
@@ -607,7 +607,7 @@ func (server *EchoVault) RandomKey() (string, error) {
//
// Returns: A string representing the value at the specified key. If the value does not exist, an empty
// string is returned.
func (server *EchoVault) GetDel(key string) (string, error) {
func (server *SugarDB) GetDel(key string) (string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"GETDEL", key}), nil, false, true)
if err != nil {
return "", err
@@ -626,7 +626,7 @@ func (server *EchoVault) GetDel(key string) (string, error) {
// `unixtime` - Number of seconds or miliseconds from now.
//
// Returns: A string representing the value at the specified key. If the value does not exist, an empty string is returned.
func (server *EchoVault) GetEx(key string, option GetExOption, unixtime int) (string, error) {
func (server *SugarDB) GetEx(key string, option GetExOption, unixtime int) (string, error) {
cmd := make([]string, 2)
@@ -657,7 +657,7 @@ func (server *EchoVault) GetEx(key string, option GetExOption, unixtime int) (st
// `keys` - ...string - the keys whose access time or access count should be incremented based on eviction policy.
//
// Returns: An integer representing the number of keys successfully touched. If a key doesn't exist it is simply ignored.
func (server *EchoVault) Touch(keys ...string) (int, error) {
func (server *SugarDB) Touch(keys ...string) (int, error) {
cmd := make([]string, len(keys)+1)
cmd[0] = "TOUCH"
for i, k := range keys {
@@ -679,7 +679,7 @@ func (server *EchoVault) Touch(keys ...string) (int, error) {
// `key` - string - the key whose access frequency should be retrieved.
//
// Returns: An integer representing the access frequency. If the key doesn't exist -1 and an error is returned.
func (server *EchoVault) ObjectFreq(key string) (int, error) {
func (server *SugarDB) ObjectFreq(key string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"OBJECTFREQ", key}), nil, false, true)
if err != nil {
return -1, err
@@ -695,7 +695,7 @@ func (server *EchoVault) ObjectFreq(key string) (int, error) {
// `key` - string - the key whose last access time should be retrieved.
//
// Returns: A float64 representing the seconds since the key was last accessed. If the key doesn't exist -1 and an error is returned.
func (server *EchoVault) ObjectIdleTime(key string) (float64, error) {
func (server *SugarDB) ObjectIdleTime(key string) (float64, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"OBJECTIDLETIME", key}), nil, false, true)
if err != nil {
return -1, err
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
@@ -28,8 +28,8 @@ import (
"github.com/echovault/echovault/internal/constants"
)
func TestEchoVault_DEL(t *testing.T) {
server := createEchoVault()
func TestSugarDB_DEL(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -70,10 +70,10 @@ func TestEchoVault_DEL(t *testing.T) {
}
}
func TestEchoVault_EXPIRE(t *testing.T) {
func TestSugarDB_EXPIRE(t *testing.T) {
mockClock := clock.NewClock()
server := createEchoVault()
server := createSugarDB()
tests := []struct {
name string
@@ -243,10 +243,10 @@ func TestEchoVault_EXPIRE(t *testing.T) {
}
}
func TestEchoVault_EXPIREAT(t *testing.T) {
func TestSugarDB_EXPIREAT(t *testing.T) {
mockClock := clock.NewClock()
server := createEchoVault()
server := createSugarDB()
tests := []struct {
name string
@@ -427,10 +427,10 @@ func TestEchoVault_EXPIREAT(t *testing.T) {
}
}
func TestEchoVault_EXPIRETIME(t *testing.T) {
func TestSugarDB_EXPIRETIME(t *testing.T) {
mockClock := clock.NewClock()
server := createEchoVault()
server := createSugarDB()
tests := []struct {
name string
@@ -497,8 +497,8 @@ func TestEchoVault_EXPIRETIME(t *testing.T) {
}
}
func TestEchoVault_GET(t *testing.T) {
server := createEchoVault()
func TestSugarDB_GET(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -543,8 +543,8 @@ func TestEchoVault_GET(t *testing.T) {
}
}
func TestEchoVault_MGET(t *testing.T) {
server := createEchoVault()
func TestSugarDB_MGET(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -599,10 +599,10 @@ func TestEchoVault_MGET(t *testing.T) {
}
}
func TestEchoVault_SET(t *testing.T) {
func TestSugarDB_SET(t *testing.T) {
mockClock := clock.NewClock()
server := createEchoVault()
server := createSugarDB()
SetOptions := func(W SetWriteOption, EX SetExOption, EXTIME int, GET bool) SETOptions {
return SETOptions{
@@ -775,8 +775,8 @@ func TestEchoVault_SET(t *testing.T) {
}
}
func TestEchoVault_MSET(t *testing.T) {
server := createEchoVault()
func TestSugarDB_MSET(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -805,10 +805,10 @@ func TestEchoVault_MSET(t *testing.T) {
}
}
func TestEchoVault_PERSIST(t *testing.T) {
func TestSugarDB_PERSIST(t *testing.T) {
mockClock := clock.NewClock()
server := createEchoVault()
server := createSugarDB()
tests := []struct {
name string
@@ -862,10 +862,10 @@ func TestEchoVault_PERSIST(t *testing.T) {
}
}
func TestEchoVault_TTL(t *testing.T) {
func TestSugarDB_TTL(t *testing.T) {
mockClock := clock.NewClock()
server := createEchoVault()
server := createSugarDB()
tests := []struct {
name string
@@ -933,8 +933,8 @@ func TestEchoVault_TTL(t *testing.T) {
}
}
func TestEchoVault_INCR(t *testing.T) {
server := createEchoVault()
func TestSugarDB_INCR(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -997,8 +997,8 @@ func TestEchoVault_INCR(t *testing.T) {
}
}
func TestEchoVault_DECR(t *testing.T) {
server := createEchoVault()
func TestSugarDB_DECR(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1061,8 +1061,8 @@ func TestEchoVault_DECR(t *testing.T) {
}
}
func TestEchoVault_INCRBY(t *testing.T) {
server := createEchoVault()
func TestSugarDB_INCRBY(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1130,8 +1130,8 @@ func TestEchoVault_INCRBY(t *testing.T) {
}
}
func TestEchoVault_INCRBYFLOAT(t *testing.T) {
server := createEchoVault()
func TestSugarDB_INCRBYFLOAT(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1199,8 +1199,8 @@ func TestEchoVault_INCRBYFLOAT(t *testing.T) {
}
}
func TestEchoVault_DECRBY(t *testing.T) {
server := createEchoVault()
func TestSugarDB_DECRBY(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1267,8 +1267,8 @@ func TestEchoVault_DECRBY(t *testing.T) {
}
}
func TestEchoVault_Rename(t *testing.T) {
server := createEchoVault()
func TestSugarDB_Rename(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1322,8 +1322,8 @@ func TestEchoVault_Rename(t *testing.T) {
}
}
func TestEchoVault_RANDOMKEY(t *testing.T) {
server := createEchoVault()
func TestSugarDB_RANDOMKEY(t *testing.T) {
server := createSugarDB()
// test without keys
got, err := server.RandomKey()
@@ -1356,8 +1356,8 @@ func TestEchoVault_RANDOMKEY(t *testing.T) {
}
func TestEchoVault_GETDEL(t *testing.T) {
server := createEchoVault()
func TestSugarDB_GETDEL(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1414,9 +1414,9 @@ func TestEchoVault_GETDEL(t *testing.T) {
}
}
func TestEchoVault_GETEX(t *testing.T) {
func TestSugarDB_GETEX(t *testing.T) {
mockClock := clock.NewClock()
server := createEchoVault()
server := createSugarDB()
tests := []struct {
name string
@@ -1534,7 +1534,7 @@ func TestEchoVault_GETEX(t *testing.T) {
return
}
}
//Check value received
// Check value received
got, err := server.GetEx(tt.key, tt.getExOpt, tt.getExOptTime)
if (err != nil) != tt.wantErr {
t.Errorf("GETEX() GET error = %v, wantErr %v", err, tt.wantErr)
@@ -1559,11 +1559,11 @@ func TestEchoVault_GETEX(t *testing.T) {
}
// Tests Touch and OBJECTFREQ commands
func TestEchoVault_LFU_TOUCH(t *testing.T) {
func TestSugarDB_LFU_TOUCH(t *testing.T) {
duration := time.Duration(30) * time.Second
server := createEchoVaultWithConfig(config.Config{
server := createSugarDBWithConfig(config.Config{
DataDir: "",
EvictionPolicy: constants.AllKeysLFU,
EvictionInterval: duration,
@@ -1668,11 +1668,11 @@ func TestEchoVault_LFU_TOUCH(t *testing.T) {
}
// Tests Touch and OBJECTIDLETIME commands
func TestEchoVault_LRU_TOUCH(t *testing.T) {
func TestSugarDB_LRU_TOUCH(t *testing.T) {
duration := time.Duration(30) * time.Second
server := createEchoVaultWithConfig(config.Config{
server := createSugarDBWithConfig(config.Config{
DataDir: "",
EvictionPolicy: constants.AllKeysLRU,
EvictionInterval: duration,
+15 -15
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"github.com/echovault/echovault/internal"
@@ -43,7 +43,7 @@ type HRandFieldOptions struct {
// Errors:
//
// "value at <key> is not a hash" - when the provided key exists but is not a hash.
func (server *EchoVault) HSet(key string, fieldValuePairs map[string]string) (int, error) {
func (server *SugarDB) HSet(key string, fieldValuePairs map[string]string) (int, error) {
cmd := []string{"HSET", key}
for k, v := range fieldValuePairs {
@@ -73,7 +73,7 @@ func (server *EchoVault) HSet(key string, fieldValuePairs map[string]string) (in
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HSetNX(key string, fieldValuePairs map[string]string) (int, error) {
func (server *SugarDB) HSetNX(key string, fieldValuePairs map[string]string) (int, error) {
cmd := []string{"HSETNX", key}
for k, v := range fieldValuePairs {
@@ -101,7 +101,7 @@ func (server *EchoVault) HSetNX(key string, fieldValuePairs map[string]string) (
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HGet(key string, fields ...string) ([]string, error) {
func (server *SugarDB) HGet(key string, fields ...string) ([]string, error) {
b, err := server.handleCommand(
server.context,
internal.EncodeCommand(append([]string{"HGET", key}, fields...)),
@@ -128,7 +128,7 @@ func (server *EchoVault) HGet(key string, fields ...string) ([]string, error) {
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HMGet(key string, fields ...string) ([]string, error) {
func (server *SugarDB) HMGet(key string, fields ...string) ([]string, error) {
b, err := server.handleCommand(
server.context,
internal.EncodeCommand(append([]string{"HMGET", key}, fields...)),
@@ -157,7 +157,7 @@ func (server *EchoVault) HMGet(key string, fields ...string) ([]string, error) {
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HStrLen(key string, fields ...string) ([]int, error) {
func (server *SugarDB) HStrLen(key string, fields ...string) ([]int, error) {
cmd := append([]string{"HSTRLEN", key}, fields...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
@@ -179,7 +179,7 @@ func (server *EchoVault) HStrLen(key string, fields ...string) ([]int, error) {
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HVals(key string) ([]string, error) {
func (server *SugarDB) HVals(key string) ([]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"HVALS", key}), nil, false, true)
if err != nil {
return nil, err
@@ -200,7 +200,7 @@ func (server *EchoVault) HVals(key string) ([]string, error) {
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HRandField(key string, options HRandFieldOptions) ([]string, error) {
func (server *SugarDB) HRandField(key string, options HRandFieldOptions) ([]string, error) {
cmd := []string{"HRANDFIELD", key}
if options.Count == 0 {
@@ -232,7 +232,7 @@ func (server *EchoVault) HRandField(key string, options HRandFieldOptions) ([]st
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HLen(key string) (int, error) {
func (server *SugarDB) HLen(key string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"HLEN", key}), nil, false, true)
if err != nil {
return 0, err
@@ -251,7 +251,7 @@ func (server *EchoVault) HLen(key string) (int, error) {
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HKeys(key string) ([]string, error) {
func (server *SugarDB) HKeys(key string) ([]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"HKEYS", key}), nil, false, true)
if err != nil {
return nil, err
@@ -275,7 +275,7 @@ func (server *EchoVault) HKeys(key string) ([]string, error) {
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
//
// "value at field <field> is not a number" - when the field holds a value that is not a number.
func (server *EchoVault) HIncrBy(key, field string, increment int) (float64, error) {
func (server *SugarDB) HIncrBy(key, field string, increment int) (float64, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"HINCRBY", key, field, strconv.Itoa(increment)}), nil, false, true)
if err != nil {
return 0, err
@@ -284,7 +284,7 @@ func (server *EchoVault) HIncrBy(key, field string, increment int) (float64, err
}
// HIncrByFloat behaves like HIncrBy but with a float increment instead of an integer increment.
func (server *EchoVault) HIncrByFloat(key, field string, increment float64) (float64, error) {
func (server *SugarDB) HIncrByFloat(key, field string, increment float64) (float64, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"HINCRBYFLOAT", key, field, strconv.FormatFloat(increment, 'f', -1, 64)}), nil, false, true)
if err != nil {
return 0, err
@@ -304,7 +304,7 @@ func (server *EchoVault) HIncrByFloat(key, field string, increment float64) (flo
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HGetAll(key string) ([]string, error) {
func (server *SugarDB) HGetAll(key string) ([]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"HGETALL", key}), nil, false, true)
if err != nil {
return nil, err
@@ -325,7 +325,7 @@ func (server *EchoVault) HGetAll(key string) ([]string, error) {
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HExists(key, field string) (bool, error) {
func (server *SugarDB) HExists(key, field string) (bool, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"HEXISTS", key, field}), nil, false, true)
if err != nil {
return false, err
@@ -346,7 +346,7 @@ func (server *EchoVault) HExists(key, field string) (bool, error) {
// Errors:
//
// "value at <key> is not a hash" - when the provided key does not exist or is not a hash.
func (server *EchoVault) HDel(key string, fields ...string) (int, error) {
func (server *SugarDB) HDel(key string, fields ...string) (int, error) {
cmd := append([]string{"HDEL", key}, fields...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
@@ -21,8 +21,8 @@ import (
"testing"
)
func TestEchoVault_HDEL(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HDEL(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -86,8 +86,8 @@ func TestEchoVault_HDEL(t *testing.T) {
}
}
func TestEchoVault_HEXISTS(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HEXISTS(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -143,8 +143,8 @@ func TestEchoVault_HEXISTS(t *testing.T) {
}
}
func TestEchoVault_HGETALL(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HGETALL(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -203,8 +203,8 @@ func TestEchoVault_HGETALL(t *testing.T) {
}
}
func TestEchoVault_HINCRBY(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HINCRBY(t *testing.T) {
server := createSugarDB()
const (
HINCRBY = "HINCRBY"
@@ -315,8 +315,8 @@ func TestEchoVault_HINCRBY(t *testing.T) {
}
}
func TestEchoVault_HKEYS(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HKEYS(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -373,8 +373,8 @@ func TestEchoVault_HKEYS(t *testing.T) {
}
}
func TestEchoVault_HLEN(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HLEN(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -426,8 +426,8 @@ func TestEchoVault_HLEN(t *testing.T) {
}
}
func TestEchoVault_HRANDFIELD(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HRANDFIELD(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -558,8 +558,8 @@ func TestEchoVault_HRANDFIELD(t *testing.T) {
}
}
func TestEchoVault_HSET(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HSET(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -646,8 +646,8 @@ func TestEchoVault_HSET(t *testing.T) {
}
}
func TestEchoVault_HSTRLEN(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HSTRLEN(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -713,8 +713,8 @@ func TestEchoVault_HSTRLEN(t *testing.T) {
}
}
func TestEchoVault_HVALS(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HVALS(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -771,8 +771,8 @@ func TestEchoVault_HVALS(t *testing.T) {
}
}
func TestEchoVault_HGet(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HGet(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
presetValue interface{}
@@ -827,8 +827,8 @@ func TestEchoVault_HGet(t *testing.T) {
}
}
func TestEchoVault_HMGet(t *testing.T) {
server := createEchoVault()
func TestSugarDB_HMGet(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
presetValue interface{}
+14 -14
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"github.com/echovault/echovault/internal"
@@ -31,7 +31,7 @@ import (
// Errors:
//
// "LLen command on non-list item" - when the provided key exists but is not a list.
func (server *EchoVault) LLen(key string) (int, error) {
func (server *SugarDB) LLen(key string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"LLEN", key}), nil, false, true)
if err != nil {
return 0, err
@@ -55,7 +55,7 @@ func (server *EchoVault) LLen(key string) (int, error) {
// Errors:
//
// "LRange command on non-list item" - when the provided key exists but is not a list.
func (server *EchoVault) LRange(key string, start, end int) ([]string, error) {
func (server *SugarDB) LRange(key string, start, end int) ([]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"LRANGE", key, strconv.Itoa(start), strconv.Itoa(end)}), nil, false, true)
if err != nil {
return nil, err
@@ -76,7 +76,7 @@ func (server *EchoVault) LRange(key string, start, end int) ([]string, error) {
// Errors:
//
// "LIndex command on non-list item" - when the provided key exists but is not a list.
func (server *EchoVault) LIndex(key string, index uint) (string, error) {
func (server *SugarDB) LIndex(key string, index uint) (string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"LINDEX", key, strconv.Itoa(int(index))}), nil, false, true)
if err != nil {
return "", err
@@ -101,7 +101,7 @@ func (server *EchoVault) LIndex(key string, index uint) (string, error) {
// "LSet command on non-list item" - when the provided key exists but is not a list.
//
// "index must be within list range" - when the index is not within the list boundary.
func (server *EchoVault) LSet(key string, index int, value string) (bool, error) {
func (server *SugarDB) LSet(key string, index int, value string) (bool, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"LSET", key, strconv.Itoa(index), value}), nil, false, true)
if err != nil {
return false, err
@@ -114,7 +114,7 @@ func (server *EchoVault) LSet(key string, index int, value string) (bool, error)
// trimmed list.
//
// Returns: true if the trim is successful.
func (server *EchoVault) LTrim(key string, start int, end int) (bool, error) {
func (server *SugarDB) LTrim(key string, start int, end int) (bool, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"LTRIM", key, strconv.Itoa(start), strconv.Itoa(end)}), nil, false, true)
if err != nil {
return false, err
@@ -138,7 +138,7 @@ func (server *EchoVault) LTrim(key string, start int, end int) (bool, error) {
// Errors:
//
// "LRem command on non-list item" - when the provided key exists but is not a list.
func (server *EchoVault) LRem(key string, count int, value string) (int, error) {
func (server *SugarDB) LRem(key string, count int, value string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{
"LREM", key, strconv.Itoa(count), value}),
nil,
@@ -172,7 +172,7 @@ func (server *EchoVault) LRem(key string, count int, value string) (int, error)
// "both source and destination must be lists" - when either source or destination are not lists.
//
// "wherefrom and whereto arguments must be either LEFT or RIGHT" - if whereFrom or whereTo are not either "LEFT" or "RIGHT".
func (server *EchoVault) LMove(source, destination, whereFrom, whereTo string) (bool, error) {
func (server *SugarDB) LMove(source, destination, whereFrom, whereTo string) (bool, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"LMOVE", source, destination, whereFrom, whereTo}), nil, false, true)
if err != nil {
return false, err
@@ -192,7 +192,7 @@ func (server *EchoVault) LMove(source, destination, whereFrom, whereTo string) (
// Errors:
//
// "LPOP command on non-list item" - when the provided key is not a list.
func (server *EchoVault) LPop(key string, count uint) ([]string, error) {
func (server *SugarDB) LPop(key string, count uint) ([]string, error) {
b, err := server.handleCommand(
server.context,
internal.EncodeCommand([]string{"LPOP", key, strconv.Itoa(int(count))}),
@@ -217,7 +217,7 @@ func (server *EchoVault) LPop(key string, count uint) ([]string, error) {
// Errors:
//
// "RPOP command on non-list item" - when the provided key is not a list.
func (server *EchoVault) RPop(key string, count uint) ([]string, error) {
func (server *SugarDB) RPop(key string, count uint) ([]string, error) {
b, err := server.handleCommand(
server.context,
internal.EncodeCommand([]string{"RPOP", key, strconv.Itoa(int(count))}),
@@ -245,7 +245,7 @@ func (server *EchoVault) RPop(key string, count uint) ([]string, error) {
// Errors:
//
// "LPush command on non-list item" - when the provided key is not a list.
func (server *EchoVault) LPush(key string, values ...string) (int, error) {
func (server *SugarDB) LPush(key string, values ...string) (int, error) {
cmd := append([]string{"LPUSH", key}, values...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -267,7 +267,7 @@ func (server *EchoVault) LPush(key string, values ...string) (int, error) {
// Errors:
//
// "LPushX command on non-list item" - when the provided key is not a list or doesn't exist.
func (server *EchoVault) LPushX(key string, values ...string) (int, error) {
func (server *SugarDB) LPushX(key string, values ...string) (int, error) {
cmd := append([]string{"LPUSHX", key}, values...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -290,7 +290,7 @@ func (server *EchoVault) LPushX(key string, values ...string) (int, error) {
// Errors:
//
// "RPush command on non-list item" - when the provided key is not a list.
func (server *EchoVault) RPush(key string, values ...string) (int, error) {
func (server *SugarDB) RPush(key string, values ...string) (int, error) {
cmd := append([]string{"RPUSH", key}, values...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -312,7 +312,7 @@ func (server *EchoVault) RPush(key string, values ...string) (int, error) {
// Errors:
//
// "RPushX command on non-list item" - when the provided key is not a list or doesn't exist.
func (server *EchoVault) RPushX(key string, values ...string) (int, error) {
func (server *SugarDB) RPushX(key string, values ...string) (int, error) {
cmd := append([]string{"RPUSHX", key}, values...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
@@ -20,8 +20,8 @@ import (
"testing"
)
func TestEchoVault_LLEN(t *testing.T) {
server := createEchoVault()
func TestSugarDB_LLEN(t *testing.T) {
server := createSugarDB()
tests := []struct {
preset bool
@@ -77,8 +77,8 @@ func TestEchoVault_LLEN(t *testing.T) {
}
}
func TestEchoVault_LINDEX(t *testing.T) {
server := createEchoVault()
func TestSugarDB_LINDEX(t *testing.T) {
server := createSugarDB()
tests := []struct {
preset bool
@@ -165,8 +165,8 @@ func TestEchoVault_LINDEX(t *testing.T) {
}
}
func TestEchoVault_LMOVE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_LMOVE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -335,8 +335,8 @@ func TestEchoVault_LMOVE(t *testing.T) {
}
}
func TestEchoVault_POP(t *testing.T) {
server := createEchoVault()
func TestSugarDB_POP(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -410,8 +410,8 @@ func TestEchoVault_POP(t *testing.T) {
}
}
func TestEchoVault_LPUSH(t *testing.T) {
server := createEchoVault()
func TestSugarDB_LPUSH(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -485,8 +485,8 @@ func TestEchoVault_LPUSH(t *testing.T) {
}
}
func TestEchoVault_RPUSH(t *testing.T) {
server := createEchoVault()
func TestSugarDB_RPUSH(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -540,8 +540,8 @@ func TestEchoVault_RPUSH(t *testing.T) {
}
}
func TestEchoVault_LRANGE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_LRANGE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -659,8 +659,8 @@ func TestEchoVault_LRANGE(t *testing.T) {
}
}
func TestEchoVault_LREM(t *testing.T) {
server := createEchoVault()
func TestSugarDB_LREM(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -724,8 +724,8 @@ func TestEchoVault_LREM(t *testing.T) {
}
}
func TestEchoVault_LSET(t *testing.T) {
server := createEchoVault()
func TestSugarDB_LSET(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -829,8 +829,8 @@ func TestEchoVault_LSET(t *testing.T) {
}
}
func TestEchoVault_LTRIM(t *testing.T) {
server := createEchoVault()
func TestSugarDB_LTRIM(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"bytes"
@@ -75,7 +75,7 @@ func establishConnections(tag string) (*net.Conn, *net.Conn, error) {
//
// Returns: ReadPubSubMessage function which reads the next message sent to the subscription instance.
// This function is blocking.
func (server *EchoVault) Subscribe(tag string, channels ...string) (ReadPubSubMessage, error) {
func (server *SugarDB) Subscribe(tag string, channels ...string) (ReadPubSubMessage, error) {
readConn, writeConn, err := establishConnections(tag)
if err != nil {
return func() []string {
@@ -109,7 +109,7 @@ func (server *EchoVault) Subscribe(tag string, channels ...string) (ReadPubSubMe
// `tag` - string - The tag used to identify this subscription instance.
//
// `channels` - ...string - The list of channels to unsubscribe from.
func (server *EchoVault) Unsubscribe(tag string, channels ...string) {
func (server *SugarDB) Unsubscribe(tag string, channels ...string) {
c, ok := connections.Load(tag)
if !ok {
return
@@ -128,7 +128,7 @@ func (server *EchoVault) Unsubscribe(tag string, channels ...string) {
//
// Returns: ReadPubSubMessage function which reads the next message sent to the subscription instance.
// This function is blocking.
func (server *EchoVault) PSubscribe(tag string, patterns ...string) (ReadPubSubMessage, error) {
func (server *SugarDB) PSubscribe(tag string, patterns ...string) (ReadPubSubMessage, error) {
readConn, writeConn, err := establishConnections(tag)
if err != nil {
return func() []string {
@@ -162,7 +162,7 @@ func (server *EchoVault) PSubscribe(tag string, patterns ...string) (ReadPubSubM
// `tag` - string - The tag used to identify this subscription instance.
//
// `patterns` - ...string - The list of glob patterns to unsubscribe from.
func (server *EchoVault) PUnsubscribe(tag string, patterns ...string) {
func (server *SugarDB) PUnsubscribe(tag string, patterns ...string) {
c, ok := connections.Load(tag)
if !ok {
return
@@ -181,7 +181,7 @@ func (server *EchoVault) PUnsubscribe(tag string, patterns ...string) {
//
// Returns: true when the publish is successful. This does not indicate whether each subscriber has received the message,
// only that the message has been published.
func (server *EchoVault) Publish(channel, message string) (bool, error) {
func (server *SugarDB) Publish(channel, message string) (bool, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"PUBLISH", channel, message}), nil, false, true)
if err != nil {
return false, err
@@ -197,7 +197,7 @@ func (server *EchoVault) Publish(channel, message string) (bool, error) {
// `pattern` - string - The glob pattern used to match the channel names.
//
// Returns: A string slice of all the active channels and patterns (i.e. channels and patterns that have 1 or more subscribers).
func (server *EchoVault) PubSubChannels(pattern string) ([]string, error) {
func (server *SugarDB) PubSubChannels(pattern string) ([]string, error) {
cmd := []string{"PUBSUB", "CHANNELS"}
if pattern != "" {
cmd = append(cmd, pattern)
@@ -212,7 +212,7 @@ func (server *EchoVault) PubSubChannels(pattern string) ([]string, error) {
// PubSubNumPat returns the list of active patterns.
//
// Returns: An integer representing the number of all the active patterns (i.e. patterns that have 1 or more subscribers).
func (server *EchoVault) PubSubNumPat() (int, error) {
func (server *SugarDB) PubSubNumPat() (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"PUBSUB", "NUMPAT"}), nil, false, true)
if err != nil {
return 0, err
@@ -227,7 +227,7 @@ func (server *EchoVault) PubSubNumPat() (int, error) {
// `channels` - ...string - The list of channels whose number of subscribers is to be checked.
//
// Returns: A map of map[string]int where the key is the channel name and the value is the number of subscribers.
func (server *EchoVault) PubSubNumSub(channels ...string) (map[string]int, error) {
func (server *SugarDB) PubSubNumSub(channels ...string) (map[string]int, error) {
cmd := append([]string{"PUBSUB", "NUMSUB"}, channels...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"fmt"
@@ -22,7 +22,7 @@ import (
)
func Test_Subscribe(t *testing.T) {
server := createEchoVault()
server := createSugarDB()
// Subscribe to channels.
tag := "tag"
@@ -73,8 +73,8 @@ func Test_Subscribe(t *testing.T) {
server.Unsubscribe(tag, channels...)
}
func TestEchoVault_PSubscribe(t *testing.T) {
server := createEchoVault()
func TestSugarDB_PSubscribe(t *testing.T) {
server := createSugarDB()
// Subscribe to channels.
tag := "tag"
@@ -126,8 +126,8 @@ func TestEchoVault_PSubscribe(t *testing.T) {
server.PUnsubscribe(tag, patterns...)
}
func TestEchoVault_PubSubChannels(t *testing.T) {
server := createEchoVault()
func TestSugarDB_PubSubChannels(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
tag string
@@ -184,8 +184,8 @@ func TestEchoVault_PubSubChannels(t *testing.T) {
}
}
func TestEchoVault_PubSubNumPat(t *testing.T) {
server := createEchoVault()
func TestSugarDB_PubSubNumPat(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
tag string
@@ -223,8 +223,8 @@ func TestEchoVault_PubSubNumPat(t *testing.T) {
}
}
func TestEchoVault_PubSubNumSub(t *testing.T) {
server := createEchoVault()
func TestSugarDB_PubSubNumSub(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
subscriptions map[string]struct {
+17 -17
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"github.com/echovault/echovault/internal"
@@ -33,7 +33,7 @@ import (
// Errors:
//
// "value at <key> is not a set" - when the provided key exists but is not a set.
func (server *EchoVault) SAdd(key string, members ...string) (int, error) {
func (server *SugarDB) SAdd(key string, members ...string) (int, error) {
cmd := append([]string{"SADD", key}, members...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -53,7 +53,7 @@ func (server *EchoVault) SAdd(key string, members ...string) (int, error) {
// Errors:
//
// "value at <key> is not a set" - when the provided key exists but is not a set.
func (server *EchoVault) SCard(key string) (int, error) {
func (server *SugarDB) SCard(key string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"SCARD", key}), nil, false, true)
if err != nil {
return 0, err
@@ -75,7 +75,7 @@ func (server *EchoVault) SCard(key string) (int, error) {
// "value at <key> is not a set" - when the provided key exists but is not a set.
//
// "key for base set <key> does not exist" - if the first key is not a set.
func (server *EchoVault) SDiff(keys ...string) ([]string, error) {
func (server *SugarDB) SDiff(keys ...string) ([]string, error) {
cmd := append([]string{"SDIFF"}, keys...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -88,7 +88,7 @@ func (server *EchoVault) SDiff(keys ...string) ([]string, error) {
// at the 'destination' key.
//
// Returns: an integer representing the cardinality of the new set.
func (server *EchoVault) SDiffStore(destination string, keys ...string) (int, error) {
func (server *SugarDB) SDiffStore(destination string, keys ...string) (int, error) {
cmd := append([]string{"SDIFFSTORE", destination}, keys...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -111,7 +111,7 @@ func (server *EchoVault) SDiffStore(destination string, keys ...string) (int, er
// "value at <key> is not a set" - when the provided key exists but is not a set.
//
// "not enough sets in the keys provided" - when only one of the provided keys is a valid set.
func (server *EchoVault) SInter(keys ...string) ([]string, error) {
func (server *SugarDB) SInter(keys ...string) ([]string, error) {
cmd := append([]string{"SINTER"}, keys...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -135,7 +135,7 @@ func (server *EchoVault) SInter(keys ...string) ([]string, error) {
// "value at <key> is not a set" - when the provided key exists but is not a set.
//
// "not enough sets in the keys provided" - when only one of the provided keys is a valid set.
func (server *EchoVault) SInterCard(keys []string, limit uint) (int, error) {
func (server *SugarDB) SInterCard(keys []string, limit uint) (int, error) {
cmd := append([]string{"SINTERCARD"}, keys...)
if limit > 0 {
cmd = append(cmd, []string{"LIMIT", strconv.Itoa(int(limit))}...)
@@ -149,7 +149,7 @@ func (server *EchoVault) SInterCard(keys []string, limit uint) (int, error) {
// SInterStore works the same as SInter but instead of returning the elements in the resulting set, it is stored
// at the 'destination' key and the cardinality of the resulting set is returned.
func (server *EchoVault) SInterStore(destination string, keys ...string) (int, error) {
func (server *SugarDB) SInterStore(destination string, keys ...string) (int, error) {
cmd := append([]string{"SINTERSTORE", destination}, keys...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -171,7 +171,7 @@ func (server *EchoVault) SInterStore(destination string, keys ...string) (int, e
// Errors:
//
// "value at <key> is not a set" - when the provided key exists but is not a set.
func (server *EchoVault) SisMember(key, member string) (bool, error) {
func (server *SugarDB) SisMember(key, member string) (bool, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"SISMEMBER", key, member}), nil, false, true)
if err != nil {
return false, err
@@ -190,7 +190,7 @@ func (server *EchoVault) SisMember(key, member string) (bool, error) {
// Errors:
//
// "value at <key> is not a set" - when the provided key exists but is not a set.
func (server *EchoVault) SMembers(key string) ([]string, error) {
func (server *SugarDB) SMembers(key string) ([]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"SMEMBERS", key}), nil, false, true)
if err != nil {
return nil, err
@@ -212,7 +212,7 @@ func (server *EchoVault) SMembers(key string) ([]string, error) {
// Errors:
//
// "value at <key> is not a set" - when the provided key exists but is not a set.
func (server *EchoVault) SMisMember(key string, members ...string) ([]bool, error) {
func (server *SugarDB) SMisMember(key string, members ...string) ([]bool, error) {
cmd := append([]string{"SMISMEMBER", key}, members...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -240,7 +240,7 @@ func (server *EchoVault) SMisMember(key string, members ...string) ([]bool, erro
// "source is not a set" - when the source key does not hold a set.
//
// "destination is not a set" - when the destination key does not hold a set.
func (server *EchoVault) SMove(source, destination, member string) (bool, error) {
func (server *SugarDB) SMove(source, destination, member string) (bool, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"SMOVE", source, destination, member}), nil, false, true)
if err != nil {
return false, err
@@ -261,7 +261,7 @@ func (server *EchoVault) SMove(source, destination, member string) (bool, error)
// Errors:
//
// "value at <key> is not a set" - when the provided key exists but is not a set.
func (server *EchoVault) SPop(key string, count uint) ([]string, error) {
func (server *SugarDB) SPop(key string, count uint) ([]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"SPOP", key, strconv.Itoa(int(count))}), nil, false, true)
if err != nil {
return nil, err
@@ -283,7 +283,7 @@ func (server *EchoVault) SPop(key string, count uint) ([]string, error) {
// Errors:
//
// "value at <key> is not a set" - when the provided key exists but is not a set.
func (server *EchoVault) SRandMember(key string, count int) ([]string, error) {
func (server *SugarDB) SRandMember(key string, count int) ([]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"SRANDMEMBER", key, strconv.Itoa(count)}), nil, false, true)
if err != nil {
return nil, err
@@ -304,7 +304,7 @@ func (server *EchoVault) SRandMember(key string, count int) ([]string, error) {
// Errors:
//
// "value at <key> is not a set" - when the provided key exists but is not a set.
func (server *EchoVault) SRem(key string, members ...string) (int, error) {
func (server *SugarDB) SRem(key string, members ...string) (int, error) {
cmd := append([]string{"SREM", key}, members...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -325,7 +325,7 @@ func (server *EchoVault) SRem(key string, members ...string) (int, error) {
// Errors:
//
// "value at <key> is not a set" - when the provided key exists but is not a set.
func (server *EchoVault) SUnion(keys ...string) ([]string, error) {
func (server *SugarDB) SUnion(keys ...string) ([]string, error) {
cmd := append([]string{"SUNION"}, keys...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -338,7 +338,7 @@ func (server *EchoVault) SUnion(keys ...string) ([]string, error) {
// set at the 'destination' key. The return value is an integer representing the cardinality of the new set.
//
// Returns: an integer representing the cardinality of the new union set.
func (server *EchoVault) SUnionStore(destination string, keys ...string) (int, error) {
func (server *SugarDB) SUnionStore(destination string, keys ...string) (int, error) {
cmd := append([]string{"SUNIONSTORE", destination}, keys...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
@@ -22,8 +22,8 @@ import (
"testing"
)
func TestEchoVault_SADD(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SADD(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -79,8 +79,8 @@ func TestEchoVault_SADD(t *testing.T) {
}
}
func TestEchoVault_SCARD(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SCARD(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -132,8 +132,8 @@ func TestEchoVault_SCARD(t *testing.T) {
}
}
func TestEchoVault_SDIFF(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SDIFF(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -224,8 +224,8 @@ func TestEchoVault_SDIFF(t *testing.T) {
}
}
func TestEchoVault_SDIFFSTORE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SDIFFSTORE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -317,8 +317,8 @@ func TestEchoVault_SDIFFSTORE(t *testing.T) {
}
}
func TestEchoVault_SINTER(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SINTER(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -409,8 +409,8 @@ func TestEchoVault_SINTER(t *testing.T) {
}
}
func TestEchoVault_SINTERCARD(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SINTERCARD(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -512,8 +512,8 @@ func TestEchoVault_SINTERCARD(t *testing.T) {
}
}
func TestEchoVault_SINTERSTORE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SINTERSTORE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -605,8 +605,8 @@ func TestEchoVault_SINTERSTORE(t *testing.T) {
}
}
func TestEchoVault_SISMEMBER(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SISMEMBER(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -662,8 +662,8 @@ func TestEchoVault_SISMEMBER(t *testing.T) {
}
}
func TestEchoVault_SMEMBERS(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SMEMBERS(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -720,8 +720,8 @@ func TestEchoVault_SMEMBERS(t *testing.T) {
}
}
func TestEchoVault_SMISMEMBER(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SMISMEMBER(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -796,8 +796,8 @@ func TestEchoVault_SMISMEMBER(t *testing.T) {
}
}
func TestEchoVault_SMOVE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SMOVE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -880,8 +880,8 @@ func TestEchoVault_SMOVE(t *testing.T) {
}
}
func TestEchoVault_SPOP(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SPOP(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -931,8 +931,8 @@ func TestEchoVault_SPOP(t *testing.T) {
}
}
func TestEchoVault_SRANDMEMBER(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SRANDMEMBER(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -998,8 +998,8 @@ func TestEchoVault_SRANDMEMBER(t *testing.T) {
}
}
func TestEchoVault_SREM(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SREM(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1055,8 +1055,8 @@ func TestEchoVault_SREM(t *testing.T) {
}
}
func TestEchoVault_SUNION(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SUNION(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1140,8 +1140,8 @@ func TestEchoVault_SUNION(t *testing.T) {
}
}
func TestEchoVault_SUNIONSTORE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SUNIONSTORE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"github.com/echovault/echovault/internal"
@@ -68,9 +68,9 @@ type ZUnionStoreOptions ZInterOptions
// ZMPopOptions allows you to modify the result of the ZMPop command.
//
// Min instructs EchoVault to pop the minimum score elements. Min is higher priority than Max.
// Min instructs SugarDB to pop the minimum score elements. Min is higher priority than Max.
//
// Max instructs EchoVault to pop the maximum score elements.
// Max instructs SugarDB to pop the maximum score elements.
//
// Count specifies the number of elements to pop.
type ZMPopOptions struct {
@@ -139,7 +139,7 @@ func buildMemberScoreMap(arr [][]string, withscores bool) (map[string]float64, e
// one member-score pair.
//
// "value at <key> is not a sorted set" - when the provided key exists but is not a sorted set
func (server *EchoVault) ZAdd(key string, members map[string]float64, options ZAddOptions) (int, error) {
func (server *SugarDB) ZAdd(key string, members map[string]float64, options ZAddOptions) (int, error) {
cmd := []string{"ZADD", key}
switch {
@@ -187,7 +187,7 @@ func (server *EchoVault) ZAdd(key string, members map[string]float64, options ZA
// Errors:
//
// "value at <key> is not a sorted set" - when the provided key exists but is not a sorted set
func (server *EchoVault) ZCard(key string) (int, error) {
func (server *SugarDB) ZCard(key string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"ZCARD", key}), nil, false, true)
if err != nil {
return 0, err
@@ -210,7 +210,7 @@ func (server *EchoVault) ZCard(key string) (int, error) {
// Errors:
//
// "value at <key> is not a sorted set" - when the provided key exists but is not a sorted set
func (server *EchoVault) ZCount(key string, min, max float64) (int, error) {
func (server *SugarDB) ZCount(key string, min, max float64) (int, error) {
cmd := []string{
"ZCOUNT",
key,
@@ -239,7 +239,7 @@ func (server *EchoVault) ZCount(key string, min, max float64) (int, error) {
// Errors:
//
// "value at <key> is not a sorted set" - when the provided key exists but is not a sorted set.
func (server *EchoVault) ZDiff(withscores bool, keys ...string) (map[string]float64, error) {
func (server *SugarDB) ZDiff(withscores bool, keys ...string) (map[string]float64, error) {
cmd := append([]string{"ZDIFF"}, keys...)
if withscores {
cmd = append(cmd, "WITHSCORES")
@@ -271,7 +271,7 @@ func (server *EchoVault) ZDiff(withscores bool, keys ...string) (map[string]floa
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZDiffStore(destination string, keys ...string) (int, error) {
func (server *SugarDB) ZDiffStore(destination string, keys ...string) (int, error) {
cmd := append([]string{"ZDIFFSTORE", destination}, keys...)
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -294,7 +294,7 @@ func (server *EchoVault) ZDiffStore(destination string, keys ...string) (int, er
// Errors:
//
// "value at <key> is not a sorted set" - when the provided key exists but is not a sorted set.
func (server *EchoVault) ZInter(keys []string, options ZInterOptions) (map[string]float64, error) {
func (server *SugarDB) ZInter(keys []string, options ZInterOptions) (map[string]float64, error) {
cmd := append([]string{"ZINTER"}, keys...)
if len(options.Weights) > 0 {
@@ -341,7 +341,7 @@ func (server *EchoVault) ZInter(keys []string, options ZInterOptions) (map[strin
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZInterStore(destination string, keys []string, options ZInterStoreOptions) (int, error) {
func (server *SugarDB) ZInterStore(destination string, keys []string, options ZInterStoreOptions) (int, error) {
cmd := append([]string{"ZINTERSTORE", destination}, keys...)
if len(options.Weights) > 0 {
@@ -381,7 +381,7 @@ func (server *EchoVault) ZInterStore(destination string, keys []string, options
// Errors:
//
// "value at <key> is not a sorted set" - when the provided key exists but is not a sorted set.
func (server *EchoVault) ZUnion(keys []string, options ZUnionOptions) (map[string]float64, error) {
func (server *SugarDB) ZUnion(keys []string, options ZUnionOptions) (map[string]float64, error) {
cmd := append([]string{"ZUNION"}, keys...)
if len(options.Weights) > 0 {
@@ -428,7 +428,7 @@ func (server *EchoVault) ZUnion(keys []string, options ZUnionOptions) (map[strin
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZUnionStore(destination string, keys []string, options ZUnionStoreOptions) (int, error) {
func (server *SugarDB) ZUnionStore(destination string, keys []string, options ZUnionStoreOptions) (int, error) {
cmd := append([]string{"ZUNIONSTORE", destination}, keys...)
if len(options.Weights) > 0 {
@@ -470,7 +470,7 @@ func (server *EchoVault) ZUnionStore(destination string, keys []string, options
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZIncrBy(key string, increment float64, member string) (float64, error) {
func (server *SugarDB) ZIncrBy(key string, increment float64, member string) (float64, error) {
cmd := []string{"ZINCRBY", key, strconv.FormatFloat(increment, 'f', -1, 64), member}
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -497,7 +497,7 @@ func (server *EchoVault) ZIncrBy(key string, increment float64, member string) (
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZMPop(keys []string, options ZMPopOptions) ([][]string, error) {
func (server *SugarDB) ZMPop(keys []string, options ZMPopOptions) ([][]string, error) {
cmd := append([]string{"ZMPOP"}, keys...)
switch {
@@ -539,7 +539,7 @@ func (server *EchoVault) ZMPop(keys []string, options ZMPopOptions) ([][]string,
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZMScore(key string, members ...string) ([]interface{}, error) {
func (server *SugarDB) ZMScore(key string, members ...string) ([]interface{}, error) {
cmd := []string{"ZMSCORE", key}
for _, member := range members {
cmd = append(cmd, member)
@@ -588,7 +588,7 @@ func (server *EchoVault) ZMScore(key string, members ...string) ([]interface{},
// Errors:
//
// "value at <key> is not a sorted set" - when the provided key exists but is not a sorted set
func (server *EchoVault) ZLexCount(key, min, max string) (int, error) {
func (server *SugarDB) ZLexCount(key, min, max string) (int, error) {
cmd := []string{"ZLEXCOUNT", key, min, max}
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -613,7 +613,7 @@ func (server *EchoVault) ZLexCount(key, min, max string) (int, error) {
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZPopMax(key string, count uint) ([][]string, error) {
func (server *SugarDB) ZPopMax(key string, count uint) ([][]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"ZPOPMAX", key, strconv.Itoa(int(count))}), nil, false, true)
if err != nil {
return nil, err
@@ -637,7 +637,7 @@ func (server *EchoVault) ZPopMax(key string, count uint) ([][]string, error) {
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZPopMin(key string, count uint) ([][]string, error) {
func (server *SugarDB) ZPopMin(key string, count uint) ([][]string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"ZPOPMIN", key, strconv.Itoa(int(count))}), nil, false, true)
if err != nil {
return nil, err
@@ -666,7 +666,7 @@ func (server *EchoVault) ZPopMin(key string, count uint) ([][]string, error) {
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZRandMember(key string, count int, withscores bool) ([][]string, error) {
func (server *SugarDB) ZRandMember(key string, count int, withscores bool) ([][]string, error) {
cmd := []string{"ZRANDMEMBER", key}
if count != 0 {
cmd = append(cmd, strconv.Itoa(count))
@@ -701,7 +701,7 @@ func (server *EchoVault) ZRandMember(key string, count int, withscores bool) ([]
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZRank(key string, member string, withscores bool) (map[int]float64, error) {
func (server *SugarDB) ZRank(key string, member string, withscores bool) (map[int]float64, error) {
cmd := []string{"ZRANK", key, member}
if withscores {
cmd = append(cmd, "WITHSCORES")
@@ -738,7 +738,7 @@ func (server *EchoVault) ZRank(key string, member string, withscores bool) (map[
// ZRevRank works the same as ZRank but derives the member's rank based on ascending order of
// the members' scores.
func (server *EchoVault) ZRevRank(key string, member string, withscores bool) (map[int]float64, error) {
func (server *SugarDB) ZRevRank(key string, member string, withscores bool) (map[int]float64, error) {
cmd := []string{"ZREVRANK", key, member}
if withscores {
cmd = append(cmd, "WITHSCORES")
@@ -787,7 +787,7 @@ func (server *EchoVault) ZRevRank(key string, member string, withscores bool) (m
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZScore(key string, member string) (interface{}, error) {
func (server *SugarDB) ZScore(key string, member string) (interface{}, error) {
cmd := []string{"ZSCORE", key, member}
b, err := server.handleCommand(server.context, internal.EncodeCommand(cmd), nil, false, true)
if err != nil {
@@ -824,7 +824,7 @@ func (server *EchoVault) ZScore(key string, member string) (interface{}, error)
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZRem(key string, members ...string) (int, error) {
func (server *SugarDB) ZRem(key string, members ...string) (int, error) {
cmd := []string{"ZREM", key}
for _, member := range members {
cmd = append(cmd, member)
@@ -851,7 +851,7 @@ func (server *EchoVault) ZRem(key string, members ...string) (int, error) {
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZRemRangeByScore(key string, min float64, max float64) (int, error) {
func (server *SugarDB) ZRemRangeByScore(key string, min float64, max float64) (int, error) {
cmd := []string{
"ZREMRANGEBYSCORE",
key,
@@ -882,7 +882,7 @@ func (server *EchoVault) ZRemRangeByScore(key string, min float64, max float64)
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZRemRangeByLex(key, min, max string) (int, error) {
func (server *SugarDB) ZRemRangeByLex(key, min, max string) (int, error) {
b, err := server.handleCommand(
server.context, internal.EncodeCommand([]string{"ZREMRANGEBYLEX", key, min, max}),
nil,
@@ -910,7 +910,7 @@ func (server *EchoVault) ZRemRangeByLex(key, min, max string) (int, error) {
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZRemRangeByRank(key string, min, max int) (int, error) {
func (server *SugarDB) ZRemRangeByRank(key string, min, max int) (int, error) {
b, err := server.handleCommand(
server.context, internal.EncodeCommand([]string{"ZREMRANGEBYRANK", key, strconv.Itoa(min), strconv.Itoa(max)}),
nil,
@@ -940,7 +940,7 @@ func (server *EchoVault) ZRemRangeByRank(key string, min, max int) (int, error)
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZRange(key, start, stop string, options ZRangeOptions) (map[string]float64, error) {
func (server *SugarDB) ZRange(key, start, stop string, options ZRangeOptions) (map[string]float64, error) {
cmd := []string{"ZRANGE", key, start, stop}
switch {
@@ -994,7 +994,7 @@ func (server *EchoVault) ZRange(key, start, stop string, options ZRangeOptions)
// Errors:
//
// "value at <key> is not a sorted set" - when a key exists but is not a sorted set.
func (server *EchoVault) ZRangeStore(destination, source, start, stop string, options ZRangeStoreOptions) (int, error) {
func (server *SugarDB) ZRangeStore(destination, source, start, stop string, options ZRangeStoreOptions) (int, error) {
cmd := []string{"ZRANGESTORE", destination, source, start, stop}
switch {
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
@@ -24,8 +24,8 @@ import (
"testing"
)
func TestEchoVault_ZADD(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZADD(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -248,8 +248,8 @@ func TestEchoVault_ZADD(t *testing.T) {
}
}
func TestEchoVault_ZCARD(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZCARD(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -309,8 +309,8 @@ func TestEchoVault_ZCARD(t *testing.T) {
}
}
func TestEchoVault_ZCOUNT(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZCOUNT(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -408,8 +408,8 @@ func TestEchoVault_ZCOUNT(t *testing.T) {
}
}
func TestEchoVault_ZDIFF(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZDIFF(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -558,8 +558,8 @@ func TestEchoVault_ZDIFF(t *testing.T) {
}
}
func TestEchoVault_ZDIFFSTORE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZDIFFSTORE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -677,8 +677,8 @@ func TestEchoVault_ZDIFFSTORE(t *testing.T) {
}
}
func TestEchoVault_ZINCRBY(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZINCRBY(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -825,8 +825,8 @@ func TestEchoVault_ZINCRBY(t *testing.T) {
}
}
func TestEchoVault_ZINTER(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZINTER(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1136,8 +1136,8 @@ func TestEchoVault_ZINTER(t *testing.T) {
}
}
func TestEchoVault_ZINTERSTORE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZINTERSTORE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1461,8 +1461,8 @@ func TestEchoVault_ZINTERSTORE(t *testing.T) {
}
}
func TestEchoVault_ZLEXCOUNT(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZLEXCOUNT(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1552,8 +1552,8 @@ func TestEchoVault_ZLEXCOUNT(t *testing.T) {
}
}
func TestEchoVault_ZMPOP(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZMPOP(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1706,8 +1706,8 @@ func TestEchoVault_ZMPOP(t *testing.T) {
}
}
func TestEchoVault_ZMSCORE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZMSCORE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1785,8 +1785,8 @@ func TestEchoVault_ZMSCORE(t *testing.T) {
}
}
func TestEchoVault_ZPOP(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZPOP(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1891,8 +1891,8 @@ func TestEchoVault_ZPOP(t *testing.T) {
}
}
func TestEchoVault_ZRANDMEMBER(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZRANDMEMBER(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -1965,8 +1965,8 @@ func TestEchoVault_ZRANDMEMBER(t *testing.T) {
}
}
func TestEchoVault_ZRANGE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZRANGE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -2128,8 +2128,8 @@ func TestEchoVault_ZRANGE(t *testing.T) {
}
}
func TestEchoVault_ZRANGESTORE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZRANGESTORE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -2340,8 +2340,8 @@ func TestEchoVault_ZRANGESTORE(t *testing.T) {
}
}
func TestEchoVault_ZRANK(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZRANK(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -2437,8 +2437,8 @@ func TestEchoVault_ZRANK(t *testing.T) {
}
}
func TestEchoVault_ZREM(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZREM(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -2506,8 +2506,8 @@ func TestEchoVault_ZREM(t *testing.T) {
}
}
func TestEchoVault_ZREMRANGEBYSCORE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZREMRANGEBYSCORE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -2576,8 +2576,8 @@ func TestEchoVault_ZREMRANGEBYSCORE(t *testing.T) {
}
}
func TestEchoVault_ZSCORE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZSCORE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -2654,8 +2654,8 @@ func TestEchoVault_ZSCORE(t *testing.T) {
}
}
func TestEchoVault_ZUNION(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZUNION(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -2990,8 +2990,8 @@ func TestEchoVault_ZUNION(t *testing.T) {
}
}
func TestEchoVault_ZUNIONSTORE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZUNIONSTORE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -3300,8 +3300,8 @@ func TestEchoVault_ZUNIONSTORE(t *testing.T) {
}
}
func TestEchoVault_ZRevRank(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZRevRank(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -3397,8 +3397,8 @@ func TestEchoVault_ZRevRank(t *testing.T) {
}
}
func TestEchoVault_ZRemRangeByLex(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZRemRangeByLex(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
key string
@@ -3478,8 +3478,8 @@ func TestEchoVault_ZRemRangeByLex(t *testing.T) {
}
}
func TestEchoVault_ZRemRangeByRank(t *testing.T) {
server := createEchoVault()
func TestSugarDB_ZRemRangeByRank(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
key string
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"strconv"
@@ -28,7 +28,7 @@ import (
// Errors:
//
// - "value at key <key> is not a string" when the key provided does not hold a string.
func (server *EchoVault) SetRange(key string, offset int, new string) (int, error) {
func (server *SugarDB) SetRange(key string, offset int, new string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"SETRANGE", key, strconv.Itoa(offset), new}), nil, false, true)
if err != nil {
return 0, err
@@ -43,7 +43,7 @@ func (server *EchoVault) SetRange(key string, offset int, new string) (int, erro
// Errors:
//
// - "value at key <key> is not a string" - when the value at the keys is not a string.
func (server *EchoVault) StrLen(key string) (int, error) {
func (server *SugarDB) StrLen(key string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"STRLEN", key}), nil, false, true)
if err != nil {
return 0, err
@@ -61,7 +61,7 @@ func (server *EchoVault) StrLen(key string) (int, error) {
// - "key <key> does not exist" - when the key does not exist.
//
// - "value at key <key> is not a string" - when the value at the keys is not a string.
func (server *EchoVault) SubStr(key string, start, end int) (string, error) {
func (server *SugarDB) SubStr(key string, start, end int) (string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"SUBSTR", key, strconv.Itoa(start), strconv.Itoa(end)}), nil, false, true)
if err != nil {
return "", err
@@ -70,7 +70,7 @@ func (server *EchoVault) SubStr(key string, start, end int) (string, error) {
}
// GetRange works the same as SubStr.
func (server *EchoVault) GetRange(key string, start, end int) (string, error) {
func (server *SugarDB) GetRange(key string, start, end int) (string, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"GETRANGE", key, strconv.Itoa(start), strconv.Itoa(end)}), nil, false, true)
if err != nil {
return "", err
@@ -86,7 +86,7 @@ func (server *EchoVault) GetRange(key string, start, end int) (string, error) {
// Errors:
//
// - "value at key <key> is not a string" - when the value at the keys is not a string.
func (server *EchoVault) Append(key string, value string) (int, error) {
func (server *SugarDB) Append(key string, value string) (int, error) {
b, err := server.handleCommand(server.context, internal.EncodeCommand([]string{"APPEND", key, value}), nil, false, true)
if err != nil {
return 0, err
@@ -12,15 +12,15 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
"testing"
)
func TestEchoVault_SUBSTR(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SUBSTR(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -178,8 +178,8 @@ func TestEchoVault_SUBSTR(t *testing.T) {
}
}
func TestEchoVault_SETRANGE(t *testing.T) {
server := createEchoVault()
func TestSugarDB_SETRANGE(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -266,8 +266,8 @@ func TestEchoVault_SETRANGE(t *testing.T) {
}
}
func TestEchoVault_STRLEN(t *testing.T) {
server := createEchoVault()
func TestSugarDB_STRLEN(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
@@ -312,8 +312,8 @@ func TestEchoVault_STRLEN(t *testing.T) {
}
}
func TestEchoVault_APPEND(t *testing.T) {
server := createEchoVault()
func TestSugarDB_APPEND(t *testing.T) {
server := createSugarDB()
tests := []struct {
name string
presetValue interface{}
+4 -4
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
@@ -22,11 +22,11 @@ import (
"time"
)
func (server *EchoVault) isInCluster() bool {
func (server *SugarDB) isInCluster() bool {
return server.config.BootstrapCluster || server.config.JoinAddr != ""
}
func (server *EchoVault) raftApplyDeleteKey(ctx context.Context, key string) error {
func (server *SugarDB) raftApplyDeleteKey(ctx context.Context, key string) error {
serverId, _ := ctx.Value(internal.ContextServerID("ServerID")).(string)
protocol, _ := ctx.Value("Protocol").(int)
database, _ := ctx.Value("Database").(int)
@@ -64,7 +64,7 @@ func (server *EchoVault) raftApplyDeleteKey(ctx context.Context, key string) err
return nil
}
func (server *EchoVault) raftApplyCommand(ctx context.Context, cmd []string) ([]byte, error) {
func (server *SugarDB) raftApplyCommand(ctx context.Context, cmd []string) ([]byte, error) {
serverId, _ := ctx.Value(internal.ContextServerID("ServerID")).(string)
connectionId, _ := ctx.Value(internal.ContextConnID("ConnectionID")).(string)
protocol, _ := ctx.Value("Protocol").(int)
+331
View File
@@ -0,0 +1,331 @@
// Copyright 2024 Kelvin Clement Mwinuka
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package sugardb
import (
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants"
"time"
)
// DefaultConfig returns the default configuration.
// This should be used when using SugarDB as an embedded library.
func DefaultConfig() config.Config {
return config.DefaultConfig()
}
func (server *SugarDB) GetServerInfo() internal.ServerInfo {
return internal.ServerInfo{
Server: "echovault",
Version: constants.Version,
Id: server.config.ServerID,
Mode: func() string {
if server.isInCluster() {
return "cluster"
}
return "standalone"
}(),
Role: func() string {
if !server.isInCluster() {
return "master"
}
if server.raft.IsRaftLeader() {
return "master"
}
return "replica"
}(),
Modules: server.ListModules(),
}
}
// WithTLS is an option to the NewSugarDB function that allows you to pass a
// custom TLS to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithTLS(b ...bool) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
if len(b) > 0 {
echovault.config.TLS = b[0]
} else {
echovault.config.TLS = true
}
}
}
// WithMTLS is an option to the NewSugarDB function that allows you to pass a
// custom MTLS to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithMTLS(b ...bool) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
if len(b) > 0 {
echovault.config.MTLS = b[0]
} else {
echovault.config.MTLS = true
}
}
}
// CertKeyPair defines the paths to the cert and key pair files respectively.
type CertKeyPair struct {
Cert string
Key string
}
// WithCertKeyPairs is an option to the NewSugarDB function that allows you to pass a
// custom CertKeyPairs to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithCertKeyPairs(certKeyPairs []CertKeyPair) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
for _, pair := range certKeyPairs {
echovault.config.CertKeyPairs = append(echovault.config.CertKeyPairs, []string{pair.Cert, pair.Key})
}
}
}
// WithClientCAs is an option to the NewSugarDB function that allows you to pass a
// custom ClientCAs to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithClientCAs(clientCAs []string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.ClientCAs = clientCAs
}
}
// WithPort is an option to the NewSugarDB function that allows you to pass a
// custom Port to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithPort(port uint16) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.Port = port
}
}
// WithServerID is an option to the NewSugarDB function that allows you to pass a
// custom ServerID to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithServerID(serverID string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.ServerID = serverID
}
}
// WithJoinAddr is an option to the NewSugarDB function that allows you to pass a
// custom JoinAddr to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithJoinAddr(joinAddr string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.JoinAddr = joinAddr
}
}
// WithBindAddr is an option to the NewSugarDB function that allows you to pass a
// custom BindAddr to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithBindAddr(bindAddr string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.BindAddr = bindAddr
}
}
// WithDataDir is an option to the NewSugarDB function that allows you to pass a
// custom DataDir to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithDataDir(dataDir string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.DataDir = dataDir
}
}
// WithBootstrapCluster is an option to the NewSugarDB function that allows you to pass a
// custom BootstrapCluster to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithBootstrapCluster(b ...bool) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
if len(b) > 0 {
echovault.config.BootstrapCluster = b[0]
} else {
echovault.config.BootstrapCluster = true
}
}
}
// WithAclConfig is an option to the NewSugarDB function that allows you to pass a
// custom AclConfig to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithAclConfig(aclConfig string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.AclConfig = aclConfig
}
}
// WithForwardCommand is an option to the NewSugarDB function that allows you to pass a
// custom ForwardCommand to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithForwardCommand(b ...bool) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
if len(b) > 0 {
echovault.config.ForwardCommand = b[0]
} else {
echovault.config.ForwardCommand = true
}
}
}
// WithRequirePass is an option to the NewSugarDB function that allows you to pass a
// custom RequirePass to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithRequirePass(b ...bool) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
if len(b) > 0 {
echovault.config.RequirePass = b[0]
} else {
echovault.config.RequirePass = true
}
}
}
// WithPassword is an option to the NewSugarDB function that allows you to pass a
// custom Password to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithPassword(password string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.Password = password
}
}
// WithSnapShotThreshold is an option to the NewSugarDB function that allows you to pass a
// custom SnapShotThreshold to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithSnapShotThreshold(snapShotThreshold uint64) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.SnapShotThreshold = snapShotThreshold
}
}
// WithSnapshotInterval is an option to the NewSugarDB function that allows you to pass a
// custom SnapshotInterval to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithSnapshotInterval(snapshotInterval time.Duration) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.SnapshotInterval = snapshotInterval
}
}
// WithRestoreSnapshot is an option to the NewSugarDB function that allows you to pass a
// custom RestoreSnapshot to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithRestoreSnapshot(b ...bool) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
if len(b) > 0 {
echovault.config.RestoreSnapshot = b[0]
} else {
echovault.config.RestoreSnapshot = true
}
}
}
// WithRestoreAOF is an option to the NewSugarDB function that allows you to pass a
// custom RestoreAOF to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithRestoreAOF(b ...bool) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
if len(b) > 0 {
echovault.config.RestoreAOF = b[0]
} else {
echovault.config.RestoreAOF = true
}
}
}
// WithAOFSyncStrategy is an option to the NewSugarDB function that allows you to pass a
// custom AOFSyncStrategy to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithAOFSyncStrategy(aOFSyncStrategy string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.AOFSyncStrategy = aOFSyncStrategy
}
}
// WithMaxMemory is an option to the NewSugarDB function that allows you to pass a
// custom MaxMemory to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithMaxMemory(maxMemory uint64) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.MaxMemory = maxMemory
}
}
// WithEvictionPolicy is an option to the NewSugarDB function that allows you to pass a
// custom EvictionPolicy to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithEvictionPolicy(evictionPolicy string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.EvictionPolicy = evictionPolicy
}
}
// WithEvictionSample is an option to the NewSugarDB function that allows you to pass a
// custom EvictionSample to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithEvictionSample(evictionSample uint) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.EvictionSample = evictionSample
}
}
// WithEvictionInterval is an option to the NewSugarDB function that allows you to pass a
// custom EvictionInterval to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithEvictionInterval(evictionInterval time.Duration) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.EvictionInterval = evictionInterval
}
}
// WithModules is an option to the NewSugarDB function that allows you to pass a
// custom Modules to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithModules(modules []string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.Modules = modules
}
}
// WithDiscoveryPort is an option to the NewSugarDB function that allows you to pass a
// custom DiscoveryPort to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithDiscoveryPort(discoveryPort uint16) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.DiscoveryPort = discoveryPort
}
}
// WithRaftBindAddr is an option to the NewSugarDB function that allows you to pass a
// custom RaftBindAddr to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithRaftBindAddr(raftBindAddr string) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.RaftBindAddr = raftBindAddr
}
}
// WithRaftBindPort is an option to the NewSugarDB function that allows you to pass a
// custom RaftBindPort to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithRaftBindPort(raftBindPort uint16) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config.RaftBindPort = raftBindPort
}
}
+17 -17
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"container/heap"
@@ -35,7 +35,7 @@ import (
// It also swaps every TCP client connection from database2 over to database1.
// This only affects TCP connections, it does not swap the logical database currently
// being used by the embedded API.
func (server *EchoVault) SwapDBs(database1, database2 int) {
func (server *SugarDB) SwapDBs(database1, database2 int) {
// If the databases are the same, skip the swap.
if database1 == database2 {
return
@@ -75,7 +75,7 @@ func (server *EchoVault) SwapDBs(database1, database2 int) {
// Flush flushes all the data from the database at the specified index.
// When -1 is passed, all the logical databases are cleared.
func (server *EchoVault) Flush(database int) {
func (server *SugarDB) Flush(database int) {
server.storeLock.Lock()
defer server.storeLock.Unlock()
@@ -114,7 +114,7 @@ func (server *EchoVault) Flush(database int) {
server.lruCache.cache[database].Mutex.Unlock()
}
func (server *EchoVault) keysExist(ctx context.Context, keys []string) map[string]bool {
func (server *SugarDB) keysExist(ctx context.Context, keys []string) map[string]bool {
server.storeLock.RLock()
defer server.storeLock.RUnlock()
@@ -130,7 +130,7 @@ func (server *EchoVault) keysExist(ctx context.Context, keys []string) map[strin
return exists
}
func (server *EchoVault) getExpiry(ctx context.Context, key string) time.Time {
func (server *SugarDB) getExpiry(ctx context.Context, key string) time.Time {
server.storeLock.RLock()
defer server.storeLock.RUnlock()
@@ -144,7 +144,7 @@ func (server *EchoVault) getExpiry(ctx context.Context, key string) time.Time {
return entry.ExpireAt
}
func (server *EchoVault) getValues(ctx context.Context, keys []string) map[string]interface{} {
func (server *SugarDB) getValues(ctx context.Context, keys []string) map[string]interface{} {
server.storeLock.Lock()
defer server.storeLock.Unlock()
@@ -195,7 +195,7 @@ func (server *EchoVault) getValues(ctx context.Context, keys []string) map[strin
return values
}
func (server *EchoVault) setValues(ctx context.Context, entries map[string]interface{}) error {
func (server *SugarDB) setValues(ctx context.Context, entries map[string]interface{}) error {
server.storeLock.Lock()
defer server.storeLock.Unlock()
@@ -237,7 +237,7 @@ func (server *EchoVault) setValues(ctx context.Context, entries map[string]inter
return nil
}
func (server *EchoVault) setExpiry(ctx context.Context, key string, expireAt time.Time, touch bool) {
func (server *SugarDB) setExpiry(ctx context.Context, key string, expireAt time.Time, touch bool) {
server.storeLock.Lock()
defer server.storeLock.Unlock()
@@ -266,7 +266,7 @@ func (server *EchoVault) setExpiry(ctx context.Context, key string, expireAt tim
}
}
func (server *EchoVault) deleteKey(ctx context.Context, key string) error {
func (server *SugarDB) deleteKey(ctx context.Context, key string) error {
database := ctx.Value("Database").(int)
// Delete the key from keyLocks and store.
@@ -292,7 +292,7 @@ func (server *EchoVault) deleteKey(ctx context.Context, key string) error {
return nil
}
func (server *EchoVault) createDatabase(database int) {
func (server *SugarDB) createDatabase(database int) {
// Create database store.
server.store[database] = make(map[string]internal.KeyData)
@@ -312,7 +312,7 @@ func (server *EchoVault) createDatabase(database int) {
server.lruCache.cache[database] = eviction.NewCacheLRU()
}
func (server *EchoVault) getState() map[int]map[string]interface{} {
func (server *SugarDB) getState() map[int]map[string]interface{} {
// Wait unit there's no state mutation or copy in progress before starting a new copy process.
for {
if !server.stateCopyInProgress.Load() && !server.stateMutationInProgress.Load() {
@@ -333,7 +333,7 @@ func (server *EchoVault) getState() map[int]map[string]interface{} {
// updateKeysInCache updates either the key access count or the most recent access time in the cache
// depending on whether an LFU or LRU strategy was used.
func (server *EchoVault) updateKeysInCache(ctx context.Context, keys []string) (int64, error) {
func (server *SugarDB) updateKeysInCache(ctx context.Context, keys []string) (int64, error) {
database := ctx.Value("Database").(int)
var touchCounter int64
@@ -411,7 +411,7 @@ func (server *EchoVault) updateKeysInCache(ctx context.Context, keys []string) (
}
// adjustMemoryUsage should only be called from standalone echovault or from raft cluster leader.
func (server *EchoVault) adjustMemoryUsage(ctx context.Context) error {
func (server *SugarDB) adjustMemoryUsage(ctx context.Context) error {
// If max memory is 0, there's no need to adjust memory usage.
if server.config.MaxMemory == 0 {
return nil
@@ -583,7 +583,7 @@ func (server *EchoVault) adjustMemoryUsage(ctx context.Context) error {
// This function will sample 20 keys from the list of keys with an associated TTL,
// if the key is expired, it will be evicted.
// This function is only executed in standalone mode or by the raft cluster leader.
func (server *EchoVault) evictKeysWithExpiredTTL(ctx context.Context) error {
func (server *SugarDB) evictKeysWithExpiredTTL(ctx context.Context) error {
// Only execute this if we're in standalone mode, or raft cluster leader.
if server.isInCluster() && !server.raft.IsRaftLeader() {
return nil
@@ -653,7 +653,7 @@ func (server *EchoVault) evictKeysWithExpiredTTL(ctx context.Context) error {
return nil
}
func (server *EchoVault) randomKey(ctx context.Context) string {
func (server *SugarDB) randomKey(ctx context.Context) string {
server.storeLock.RLock()
defer server.storeLock.RUnlock()
@@ -681,7 +681,7 @@ func (server *EchoVault) randomKey(ctx context.Context) string {
return randkey
}
func (server *EchoVault) getObjectFreq(ctx context.Context, key string) (int, error) {
func (server *SugarDB) getObjectFreq(ctx context.Context, key string) (int, error) {
database := ctx.Value("Database").(int)
var freq int
@@ -701,7 +701,7 @@ func (server *EchoVault) getObjectFreq(ctx context.Context, key string) (int, er
return freq, nil
}
func (server *EchoVault) getObjectIdleTime(ctx context.Context, key string) (float64, error) {
func (server *SugarDB) getObjectIdleTime(ctx context.Context, key string) (float64, error) {
database := ctx.Value("Database").(int)
var accessTime int64
+8 -8
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
@@ -26,7 +26,7 @@ import (
"strings"
)
func (server *EchoVault) getCommand(cmd string) (internal.Command, error) {
func (server *SugarDB) getCommand(cmd string) (internal.Command, error) {
server.commandsRWMut.RLock()
defer server.commandsRWMut.RUnlock()
for _, command := range server.commands {
@@ -37,7 +37,7 @@ func (server *EchoVault) getCommand(cmd string) (internal.Command, error) {
return internal.Command{}, fmt.Errorf("command %s not supported", cmd)
}
func (server *EchoVault) getHandlerFuncParams(ctx context.Context, cmd []string, conn *net.Conn) internal.HandlerFuncParams {
func (server *SugarDB) getHandlerFuncParams(ctx context.Context, cmd []string, conn *net.Conn) internal.HandlerFuncParams {
return internal.HandlerFuncParams{
Context: ctx,
Command: cmd,
@@ -103,7 +103,7 @@ func (server *EchoVault) getHandlerFuncParams(ctx context.Context, cmd []string,
}
}
func (server *EchoVault) handleCommand(ctx context.Context, message []byte, conn *net.Conn, replay bool, embedded bool) ([]byte, error) {
func (server *SugarDB) handleCommand(ctx context.Context, message []byte, conn *net.Conn, replay bool, embedded bool) ([]byte, error) {
// Prepare context before processing the command.
server.connInfo.mut.RLock()
if embedded && !replay {
@@ -207,18 +207,18 @@ func (server *EchoVault) handleCommand(ctx context.Context, message []byte, conn
return nil, errors.New("not cluster leader, cannot carry out command")
}
func (server *EchoVault) getCommands() []internal.Command {
func (server *SugarDB) getCommands() []internal.Command {
return server.commands
}
func (server *EchoVault) getACL() interface{} {
func (server *SugarDB) getACL() interface{} {
return server.acl
}
func (server *EchoVault) getPubSub() interface{} {
func (server *SugarDB) getPubSub() interface{} {
return server.pubSub
}
func (server *EchoVault) getClock() clock.Clock {
func (server *SugarDB) getClock() clock.Clock {
return server.clock
}
+5 -5
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
@@ -26,7 +26,7 @@ import (
"strings"
)
// LoadModule loads an external module into EchoVault ar runtime.
// LoadModule loads an external module into SugarDB ar runtime.
//
// Parameters:
//
@@ -34,7 +34,7 @@ import (
//
// `args` - ...string - A list of args that will be passed unmodified to the plugins command's
// KeyExtractionFunc and HandlerFunc
func (server *EchoVault) LoadModule(path string, args ...string) error {
func (server *SugarDB) LoadModule(path string, args ...string) error {
server.commandsRWMut.Lock()
defer server.commandsRWMut.Unlock()
@@ -162,7 +162,7 @@ func (server *EchoVault) LoadModule(path string, args ...string) error {
// Parameters:
//
// `module` - string - module name as displayed by the ListModules method.
func (server *EchoVault) UnloadModule(module string) {
func (server *SugarDB) UnloadModule(module string) {
server.commandsRWMut.Lock()
defer server.commandsRWMut.Unlock()
server.commands = slices.DeleteFunc(server.commands, func(command internal.Command) bool {
@@ -173,7 +173,7 @@ func (server *EchoVault) UnloadModule(module string) {
// ListModules lists the currently loaded modules
//
// Returns: a string slice representing all the currently loaded modules.
func (server *EchoVault) ListModules() []string {
func (server *SugarDB) ListModules() []string {
server.commandsRWMut.RLock()
defer server.commandsRWMut.RUnlock()
var modules []string
+100 -100
View File
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"context"
@@ -48,7 +48,7 @@ import (
"time"
)
type EchoVault struct {
type SugarDB struct {
// clock is an implementation of a time interface that allows mocking of time functions during testing.
clock clock.Clock
@@ -122,28 +122,28 @@ type EchoVault struct {
stopTTL chan struct{} // Channel that signals the TTL sampling goroutine to stop execution.
}
// WithContext is an options that for the NewEchoVault function that allows you to
// configure a custom context object to be used in EchoVault.
// If you don't provide this option, EchoVault will create its own internal context object.
func WithContext(ctx context.Context) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
// WithContext is an options that for the NewSugarDB function that allows you to
// configure a custom context object to be used in SugarDB.
// If you don't provide this option, SugarDB will create its own internal context object.
func WithContext(ctx context.Context) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.context = ctx
}
}
// WithConfig is an option for the NewEchoVault function that allows you to pass a
// custom configuration to EchoVault.
// If not specified, EchoVault will use the default configuration from config.DefaultConfig().
func WithConfig(config config.Config) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
// WithConfig is an option for the NewSugarDB function that allows you to pass a
// custom configuration to SugarDB.
// If not specified, SugarDB will use the default configuration from config.DefaultConfig().
func WithConfig(config config.Config) func(echovault *SugarDB) {
return func(echovault *SugarDB) {
echovault.config = config
}
}
// NewEchoVault creates a new EchoVault instance.
// NewSugarDB creates a new SugarDB instance.
// This functions accepts the WithContext, WithConfig and WithCommands options.
func NewEchoVault(options ...func(echovault *EchoVault)) (*EchoVault, error) {
echovault := &EchoVault{
func NewSugarDB(options ...func(sugarDB *SugarDB)) (*SugarDB, error) {
sugarDB := &SugarDB{
clock: clock.NewClock(),
context: context.Background(),
config: config.DefaultConfig(),
@@ -190,17 +190,17 @@ func NewEchoVault(options ...func(echovault *EchoVault)) (*EchoVault, error) {
}
for _, option := range options {
option(echovault)
option(sugarDB)
}
echovault.context = context.WithValue(
echovault.context, "ServerID",
internal.ContextServerID(echovault.config.ServerID),
sugarDB.context = context.WithValue(
sugarDB.context, "ServerID",
internal.ContextServerID(sugarDB.config.ServerID),
)
// Load .so modules from config
for _, path := range echovault.config.Modules {
if err := echovault.LoadModule(path); err != nil {
for _, path := range sugarDB.config.Modules {
if err := sugarDB.LoadModule(path); err != nil {
log.Printf("%s %v\n", path, err)
continue
}
@@ -208,29 +208,29 @@ func NewEchoVault(options ...func(echovault *EchoVault)) (*EchoVault, error) {
}
// Set up ACL module
echovault.acl = acl.NewACL(echovault.config)
sugarDB.acl = acl.NewACL(sugarDB.config)
// Set up Pub/Sub module
echovault.pubSub = pubsub.NewPubSub()
sugarDB.pubSub = pubsub.NewPubSub()
if echovault.isInCluster() {
echovault.raft = raft.NewRaft(raft.Opts{
Config: echovault.config,
GetCommand: echovault.getCommand,
SetValues: echovault.setValues,
SetExpiry: echovault.setExpiry,
StartSnapshot: echovault.startSnapshot,
FinishSnapshot: echovault.finishSnapshot,
SetLatestSnapshotTime: echovault.setLatestSnapshot,
GetHandlerFuncParams: echovault.getHandlerFuncParams,
if sugarDB.isInCluster() {
sugarDB.raft = raft.NewRaft(raft.Opts{
Config: sugarDB.config,
GetCommand: sugarDB.getCommand,
SetValues: sugarDB.setValues,
SetExpiry: sugarDB.setExpiry,
StartSnapshot: sugarDB.startSnapshot,
FinishSnapshot: sugarDB.finishSnapshot,
SetLatestSnapshotTime: sugarDB.setLatestSnapshot,
GetHandlerFuncParams: sugarDB.getHandlerFuncParams,
DeleteKey: func(ctx context.Context, key string) error {
echovault.storeLock.Lock()
defer echovault.storeLock.Unlock()
return echovault.deleteKey(ctx, key)
sugarDB.storeLock.Lock()
defer sugarDB.storeLock.Unlock()
return sugarDB.deleteKey(ctx, key)
},
GetState: func() map[int]map[string]internal.KeyData {
state := make(map[int]map[string]internal.KeyData)
for database, store := range echovault.getState() {
for database, store := range sugarDB.getState() {
for k, v := range store {
if data, ok := v.(internal.KeyData); ok {
state[database][k] = data
@@ -240,29 +240,29 @@ func NewEchoVault(options ...func(echovault *EchoVault)) (*EchoVault, error) {
return state
},
})
echovault.memberList = memberlist.NewMemberList(memberlist.Opts{
Config: echovault.config,
HasJoinedCluster: echovault.raft.HasJoinedCluster,
AddVoter: echovault.raft.AddVoter,
RemoveRaftServer: echovault.raft.RemoveServer,
IsRaftLeader: echovault.raft.IsRaftLeader,
ApplyMutate: echovault.raftApplyCommand,
ApplyDeleteKey: echovault.raftApplyDeleteKey,
sugarDB.memberList = memberlist.NewMemberList(memberlist.Opts{
Config: sugarDB.config,
HasJoinedCluster: sugarDB.raft.HasJoinedCluster,
AddVoter: sugarDB.raft.AddVoter,
RemoveRaftServer: sugarDB.raft.RemoveServer,
IsRaftLeader: sugarDB.raft.IsRaftLeader,
ApplyMutate: sugarDB.raftApplyCommand,
ApplyDeleteKey: sugarDB.raftApplyDeleteKey,
})
} else {
// Set up standalone snapshot engine
echovault.snapshotEngine = snapshot.NewSnapshotEngine(
snapshot.WithClock(echovault.clock),
snapshot.WithDirectory(echovault.config.DataDir),
snapshot.WithThreshold(echovault.config.SnapShotThreshold),
snapshot.WithInterval(echovault.config.SnapshotInterval),
snapshot.WithStartSnapshotFunc(echovault.startSnapshot),
snapshot.WithFinishSnapshotFunc(echovault.finishSnapshot),
snapshot.WithSetLatestSnapshotTimeFunc(echovault.setLatestSnapshot),
snapshot.WithGetLatestSnapshotTimeFunc(echovault.getLatestSnapshotTime),
sugarDB.snapshotEngine = snapshot.NewSnapshotEngine(
snapshot.WithClock(sugarDB.clock),
snapshot.WithDirectory(sugarDB.config.DataDir),
snapshot.WithThreshold(sugarDB.config.SnapShotThreshold),
snapshot.WithInterval(sugarDB.config.SnapshotInterval),
snapshot.WithStartSnapshotFunc(sugarDB.startSnapshot),
snapshot.WithFinishSnapshotFunc(sugarDB.finishSnapshot),
snapshot.WithSetLatestSnapshotTimeFunc(sugarDB.setLatestSnapshot),
snapshot.WithGetLatestSnapshotTimeFunc(sugarDB.getLatestSnapshotTime),
snapshot.WithGetStateFunc(func() map[int]map[string]internal.KeyData {
state := make(map[int]map[string]internal.KeyData)
for database, data := range echovault.getState() {
for database, data := range sugarDB.getState() {
state[database] = make(map[string]internal.KeyData)
for key, value := range data {
if keyData, ok := value.(internal.KeyData); ok {
@@ -274,23 +274,23 @@ func NewEchoVault(options ...func(echovault *EchoVault)) (*EchoVault, error) {
}),
snapshot.WithSetKeyDataFunc(func(database int, key string, data internal.KeyData) {
ctx := context.WithValue(context.Background(), "Database", database)
if err := echovault.setValues(ctx, map[string]interface{}{key: data.Value}); err != nil {
if err := sugarDB.setValues(ctx, map[string]interface{}{key: data.Value}); err != nil {
log.Println(err)
}
echovault.setExpiry(ctx, key, data.ExpireAt, false)
sugarDB.setExpiry(ctx, key, data.ExpireAt, false)
}),
)
// Set up standalone AOF engine
aofEngine, err := aof.NewAOFEngine(
aof.WithClock(echovault.clock),
aof.WithDirectory(echovault.config.DataDir),
aof.WithStrategy(echovault.config.AOFSyncStrategy),
aof.WithStartRewriteFunc(echovault.startRewriteAOF),
aof.WithFinishRewriteFunc(echovault.finishRewriteAOF),
aof.WithClock(sugarDB.clock),
aof.WithDirectory(sugarDB.config.DataDir),
aof.WithStrategy(sugarDB.config.AOFSyncStrategy),
aof.WithStartRewriteFunc(sugarDB.startRewriteAOF),
aof.WithFinishRewriteFunc(sugarDB.finishRewriteAOF),
aof.WithGetStateFunc(func() map[int]map[string]internal.KeyData {
state := make(map[int]map[string]internal.KeyData)
for database, data := range echovault.getState() {
for database, data := range sugarDB.getState() {
state[database] = make(map[string]internal.KeyData)
for key, value := range data {
if keyData, ok := value.(internal.KeyData); ok {
@@ -302,15 +302,15 @@ func NewEchoVault(options ...func(echovault *EchoVault)) (*EchoVault, error) {
}),
aof.WithSetKeyDataFunc(func(database int, key string, value internal.KeyData) {
ctx := context.WithValue(context.Background(), "Database", database)
if err := echovault.setValues(ctx, map[string]interface{}{key: value.Value}); err != nil {
if err := sugarDB.setValues(ctx, map[string]interface{}{key: value.Value}); err != nil {
log.Println(err)
}
echovault.setExpiry(ctx, key, value.ExpireAt, false)
sugarDB.setExpiry(ctx, key, value.ExpireAt, false)
}),
aof.WithHandleCommandFunc(func(database int, command []byte) {
ctx := context.WithValue(context.Background(), "Protocol", 2)
ctx = context.WithValue(ctx, "Database", database)
_, err := echovault.handleCommand(ctx, command, nil, true, false)
_, err := sugarDB.handleCommand(ctx, command, nil, true, false)
if err != nil {
log.Println(err)
}
@@ -319,13 +319,13 @@ func NewEchoVault(options ...func(echovault *EchoVault)) (*EchoVault, error) {
if err != nil {
return nil, err
}
echovault.aofEngine = aofEngine
sugarDB.aofEngine = aofEngine
}
// If eviction policy is not noeviction, start a goroutine to evict keys at the configured interval.
if echovault.config.EvictionPolicy != constants.NoEviction {
if sugarDB.config.EvictionPolicy != constants.NoEviction {
go func() {
ticker := time.NewTicker(echovault.config.EvictionInterval)
ticker := time.NewTicker(sugarDB.config.EvictionInterval)
defer func() {
ticker.Stop()
}()
@@ -334,59 +334,59 @@ func NewEchoVault(options ...func(echovault *EchoVault)) (*EchoVault, error) {
case <-ticker.C:
// Run key eviction for each database that has volatile keys.
wg := sync.WaitGroup{}
for database, _ := range echovault.keysWithExpiry.keys {
for database, _ := range sugarDB.keysWithExpiry.keys {
wg.Add(1)
ctx := context.WithValue(context.Background(), "Database", database)
go func(ctx context.Context, wg *sync.WaitGroup) {
if err := echovault.evictKeysWithExpiredTTL(ctx); err != nil {
if err := sugarDB.evictKeysWithExpiredTTL(ctx); err != nil {
log.Printf("evict with ttl: %v\n", err)
}
wg.Done()
}(ctx, &wg)
}
wg.Wait()
case <-echovault.stopTTL:
case <-sugarDB.stopTTL:
break
}
}
}()
}
if echovault.config.TLS && len(echovault.config.CertKeyPairs) <= 0 {
if sugarDB.config.TLS && len(sugarDB.config.CertKeyPairs) <= 0 {
return nil, errors.New("must provide certificate and key file paths for TLS mode")
}
if echovault.isInCluster() {
if sugarDB.isInCluster() {
// Initialise raft and memberlist
echovault.raft.RaftInit(echovault.context)
echovault.memberList.MemberListInit(echovault.context)
sugarDB.raft.RaftInit(sugarDB.context)
sugarDB.memberList.MemberListInit(sugarDB.context)
// Initialise caches
echovault.initialiseCaches()
sugarDB.initialiseCaches()
}
if !echovault.isInCluster() {
echovault.initialiseCaches()
if !sugarDB.isInCluster() {
sugarDB.initialiseCaches()
// Restore from AOF by default if it's enabled
if echovault.config.RestoreAOF {
err := echovault.aofEngine.Restore()
if sugarDB.config.RestoreAOF {
err := sugarDB.aofEngine.Restore()
if err != nil {
log.Println(err)
}
}
// Restore from snapshot if snapshot restore is enabled and AOF restore is disabled
if echovault.config.RestoreSnapshot && !echovault.config.RestoreAOF {
err := echovault.snapshotEngine.Restore()
if sugarDB.config.RestoreSnapshot && !sugarDB.config.RestoreAOF {
err := sugarDB.snapshotEngine.Restore()
if err != nil {
log.Println(err)
}
}
}
return echovault, nil
return sugarDB, nil
}
func (server *EchoVault) startTCP() {
func (server *SugarDB) startTCP() {
conf := server.config
listenConfig := net.ListenConfig{
@@ -473,7 +473,7 @@ func (server *EchoVault) startTCP() {
}
}
func (server *EchoVault) handleConnection(conn net.Conn) {
func (server *SugarDB) handleConnection(conn net.Conn) {
// If ACL module is loaded, register the connection with the ACL
if server.acl != nil {
server.acl.RegisterConnection(&conn)
@@ -561,17 +561,17 @@ func (server *EchoVault) handleConnection(conn net.Conn) {
}
}
// Start starts the EchoVault instance's TCP listener.
// Start starts the SugarDB instance's TCP listener.
// This allows the instance to accept connections handle client commands over TCP.
//
// You can still use command functions like echovault.Set if you're embedding EchoVault in your application.
// You can still use command functions like echovault.Set if you're embedding SugarDB in your application.
// However, if you'd like to also accept TCP request on the same instance, you must call this function.
func (server *EchoVault) Start() {
func (server *SugarDB) Start() {
server.startTCP()
}
// takeSnapshot triggers a snapshot when called.
func (server *EchoVault) takeSnapshot() error {
func (server *SugarDB) takeSnapshot() error {
if server.snapshotInProgress.Load() {
return errors.New("snapshot already in progress")
}
@@ -593,33 +593,33 @@ func (server *EchoVault) takeSnapshot() error {
return nil
}
func (server *EchoVault) startSnapshot() {
func (server *SugarDB) startSnapshot() {
server.snapshotInProgress.Store(true)
}
func (server *EchoVault) finishSnapshot() {
func (server *SugarDB) finishSnapshot() {
server.snapshotInProgress.Store(false)
}
func (server *EchoVault) setLatestSnapshot(msec int64) {
func (server *SugarDB) setLatestSnapshot(msec int64) {
server.latestSnapshotMilliseconds.Store(msec)
}
// getLatestSnapshotTime returns the latest snapshot time in unix epoch milliseconds.
func (server *EchoVault) getLatestSnapshotTime() int64 {
func (server *SugarDB) getLatestSnapshotTime() int64 {
return server.latestSnapshotMilliseconds.Load()
}
func (server *EchoVault) startRewriteAOF() {
func (server *SugarDB) startRewriteAOF() {
server.rewriteAOFInProgress.Store(true)
}
func (server *EchoVault) finishRewriteAOF() {
func (server *SugarDB) finishRewriteAOF() {
server.rewriteAOFInProgress.Store(false)
}
// rewriteAOF triggers an AOF compaction when running in standalone mode.
func (server *EchoVault) rewriteAOF() error {
func (server *SugarDB) rewriteAOF() error {
if server.rewriteAOFInProgress.Load() {
return errors.New("aof rewrite in progress")
}
@@ -629,9 +629,9 @@ func (server *EchoVault) rewriteAOF() error {
return nil
}
// ShutDown gracefully shuts down the EchoVault instance.
// ShutDown gracefully shuts down the SugarDB instance.
// This function shuts down the memberlist and raft layers.
func (server *EchoVault) ShutDown() {
func (server *SugarDB) ShutDown() {
if server.listener.Load() != nil {
go func() { server.quit <- struct{}{} }()
go func() { server.stopTTL <- struct{}{} }()
@@ -649,7 +649,7 @@ func (server *EchoVault) ShutDown() {
}
}
func (server *EchoVault) initialiseCaches() {
func (server *SugarDB) initialiseCaches() {
// Set up LFU cache.
server.lfuCache = struct {
mutex *sync.Mutex
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package echovault
package sugardb
import (
"bufio"
@@ -48,7 +48,7 @@ type ClientServerPair struct {
joinAddr string
raw net.Conn
client *resp.Conn
server *EchoVault
server *SugarDB
}
var bindLock sync.Mutex
@@ -80,7 +80,7 @@ func setupServer(
joinAddr string,
port,
discoveryPort int,
) (*EchoVault, error) {
) (*SugarDB, error) {
conf := DefaultConfig()
conf.DataDir = dataDir
conf.ForwardCommand = forwardCommand
@@ -92,7 +92,7 @@ func setupServer(
conf.BootstrapCluster = bootstrapCluster
conf.EvictionPolicy = constants.NoEviction
return NewEchoVault(
return NewSugarDB(
WithContext(context.Background()),
WithConfig(conf),
)
@@ -660,7 +660,7 @@ func Test_Standalone(t *testing.T) {
return
}
mockServer, err := NewEchoVault(
mockServer, err := NewSugarDB(
WithConfig(config.Config{
BindAddr: "localhost",
Port: uint16(port),
@@ -732,7 +732,7 @@ func Test_Standalone(t *testing.T) {
},
}
server, err := NewEchoVault(WithConfig(conf))
server, err := NewSugarDB(WithConfig(conf))
if err != nil {
t.Error(err)
return
@@ -837,7 +837,7 @@ func Test_Standalone(t *testing.T) {
},
}
server, err := NewEchoVault(WithConfig(conf))
server, err := NewSugarDB(WithConfig(conf))
if err != nil {
t.Error(err)
return
@@ -945,8 +945,8 @@ func Test_Standalone(t *testing.T) {
name string
dataDir string
values map[int]map[string]string
snapshotFunc func(mockServer *EchoVault) error
lastSaveFunc func(mockServer *EchoVault) (int, error)
snapshotFunc func(mockServer *SugarDB) error
lastSaveFunc func(mockServer *SugarDB) (int, error)
wantLastSave int
}{
{
@@ -956,13 +956,13 @@ func Test_Standalone(t *testing.T) {
0: {"key5": "value-05", "key6": "value-06", "key7": "value-07", "key8": "value-08"},
1: {"key5": "value-15", "key6": "value-16", "key7": "value-17", "key8": "value-18"},
},
snapshotFunc: func(mockServer *EchoVault) error {
snapshotFunc: func(mockServer *SugarDB) error {
if _, err := mockServer.Save(); err != nil {
return err
}
return nil
},
lastSaveFunc: func(mockServer *EchoVault) (int, error) {
lastSaveFunc: func(mockServer *SugarDB) (int, error) {
return mockServer.LastSave()
},
wantLastSave: int(clock.NewClock().Now().UnixMilli()),
@@ -985,7 +985,7 @@ func Test_Standalone(t *testing.T) {
conf.Port = uint16(port)
conf.RestoreSnapshot = true
mockServer, err := NewEchoVault(WithConfig(conf))
mockServer, err := NewSugarDB(WithConfig(conf))
if err != nil {
t.Error(err)
return
@@ -1017,7 +1017,7 @@ func Test_Standalone(t *testing.T) {
ticker.Stop()
// Restart server with the same config. This should restore the snapshot
mockServer, err = NewEchoVault(WithConfig(conf))
mockServer, err = NewSugarDB(WithConfig(conf))
if err != nil {
t.Error(err)
return
@@ -1093,7 +1093,7 @@ func Test_Standalone(t *testing.T) {
conf.DataDir = dataDir
conf.AOFSyncStrategy = "always"
mockServer, err := NewEchoVault(WithConfig(conf))
mockServer, err := NewSugarDB(WithConfig(conf))
if err != nil {
t.Error(err)
return
@@ -1127,11 +1127,11 @@ func Test_Standalone(t *testing.T) {
// Yield
<-ticker.C
// Shutdown the EchoVault instance
// Shutdown the SugarDB instance
mockServer.ShutDown()
// Start another instance of EchoVault
mockServer, err = NewEchoVault(WithConfig(conf))
// Start another instance of SugarDB
mockServer, err = NewSugarDB(WithConfig(conf))
if err != nil {
t.Error(err)
return
@@ -1,4 +1,4 @@
package echovault
package sugardb
import (
"context"
@@ -7,8 +7,8 @@ import (
"github.com/echovault/echovault/internal/constants"
)
func createEchoVault() *EchoVault {
ev, _ := NewEchoVault(
func createSugarDB() *SugarDB {
ev, _ := NewSugarDB(
WithConfig(config.Config{
DataDir: "",
EvictionPolicy: constants.NoEviction,
@@ -17,14 +17,14 @@ func createEchoVault() *EchoVault {
return ev
}
func createEchoVaultWithConfig(conf config.Config) *EchoVault {
ev, _ := NewEchoVault(
func createSugarDBWithConfig(conf config.Config) *SugarDB {
ev, _ := NewSugarDB(
WithConfig(conf),
)
return ev
}
func presetValue(server *EchoVault, ctx context.Context, key string, value interface{}) error {
func presetValue(server *SugarDB, ctx context.Context, key string, value interface{}) error {
ctx = context.WithValue(ctx, "Database", 0)
if err := server.setValues(ctx, map[string]interface{}{key: value}); err != nil {
return err
@@ -32,7 +32,7 @@ func presetValue(server *EchoVault, ctx context.Context, key string, value inter
return nil
}
func presetKeyData(server *EchoVault, ctx context.Context, key string, data internal.KeyData) {
func presetKeyData(server *SugarDB, ctx context.Context, key string, data internal.KeyData) {
ctx = context.WithValue(ctx, "Database", 0)
_ = server.setValues(ctx, map[string]interface{}{key: data.Value})
server.setExpiry(ctx, key, data.ExpireAt, false)