int ul_db_tran_commit(ul_db_handle_t * handle, int working[]) { int i; int errors = 0; int w = 0; if(!handle || !working) { LM_ERR("NULL pointer in parameter.\n"); return -1; } for(i=0; i<DB_NUM; i++) { if((handle->db[i].status == DB_ON) && (working[i])) { if(submit_tran_commit(&handle->db[i].dbf, handle->db[i].dbh) < 0) { LM_ERR("error while committing " "transaction on id %i, db %i.\n", handle->id, handle->db[i].no); if(db_handle_error(handle, handle->db[i].no) < 0) { LM_ERR("error during handling error " "on id %i on db %i, trying again.\n", handle->id, handle->db[i].no); } errors++; } else { w++; } } } if((errors > 0) || (w < get_working_sum(working, DB_NUM))) { return -1; } return 0; }
int db_submit_query(ul_db_op_t ul_op, ul_db_handle_t * handle, str * table, db_key_t* _k, db_op_t* _o, db_val_t* _v, db_key_t* _uk, db_val_t* _uv, int _n, int _un) { int i; int working_c[DB_NUM]; int working_r[DB_NUM]; int errors = 0; int w; if(!handle || !table || !table->s) { LM_ERR("NULL pointer in parameter.\n"); return -1; } if(db_use_transactions) { for(i=0; i<DB_NUM; i++) { working_c[i] = 0; working_r[i] = 0; } if(ul_db_tran_start(handle, working_r) < 0) { LM_ERR("error during starting transaction" " on table %.*s with id %i.\n", table->len, table->s, handle->id); w = get_working_sum(working_r, DB_NUM); if(db_check_policy(DB_POL_MOD, w, handle->working) < 0) { ul_db_tran_rollback(handle, working_r); return -1; } } for(i=0; i<DB_NUM; i++) { working_c[i] = working_r[i]; if((handle->db[i].status == DB_ON) && (working_c[i])) { if(db_do_query(ul_op, &handle->db[i].dbf, handle->db[i].dbh, table, _k, _o, _v, _uk, _uv, _n, _un) < 0) { LM_ERR("error during querying " "table %.*s with id %i on db %i.\n", table->len, table->s, handle->id, i); if(db_handle_error(handle, handle->db[i].no) < 0) { LM_CRIT("could not handle error on db %i, handle, %i\n", handle->id, handle->db[i].no); } errors++; working_c[i] = 0; } else { working_r[i] = 0; } } } w = get_working_sum(working_c, DB_NUM); if(errors > 0) { ul_db_tran_rollback(handle, working_r); if(db_check_policy(DB_POL_MOD, w, handle->working) < 0) { ul_db_tran_rollback(handle, working_c); return -1; } } return ul_db_tran_commit(handle, working_c); } else { for(i=0; i<DB_NUM; i++) { if(handle->db[i].status == DB_ON) { if(db_do_query(ul_op, &handle->db[i].dbf, handle->db[i].dbh, table, _k, _o, _v, _uk, _uv, _n, _un) < 0) { if(db_handle_error(handle, handle->db[i].no) < 0) { LM_CRIT("could not handle error on db %i, handle, %i\n", handle->id, handle->db[i].no); } return -1; } } } return 0; } }
int refresh_handle(ul_db_handle_t * handle, ul_db_handle_t * new_data, int error_handling) { int db_ok = 0; int i, ret; str tmpurl; handle->id = new_data->id; handle->working = 0; handle->expires = time(NULL) + connection_expires; for(i=0; i<DB_NUM; i++) { handle->db[i].status = new_data->db[i].status; handle->db[i].errors = new_data->db[i].errors; handle->db[i].failover_time = new_data->db[i].failover_time; handle->db[i].rg = new_data->db[i].rg; handle->db[i].no = new_data->db[i].no; if((handle->db[i].url.len != new_data->db[i].url.len) || (strcmp(handle->db[i].url.s, new_data->db[i].url.s) != 0)) { memset(handle->db[i].url.s, 0, UL_DB_URL_LEN); strcpy(handle->db[i].url.s, new_data->db[i].url.s); handle->db[i].url.len = new_data->db[i].url.len; if(handle->db[i].dbh) { handle->db[i].dbf.close(handle->db[i].dbh); handle->db[i].dbh = NULL; } memset(&handle->db[i].dbf, 0, sizeof(db_func_t)); tmpurl.len = handle->db[i].url.len; tmpurl.s = handle->db[i].url.s; if(db_bind_mod(&tmpurl, &handle->db[i].dbf) < 0){ LM_ERR("could not bind db module.\n"); return -1; } } if(handle->db[i].status == DB_ON) { handle->working++; if(handle->db[i].dbh) { db_ok++; } else { LM_DBG("connect id %i db %i.\n", handle->id, handle->db[i].no); tmpurl.len = handle->db[i].url.len; tmpurl.s = handle->db[i].url.s; if((handle->db[i].dbh = handle->db[i].dbf.init(&tmpurl)) == NULL) { LM_ERR("id: %i could not " "connect database %i.\n", handle->id, handle->db[i].no); if(error_handling){ if(db_handle_error(handle, handle->db[i].no) < 0){ LM_ERR("id: %i could not " "handle error on database %i.\n", handle->id, handle->db[i].no); } } } else { db_ok++; } } } else if (handle->db[i].status == DB_INACTIVE) { if(handle->db[i].dbh){ LM_DBG("deactivate id %i db %i.\n", handle->id, handle->db[i].no); handle->db[i].dbf.close(handle->db[i].dbh); handle->db[i].dbh = NULL; } } else { if(handle->db[i].dbh) { LM_DBG("shutdown id %i db %i.\n", handle->id, handle->db[i].no); handle->db[i].dbf.close(handle->db[i].dbh); handle->db[i].dbh = NULL; } } } if((ret = db_check_policy(DB_POL_OP, db_ok, handle->working)) < 0){ LM_ERR("id %i: too few dbs working\n", handle->id); } return ret; }