KEYDB.MVCCRESTORE key mvcc expire serialized-value */
| 5204 | |
| 5205 | /* KEYDB.MVCCRESTORE key mvcc expire serialized-value */ |
| 5206 | void mvccrestoreCommand(client *c) { |
| 5207 | long long expire; |
| 5208 | uint64_t mvcc; |
| 5209 | robj *key = c->argv[1], *obj = nullptr; |
| 5210 | int type; |
| 5211 | |
| 5212 | if (getUnsignedLongLongFromObjectOrReply(c, c->argv[2], &mvcc, "Invalid MVCC Tstamp") != C_OK) |
| 5213 | return; |
| 5214 | |
| 5215 | if (getLongLongFromObjectOrReply(c, c->argv[3], &expire, "Invalid expire") != C_OK) |
| 5216 | return; |
| 5217 | |
| 5218 | /* Verify RDB version and data checksum unles the client is already a replica or master */ |
| 5219 | if (!(c->flags & (CLIENT_SLAVE | CLIENT_MASTER))) { |
| 5220 | if (verifyDumpPayload((unsigned char*)ptrFromObj(c->argv[4]),sdslen(szFromObj(c->argv[4]))) == C_ERR) |
| 5221 | { |
| 5222 | addReplyError(c,"DUMP payload version or checksum are wrong"); |
| 5223 | return; |
| 5224 | } |
| 5225 | } |
| 5226 | |
| 5227 | rio payload; |
| 5228 | rioInitWithBuffer(&payload,szFromObj(c->argv[4])); |
| 5229 | if (((type = rdbLoadObjectType(&payload)) == -1) || |
| 5230 | ((obj = rdbLoadObject(type,&payload,szFromObj(key),NULL,OBJ_MVCC_INVALID)) == NULL)) |
| 5231 | { |
| 5232 | addReplyError(c,"Bad data format"); |
| 5233 | return; |
| 5234 | } |
| 5235 | setMvccTstamp(obj, mvcc); |
| 5236 | |
| 5237 | /* Create the key and set the TTL if any */ |
| 5238 | if (dbMerge(c->db,szFromObj(key),obj,true)) { |
| 5239 | if (expire >= 0) { |
| 5240 | setExpire(c,c->db,key,nullptr,expire); |
| 5241 | } |
| 5242 | signalModifiedKey(c,c->db,key); |
| 5243 | notifyKeyspaceEvent(NOTIFY_GENERIC,"restore",key,c->db->id); |
| 5244 | } else { |
| 5245 | decrRefCount(obj); |
| 5246 | } |
| 5247 | addReply(c,shared.ok); |
| 5248 | g_pserver->dirty++; |
| 5249 | } |
| 5250 | |
| 5251 | /* RESTORE key ttl serialized-value [REPLACE] */ |
| 5252 | void restoreCommand(client *c) { |
nothing calls this directly
no test coverage detected