diff --git a/vertx-sql-client/src/main/java/io/vertx/sqlclient/SqlConnection.java b/vertx-sql-client/src/main/java/io/vertx/sqlclient/SqlConnection.java index 39a31e9d86..3c115da358 100644 --- a/vertx-sql-client/src/main/java/io/vertx/sqlclient/SqlConnection.java +++ b/vertx-sql-client/src/main/java/io/vertx/sqlclient/SqlConnection.java @@ -18,12 +18,15 @@ package io.vertx.sqlclient; import io.vertx.codegen.annotations.Fluent; +import io.vertx.codegen.annotations.GenIgnore; import io.vertx.codegen.annotations.VertxGen; import io.vertx.core.AsyncResult; import io.vertx.core.Future; import io.vertx.core.Handler; import io.vertx.sqlclient.spi.DatabaseMetadata; +import java.util.List; + /** * A connection to the database server. * @@ -42,11 +45,27 @@ public interface SqlConnection extends SqlClient { @Fluent SqlConnection prepare(String sql, Handler> handler); + /** + * Create a prepared statement using the given {@code sql} string and parameter types. + * + * @param sql the sql + * @param parameterTypes types of the prepared query parameters + * @param handler the handler notified with the prepared query asynchronously + */ + @Fluent + SqlConnection prepare(String sql, List> parameterTypes, Handler> handler); + /** * Like {@link #prepare(String, Handler)} but returns a {@code Future} of the asynchronous result */ Future prepare(String sql); + /** + * Like {@link #prepare(String, List, Handler)} but returns a {@code Future} of the asynchronous result + */ + @GenIgnore + Future prepare(String sql, List> parameterTypes); + /** * Set an handler called with connection errors. * diff --git a/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/SqlConnectionBase.java b/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/SqlConnectionBase.java index 178267f9bd..d52c4a7608 100644 --- a/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/SqlConnectionBase.java +++ b/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/SqlConnectionBase.java @@ -25,6 +25,8 @@ import io.vertx.core.*; import io.vertx.sqlclient.impl.tracing.QueryTracer; +import java.util.List; + /** * @author Julien Viet */ @@ -47,9 +49,21 @@ public C prepare(String sql, Handler> handler) { return (C)this; } + public C prepare(String sql, List> parameterTypes, Handler> handler) { + Future fut = prepare(sql, parameterTypes); + if (handler != null) { + fut.onComplete(handler); + } + return (C)this; + } + public Future prepare(String sql) { + return prepare(sql, (List>)null); + } + + public Future prepare(String sql, List> parameterTypes) { Promise promise = promise(); - schedule(new PrepareStatementCommand(sql, true), promise); + schedule(new PrepareStatementCommand(sql, true, parameterTypes), promise); return promise.future().compose( cr -> Future.succeededFuture(PreparedStatementImpl.create(conn, tracer, metrics, context, cr, autoCommit())), err -> { diff --git a/vertx-sql-client/src/test/java/io/vertx/sqlclient/tck/PreparedQueryTestBase.java b/vertx-sql-client/src/test/java/io/vertx/sqlclient/tck/PreparedQueryTestBase.java index e5fc3ed153..e3a8b05d4e 100644 --- a/vertx-sql-client/src/test/java/io/vertx/sqlclient/tck/PreparedQueryTestBase.java +++ b/vertx-sql-client/src/test/java/io/vertx/sqlclient/tck/PreparedQueryTestBase.java @@ -21,6 +21,7 @@ import io.vertx.core.Vertx; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; +import io.vertx.ext.unit.impl.TestContextImpl; import io.vertx.sqlclient.*; import io.vertx.sqlclient.impl.RowStreamInternal; import org.junit.After; @@ -208,6 +209,24 @@ public void testPreparedUpdateWithParams(TestContext ctx) { })); } + @Test + public void testPreparedUpdateWithGivenTypes(TestContext ctx) { + connector.connect(ctx.asyncAssertSuccess(conn -> { + List> paramTypes = Arrays.asList(String.class, String.class); + conn + .prepare(statement("INSERT INTO mutable (id, val) VALUES(", ",", ")"), + paramTypes) + .compose(it -> it.query().execute(Tuple.of("value", "123456"))) + .onComplete(res -> { + if (res.succeeded()) { + ctx.assertEquals(1, res.result().rowCount()); + } else { + ((TestContextImpl)ctx).failed(res.cause()); + } + }); + })); + } + @Test public void testPreparedUpdateWithNullParams(TestContext ctx) { connector.connect(ctx.asyncAssertSuccess(conn -> {