void mt_destroy_trees(void) { if (_ptree!=NULL) { if (*_ptree!=NULL) mt_free_tree(*_ptree); shm_free(_ptree); _ptree = NULL; } }
void mt_free_tree(m_tree_t *pt) { if(pt == NULL) return; if(pt->head!=NULL) mt_free_node(pt->head, pt->type); if(pt->next!=NULL) mt_free_tree(pt->next); if(pt->dbtable.s!=NULL) shm_free(pt->dbtable.s); if(pt->tname.s!=NULL) shm_free(pt->tname.s); shm_free(pt); pt = NULL; return; }
static int mt_load_db_trees() { db_key_t db_cols[3] = {&tname_column, &tprefix_column, &tvalue_column}; str tprefix, tvalue, tname; db1_res_t* db_res = NULL; int i, ret; m_tree_t *new_head = NULL; m_tree_t *new_tree = NULL; m_tree_t *old_head = NULL; if(db_con==NULL) { LM_ERR("no db connection\n"); return -1; } if (mt_dbf.use_table(db_con, &db_table) < 0) { LM_ERR("failed to use_table\n"); return -1; } if (DB_CAPABILITY(mt_dbf, DB_CAP_FETCH)) { if(mt_dbf.query(db_con,0,0,0,db_cols,0,3,&tname_column,0) < 0) { LM_ERR("Error while querying db\n"); return -1; } if(mt_dbf.fetch_result(db_con, &db_res, mt_fetch_rows)<0) { LM_ERR("Error while fetching result\n"); if (db_res) mt_dbf.free_result(db_con, db_res); goto error; } else { if(RES_ROW_N(db_res)==0) { return 0; } } } else { if((ret=mt_dbf.query(db_con, NULL, NULL, NULL, db_cols, 0, 3, &tname_column, &db_res))!=0 || RES_ROW_N(db_res)<=0 ) { mt_dbf.free_result(db_con, db_res); if( ret==0) { return 0; } else { goto error; } } } do { for(i=0; i<RES_ROW_N(db_res); i++) { /* check for NULL values ?!?! */ tname.s = (char*)(RES_ROWS(db_res)[i].values[0].val.string_val); tname.len = strlen(tname.s); tprefix.s = (char*)(RES_ROWS(db_res)[i].values[1].val.string_val); tprefix.len = strlen(tprefix.s); tvalue.s = (char*)(RES_ROWS(db_res)[i].values[2].val.string_val); tvalue.len = strlen(tvalue.s); if(tprefix.s==NULL || tvalue.s==NULL || tname.s==NULL || tprefix.len<=0 || tvalue.len<=0 || tname.len<=0) { LM_ERR("Error - bad values in db\n"); continue; } new_tree = mt_add_tree(&new_head, &tname, &db_table, NULL, _mt_tree_type, 0); if(new_tree==NULL) { LM_ERR("New tree cannot be initialized\n"); goto error; } if(mt_add_to_tree(new_tree, &tprefix, &tvalue)<0) { LM_ERR("Error adding info to tree\n"); goto error; } } if (DB_CAPABILITY(mt_dbf, DB_CAP_FETCH)) { if(mt_dbf.fetch_result(db_con, &db_res, mt_fetch_rows)<0) { LM_ERR("Error while fetching!\n"); if (db_res) mt_dbf.free_result(db_con, db_res); goto error; } } else { break; } } while(RES_ROW_N(db_res)>0); mt_dbf.free_result(db_con, db_res); /* block all readers */ lock_get( mt_lock ); mt_reload_flag = 1; lock_release( mt_lock ); while (mt_tree_refcnt) { sleep_us(10); } old_head = mt_swap_list_head(new_head); mt_reload_flag = 0; /* free old data */ if (old_head!=NULL) mt_free_tree(old_head); return 0; error: mt_dbf.free_result(db_con, db_res); if (new_head!=NULL) mt_free_tree(new_head); return -1; }