summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2015-02-03 14:13:30 +0100
committerantirez <antirez@gmail.com>2015-02-03 14:13:30 +0100
commit51010007bc49b8a41525d294e34660e36339a7f6 (patch)
tree754d46628b635dc65ae8f518921a425016407710
parentfad758b32292b9467a65f9f0f32ec8d4d0c84d4e (diff)
parent352172a7ef5015c0c487ba6258cdf3b4b31a551c (diff)
downloadredis-51010007bc49b8a41525d294e34660e36339a7f6.tar.gz
Merge branch 'unstable' of git://github.com/mihirvj/redis into set-pr
-rw-r--r--src/t_string.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/t_string.c b/src/t_string.c
index e3c1e5f4a..34ab11b51 100644
--- a/src/t_string.c
+++ b/src/t_string.c
@@ -61,6 +61,8 @@ static int checkStringLength(redisClient *c, long long size) {
#define REDIS_SET_NO_FLAGS 0
#define REDIS_SET_NX (1<<0) /* Set if key not exists. */
#define REDIS_SET_XX (1<<1) /* Set if key exists. */
+#define REDIS_SET_EX (1<<2) /* Set if time in seconds is given */
+#define REDIS_SET_PX (1<<3) /* Set if time in ms in given */
void setGenericCommand(redisClient *c, int flags, robj *key, robj *val, robj *expire, int unit, robj *ok_reply, robj *abort_reply) {
long long milliseconds = 0; /* initialized to avoid any harmness warning */
@@ -102,18 +104,24 @@ void setCommand(redisClient *c) {
robj *next = (j == c->argc-1) ? NULL : c->argv[j+1];
if ((a[0] == 'n' || a[0] == 'N') &&
- (a[1] == 'x' || a[1] == 'X') && a[2] == '\0') {
+ (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' &&
+ !(flags & REDIS_SET_XX)) {
flags |= REDIS_SET_NX;
} else if ((a[0] == 'x' || a[0] == 'X') &&
- (a[1] == 'x' || a[1] == 'X') && a[2] == '\0') {
+ (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' &&
+ !(flags & REDIS_SET_NX)) {
flags |= REDIS_SET_XX;
} else if ((a[0] == 'e' || a[0] == 'E') &&
- (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' && next) {
+ (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' &&
+ !(flags & REDIS_SET_PX) && next) {
+ flags |= REDIS_SET_EX;
unit = UNIT_SECONDS;
expire = next;
j++;
} else if ((a[0] == 'p' || a[0] == 'P') &&
- (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' && next) {
+ (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' &&
+ !(flags & REDIS_SET_EX) && next) {
+ flags |= REDIS_SET_PX;
unit = UNIT_MILLISECONDS;
expire = next;
j++;