valkey_module/context/
client.rs

1use crate::{
2    Context, RedisModuleClientInfo, RedisModule_GetClientCertificate, RedisModule_GetClientId,
3    RedisModule_GetClientInfoById, RedisModule_GetClientNameById,
4    RedisModule_GetClientUserNameById, RedisModule_SetClientNameById, ValkeyString,
5};
6use std::os::raw::c_void;
7
8impl RedisModuleClientInfo {
9    fn new() -> Self {
10        Self {
11            version: 1,
12            flags: 0,
13            id: 0,
14            addr: [0; 46],
15            port: 0,
16            db: 0,
17        }
18    }
19}
20
21/// GetClientNameById, GetClientUserNameById and GetClientCertificate use autoMemoryAdd on the ValkeyModuleString pointer
22// after the callback (command, server event handler, ...) these ValkeyModuleString pointers will be freed automatically
23impl Context {
24    pub fn get_client_id(&self) -> u64 {
25        unsafe { RedisModule_GetClientId.unwrap()(self.ctx) }
26    }
27
28    pub fn get_client_name(&self) -> ValkeyString {
29        let client_id = self.get_client_id();
30        let client_name = unsafe { RedisModule_GetClientNameById.unwrap()(self.ctx, client_id) };
31        ValkeyString::from_redis_module_string(self.ctx, client_name)
32    }
33
34    pub fn set_client_name(&self, client_name: &ValkeyString) -> i64 {
35        let client_id = self.get_client_id();
36        let resp = unsafe { RedisModule_SetClientNameById.unwrap()(client_id, client_name.inner) };
37        resp as i64
38    }
39
40    pub fn get_client_username(&self) -> ValkeyString {
41        let client_id = self.get_client_id();
42        let client_username =
43            unsafe { RedisModule_GetClientUserNameById.unwrap()(self.ctx, client_id) };
44        ValkeyString::from_redis_module_string(self.ctx, client_username)
45    }
46
47    pub fn get_client_cert(&self) -> ValkeyString {
48        let client_id = self.get_client_id();
49        let client_cert = unsafe { RedisModule_GetClientCertificate.unwrap()(self.ctx, client_id) };
50        ValkeyString::from_redis_module_string(self.ctx, client_cert)
51    }
52
53    pub fn get_client_info(&self) -> RedisModuleClientInfo {
54        let client_id = self.get_client_id();
55        let mut mci = RedisModuleClientInfo::new();
56        let mci_ptr: *mut c_void = &mut mci as *mut _ as *mut c_void;
57        unsafe { RedisModule_GetClientInfoById.unwrap()(mci_ptr, client_id) };
58        mci
59    }
60}