From c189ad7a34781a71a0f7ddf157b7b67e7e63ff26 Mon Sep 17 00:00:00 2001 From: QartemisT <63267788+QartemisT@users.noreply.github.com> Date: Sun, 28 Feb 2021 22:26:42 +0000 Subject: [PATCH 1/2] Support short arrays as field type. Short values are byte length 2, so implement same logic as int or long. --- .../depot/impl/FieldMarshaller.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/main/java/com/samskivert/depot/impl/FieldMarshaller.java b/src/main/java/com/samskivert/depot/impl/FieldMarshaller.java index 03b090f..99faf14 100644 --- a/src/main/java/com/samskivert/depot/impl/FieldMarshaller.java +++ b/src/main/java/com/samskivert/depot/impl/FieldMarshaller.java @@ -558,6 +558,50 @@ public abstract class FieldMarshaller } } + protected static class ShortArrayMarshaller extends FieldMarshaller { + @Override public String getColumnType (ColumnTyper typer, int length) { + return typer.getBlobType(length*2); + } + @Override public short[] getFromObject (Object po) + throws IllegalArgumentException, IllegalAccessException { + return (short[]) _field.get(po); + } + @Override public short[] getFromSet (ResultSet rs) throws SQLException { + // TODO: why not use getBytes()? + return fromBytes((byte[]) rs.getObject(getColumnName())); + } + @Override public short[] getFromSet (ResultSet rs, int index) throws SQLException { + // TODO: why not use getBytes()? + return fromBytes((byte[]) rs.getObject(index)); + } + @Override public void writeToObject (Object po, short[] value) + throws IllegalArgumentException, IllegalAccessException { + _field.set(po, value); + } + @Override public void writeToStatement (PreparedStatement ps, int column, short[] value) + throws SQLException { + byte[] raw; + if (value == null) { + raw = null; + } else { + ByteBuffer bbuf = ByteBuffer.allocate(value.length*4); + bbuf.asShortBuffer().put(value); + raw = bbuf.array(); + } + ps.setObject(column, raw); + } + protected final short[] fromBytes (byte[] raw) { + short[] value; + if (raw == null) { + value = null; + } else { + value = new short[raw.length/2]; + ByteBuffer.wrap(raw).asShortBuffer().get(value); + } + return value; + } + } + protected static class IntArrayMarshaller extends FieldMarshaller { @Override public String getColumnType (ColumnTyper typer, int length) { return typer.getBlobType(length*4); @@ -811,6 +855,7 @@ public abstract class FieldMarshaller // some primitive array types put(byte[].class, new ByteArrayMarshaller()). + put(short[].class, new ShortArrayMarshaller()). put(int[].class, new IntArrayMarshaller()). put(long[].class, new LongArrayMarshaller()). From f8cbd9584041aa40a7469a66bee3011925c24cd7 Mon Sep 17 00:00:00 2001 From: QartemisT <63267788+QartemisT@users.noreply.github.com> Date: Sun, 28 Feb 2021 22:27:23 +0000 Subject: [PATCH 2/2] Whoopsie value. --- src/main/java/com/samskivert/depot/impl/FieldMarshaller.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/samskivert/depot/impl/FieldMarshaller.java b/src/main/java/com/samskivert/depot/impl/FieldMarshaller.java index 99faf14..722e8c5 100644 --- a/src/main/java/com/samskivert/depot/impl/FieldMarshaller.java +++ b/src/main/java/com/samskivert/depot/impl/FieldMarshaller.java @@ -584,7 +584,7 @@ public abstract class FieldMarshaller if (value == null) { raw = null; } else { - ByteBuffer bbuf = ByteBuffer.allocate(value.length*4); + ByteBuffer bbuf = ByteBuffer.allocate(value.length*2); bbuf.asShortBuffer().put(value); raw = bbuf.array(); }