/**
* Copyright 2011-2012 Akiban Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.persistit;
import com.persistit.util.Util;
interface ValueHelper {
int requiredLength(final byte[] target, int targetOffset, int targetLength);
int storeVersion(byte[] target, int targetOffset, int targetLength, int targetLimit);
void saveValue(byte[] target, int targetOffset, int targetLength);
long getPointerValue();
void setPointerValue(long poiner);
boolean isMVV();
final static ValueHelper EMPTY_VALUE_WRITER = new ValueHelper() {
@Override
public int requiredLength(final byte[] target, final int targetOffset, final int targetLength) {
return 0;
}
@Override
public int storeVersion(final byte[] target, final int targetOffset, final int targetLength,
final int targetLimit) {
return 0;
}
@Override
public void saveValue(final byte[] target, final int targetOffset, final int targetLength) {
}
@Override
public long getPointerValue() {
return 0;
}
@Override
public void setPointerValue(final long poiner) {
throw new UnsupportedOperationException();
}
@Override
public boolean isMVV() {
return false;
}
};
static class RawValueWriter implements ValueHelper {
Value _value;
void init(final Value value) {
_value = value;
}
@Override
public int storeVersion(final byte[] target, final int targetOffset, final int targetLength,
final int targetLimit) {
System.arraycopy(_value.getEncodedBytes(), 0, target, targetOffset, _value.getEncodedSize()); // TODO
// -
// limit
return _value.getEncodedSize();
}
@Override
public void saveValue(final byte[] target, final int targetOffset, final int targetLength) {
}
@Override
public int requiredLength(final byte[] target, final int targetOffset, final int targetLength) {
return _value.getEncodedSize();
}
@Override
public long getPointerValue() {
return _value.getPointerValue();
}
@Override
public void setPointerValue(final long pointer) {
_value.setPointerValue(pointer);
}
@Override
public boolean isMVV() {
return false;
}
@Override
public String toString() {
return _value != null ? Util.hexDump(_value.getEncodedBytes(), 0, _value.getEncodedSize()) : "null";
}
};
static class MVVValueWriter implements ValueHelper {
Value _value;
Value _spareValue;
long _version;
void init(final Value value, final Value spareValue, final long version) {
_value = value;
_spareValue = spareValue;
_version = version;
}
@Override
public int storeVersion(final byte[] target, final int targetOffset, final int targetLength,
final int targetLimit) {
return MVV.storeVersion(target, targetOffset, targetLength, target.length, _version,
_value.getEncodedBytes(), 0, _value.getEncodedSize());
}
@Override
public void saveValue(final byte[] target, final int targetOffset, final int targetLength) {
}
@Override
public int requiredLength(final byte[] target, final int targetOffset, final int targetLength) {
return MVV.exactRequiredLength(target, targetOffset, targetLength, _version, _value.getEncodedSize());
}
@Override
public long getPointerValue() {
return _value.getPointerValue();
}
@Override
public void setPointerValue(final long pointer) {
_value.setPointerValue(pointer);
}
@Override
public boolean isMVV() {
return true;
}
@Override
public String toString() {
return _value != null ? Util.hexDump(_value.getEncodedBytes(), 0, _value.getEncodedSize()) : "null";
}
};
}