package com.sleepycat.je.log;
import java.nio.ByteBuffer;
import java.util.zip.Checksum;
import com.sleepycat.je.dbi.EnvironmentImpl;
import com.sleepycat.je.utilint.Adler32;
import com.sleepycat.je.utilint.DbLsn;
import de.ovgu.cide.jakutil.*;
/**
* Checksum validator is used to check checksums on log entries.
*/
class ChecksumValidator {
private static final boolean DEBUG=false;
private Checksum cksum;
ChecksumValidator(){
cksum=Adler32.makeChecksum();
}
void reset(){
cksum.reset();
}
/**
* Add this byte buffer to the checksum. Assume the byte buffer is already
* positioned at the data.
* @param buf target buffer
* @param length of data
*/
void update( EnvironmentImpl env, ByteBuffer buf, int length, boolean anticipateChecksumErrors) throws DbChecksumException {
if (buf == null) {
throw new DbChecksumException((anticipateChecksumErrors ? null : env),"null buffer given to checksum validation, probably " + " result of 0's in log file. " + anticipateChecksumErrors);
}
int bufStart=buf.position();
if (DEBUG) {
System.out.println("bufStart = " + bufStart + " length = "+ length);
}
if (buf.hasArray()) {
cksum.update(buf.array(),bufStart,length);
}
else {
for (int i=bufStart; i < (length + bufStart); i++) {
cksum.update(buf.get(i));
}
}
}
void validate( EnvironmentImpl env, long expectedChecksum, long lsn) throws DbChecksumException {
if (expectedChecksum != cksum.getValue()) {
throw new DbChecksumException(env,"Location " + DbLsn.getNoFormatString(lsn) + " expected "+ expectedChecksum+ " got "+ cksum.getValue());
}
}
void validate( EnvironmentImpl env, long expectedChecksum, long fileNum, long fileOffset, boolean anticipateChecksumErrors) throws DbChecksumException {
if (expectedChecksum != cksum.getValue()) {
long problemLsn=DbLsn.makeLsn(fileNum,fileOffset);
throw new DbChecksumException((anticipateChecksumErrors ? null : env),"Location " + DbLsn.getNoFormatString(problemLsn) + " expected "+ expectedChecksum+ " got "+ cksum.getValue());
}
}
}