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 ul_db_tran_rollback(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_rollback(&handle->db[i].dbf, handle->db[i].dbh) < 0) { LM_ERR("error while rolling back " "transaction on id %i, db %i.\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; } }