summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2020-04-01 22:11:59 +0200
committerantirez <antirez@gmail.com>2020-04-01 22:11:59 +0200
commit8cdc15c3093a14f4a9af45cfae5679c67eda3fa0 (patch)
treef2d4f110c28b8672e960995253692b96872c2b94
parent4cbf3f5dddc7c765269d8ce9eceb406ccde036d6 (diff)
downloadredis-8cdc15c3093a14f4a9af45cfae5679c67eda3fa0.tar.gz
LCS: implement KEYS option.
-rw-r--r--src/t_string.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/t_string.c b/src/t_string.c
index 30999ee70..0b159e6b3 100644
--- a/src/t_string.c
+++ b/src/t_string.c
@@ -482,12 +482,13 @@ void strlenCommand(client *c) {
/* LCS -- Longest common subsequence.
*
- * LCS [IDX] [STOREIDX <key>] STRINGS <string> <string> */
+ * LCS [IDX] [STOREIDX <key>] STRINGS <string> <string> | KEYS <keya> <keyb> */
void lcsCommand(client *c) {
uint32_t i, j;
sds a = NULL, b = NULL;
int getlen = 0, getidx = 0;
robj *idxkey = NULL; /* STOREIDX will set this and getidx to 1. */
+ robj *obja = NULL, *objb = NULL;
for (j = 1; j < (uint32_t)c->argc; j++) {
char *opt = c->argv[j]->ptr;
@@ -509,6 +510,18 @@ void lcsCommand(client *c) {
a = c->argv[j+1]->ptr;
b = c->argv[j+2]->ptr;
j += 2;
+ } else if (!strcasecmp(opt,"KEYS")) {
+ if (moreargs != 2) {
+ addReplyError(c,"LCS requires exactly two keys");
+ return;
+ }
+ obja = lookupKeyRead(c->db,c->argv[j+1]);
+ objb = lookupKeyRead(c->db,c->argv[j+2]);
+ obja = obja ? getDecodedObject(obja) : createStringObject("",0);
+ objb = objb ? getDecodedObject(objb) : createStringObject("",0);
+ a = obja->ptr;
+ b = objb->ptr;
+ j += 2;
} else {
addReply(c,shared.syntaxerr);
return;
@@ -517,7 +530,8 @@ void lcsCommand(client *c) {
/* Complain if the user passed ambiguous parameters. */
if (a == NULL) {
- addReplyError(c,"STRINGS <string-a> <string-b> is mandatory");
+ addReplyError(c,"Please specify two strings: "
+ "STRINGS or KEYS options are mandatory");
return;
} else if (getlen && (getidx && idxkey == NULL)) {
addReplyError(c,
@@ -651,6 +665,8 @@ void lcsCommand(client *c) {
}
/* Cleanup. */
+ if (obja) decrRefCount(obja);
+ if (objb) decrRefCount(objb);
sdsfree(result);
zfree(lcs);
return;