示例#1
0
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;
}
示例#2
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;
}
示例#3
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;
	}
}