@@ -7,12 +7,13 @@ use libc::size_t;
77
88use crate :: error:: Error ;
99use crate :: from_byte_string;
10- use crate :: native_types:: redis_log;
1110use crate :: native_types:: RedisType ;
1211use crate :: raw;
1312use crate :: RedisError ;
1413use crate :: RedisResult ;
1514use crate :: RedisString ;
15+ use crate :: redismodule:: REDIS_OK ;
16+
1617
1718/// `RedisKey` is an abstraction over a Redis key that allows readonly
1819/// operations.
@@ -46,6 +47,24 @@ impl RedisKey {
4647 }
4748 }
4849
50+ pub fn get_value < T : Debug > (
51+ & self ,
52+ redis_type : & RedisType ,
53+ ) -> Result < Option < & T > , RedisError > {
54+ verify_type ( self . key_inner , redis_type) ?;
55+
56+ let value =
57+ unsafe { raw:: RedisModule_ModuleTypeGetValue . unwrap ( ) ( self . key_inner ) as * mut T } ;
58+
59+ if value. is_null ( ) {
60+ return Ok ( None ) ;
61+ }
62+
63+ let value = unsafe { & * value } ;
64+
65+ Ok ( Some ( value) )
66+ }
67+
4968 /// Detects whether the key pointer given to us by Redis is null.
5069 pub fn is_null ( & self ) -> bool {
5170 let null_key: * mut raw:: RedisModuleKey = ptr:: null_mut ( ) ;
@@ -118,7 +137,7 @@ impl RedisKeyWritable {
118137
119138 pub fn set_expire ( & self , expire : time:: Duration ) -> RedisResult {
120139 match raw:: set_expire ( self . key_inner , expire. num_milliseconds ( ) ) {
121- raw:: Status :: Ok => Ok ( "OK" . into ( ) ) ,
140+ raw:: Status :: Ok => REDIS_OK ,
122141
123142 // Error may occur if the key wasn't open for writing or is an
124143 // empty key.
@@ -129,52 +148,29 @@ impl RedisKeyWritable {
129148 pub fn write ( & self , val : & str ) -> RedisResult {
130149 let val_str = RedisString :: create ( self . ctx , val) ;
131150 match raw:: string_set ( self . key_inner , val_str. inner ) {
132- raw:: Status :: Ok => Ok ( "OK" . into ( ) ) ,
151+ raw:: Status :: Ok => REDIS_OK ,
133152 raw:: Status :: Err => Err ( RedisError :: Str ( "Error while setting key" ) ) ,
134153 }
135154 }
136155
137- pub fn is_empty ( & self ) -> bool {
138- use raw:: KeyType ;
139-
140- let key_type: KeyType = unsafe { raw:: RedisModule_KeyType . unwrap ( ) ( self . key_inner ) } . into ( ) ;
141-
142- key_type == KeyType :: Empty
156+ pub fn delete ( & self ) -> RedisResult {
157+ unsafe { raw:: RedisModule_DeleteKey . unwrap ( ) ( self . key_inner ) } ;
158+ REDIS_OK
143159 }
144160
145- fn verify_type ( & self , redis_type : & RedisType ) -> RedisResult {
161+ pub fn is_empty ( & self ) -> bool {
146162 use raw:: KeyType ;
147163
148164 let key_type: KeyType = unsafe { raw:: RedisModule_KeyType . unwrap ( ) ( self . key_inner ) } . into ( ) ;
149165
150- redis_log ( self . ctx , format ! ( "key type: {:?}" , key_type) . as_str ( ) ) ;
151-
152- if key_type != KeyType :: Empty {
153- // The key exists; check its type
154- let raw_type = unsafe { raw:: RedisModule_ModuleTypeGetType . unwrap ( ) ( self . key_inner ) } ;
155-
156- if raw_type != * redis_type. raw_type . borrow ( ) {
157- return Err ( RedisError :: String ( format ! (
158- "Existing key has wrong Redis type"
159- ) ) ) ;
160- }
161-
162- redis_log ( self . ctx , "Existing key is of the correct type" ) ;
163- }
164-
165- redis_log ( self . ctx , "All OK" ) ;
166-
167- Ok ( "OK" . into ( ) )
166+ key_type == KeyType :: Empty
168167 }
169168
170169 pub fn get_value < T : Debug > (
171170 & self ,
172171 redis_type : & RedisType ,
173172 ) -> Result < Option < & mut T > , RedisError > {
174- self . verify_type ( redis_type) ?;
175-
176- redis_log ( self . ctx , "Going to get value" ) ;
177-
173+ verify_type ( self . key_inner , redis_type) ?;
178174 let value =
179175 unsafe { raw:: RedisModule_ModuleTypeGetValue . unwrap ( ) ( self . key_inner ) as * mut T } ;
180176
@@ -183,24 +179,12 @@ impl RedisKeyWritable {
183179 }
184180
185181 let value = unsafe { & mut * value } ;
186-
187- redis_log ( self . ctx , format ! ( "got value: '{:?}'" , value) . as_str ( ) ) ;
188-
189182 Ok ( Some ( value) )
190183 }
191184
192185 pub fn set_value < T : Debug > ( & self , redis_type : & RedisType , value : T ) -> Result < ( ) , RedisError > {
193- self . verify_type ( redis_type) ?;
194-
195- redis_log (
196- self . ctx ,
197- format ! ( "1. Going to set value to {:?}" , & value) . as_str ( ) ,
198- ) ;
199-
186+ verify_type ( self . key_inner , redis_type) ?;
200187 let value = Box :: into_raw ( Box :: new ( value) ) as * mut c_void ;
201-
202- redis_log ( self . ctx , "2. Going to set value" ) ;
203-
204188 let status: raw:: Status = unsafe {
205189 raw:: RedisModule_ModuleTypeSetValue . unwrap ( ) (
206190 self . key_inner ,
@@ -210,8 +194,6 @@ impl RedisKeyWritable {
210194 }
211195 . into ( ) ;
212196
213- redis_log ( self . ctx , "3. Finished setting value" ) ;
214-
215197 status. into ( )
216198 }
217199}
@@ -246,3 +228,23 @@ fn to_raw_mode(mode: KeyMode) -> raw::KeyMode {
246228 KeyMode :: ReadWrite => raw:: KeyMode :: READ | raw:: KeyMode :: WRITE ,
247229 }
248230}
231+
232+
233+ fn verify_type ( key_inner : * mut raw:: RedisModuleKey , redis_type : & RedisType ) -> RedisResult {
234+ use raw:: KeyType ;
235+
236+ let key_type: KeyType = unsafe { raw:: RedisModule_KeyType . unwrap ( ) ( key_inner) } . into ( ) ;
237+
238+ if key_type != KeyType :: Empty {
239+ // The key exists; check its type
240+ let raw_type = unsafe { raw:: לRedisModule_ModuleTypeGetType. unwrap ( ) ( key_inner) } ;
241+
242+ if raw_type != * redis_type. raw_type . borrow ( ) {
243+ return Err ( RedisError :: String ( format ! (
244+ "Existing key has wrong Redis type"
245+ ) ) ) ;
246+ }
247+ }
248+
249+ REDIS_OK
250+ }
0 commit comments