package com.sleepycat.je.log;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import javax.transaction.xa.Xid;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.dbi.DatabaseId;
import com.sleepycat.je.dbi.EnvironmentImpl;
import com.sleepycat.je.log.entry.LNLogEntry;
import com.sleepycat.je.log.entry.LogEntry;
import com.sleepycat.je.tree.LN;
import com.sleepycat.je.txn.TxnAbort;
import com.sleepycat.je.txn.TxnCommit;
import com.sleepycat.je.txn.TxnPrepare;
import de.ovgu.cide.jakutil.*;
/**
* LNFileReader scans log files for LNs. Also, if it's going backwards for the
* undo phase in recovery, it reads transaction commit entries.
*/
public class LNFileReader extends FileReader {
protected Map targetEntryMap;
protected LogEntry targetLogEntry;
/**
* Create this reader to start at a given LSN.
* @param env The relevant EnvironmentImpl
* @param readBufferSize buffer size in bytes for reading in log
* @param startLsn where to start in the log
* @param redo If false, we're going to go forward from
* the start LSN to the end of the log. If true, we're going
* backwards from the end of the log to the start LSN.
* @param endOfFileLsn the virtual LSN that marks the end of the log. (The
* one off the end of the log). Only used if we're reading backwards.
* Different from the startLsn because the startLsn tells us where the
* beginning of the start entry is, but not the length/end of the start
* entry. May be null if we're going foward.
* @param finishLsn the last LSN to read in the log. May be null if we
* want to read to the end of the log.
*/
public LNFileReader( EnvironmentImpl env, int readBufferSize, long startLsn, boolean redo, long endOfFileLsn, long finishLsn, Long singleFileNum) throws IOException, DatabaseException {
super(env,readBufferSize,redo,startLsn,singleFileNum,endOfFileLsn,finishLsn);
targetEntryMap=new HashMap();
}
public void addTargetType( LogEntryType entryType) throws DatabaseException {
targetEntryMap.put(entryType,entryType.getNewLogEntry());
}
/**
* @return true if this is a transactional LN or Locker Commit entry.
*/
protected boolean isTargetEntry( byte entryTypeNum, byte entryTypeVersion){
if (LogEntryType.isProvisional(entryTypeVersion)) {
targetLogEntry=null;
}
else {
LogEntryType fromLogType=new LogEntryType(entryTypeNum,entryTypeVersion);
targetLogEntry=(LogEntry)targetEntryMap.get(fromLogType);
}
return (targetLogEntry != null);
}
/**
* This reader instantiates an LN and key for every LN entry.
*/
protected boolean processEntry( ByteBuffer entryBuffer) throws DatabaseException {
targetLogEntry.readEntry(entryBuffer,currentEntrySize,currentEntryTypeVersion,true);
return true;
}
/**
* @return true if the last entry was an LN.
*/
public boolean isLN(){
return (targetLogEntry instanceof LNLogEntry);
}
/**
* Get the last LN seen by the reader.
*/
public LN getLN(){
return ((LNLogEntry)targetLogEntry).getLN();
}
/**
* Get the last databaseId seen by the reader.
*/
public DatabaseId getDatabaseId(){
return ((LNLogEntry)targetLogEntry).getDbId();
}
/**
* Get the last key seen by the reader.
*/
public byte[] getKey(){
return ((LNLogEntry)targetLogEntry).getKey();
}
/**
* Get the last key seen by the reader.
*/
public byte[] getDupTreeKey(){
return ((LNLogEntry)targetLogEntry).getDupKey();
}
/**
* @return the transaction id of the current entry.
*/
public Long getTxnId(){
return ((LNLogEntry)targetLogEntry).getTxnId();
}
public boolean isPrepare(){
return (targetLogEntry.getMainItem() instanceof TxnPrepare);
}
/**
* Get the last txn prepare id seen by the reader.
*/
public long getTxnPrepareId(){
return ((TxnPrepare)targetLogEntry.getMainItem()).getId();
}
/**
* Get the last txn prepare Xid seen by the reader.
*/
public Xid getTxnPrepareXid(){
return ((TxnPrepare)targetLogEntry.getMainItem()).getXid();
}
public boolean isAbort(){
return (targetLogEntry.getMainItem() instanceof TxnAbort);
}
/**
* Get the last txn abort id seen by the reader.
*/
public long getTxnAbortId(){
return ((TxnAbort)targetLogEntry.getMainItem()).getId();
}
/**
* Get the last txn commit id seen by the reader.
*/
public long getTxnCommitId(){
return ((TxnCommit)targetLogEntry.getMainItem()).getId();
}
/**
* Get node id of current LN.
*/
public long getNodeId(){
return ((LNLogEntry)targetLogEntry).getLN().getNodeId();
}
/**
* Get last abort LSN seen by the reader (may be null).
*/
public long getAbortLsn(){
return ((LNLogEntry)targetLogEntry).getAbortLsn();
}
/**
* Get last abort known deleted seen by the reader.
*/
public boolean getAbortKnownDeleted(){
return ((LNLogEntry)targetLogEntry).getAbortKnownDeleted();
}
}