Skip to content

Commit 2baa37c

Browse files
committed
add get value for read only keys)
1 parent 4c354da commit 2baa37c

File tree

1 file changed

+49
-47
lines changed

1 file changed

+49
-47
lines changed

src/key.rs

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ use libc::size_t;
77

88
use crate::error::Error;
99
use crate::from_byte_string;
10-
use crate::native_types::redis_log;
1110
use crate::native_types::RedisType;
1211
use crate::raw;
1312
use crate::RedisError;
1413
use crate::RedisResult;
1514
use 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

Comments
 (0)