@Override
public void put(IValueReference key, IValueReference value) throws HyracksDataException {
int index = find(key);
if (index >= 0) {
put(index, value);
} else {
int offset = buf.getInt(Constants.FREE_SPACE_OFFSET);
int available = getSpace();
int required = key.getLength() + Integer.BYTES + Integer.BYTES + value.getLength();
if (available < required) {
throw new HyracksDataException("Available space in the page (" + available
+ ") is not enough to store the key value pair(" + required + ")");
}
buf.putInt(offset, key.getLength());
offset += Integer.BYTES;
System.arraycopy(key.getByteArray(), key.getStartOffset(), buf.array(), offset, key.getLength());
offset += key.getLength();
buf.putInt(offset, value.getLength());
offset += Integer.BYTES;
System.arraycopy(value.getByteArray(), value.getStartOffset(), buf.array(), offset, value.getLength());
offset += value.getLength();
increment(Constants.TUPLE_COUNT_OFFSET);
buf.putInt(Constants.FREE_SPACE_OFFSET, offset);
}
}