package org.reldb.rel.v0.storage.tables;
import org.reldb.rel.exceptions.ExceptionFatal;
import org.reldb.rel.v0.storage.RelDatabase;
import org.reldb.rel.v0.storage.RelTransaction;
import org.reldb.rel.v0.values.TupleIterator;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.DatabaseException;
public abstract class RegisteredTupleIterator extends TupleIterator implements Comparable<RegisteredTupleIterator> {
private static long iteratorIDGenerator = 0;
private Long iteratorID;
private RelDatabase database;
protected Cursor cursor;
protected RelTransaction txn = null;
public RegisteredTupleIterator(RelDatabase database) {
iteratorID = iteratorIDGenerator++;
this.database = database;
database.registerTupleIterator(this);
}
public int hashCode() {
return iteratorID.hashCode();
}
public int compareTo(RegisteredTupleIterator iterator) {
return iteratorID.compareTo(iteratorID);
}
public boolean forceClose() {
try {
if (cursor != null) {
cursor.close();
database.commitTransaction(txn);
return true;
}
return false;
} catch (DatabaseException exp) {
exp.printStackTrace();
throw new ExceptionFatal("RS0378: Unable to close cursor: " + exp.getMessage());
}
}
public void close() {
try {
forceClose();
} finally {
database.unregisterTupleIterator(this);
}
}
}