package com.sleepycat.je.tree;
import java.nio.ByteBuffer;
import com.sleepycat.je.dbi.MemoryBudget;
import com.sleepycat.je.log.LogEntryType;
import com.sleepycat.je.log.LogException;
import com.sleepycat.je.log.LogUtils;
import de.ovgu.cide.jakutil.*;
/**
* A DupCountLN represents the transactional part of the root of a
* duplicate tree, specifically the count of dupes in the tree.
*/
public final class DupCountLN extends LN {
private static final String BEGIN_TAG="<dupCountLN>";
private static final String END_TAG="</dupCountLN>";
private int dupCount;
/**
* Create a new DupCountLn to hold a new DIN.
*/
public DupCountLN( int count){
super(new byte[0]);
this.dupCount=count;
}
/**
* Create an empty DupCountLN, to be filled in from the log.
*/
public DupCountLN(){
super();
dupCount=0;
}
public int getDupCount(){
return dupCount;
}
public int incDupCount(){
dupCount++;
assert dupCount >= 0;
return dupCount;
}
public int decDupCount(){
dupCount--;
assert dupCount >= 0;
return dupCount;
}
void setDupCount( int dupCount){
this.dupCount=dupCount;
}
/**
* @return true if this node is a duplicate-bearing node type, false
* if otherwise.
*/
public boolean containsDuplicates(){
return true;
}
public boolean isDeleted(){
return false;
}
public String toString(){
return dumpString(0,true);
}
public String beginTag(){
return BEGIN_TAG;
}
public String endTag(){
return END_TAG;
}
public String dumpString( int nSpaces, boolean dumpTags){
StringBuffer sb=new StringBuffer();
if (dumpTags) {
sb.append(TreeUtils.indent(nSpaces));
sb.append(beginTag());
sb.append('\n');
}
sb.append(TreeUtils.indent(nSpaces + 2));
sb.append("<count v=\"").append(dupCount).append("\"/>").append('\n');
sb.append(super.dumpString(nSpaces,false));
if (dumpTags) {
sb.append(TreeUtils.indent(nSpaces));
sb.append(endTag());
}
return sb.toString();
}
/**
* Log type for transactional entries.
*/
protected LogEntryType getTransactionalLogType(){
return LogEntryType.LOG_DUPCOUNTLN_TRANSACTIONAL;
}
/**
* @see LN#getLogType
*/
public LogEntryType getLogType(){
return LogEntryType.LOG_DUPCOUNTLN;
}
/**
* @see LN#getLogSize
*/
public int getLogSize(){
return super.getLogSize() + LogUtils.INT_BYTES;
}
/**
* @see LN#writeToLog
*/
public void writeToLog( ByteBuffer logBuffer){
super.writeToLog(logBuffer);
LogUtils.writeInt(logBuffer,dupCount);
}
/**
* @see LN#readFromLog
*/
public void readFromLog( ByteBuffer itemBuffer, byte entryTypeVersion) throws LogException {
super.readFromLog(itemBuffer,entryTypeVersion);
dupCount=LogUtils.readInt(itemBuffer);
}
/**
* Dump additional fields
*/
protected void dumpLogAdditional( StringBuffer sb, boolean verbose){
super.dumpLogAdditional(sb,verbose);
sb.append("<count v=\"").append(dupCount).append("\"/>");
}
}