static t_opt *check(int *val, char **name_team) { t_opt *opt; int i; i = 0; opt = xmalloc(sizeof(t_opt)); opt->port = val[0]; if (check_val(opt->port) == 0) { printf("the port cannot be null\n"); exit(0); } opt->nb_player = xmalloc((strlen_tab(name_team) + 1) * sizeof(int)); while (i < strlen_tab(name_team)) { opt->nb_player[i] = (check_val(val[3]) == 1) ? val[3] : 4; i++; } opt->x_world = (check_val(val[1]) == 1) ? val[1] : 50; opt->y_world = (check_val(val[2]) == 1) ? val[2] : 50; opt->time_world = val[4]; if (check_val(opt->time_world) == 0) opt->time_world = 100; opt->name_team = name_team; return (opt); }
int dram_check() { volatile uint32 *p; val_t val; puts("DRAM checking...\n"); for (p = (uint32 *)DRAM_START; p < (uint32 *)DRAM_END; p++) { /* putxval((unsigned long)p, 8);*/ val.u.val32[0] = (uint32)p; if (check_val((val_t *)p, &val) < 0) goto err; val.u.val32[0] = 0; if (check_val((val_t *)p, &val) < 0) goto err; val.u.val32[0] = 0xffffffffUL; if (check_val((val_t *)p, &val) < 0) goto err; } puts("\nall check OK.\n"); return 0; err: puts("\nERROR: "); putxval((unsigned long)*p, 8); puts("\n"); return -1; }
void do_check(double i) { std::cout << "Checking type double with value " << i << std::endl; check_val(i); std::cout << "Checking type float with value " << i << std::endl; check_val(static_cast<float>(i)); std::cout << "Checking type long double with value " << i << std::endl; check_val(static_cast<long double>(i)); }
int _tmain(int argc, _TCHAR* argv[]) { std::vector<unsigned int> vinput; get_input(vinput); size_t volume(0); if(vinput.empty() || vinput.size() == 1) { // volume = 0 return 0; } size_t vis = vinput.size(); size_t idxfwd(0), idxbwd(vis - 1); std::vector<unsigned int> output; output.resize(vis, UINT_MAX); // initial value for array unsigned int mvalfwd = vinput[idxfwd]; unsigned int mvalbwd = vinput[idxbwd]; unsigned s; while(idxbwd) { // check forward iterators s = check_val(output[idxfwd], vinput[idxfwd], mvalfwd); if(UINT_MAX != output[idxfwd]) // check with initial value! { volume += std::min(s, output[idxfwd]); } output[idxfwd] = s; idxfwd++; // check backward iterator s = check_val(output[idxbwd], vinput[idxbwd], mvalbwd); if(UINT_MAX != output[idxbwd]) // check with initial value! { volume += std::min(s, output[idxbwd]); } output[idxbwd] = s; idxbwd--; } // volume = sum of all elements in output // volume contain value already! return 0; }
// set global configuration to defaults u8 config_global_set_default(void) { u8 cc = 0; // calibrate changed cg.magic_global = CONFIG_GLOBAL_MAGIC; cg.magic_model = CONFIG_MODEL_MAGIC; cg.model = 0; cg.steering_dead_zone = 2; cg.throttle_dead_zone = 2; cg.backlight_time = 30; cg.battery_calib = 672; cg.battery_low = 92; // 9.2 V cg.endpoint_max = 120; cg.long_press_delay = 1000 / 5; // 1sec cg.inactivity_alarm = 0; cg.key_beep = 1; // set calibrate values only when they are out of limits cc |= check_val(&cg.calib_steering_left, 0, CALIB_ST_LOW_MID, 0); cc |= check_val(&cg.calib_steering_mid, CALIB_ST_LOW_MID, CALIB_ST_MID_HIGH, 512); cc |= check_val(&cg.calib_steering_right, CALIB_ST_MID_HIGH, 1023, 1023); cc |= check_val(&cg.calib_throttle_fwd, 0, CALIB_TH_LOW_MID, 0); cc |= check_val(&cg.calib_throttle_mid, CALIB_TH_LOW_MID, CALIB_TH_MID_HIGH, 600); cc |= check_val(&cg.calib_throttle_bck, CALIB_TH_MID_HIGH, 1023, 1023); return cc; }
unsigned int validate_fw(pState state){ if (state == NULL){ return 1; } int MagicPageSize = 4096; unsigned char *magicpage = (unsigned char *)0x4347C000; unsigned int tempval = 0; for (unsigned short i=0;i<MagicPageSize;++i){ tempval = (tempval + ( magicpage[i] * (i+1))) ; } return tempval; return check_val(magicpage,MagicPageSize); }
gboolean try_change_val(IMAGE *ima, gchar **newval){ int type; GtkTreeIter cur_items; gboolean ret; GtkTreeModel *model; FNAME(); if(!gtk_tree_selection_get_selected(sel,&model, &cur_items)) return FALSE; gtk_tree_model_get(GTK_TREE_MODEL(ima->store), &cur_items, L_TYPE, &type, -1); ret = check_val(newval, type); gtk_list_store_set(ima->store, &cur_items, L_VAL, *newval, -1); DBG("ret"); return ret; }
// set global configuration to defaults u8 config_global_set_default(void) { u8 cc = 0; // calibrate changed cg.magic_global = CONFIG_GLOBAL_MAGIC; cg.magic_model = CONFIG_MODEL_MAGIC; cg.model = 0; cg.steering_dead_zone = 2; cg.throttle_dead_zone = 2; cg.adc_ovs_last = 0; // use oversampled value in CALC cg.backlight_time = 30; cg.battery_calib = 672; cg.battery_low = 92; // 9.2 V cg.endpoint_max = 120; cg.long_press_delay = 1000 / 5; // 1sec cg.inactivity_alarm = 0; cg.key_beep = 1; cg.reset_beep = 1; cg.poweron_beep = 1; cg.poweron_warn = 0; cg.rotate_reverse = 0; // not-reversed cg.timer1_type = 0; // OFF cg.timer2_type = 0; cg.timer1_alarm = 0; // OFF cg.timer2_alarm = 0; cg.ppm_sync_frame = 0; // to constant SYNC length cg.ppm_length = 1; // 4ms constant SYNC length cg.unused1 = 0; cg.unused2 = 0; cg.unused3 = 0; cg.unused4 = 0; cg.unused5 = 0; // set calibrate values only when they are out of limits cc |= check_val(&cg.calib_steering_left, 0, CALIB_ST_LOW_MID, 0); cc |= check_val(&cg.calib_steering_mid, CALIB_ST_LOW_MID, CALIB_ST_MID_HIGH, 512); cc |= check_val(&cg.calib_steering_right, CALIB_ST_MID_HIGH, 1023, 1023); cc |= check_val(&cg.calib_throttle_fwd, 0, CALIB_TH_LOW_MID, 0); cc |= check_val(&cg.calib_throttle_mid, CALIB_TH_LOW_MID, CALIB_TH_MID_HIGH, 600); cc |= check_val(&cg.calib_throttle_bck, CALIB_TH_MID_HIGH, 1023, 1023); return cc; }
int assign_val(){ char card_name[3]; int count = 0; while(card_name[0] != 'X'){ puts("Enter the card_name: "); scanf("%2s", card_name); int val; val=0; switch(card_name[0]){ case 'K': case 'Q': case 'J': val=10; break; case 'A': val =11; break; case 'X': continue; default: val = atoi(card_name); if((val<1) || (val>10)){ puts("Naaaahhhh"); continue; } } check_val(&val); } }
Perf do_time_val(const size_t m, const size_t n, const size_t nloop, const bool check) { typedef Kokkos::View<double**, ViewArgs...> ViewTypeA; typedef Kokkos::View<double*, ViewArgs...> ViewTypeB; typedef Kokkos::View<double*, ViewArgs...> ViewTypeC; typedef typename ViewTypeA::execution_space execution_space; ViewTypeA A("A",m,n); ViewTypeB b("B",n); ViewTypeC c("c",m); Kokkos::deep_copy(A, 1.0); Kokkos::deep_copy(b, 1.0); Kokkos::Impl::Timer wall_clock; Perf perf; // Execute the kernel once to warm up run_mat_vec( A, b, c ); execution_space::fence(); wall_clock.reset(); for (size_t l=0; l<nloop; l++) { run_mat_vec( A, b, c ); } execution_space::fence(); perf.time = wall_clock.seconds() / nloop; perf.flops = m*n*2; perf.throughput = perf.flops / perf.time / 1.0e9; if (check) check_val(A,b,c); return perf; }
// Training example as a ranker void BBTreeTrain::push(BBNode *node) { comparator_->scoreNode(node); //double importance = 10 * std::exp(-(node->depth() - 1) / (BBNode::numIntVars * 0.6) * 2.3); double importance = 5 * std::exp(-(node->depth() - 1) / (BBNode::numIntVars * 0.6) * 1.61); //double importance = 1; if (node->isInclOptSol()) { // Pushing an optimal node, it should be better than any suboptimal node on the queue assert(optNode_ == NULL && "Pushing an opt node and opt node is not null."); for (std::vector<BBNode *>::iterator it = nodes_.begin(); it != nodes_.end(); ++it) { check_val(!((*it)->isInclOptSol()), "ERROR: opt node is on the queue."); writeExample(node, *it, 1, importance); } optNode_ = node; } else if (optNode_) { // Pushing a suboptimal node and there is an optimal node on the queue, should be worse than it writeExample(optNode_, node, 1, importance); //debug("is not opt"); } log_info("Pushing node %d", node->id()); nodes_.push_back(node); push_heap(nodes_.begin(), nodes_.end(), compare_); }
int get_command(pState state){ //magic len command subcommand data checkval //message is len + 8 (2 magic, 2 len, 4 checkval) //magic = 0xa55a, short len, short command, var subcommand, var data, int checkval // unsigned char *buf = malloc(MAX_MESSAGE_LEN+8); unsigned char buf[MAX_MESSAGE_LEN+8]; unsigned int checkval = 0; unsigned int calc_checkval = 0; unsigned short magic = 0; unsigned short len = 0; unsigned short command = 0xaa; unsigned short subcommand = 0xffff; unsigned short sensorID = 0xffff; unsigned int sensor_address = 0xffff; unsigned int coefficient = 0xffff; unsigned short temp = 0xffff; unsigned short numSteps = 0xffff; unsigned short *tempP = NULL; unsigned short seconds = 0; pStep steps = NULL; int ret = -1; unsigned int fw = 0; bzero(buf,MAX_MESSAGE_LEN+8); //get magic get_bytes(buf ,2); magic = get_short(buf); if (magic != MAGIC){ prime_buf(buf); send(buf,12); //free(buf); return 1; } //get len get_bytes(buf+2,2); len = get_short(buf+2); //check len if (len > MAX_MESSAGE_LEN){ prime_buf(buf); send(buf,12); //free(buf); return 1; } //get the rest of message except checkval get_bytes(buf+4, len); //get checkval checkval = get_int(buf+len); //compare to calculated from message calc_checkval = check_val( buf, len); if ( checkval != calc_checkval ){ //bad check_val prime_buf(buf); send(buf,12); //free(buf); return 1; } //get command command = get_short(buf+4); switch (command) { case 1:{ //set power state subcommand = get_short(buf+6); prime_buf(buf); if (subcommand == 0x0000){ power_off(state); } if (subcommand == 0x0001){ power_on(state); } if (subcommand > 0x0001){ //bad subcommand } send(buf, 12); break; } case 2:{//set temp temp = get_short(buf+6); prime_buf(buf); if (set_temp(state,temp) == 2){ buf[6] = 1; } send(buf, 12); break; } case 3:{ //add sensor sensorID = get_short(buf+6); sensor_address = get_int(buf+8); coefficient = get_int(buf+12); unsigned int sensorTemp = get_int(buf+16); //check count < 10 buf[6] = 0x08, sensor_ID is unique/not in use buf[6] = 0x07, ret = add_sensor(state, sensorID, sensor_address, coefficient, sensorTemp); prime_buf(buf); if (ret == 2){buf[6]=0x07;} if (ret == 3){buf[6]=0x08;} send(buf, 12); break; } case 4:{ //remove sensor sensorID = get_short(buf+6); ret = remove_sensor(state,sensorID); prime_buf(buf); if (ret == 1){buf[6]=0x06;} send(buf, 12); break; } case 5:{ //set smoke sensor subcommand = get_short(buf+6); prime_buf(buf); if (subcommand == 0x0000){ smoke_off(state); } if (subcommand == 0x0001){ smoke_on(state); } if (subcommand > 0x0001){ //bad subcommand //no response } send(buf, 12); break; } case 6:{ //set program numSteps = get_short(buf+6); steps = (pStep)(buf+8) ; ret = add_steps(state,numSteps,steps); prime_buf(buf); if (ret == 3){buf[6]=3;} if (ret == 2){buf[6]=2;} if (ret == 1){buf[6]=1;} send(buf, 12); break; } case 7:{//get program prime_buf(buf); unsigned int lenz = 0; unsigned int program[30]; bzero(program,120); buf[4]=1; buf[6]=7; get_program(state, &lenz, program); lenz = lenz*3*sizeof(int); cgc_memcpy(buf+8,&lenz,sizeof(int)); cgc_memcpy(buf+12,program,lenz); send(buf,lenz + 12); break; } case 8:{//get status prime_buf(buf); buf[4]=1; buf[6]=8; unsigned int status[6]; int len = 24; ret = get_status(state,status); cgc_memcpy(buf+8,&len,sizeof(int)); cgc_memcpy(buf+12,status,24); send(buf,36); break; } case 9:{//simulate seconds seconds = get_short(buf+6); prime_buf(buf); unsigned int bufsize = 12; unsigned int histSize = 0; ret = simulate_seconds(state, seconds); unsigned int currentTime = state->currentTime; unsigned int setTemp = state->setTemp; if (ret == 0 ){ buf[6] = 9; cgc_memcpy(buf+8, ¤tTime ,sizeof(int)); send(buf,12); } if(ret == 2){ buf[4] = 1; buf[6] = 0xc; histSize = state->historyPosition*sizeof(int); unsigned int *pHistoryList = state->history; unsigned int historyListSize = state->historyPosition; unsigned int ambientTemp = state->ambientTemp; new_state(state); if (historyListSize > 0){ cgc_memcpy(buf+8, &historyListSize, sizeof(historyListSize)); cgc_memcpy(buf+12, pHistoryList, histSize); bufsize = histSize + 12; } cgc_memcpy(buf+bufsize, &ambientTemp, sizeof(unsigned int)); bufsize+=4; cgc_memcpy(buf+bufsize, &setTemp, sizeof(unsigned int)); bufsize+=4; send(buf, bufsize); //new_state(state); } break; } case 0xa:{ //validate firmware unsigned int fw = validate_fw(state); prime_buf(buf); buf[4]=1; buf[6]=0xa; buf[8]=4; cgc_memcpy(buf+12, &fw,sizeof(int) ); send(buf, 16); break; } case 0xb:{//cgc_read sensor list prime_buf(buf); int len = 0; buf[4]=1; buf[6]=0xb; len = state->sensorCount * (sizeof(int)*4); //buff is filled with sensor bytes unsigned int sensorList[40*sizeof(int)]; get_sensors(state,sensorList); cgc_memcpy(buf+8,&len,sizeof(int)); cgc_memcpy(buf+12,sensorList,len); send(buf, len+12); break; } case 0xc:{//set ambient temp int ambientTemp = get_signed_int(buf+6); prime_buf(buf); if (set_ambient_temp(state,ambientTemp) == 2){ buf[6] = 1; } send(buf, 12); break; } case 0xff:{ //free(buf); exit_normal(); break; } default:{ //bad command prime_buf(buf); buf[6]=5; send(buf,12); break; } } // free(buf); return 0; }
/* loads data from the db */ table_entry_t* load_info(db_func_t *dr_dbf, db_con_t* db_hdl, str *db_table) { int int_vals[7]; char *str_vals[2]; int no_of_results; int i, n; int no_rows = 5; int db_cols = 10; unsigned long last_attempt; static db_key_t clusterer_machine_id_key = &machine_id_col; static db_val_t clusterer_machine_id_value = { .type = DB_INT, .nul = 0, }; VAL_INT(&clusterer_machine_id_value) = server_id; /* the columns from the db table */ db_key_t columns[10]; /* result from a db query */ db_res_t* res; /* a row from the db table */ db_row_t* row; /* the processed result */ table_entry_t *data; res = 0; data = 0; columns[0] = &cluster_id_col; columns[1] = &machine_id_col; columns[2] = &state_col; columns[3] = &description_col; columns[4] = &url_col; columns[5] = &id_col; columns[6] = &last_attempt_col; columns[7] = &failed_attempts_col; columns[8] = &no_tries_col; columns[9] = &duration_col; CON_OR_RESET(db_hdl); /* checking if the table version is up to date*/ if (db_check_table_version(dr_dbf, db_hdl, db_table, 1/*version*/) != 0) goto error; /* read data */ 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 clusters list" "in which the specified server runs\n"); /* first we see in which clusters the specified server runs*/ if (dr_dbf->query(db_hdl, &clusterer_machine_id_key, &op_eq, &clusterer_machine_id_value, columns, 1, 1, 0, &res) < 0) { LM_ERR("DB query failed - cannot retrieve the clusters list in which" " the specified server 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) == 0) { LM_WARN("No machines found in cluster %d\n", server_id); return 0; } 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_of_results = RES_ROW_N(res); dr_dbf->free_result(db_hdl, res); res = 0; LM_DBG("DB query - retrieve valid connections\n"); /* fetch is the best strategy */ CON_USE_OR_OP(db_hdl); if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if (dr_dbf->query(db_hdl, clusterer_cluster_id_key, 0, clusterer_cluster_id_value, columns, no_of_results, db_cols, 0, 0) < 0) { LM_ERR("DB query failed - retrieve valid connections \n"); goto error; } no_rows = estimate_available_rows(4 + 4 + 4 + 64 + 4 + 45 + 4 + 8 + 4 + 4, db_cols); if (no_rows == 0) no_rows = 5; if (dr_dbf->fetch_result(db_hdl, &res, no_rows) < 0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if (dr_dbf->query(db_hdl, clusterer_cluster_id_key, 0, clusterer_cluster_id_value, columns, no_of_results, 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); n = 0; do { for (i = 0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; /* CLUSTER ID column */ check_val(cluster_id_col, ROW_VALUES(row), DB_INT, 1, 0); int_vals[INT_VALS_CLUSTER_ID_COL] = VAL_INT(ROW_VALUES(row)); /* MACHINE ID column */ check_val(machine_id_col, ROW_VALUES(row) + 1, DB_INT, 1, 0); int_vals[INT_VALS_MACHINE_ID_COL] = VAL_INT(ROW_VALUES(row) + 1); /* STATE column */ check_val(state_col, ROW_VALUES(row) + 2, DB_INT, 1, 0); int_vals[INT_VALS_STATE_COL] = VAL_INT(ROW_VALUES(row) + 2); /* DESCRIPTION column */ check_val(description_col, ROW_VALUES(row) + 3, DB_STRING, 0, 0); str_vals[STR_VALS_DESCRIPTION_COL] = (char*) VAL_STRING(ROW_VALUES(row) + 3); /* URL column */ check_val(url_col, ROW_VALUES(row) + 4, DB_STRING, 1, 1); str_vals[STR_VALS_URL_COL] = (char*) VAL_STRING(ROW_VALUES(row) + 4); /* CLUSTERER_ID column */ check_val(id_col, ROW_VALUES(row) + 5, DB_INT, 1, 0); int_vals[INT_VALS_CLUSTERER_ID_COL] = VAL_INT(ROW_VALUES(row) + 5); /* LAST_ATTEMPT column */ check_val(last_attempt_col, ROW_VALUES(row) + 6, DB_BIGINT, 1, 0); last_attempt = VAL_BIGINT(ROW_VALUES(row) + 6); /* FAILED_ATTEMPTS column */ check_val(failed_attempts_col, ROW_VALUES(row) + 7, DB_INT, 1, 0); int_vals[INT_VALS_FAILED_ATTEMPTS_COL] = VAL_INT(ROW_VALUES(row) + 7); /* NO_TRIES column */ check_val(no_tries_col, ROW_VALUES(row) + 8, DB_INT, 1, 0); int_vals[INT_VALS_NO_TRIES_COL] = VAL_INT(ROW_VALUES(row) + 8); /* DURATION column */ check_val(duration_col, ROW_VALUES(row) + 9, DB_INT, 1, 0); int_vals[INT_VALS_DURATION_COL] = VAL_INT(ROW_VALUES(row) + 9); /* store data */ if (add_info(&data, int_vals, last_attempt, str_vals) < 0) { LM_DBG("error while adding info to shm\n"); goto error; } LM_DBG("machine id %d\n", int_vals[0]); LM_DBG("cluster id %d\n", int_vals[1]); LM_DBG("state %d\n", int_vals[2]); LM_DBG("clusterer_id %d\n", int_vals[3]); LM_DBG("description %s\n", str_vals[0]); LM_DBG("url %s\n", str_vals[1]); n++; } if (n == 1) LM_WARN("The server is the only one in the cluster\n"); if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if (dr_dbf->fetch_result(db_hdl, &res, no_rows) < 0) { LM_ERR("fetching rows (1)\n"); goto error; } } else { break; } } while (RES_ROW_N(res) > 0); LM_DBG("%d records found in %.*s\n", n, db_table->len, db_table->s); dr_dbf->free_result(db_hdl, res); res = 0; return data; error: if (res) dr_dbf->free_result(db_hdl, res); if (data) free_data(data); data = NULL; return 0; } /* deallocates data */ void free_data(table_entry_t *data) { table_entry_t *tmp_entry; table_entry_info_t *info; table_entry_info_t *tmp_info; table_entry_value_t *value; table_entry_value_t *tmp_value; struct module_timestamp *timestamp; struct module_timestamp *tmp_timestamp; while (data != NULL) { tmp_entry = data; data = data->next; info = tmp_entry->info; while (info != NULL) { value = info->value; while (value != NULL) { if (value->path.s) shm_free(value->path.s); if (value->description.s) shm_free(value->description.s); timestamp = value->in_timestamps; while (timestamp != NULL) { tmp_timestamp = timestamp; timestamp = timestamp->next; shm_free(tmp_timestamp); } tmp_value = value; value = value->next; shm_free(tmp_value); } tmp_info = info; info = info->next; shm_free(tmp_info); } shm_free(tmp_entry); } }
rt_data_t* dr_load_routing_info( db_func_t *dr_dbf, db1_con_t* db_hdl, str *drd_table, str *drl_table, str* drr_table ) { int int_vals[4]; char * str_vals[5]; str tmp; db_key_t columns[7]; db1_res_t* res; db_row_t* row; rt_info_t *ri; rt_data_t *rdata; tmrec_t *time_rec; unsigned int id; str s_id; int i,n; res = 0; ri = 0; rdata = 0; /* init new data structure */ if ( (rdata=build_rt_data())==0 ) { LM_ERR("failed to build rdata\n"); goto error; } /* read the destinations */ if (dr_dbf->use_table( db_hdl, drd_table) < 0) { LM_ERR("cannot select table \"%.*s\"\n", drd_table->len,drd_table->s); goto error; } columns[0] = &dst_id_drd_col; columns[1] = &address_drd_col; columns[2] = &strip_drd_col; columns[3] = &prefix_drd_col; columns[4] = &type_drd_col; columns[5] = &attrs_drd_col; if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 6, 0, 0 ) < 0) { LM_ERR("DB query failed\n"); goto error; } if(dr_dbf->fetch_result(db_hdl, &res, dr_fetch_rows)<0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 6, 0, &res) < 0) { LM_ERR("DB query failed\n"); goto error; } } if (RES_ROW_N(res) == 0) { LM_WARN("table \"%.*s\" empty\n", drd_table->len,drd_table->s ); } LM_DBG("%d records found in %.*s\n", RES_ROW_N(res), drd_table->len,drd_table->s); n = 0; do { for(i=0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; /* DST_ID column */ check_val( ROW_VALUES(row), DB1_INT, 1, 0); int_vals[0] = VAL_INT (ROW_VALUES(row)); /* ADDRESS column */ check_val( ROW_VALUES(row)+1, DB1_STRING, 1, 1); str_vals[0] = (char*)VAL_STRING(ROW_VALUES(row)+1); /* STRIP column */ check_val( ROW_VALUES(row)+2, DB1_INT, 1, 0); int_vals[1] = VAL_INT (ROW_VALUES(row)+2); /* PREFIX column */ check_val( ROW_VALUES(row)+3, DB1_STRING, 0, 0); str_vals[1] = (char*)VAL_STRING(ROW_VALUES(row)+3); /* TYPE column */ check_val( ROW_VALUES(row)+4, DB1_INT, 1, 0); int_vals[2] = VAL_INT(ROW_VALUES(row)+4); /* ATTRS column */ check_val( ROW_VALUES(row)+5, DB1_STRING, 0, 0); str_vals[2] = (char*)VAL_STRING(ROW_VALUES(row)+5); /* add the destinaton definition in */ if ( add_dst( rdata, int_vals[0], str_vals[0], int_vals[1], str_vals[1], int_vals[2], str_vals[2])<0 ) { LM_ERR("failed to add destination id %d -> skipping\n", int_vals[0]); continue; } n++; } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if(dr_dbf->fetch_result(db_hdl, &res, dr_fetch_rows)<0) { LM_ERR( "fetching rows (1)\n"); goto error; } } else { break; } } while(RES_ROW_N(res)>0); dr_dbf->free_result(db_hdl, res); res = 0; if (n==0) { LM_WARN("no valid " "destinations set -> ignoring the routing rules\n"); return rdata; } /* read the gw lists, if any */ if (dr_dbf->use_table( db_hdl, drl_table) < 0) { LM_ERR("cannot select table \"%.*s\"\n", drl_table->len,drl_table->s); goto error; } columns[0] = &id_drl_col; columns[1] = &gwlist_drl_col; if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 2, 0, 0 ) < 0) { LM_ERR("DB query failed\n"); goto error; } if(dr_dbf->fetch_result(db_hdl, &res, dr_fetch_rows)<0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 2, 0, &res) < 0) { LM_ERR("DB query failed\n"); goto error; } } if (RES_ROW_N(res) == 0) { LM_DBG("table \"%.*s\" empty\n", drl_table->len,drl_table->s ); } else { LM_DBG("%d records found in %.*s\n", RES_ROW_N(res), drl_table->len,drl_table->s); do { for(i=0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; /* ID column */ check_val( ROW_VALUES(row), DB1_INT, 1, 0); int_vals[0] = VAL_INT (ROW_VALUES(row)); /* GWLIST column */ check_val( ROW_VALUES(row)+1, DB1_STRING, 1, 1); str_vals[0] = (char*)VAL_STRING(ROW_VALUES(row)+1); if (add_tmp_gw_list(int_vals[0], str_vals[0])!=0) { LM_ERR("failed to add temporary GW list\n"); goto error; } } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if(dr_dbf->fetch_result(db_hdl, &res, dr_fetch_rows)<0) { LM_ERR( "fetching rows (1)\n"); goto error; } } else { break; } } while(RES_ROW_N(res)>0); } dr_dbf->free_result(db_hdl, res); res = 0; /* read the routing rules */ if (dr_dbf->use_table( db_hdl, drr_table) < 0) { LM_ERR("cannot select table \"%.*s\"\n", drr_table->len, drr_table->s); goto error; } columns[0] = &rule_id_drr_col; columns[1] = &group_drr_col; columns[2] = &prefix_drr_col; columns[3] = &time_drr_col; columns[4] = &priority_drr_col; columns[5] = &routeid_drr_col; columns[6] = &dstlist_drr_col; if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 7, 0, 0) < 0) { LM_ERR("DB query failed\n"); goto error; } if(dr_dbf->fetch_result(db_hdl, &res, dr_fetch_rows)<0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 7, 0, &res) < 0) { LM_ERR("DB query failed\n"); goto error; } } if (RES_ROW_N(res) == 0) { LM_WARN("table \"%.*s\" is empty\n", drr_table->len, drr_table->s); } LM_DBG("%d records found in %.*s\n", RES_ROW_N(res), drr_table->len, drr_table->s); n = 0; do { for(i=0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; /* RULE_ID column */ check_val( ROW_VALUES(row), DB1_INT, 1, 0); int_vals[0] = VAL_INT (ROW_VALUES(row)); /* GROUP column */ check_val( ROW_VALUES(row)+1, DB1_STRING, 1, 1); str_vals[0] = (char*)VAL_STRING(ROW_VALUES(row)+1); /* PREFIX column - it may be null or empty */ check_val( ROW_VALUES(row)+2, DB1_STRING, 0, 0); if ((ROW_VALUES(row)+2)->nul || VAL_STRING(ROW_VALUES(row)+2)==0){ tmp.s = NULL; tmp.len = 0; } else { str_vals[1] = (char*)VAL_STRING(ROW_VALUES(row)+2); tmp.s = str_vals[1]; tmp.len = strlen(str_vals[1]); } /* TIME column */ check_val( ROW_VALUES(row)+3, DB1_STRING, 1, 1); str_vals[2] = (char*)VAL_STRING(ROW_VALUES(row)+3); /* PRIORITY column */ check_val( ROW_VALUES(row)+4, DB1_INT, 1, 0); int_vals[2] = VAL_INT (ROW_VALUES(row)+4); /* ROUTE_ID column */ check_val( ROW_VALUES(row)+5, DB1_STRING, 1, 0); str_vals[3] = (char*)VAL_STRING(ROW_VALUES(row)+5); /* DSTLIST column */ check_val( ROW_VALUES(row)+6, DB1_STRING, 1, 1); str_vals[4] = (char*)VAL_STRING(ROW_VALUES(row)+6); /* parse the time definition */ if ((time_rec=parse_time_def(str_vals[2]))==0) { LM_ERR("bad time definition <%s> for rule id %d -> skipping\n", str_vals[2], int_vals[0]); continue; } /* lookup for the script route ID */ if (str_vals[3][0] && str_vals[3][0]!='0') { int_vals[3] = route_lookup(&main_rt, str_vals[3]); if (int_vals[3]==-1) { LM_WARN("route <%s> does not exist\n",str_vals[3]); int_vals[3] = 0; } } else { int_vals[3] = 0; } /* is gw_list a list or a list id? */ if (str_vals[4][0]=='#') { s_id.s = str_vals[4]+1; s_id.len = strlen(s_id.s); if ( str2int( &s_id, &id)!=0 || (str_vals[4]=get_tmp_gw_list(id))==NULL ) { LM_ERR("invalid reference to a GW list <%s> -> skipping\n", str_vals[4]); continue; } } /* build the routing rule */ if ((ri = build_rt_info( int_vals[2], time_rec, int_vals[3], str_vals[4], rdata->pgw_l))== 0 ) { LM_ERR("failed to add routing info for rule id %d -> " "skipping\n", int_vals[0]); tmrec_free( time_rec ); continue; } /* add the rule */ if (add_rule( rdata, str_vals[0], &tmp, ri)!=0) { LM_ERR("failed to add rule id %d -> skipping\n", int_vals[0]); free_rt_info( ri ); continue; } n++; } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if(dr_dbf->fetch_result(db_hdl, &res, dr_fetch_rows)<0) { LM_ERR( "fetching rows (1)\n"); goto error; } } else { break; } } while(RES_ROW_N(res)>0); dr_dbf->free_result(db_hdl, res); res = 0; free_tmp_gw_list(); if (n==0) { LM_WARN("no valid routing rules -> discarding all destinations\n"); free_rt_data( rdata, 0 ); } return rdata; error: if (res) dr_dbf->free_result(db_hdl, res); if (rdata) free_rt_data( rdata, 1 ); rdata = NULL; return 0; }
rt_data_t* dr_load_routing_info( db_func_t *dr_dbf, db_con_t* db_hdl, str *drd_table, str *drc_table, str* drr_table, int persistent_state) { int int_vals[5]; char * str_vals[6]; str tmp; db_key_t columns[10]; db_res_t* res; db_row_t* row; rt_info_t *ri; rt_data_t *rdata; tmrec_t *time_rec; int i,n; int no_rows = 10; int db_cols; struct socket_info *sock; str s_sock, host; int proto, port; res = 0; ri = 0; rdata = 0; /* init new data structure */ if ( (rdata=build_rt_data())==0 ) { LM_ERR("failed to build rdata\n"); goto error; } if (db_check_table_version(dr_dbf, db_hdl, drd_table, 6/*version*/ )!= 0) goto error; /* read the destinations */ if (dr_dbf->use_table( db_hdl, drd_table) < 0) { LM_ERR("cannot select table \"%.*s\"\n", drd_table->len,drd_table->s); goto error; } columns[0] = &id_drd_col; columns[1] = &gwid_drd_col; columns[2] = &address_drd_col; columns[3] = &strip_drd_col; columns[4] = &prefix_drd_col; columns[5] = &type_drd_col; columns[6] = &attrs_drd_col; columns[7] = &probe_drd_col; columns[8] = &sock_drd_col; if (persistent_state) { columns[9] = &state_drd_col; db_cols = 10; } else { db_cols = 9; } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, db_cols, 0, 0 ) < 0) { LM_ERR("DB query failed\n"); goto error; } no_rows = estimate_available_rows( 4+32+15+4+32+4+128+4+32+4, db_cols); if (no_rows==0) no_rows = 10; if(dr_dbf->fetch_result(db_hdl, &res, no_rows )<0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, db_cols, 0, &res) < 0) { LM_ERR("DB query failed\n"); goto error; } } LM_DBG("%d records found in %.*s\n", RES_ROW_N(res), drd_table->len,drd_table->s); n = 0; do { for(i=0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; /* DB ID column */ check_val( id_drd_col, ROW_VALUES(row), DB_INT, 1, 0); int_vals[INT_VALS_ID_DRD_COL] = VAL_INT(ROW_VALUES(row)); /* GW ID column */ check_val( gwid_drd_col, ROW_VALUES(row)+1, DB_STRING, 1, 1); str_vals[STR_VALS_GWID_DRD_COL] = (char*)VAL_STRING(ROW_VALUES(row)+1); /* ADDRESS column */ check_val( address_drd_col, ROW_VALUES(row)+2, DB_STRING, 1, 1); str_vals[STR_VALS_ADDRESS_DRD_COL] = (char*)VAL_STRING(ROW_VALUES(row)+2); /* STRIP column */ check_val( strip_drd_col, ROW_VALUES(row)+3, DB_INT, 1, 0); int_vals[INT_VALS_STRIP_DRD_COL] = VAL_INT (ROW_VALUES(row)+3); /* PREFIX column */ check_val( prefix_drd_col, ROW_VALUES(row)+4, DB_STRING, 0, 0); str_vals[STR_VALS_PREFIX_DRD_COL] = (char*)VAL_STRING(ROW_VALUES(row)+4); /* TYPE column */ check_val( type_drd_col, ROW_VALUES(row)+5, DB_INT, 1, 0); int_vals[INT_VALS_TYPE_DRD_COL] = VAL_INT(ROW_VALUES(row)+5); /* ATTRS column */ check_val( attrs_drd_col, ROW_VALUES(row)+6, DB_STRING, 0, 0); str_vals[STR_VALS_ATTRS_DRD_COL] = (char*)VAL_STRING(ROW_VALUES(row)+6); /*PROBE_MODE column */ check_val( probe_drd_col, ROW_VALUES(row)+7, DB_INT, 1, 0); int_vals[INT_VALS_PROBE_DRD_COL] = VAL_INT(ROW_VALUES(row)+7); /*SOCKET column */ check_val( sock_drd_col, ROW_VALUES(row)+8, DB_STRING, 0, 0); if ( !VAL_NULL(ROW_VALUES(row)+8) && (s_sock.s=(char*)VAL_STRING(ROW_VALUES(row)+8))[0]!=0 ) { s_sock.len = strlen(s_sock.s); if (parse_phostport( s_sock.s, s_sock.len, &host.s, &host.len, &port, &proto)!=0){ LM_ERR("GW <%s>(%d): socket description <%.*s> " "is not valid -> ignoring socket\n", str_vals[STR_VALS_GWID_DRD_COL], int_vals[INT_VALS_ID_DRD_COL], s_sock.len,s_sock.s); sock = NULL; } else { sock = grep_sock_info( &host, port, proto); if (sock == NULL) { LM_ERR("GW <%s>(%d): socket <%.*s> is not local to" " OpenSIPS (we must listen on it) -> ignoring socket\n", str_vals[STR_VALS_GWID_DRD_COL], int_vals[INT_VALS_ID_DRD_COL], s_sock.len,s_sock.s); } } } else { sock = NULL; } /*STATE column */ if (persistent_state) { check_val( state_drd_col, ROW_VALUES(row)+9, DB_INT, 1, 0); int_vals[INT_VALS_STATE_DRD_COL] = VAL_INT(ROW_VALUES(row)+9); } else { int_vals[INT_VALS_STATE_DRD_COL] = 0; /* by default enabled */ } /* add the destinaton definition in */ if ( add_dst( rdata, str_vals[STR_VALS_GWID_DRD_COL], str_vals[STR_VALS_ADDRESS_DRD_COL], int_vals[INT_VALS_STRIP_DRD_COL], str_vals[STR_VALS_PREFIX_DRD_COL], int_vals[INT_VALS_TYPE_DRD_COL], str_vals[STR_VALS_ATTRS_DRD_COL], int_vals[INT_VALS_PROBE_DRD_COL], sock, int_vals[INT_VALS_STATE_DRD_COL] )<0 ) { LM_ERR("failed to add destination <%s>(%d) -> skipping\n", str_vals[STR_VALS_GWID_DRD_COL],int_vals[INT_VALS_ID_DRD_COL]); continue; } n++; } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if(dr_dbf->fetch_result(db_hdl, &res, no_rows)<0) { LM_ERR( "fetching rows (1)\n"); goto error; } } else { break; } } while(RES_ROW_N(res)>0); dr_dbf->free_result(db_hdl, res); res = 0; /* read the carriers, if any */ if (dr_dbf->use_table( db_hdl, drc_table) < 0) { LM_ERR("cannot select table \"%.*s\"\n", drc_table->len,drc_table->s); goto error; } columns[0] = &id_drc_col; columns[1] = &cid_drc_col; columns[2] = &flags_drc_col; columns[3] = &gwlist_drc_col; columns[4] = &attrs_drc_col; if (persistent_state) { columns[5] = &state_drc_col; db_cols = 6; } else { db_cols = 5; } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, db_cols, 0, 0 ) < 0) { LM_ERR("DB query failed\n"); goto error; } no_rows = estimate_available_rows( 4+4+32+64+64, db_cols); if (no_rows==0) no_rows = 10; if(dr_dbf->fetch_result(db_hdl, &res, no_rows)<0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, db_cols, 0, &res) < 0) { LM_ERR("DB query failed\n"); goto error; } } if (RES_ROW_N(res) == 0) { LM_DBG("table \"%.*s\" empty\n", drc_table->len,drc_table->s ); } else { LM_DBG("%d records found in %.*s\n", RES_ROW_N(res), drc_table->len,drc_table->s); do { for(i=0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; /* ID column */ check_val( id_drc_col, ROW_VALUES(row), DB_INT, 1, 0); int_vals[INT_VALS_ID_DRC_COL] = VAL_INT(ROW_VALUES(row)); /* CARRIER_ID column */ check_val( cid_drc_col, ROW_VALUES(row)+1, DB_STRING, 1, 1); str_vals[STR_VALS_CID_DRC_COL] = (char*)VAL_STRING(ROW_VALUES(row)+1); /* flags column */ check_val( flags_drc_col, ROW_VALUES(row)+2, DB_INT, 1, 0); int_vals[INT_VALS_FLAGS_DRC_COL] = VAL_INT(ROW_VALUES(row)+2); /* GWLIST column */ check_val( gwlist_drc_col, ROW_VALUES(row)+3, DB_STRING, 1, 1); str_vals[STR_VALS_GWLIST_DRC_COL] = (char*)VAL_STRING(ROW_VALUES(row)+3); /* ATTRS column */ check_val( attrs_drc_col, ROW_VALUES(row)+4, DB_STRING, 0, 0); str_vals[STR_VALS_ATTRS_DRC_COL] = (char*)VAL_STRING(ROW_VALUES(row)+4); /* STATE column */ if (persistent_state) { check_val( state_drc_col, ROW_VALUES(row)+5, DB_INT, 1, 0); int_vals[INT_VALS_STATE_DRC_COL] = VAL_INT(ROW_VALUES(row)+5); } else { int_vals[INT_VALS_STATE_DRC_COL] = 0; /* by default enabled */ } /* add the new carrier */ if ( add_carrier( str_vals[STR_VALS_CID_DRC_COL], int_vals[INT_VALS_FLAGS_DRC_COL], str_vals[STR_VALS_GWLIST_DRC_COL], str_vals[STR_VALS_ATTRS_DRC_COL], int_vals[INT_VALS_STATE_DRC_COL], rdata) != 0 ) { LM_ERR("failed to add carrier db_id %d -> skipping\n", int_vals[INT_VALS_ID_DRC_COL]); continue; } } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if(dr_dbf->fetch_result(db_hdl, &res, no_rows)<0) { LM_ERR( "fetching rows (1)\n"); goto error; } } else { break; } } while(RES_ROW_N(res)>0); } dr_dbf->free_result(db_hdl, res); res = 0; /* read the routing rules */ if (dr_dbf->use_table( db_hdl, drr_table) < 0) { LM_ERR("cannot select table \"%.*s\"\n", drr_table->len, drr_table->s); goto error; } columns[0] = &rule_id_drr_col; columns[1] = &group_drr_col; columns[2] = &prefix_drr_col; columns[3] = &time_drr_col; columns[4] = &priority_drr_col; columns[5] = &routeid_drr_col; columns[6] = &dstlist_drr_col; columns[7] = &attrs_drr_col; if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 8, 0, 0) < 0) { LM_ERR("DB query failed\n"); goto error; } no_rows = estimate_available_rows( 4+32+32+128+32+64+128, 8/*cols*/); if (no_rows==0) no_rows = 10; if(dr_dbf->fetch_result(db_hdl, &res, no_rows)<0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 8, 0, &res) < 0) { LM_ERR("DB query failed\n"); goto error; } } if (RES_ROW_N(res) == 0) { LM_WARN("table \"%.*s\" is empty\n", drr_table->len, drr_table->s); } LM_DBG("initial %d records found in %.*s\n", RES_ROW_N(res), drr_table->len, drr_table->s); n = 0; do { for(i=0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; /* RULE_ID column */ check_val( rule_id_drr_col, ROW_VALUES(row), DB_INT, 1, 0); int_vals[INT_VALS_RULE_ID_DRR_COL] = VAL_INT (ROW_VALUES(row)); /* GROUP column */ check_val( group_drr_col, ROW_VALUES(row)+1, DB_STRING, 1, 1); str_vals[STR_VALS_GROUP_DRR_COL] = (char*)VAL_STRING(ROW_VALUES(row)+1); /* PREFIX column - it may be null or empty */ check_val( prefix_drr_col, ROW_VALUES(row)+2, DB_STRING, 0, 0); if ((ROW_VALUES(row)+2)->nul || VAL_STRING(ROW_VALUES(row)+2)==0){ tmp.s = NULL; tmp.len = 0; } else { str_vals[STR_VALS_PREFIX_DRR_COL] = (char*)VAL_STRING(ROW_VALUES(row)+2); tmp.s = str_vals[STR_VALS_PREFIX_DRR_COL]; tmp.len = strlen(str_vals[STR_VALS_PREFIX_DRR_COL]); } /* TIME column */ check_val( time_drr_col, ROW_VALUES(row)+3, DB_STRING, 0, 0); str_vals[STR_VALS_TIME_DRR_COL] = (char*)VAL_STRING(ROW_VALUES(row)+3); /* PRIORITY column */ check_val( priority_drr_col, ROW_VALUES(row)+4, DB_INT, 1, 0); int_vals[INT_VALS_PRIORITY_DRR_COL] = VAL_INT (ROW_VALUES(row)+4); /* ROUTE_ID column */ check_val( routeid_drr_col, ROW_VALUES(row)+5, DB_STRING, 0, 0); str_vals[STR_VALS_ROUTEID_DRR_COL] = (char*)VAL_STRING(ROW_VALUES(row)+5); /* DSTLIST column */ check_val( dstlist_drr_col, ROW_VALUES(row)+6, DB_STRING, 1, 1); str_vals[STR_VALS_DSTLIST_DRR_COL] = (char*)VAL_STRING(ROW_VALUES(row)+6); /* ATTRS column */ check_val( attrs_drr_col, ROW_VALUES(row)+7, DB_STRING, 0, 0); str_vals[STR_VALS_ATTRS_DRR_COL] = (char*)VAL_STRING(ROW_VALUES(row)+7); /* parse the time definition */ if (str_vals[STR_VALS_TIME_DRR_COL] == NULL || *(str_vals[STR_VALS_TIME_DRR_COL]) == 0) time_rec = NULL; else if ((time_rec=parse_time_def(str_vals[STR_VALS_TIME_DRR_COL]))==0) { LM_ERR("bad time definition <%s> for rule id %d -> skipping\n", str_vals[STR_VALS_TIME_DRR_COL], int_vals[INT_VALS_RULE_ID_DRR_COL]); continue; } /* lookup for the script route ID */ if (str_vals[STR_VALS_ROUTEID_DRR_COL] && str_vals[STR_VALS_ROUTEID_DRR_COL][0]) { int_vals[INT_VALS_SCRIPT_ROUTE_ID] = get_script_route_ID_by_name( str_vals[STR_VALS_ROUTEID_DRR_COL], rlist, RT_NO); if (int_vals[INT_VALS_SCRIPT_ROUTE_ID]==-1) { LM_WARN("route <%s> does not exist\n", str_vals[STR_VALS_ROUTEID_DRR_COL]); int_vals[INT_VALS_SCRIPT_ROUTE_ID] = 0; } } else { int_vals[INT_VALS_SCRIPT_ROUTE_ID] = 0; } /* build the routing rule */ if ((ri = build_rt_info( int_vals[INT_VALS_RULE_ID_DRR_COL], int_vals[INT_VALS_PRIORITY_DRR_COL], time_rec, int_vals[INT_VALS_SCRIPT_ROUTE_ID], str_vals[STR_VALS_DSTLIST_DRR_COL], str_vals[STR_VALS_ATTRS_DRR_COL], rdata))== 0 ) { LM_ERR("failed to add routing info for rule id %d -> " "skipping\n", int_vals[INT_VALS_RULE_ID_DRR_COL]); tmrec_free( time_rec ); continue; } /* add the rule */ if (add_rule( rdata, str_vals[STR_VALS_GROUP_DRR_COL], &tmp, ri)!=0) { LM_ERR("failed to add rule id %d -> skipping\n", int_vals[INT_VALS_RULE_ID_DRR_COL]); free_rt_info( ri ); continue; } n++; } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if(dr_dbf->fetch_result(db_hdl, &res, no_rows)<0) { LM_ERR( "fetching rows (1)\n"); goto error; } LM_DBG("additional %d records found in %.*s\n", RES_ROW_N(res), drr_table->len, drr_table->s); } else { break; } } while(RES_ROW_N(res)>0); dr_dbf->free_result(db_hdl, res); res = 0; LM_DBG("%d total records loaded from table %.*s\n", n, drr_table->len, drr_table->s); return rdata; error: if (res) dr_dbf->free_result(db_hdl, res); if (rdata) free_rt_data( rdata, 1 ); rdata = NULL; return 0; }
/* 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; }
rt_data_t* dr_load_routing_info( db_func_t *dr_dbf, db_con_t* db_hdl, str *drd_table, str *drc_table, str* drr_table ) { int int_vals[4]; char * str_vals[6]; str tmp; db_key_t columns[8]; db_res_t* res; db_row_t* row; rt_info_t *ri; rt_data_t *rdata; tmrec_t *time_rec; int i,n; int no_rows = 10; res = 0; ri = 0; rdata = 0; /* init new data structure */ if ( (rdata=build_rt_data())==0 ) { LM_ERR("failed to build rdata\n"); goto error; } if (db_check_table_version(dr_dbf, db_hdl, drd_table, 5 )!= 0) goto error; /* read the destinations */ if (dr_dbf->use_table( db_hdl, drd_table) < 0) { LM_ERR("cannot select table \"%.*s\"\n", drd_table->len,drd_table->s); goto error; } columns[0] = &id_drd_col; columns[1] = &gwid_drd_col; columns[2] = &address_drd_col; columns[3] = &strip_drd_col; columns[4] = &prefix_drd_col; columns[5] = &type_drd_col; columns[6] = &attrs_drd_col; columns[7] = &probe_drd_col; if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 8, 0, 0 ) < 0) { LM_ERR("DB query failed\n"); goto error; } no_rows = estimate_available_rows( 4+32+15+4+32+4+128+4, 8); if (no_rows==0) no_rows = 10; if(dr_dbf->fetch_result(db_hdl, &res, no_rows )<0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 8, 0, &res) < 0) { LM_ERR("DB query failed\n"); goto error; } } LM_DBG("%d records found in %.*s\n", RES_ROW_N(res), drd_table->len,drd_table->s); n = 0; do { for(i=0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; /* DB ID column */ check_val(ID_DRD_COL, ROW_VALUES(row), DB_INT, 1, 0); int_vals[0] = VAL_INT(ROW_VALUES(row)); /* GW ID column */ check_val(GWID_DRD_COL, ROW_VALUES(row)+1, DB_STRING, 1, 1); str_vals[3] = (char*)VAL_STRING(ROW_VALUES(row)+1); /* ADDRESS column */ check_val(ADDRESS_DRD_COL, ROW_VALUES(row)+2, DB_STRING, 1, 1); str_vals[0] = (char*)VAL_STRING(ROW_VALUES(row)+2); /* STRIP column */ check_val(STRIP_DRD_COL, ROW_VALUES(row)+3, DB_INT, 1, 0); int_vals[1] = VAL_INT (ROW_VALUES(row)+3); /* PREFIX column */ check_val(PREFIX_DRD_COL, ROW_VALUES(row)+4, DB_STRING, 0, 0); str_vals[1] = (char*)VAL_STRING(ROW_VALUES(row)+4); /* TYPE column */ check_val(TYPE_DRD_COL, ROW_VALUES(row)+5, DB_INT, 1, 0); int_vals[2] = VAL_INT(ROW_VALUES(row)+5); /* ATTRS column */ check_val(ATTRS_DRD_COL, ROW_VALUES(row)+6, DB_STRING, 0, 0); str_vals[2] = (char*)VAL_STRING(ROW_VALUES(row)+6); /*PROBE_MODE column */ check_val(PROBE_DRD_COL, ROW_VALUES(row)+7, DB_INT, 1, 0); int_vals[3] = VAL_INT(ROW_VALUES(row)+7); /* add the destinaton definition in */ if ( add_dst( rdata, str_vals[3], str_vals[0], int_vals[1], str_vals[1], int_vals[2], str_vals[2], int_vals[3])<0 ) { LM_ERR("failed to add destination id %d -> skipping\n", int_vals[0]); continue; } n++; } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if(dr_dbf->fetch_result(db_hdl, &res, no_rows)<0) { LM_ERR( "fetching rows (1)\n"); goto error; } } else { break; } } while(RES_ROW_N(res)>0); dr_dbf->free_result(db_hdl, res); res = 0; /* read the carriers, if any */ if (dr_dbf->use_table( db_hdl, drc_table) < 0) { LM_ERR("cannot select table \"%.*s\"\n", drc_table->len,drc_table->s); goto error; } columns[0] = &id_drc_col; columns[1] = &cid_drc_col; columns[2] = &flags_drc_col; columns[3] = &gwlist_drc_col; columns[4] = &attrs_drc_col; if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 5, 0, 0 ) < 0) { LM_ERR("DB query failed\n"); goto error; } no_rows = estimate_available_rows( 4+4+32+64+64, 5/*cols*/); if (no_rows==0) no_rows = 10; if(dr_dbf->fetch_result(db_hdl, &res, no_rows)<0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 5, 0, &res) < 0) { LM_ERR("DB query failed\n"); goto error; } } if (RES_ROW_N(res) == 0) { LM_DBG("table \"%.*s\" empty\n", drc_table->len,drc_table->s ); } else { LM_DBG("%d records found in %.*s\n", RES_ROW_N(res), drc_table->len,drc_table->s); do { for(i=0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; /* ID column */ check_val(ID_DRC_COL, ROW_VALUES(row), DB_INT, 1, 0); int_vals[0] = VAL_INT(ROW_VALUES(row)); /* CARRIER_ID column */ check_val(CID_DRC_COL, ROW_VALUES(row)+1, DB_STRING, 1, 1); str_vals[0] = (char*)VAL_STRING(ROW_VALUES(row)+1); /* ID column */ check_val(ID_DRC_COL, ROW_VALUES(row)+2, DB_INT, 1, 0); int_vals[1] = VAL_INT(ROW_VALUES(row)+2); /* GWLIST column */ check_val(GWLIST_DRC_COL, ROW_VALUES(row)+3, DB_STRING, 1, 1); str_vals[1] = (char*)VAL_STRING(ROW_VALUES(row)+3); /* ATTRS column */ check_val(ATTRS_DRC_COL, ROW_VALUES(row)+4, DB_STRING, 0, 0); str_vals[2] = (char*)VAL_STRING(ROW_VALUES(row)+4); /* add the new carrier */ if ( add_carrier( int_vals[0], str_vals[0], int_vals[1], str_vals[1], str_vals[2], rdata) != 0 ) { LM_ERR("failed to add carrier db_id %d -> skipping\n", int_vals[0]); continue; } } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if(dr_dbf->fetch_result(db_hdl, &res, no_rows)<0) { LM_ERR( "fetching rows (1)\n"); goto error; } } else { break; } } while(RES_ROW_N(res)>0); } dr_dbf->free_result(db_hdl, res); res = 0; /* read the routing rules */ if (dr_dbf->use_table( db_hdl, drr_table) < 0) { LM_ERR("cannot select table \"%.*s\"\n", drr_table->len, drr_table->s); goto error; } columns[0] = &rule_id_drr_col; columns[1] = &group_drr_col; columns[2] = &prefix_drr_col; columns[3] = &time_drr_col; columns[4] = &priority_drr_col; columns[5] = &routeid_drr_col; columns[6] = &dstlist_drr_col; columns[7] = &attrs_drd_col; if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 8, 0, 0) < 0) { LM_ERR("DB query failed\n"); goto error; } no_rows = estimate_available_rows( 4+32+32+128+32+64+128, 8/*cols*/); if (no_rows==0) no_rows = 10; if(dr_dbf->fetch_result(db_hdl, &res, no_rows)<0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if ( dr_dbf->query( db_hdl, 0, 0, 0, columns, 0, 8, 0, &res) < 0) { LM_ERR("DB query failed\n"); goto error; } } if (RES_ROW_N(res) == 0) { LM_WARN("table \"%.*s\" is empty\n", drr_table->len, drr_table->s); } LM_DBG("%d records found in %.*s\n", RES_ROW_N(res), drr_table->len, drr_table->s); n = 0; do { for(i=0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; /* RULE_ID column */ check_val(RULE_ID_DRR_COL, ROW_VALUES(row), DB_INT, 1, 0); int_vals[0] = VAL_INT (ROW_VALUES(row)); /* GROUP column */ check_val(GROUP_DRR_COL, ROW_VALUES(row)+1, DB_STRING, 1, 1); str_vals[0] = (char*)VAL_STRING(ROW_VALUES(row)+1); /* PREFIX column - it may be null or empty */ check_val(PREFIX_DRR_COL, ROW_VALUES(row)+2, DB_STRING, 0, 0); if ((ROW_VALUES(row)+2)->nul || VAL_STRING(ROW_VALUES(row)+2)==0){ tmp.s = NULL; tmp.len = 0; } else { str_vals[1] = (char*)VAL_STRING(ROW_VALUES(row)+2); tmp.s = str_vals[1]; tmp.len = strlen(str_vals[1]); } /* TIME column */ check_val(TIME_DRR_COL, ROW_VALUES(row)+3, DB_STRING, 0, 0); str_vals[2] = (char*)VAL_STRING(ROW_VALUES(row)+3); /* PRIORITY column */ check_val(PRIORITY_DRR_COL, ROW_VALUES(row)+4, DB_INT, 1, 0); int_vals[2] = VAL_INT (ROW_VALUES(row)+4); /* ROUTE_ID column */ check_val(ROUTEID_DRR_COL, ROW_VALUES(row)+5, DB_STRING, 1, 0); str_vals[3] = (char*)VAL_STRING(ROW_VALUES(row)+5); /* DSTLIST column */ check_val(DSTLIST_DRR_COL, ROW_VALUES(row)+6, DB_STRING, 1, 1); str_vals[4] = (char*)VAL_STRING(ROW_VALUES(row)+6); /* ATTRS column */ check_val(ATTRS_DRD_COL, ROW_VALUES(row)+7, DB_STRING, 0, 0); str_vals[5] = (char*)VAL_STRING(ROW_VALUES(row)+7); /* parse the time definition */ if ((time_rec=parse_time_def(str_vals[2]))==0) { LM_ERR("bad time definition <%s> for rule id %d -> skipping\n", str_vals[2], int_vals[0]); continue; } /* lookup for the script route ID */ if (str_vals[3][0]) { int_vals[3] = get_script_route_ID_by_name( str_vals[3], rlist, RT_NO); if (int_vals[3]==-1) { LM_WARN("route <%s> does not exist\n",str_vals[3]); int_vals[3] = 0; } } else { int_vals[3] = 0; } /* build the routing rule */ if ((ri = build_rt_info( int_vals[0], int_vals[2], time_rec, int_vals[3], str_vals[4], str_vals[5], rdata))== 0 ) { LM_ERR("failed to add routing info for rule id %d -> " "skipping\n", int_vals[0]); tmrec_free( time_rec ); continue; } /* add the rule */ if (add_rule( rdata, str_vals[0], &tmp, ri)!=0) { LM_ERR("failed to add rule id %d -> skipping\n", int_vals[0]); free_rt_info( ri ); continue; } n++; } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if(dr_dbf->fetch_result(db_hdl, &res, no_rows)<0) { LM_ERR( "fetching rows (1)\n"); goto error; } } else { break; } } while(RES_ROW_N(res)>0); dr_dbf->free_result(db_hdl, res); res = 0; if (n==0) { LM_WARN("no valid routing rules -> discarding all destinations\n"); free_rt_data( rdata, 0 ); } return rdata; error: if (res) dr_dbf->free_result(db_hdl, res); if (rdata) free_rt_data( rdata, 1 ); rdata = NULL; return 0; }
void do_check(int i) { std::cout << "Checking type char with value " << i << std::endl; check_val(static_cast<char>(i)); std::cout << "Checking type unsigned char with value " << i << std::endl; check_val(static_cast<unsigned char>(i)); std::cout << "Checking type signed char with value " << i << std::endl; check_val(static_cast<signed char>(i)); std::cout << "Checking type short with value " << i << std::endl; check_val(static_cast<short>(i)); std::cout << "Checking type unsigned short with value " << i << std::endl; check_val(static_cast<unsigned short>(i)); std::cout << "Checking type int with value " << i << std::endl; check_val(static_cast<int>(i)); std::cout << "Checking type unsigned int with value " << i << std::endl; check_val(static_cast<unsigned int>(i)); std::cout << "Checking type long with value " << i << std::endl; check_val(static_cast<long>(i)); std::cout << "Checking type unsigned long with value " << i << std::endl; check_val(static_cast<unsigned long>(i)); #ifdef BOOST_HAS_LONG_LONG std::cout << "Checking type long long with value " << i << std::endl; check_val(static_cast<long long>(i)); std::cout << "Checking type unsigned long long with value " << i << std::endl; check_val(static_cast<unsigned long long>(i)); #elif defined(BOOST_HAS_MS_INT64) std::cout << "Checking type __int64 with value " << i << std::endl; check_val(static_cast<__int64>(i)); std::cout << "Checking type unsigned __int64 with value " << i << std::endl; check_val(static_cast<unsigned __int64>(i)); #endif do_check(static_cast<double>(i)); }
/* loads data from the db */ int load_info(db_func_t *dr_dbf, db_con_t* db_hdl, str *db_table, struct tls_domain **serv_dom, struct tls_domain **cli_dom) { int int_vals[4]; char *str_vals[11]; int i, n; int no_rows = 5; int db_cols = 15; /* the columns from the db table */ db_key_t columns[15]; /* result from a db query */ db_res_t* res; /* a row from the db table */ db_row_t* row; res = 0; columns[0] = &id_col; columns[1] = &address_col; columns[2] = &type_col; columns[3] = &method_col; columns[4] = &verify_cert_col; columns[5] = &require_cert_col; columns[6] = &certificate_col; columns[7] = &pk_col; columns[8] = &crl_check_col; columns[9] = &crl_dir_col; columns[10] = &calist_col; columns[11] = &cadir_col; columns[12] = &cplist_col; columns[13] = &dhparams_col; columns[14] = &eccurve_col; /* checking if the table version is up to date*/ if (db_check_table_version(dr_dbf, db_hdl, db_table, 1/*version*/) != 0) goto error; /* table to use*/ 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; } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if (dr_dbf->query(db_hdl, 0, 0, 0, columns, 0, db_cols, 0, 0) < 0) { LM_ERR("DB query failed - retrieve valid connections \n"); goto error; } no_rows = estimate_available_rows(10 + 45 + 4 + 45 + 4 + 4 + 45 + 45 + 4 + 45 + 45 + 45 + 45 + 45 + 45, db_cols); if (no_rows == 0) no_rows = 5; if (dr_dbf->fetch_result(db_hdl, &res, no_rows) < 0) { LM_ERR("Error fetching rows\n"); goto error; } } else { if (dr_dbf->query(db_hdl, 0, 0, 0, columns, 0, 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); n = 0; do { for (i = 0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; check_val(id_col, ROW_VALUES(row), DB_STRING, 1, 1); str_vals[STR_VALS_ID_COL] = (char *) VAL_STRING(ROW_VALUES(row)); check_val(address_col, ROW_VALUES(row) + 1, DB_STRING, 1, 1); str_vals[STR_VALS_ADDRESS_COL] = (char *) VAL_STRING(ROW_VALUES(row) + 1); check_val(type_col, ROW_VALUES(row) + 2, DB_INT, 1, 0); int_vals[INT_VALS_TYPE_COL] = VAL_INT(ROW_VALUES(row) + 2); check_val(method_col, ROW_VALUES(row) + 3, DB_STRING, 0, 0); str_vals[STR_VALS_METHOD_COL] = (char *) VAL_STRING(ROW_VALUES(row) + 3); check_val(verify_cert_col, ROW_VALUES(row) + 4, DB_INT, 0, 0); int_vals[INT_VALS_VERIFY_CERT_COL] = VAL_INT(ROW_VALUES(row) + 4); check_val(require_cert_col, ROW_VALUES(row) + 5, DB_INT, 0, 0); int_vals[INT_VALS_REQUIRE_CERT_COL] = VAL_INT(ROW_VALUES(row) + 5); check_val(certificate_col, ROW_VALUES(row) + 6, DB_STRING, 0, 0); str_vals[STR_VALS_CERTIFICATE_COL] = (char *) VAL_STRING(ROW_VALUES(row) + 6); check_val(pk_col, ROW_VALUES(row) + 7, DB_STRING, 0, 0); str_vals[STR_VALS_PK_COL] = (char *) VAL_STRING(ROW_VALUES(row) + 7); check_val(crl_check_col, ROW_VALUES(row) + 8, DB_INT, 0, 0); int_vals[INT_VALS_CRL_CHECK_COL] = VAL_INT(ROW_VALUES(row) + 8); check_val(crl_dir_col, ROW_VALUES(row) + 9, DB_STRING, 0, 0); str_vals[STR_VALS_CRL_DIR_COL] = (char *) VAL_STRING(ROW_VALUES(row) + 9); check_val(calist_col, ROW_VALUES(row) + 10, DB_STRING, 0, 0); str_vals[STR_VALS_CALIST_COL] = (char *) VAL_STRING(ROW_VALUES(row) + 10); check_val(cadir_col, ROW_VALUES(row) + 11, DB_STRING, 0, 0); str_vals[STR_VALS_CADIR_COL] = (char *) VAL_STRING(ROW_VALUES(row) + 11); check_val(cplist_col, ROW_VALUES(row) + 12, DB_STRING, 0, 0); str_vals[STR_VALS_CPLIST_COL] = (char *) VAL_STRING(ROW_VALUES(row) + 12); check_val(dhparams_col, ROW_VALUES(row) + 13, DB_STRING, 0, 0); str_vals[STR_VALS_DHPARAMS_COL] = (char *) VAL_STRING(ROW_VALUES(row) + 13); check_val(eccurve_col, ROW_VALUES(row) + 14, DB_STRING, 0, 0); str_vals[STR_VALS_ECCURVE_COL] = (char *) VAL_STRING(ROW_VALUES(row) + 14); tlsp_db_add_domain(str_vals, int_vals, serv_dom, cli_dom); n++; } if (DB_CAPABILITY(*dr_dbf, DB_CAP_FETCH)) { if (dr_dbf->fetch_result(db_hdl, &res, no_rows) < 0) { LM_ERR("fetching rows\n"); goto error; } } else { break; } } while (RES_ROW_N(res) > 0); LM_DBG("%d records found in %.*s\n", n, db_table->len, db_table->s); dr_dbf->free_result(db_hdl, res); res = 0; return 0; error: LM_ERR("database"); return -1; }
static int set_option(const char *name, char *value) { /* return 1 means error, return 0 means okay */ int nerr = 0; if (strcmp(name, "port") == 0 || strcmp(name, "p") == 0) { info->uc->port = atoi(optarg); } else if (strcmp(name, "verbose") == 0 || strcmp(name, "v") == 0) { info->verbose = 1; veejay_set_debug_level(info->verbose); } else if (strcmp(name, "no-color") == 0 || strcmp(name,"n") == 0) { veejay_set_colors(0); } else if (strcmp(name, "audio") == 0 || strcmp(name, "a") == 0) { info->audio = atoi(optarg); } else if ( strcmp(name, "A" ) == 0 || strcmp(name, "capture-device" ) == 0 ) { live = atoi(optarg); } else if ( strcmp(name, "Z" ) == 0 || strcmp(name, "load-generators" ) == 0 ) { if( sscanf( optarg, "%d",&ta ) != 1 ) { fprintf(stderr, "-Z/--load-generators requires an argument\n"); nerr++; } } else if (strcmp(name, "bezerk") == 0 || strcmp(name, "b") == 0) { info->no_bezerk = 0; } else if (strcmp(name, "qrcode-connection-info" ) == 0 ) { info->qrcode = 1; } else if (strcmp(name, "timer") == 0 || strcmp(name, "t") == 0) { info->uc->use_timer = atoi(optarg); if (info->uc->use_timer < 0 || info->uc->use_timer > 2) { printf("Valid timers:\n\t0=none\n\t2=normal\n\t1=rtc\n"); nerr++; } } else if (strcmp(name, "multicast-vims") == 0 || strcmp(name,"T")==0) { check_val(optarg, name); info->settings->use_vims_mcast = 1; info->settings->vims_group_name = strdup(optarg); } else if (strcmp(name, "multicast-osc") == 0 || strcmp(name, "M") == 0 ) { check_val(optarg,name); info->settings->use_mcast = 1; info->settings->group_name = strdup( optarg ); } else if (strcmp(name, "max_cache" )== 0 || strcmp(name, "j" ) == 0 ) { n_slots_ = atoi( optarg ); if(n_slots_ < 0 ) n_slots_ = 0; else if (n_slots_ > 100) n_slots_ = 100; } else if (strcmp(name, "memory" ) == 0 || strcmp(name, "m" ) == 0) { max_mem_ = atoi(optarg); if(max_mem_ < 0 ) max_mem_ = 0; else if (max_mem_ > 100) max_mem_ = 100; } else if (strcmp(name, "synchronization") == 0 || strcmp(name, "c") == 0) { info->sync_correction = atoi(optarg); } else if (strcmp(name, "version") == 0 ) { printf("Veejay %s\n", VERSION); exit(0); } else if (strcmp(name, "graphics-driver") == 0 || strcmp(name, "G") == 0 || strcmp(name, "output") == 0 || strcmp(name, "O") == 0) { info->video_out = atoi(optarg); /* use SDL */ /*#ifndef HAVE_GL if(info->video_out==3) { fprintf(stderr, "OpenGL support not enabled at compile time\n"); exit(-1); } #endif */ if( info->video_out < 0 || info->video_out > 6 ) { fprintf(stderr, "Select a valid output display driver\n"); exit(-1); } } else if (strcmp(name, "B") == 0 || strcmp(name, "features")==0) { CompiledWith(); nerr++; } else if ( strcmp(name, "output-file" ) == 0 || strcmp(name, "o") == 0 ) { check_val(optarg,name); veejay_strncpy(info->y4m_file,(char*) optarg, strlen( (char*) optarg)); } else if (strcmp(name, "preserve-pathnames") == 0 ) { info->preserve_pathnames = 1; } else if (strcmp(name, "benchmark" ) == 0 ) { int w=0,h=0; int n = 0; if( value != NULL ) n = sscanf(value, "%dx%d", &w,&h ); if( n != 2 || value == NULL ) { fprintf(stderr," --benchmark parameter requires NxN argument\n"); nerr++; } if( n == 2 ) { benchmark_veejay(w,h); exit(0); } } else if (strcmp(name, "deinterlace") == 0 || strcmp(name, "I" )==0) { info->auto_deinterlace = 1; } else if (strcmp(name, "size") == 0 || strcmp(name, "s") == 0) { if (sscanf(value, "%dx%d", &info->bes_width, &info->bes_height) != 2) { fprintf(stderr,"-s/--size parameter requires NxN argument\n"); nerr++; } } else if (strcmp(name,"scene-detection" ) == 0 || strcmp( name,"S") == 0 ) { if ((sscanf(value, "%d", &info->uc->scene_detection )) != 1 ) { fprintf(stderr, "-S/--scene-detection requires threshold argument\n"); nerr++; } } #ifdef HAVE_XINERAMA #ifndef X_DISPLAY_MISSING else if (strcmp(name, "xinerama") == 0 || strcmp(name, "X") == 0 ) { x11_user_select( atoi(optarg) ); } #endif #endif else if (strcmp(name, "action-file")==0 || strcmp(name,"F")==0) { check_val(optarg,name); veejay_strncpy(info->action_file[0],(char*) optarg, strlen( (char*) optarg)); info->load_action_file = 1; }else if (strcmp(name, "sample-file")==0 || strcmp(name,"l")==0) { check_val(optarg,name); veejay_strncpy(info->action_file[1],(char*) optarg, strlen( (char*) optarg)); info->load_action_file = 1; } else if (strcmp(name, "geometry-x") == 0 || strcmp(name, "x")==0) { default_geometry_x = atoi(optarg); } else if (strcmp(name, "geometry-y") == 0 || strcmp(name,"y")==0) { default_geometry_y = atoi(optarg); } else if (strcmp(name, "no-keyboard") == 0 ) { use_keyb = 0; } else if (strcmp(name, "no-mouse") == 0 ) { use_mouse = 0; } else if (strcmp(name, "show-cursor") == 0 ) { show_cursor = 1; } else if(strcmp(name,"dump-events")==0 || strcmp(name,"u")==0) { info->dump = 1; } else if(strcmp(name, "input-width") == 0 || strcmp(name, "W") == 0 ) { info->dummy->width = atoi(optarg); } else if(strcmp(name, "input-height") == 0 || strcmp(name, "H") == 0 ) { info->dummy->height = atoi(optarg); } else if(strcmp(name, "norm") == 0 || strcmp(name, "N") == 0 ) { int val = atoi(optarg); if(val == 1 ) override_norm = 'n'; if(val == 0 ) override_norm = 'p'; if(val == 2 ) override_norm = 's'; } else if(strcmp(name, "D") == 0 || strcmp(name, "composite") == 0) { info->settings->composite = 0; } else if(strcmp(name, "output-width") == 0 || strcmp(name, "w") == 0) { info->video_output_width = atoi(optarg); } else if(strcmp(name, "output-height") == 0 || strcmp(name, "h") == 0) { info->video_output_height = atoi(optarg); } else if(strcmp(name, "audiorate") == 0 || strcmp(name, "r") == 0 ) { info->dummy->arate = atoi(optarg); } else if (strcmp(name,"fps")==0 || strcmp(name, "f")==0) { override_fps = atof(optarg); } else if(strcmp(name,"yuv")==0 || strcmp(name,"Y")==0) { override_pix_fmt = atoi(optarg); if( override_pix_fmt < 0 || override_pix_fmt > 2 ) override_pix_fmt = 0; } else if(strcmp(name, "swap-range") == 0 || strcmp(name, "e") == 0 ) { switch_jpeg = 1; } else if( strcmp(name,"auto-loop")==0 || strcmp(name,"L") == 0) { auto_loop = 1; } else if (strcmp(name, "quit") == 0 || strcmp(name, "q") == 0 ) { info->continuous = 0; } else if (strcmp(name, "clip-as-sample") == 0 || strcmp(name, "g") == 0 ) { info->uc->file_as_sample = 1; } else if (strcmp(name, "dummy") == 0 || strcmp(name, "d" ) == 0 ) { info->dummy->active = 1; // enable DUMMY MODE } else nerr++; /* unknown option - error */ return nerr; }