Module: kamailio
Branch: master
Commit: 81ad6adb6456490bce9dfe019c22857713669a52
URL: 
https://github.com/kamailio/kamailio/commit/81ad6adb6456490bce9dfe019c22857713669a52

Author: Lucian Balaceanu <lucian.balace...@1and1.ro>
Committer: GitHub <nore...@github.com>
Date: 2017-09-12T17:00:38+03:00

Merge pull request #1233 from hdikme/master

carrierroute: warning for the same carrier/domain having routes with only 0 
probability

---

Modified: src/modules/carrierroute/cr_db.c
Modified: src/modules/carrierroute/cr_db.h
Modified: src/modules/carrierroute/cr_func.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/81ad6adb6456490bce9dfe019c22857713669a52.diff
Patch: 
https://github.com/kamailio/kamailio/commit/81ad6adb6456490bce9dfe019c22857713669a52.patch

---

diff --git a/src/modules/carrierroute/cr_db.c b/src/modules/carrierroute/cr_db.c
index d651db1b49..010f99d715 100644
--- a/src/modules/carrierroute/cr_db.c
+++ b/src/modules/carrierroute/cr_db.c
@@ -265,6 +265,7 @@ int load_user_carrier(str * user, str * domain) {
  */
 int load_route_data_db(struct route_data_t * rd) {
        db1_res_t * res = NULL;
+       db1_res_t * prob_res = NULL;
        db_row_t * row = NULL;
        int i, ret;
        struct carrier_data_t * tmp_carrier_data;
@@ -352,6 +353,7 @@ int load_route_data_db(struct route_data_t * rd) {
                }
        }
        int n = 0;
+       boolean query_done = false;
        do {
                LM_DBG("loading, cycle %d", n++);
                for (i = 0; i < RES_ROW_N(res); ++i) {
@@ -396,6 +398,35 @@ int load_route_data_db(struct route_data_t * rd) {
                                        p_tmp_comment) == -1) {
                                goto errout;
                        }
+                       if (row->values[COL_PROB].val.double_val == 0 && 
!query_done) {
+                               int ret_tmp;
+                               char query_tmp[QUERY_LEN];
+                               str query_tmp_str;
+
+                               memset(query_tmp, 0, QUERY_LEN);
+                               ret_tmp = snprintf(query_tmp, QUERY_LEN, 
"SELECT * FROM %.*s WHERE %.*s=%d and %.*s=%d and %.*s>%d",
+                                               carrierroute_table.len, 
carrierroute_table.s, columns[COL_CARRIER]->len, columns[COL_CARRIER]->s, 
row->values[COL_CARRIER].val.int_val,
+                                               columns[COL_DOMAIN]->len, 
columns[COL_DOMAIN]->s, row->values[COL_DOMAIN].val.int_val, 
columns[COL_PROB]->len, columns[COL_PROB]->s, 0);
+
+                               if (ret_tmp < 0) {
+                                       LM_ERR("error in snprintf while 
querying prob column");
+                                       goto errout;
+                               }
+                               query_tmp_str.s = query_tmp;
+                               query_tmp_str.len = ret_tmp;
+
+                               if 
(carrierroute_dbf.raw_query(carrierroute_dbh, &query_tmp_str, &prob_res) < 0) {
+                                       LM_ERR("Failed to query carrierroute db 
table based on prob column.\n");
+                                       goto errout;
+                               }
+                               if(RES_ROW_N(prob_res) == 0) {
+                                       LM_ERR("Carrierroute db table contains 
route(s) with only 0 probability.\n");
+                                       query_done = true;
+                               }
+                               carrierroute_dbf.free_result(carrierroute_dbh, 
prob_res);
+                               prob_res = NULL;
+                       }
+
                }
                if (DB_CAPABILITY(carrierroute_dbf, DB_CAP_FETCH)) {
                        if(carrierroute_dbf.fetch_result(carrierroute_dbh, 
&res,  cfg_get(carrierroute, carrierroute_cfg, fetch_rows)) < 0) {
@@ -462,5 +493,8 @@ int load_route_data_db(struct route_data_t * rd) {
        if (res) {
                carrierroute_dbf.free_result(carrierroute_dbh, res);
        }
+       if (prob_res) {
+               carrierroute_dbf.free_result(carrierroute_dbh, prob_res);
+       }
        return -1;
 }
diff --git a/src/modules/carrierroute/cr_db.h b/src/modules/carrierroute/cr_db.h
index 1f53c9307b..ffea731192 100644
--- a/src/modules/carrierroute/cr_db.h
+++ b/src/modules/carrierroute/cr_db.h
@@ -88,4 +88,9 @@ int load_route_data_db (struct route_data_t * rd);
 
 int load_user_carrier(str * user, str * domain);
 
+typedef enum {
+       false = 0,
+       true = 1
+} boolean;
+
 #endif
diff --git a/src/modules/carrierroute/cr_func.c 
b/src/modules/carrierroute/cr_func.c
index 6b6db1387b..c4ce4d52a0 100644
--- a/src/modules/carrierroute/cr_func.c
+++ b/src/modules/carrierroute/cr_func.c
@@ -471,7 +471,7 @@ static int rewrite_on_rule(struct route_flags *rf_head, 
flag_t flags, str * dest
                        avp_value_t cr_new_uri;
 
                        if(rf->dice_max == 0) {
-                               LM_ERR("invalid dice_max value\n");
+                               LM_ERR("invalid dice_max value (route has 
probability 0)\n");
                                return -1;
                        }
                        if ((prob = hash_func(msg, hash_source, rf->dice_max)) 
< 0) {


_______________________________________________
Kamailio (SER) - Development Mailing List
sr-dev@lists.kamailio.org
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to