REPLACE option for RESTORE.

The REPLACE option deletes an existing key with the same name (if any)
and materializes the new one. The default behavior without RESTORE is to
return an error if a key already exists.
This commit is contained in:
antirez
2012-11-07 10:57:23 +01:00
parent c4b0b6854e
commit e5b5763f56
3 changed files with 33 additions and 4 deletions

View File

@ -1539,15 +1539,25 @@ void dumpCommand(redisClient *c) {
return;
}
/* RESTORE key ttl serialized-value */
/* RESTORE key ttl serialized-value [REPLACE] */
void restoreCommand(redisClient *c) {
long ttl;
rio payload;
int type;
int j, type, replace = 0;
robj *obj;
/* Parse additional options */
for (j = 4; j < c->argc; j++) {
if (!strcasecmp(c->argv[j]->ptr,"replace")) {
replace = 1;
} else {
addReply(c,shared.syntaxerr);
return;
}
}
/* Make sure this key does not already exist here... */
if (lookupKeyWrite(c->db,c->argv[1]) != NULL) {
if (!replace && lookupKeyWrite(c->db,c->argv[1]) != NULL) {
addReplyError(c,"Target key name is busy.");
return;
}
@ -1574,6 +1584,9 @@ void restoreCommand(redisClient *c) {
return;
}
/* Remove the old key if needed. */
if (replace) dbDelete(c->db,c->argv[1]);
/* Create the key and set the TTL if any */
dbAdd(c->db,c->argv[1],obj);
if (ttl) setExpire(c->db,c->argv[1],mstime()+ttl);