@@ -26,6 +26,24 @@ class RedisCaster
26
26
2 => 'IGBINARY ' , // Optional Redis::SERIALIZER_IGBINARY
27
27
);
28
28
29
+ private static $ mode = array (
30
+ \Redis::ATOMIC => 'ATOMIC ' ,
31
+ \Redis::MULTI => 'MULTI ' ,
32
+ \Redis::PIPELINE => 'PIPELINE ' ,
33
+ );
34
+
35
+ private static $ compression = array (
36
+ 0 => 'NONE ' , // Redis::COMPRESSION_NONE
37
+ 1 => 'LZF ' , // Redis::COMPRESSION_LZF
38
+ );
39
+
40
+ private static $ failover = array (
41
+ \RedisCluster::FAILOVER_NONE => 'NONE ' ,
42
+ \RedisCluster::FAILOVER_ERROR => 'ERROR ' ,
43
+ \RedisCluster::FAILOVER_DISTRIBUTE => 'DISTRIBUTE ' ,
44
+ \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES => 'DISTRIBUTE_SLAVES ' ,
45
+ );
46
+
29
47
public static function castRedis (\Redis $ c , array $ a , Stub $ stub , $ isNested )
30
48
{
31
49
$ prefix = Caster::PREFIX_VIRTUAL ;
@@ -36,23 +54,19 @@ public static function castRedis(\Redis $c, array $a, Stub $stub, $isNested)
36
54
);
37
55
}
38
56
39
- $ ser = $ c ->getOption (\Redis::OPT_SERIALIZER );
40
- $ retry = \defined ('Redis::OPT_SCAN ' ) ? $ c ->getOption (\Redis::OPT_SCAN ) : 0 ;
57
+ $ mode = $ c ->getMode ();
41
58
42
59
return $ a + array (
43
60
$ prefix .'isConnected ' => $ connected ,
44
61
$ prefix .'host ' => $ c ->getHost (),
45
62
$ prefix .'port ' => $ c ->getPort (),
46
63
$ prefix .'auth ' => $ c ->getAuth (),
64
+ $ prefix .'mode ' => isset (self ::$ mode [$ mode ]) ? new ConstStub (self ::$ mode [$ mode ], $ mode ) : $ mode ,
47
65
$ prefix .'dbNum ' => $ c ->getDbNum (),
48
66
$ prefix .'timeout ' => $ c ->getTimeout (),
67
+ $ prefix .'lastError ' => $ c ->getLastError (),
49
68
$ prefix .'persistentId ' => $ c ->getPersistentID (),
50
- $ prefix .'options ' => new EnumStub (array (
51
- 'READ_TIMEOUT ' => $ c ->getOption (\Redis::OPT_READ_TIMEOUT ),
52
- 'SERIALIZER ' => isset (self ::$ serializer [$ ser ]) ? new ConstStub (self ::$ serializer [$ ser ], $ ser ) : $ ser ,
53
- 'PREFIX ' => $ c ->getOption (\Redis::OPT_PREFIX ),
54
- 'SCAN ' => new ConstStub ($ retry ? 'RETRY ' : 'NORETRY ' , $ retry ),
55
- )),
69
+ $ prefix .'options ' => self ::getRedisOptions ($ c ),
56
70
);
57
71
}
58
72
@@ -63,6 +77,71 @@ public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, $isN
63
77
return $ a + array (
64
78
$ prefix .'hosts ' => $ c ->_hosts (),
65
79
$ prefix .'function ' => ClassStub::wrapCallable ($ c ->_function ()),
80
+ $ prefix .'lastError ' => $ c ->getLastError (),
81
+ $ prefix .'options ' => self ::getRedisOptions ($ c ),
82
+ );
83
+ }
84
+
85
+ public static function castRedisCluster (\RedisCluster $ c , array $ a , Stub $ stub , $ isNested )
86
+ {
87
+ $ prefix = Caster::PREFIX_VIRTUAL ;
88
+ $ failover = $ c ->getOption (\RedisCluster::OPT_SLAVE_FAILOVER );
89
+
90
+ $ a += array (
91
+ $ prefix .'_masters ' => $ c ->_masters (),
92
+ $ prefix .'_redir ' => $ c ->_redir (),
93
+ $ prefix .'mode ' => new ConstStub ($ c ->getMode () ? 'MULTI ' : 'ATOMIC ' , $ c ->getMode ()),
94
+ $ prefix .'lastError ' => $ c ->getLastError (),
95
+ $ prefix .'options ' => self ::getRedisOptions ($ c , array (
96
+ 'SLAVE_FAILOVER ' => isset (self ::$ failover [$ failover ]) ? new ConstStub (self ::$ failover [$ failover ], $ failover ) : $ failover ,
97
+ )),
66
98
);
99
+
100
+ return $ a ;
101
+ }
102
+
103
+ /**
104
+ * @param \Redis|\RedisArray|\RedisCluster
105
+ */
106
+ private static function getRedisOptions ($ redis , array $ options = array ()): EnumStub
107
+ {
108
+ if (\is_array ($ serializer = $ redis ->getOption (\Redis::OPT_SERIALIZER ))) {
109
+ foreach ($ serializer as &$ v ) {
110
+ if (isset (self ::$ serializer [$ v ])) {
111
+ $ v = new ConstStub (self ::$ serializer [$ v ], $ v );
112
+ }
113
+ }
114
+ } elseif (isset (self ::$ serializer [$ serializer ])) {
115
+ $ serializer = new ConstStub (self ::$ serializer [$ serializer ], $ serializer );
116
+ }
117
+
118
+ if (\is_array ($ compression = \defined ('Redis::OPT_COMPRESSION ' ) ? $ redis ->getOption (\Redis::OPT_COMPRESSION ) : 0 )) {
119
+ foreach ($ compression as &$ v ) {
120
+ if (isset (self ::$ compression [$ v ])) {
121
+ $ v = new ConstStub (self ::$ compression [$ v ], $ v );
122
+ }
123
+ }
124
+ } elseif (isset (self ::$ compression [$ compression ])) {
125
+ $ compression = new ConstStub (self ::$ compression [$ compression ], $ compression );
126
+ }
127
+
128
+ if (\is_array ($ retry = \defined ('Redis::OPT_SCAN ' ) ? $ redis ->getOption (\Redis::OPT_SCAN ) : 0 )) {
129
+ foreach ($ retry as &$ v ) {
130
+ $ v = new ConstStub ($ v ? 'RETRY ' : 'NORETRY ' , $ v );
131
+ }
132
+ } else {
133
+ $ retry = new ConstStub ($ retry ? 'RETRY ' : 'NORETRY ' , $ retry );
134
+ }
135
+
136
+ $ options += array (
137
+ 'TCP_KEEPALIVE ' => \defined ('Redis::OPT_TCP_KEEPALIVE ' ) ? $ redis ->getOption (\Redis::OPT_TCP_KEEPALIVE ) : 0 ,
138
+ 'READ_TIMEOUT ' => $ redis ->getOption (\Redis::OPT_READ_TIMEOUT ),
139
+ 'COMPRESSION ' => $ compression ,
140
+ 'SERIALIZER ' => $ serializer ,
141
+ 'PREFIX ' => $ redis ->getOption (\Redis::OPT_PREFIX ),
142
+ 'SCAN ' => $ retry ,
143
+ );
144
+
145
+ return new EnumStub ($ options );
67
146
}
68
147
}
0 commit comments