@@ -8,6 +8,9 @@ use crate::{add_info_field_long_long, add_info_field_str, raw, utils, Status};
88use crate :: { add_info_section, LogLevel } ;
99use crate :: { RedisError , RedisResult , RedisString , RedisValue } ;
1010
11+ #[ cfg( feature = "experimental-api" ) ]
12+ use std:: ffi:: CStr ;
13+
1114#[ cfg( feature = "experimental-api" ) ]
1215mod timer;
1316
@@ -294,7 +297,19 @@ impl Context {
294297 unsafe { raw:: notify_keyspace_event ( self . ctx , event_type, event, keyname) }
295298 }
296299
297- /// Returns the redis version either by calling ``RedisModule_GetServerVersion`` API,
300+ #[ cfg( feature = "experimental-api" ) ]
301+ pub fn current_command_name ( & self ) -> Result < String , RedisError > {
302+ unsafe {
303+ match raw:: RedisModule_GetCurrentCommandName {
304+ Some ( cmd) => Ok ( CStr :: from_ptr ( cmd ( self . ctx ) ) . to_str ( ) . unwrap ( ) . to_string ( ) ) ,
305+ None => Err ( RedisError :: Str (
306+ "API RedisModule_GetCurrentCommandName is not available" ,
307+ ) ) ,
308+ }
309+ }
310+ }
311+
312+ /// Returns the redis version either by calling RedisModule_GetServerVersion API,
298313 /// Or if it is not available, by calling "info server" API and parsing the reply
299314 pub fn get_redis_version ( & self ) -> Result < Version , RedisError > {
300315 self . get_redis_version_internal ( false )
@@ -306,6 +321,22 @@ impl Context {
306321 self . get_redis_version_internal ( true )
307322 }
308323
324+ pub fn version_from_info ( info : RedisValue ) -> Result < Version , RedisError > {
325+ if let RedisValue :: SimpleString ( info_str) = info {
326+ if let Some ( ver) = utils:: get_regexp_captures (
327+ info_str. as_str ( ) ,
328+ r"(?m)\bredis_version:([0-9]+)\.([0-9]+)\.([0-9]+)\b" ,
329+ ) {
330+ return Ok ( Version {
331+ major : ver[ 0 ] . parse :: < c_int > ( ) . unwrap ( ) ,
332+ minor : ver[ 1 ] . parse :: < c_int > ( ) . unwrap ( ) ,
333+ patch : ver[ 2 ] . parse :: < c_int > ( ) . unwrap ( ) ,
334+ } ) ;
335+ }
336+ }
337+ Err ( RedisError :: Str ( "Error getting redis_version" ) )
338+ }
339+
309340 #[ allow( clippy:: not_unsafe_ptr_arg_deref) ]
310341 fn get_redis_version_internal ( & self , force_use_rm_call : bool ) -> Result < Version , RedisError > {
311342 match unsafe { raw:: RedisModule_GetServerVersion } {
@@ -315,21 +346,11 @@ impl Context {
315346 }
316347 _ => {
317348 // Call "info server"
318- if let Ok ( RedisValue :: SimpleString ( s) ) = self . call ( "info" , & [ "server" ] ) {
319- if let Some ( ver) = utils:: get_regexp_captures (
320- s. as_str ( ) ,
321- r"(?m)\bredis_version:([0-9]+)\.([0-9]+)\.([0-9]+)\b" ,
322- ) {
323- return Ok ( Version {
324- major : ver[ 0 ] . parse :: < c_int > ( ) . unwrap ( ) ,
325- minor : ver[ 1 ] . parse :: < c_int > ( ) . unwrap ( ) ,
326- patch : ver[ 2 ] . parse :: < c_int > ( ) . unwrap ( ) ,
327- } ) ;
328- }
349+ if let Ok ( info) = self . call ( "info" , & [ "server" ] ) {
350+ Context :: version_from_info ( info)
351+ } else {
352+ Err ( RedisError :: Str ( "Error calling \" info server\" " ) )
329353 }
330- Err ( RedisError :: Str (
331- "Error getting redis_version from \" info server\" call" ,
332- ) )
333354 }
334355 }
335356 }
0 commit comments