package com.sleepycat.je.util;
import java.io.File;
import java.io.IOException;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.config.EnvironmentParams;
import com.sleepycat.je.dbi.EnvironmentImpl;
import com.sleepycat.je.log.DumpFileReader;
import com.sleepycat.je.log.FileManager;
import com.sleepycat.je.log.PrintFileReader;
import com.sleepycat.je.log.StatsFileReader;
import com.sleepycat.je.tree.Key;
import com.sleepycat.je.utilint.CmdUtil;
import com.sleepycat.je.utilint.DbLsn;
import de.ovgu.cide.jakutil.*;
/**
* DbPrintLog is a debugging utility that dumps JE log files into a human
* readable form.
*/
public class DbPrintLog {
/**
* Dump a JE log into human readable form.
*/
private void dump( File envHome, String entryTypes, String txnIds, long startLsn, long endLsn, boolean verbose, boolean stats) throws IOException, DatabaseException {
EnvironmentImpl env=CmdUtil.makeUtilityEnvironment(envHome,true);
FileManager fileManager=env.getFileManager();
fileManager.setIncludeDeletedFiles(true);
int readBufferSize=env.getConfigManager().getInt(EnvironmentParams.LOG_ITERATOR_READ_SIZE);
DumpFileReader reader=null;
if (stats) {
reader=new StatsFileReader(env,readBufferSize,startLsn,endLsn,entryTypes,txnIds,verbose);
}
else {
reader=new PrintFileReader(env,readBufferSize,startLsn,endLsn,entryTypes,txnIds,verbose);
}
System.out.println("<DbPrintLog>");
while (reader.readNextEntry()) {
}
reader.summarize();
System.out.println("</DbPrintLog>");
env.close();
}
/**
* Main
*/
public static void main( String[] argv){
try {
int whichArg=0;
String entryTypes=null;
String txnIds=null;
long startLsn=DbLsn.NULL_LSN;
long endLsn=DbLsn.NULL_LSN;
boolean verbose=true;
boolean stats=false;
File envHome=new File(".");
Key.DUMP_BINARY=true;
while (whichArg < argv.length) {
String nextArg=argv[whichArg];
if (nextArg.equals("-h")) {
whichArg++;
envHome=new File(CmdUtil.getArg(argv,whichArg));
}
else if (nextArg.equals("-ty")) {
whichArg++;
entryTypes=CmdUtil.getArg(argv,whichArg);
}
else if (nextArg.equals("-tx")) {
whichArg++;
txnIds=CmdUtil.getArg(argv,whichArg);
}
else if (nextArg.equals("-s")) {
whichArg++;
long startFileNum=CmdUtil.readLongNumber(CmdUtil.getArg(argv,whichArg));
startLsn=DbLsn.makeLsn(startFileNum,0);
}
else if (nextArg.equals("-e")) {
whichArg++;
long endFileNum=CmdUtil.readLongNumber(CmdUtil.getArg(argv,whichArg));
endLsn=DbLsn.makeLsn(endFileNum,0);
}
else if (nextArg.equals("-k")) {
whichArg++;
String dumpType=CmdUtil.getArg(argv,whichArg);
if (dumpType.equalsIgnoreCase("text")) {
Key.DUMP_BINARY=false;
}
}
else if (nextArg.equals("-q")) {
whichArg++;
verbose=false;
}
else if (nextArg.equals("-S")) {
whichArg++;
stats=true;
}
else {
System.err.println(nextArg + " is not a supported option.");
usage();
System.exit(-1);
}
whichArg++;
}
DbPrintLog printer=new DbPrintLog();
printer.dump(envHome,entryTypes,txnIds,startLsn,endLsn,verbose,stats);
}
catch ( Throwable e) {
e.printStackTrace();
System.out.println(e.getMessage());
usage();
System.exit(1);
}
}
private static void usage(){
System.out.println("Usage: " + CmdUtil.getJavaCommand(DbPrintLog.class));
System.out.println(" -h <envHomeDir>");
System.out.println(" -e <end file number, in hex>");
System.out.println(" -k <binary|text> (format for dumping the key)");
System.out.println(" -s <start file number, in hex>");
System.out.println(" -tx <targetted txn ids, comma separated>");
System.out.println(" -ty <targetted entry types, comma separated>");
System.out.println(" -S show Summary of log entries");
System.out.println(" -q if specified, concise version is printed");
System.out.println(" Default is verbose version.)");
System.out.println("All arguments are optional");
}
}