1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
void getexCommand(client *c) { robj *expire = NULL; int unit = UNIT_SECONDS; int flags = OBJ_NO_FLAGS;
if (parseExtendedStringArgumentsOrReply(c,&flags,&unit,&expire,COMMAND_GET) != C_OK) { return; }
robj *o; if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.null[c->resp])) == NULL) return;
if (checkType(c,o,OBJ_STRING)) { return; }
long long milliseconds = 0, when = 0;
if (expire) { if (getLongLongFromObjectOrReply(c, expire, &milliseconds, NULL) != C_OK) return; if (milliseconds <= 0 || (unit == UNIT_SECONDS && milliseconds > LLONG_MAX / 1000)) { addReplyErrorFormat(c, "invalid expire time in %s", c->cmd->name); return; } if (unit == UNIT_SECONDS) milliseconds *= 1000; when = milliseconds; if ((flags & OBJ_PX) || (flags & OBJ_EX)) when += mstime(); if (when <= 0) { addReplyErrorFormat(c, "invalid expire time in %s", c->cmd->name); return; } }
addReplyBulk(c,o);
if (((flags & OBJ_PXAT) || (flags & OBJ_EXAT)) && checkAlreadyExpired(milliseconds)) {
int deleted = server.lazyfree_lazy_expire ? dbAsyncDelete(c->db, c->argv[1]) : dbSyncDelete(c->db, c->argv[1]); serverAssert(deleted); robj *aux = server.lazyfree_lazy_expire ? shared.unlink : shared.del; rewriteClientCommandVector(c,2,aux,c->argv[1]); signalModifiedKey(c, c->db, c->argv[1]); notifyKeyspaceEvent(NOTIFY_GENERIC, "del", c->argv[1], c->db->id); server.dirty++; } else if (expire) { setExpire(c,c->db,c->argv[1],when); robj *exp = (flags & OBJ_PXAT) || (flags & OBJ_EXAT) ? shared.pexpireat : shared.pexpire; robj* millisecondObj = createStringObjectFromLongLong(milliseconds); rewriteClientCommandVector(c,3,exp,c->argv[1],millisecondObj); decrRefCount(millisecondObj); signalModifiedKey(c, c->db, c->argv[1]); notifyKeyspaceEvent(NOTIFY_GENERIC,"expire",c->argv[1],c->db->id); server.dirty++; } else if (flags & OBJ_PERSIST) { if (removeExpire(c->db, c->argv[1])) { signalModifiedKey(c, c->db, c->argv[1]); rewriteClientCommandVector(c, 2, shared.persist, c->argv[1]); notifyKeyspaceEvent(NOTIFY_GENERIC,"persist",c->argv[1],c->db->id); server.dirty++; } } }
|