RESTORE key ttl serialized-value [REPLACE] */
| 5114 | |
| 5115 | /* RESTORE key ttl serialized-value [REPLACE] */ |
| 5116 | void restoreCommand(client *c) { |
| 5117 | long long ttl, lfu_freq = -1, lru_idle = -1, lru_clock = -1; |
| 5118 | rio payload; |
| 5119 | int j, type, replace = 0, absttl = 0; |
| 5120 | robj *obj; |
| 5121 | |
| 5122 | /* Parse additional options */ |
| 5123 | for (j = 4; j < c->argc; j++) { |
| 5124 | int additional = c->argc-j-1; |
| 5125 | if (!strcasecmp(c->argv[j]->ptr,"replace")) { |
| 5126 | replace = 1; |
| 5127 | } else if (!strcasecmp(c->argv[j]->ptr,"absttl")) { |
| 5128 | absttl = 1; |
| 5129 | } else if (!strcasecmp(c->argv[j]->ptr,"idletime") && additional >= 1 && |
| 5130 | lfu_freq == -1) |
| 5131 | { |
| 5132 | if (getLongLongFromObjectOrReply(c,c->argv[j+1],&lru_idle,NULL) |
| 5133 | != C_OK) return; |
| 5134 | if (lru_idle < 0) { |
| 5135 | addReplyError(c,"Invalid IDLETIME value, must be >= 0"); |
| 5136 | return; |
| 5137 | } |
| 5138 | lru_clock = LRU_CLOCK(); |
| 5139 | j++; /* Consume additional arg. */ |
| 5140 | } else if (!strcasecmp(c->argv[j]->ptr,"freq") && additional >= 1 && |
| 5141 | lru_idle == -1) |
| 5142 | { |
| 5143 | if (getLongLongFromObjectOrReply(c,c->argv[j+1],&lfu_freq,NULL) |
| 5144 | != C_OK) return; |
| 5145 | if (lfu_freq < 0 || lfu_freq > 255) { |
| 5146 | addReplyError(c,"Invalid FREQ value, must be >= 0 and <= 255"); |
| 5147 | return; |
| 5148 | } |
| 5149 | j++; /* Consume additional arg. */ |
| 5150 | } else { |
| 5151 | addReplyErrorObject(c,shared.syntaxerr); |
| 5152 | return; |
| 5153 | } |
| 5154 | } |
| 5155 | |
| 5156 | /* Make sure this key does not already exist here... */ |
| 5157 | robj *key = c->argv[1]; |
| 5158 | if (!replace && lookupKeyWrite(c->db,key) != NULL) { |
| 5159 | addReplyErrorObject(c,shared.busykeyerr); |
| 5160 | return; |
| 5161 | } |
| 5162 | |
| 5163 | /* Check if the TTL value makes sense */ |
| 5164 | if (getLongLongFromObjectOrReply(c,c->argv[2],&ttl,NULL) != C_OK) { |
| 5165 | return; |
| 5166 | } else if (ttl < 0) { |
| 5167 | addReplyError(c,"Invalid TTL value, must be >= 0"); |
| 5168 | return; |
| 5169 | } |
| 5170 | |
| 5171 | /* Verify RDB version and data checksum. */ |
| 5172 | if (verifyDumpPayload(c->argv[3]->ptr,sdslen(c->argv[3]->ptr)) == C_ERR) |
| 5173 | { |
nothing calls this directly
no test coverage detected