Skip to content

Commit 27d242b

Browse files
middleware/prefix: Add Prefix API to get the global key prefix
1 parent d59b12f commit 27d242b

File tree

3 files changed

+53
-5
lines changed

3 files changed

+53
-5
lines changed

middleware/logger/middleware.go

-4
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,6 @@ type DB struct {
6565
}
6666

6767
func (db *DB) Unwrap() redis.DB {
68-
if u, ok := db.db.(interface{ Unwrap() redis.DB }); ok {
69-
return u.Unwrap()
70-
}
71-
7268
return db.db
7369
}
7470

middleware/prefix/db.go

+39-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package prefix
33
import (
44
"context"
55
"fmt"
6+
"maps"
7+
"slices"
68
"strings"
79

810
"github.com/upfluence/redis"
@@ -40,6 +42,20 @@ func (f *factory) Wrap(next redis.DB) redis.DB {
4042
return next
4143
}
4244

45+
if pnext, ok := next.(*db); ok {
46+
vs := maps.Clone(pnext.vs)
47+
48+
for k, v := range f.vs {
49+
vs[k] = v
50+
}
51+
52+
return &db{
53+
next: pnext.next,
54+
prefix: pnext.prefix + f.prefix,
55+
vs: vs,
56+
}
57+
}
58+
4359
return &db{next: next, prefix: f.prefix, vs: f.vs}
4460
}
4561

@@ -49,7 +65,9 @@ type db struct {
4965
vs map[string]Executor
5066
}
5167

52-
func (db *db) Close() error { return db.next.Close() }
68+
func (db *db) Prefix() string { return db.prefix }
69+
func (db *db) Unwrap() redis.DB { return db.next }
70+
func (db *db) Close() error { return db.next.Close() }
5371

5472
func (db *db) Do(ctx context.Context, cmd string, vs ...interface{}) redis.Scanner {
5573
e, ok := db.vs[cmd]
@@ -62,3 +80,23 @@ func (db *db) Do(ctx context.Context, cmd string, vs ...interface{}) redis.Scann
6280

6381
return e.Execute(ctx, db.next, db.prefix, cmd, vs)
6482
}
83+
84+
func Prefix(db redis.DB) string {
85+
var prefixes []string
86+
87+
for {
88+
if pdb, ok := db.(interface{ Prefix() string }); ok {
89+
prefixes = append(prefixes, pdb.Prefix())
90+
}
91+
92+
udb, ok := db.(interface{ Unwrap() redis.DB })
93+
94+
if !ok {
95+
slices.Reverse(prefixes)
96+
97+
return strings.Join(prefixes, "")
98+
}
99+
100+
db = udb.Unwrap()
101+
}
102+
}

middleware/prefix/executor_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ func TestIntegration(t *testing.T) {
5858
err = db.Do(ctx, "KEYS", "*").Scan(&keys)
5959
require.NoError(t, err)
6060
assert.Equal(t, []string{"buz"}, keys)
61+
62+
for _, tt := range []struct {
63+
db redis.DB
64+
want string
65+
}{
66+
{db: db, want: ""},
67+
{db: prefixedDB, want: "foobar:"},
68+
{
69+
db: prefix.NewFactory("buz").Wrap(prefixedDB),
70+
want: "foobar:buz:",
71+
},
72+
} {
73+
assert.Equal(t, tt.want, prefix.Prefix(tt.db))
74+
}
6175
})
6276

6377
}

0 commit comments

Comments
 (0)