package com.g414.haildb;
import com.g414.haildb.impl.jna.HailDB;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.PointerByReference;
public class Transaction {
public enum TransactionLevel {
READ_UNCOMMITTED(HailDB.ib_trx_level_t.IB_TRX_READ_UNCOMMITTED), READ_COMMITTED(
HailDB.ib_trx_level_t.IB_TRX_READ_COMMITTED), REPEATABLE_READ(
HailDB.ib_trx_level_t.IB_TRX_REPEATABLE_READ), SERIALIZABLE(
HailDB.ib_trx_level_t.IB_TRX_SERIALIZABLE);
private final int code;
private TransactionLevel(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public static TransactionLevel fromCode(int code) {
return TransactionLevel.values()[code];
}
}
public enum TransactionState {
NOT_STARTED(HailDB.ib_trx_state_t.IB_TRX_NOT_STARTED), ACTIVE(
HailDB.ib_trx_state_t.IB_TRX_ACTIVE), COMMITTED_IN_MEMORY(
HailDB.ib_trx_state_t.IB_TRX_COMMITTED_IN_MEMORY), PREPARED(
HailDB.ib_trx_state_t.IB_TRX_PREPARED);
private final int code;
private TransactionState(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public static TransactionState fromCode(int code) {
return TransactionState.values()[code];
}
}
protected final Pointer trx;
public Transaction(Pointer trx) {
this.trx = trx;
}
public Cursor openTable(TableDef tableDef) {
PointerByReference crsr = new PointerByReference();
Util.assertSuccess(HailDB.ib_cursor_open_table(tableDef.getName(), trx,
crsr));
return new Cursor(crsr, tableDef, null);
}
public void commit() {
Util.assertSuccess(HailDB.ib_trx_commit(trx));
}
public void rollback() {
Util.assertSuccess(HailDB.ib_trx_rollback(trx));
}
public void release() {
Util.assertSuccess(HailDB.ib_trx_release(trx));
}
public void start(TransactionLevel level) {
Util.assertSuccess(HailDB.ib_trx_start(trx, level.getCode()));
}
public TransactionState getState() {
return TransactionState.fromCode(HailDB.ib_trx_state(trx));
}
public Pointer getTrx() {
return trx;
}
}