diff --git a/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataInputOwned.java b/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataInputOwned.java index eebd09d..476dd8d 100644 --- a/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataInputOwned.java +++ b/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataInputOwned.java @@ -120,11 +120,8 @@ public class BufferDataInputOwned implements SafeCloseable, BufferDataInput { @Override public String readUTF() { if (buf == null) throw new IndexOutOfBoundsException(); - var len = buf.readUnsignedShort(); - byte[] bytes = new byte[len]; - buf.copyInto(buf.readerOffset(), bytes, 0, len); - buf.readerOffset(buf.readerOffset() + len); - return new String(bytes, StandardCharsets.UTF_8); + int len = buf.readUnsignedShort(); + return buf.readCharSequence(len, StandardCharsets.UTF_8).toString(); } @Override diff --git a/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataInputShared.java b/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataInputShared.java index 33279ee..22d1dd1 100644 --- a/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataInputShared.java +++ b/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataInputShared.java @@ -1,10 +1,16 @@ package it.cavallium.dbengine.database.serialization; import io.net5.buffer.api.Buffer; +import io.net5.buffer.api.ReadableComponent; +import io.net5.buffer.api.ReadableComponentProcessor; import io.net5.buffer.api.Send; +import io.net5.buffer.api.adaptor.ByteBufAdaptor; import it.cavallium.dbengine.database.SafeCloseable; import java.io.DataInput; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodType; import java.nio.charset.StandardCharsets; +import java.util.concurrent.atomic.AtomicReference; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -120,11 +126,8 @@ public class BufferDataInputShared implements BufferDataInput { @Override public String readUTF() { if (buf == null) throw new IndexOutOfBoundsException(); - var len = buf.readUnsignedShort(); - byte[] bytes = new byte[len]; - buf.copyInto(buf.readerOffset(), bytes, 0, len); - buf.readerOffset(buf.readerOffset() + len); - return new String(bytes, StandardCharsets.UTF_8); + int len = buf.readUnsignedShort(); + return buf.readCharSequence(len, StandardCharsets.UTF_8).toString(); } public int getReadBytesCount() { diff --git a/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataOutput.java b/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataOutput.java index b05d2cb..a987d78 100644 --- a/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataOutput.java +++ b/src/main/java/it/cavallium/dbengine/database/serialization/BufferDataOutput.java @@ -97,9 +97,19 @@ public class BufferDataOutput implements DataOutput { @Override public void writeUTF(@NotNull String s) { - var bytes = s.getBytes(StandardCharsets.UTF_8); - buf.ensureWritable(Short.BYTES + Byte.BYTES * bytes.length); - buf.writeUnsignedShort(bytes.length); - buf.writeBytes(bytes); + int sizeShortOffset = buf.writerOffset(); + int stringOffset = sizeShortOffset + Short.BYTES; + buf.writerOffset(stringOffset); + buf.writeCharSequence(s, StandardCharsets.UTF_8); + int endOffset = buf.writerOffset(); + int stringSize = endOffset - stringOffset; + buf.writerOffset(sizeShortOffset); + buf.writeUnsignedShort(stringSize); + if (stringSize > (1 << 16) - 1) { + buf.writerOffset(sizeShortOffset); + throw new IndexOutOfBoundsException("String too large: " + stringSize); + } else { + buf.writerOffset(endOffset); + } } }