/*! \brief RPC htable.get command to get one item */ static void htable_rpc_get(rpc_t* rpc, void* c) { str htname, keyname; ht_t *ht; ht_cell_t *htc; /*!< One HT cell */ void* th; void* vh; if (rpc->scan(c, "SS", &htname, &keyname) < 2) { rpc->fault(c, 500, "Not enough parameters (htable name and key name)"); return; } /* Find the htable */ ht = ht_get_table(&htname); if (!ht) { rpc->fault(c, 500, "No such htable"); return; } /* Find the cell */ htc = ht_cell_pkg_copy(ht, &keyname, NULL); if(htc == NULL) { /* Print error message */ rpc->fault(c, 500, "Key name doesn't exist in htable."); return; } /* add entry node */ if (rpc->add(c, "{", &th) < 0) { rpc->fault(c, 500, "Internal error creating rpc"); goto error; } if(rpc->struct_add(th, "{", "item", &vh)<0) { rpc->fault(c, 500, "Internal error creating rpc"); goto error; } if(htc->flags&AVP_VAL_STR) { if(rpc->struct_add(vh, "SS", "name", &htc->name.s, "value", &htc->value.s)<0) { rpc->fault(c, 500, "Internal error adding item"); goto error; } } else { if(rpc->struct_add(vh, "Sd", "name", &htc->name.s, "value", (int)htc->value.n)) { rpc->fault(c, 500, "Internal error adding item"); goto error; } } error: /* Release the allocated memory */ ht_cell_pkg_free(htc); return; }
int pv_get_ht_add(struct sip_msg *msg, pv_param_t *param, pv_value_t *res, int val) { str htname; ht_cell_t *htc=NULL; ht_pv_t *hpv; hpv = (ht_pv_t*)param->pvn.u.dname; if(hpv->ht==NULL) { hpv->ht = ht_get_table(&hpv->htname); if(hpv->ht==NULL) return pv_get_null(msg, param, res); } if(pv_printf_s(msg, hpv->pve, &htname)!=0) { LM_ERR("cannot get $ht name\n"); return -1; } htc = ht_cell_value_add(hpv->ht, &htname, val, 1, _htc_local); if(htc==NULL) { return pv_get_null(msg, param, res); } if(_htc_local!=htc) { ht_cell_pkg_free(_htc_local); _htc_local=htc; } if(htc->flags&AVP_VAL_STR) return pv_get_null(msg, param, res); /* integer */ if (hpv->ht->dmqreplicate>0) { if (ht_dmq_replicate_action(HT_DMQ_SET_CELL, &hpv->htname, &htname, 0, &htc->value, 1)!=0) { LM_ERR("dmq relication failed\n"); } } return pv_get_sintval(msg, param, res, htc->value.n); }
int pv_get_ht_cell(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { str htname; ht_cell_t *htc=NULL; ht_pv_t *hpv; hpv = (ht_pv_t*)param->pvn.u.dname; if(hpv->ht==NULL) { hpv->ht = ht_get_table(&hpv->htname); if(hpv->ht==NULL) return pv_get_null(msg, param, res); } if(pv_printf_s(msg, hpv->pve, &htname)!=0) { LM_ERR("cannot get $ht name\n"); return -1; } htc = ht_cell_pkg_copy(hpv->ht, &htname, _htc_local); if(htc==NULL) { if(hpv->ht->flags==PV_VAL_INT) return pv_get_sintval(msg, param, res, hpv->ht->initval.n); return pv_get_null(msg, param, res); } if(_htc_local!=htc) { ht_cell_pkg_free(_htc_local); _htc_local=htc; } if(htc->flags&AVP_VAL_STR) return pv_get_strval(msg, param, res, &htc->value.s); /* integer */ return pv_get_sintval(msg, param, res, htc->value.n); }
/*! \brief RPC htable.get command to get one item */ static void htable_rpc_get(rpc_t* rpc, void* c) { str htname, keyname; ht_t *ht; ht_cell_t *htc; /*!< One HT cell */ void* th; void* vh; struct tm *_expire_t; char expire_buf[RPC_DATE_BUF_LEN]="NEVER"; if (rpc->scan(c, "SS", &htname, &keyname) < 2) { rpc->fault(c, 500, "Not enough parameters (htable name and key name)"); return; } /* Find the htable */ ht = ht_get_table(&htname); if (!ht) { rpc->fault(c, 500, "No such htable"); return; } /* Find the cell */ htc = ht_cell_pkg_copy(ht, &keyname, NULL); if(htc == NULL) { /* Print error message */ rpc->fault(c, 500, "Key name doesn't exist in htable."); return; } /* add entry node */ if (rpc->add(c, "{", &th) < 0) { rpc->fault(c, 500, "Internal error creating rpc"); goto error; } if(rpc->struct_add(th, "{", "item", &vh)<0) { rpc->fault(c, 500, "Internal error creating rpc"); goto error; } if (htc->expire) { _expire_t = localtime(&htc->expire); strftime(expire_buf, RPC_DATE_BUF_LEN - 1, "%Y-%m-%d %H:%M:%S", _expire_t); } if(htc->flags&AVP_VAL_STR) { if(rpc->struct_add(vh, "SSds", "name", &htc->name.s, "value", &htc->value.s, "flags", htc->flags, "expire", expire_buf)<0) { rpc->fault(c, 500, "Internal error adding item"); goto error; } } else { if(rpc->struct_add(vh, "Sdds", "name", &htc->name.s, "value", (int)htc->value.n, "flags", htc->flags, "expire", expire_buf)<0) { rpc->fault(c, 500, "Internal error adding item"); goto error; } } error: /* Release the allocated memory */ ht_cell_pkg_free(htc); return; }