blob: 8695b53f64260410d230efcb99b48d2bb7452a6b [file] [log] [blame]
/*-
* Copyright (C) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package com.sleepycat.je.tree.dupConvert;
import java.nio.ByteBuffer;
import com.sleepycat.je.EnvironmentFailureException;
import com.sleepycat.je.dbi.MemoryBudget;
import com.sleepycat.je.log.LogEntryType;
import com.sleepycat.je.log.LogUtils;
import com.sleepycat.je.log.Loggable;
import com.sleepycat.je.tree.BIN;
import com.sleepycat.je.tree.IN;
import com.sleepycat.je.tree.Key;
import com.sleepycat.je.tree.TreeUtils;
import com.sleepycat.je.utilint.SizeofMarker;
/**
* A DBIN represents an Duplicate Bottom Internal Node in the JE tree.
*
* Obsolete in log version 8, only used by DupConvert and some log readers.
*/
public final class DBIN extends BIN implements Loggable {
private static final String BEGIN_TAG = "<dbin>";
private static final String END_TAG = "</dbin>";
/**
* Full key for this set of duplicates.
*/
private byte[] dupKey;
public DBIN() {
super();
}
/**
* For Sizeof, set all array fields to null, since they are not part of the
* fixed overhead.
*/
public DBIN(SizeofMarker marker) {
super(marker);
dupKey = null;
}
@Override
public boolean isDBIN() {
return true;
}
/**
* @return true if this node is a duplicate-bearing node type, false
* if otherwise.
*/
@Override
public boolean containsDuplicates() {
return true;
}
@Override
protected long getFixedMemoryOverhead() {
return MemoryBudget.DBIN_FIXED_OVERHEAD;
}
@Override
public String beginTag() {
return BEGIN_TAG;
}
@Override
public String endTag() {
return END_TAG;
}
/**
* For unit test support:
* @return a string that dumps information about this IN, without
*/
@Override
public String dumpString(int nSpaces, boolean dumpTags) {
StringBuilder sb = new StringBuilder();
sb.append(TreeUtils.indent(nSpaces));
sb.append(beginTag());
sb.append('\n');
sb.append(TreeUtils.indent(nSpaces+2));
sb.append("<dupkey>");
sb.append(dupKey == null ? "" : Key.dumpString(dupKey, 0));
sb.append("</dupkey>");
sb.append('\n');
sb.append(super.dumpString(nSpaces, false));
sb.append(TreeUtils.indent(nSpaces));
sb.append(endTag());
return sb.toString();
}
/**
* @see IN#getLogType()
*/
@Override
public LogEntryType getLogType() {
return LogEntryType.LOG_DBIN;
}
/*
* Logging support
*/
/**
* @see Loggable#getLogSize
*/
@Override
public int getLogSize() {
throw EnvironmentFailureException.unexpectedState();
}
/**
* @see Loggable#writeToLog
*/
@Override
public void writeToLog(ByteBuffer logBuffer) {
throw EnvironmentFailureException.unexpectedState();
}
/**
* @see BIN#readFromLog
*/
@Override
public void readFromLog(ByteBuffer itemBuffer, int entryVersion) {
super.readFromLog(itemBuffer, entryVersion);
dupKey = LogUtils.readByteArray(itemBuffer, (entryVersion < 6));
}
/**
* DBINS need to dump their dup key
*/
@Override
protected void dumpLogAdditional(StringBuilder sb) {
super.dumpLogAdditional(sb);
sb.append(Key.dumpString(dupKey, 0));
}
@Override
public String shortClassName() {
return "DBIN";
}
}