2021-10-19 00:22:05 +02:00
|
|
|
package it.cavallium.dbengine.database.serialization;
|
|
|
|
|
2022-10-02 03:09:50 +02:00
|
|
|
import io.netty5.buffer.Buffer;
|
2022-07-15 02:44:50 +02:00
|
|
|
import io.netty5.util.Send;
|
2022-06-30 15:06:10 +02:00
|
|
|
import it.cavallium.dbengine.database.DiscardingCloseable;
|
2021-10-19 00:22:05 +02:00
|
|
|
import it.cavallium.dbengine.database.SafeCloseable;
|
|
|
|
import java.io.DataInput;
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
|
2022-06-30 15:06:10 +02:00
|
|
|
public class BufferDataInputOwned implements DiscardingCloseable, BufferDataInput {
|
2021-10-19 00:22:05 +02:00
|
|
|
|
|
|
|
@Nullable
|
|
|
|
private final Buffer buf;
|
|
|
|
private final int initialReaderOffset;
|
|
|
|
|
|
|
|
public BufferDataInputOwned(@Nullable Send<Buffer> bufferSend) {
|
|
|
|
this.buf = bufferSend == null ? null : bufferSend.receive().makeReadOnly();
|
|
|
|
this.initialReaderOffset = buf == null ? 0 : buf.readerOffset();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void readFully(byte @NotNull [] b) {
|
|
|
|
this.readFully(b, 0, b.length);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void readFully(byte @NotNull [] b, int off, int len) {
|
|
|
|
if (buf == null) {
|
|
|
|
if (len != 0) {
|
|
|
|
throw new IndexOutOfBoundsException();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
buf.copyInto(buf.readerOffset(), b, off, len);
|
|
|
|
buf.readerOffset(buf.readerOffset() + len);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int skipBytes(int n) {
|
|
|
|
if (buf == null) {
|
|
|
|
if (n != 0) {
|
|
|
|
throw new IndexOutOfBoundsException();
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
} else {
|
|
|
|
n = Math.min(n, buf.readerOffset() - buf.writerOffset());
|
|
|
|
buf.readerOffset(buf.readerOffset() + n);
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean readBoolean() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
return buf.readUnsignedByte() != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public byte readByte() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
return buf.readByte();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int readUnsignedByte() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
return buf.readUnsignedByte();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public short readShort() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
return buf.readShort();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int readUnsignedShort() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
return buf.readUnsignedShort();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public char readChar() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
return buf.readChar();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int readInt() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
return buf.readInt();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public long readLong() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
return buf.readLong();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public float readFloat() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
return buf.readFloat();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public double readDouble() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
return buf.readDouble();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String readLine() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
|
|
|
throw new UnsupportedOperationException();
|
|
|
|
}
|
|
|
|
|
|
|
|
@NotNull
|
|
|
|
@Override
|
|
|
|
public String readUTF() {
|
|
|
|
if (buf == null) throw new IndexOutOfBoundsException();
|
2022-02-09 20:02:23 +01:00
|
|
|
int len = buf.readUnsignedShort();
|
|
|
|
return buf.readCharSequence(len, StandardCharsets.UTF_8).toString();
|
2021-10-19 00:22:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void close() {
|
|
|
|
if (buf != null) {
|
|
|
|
buf.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getReadBytesCount() {
|
|
|
|
if (buf == null) {
|
|
|
|
return 0;
|
|
|
|
} else {
|
|
|
|
return buf.readerOffset() - initialReaderOffset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|