diff --git a/core/src/main/java/acolyte/AbstractStatement.java b/core/src/main/java/acolyte/AbstractStatement.java index fb81f2d..aec6a2b 100644 --- a/core/src/main/java/acolyte/AbstractStatement.java +++ b/core/src/main/java/acolyte/AbstractStatement.java @@ -377,10 +377,11 @@ abstract class AbstractStatement implements java.sql.Statement { /** * {@inheritDoc} - * @throws java.sql.SQLException Batch is not supported */ public void clearBatch() throws SQLException { - throw new SQLException("Batch is not supported"); + checkClosed(); + + // batches are not supported, nothing to clear, operation is no op } // end of clearBatch /** diff --git a/core/src/main/java/acolyte/CallableStatement.java b/core/src/main/java/acolyte/CallableStatement.java index f2396cf..ed9948e 100644 --- a/core/src/main/java/acolyte/CallableStatement.java +++ b/core/src/main/java/acolyte/CallableStatement.java @@ -784,6 +784,7 @@ public final class CallableStatement /* Java 1.7 * {@inheritDoc} + */ public T getObject(final int parameterIndex, final Class type) throws SQLException { @@ -810,7 +811,6 @@ public final class CallableStatement return this.result.getObject(parameterName, type); } // end of getObject - */ /** * {@inheritDoc} diff --git a/core/src/main/java/acolyte/Connection.java b/core/src/main/java/acolyte/Connection.java index 6831fb1..1c65fdc 100644 --- a/core/src/main/java/acolyte/Connection.java +++ b/core/src/main/java/acolyte/Connection.java @@ -28,7 +28,7 @@ import java.sql.Clob; * * @author Cedric Chantepie */ -public final class Connection implements java.sql.Connection { +public class Connection implements java.sql.Connection { // --- Properties --- /** @@ -134,6 +134,20 @@ public final class Connection implements java.sql.Connection { } // end of if } // end of + /** + * Copy constructor. + * + * Works only with freshly created connections, which should not + * be used afterwards. + * + * @param connection Connection to copy + */ + protected Connection(Connection connection) { + this.url = connection.url; + this.props = connection.props; + this.handler = connection.handler; + } + // --- Connection impl --- /** diff --git a/core/src/main/java/acolyte/Defaults.java b/core/src/main/java/acolyte/Defaults.java index 2b6a6be..f96337b 100644 --- a/core/src/main/java/acolyte/Defaults.java +++ b/core/src/main/java/acolyte/Defaults.java @@ -54,6 +54,7 @@ final class Defaults { mappings.put(Types.BIGINT, Long.class.getName()); mappings.put(Types.BIT, Boolean.class.getName()); + mappings.put(Types.BLOB, byte[].class.getName()); mappings.put(Types.BOOLEAN, Boolean.class.getName()); mappings.put(Types.CHAR, Character.class.getName()); mappings.put(Types.DATE, Date.class.getName()); @@ -91,6 +92,7 @@ final class Defaults { names.put(Types.BIGINT, "BIGINT"); names.put(Types.BIT, "BOOL"); + names.put(Types.BLOB, "BLOB"); names.put(Types.BOOLEAN, "BOOL"); names.put(Types.CHAR, "CHAR"); names.put(Types.DATE, "DATE"); @@ -114,6 +116,7 @@ final class Defaults { signs.put(Types.BIGINT, Boolean.TRUE); signs.put(Types.BIT, Boolean.FALSE); + signs.put(Types.BLOB, Boolean.FALSE); signs.put(Types.BOOLEAN, Boolean.FALSE); signs.put(Types.CHAR, Boolean.FALSE); signs.put(Types.DATE, Boolean.FALSE); @@ -161,6 +164,8 @@ final class Defaults { scales.put(Types.BIGINT, 0); scales.put(Types.BIT, 0/*-1*/); + scales.put(Types.BLOB, 0/*-1*/); + scales.put(Types.BOOLEAN, 0/*-1*/); scales.put(Types.CHAR, 0/*-1*/); scales.put(Types.DATE, 0/*-1*/); diff --git a/core/src/main/java/acolyte/Driver.java b/core/src/main/java/acolyte/Driver.java index 5cd0430..b89ae7b 100644 --- a/core/src/main/java/acolyte/Driver.java +++ b/core/src/main/java/acolyte/Driver.java @@ -15,7 +15,7 @@ import java.sql.Connection; * * @author Cedric Chantepie */ -public final class Driver implements java.sql.Driver { +public class Driver implements java.sql.Driver { // --- Constants --- /** @@ -51,7 +51,7 @@ public final class Driver implements java.sql.Driver { * @throws IllegalArgumentException if |info| doesn't contain handler * (ConnectionHandler) for property "connection.handler". */ - public acolyte.Connection connect(final String url, final Properties info) + public Connection connect(final String url, final Properties info) throws SQLException { if (!acceptsURL(url)) { diff --git a/core/src/main/java/acolyte/ParameterMetaData.java b/core/src/main/java/acolyte/ParameterMetaData.java index 17a1694..4dab24b 100644 --- a/core/src/main/java/acolyte/ParameterMetaData.java +++ b/core/src/main/java/acolyte/ParameterMetaData.java @@ -226,6 +226,13 @@ public final class ParameterMetaData implements java.sql.ParameterMetaData { } // end of Byte /** + * Byte array constructor. + */ + public static ParameterDef ByteArray() { + return Default(Types.BLOB); + } // end of Byte + + /** * Short constructor. */ public static ParameterDef Short() { diff --git a/core/src/main/java/acolyte/PreparedStatement.java b/core/src/main/java/acolyte/PreparedStatement.java index 5cfe524..69164ce 100644 --- a/core/src/main/java/acolyte/PreparedStatement.java +++ b/core/src/main/java/acolyte/PreparedStatement.java @@ -51,6 +51,7 @@ import static acolyte.ParameterMetaData.Date; import static acolyte.ParameterMetaData.Time; import static acolyte.ParameterMetaData.Bool; import static acolyte.ParameterMetaData.Byte; +import static acolyte.ParameterMetaData.ByteArray; import static acolyte.ParameterMetaData.Null; import static acolyte.ParameterMetaData.Long; import static acolyte.ParameterMetaData.Real; @@ -289,7 +290,7 @@ public class PreparedStatement public void setBytes(final int parameterIndex, final byte[] x) throws SQLException { - throw new SQLException("Not supported"); + setParam(parameterIndex, ByteArray(), (Object)x); } // end of setBytes /** diff --git a/core/src/main/java/acolyte/RowList.java b/core/src/main/java/acolyte/RowList.java index 92b653d..221937a 100644 --- a/core/src/main/java/acolyte/RowList.java +++ b/core/src/main/java/acolyte/RowList.java @@ -1,5 +1,6 @@ package acolyte; +import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.ArrayList; import java.util.Calendar; @@ -343,7 +344,7 @@ public abstract class RowList { public boolean wasNull() throws SQLException { checkClosed(); - return (this.last != null); + return (this.last == null); } // end of wasNull /** @@ -479,7 +480,9 @@ public abstract class RowList { return (String) val; } // end of if - // --- + if (val instanceof byte[]) { + return new String((byte[]) val, StandardCharsets.UTF_8); + } // end of if return String.valueOf(val); } // end of getString @@ -498,7 +501,9 @@ public abstract class RowList { return (String) val; } // end of if - // --- + if (val instanceof byte[]) { + return new String((byte[]) val, StandardCharsets.UTF_8); + } // end of if return String.valueOf(val); } // end of getString @@ -578,6 +583,42 @@ public abstract class RowList { /** * {@inheritDoc} */ + public byte[] getBytes(final int columnIndex) throws SQLException { + final Object val = getObject(columnIndex); + + if (val == null) { + return null; + } // end of if + + if (val instanceof byte[]) { + return (byte[]) val; + } // end of if + + throw new SQLException("Not a byte[]: " + columnIndex); + } // end of getBytes + + /** + * {@inheritDoc} + */ + public byte[] getBytes(final String columnLabel) + throws SQLException { + + final Object val = getObject(columnLabel); + + if (val == null) { + return null; + } // end of if + + if (val instanceof byte[]) { + return (byte[]) val; + } // end of if + + throw new SQLException("Not a byte[]: " + columnLabel); + } // end of getBytes + + /** + * {@inheritDoc} + */ public short getShort(final int columnIndex) throws SQLException { final Object val = getObject(columnIndex);