@@ -3,6 +3,8 @@ package prefix
3
3
import (
4
4
"context"
5
5
"fmt"
6
+ "maps"
7
+ "slices"
6
8
"strings"
7
9
8
10
"github.com/upfluence/redis"
@@ -40,6 +42,20 @@ func (f *factory) Wrap(next redis.DB) redis.DB {
40
42
return next
41
43
}
42
44
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
+
43
59
return & db {next : next , prefix : f .prefix , vs : f .vs }
44
60
}
45
61
@@ -49,7 +65,9 @@ type db struct {
49
65
vs map [string ]Executor
50
66
}
51
67
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 () }
53
71
54
72
func (db * db ) Do (ctx context.Context , cmd string , vs ... interface {}) redis.Scanner {
55
73
e , ok := db .vs [cmd ]
@@ -62,3 +80,23 @@ func (db *db) Do(ctx context.Context, cmd string, vs ...interface{}) redis.Scann
62
80
63
81
return e .Execute (ctx , db .next , db .prefix , cmd , vs )
64
82
}
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
+ }
0 commit comments