int pdt_sync_cache() { pd_op_t *ito; DBG("PDT:pdt_sync_cache: ...\n"); if(_dhash==NULL || _ptree==NULL) { LOG(L_ERR, "PDT:pdt_sync_cache: strange situation\n"); return -1; } lock_get(&_dhash->diff_lock); if(_ptree->idsync >= _dhash->max_id) goto done; ito = _dhash->diff; while(ito!=NULL && _ptree->idsync >= ito->id) ito = ito->n; while(ito!=NULL) { DBG("PDT:pdt_sync_cache: sync op[%d]=%d...\n", ito->id, ito->op); switch(ito->op) { case PDT_ADD: if(pdt_add_to_tree(_ptree, &ito->cell->prefix, &ito->cell->domain)!=0) { LOG(L_ERR, "PDT:pdt_sync_cache: Error to insert in tree\n"); goto error; } break; case PDT_DELETE: if(pdt_remove_from_tree(_ptree, &ito->cell->prefix)!=0) { LOG(L_ERR, "PDT:pdt_sync_cache: Error to remove from tree\n"); goto error; } break; default: LOG(L_ERR, "PDT:pdt_sync_cache: unknown operation\n"); } _ptree->idsync = ito->id; ito->count++; ito = ito->n; } done: lock_release(&_dhash->diff_lock); return 0; error: lock_release(&_dhash->diff_lock); return -1; }
static int pdt_load_db(void) { db_key_t db_cols[3] = {&sdomain_column, &prefix_column, &domain_column}; str p, d, sdomain; db_res_t* db_res = NULL; int i, ret; pdt_tree_t *_ptree_new = NULL; pdt_tree_t *old_tree = NULL; int no_rows = 10; if(db_con==NULL) { LM_ERR("no db connection\n"); return -1; } if (pdt_dbf.use_table(db_con, &db_table) < 0) { LM_ERR("failed to use_table\n"); return -1; } if (DB_CAPABILITY(pdt_dbf, DB_CAP_FETCH)) { if(pdt_dbf.query(db_con,0,0,0,db_cols,0,3,&sdomain_column,0) < 0) { LM_ERR("Error while querying db\n"); return -1; } no_rows = estimate_available_rows( 64+16+64, 3); if (no_rows==0) no_rows = 10; if(pdt_dbf.fetch_result(db_con, &db_res, no_rows)<0) { LM_ERR("Error while fetching result\n"); if (db_res) pdt_dbf.free_result(db_con, db_res); goto error; } else { if(RES_ROW_N(db_res)==0) { return 0; } } } else { if((ret=pdt_dbf.query(db_con, NULL, NULL, NULL, db_cols, 0, 3, &sdomain_column, &db_res))!=0 || RES_ROW_N(db_res)<=0 ) { pdt_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 ?!?! */ sdomain.s = (char*)(RES_ROWS(db_res)[i].values[0].val.string_val); sdomain.len = strlen(sdomain.s); p.s = (char*)(RES_ROWS(db_res)[i].values[1].val.string_val); p.len = strlen(p.s); d.s = (char*)(RES_ROWS(db_res)[i].values[2].val.string_val); d.len = strlen(d.s); if(p.s==NULL || d.s==NULL || sdomain.s==NULL || p.len<=0 || d.len<=0 || sdomain.len<=0) { LM_ERR("Error - bad values in db\n"); continue; } if(pdt_check_domain!=0 && _ptree_new!=NULL && pdt_check_pd(_ptree_new, &sdomain, &p, &d)==1) { LM_ERR("sdomain [%.*s]: prefix [%.*s] or domain <%.*s> " "duplicated\n", sdomain.len, sdomain.s, p.len, p.s, d.len, d.s); continue; } if(pdt_add_to_tree(&_ptree_new, &sdomain, &p, &d)<0) { LM_ERR("Error adding info to tree\n"); goto error; } } if (DB_CAPABILITY(pdt_dbf, DB_CAP_FETCH)) { if(pdt_dbf.fetch_result(db_con, &db_res, no_rows)<0) { LM_ERR("Error while fetching!\n"); if (db_res) pdt_dbf.free_result(db_con, db_res); goto error; } } else { break; } } while(RES_ROW_N(db_res)>0); pdt_dbf.free_result(db_con, db_res); /* block all readers */ lock_start_write( pdt_lock ); old_tree = *_ptree; *_ptree = _ptree_new; lock_stop_write( pdt_lock ); /* free old data */ if (old_tree!=NULL) pdt_free_tree(old_tree); return 0; error: pdt_dbf.free_result(db_con, db_res); if (_ptree_new!=NULL) pdt_free_tree(_ptree_new); return -1; }
int pdt_load_db() { db_key_t db_cols[] = {prefix_column, domain_column}; str p, d; db_res_t* db_res = NULL; int i; if(db_con==NULL) { LOG(L_ERR, "PDT:pdt_load_db: no db connection\n"); return -1; } if (pdt_dbf.use_table(db_con, db_table) < 0) { LOG(L_ERR, "PDT:pdt_load_db: Error in use_table\n"); return -1; } if(pdt_dbf.query(db_con, NULL, NULL, NULL, db_cols, 0, 2, prefix_column, &db_res)==0) { for(i=0; i<RES_ROW_N(db_res); i++) { /* check for NULL values ?!?! */ p.s = (char*)(RES_ROWS(db_res)[i].values[0].val.string_val); p.len = strlen(p.s); d.s = (char*)(RES_ROWS(db_res)[i].values[1].val.string_val); d.len = strlen(d.s); if(p.s==NULL || d.s==NULL || p.len<=0 || d.len<=0) { LOG(L_ERR, "PDT:pdt_load_db: Error - bad values in db\n"); goto error; } if(pdt_check_pd(_dhash, &p, &d)!=0) { LOG(L_ERR, "PDT:pdt_load_db: prefix [%.*s] or domain <%.*s> duplicated\n", p.len, p.s, d.len, d.s); goto error;; } if(pdt_add_to_tree(_ptree, &p, &d)!=0) { LOG(L_ERR, "PDT:pdt_load_db: Error adding info in tree\n"); goto error; } if(pdt_add_to_hash(_dhash, &p, &d)!=0) { LOG(L_ERR, "PDT:pdt_load_db: Error adding info in hash\n"); goto error; } } } pdt_dbf.free_result(db_con, db_res); return 0; error: pdt_dbf.free_result(db_con, db_res); return -1; }