diff --git a/src/main/java/io/reactiverse/voltdbclient/VoltClient.java b/src/main/java/io/reactiverse/voltdbclient/VoltClient.java index f3d1bac..8ac817f 100644 --- a/src/main/java/io/reactiverse/voltdbclient/VoltClient.java +++ b/src/main/java/io/reactiverse/voltdbclient/VoltClient.java @@ -21,6 +21,7 @@ import io.vertx.core.AsyncResult; import io.vertx.core.Handler; import io.vertx.core.Vertx; +import org.voltdb.client.ClientResponse; /** * VoltDb client that can connect to one or more nodes in a volt cluster. @@ -51,7 +52,6 @@ static VoltClient create(Vertx vertx, VoltClientOptions options) { return new VoltClientImpl(vertx, options); } - /** * Create a connection to a VoltDB node and add it to the set of connections. * @@ -61,6 +61,18 @@ static VoltClient create(Vertx vertx, VoltClientOptions options) { @Fluent VoltClient createConnection(Handler> resultHandler); + /** + * Invoke a replicated procedure. + * + * @param procName class name (not qualified by package) of the procedure to execute. + * @param parameters vararg list of procedure's parameter values. + * @param resultHandler holds the result of stored procedure invokation. + * @return reference to this, for fluency. + */ + @Fluent + VoltClient callProcedure(String procName, Object[] parameters, Handler> resultHandler); + + /** * Close the client and release its resources. * diff --git a/src/main/java/io/reactiverse/voltdbclient/impl/VoltClientImpl.java b/src/main/java/io/reactiverse/voltdbclient/impl/VoltClientImpl.java index f33d422..900bbec 100644 --- a/src/main/java/io/reactiverse/voltdbclient/impl/VoltClientImpl.java +++ b/src/main/java/io/reactiverse/voltdbclient/impl/VoltClientImpl.java @@ -17,16 +17,10 @@ import io.reactiverse.voltdbclient.VoltClient; import io.reactiverse.voltdbclient.VoltClientOptions; -import io.vertx.core.AsyncResult; -import io.vertx.core.Context; -import io.vertx.core.Handler; -import io.vertx.core.Vertx; +import io.vertx.core.*; import io.vertx.core.logging.Logger; import io.vertx.core.logging.LoggerFactory; -import org.voltdb.client.Client; -import org.voltdb.client.ClientConfig; -import org.voltdb.client.ClientFactory; -import org.voltdb.client.ClientStatusListenerExt; +import org.voltdb.client.*; import java.io.IOException; import java.net.UnknownHostException; @@ -72,6 +66,23 @@ public VoltClient createConnection(Handler> resultHandler) { return this; } + @Override + public VoltClient callProcedure(String procName, Object[] parameters, Handler> resultHandler) { + try { + boolean queued = client.callProcedure(clientResponse -> { + resultHandler.handle(Future.succeededFuture(clientResponse)); + }, procName, parameters); + + if (!queued) { + // to be tested. + } + } catch (IOException e) { + log.error("Error occurred while calling procedure: " + procName, e); + resultHandler.handle(Future.failedFuture(e)); + } + return this; + } + @Override public void close(Handler> resultHandler) { context.executeBlocking(event -> { diff --git a/src/test/java/io/reactiverse/voltdbclient/impl/VoltClientTest.java b/src/test/java/io/reactiverse/voltdbclient/impl/VoltClientTest.java index b9ee827..0c9abf4 100644 --- a/src/test/java/io/reactiverse/voltdbclient/impl/VoltClientTest.java +++ b/src/test/java/io/reactiverse/voltdbclient/impl/VoltClientTest.java @@ -18,15 +18,18 @@ import io.reactiverse.voltdbclient.VoltClient; import io.reactiverse.voltdbclient.VoltClientOptions; import io.vertx.core.Vertx; -import io.vertx.core.logging.Logger; -import io.vertx.core.logging.LoggerFactory; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; import io.vertx.ext.unit.junit.VertxUnitRunner; -import org.junit.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; import org.junit.runner.RunWith; +import static org.junit.Assert.assertTrue; + /** * Tests the {@link io.reactiverse.voltdbclient.VoltClient} * @@ -67,16 +70,16 @@ public void setUp(TestContext context) { public void testCreateConnection(TestContext context) { Async async = context.async(); voltClient.createConnection(event -> { - Assert.assertTrue(event.succeeded()); + assertTrue(event.succeeded()); async.complete(); }); } + @After public void tearDown(TestContext context) { voltClient.close(event -> { vertx.close(context.asyncAssertSuccess()); }); - } }