/*
 * Copyright (c) 2011-2014 The original author or authors
 * ------------------------------------------------------
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution.
 *
 *     The Eclipse Public License is available at
 *     http://www.eclipse.org/legal/epl-v10.html
 *
 *     The Apache License v2.0 is available at
 *     http://www.opensource.org/licenses/apache2.0.php
 *
 * You may elect to redistribute this code under either of these licenses.
 */

package io.vertx.ext.sql;

import io.vertx.codegen.annotations.Fluent;
import io.vertx.codegen.annotations.VertxGen;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.json.JsonArray;
import io.vertx.ext.sql.impl.RowStreamWrapper;

A common asynchronous client interface for interacting with SQL compliant database
Author:Emad Alblueshi
/** * A common asynchronous client interface for interacting with SQL compliant database * * @author <a href="mailto:emad.albloushi@gmail.com">Emad Alblueshi</a> */
@VertxGen public interface SQLClient extends SQLOperations {
Returns a connection that can be used to perform SQL operations on. It's important to remember to close the connection when you are done, so it is returned to the pool.
Params:
  • handler – the handler which is called when the JdbcConnection object is ready for use.
/** * Returns a connection that can be used to perform SQL operations on. It's important to remember * to close the connection when you are done, so it is returned to the pool. * * @param handler the handler which is called when the <code>JdbcConnection</code> object is ready for use. */
@Fluent SQLClient getConnection(Handler<AsyncResult<SQLConnection>> handler);
Close the client and release all resources. Call the handler when close is complete.
Params:
  • handler – the handler that will be called when close is complete
/** * Close the client and release all resources. * Call the handler when close is complete. * * @param handler the handler that will be called when close is complete */
void close(Handler<AsyncResult<Void>> handler);
Close the client
/** * Close the client */
void close();
Execute a single SQL statement, this method acquires a connection from the the pool and executes the SQL statement and returns it back after the execution.
Params:
  • sql – the statement to execute
  • handler – the result handler
Returns:self
/** * Execute a single SQL statement, this method acquires a connection from the the pool and executes the SQL * statement and returns it back after the execution. * * @param sql the statement to execute * @param handler the result handler * @return self */
@Fluent @Override default SQLClient query(String sql, Handler<AsyncResult<ResultSet>> handler) { getConnection(getConnection -> { if (getConnection.failed()) { handler.handle(Future.failedFuture(getConnection.cause())); } else { final SQLConnection conn = getConnection.result(); conn.query(sql, query -> { if (query.failed()) { conn.close(close -> { if (close.failed()) { handler.handle(Future.failedFuture(close.cause())); } else { handler.handle(Future.failedFuture(query.cause())); } }); } else { conn.close(close -> { if (close.failed()) { handler.handle(Future.failedFuture(close.cause())); } else { handler.handle(Future.succeededFuture(query.result())); } }); } }); } }); return this; }
Executes the given SQL SELECT statement which returns the results of the query as a read stream.
Params:
  • sql – the SQL to execute. For example SELECT * FROM table ....
  • handler – the handler which is called once the operation completes. It will return a SQLRowStream.
See Also:
/** * Executes the given SQL <code>SELECT</code> statement which returns the results of the query as a read stream. * * @param sql the SQL to execute. For example <code>SELECT * FROM table ...</code>. * @param handler the handler which is called once the operation completes. It will return a {@code SQLRowStream}. * * @see java.sql.Statement#executeQuery(String) * @see java.sql.PreparedStatement#executeQuery(String) */
@Fluent @Override default SQLClient queryStream(String sql, Handler<AsyncResult<SQLRowStream>> handler) { getConnection(getConnection -> { if (getConnection.failed()) { handler.handle(Future.failedFuture(getConnection.cause())); } else { final SQLConnection conn = getConnection.result(); conn.queryStream(sql, query -> { if (query.failed()) { conn.close(close -> { if (close.failed()) { handler.handle(Future.failedFuture(close.cause())); } else { handler.handle(Future.failedFuture(query.cause())); } }); } else { SQLRowStream wrapped = new RowStreamWrapper(conn, query.result()); handler.handle(Future.succeededFuture(wrapped)); } }); } }); return this; }
Executes the given SQL SELECT statement which returns the results of the query as a read stream.
Params:
  • sql – the SQL to execute. For example SELECT * FROM table ....
  • params – these are the parameters to fill the statement.
  • handler – the handler which is called once the operation completes. It will return a SQLRowStream.
See Also:
/** * Executes the given SQL <code>SELECT</code> statement which returns the results of the query as a read stream. * * @param sql the SQL to execute. For example <code>SELECT * FROM table ...</code>. * @param params these are the parameters to fill the statement. * @param handler the handler which is called once the operation completes. It will return a {@code SQLRowStream}. * * @see java.sql.Statement#executeQuery(String) * @see java.sql.PreparedStatement#executeQuery(String) */
@Fluent @Override default SQLClient queryStreamWithParams(String sql, JsonArray params, Handler<AsyncResult<SQLRowStream>> handler) { getConnection(getConnection -> { if (getConnection.failed()) { handler.handle(Future.failedFuture(getConnection.cause())); } else { final SQLConnection conn = getConnection.result(); conn.queryStreamWithParams(sql, params, query -> { if (query.failed()) { conn.close(close -> { if (close.failed()) { handler.handle(Future.failedFuture(close.cause())); } else { handler.handle(Future.failedFuture(query.cause())); } }); } else { SQLRowStream wrapped = new RowStreamWrapper(conn, query.result()); handler.handle(Future.succeededFuture(wrapped)); } }); } }); return this; }
Execute a single SQL prepared statement, this method acquires a connection from the the pool and executes the SQL prepared statement and returns it back after the execution.
Params:
  • sql – the statement to execute
  • arguments – the arguments to the statement
  • handler – the result handler
Returns:self
/** * Execute a single SQL prepared statement, this method acquires a connection from the the pool and executes the SQL * prepared statement and returns it back after the execution. * * @param sql the statement to execute * @param arguments the arguments to the statement * @param handler the result handler * @return self */
@Fluent @Override default SQLClient queryWithParams(String sql, JsonArray arguments, Handler<AsyncResult<ResultSet>> handler) { getConnection(getConnection -> { if (getConnection.failed()) { handler.handle(Future.failedFuture(getConnection.cause())); } else { final SQLConnection conn = getConnection.result(); conn.queryWithParams(sql, arguments, HandlerUtil.closeAndHandleResult(conn,handler)); } }); return this; }
Executes the given SQL statement which may be an INSERT, UPDATE, or DELETE statement.
Params:
  • sql – the SQL to execute. For example INSERT INTO table ...
  • handler – the handler which is called once the operation completes.
See Also:
/** * Executes the given SQL statement which may be an <code>INSERT</code>, <code>UPDATE</code>, or <code>DELETE</code> * statement. * * @param sql the SQL to execute. For example <code>INSERT INTO table ...</code> * @param handler the handler which is called once the operation completes. * * @see java.sql.Statement#executeUpdate(String) * @see java.sql.PreparedStatement#executeUpdate(String) */
@Fluent @Override default SQLClient update(String sql, Handler<AsyncResult<UpdateResult>> handler) { getConnection(getConnection -> { if (getConnection.failed()) { handler.handle(Future.failedFuture(getConnection.cause())); } else { final SQLConnection conn = getConnection.result(); conn.update(sql, HandlerUtil.closeAndHandleResult(conn,handler)); } }); return this; }
Executes the given prepared statement which may be an INSERT, UPDATE, or DELETE statement with the given parameters
Params:
  • sql – the SQL to execute. For example INSERT INTO table ...
  • params – these are the parameters to fill the statement.
  • handler – the handler which is called once the operation completes.
See Also:
/** * Executes the given prepared statement which may be an <code>INSERT</code>, <code>UPDATE</code>, or <code>DELETE</code> * statement with the given parameters * * @param sql the SQL to execute. For example <code>INSERT INTO table ...</code> * @param params these are the parameters to fill the statement. * @param handler the handler which is called once the operation completes. * * @see java.sql.Statement#executeUpdate(String) * @see java.sql.PreparedStatement#executeUpdate(String) */
@Fluent @Override default SQLClient updateWithParams(String sql, JsonArray params, Handler<AsyncResult<UpdateResult>> handler) { getConnection(getConnection -> { if (getConnection.failed()) { handler.handle(Future.failedFuture(getConnection.cause())); } else { final SQLConnection conn = getConnection.result(); conn.updateWithParams(sql, params, HandlerUtil.closeAndHandleResult(conn,handler)); } }); return this; }
Calls the given SQL PROCEDURE which returns the result from the procedure.
Params:
  • sql – the SQL to execute. For example {call getEmpName}.
  • handler – the handler which is called once the operation completes. It will return a ResultSet.
See Also:
/** * Calls the given SQL <code>PROCEDURE</code> which returns the result from the procedure. * * @param sql the SQL to execute. For example <code>{call getEmpName}</code>. * @param handler the handler which is called once the operation completes. It will return a {@code ResultSet}. * * @see java.sql.CallableStatement#execute(String) */
@Fluent @Override default SQLClient call(String sql, Handler<AsyncResult<ResultSet>> handler) { getConnection(getConnection -> { if (getConnection.failed()) { handler.handle(Future.failedFuture(getConnection.cause())); } else { final SQLConnection conn = getConnection.result(); conn.call(sql, HandlerUtil.closeAndHandleResult(conn, handler)); } }); return this; }
Calls the given SQL PROCEDURE which returns the result from the procedure. The index of params and outputs are important for both arrays, for example when dealing with a prodecure that takes the first 2 arguments as input values and the 3 arg as an output then the arrays should be like:
  params = [VALUE1, VALUE2, null]
  outputs = [null, null, "VARCHAR"]
Params:
  • sql – the SQL to execute. For example {call getEmpName (?, ?)}.
  • params – these are the parameters to fill the statement.
  • outputs – these are the outputs to fill the statement.
  • handler – the handler which is called once the operation completes. It will return a ResultSet.
See Also:
/** * Calls the given SQL <code>PROCEDURE</code> which returns the result from the procedure. * * The index of params and outputs are important for both arrays, for example when dealing with a prodecure that * takes the first 2 arguments as input values and the 3 arg as an output then the arrays should be like: * * <pre> * params = [VALUE1, VALUE2, null] * outputs = [null, null, "VARCHAR"] * </pre> * * @param sql the SQL to execute. For example <code>{call getEmpName (?, ?)}</code>. * @param params these are the parameters to fill the statement. * @param outputs these are the outputs to fill the statement. * @param handler the handler which is called once the operation completes. It will return a {@code ResultSet}. * * @see java.sql.CallableStatement#execute(String) */
@Fluent @Override default SQLClient callWithParams(String sql, JsonArray params, JsonArray outputs, Handler<AsyncResult<ResultSet>> handler) { getConnection(getConnection -> { if (getConnection.failed()) { handler.handle(Future.failedFuture(getConnection.cause())); } else { final SQLConnection conn = getConnection.result(); conn.callWithParams(sql, params, outputs, HandlerUtil.closeAndHandleResult(conn, handler)); } }); return this; } }