mirror of
https://github.com/hanzokv/go.git
synced 2026-09-24 00:31:51 +00:00
We do not use Redis. The client was a go-redis fork and still said so
everywhere: `package redis`, `redis.NewClient`, `redis://`, `extra/redisotel`.
Consumers wrote `redis.Client` against a Valkey-backed store called KV.
package redis -> package kv (93 decls)
redis.X -> kv.X (2,794 call sites)
"redis: …" errors -> "kv: …" (206)
extra/redis{otel,cmd,prometheus,census} -> extra/kv{otel,cmd,prometheus,census}
redis:// , rediss:// -> kv:// , kvs:// (ParseURL)
Redis*/*Redis* idents -> KV*/*KV*
REDIS_VERSION, REDIS_ENDPOINTS_CONFIG_PATH -> KV_*
I previously argued this rename was unsafe because much of it was "wire
contract". That was wrong, and the categorisation shows why: RESP command names
are GET/SET/HSET — they never contain the word. Of 5,771 occurrences only two
kinds were server-visible at all: the ParseURL scheme (we choose what we pass;
our configs already use kv://) and the CLIENT SETINFO lib-name label, which the
server merely records. Nothing here changes a byte of protocol.
Two things deliberately keep the old spelling:
RediSearch — names a specific external module the FT.* commands map to.
StoreDist — contains the letters by accident (sto-reDis-t), not the word.
Breaking for consumers by design: every import site must move redis.X -> kv.X.
Minor bump, never a major — this module stays v9 forever.
117 lines
3.0 KiB
Go
117 lines
3.0 KiB
Go
package kv
|
|
|
|
import "context"
|
|
|
|
type ACLCmdable interface {
|
|
ACLDryRun(ctx context.Context, username string, command ...interface{}) *StringCmd
|
|
|
|
ACLLog(ctx context.Context, count int64) *ACLLogCmd
|
|
ACLLogReset(ctx context.Context) *StatusCmd
|
|
|
|
ACLGenPass(ctx context.Context, bit int) *StringCmd
|
|
|
|
ACLSetUser(ctx context.Context, username string, rules ...string) *StatusCmd
|
|
ACLDelUser(ctx context.Context, username string) *IntCmd
|
|
ACLUsers(ctx context.Context) *StringSliceCmd
|
|
ACLWhoAmI(ctx context.Context) *StringCmd
|
|
ACLList(ctx context.Context) *StringSliceCmd
|
|
|
|
ACLCat(ctx context.Context) *StringSliceCmd
|
|
ACLCatArgs(ctx context.Context, options *ACLCatArgs) *StringSliceCmd
|
|
}
|
|
|
|
type ACLCatArgs struct {
|
|
Category string
|
|
}
|
|
|
|
func (c cmdable) ACLDryRun(ctx context.Context, username string, command ...interface{}) *StringCmd {
|
|
args := make([]interface{}, 0, 3+len(command))
|
|
args = append(args, "acl", "dryrun", username)
|
|
args = append(args, command...)
|
|
cmd := NewStringCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) ACLLog(ctx context.Context, count int64) *ACLLogCmd {
|
|
args := make([]interface{}, 0, 3)
|
|
args = append(args, "acl", "log")
|
|
if count > 0 {
|
|
args = append(args, count)
|
|
}
|
|
cmd := NewACLLogCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) ACLLogReset(ctx context.Context) *StatusCmd {
|
|
cmd := NewStatusCmd(ctx, "acl", "log", "reset")
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) ACLDelUser(ctx context.Context, username string) *IntCmd {
|
|
cmd := NewIntCmd(ctx, "acl", "deluser", username)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) ACLSetUser(ctx context.Context, username string, rules ...string) *StatusCmd {
|
|
args := make([]interface{}, 3+len(rules))
|
|
args[0] = "acl"
|
|
args[1] = "setuser"
|
|
args[2] = username
|
|
for i, rule := range rules {
|
|
args[i+3] = rule
|
|
}
|
|
cmd := NewStatusCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) ACLGenPass(ctx context.Context, bit int) *StringCmd {
|
|
args := make([]interface{}, 0, 3)
|
|
args = append(args, "acl", "genpass")
|
|
if bit > 0 {
|
|
args = append(args, bit)
|
|
}
|
|
cmd := NewStringCmd(ctx, args...)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) ACLUsers(ctx context.Context) *StringSliceCmd {
|
|
cmd := NewStringSliceCmd(ctx, "acl", "users")
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) ACLWhoAmI(ctx context.Context) *StringCmd {
|
|
cmd := NewStringCmd(ctx, "acl", "whoami")
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) ACLList(ctx context.Context) *StringSliceCmd {
|
|
cmd := NewStringSliceCmd(ctx, "acl", "list")
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) ACLCat(ctx context.Context) *StringSliceCmd {
|
|
cmd := NewStringSliceCmd(ctx, "acl", "cat")
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
func (c cmdable) ACLCatArgs(ctx context.Context, options *ACLCatArgs) *StringSliceCmd {
|
|
// if there is a category passed, build new cmd, if there isn't - use the ACLCat method
|
|
if options != nil && options.Category != "" {
|
|
cmd := NewStringSliceCmd(ctx, "acl", "cat", options.Category)
|
|
_ = c(ctx, cmd)
|
|
return cmd
|
|
}
|
|
|
|
return c.ACLCat(ctx)
|
|
}
|