/** * Copy constructor * * @param other the result to copy */ public UpdateResult(UpdateResult other) { this.updated = other.updated; this.keys = other.getKeys(); }
public static void toJson(UpdateResult obj, java.util.Map<String, Object> json) { if (obj.getKeys() != null) { json.put("keys", obj.getKeys()); } json.put("updated", obj.getUpdated()); } }
doWork(new UpdateResult(){ @Override public void updateStatus(Integer status){ publishProgress(status) } });
@Override @Suspendable public void start() throws Exception { JsonObject config = new JsonObject().put("url", "jdbc:hsqldb:mem:test?shutdown=true") .put("driver_class", "org.hsqldb.jdbcDriver"); JDBCClient jdbc = JDBCClient.createShared(vertx, config); // Get a connection try (SQLConnection conn = awaitResult(jdbc::getConnection)) { // Create a table Void v = awaitResult(h -> conn.execute("CREATE TABLE test(col VARCHAR(20))", h)); // Insert some stuff for (int i = 0; i < 10; i++) { int ii = i; UpdateResult res = awaitResult(h -> conn.update("INSERT INTO test (col) VALUES ('val" + ii + "')", h)); System.out.println("Rows updated: " + res.getUpdated()); } // Select the results ResultSet res = awaitResult(h -> conn.query("SELECT * FROM test", h)); System.out.println("Selected " + res.getNumRows() + " results"); res.getResults().forEach(System.out::println); } }
@Test public void simpleTest(TestContext context) { Async async = context.async(); JsonArray array = new JsonArray().add("new name"); String insertExpression = "insert into MiniMapper set name=?; "; SqlUtil.updateWithParams((MySqlDataStore) getDataStore(context), insertExpression, array, ur -> { if (ur.failed()) { LOGGER.error("", ur.cause()); async.complete(); } else { UpdateResult res = ur.result(); LOGGER.info(res.toJson()); LOGGER.info(res.getKeys()); String lastInsertIdCmd = "SELECT LAST_INSERT_ID()"; SqlUtil.query((MySqlDataStore) getDataStore(context), lastInsertIdCmd, idResult -> { if (idResult.failed()) { LOGGER.error("", ur.cause()); context.fail(ur.cause()); async.complete(); } else { List<JsonObject> ids = idResult.result().getRows(); for (JsonObject row : ids) { LOGGER.info(row); } async.complete(); } }); } }); }
@Test public void testJson() { JsonObject json = ur.toJson(); UpdateResult ur2 = new UpdateResult(json); assertEquals(ur, ur2); } }
@Override public int getDeletedInstances() { return updateResult.getUpdated(); }
private void insert(RoutingContext ctx, String sql, JsonArray attributes) { jdbcClient.getConnection(res -> { if (res.succeeded()) { try (final SQLConnection connection = res.result()) { connection.updateWithParams(sql, attributes, insert -> { final UpdateResult ur = insert.result(); if (ur != null) { ctx.response() .setStatusCode(201) .end(Integer.toString(ur.getKeys().getInteger(0))); } else { ctx.response() .setStatusCode(500) .end(String.format("Connection to database couldn't be established: %s", res.cause())); } }); } } else { ctx.response() .setStatusCode(500) .end(String.format("Connection to database couldn't be established: %s", res.cause())); } }); }
@Override public CompletableFuture<Integer> update(final String sql, final GeneratedKeyReader generatedKeyReader, final StatementSetter pss) { LOGGER.debug("Connection [{}] - Execute update query: [{}]", connectionNumber, sql); Vertx3Statement statement = new Vertx3Statement(); pss.set(statement); CompletableFuture<Integer> result = new CompletableFuture<>(); connection.updateWithParams(sql, statement.getParams(), handler -> { UpdateResult updateResult = handler.result(); if (handler.succeeded()) { generatedKeyReader.read(new Vertx3GeneratedKeysResultSet(updateResult.getKeys(), generatedKeyReader.generatedColumnNames())); result.complete(updateResult.getUpdated()); } else { Throwable cause = handler.cause(); LOGGER.error("Exception thrown during update execution", cause); result.completeExceptionally(cause); } }); return result; }
/** * Checks the UpdateResult and informs the Handler with an error, if needed * * @param updateResult * the result to be checked * @param resultHandler * the {@link Handler} to be informed */ private void checkUpdateResult(SqlSequence seq, AsyncResult<UpdateResult> updateResult, Handler<AsyncResult<Void>> resultHandler) { if (updateResult.failed()) { Exception we = updateResult.cause() instanceof DuplicateKeyException ? (DuplicateKeyException) updateResult.cause() : new WriteException(updateResult.cause()); resultHandler.handle(Future.failedFuture(we)); } else { UpdateResult res = updateResult.result(); if (res.getUpdated() != 1) { String message = String.format("Error inserting a record, expected %d records saved, but was %d", 1, res.getUpdated()); resultHandler.handle(Future.failedFuture(new InsertException(message))); } else { resultHandler.handle(Future.succeededFuture()); } } }
protected String doInBackground(Integer... params) { doWork(new UpdateResult(){ @Override public void updateStatus(Integer status){
@Override public void insertReturning(Query query, Handler<AsyncResult<Long>> resultHandler) { getConnection().setHandler(sqlConnectionResult->{ if(sqlConnectionResult.succeeded()){ log("Insert Returning", ()-> query.getSQL(ParamType.INLINED)); sqlConnectionResult.result().update( query.getSQL(ParamType.INLINED), executeAndClose(res -> res.getKeys().getLong(0), sqlConnectionResult.result(), resultHandler) ); }else{ resultHandler.handle(Future.failedFuture(sqlConnectionResult.cause())); } }); }
@Test public void testUpdateResult() { assertEquals(updated, ur.getUpdated()); assertEquals(keys.size(), ur.getKeys().size()); assertEquals(keys, ur.getKeys()); }
private Completable delete(SQLConnection connection, String id) { String sql = "DELETE FROM Articles WHERE id = ?"; JsonArray params = new JsonArray().add(Integer.valueOf(id)); return connection.rxUpdateWithParams(sql, params) .doFinally(connection::close) .flatMapCompletable(ur -> ur.getUpdated() == 0 ? Completable .error(new NoSuchElementException("No article with id " + id)) : Completable.complete() ); }
@Override protected UpdateResult queryResultToUpdateResult(QueryResult qr) { int affected = (int) qr.getRowsAffected(); return new UpdateResult(affected, new JsonArray()); } }
@Override public void insertReturning(Query query, Handler<AsyncResult<Long>> resultHandler) { getConnection().setHandler(sqlConnectionResult->{ if(sqlConnectionResult.succeeded()){ log("Insert Returning", ()-> query.getSQL(ParamType.INLINED)); sqlConnectionResult.result().update( query.getSQL(ParamType.INLINED), executeAndClose(res -> res.getKeys().getLong(0), sqlConnectionResult.result(), resultHandler) ); }else{ resultHandler.handle(Future.failedFuture(sqlConnectionResult.cause())); } }); }
protected void assertUpdate(UpdateResult result, int updated, boolean generatedKeys) { assertNotNull(result); assertEquals(updated, result.getUpdated()); if (generatedKeys) { JsonArray keys = result.getKeys(); assertNotNull(keys); assertEquals(updated, keys.size()); Set<Integer> numbers = new HashSet<>(); for (int i = 0; i < updated; i++) { assertTrue(keys.getValue(i) instanceof Integer); assertTrue(numbers.add(i)); } } }
public void delete(String id, Handler<ExtendedAsyncResult<Void>> fut) { PostgresQuery q = pg.getQuery(); String sql = "DELETE FROM " + table + " WHERE " + idSelect; JsonArray jsa = new JsonArray(); jsa.add(id); q.updateWithParams(sql, jsa, res -> { if (res.failed()) { fut.handle(new Failure<>(INTERNAL, res.cause())); } else { UpdateResult result = res.result(); if (result.getUpdated() > 0) { fut.handle(new Success<>()); } else { fut.handle(new Failure<>(NOT_FOUND, id)); } q.close(); } }); }
@Override protected UpdateResult queryResultToUpdateResult(QueryResult qr) { int affected = (int) qr.rowsAffected(); return new UpdateResult(affected, new JsonArray()); } }