From 15dfbe2eb0e8b64e790d5e9b5dc4393485327601 Mon Sep 17 00:00:00 2001 From: Thomas Segismont Date: Tue, 6 Jan 2026 16:19:11 +0100 Subject: [PATCH] Support for byte number retrieval See #1594 Tuple and Row types updates to let users retrieve a byte. Also, added tests for SQL Client templates. Signed-off-by: Thomas Segismont --- .../java/io/vertx/db2client/impl/DB2Row.java | 25 +---- .../io/vertx/mssqlclient/impl/MSSQLRow.java | 10 -- .../io/vertx/mysqlclient/impl/MySQLRow.java | 10 -- .../java/io/vertx/pgclient/impl/PgRow.java | 4 + .../sqlclient/templates/DataObjectMapper.java | 18 ++-- .../templates/DataObjectTypesTest.java | 50 +++++----- .../sqlclient/templates/TestDataObject.java | 99 ++++++++++++++++--- .../templates/wrappers/ByteWrapper.java | 8 ++ .../META-INF/vertx/json-mappers.properties | 2 + .../src/main/java/io/vertx/sqlclient/Row.java | 31 ++++++ .../main/java/io/vertx/sqlclient/Tuple.java | 94 ++++++++++++++++-- 11 files changed, 255 insertions(+), 96 deletions(-) create mode 100644 vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/wrappers/ByteWrapper.java diff --git a/vertx-db2-client/src/main/java/io/vertx/db2client/impl/DB2Row.java b/vertx-db2-client/src/main/java/io/vertx/db2client/impl/DB2Row.java index 1fe95c3b79..83e132bb1e 100644 --- a/vertx-db2-client/src/main/java/io/vertx/db2client/impl/DB2Row.java +++ b/vertx-db2-client/src/main/java/io/vertx/db2client/impl/DB2Row.java @@ -15,22 +15,17 @@ */ package io.vertx.db2client.impl; -import java.sql.RowId; -import java.time.Duration; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetDateTime; -import java.time.OffsetTime; -import java.time.temporal.Temporal; -import java.util.UUID; - import io.vertx.core.buffer.Buffer; import io.vertx.db2client.impl.drda.DB2RowId; import io.vertx.sqlclient.data.Numeric; import io.vertx.sqlclient.impl.RowBase; import io.vertx.sqlclient.internal.RowDescriptorBase; +import java.sql.RowId; +import java.time.*; +import java.time.temporal.Temporal; +import java.util.UUID; + public class DB2Row extends RowBase { public DB2Row(RowDescriptorBase rowDescriptor) { @@ -148,16 +143,6 @@ public UUID[] getArrayOfUUIDs(String column) { throw new UnsupportedOperationException(); } - private Byte getByte(int pos) { - Object val = getValue(pos); - if (val instanceof Byte) { - return (Byte) val; - } else if (val instanceof Number) { - return ((Number) val).byteValue(); - } - return null; - } - private Duration getDuration(int pos) { Object val = getValue(pos); if (val instanceof Duration) { diff --git a/vertx-mssql-client/src/main/java/io/vertx/mssqlclient/impl/MSSQLRow.java b/vertx-mssql-client/src/main/java/io/vertx/mssqlclient/impl/MSSQLRow.java index a8b96aa47d..bcd03e4c21 100644 --- a/vertx-mssql-client/src/main/java/io/vertx/mssqlclient/impl/MSSQLRow.java +++ b/vertx-mssql-client/src/main/java/io/vertx/mssqlclient/impl/MSSQLRow.java @@ -100,16 +100,6 @@ public UUID[] getArrayOfUUIDs(String column) { throw new UnsupportedOperationException(); } - private Byte getByte(int pos) { - Object val = getValue(pos); - if (val instanceof Byte) { - return (Byte) val; - } else if (val instanceof Number) { - return ((Number) val).byteValue(); - } - return null; - } - private Object getEnum(Class enumType, int position) { Object val = getValue(position); if (val instanceof String) { diff --git a/vertx-mysql-client/src/main/java/io/vertx/mysqlclient/impl/MySQLRow.java b/vertx-mysql-client/src/main/java/io/vertx/mysqlclient/impl/MySQLRow.java index d92ffd33f7..d4e0ebf3d9 100644 --- a/vertx-mysql-client/src/main/java/io/vertx/mysqlclient/impl/MySQLRow.java +++ b/vertx-mysql-client/src/main/java/io/vertx/mysqlclient/impl/MySQLRow.java @@ -139,16 +139,6 @@ public Boolean getBoolean(int pos) { return null; } - private Byte getByte(int pos) { - Object val = getValue(pos); - if (val instanceof Byte) { - return (Byte) val; - } else if (val instanceof Number) { - return ((Number) val).byteValue(); - } - return null; - } - private Duration getDuration(int pos) { Object val = getValue(pos); if (val instanceof Duration) { diff --git a/vertx-pg-client/src/main/java/io/vertx/pgclient/impl/PgRow.java b/vertx-pg-client/src/main/java/io/vertx/pgclient/impl/PgRow.java index 06633e1a99..04a3ef7063 100644 --- a/vertx-pg-client/src/main/java/io/vertx/pgclient/impl/PgRow.java +++ b/vertx-pg-client/src/main/java/io/vertx/pgclient/impl/PgRow.java @@ -46,6 +46,8 @@ public T get(Class type, int position) { Class componentType = type.getComponentType(); if (componentType == Boolean.class) { return type.cast(getArrayOfBooleans(position)); + } else if (componentType == Byte.class) { + return type.cast(getArrayOfBytes(position)); } else if (componentType == Short.class) { return type.cast(getArrayOfShorts(position)); } else if (componentType == Integer.class) { @@ -102,6 +104,8 @@ public T get(Class type, int position) { } else { if (type == Boolean.class) { return type.cast(getBoolean(position)); + } else if (type == Byte.class) { + return type.cast(getByte(position)); } else if (type == Short.class) { return type.cast(getShort(position)); } else if (type == Integer.class) { diff --git a/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/DataObjectMapper.java b/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/DataObjectMapper.java index f1a4988246..cf1bf695cb 100644 --- a/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/DataObjectMapper.java +++ b/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/DataObjectMapper.java @@ -2,15 +2,7 @@ import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; -import io.vertx.tests.sqlclient.templates.wrappers.BooleanWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.DoubleWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.FloatWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.IntegerWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.JsonArrayWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.JsonObjectWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.LongWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.ShortWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.StringWrapper; +import io.vertx.tests.sqlclient.templates.wrappers.*; public class DataObjectMapper { @@ -22,6 +14,14 @@ public static Boolean fromBoolean(BooleanWrapper v) { return v.get(); } + public static ByteWrapper toByte(Byte v) { + return new ByteWrapper(v); + } + + public static Byte fromByte(ByteWrapper v) { + return v.get(); + } + public static ShortWrapper toShort(Short v) { return new ShortWrapper(v); } diff --git a/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/DataObjectTypesTest.java b/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/DataObjectTypesTest.java index d718cc79dd..d63c50a630 100644 --- a/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/DataObjectTypesTest.java +++ b/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/DataObjectTypesTest.java @@ -25,28 +25,11 @@ import io.vertx.sqlclient.RowSet; import io.vertx.sqlclient.templates.SqlTemplate; import io.vertx.sqlclient.templates.TupleMapper; -import io.vertx.tests.sqlclient.templates.wrappers.BooleanWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.DoubleWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.FloatWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.IntegerWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.JsonArrayWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.JsonObjectWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.LongWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.ShortWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.StringWrapper; +import io.vertx.tests.sqlclient.templates.wrappers.*; import org.junit.Test; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetDateTime; -import java.time.OffsetTime; -import java.time.ZoneOffset; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Map; -import java.util.UUID; +import java.time.*; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Function; @@ -76,10 +59,16 @@ public void testBoolean(TestContext ctx) { testGet(ctx, "BOOLEAN[]", new Boolean[]{false, true}, Arrays.asList(false, true), "addedBooleans", TestDataObject::getAddedBooleans); } + @Test + public void testByte(TestContext ctx) { + testNumber(ctx, "INT2", (byte) 4); + testNumberArray(ctx, "INT2[]", new Byte[]{1, 2, 3}); + } + @Test public void testShort(TestContext ctx) { - testNumber(ctx, "INT2", (short)4); - testNumberArray(ctx, "INT2[]", new Short[]{1,2,3}); + testNumber(ctx, "INT2", (short) 4); + testNumberArray(ctx, "INT2[]", new Short[]{1, 2, 3}); } @Test @@ -107,11 +96,13 @@ public void testDouble(TestContext ctx) { } private void testNumber(TestContext ctx, String sqlType, Object value) { + testNumber(ctx, sqlType, value, (byte) 4, "primitiveByte", TestDataObject::getPrimitiveByte); testNumber(ctx, sqlType, value, (short)4, "primitiveShort", TestDataObject::getPrimitiveShort); testNumber(ctx, sqlType,value, 4, "primitiveInt", TestDataObject::getPrimitiveInt); testNumber(ctx, sqlType,value, 4L, "primitiveLong", TestDataObject::getPrimitiveLong); testNumber(ctx, sqlType,value, 4F, "primitiveFloat", TestDataObject::getPrimitiveFloat); testNumber(ctx, sqlType,value, 4D, "primitiveDouble", TestDataObject::getPrimitiveDouble); + testNumber(ctx, sqlType, value, (byte) 4, "boxedByte", TestDataObject::getBoxedByte); testNumber(ctx, sqlType, value, (short)4, "boxedShort", TestDataObject::getBoxedShort); testNumber(ctx, sqlType,value, 4, "boxedInteger", TestDataObject::getBoxedInteger); testNumber(ctx, sqlType,value, 4L, "boxedLong", TestDataObject::getBoxedLong); @@ -120,16 +111,19 @@ private void testNumber(TestContext ctx, String sqlType, Object value) { } private void testNumberArray(TestContext ctx, String sqlType, Object value) { + testNumber(ctx, sqlType, value, Arrays.asList((byte) 1, (byte) 2, (byte) 3), "byteList", TestDataObject::getByteList); testNumber(ctx, sqlType, value, Arrays.asList((short)1,(short)2,(short)3), "shortList", TestDataObject::getShortList); testNumber(ctx, sqlType, value, Arrays.asList(1,2,3), "integerList", TestDataObject::getIntegerList); testNumber(ctx, sqlType, value, Arrays.asList(1L,2L,3L), "longList", TestDataObject::getLongList); testNumber(ctx, sqlType, value, Arrays.asList(1F,2F,3F), "floatList", TestDataObject::getFloatList); testNumber(ctx, sqlType, value, Arrays.asList(1D,2D,3D), "doubleList", TestDataObject::getDoubleList); + testNumber(ctx, sqlType, value, new HashSet<>(Arrays.asList((byte) 1, (byte) 2, (byte) 3)), "byteSet", TestDataObject::getByteSet); testNumber(ctx, sqlType, value, new HashSet<>(Arrays.asList((short)1,(short)2,(short)3)), "shortSet", TestDataObject::getShortSet); testNumber(ctx, sqlType, value, new HashSet<>(Arrays.asList(1,2,3)), "integerSet", TestDataObject::getIntegerSet); testNumber(ctx, sqlType, value, new HashSet<>(Arrays.asList(1L,2L,3L)), "longSet", TestDataObject::getLongSet); testNumber(ctx, sqlType, value, new HashSet<>(Arrays.asList(1F,2F,3F)), "floatSet", TestDataObject::getFloatSet); testNumber(ctx, sqlType, value, new HashSet<>(Arrays.asList(1D,2D,3D)), "doubleSet", TestDataObject::getDoubleSet); + testNumber(ctx, sqlType, value, Arrays.asList((byte) 1, (byte) 2, (byte) 3), "addedBytes", TestDataObject::getAddedBytes); testNumber(ctx, sqlType, value, Arrays.asList((short)1,(short)2,(short)3), "addedShorts", TestDataObject::getAddedShorts); testNumber(ctx, sqlType, value, Arrays.asList(1,2,3), "addedIntegers", TestDataObject::getAddedIntegers); testNumber(ctx, sqlType, value, Arrays.asList(1L,2L,3L), "addedLongs", TestDataObject::getAddedLongs); @@ -268,6 +262,18 @@ public void testBooleanMethodMappedDataObject(TestContext ctx) { testGet(ctx, "JSON[]", new Object[] {true}, Collections.singletonList(new BooleanWrapper(true)), "addedBooleanMethodMappedDataObjects", TestDataObject::getAddedBooleanMethodMappedDataObjects); } + @Test + public void testByteMethodMappedDataObject(TestContext ctx) { + testGet(ctx, "INT2", 4, new ByteWrapper((byte) 4), "byteMethodMappedDataObject", TestDataObject::getByteMethodMappedDataObject); + testGet(ctx, "INT2[]", new Byte[]{4}, Collections.singletonList(new ByteWrapper((byte) 4)), "byteMethodMappedDataObjectList", TestDataObject::getByteMethodMappedDataObjectList); + testGet(ctx, "INT2[]", new Byte[]{4}, Collections.singleton(new ByteWrapper((byte) 4)), "byteMethodMappedDataObjectSet", TestDataObject::getByteMethodMappedDataObjectSet); + testGet(ctx, "INT2[]", new Byte[]{4}, Collections.singletonList(new ByteWrapper((byte) 4)), "addedByteMethodMappedDataObjects", TestDataObject::getAddedByteMethodMappedDataObjects); + testGet(ctx, "JSON", 4, new ByteWrapper((byte) 4), "byteMethodMappedDataObject", TestDataObject::getByteMethodMappedDataObject); + testGet(ctx, "JSON[]", new Object[]{4}, Collections.singletonList(new ByteWrapper((byte) 4)), "byteMethodMappedDataObjectList", TestDataObject::getByteMethodMappedDataObjectList); + testGet(ctx, "JSON[]", new Object[]{4}, Collections.singleton(new ByteWrapper((byte) 4)), "byteMethodMappedDataObjectSet", TestDataObject::getByteMethodMappedDataObjectSet); + testGet(ctx, "JSON[]", new Object[]{4}, Collections.singletonList(new ByteWrapper((byte) 4)), "addedByteMethodMappedDataObjects", TestDataObject::getAddedByteMethodMappedDataObjects); + } + @Test public void testShortMethodMappedDataObject(TestContext ctx) { testGet(ctx, "INT2", 4, new ShortWrapper((short)4), "shortMethodMappedDataObject", TestDataObject::getShortMethodMappedDataObject); diff --git a/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/TestDataObject.java b/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/TestDataObject.java index e562f82a89..5e7bc18f82 100644 --- a/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/TestDataObject.java +++ b/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/TestDataObject.java @@ -7,21 +7,9 @@ import io.vertx.sqlclient.templates.annotations.ParametersMapped; import io.vertx.sqlclient.templates.annotations.RowMapped; import io.vertx.sqlclient.templates.annotations.TemplateParameter; -import io.vertx.tests.sqlclient.templates.wrappers.BooleanWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.DoubleWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.FloatWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.IntegerWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.JsonArrayWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.JsonObjectWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.LongWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.ShortWrapper; -import io.vertx.tests.sqlclient.templates.wrappers.StringWrapper; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetDateTime; -import java.time.OffsetTime; +import io.vertx.tests.sqlclient.templates.wrappers.*; + +import java.time.*; import java.time.temporal.Temporal; import java.util.ArrayList; import java.util.List; @@ -35,6 +23,7 @@ public class TestDataObject { private boolean primitiveBoolean; + private byte primitiveByte; private short primitiveShort; private int primitiveInt; private long primitiveLong; @@ -42,6 +31,7 @@ public class TestDataObject { private double primitiveDouble; private boolean boxedBoolean; + private byte boxedByte; private short boxedShort; private int boxedInteger; private long boxedLong; @@ -59,6 +49,7 @@ public class TestDataObject { private OffsetDateTime offsetDateTime; private Temporal temporal; private JsonObjectDataObject jsonObjectDataObject; + private ByteWrapper byteMethodMappedDataObject; private ShortWrapper shortMethodMappedDataObject; private BooleanWrapper booleanMethodMappedDataObject;; private IntegerWrapper integerMethodMappedDataObject; @@ -71,6 +62,7 @@ public class TestDataObject { private TimeUnit timeUnit; private List booleanList; + private List byteList; private List shortList; private List integerList; private List longList; @@ -89,6 +81,7 @@ public class TestDataObject { private List temporalList; private List jsonObjectDataObjectList; private List booleanMethodMappedDataObjectList; + private List byteMethodMappedDataObjectList; private List shortMethodMappedDataObjectList; private List integerMethodMappedDataObjectList; private List longMethodMappedDataObjectList; @@ -100,6 +93,7 @@ public class TestDataObject { private List timeUnitList; private Set booleanSet; + private Set byteSet; private Set shortSet; private Set integerSet; private Set longSet; @@ -118,6 +112,7 @@ public class TestDataObject { private Set temporalSet; private Set jsonObjectDataObjectSet; private Set booleanMethodMappedDataObjectSet; + private Set byteMethodMappedDataObjectSet; private Set shortMethodMappedDataObjectSet; private Set integerMethodMappedDataObjectSet; private Set longMethodMappedDataObjectSet; @@ -129,6 +124,7 @@ public class TestDataObject { private Set timeUnitSet; private List addedBooleans = new ArrayList<>(); + private List addedBytes = new ArrayList<>(); private List addedShorts = new ArrayList<>(); private List addedIntegers = new ArrayList<>(); private List addedLongs = new ArrayList<>(); @@ -147,6 +143,7 @@ public class TestDataObject { private List addedTemporals = new ArrayList<>(); private List addedJsonObjectDataObjects = new ArrayList<>(); private List booleanAddedMethodMappedDataObjects = new ArrayList<>(); + private List byteAddedMethodMappedDataObjects = new ArrayList<>(); private List shortAddedMethodMappedDataObjects = new ArrayList<>(); private List integerAddedMethodMappedDataObjects = new ArrayList<>(); private List longAddedMethodMappedDataObjects = new ArrayList<>(); @@ -171,6 +168,14 @@ public void setPrimitiveBoolean(boolean primitiveBoolean) { this.primitiveBoolean = primitiveBoolean; } + public byte getPrimitiveByte() { + return primitiveByte; + } + + public void setPrimitiveByte(byte primitiveByte) { + this.primitiveByte = primitiveByte; + } + public short getPrimitiveShort() { return primitiveShort; } @@ -219,6 +224,14 @@ public void setBoxedBoolean(boolean boxedBoolean) { this.boxedBoolean = boxedBoolean; } + public byte getBoxedByte() { + return boxedByte; + } + + public void setBoxedByte(byte boxedByte) { + this.boxedByte = boxedByte; + } + public short getBoxedShort() { return boxedShort; } @@ -363,6 +376,14 @@ public void setBooleanMethodMappedDataObject(BooleanWrapper booleanMethodMappedD this.booleanMethodMappedDataObject = booleanMethodMappedDataObject; } + public ByteWrapper getByteMethodMappedDataObject() { + return byteMethodMappedDataObject; + } + + public void setByteMethodMappedDataObject(ByteWrapper byteMethodMappedDataObject) { + this.byteMethodMappedDataObject = byteMethodMappedDataObject; + } + public ShortWrapper getShortMethodMappedDataObject() { return shortMethodMappedDataObject; } @@ -443,6 +464,14 @@ public void setBooleanList(List booleanList) { this.booleanList = booleanList; } + public List getByteList() { + return byteList; + } + + public void setByteList(List byteList) { + this.byteList = byteList; + } + public List getShortList() { return shortList; } @@ -587,6 +616,14 @@ public void setBooleanMethodMappedDataObjectList(List booleanMet this.booleanMethodMappedDataObjectList = booleanMethodMappedDataObjectList; } + public List getByteMethodMappedDataObjectList() { + return byteMethodMappedDataObjectList; + } + + public void setByteMethodMappedDataObjectList(List byteMethodMappedDataObjectList) { + this.byteMethodMappedDataObjectList = byteMethodMappedDataObjectList; + } + public List getShortMethodMappedDataObjectList() { return shortMethodMappedDataObjectList; } @@ -667,6 +704,14 @@ public void setBooleanSet(Set booleanSet) { this.booleanSet = booleanSet; } + public Set getByteSet() { + return byteSet; + } + + public void setByteSet(Set byteSet) { + this.byteSet = byteSet; + } + public Set getShortSet() { return shortSet; } @@ -811,6 +856,14 @@ public void setBooleanMethodMappedDataObjectSet(Set booleanMetho this.booleanMethodMappedDataObjectSet = booleanMethodMappedDataObjectSet; } + public Set getByteMethodMappedDataObjectSet() { + return byteMethodMappedDataObjectSet; + } + + public void setByteMethodMappedDataObjectSet(Set byteMethodMappedDataObjectSet) { + this.byteMethodMappedDataObjectSet = byteMethodMappedDataObjectSet; + } + public Set getShortMethodMappedDataObjectSet() { return shortMethodMappedDataObjectSet; } @@ -891,6 +944,14 @@ public List getAddedBooleans() { return addedBooleans; } + public void addAddedByte(Byte value) { + addedBytes.add(value); + } + + public List getAddedBytes() { + return addedBytes; + } + public void addAddedShort(Short value) { addedShorts.add(value); } @@ -1035,6 +1096,14 @@ public List getAddedBooleanMethodMappedDataObjects() { return booleanAddedMethodMappedDataObjects; } + public void addAddedByteMethodMappedDataObject(ByteWrapper value) { + byteAddedMethodMappedDataObjects.add(value); + } + + public List getAddedByteMethodMappedDataObjects() { + return byteAddedMethodMappedDataObjects; + } + public void addAddedShortMethodMappedDataObject(ShortWrapper value) { shortAddedMethodMappedDataObjects.add(value); } diff --git a/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/wrappers/ByteWrapper.java b/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/wrappers/ByteWrapper.java new file mode 100644 index 0000000000..08f5d7d537 --- /dev/null +++ b/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/wrappers/ByteWrapper.java @@ -0,0 +1,8 @@ +package io.vertx.tests.sqlclient.templates.wrappers; + +public class ByteWrapper extends WrapperBase { + + public ByteWrapper(Byte value) { + super(value); + } +} diff --git a/vertx-sql-client-templates/src/test/resources/META-INF/vertx/json-mappers.properties b/vertx-sql-client-templates/src/test/resources/META-INF/vertx/json-mappers.properties index e060c175e2..91d8fa4547 100644 --- a/vertx-sql-client-templates/src/test/resources/META-INF/vertx/json-mappers.properties +++ b/vertx-sql-client-templates/src/test/resources/META-INF/vertx/json-mappers.properties @@ -1,5 +1,7 @@ io.vertx.tests.sqlclient.templates.wrappers.BooleanWrapper.serializer=io.vertx.tests.sqlclient.templates.DataObjectMapper#fromBoolean io.vertx.tests.sqlclient.templates.wrappers.BooleanWrapper.deserializer=io.vertx.tests.sqlclient.templates.DataObjectMapper#toBoolean +io.vertx.tests.sqlclient.templates.wrappers.ByteWrapper.serializer=io.vertx.tests.sqlclient.templates.DataObjectMapper#fromByte +io.vertx.tests.sqlclient.templates.wrappers.ByteWrapper.deserializer=io.vertx.tests.sqlclient.templates.DataObjectMapper#toByte io.vertx.tests.sqlclient.templates.wrappers.ShortWrapper.serializer=io.vertx.tests.sqlclient.templates.DataObjectMapper#fromShort io.vertx.tests.sqlclient.templates.wrappers.ShortWrapper.deserializer=io.vertx.tests.sqlclient.templates.DataObjectMapper#toShort io.vertx.tests.sqlclient.templates.wrappers.IntegerWrapper.serializer=io.vertx.tests.sqlclient.templates.DataObjectMapper#fromInteger diff --git a/vertx-sql-client/src/main/java/io/vertx/sqlclient/Row.java b/vertx-sql-client/src/main/java/io/vertx/sqlclient/Row.java index ea554c7c2b..0603046543 100644 --- a/vertx-sql-client/src/main/java/io/vertx/sqlclient/Row.java +++ b/vertx-sql-client/src/main/java/io/vertx/sqlclient/Row.java @@ -82,6 +82,21 @@ default Boolean getBoolean(String column) { return getBoolean(pos); } + /** + * Get a byte value for the given {@code column}. + * + * @param column the column name + * @return the {@code column} value + * @throws NoSuchElementException when the {@code column} does not exist + */ + default Byte getByte(String column) { + int pos = getColumnIndex(column); + if (pos == -1) { + throw new NoSuchElementException("Column " + column + " does not exist"); + } + return getByte(pos); + } + /** * Get a short value for the given {@code column}. * @@ -399,6 +414,22 @@ default Boolean[] getArrayOfBooleans(String column) { return getArrayOfBooleans(pos); } + /** + * Get an array of {@link Byte} value for the given {@code column}. + * + * @param column the column name + * @return the {@code column} value + * @throws NoSuchElementException when the {@code column} does not exist + */ + @GenIgnore(GenIgnore.PERMITTED_TYPE) + default Byte[] getArrayOfBytes(String column) { + int pos = getColumnIndex(column); + if (pos == -1) { + throw new NoSuchElementException("Column " + column + " does not exist"); + } + return getArrayOfBytes(pos); + } + /** * Get an array of {@link Short} value for the given {@code column}. * diff --git a/vertx-sql-client/src/main/java/io/vertx/sqlclient/Tuple.java b/vertx-sql-client/src/main/java/io/vertx/sqlclient/Tuple.java index 1321e9e4b3..7c80cdbacc 100644 --- a/vertx-sql-client/src/main/java/io/vertx/sqlclient/Tuple.java +++ b/vertx-sql-client/src/main/java/io/vertx/sqlclient/Tuple.java @@ -16,21 +16,17 @@ import io.vertx.codegen.annotations.GenIgnore; import io.vertx.codegen.annotations.VertxGen; import io.vertx.core.buffer.Buffer; +import io.vertx.core.internal.buffer.BufferInternal; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.sqlclient.data.NullValue; import io.vertx.sqlclient.data.Numeric; -import io.vertx.sqlclient.internal.ArrayTuple; import io.vertx.sqlclient.impl.ListTuple; -import io.vertx.core.internal.buffer.BufferInternal; +import io.vertx.sqlclient.internal.ArrayTuple; import java.lang.reflect.Array; import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetDateTime; -import java.time.OffsetTime; +import java.time.*; import java.time.temporal.Temporal; import java.util.ArrayList; import java.util.Arrays; @@ -268,6 +264,27 @@ default Boolean getBoolean(int pos) { return (Boolean) getValue(pos); } + /** + * Get a byte value at {@code pos}. + * + * @param pos the position + * @return the value + */ + default Byte getByte(int pos) { + Object val = getValue(pos); + if (val == null) { + return null; + } else if (val instanceof Byte) { + return (Byte) val; + } else if (val instanceof Number) { + return ((Number) val).byteValue(); + } else if (val instanceof Enum) { + return (byte) ((Enum) val).ordinal(); + } else { + return (byte) val; // Throw CCE + } + } + /** * Get a short value at {@code pos}. * @@ -669,6 +686,63 @@ default Boolean[] getArrayOfBooleans(int pos) { } } + /** + * Get an array of {@link Byte} value at {@code pos}. + * + *

Target element instance of {@code Number[]} or {@code Object[]} will be + * coerced to {@code Byte[]}. + * + * @param pos the position + * @return the value + */ + @GenIgnore(GenIgnore.PERMITTED_TYPE) + default Byte[] getArrayOfBytes(int pos) { + Object val = getValue(pos); + if (val == null) { + return null; + } else if (val instanceof Byte[]) { + return (Byte[]) val; + } else if (val instanceof byte[]) { + byte[] array = (byte[]) val; + Byte[] a = new Byte[array.length]; + for (int i = 0;i < array.length;i++) { + a[i] = array[i]; + } + return a; + } else if (val instanceof Number[]) { + Number[] a = (Number[]) val; + int len = a.length; + Byte[] arr = new Byte[len]; + for (int i = 0; i < len; i++) { + Number elt = a[i]; + if (elt != null) { + arr[i] = elt.byteValue(); + } + } + return arr; + } else if (val instanceof Enum[]) { + Enum[] a = (Enum[]) val; + int len = a.length; + Byte[] arr = new Byte[len]; + for (int i = 0; i < len; i++) { + Enum elt = a[i]; + if (elt != null) { + arr[i] = (byte) elt.ordinal(); + } + } + return arr; + } else if (val.getClass() == Object[].class) { + Object[] array = (Object[]) val; + Byte[] byteArray = new Byte[array.length]; + for (int i = 0;i < array.length;i++) { + byteArray[i] = ((Number) array[i]).byteValue(); + } + return byteArray; + } else { + return (Byte[]) val; // Throw CCE + } + } + /** * Get an array of {@link Short} value at {@code pos}. * @@ -688,7 +762,7 @@ default Short[] getArrayOfShorts(int pos) { } else if (val instanceof short[]) { short[] array = (short[]) val; Short[] a = new Short[array.length]; - for (int i = 0;i < array.length;i++) { + for (int i = 0; i < array.length; i++) { a[i] = array[i]; } return a; @@ -710,14 +784,14 @@ default Short[] getArrayOfShorts(int pos) { for (int i = 0; i < len; i++) { Enum elt = a[i]; if (elt != null) { - arr[i] = (short)elt.ordinal(); + arr[i] = (short) elt.ordinal(); } } return arr; } else if (val.getClass() == Object[].class) { Object[] array = (Object[]) val; Short[] shortArray = new Short[array.length]; - for (int i = 0;i < array.length;i++) { + for (int i = 0; i < array.length; i++) { shortArray[i] = ((Number) array[i]).shortValue(); } return shortArray;