package com.sleepycat.je.util;
import java.io.File;
import java.io.PrintStream;
import java.util.logging.Level;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.DatabaseStats;
import com.sleepycat.je.DbInternal;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.JEVersion;
import com.sleepycat.je.VerifyConfig;
import com.sleepycat.je.cleaner.VerifyUtils;
import com.sleepycat.je.dbi.DatabaseImpl;
import com.sleepycat.je.dbi.EnvironmentImpl;
import com.sleepycat.je.utilint.CmdUtil;
import com.sleepycat.je.utilint.Tracer;
import de.ovgu.cide.jakutil.*;
public class DbVerify {
private static final String usageString="usage: " + CmdUtil.getJavaCommand(DbVerify.class) + "\n"+ " -h <dir> # environment home directory\n"+ " [-q ] # quiet, exit with success or failure\n"+ " [-s <databaseName> ] # database to verify\n"+ " [-v <interval>] # progress notification interval\n"+ " [-V] # print JE version number";
protected File envHome=null;
protected Environment env;
protected String dbName=null;
protected boolean quiet=false;
protected boolean checkLsns=false;
private int progressInterval=0;
static public void main( String argv[]) throws DatabaseException {
DbVerify verifier=new DbVerify();
verifier.parseArgs(argv);
boolean ret=false;
try {
ret=verifier.verify(System.err);
}
catch ( Throwable T) {
if (!verifier.quiet) {
T.printStackTrace(System.err);
}
}
finally {
verifier.closeEnv();
if ((!verifier.quiet) || (verifier.progressInterval > 0)) {
System.err.println("Exit status = " + ret);
}
System.exit(ret ? 0 : -1);
}
}
protected DbVerify(){
}
public DbVerify( Environment env, String dbName, boolean quiet){
this.env=env;
this.dbName=dbName;
this.quiet=quiet;
}
protected void printUsage( String msg){
System.err.println(msg);
System.err.println(usageString);
System.exit(-1);
}
protected void parseArgs( String argv[]){
int argc=0;
int nArgs=argv.length;
while (argc < nArgs) {
String thisArg=argv[argc++];
if (thisArg.equals("-q")) {
quiet=true;
}
else if (thisArg.equals("-V")) {
System.out.println(JEVersion.CURRENT_VERSION);
System.exit(0);
}
else if (thisArg.equals("-h")) {
if (argc < nArgs) {
envHome=new File(argv[argc++]);
}
else {
printUsage("-h requires an argument");
}
}
else if (thisArg.equals("-s")) {
if (argc < nArgs) {
dbName=argv[argc++];
}
else {
printUsage("-s requires an argument");
}
}
else if (thisArg.equals("-v")) {
if (argc < nArgs) {
progressInterval=Integer.parseInt(argv[argc++]);
if (progressInterval <= 0) {
printUsage("-v requires a positive argument");
}
}
else {
printUsage("-v requires an argument");
}
}
else if (thisArg.equals("-c")) {
checkLsns=true;
}
}
if (envHome == null) {
printUsage("-h is a required argument");
}
if (dbName == null) {
printUsage("-s is a required argument");
}
}
protected void openEnv() throws DatabaseException {
if (env == null) {
EnvironmentConfig envConfig=new EnvironmentConfig();
envConfig.setReadOnly(true);
env=new Environment(envHome,envConfig);
}
}
void closeEnv() throws DatabaseException {
try {
if (env != null) {
env.close();
}
}
finally {
env=null;
}
}
public boolean verify( PrintStream out) throws DatabaseException {
boolean ret=true;
try {
VerifyConfig verifyConfig=new VerifyConfig();
verifyConfig.setPrintInfo(!quiet);
if (progressInterval > 0) {
verifyConfig.setShowProgressInterval(progressInterval);
verifyConfig.setShowProgressStream(out);
}
openEnv();
EnvironmentImpl envImpl=DbInternal.envGetEnvironmentImpl(env);
this.hook851(envImpl);
DatabaseConfig dbConfig=new DatabaseConfig();
dbConfig.setReadOnly(true);
dbConfig.setAllowCreate(false);
DbInternal.setUseExistingConfig(dbConfig,true);
Database db=env.openDatabase(null,dbName,dbConfig);
try {
if (checkLsns) {
System.out.println("Checking obsolete offsets ...");
VerifyUtils.checkLsns(db);
}
else {
DatabaseImpl dbImpl=DbInternal.dbGetDatabaseImpl(db);
DatabaseStats stats=dbImpl.getEmptyStats();
ret=dbImpl.verify(verifyConfig,stats);
if (verifyConfig.getPrintInfo()) {
out.println(stats);
}
}
}
finally {
if (db != null) {
db.close();
}
this.hook852(envImpl);
}
closeEnv();
}
catch ( DatabaseException DE) {
ret=false;
try {
closeEnv();
}
catch ( Throwable ignored) {
}
throw DE;
}
return ret;
}
protected void hook851( EnvironmentImpl envImpl) throws DatabaseException {
}
protected void hook852( EnvironmentImpl envImpl) throws DatabaseException {
}
}