/* loads info from the db */ int load_db_info(db_func_t *dr_dbf, db_con_t* db_hdl, str *db_table, cluster_info_t **cl_list) { int int_vals[NO_DB_INT_VALS]; char *str_vals[NO_DB_STR_VALS]; int no_clusters; int i; int rc; node_info_t *new_info = NULL; db_key_t columns[NO_DB_COLS]; /* the columns from the db table */ db_res_t *res = NULL; db_row_t *row; static db_key_t clusterer_node_id_key = &node_id_col; static db_val_t clusterer_node_id_value = { .type = DB_INT, .nul = 0, }; *cl_list = NULL; columns[0] = &id_col; columns[1] = &cluster_id_col; columns[2] = &node_id_col; columns[3] = &url_col; columns[4] = &state_col; columns[5] = &no_ping_retries_col; columns[6] = &priority_col; columns[7] = &sip_addr_col; columns[8] = &flags_col; columns[9] = &description_col; CON_OR_RESET(db_hdl); if (db_check_table_version(dr_dbf, db_hdl, db_table, CLUSTERER_TABLE_VERSION)) goto error; if (dr_dbf->use_table(db_hdl, db_table) < 0) { LM_ERR("cannot select table: \"%.*s\"\n", db_table->len, db_table->s); goto error; } LM_DBG("DB query - retrieve the list of clusters" " in which the local node runs\n"); VAL_INT(&clusterer_node_id_value) = current_id; /* first we see in which clusters the local node runs*/ if (dr_dbf->query(db_hdl, &clusterer_node_id_key, &op_eq, &clusterer_node_id_value, columns+1, 1, 1, 0, &res) < 0) { LM_ERR("DB query failed - cannot retrieve the list of clusters in which" " the local node runs\n"); goto error; } LM_DBG("%d rows found in %.*s\n", RES_ROW_N(res), db_table->len, db_table->s); if (RES_ROW_N(res) > MAX_NO_CLUSTERS) { LM_ERR("Defined: %d clusters for local node, maximum number of clusters " "supported(%d) exceeded\n", RES_ROW_N(res), MAX_NO_CLUSTERS); goto error; } if (RES_ROW_N(res) == 0) { LM_WARN("No nodes found in cluster\n"); return 1; } clusterer_cluster_id_key = pkg_realloc(clusterer_cluster_id_key, RES_ROW_N(res) * sizeof(db_key_t)); if (!clusterer_cluster_id_key) { LM_ERR("no more pkg memory\n"); goto error; } for (i = 0; i < RES_ROW_N(res); i++) clusterer_cluster_id_key[i] = &cluster_id_col; clusterer_cluster_id_value = pkg_realloc(clusterer_cluster_id_value, RES_ROW_N(res) * sizeof(db_val_t)); if (!clusterer_cluster_id_value) { LM_ERR("no more pkg memory\n"); goto error; } for (i = 0; i < RES_ROW_N(res); i++) { VAL_TYPE(clusterer_cluster_id_value + i) = DB_INT; VAL_NULL(clusterer_cluster_id_value + i) = 0; } for (i = 0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; check_val(cluster_id_col, ROW_VALUES(row), DB_INT, 1, 0); VAL_INT(clusterer_cluster_id_value + i) = VAL_INT(ROW_VALUES(row)); } no_clusters = RES_ROW_N(res); dr_dbf->free_result(db_hdl, res); res = NULL; LM_DBG("DB query - retrieve nodes info\n"); CON_USE_OR_OP(db_hdl); if (dr_dbf->query(db_hdl, clusterer_cluster_id_key, 0, clusterer_cluster_id_value, columns, no_clusters, NO_DB_COLS, 0, &res) < 0) { LM_ERR("DB query failed - retrieve valid connections\n"); goto error; } LM_DBG("%d rows found in %.*s\n", RES_ROW_N(res), db_table->len, db_table->s); if (RES_ROW_N(res) > MAX_NO_NODES) { LM_ERR("Defined: %d nodes in local node's clusters, maximum number of nodes " "supported(%d) exceeded\n", RES_ROW_N(res), MAX_NO_NODES); goto error; } for (i = 0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; check_val(id_col, ROW_VALUES(row), DB_INT, 1, 0); int_vals[INT_VALS_ID_COL] = VAL_INT(ROW_VALUES(row)); check_val(cluster_id_col, ROW_VALUES(row) + 1, DB_INT, 1, 0); int_vals[INT_VALS_CLUSTER_ID_COL] = VAL_INT(ROW_VALUES(row) + 1); check_val(node_id_col, ROW_VALUES(row) + 2, DB_INT, 1, 0); int_vals[INT_VALS_NODE_ID_COL] = VAL_INT(ROW_VALUES(row) + 2); check_val(url_col, ROW_VALUES(row) + 3, DB_STRING, 1, 1); str_vals[STR_VALS_URL_COL] = (char*) VAL_STRING(ROW_VALUES(row) + 3); check_val(state_col, ROW_VALUES(row) + 4, DB_INT, 1, 0); int_vals[INT_VALS_STATE_COL] = VAL_INT(ROW_VALUES(row) + 4); check_val(no_ping_retries_col, ROW_VALUES(row) + 5, DB_INT, 1, 0); int_vals[INT_VALS_NO_PING_RETRIES_COL] = VAL_INT(ROW_VALUES(row) + 5); check_val(priority_col, ROW_VALUES(row) + 6, DB_INT, 1, 0); int_vals[INT_VALS_PRIORITY_COL] = VAL_INT(ROW_VALUES(row) + 6); check_val(sip_addr_col, ROW_VALUES(row) + 7, DB_STRING, 0, 0); str_vals[STR_VALS_SIP_ADDR_COL] = (char*) VAL_STRING(ROW_VALUES(row) + 7); check_val(flags_col, ROW_VALUES(row) + 8, DB_STRING, 0, 0); str_vals[STR_VALS_FLAGS_COL] = (char*) VAL_STRING(ROW_VALUES(row) + 8); check_val(description_col, ROW_VALUES(row) + 9, DB_STRING, 0, 0); str_vals[STR_VALS_DESCRIPTION_COL] = (char*) VAL_STRING(ROW_VALUES(row) + 9); /* add info to backing list */ if ((rc = add_node_info(&new_info, cl_list, int_vals, str_vals)) != 0) { LM_ERR("Unable to add node info to backing list\n"); if (rc < 0) return -1; else return 2; } } /* warn if no seed node is defined in a cluster */ check_seed_flag(cl_list); if (RES_ROW_N(res) == 1) LM_INFO("The local node is the only one in the cluster\n"); dr_dbf->free_result(db_hdl, res); return 0; error: if (res) dr_dbf->free_result(db_hdl, res); if (*cl_list) free_info(*cl_list); *cl_list = NULL; return -1; } int provision_neighbor(modparam_t type, void *val) { int int_vals[NO_DB_INT_VALS]; char *str_vals[NO_DB_STR_VALS]; str prov_str; node_info_t *new_info; if (db_mode) { LM_INFO("Running in db mode, provisioning from the script is ignored\n"); return 0; } prov_str.s = (char*)val; prov_str.len = strlen(prov_str.s); if (parse_param_node_info(&prov_str, int_vals, str_vals) < 0) { LM_ERR("Unable to define a neighbor node\n"); return -1; } if (int_vals[INT_VALS_CLUSTER_ID_COL] == -1 || int_vals[INT_VALS_NODE_ID_COL] == -1 || str_vals[STR_VALS_URL_COL] == NULL) { LM_ERR("At least the cluster id, node id and url are required for a neighbor node\n"); return -1; } int_vals[INT_VALS_STATE_COL] = 1; if (int_vals[INT_VALS_NO_PING_RETRIES_COL] == -1) int_vals[INT_VALS_NO_PING_RETRIES_COL] = DEFAULT_NO_PING_RETRIES; if (int_vals[INT_VALS_PRIORITY_COL] == -1) int_vals[INT_VALS_PRIORITY_COL] = DEFAULT_NO_PING_RETRIES; str_vals[STR_VALS_DESCRIPTION_COL] = NULL; int_vals[INT_VALS_ID_COL] = -1; if (cluster_list == NULL) { cluster_list = shm_malloc(sizeof *cluster_list); if (!cluster_list) { LM_CRIT("No more shm memory\n"); return -1; } *cluster_list = NULL; } if (add_node_info(&new_info, cluster_list, int_vals, str_vals) < 0) { LM_ERR("Unable to add node info to backing list\n"); return -1; } return 0; }
int provision_current(modparam_t type, void *val) { int int_vals[NO_DB_INT_VALS]; char *str_vals[NO_DB_STR_VALS]; node_info_t *new_info; str prov_str; if (db_mode) { LM_INFO("Running in db mode, provisioning from the script is ignored\n"); return 0; } prov_str.s = (char*)val; prov_str.len = strlen(prov_str.s); if (parse_param_node_info(&prov_str, int_vals, str_vals) < 0) { LM_ERR("Unable to define local node\n"); return -1; } if (int_vals[INT_VALS_CLUSTER_ID_COL] == -1 || str_vals[STR_VALS_URL_COL] == NULL) { LM_ERR("At least the cluster ID and url are required for the local node\n"); return -1; } if (int_vals[INT_VALS_NODE_ID_COL] == -1 && current_id == -1) { LM_ERR("Node ID not defined. Set either the value of the 'node_id' proprety" " of 'my_node_info' or set 'my_node_id' parameter before 'my_node_info'!\n"); return -1; } if (current_id != -1 && int_vals[INT_VALS_NODE_ID_COL] != -1 && int_vals[INT_VALS_NODE_ID_COL] != current_id) { LM_ERR("Bad value in 'my_node_info' parameter, node_id: %d different" " than 'my_node_id' parameter\n", int_vals[INT_VALS_NODE_ID_COL]); return -1; } if (int_vals[INT_VALS_NODE_ID_COL] != -1) current_id = int_vals[INT_VALS_NODE_ID_COL]; else int_vals[INT_VALS_NODE_ID_COL] = current_id; int_vals[INT_VALS_STATE_COL] = 1; if (int_vals[INT_VALS_NO_PING_RETRIES_COL] == -1) int_vals[INT_VALS_NO_PING_RETRIES_COL] = DEFAULT_NO_PING_RETRIES; if (int_vals[INT_VALS_PRIORITY_COL] == -1) int_vals[INT_VALS_PRIORITY_COL] = DEFAULT_NO_PING_RETRIES; str_vals[STR_VALS_DESCRIPTION_COL] = NULL; int_vals[INT_VALS_ID_COL] = -1; if (cluster_list == NULL) { cluster_list = shm_malloc(sizeof *cluster_list); if (!cluster_list) { LM_CRIT("No more shm memory\n"); return -1; } *cluster_list = NULL; } if (add_node_info(&new_info, cluster_list, int_vals, str_vals) != 0) { LM_ERR("Unable to add node info to backing list\n"); return -1; } return 0; }
//read the mobility file and generates a hashtable of linked list void parse_data (char *trace_file, int node_type) { FILE *fp; char *pch, *p; char str[128]; int fmt, id = 0, gid; node_container *value; //if(table==NULL) create_new_table (node_type); if(list_head ==NULL) list_head = (node_info **) calloc (MAX_NUM_NODE_TYPES, sizeof (node_info*)); if (list_head == NULL ) { LOG_E (OMG, "-------node list table creation failed--------\n"); exit (-1); } if ((fp = fopen (trace_file, "r")) == NULL) { LOG_E (OMG, "[OMG]:Cannot open file %s\n", trace_file); exit (1); } while (!feof (fp)) { if (fgets (str, 126, fp)) { fmt = 0; p = str; while (*p == ' ' || *p == '\t' || *p == '\r') p++; // skip whitespaces if (*p != '\n') { //escape empty line pch = strtok (p, " "); // the separator between the items in the list is a space node_data *node = (node_data *) calloc (1, sizeof (node_data)); node->type=-1; while (pch != NULL) { switch (fmt) { case 0: if (atof (pch) < 0) LOG_E (OMG, "error: negative time input \n"); node->time = fabs (atof (pch)); LOG_D (OMG, "%.2f \n",node->time); break; case 1: node->vid = atoi (pch); LOG_D (OMG, "%d \n",node->vid); break; case 2: node->x_pos = atof (pch); LOG_D (OMG, "%.2f \n",node->x_pos); break; case 3: node->y_pos = atof (pch); LOG_D (OMG, "%.2f \n",node->y_pos); break; case 4: if (atof (pch) < 0) LOG_D (OMG, "error: negative speed input"); node->speed = fabs (atof (pch)); LOG_D (OMG, "speed %.2f \n",node->speed); break; /*case 5: node->type = atof (pch); break;*/ default: LOG_E (OMG, "[Error in trance file]:incorrect data format \n"); break; } fmt += 1; pch = strtok (NULL, " "); } node->next = NULL; node->visit = 0; // look for node in node info gid = find_node_info (node->vid, node_type); if (gid == -1) { node->gid = id; add_node_info (node->vid, node->gid, node_type); //store node data in the table hash_table_add (table[node_type], node, NULL); id++; } else { node->gid = gid; value = hash_table_lookup (table[node_type], node->gid); hash_table_add (table[node_type], node, value); } } } } fclose (fp); }