RESTORE key ttl serialized-value [REPLACE] */
| 5250 | |
| 5251 | /* RESTORE key ttl serialized-value [REPLACE] */ |
| 5252 | void restoreCommand(client *c) { |
| 5253 | long long ttl, lfu_freq = -1, lru_idle = -1, lru_clock = -1; |
| 5254 | rio payload; |
| 5255 | int j, type, replace = 0, absttl = 0; |
| 5256 | robj *obj; |
| 5257 | |
| 5258 | /* Parse additional options */ |
| 5259 | for (j = 4; j < c->argc; j++) { |
| 5260 | int additional = c->argc-j-1; |
| 5261 | if (!strcasecmp(szFromObj(c->argv[j]),"replace")) { |
| 5262 | replace = 1; |
| 5263 | } else if (!strcasecmp(szFromObj(c->argv[j]),"absttl")) { |
| 5264 | absttl = 1; |
| 5265 | } else if (!strcasecmp(szFromObj(c->argv[j]),"idletime") && additional >= 1 && |
| 5266 | lfu_freq == -1) |
| 5267 | { |
| 5268 | if (getLongLongFromObjectOrReply(c,c->argv[j+1],&lru_idle,NULL) |
| 5269 | != C_OK) return; |
| 5270 | if (lru_idle < 0) { |
| 5271 | addReplyError(c,"Invalid IDLETIME value, must be >= 0"); |
| 5272 | return; |
| 5273 | } |
| 5274 | lru_clock = LRU_CLOCK(); |
| 5275 | j++; /* Consume additional arg. */ |
| 5276 | } else if (!strcasecmp(szFromObj(c->argv[j]),"freq") && additional >= 1 && |
| 5277 | lru_idle == -1) |
| 5278 | { |
| 5279 | if (getLongLongFromObjectOrReply(c,c->argv[j+1],&lfu_freq,NULL) |
| 5280 | != C_OK) return; |
| 5281 | if (lfu_freq < 0 || lfu_freq > 255) { |
| 5282 | addReplyError(c,"Invalid FREQ value, must be >= 0 and <= 255"); |
| 5283 | return; |
| 5284 | } |
| 5285 | j++; /* Consume additional arg. */ |
| 5286 | } else { |
| 5287 | addReplyErrorObject(c,shared.syntaxerr); |
| 5288 | return; |
| 5289 | } |
| 5290 | } |
| 5291 | |
| 5292 | /* Make sure this key does not already exist here... */ |
| 5293 | robj *key = c->argv[1]; |
| 5294 | if (!replace && lookupKeyWrite(c->db,key) != NULL) { |
| 5295 | addReplyErrorObject(c,shared.busykeyerr); |
| 5296 | return; |
| 5297 | } |
| 5298 | |
| 5299 | /* Check if the TTL value makes sense */ |
| 5300 | if (getLongLongFromObjectOrReply(c,c->argv[2],&ttl,NULL) != C_OK) { |
| 5301 | return; |
| 5302 | } else if (ttl < 0) { |
| 5303 | addReplyError(c,"Invalid TTL value, must be >= 0"); |
| 5304 | return; |
| 5305 | } |
| 5306 | |
| 5307 | /* Verify RDB version and data checksum. */ |
| 5308 | if (verifyDumpPayload((unsigned char*)ptrFromObj(c->argv[3]),sdslen(szFromObj(c->argv[3]))) == C_ERR) |
| 5309 | { |
nothing calls this directly
no test coverage detected