Showing with 36 additions and 10 deletions.
  1. +4 −0 action.c
  2. +1 −0 cachedb/cachedb.h
  3. +12 −0 modules/cachedb_redis/cachedb_redis_dbase.c
  4. +15 −10 pvar.c
  5. +3 −0 usr_avp.c
  6. +1 −0 usr_avp.h
@@ -1580,6 +1580,10 @@ int do_action(struct action* a, struct sip_msg* msg)
avp_type |= AVP_VAL_STR;
avp_val.s = cdb_reply[i][j].val.s;
break;
case CDB_NULL:
avp_type |= AVP_VAL_NULL;
avp_val.s = cdb_reply[i][j].val.s;
break;
default:
LM_WARN("Unknown type %d\n",cdb_reply[i][j].type);
goto next_avp;
@@ -42,6 +42,7 @@ struct cachedb_url
typedef enum {
CDB_INT,
CDB_STR,
CDB_NULL,
} cdb_raw_type_t;

typedef struct {
@@ -474,11 +474,18 @@ int redis_raw_query_handle_reply(redisReply *reply,cdb_raw_entry ***ret,
(*ret)[current_size][0].type = CDB_INT;
current_size++;
break;
case REDIS_REPLY_NIL:
(*ret)[current_size][0].type = CDB_NULL;
(*ret)[current_size][0].val.s.s = NULL;
(*ret)[current_size][0].val.s.len = 0;
current_size++;
break;
case REDIS_REPLY_ARRAY:
for (i=0;i<reply->elements;i++) {
switch (reply->element[i]->type) {
case REDIS_REPLY_STRING:
case REDIS_REPLY_INTEGER:
case REDIS_REPLY_NIL:
if (current_size > 0) {
*ret = pkg_realloc(*ret,(current_size + 1) * sizeof(cdb_raw_entry *));
if (*ret == NULL) {
@@ -496,6 +503,11 @@ int redis_raw_query_handle_reply(redisReply *reply,cdb_raw_entry ***ret,
if (reply->element[i]->type == REDIS_REPLY_INTEGER) {
(*ret)[current_size][0].val.n = reply->element[i]->integer;
(*ret)[current_size][0].type = CDB_INT;
} else if (reply->element[i]->type == REDIS_REPLY_NIL) {
(*ret)[current_size][0].val.s.s = NULL;
(*ret)[current_size][0].val.s.len = 0;
(*ret)[current_size][0].type = CDB_NULL;

} else {
(*ret)[current_size][0].val.s.s = pkg_malloc(reply->element[i]->len);
if (! (*ret)[current_size][0].val.s.s ) {
25 pvar.c
@@ -2011,9 +2011,10 @@ static int pv_get_avp(struct sip_msg *msg, pv_param_t *param, pv_value_t *res)

if (idxf!=PV_IDX_ALL && idx==0)
{
if(avp->flags & AVP_VAL_STR)
{
if(avp->flags & AVP_VAL_STR) {
res->rs = avp_value.s;
} else if(avp->flags & AVP_VAL_NULL) {
res->flags |= PV_VAL_NULL;
} else {
res->rs.s = sint2str(avp_value.n, &res->rs.len);
res->ri = avp_value.n;
@@ -2028,9 +2029,10 @@ static int pv_get_avp(struct sip_msg *msg, pv_param_t *param, pv_value_t *res)
p = pv_local_buf;

/* separately handle the first AVP */
if(avp->flags & AVP_VAL_STR)
{
if(avp->flags & AVP_VAL_STR) {
res->rs = avp_value.s;
} else if(avp->flags & AVP_VAL_NULL) {
res->rs.s = NULL;
} else {
res->rs.s = sint2str(avp_value.n, &res->rs.len);
}
@@ -2046,9 +2048,10 @@ static int pv_get_avp(struct sip_msg *msg, pv_param_t *param, pv_value_t *res)
/* print subsequent AVPs as [DELIM AVP]* */
while ((avp = search_first_avp(name_type, avp_name, &avp_value, avp)))
{
if(avp->flags & AVP_VAL_STR)
{
if(avp->flags & AVP_VAL_STR) {
res->rs = avp_value.s;
} else if(avp->flags & AVP_VAL_NULL) {
res->rs.s = NULL;
} else {
res->rs.s = sint2str(avp_value.n, &res->rs.len);
}
@@ -2092,9 +2095,10 @@ static int pv_get_avp(struct sip_msg *msg, pv_param_t *param, pv_value_t *res)
idx = n - idx;
if(idx==0)
{
if(avp->flags & AVP_VAL_STR)
{
if(avp->flags & AVP_VAL_STR) {
res->rs = avp_value.s;
} else if(avp->flags & AVP_VAL_NULL) {
res->flags |= PV_VAL_NULL;
} else {
res->rs.s = sint2str(avp_value.n, &res->rs.len);
res->ri = avp_value.n;
@@ -2110,9 +2114,10 @@ static int pv_get_avp(struct sip_msg *msg, pv_param_t *param, pv_value_t *res)

if(avp!=0)
{
if(avp->flags & AVP_VAL_STR)
{
if(avp->flags & AVP_VAL_STR) {
res->rs = avp_value.s;
} else if(avp->flags & AVP_VAL_NULL) {
res->flags |= PV_VAL_NULL;
} else {
res->rs.s = sint2str(avp_value.n, &res->rs.len);
res->ri = avp_value.n;
@@ -130,6 +130,9 @@ struct usr_avp* new_avp(unsigned short flags, int id, int_str val)
s->s = (char*)s + sizeof(str);
memcpy( s->s, val.s.s , s->len);
s->s[s->len] = 0;
} else if (flags & AVP_VAL_NULL) {
LM_ERR("id: %d s- NULL VALUE!\n", id);
avp->data = NULL;
} else {
avp->data = (void *)(long)val.n;
}
@@ -72,6 +72,7 @@ struct usr_avp {

#define AVP_NAME_STR (1<<0)
#define AVP_VAL_STR (1<<1)
#define AVP_VAL_NULL (1<<2)

#define is_avp_str_name(a) (a->flags&AVP_NAME_STR)
#define is_avp_str_val(a) (a->flags&AVP_VAL_STR)