Quellcode durchsuchen

topos_redis: set expire for dialog and branch records

Daniel-Constantin Mierla vor 8 Jahren
Ursprung
Commit
5851bf01ba
1 geänderte Dateien mit 76 neuen und 0 gelöschten Zeilen
  1. 76 0
      src/modules/topos_redis/topos_redis_storage.c

+ 76 - 0
src/modules/topos_redis/topos_redis_storage.c

@@ -42,6 +42,7 @@
 
 extern str _topos_redis_serverid;
 extern ndb_redis_api_t _tps_redis_api;
+extern topos_api_t _tps_api;
 
 static str _tps_redis_bprefix = str_init("b:x:");
 static str _tps_redis_dprefix = str_init("d:z:");
@@ -93,6 +94,15 @@ str tt_key_x_tag = str_init("x_tag");
 str tt_key_s_method = str_init("s_method");
 str tt_key_s_cseq = str_init("s_cseq");
 
+#define TPS_REDIS_SET_ARGSV(sval, argc, argv, argvlen) \
+	do { \
+		if((sval)->s!=NULL && (sval)->len>0) { \
+			argv[argc] = (sval)->s; \
+			argvlen[argc] = (sval)->len; \
+			argc++; \
+		} \
+	} while(0)
+
 #define TPS_REDIS_SET_ARGS(sval, argc, akey, argv, argvlen) \
 	do { \
 		if((sval)->s!=NULL && (sval)->len>0) { \
@@ -119,6 +129,14 @@ str tt_key_s_cseq = str_init("s_cseq");
 		TPS_REDIS_SET_ARGS((sval), argc, akey, argv, argvlen); \
 	} while(0)
 
+#define TPS_REDIS_SET_ARGNV(nval, rp, sval, argc, argv, argvlen) \
+	do { \
+		(sval)->s = int2bstr((unsigned long)nval, rp, &(sval)->len); \
+		rp = (sval)->s + (sval)->len + 1; \
+		TPS_REDIS_SET_ARGSV((sval), argc, argv, argvlen); \
+	} while(0)
+
+
 /**
  *
  */
@@ -230,6 +248,35 @@ int tps_redis_insert_dialog(tps_data_t *td)
 			rkey.len, rkey.s, argc);
 	freeReplyObject(rrpl);
 
+	/* set expire for the key */
+	argc = 0;
+
+	argv[argc]    = "EXPIRE";
+	argvlen[argc] = 6;
+	argc++;
+
+	argv[argc]    = rkey.s;
+	argvlen[argc] = rkey.len;
+	argc++;
+
+	lval = (unsigned long)_tps_api.get_dialog_expire();
+	if(lval==0) {
+		return 0;
+	}
+	TPS_REDIS_SET_ARGNV(lval, rp, &rval, argc, argv, argvlen);
+
+	rrpl = _tps_redis_api.exec_argv(rsrv, argc, (const char **)argv, argvlen);
+	if(rrpl==NULL) {
+		LM_ERR("failed to execute expireredis command\n");
+		if(rsrv->ctxRedis->err) {
+			LM_ERR("redis error: %s\n", rsrv->ctxRedis->errstr);
+		}
+		return -1;
+	}
+	LM_DBG("expire set on dialog record for [%.*s] with argc %d\n",
+			rkey.len, rkey.s, argc);
+	freeReplyObject(rrpl);
+
 	return 0;
 }
 
@@ -328,6 +375,35 @@ int tps_redis_insert_branch(tps_data_t *td)
 
 	freeReplyObject(rrpl);
 
+	/* set expire for the key */
+	argc = 0;
+
+	argv[argc]    = "EXPIRE";
+	argvlen[argc] = 6;
+	argc++;
+
+	argv[argc]    = rkey.s;
+	argvlen[argc] = rkey.len;
+	argc++;
+
+	lval = (unsigned long)_tps_api.get_dialog_expire();
+	if(lval==0) {
+		return 0;
+	}
+	TPS_REDIS_SET_ARGNV(lval, rp, &rval, argc, argv, argvlen);
+
+	rrpl = _tps_redis_api.exec_argv(rsrv, argc, (const char **)argv, argvlen);
+	if(rrpl==NULL) {
+		LM_ERR("failed to execute expireredis command\n");
+		if(rsrv->ctxRedis->err) {
+			LM_ERR("redis error: %s\n", rsrv->ctxRedis->errstr);
+		}
+		return -1;
+	}
+	LM_DBG("expire set on branch record for [%.*s] with argc %d\n",
+			rkey.len, rkey.s, argc);
+	freeReplyObject(rrpl);
+
 	return 0;
 }