
com.yesql4j.reactor.Yesql4jReactor Maven / Gradle / Ivy
package com.yesql4j.reactor;
import io.vertx.core.AsyncResult;
import io.vertx.core.Handler;
import io.vertx.mysqlclient.MySQLPool;
import io.vertx.sqlclient.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import reactor.core.publisher.Mono;
import reactor.core.publisher.MonoSink;
import reactor.util.context.Context;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public final class Yesql4jReactor {
private static Logger log = LoggerFactory.getLogger(Yesql4jReactor.class);
public static Mono> preparedQuery(MySQLPool pool, String query) {
return Mono.subscriberContext().flatMap(
(context) -> queryMono(context, pool, query).subscribeOn(Yesql4jSchedulers.scheduler(pool))
);
}
public static Mono> preparedQuery(MySQLPool pool, String query, List paramsIndexes, Tuple params) {
return Mono.subscriberContext().flatMap(
(context) -> queryMono(context, pool, query, paramsIndexes, params).subscribeOn(Yesql4jSchedulers.scheduler(pool))
);
}
public static Mono> preparedBatch(MySQLPool pool, String query, List batch) {
return Mono.subscriberContext().flatMap(
(context) -> batchQueryMono(context, pool, query, batch).subscribeOn(Yesql4jSchedulers.scheduler(pool))
);
}
public static Mono transactional(MySQLPool pool, Mono mono) {
return Mono.subscriberContext().flatMap(currentContext -> {
if (currentContext.hasKey(Transaction.class)) {
log.debug("already in transaction");
return mono;
} else {
Mono tr = startTransaction(pool);
return Mono.usingWhen(
tr,
(Transaction transaction) -> mono.subscriberContext(ctx -> ctx.put(Transaction.class, transaction)),
Yesql4jReactor::commitTransaction,
Yesql4jReactor::rollbackTransaction,
Yesql4jReactor::cancelTransaction
);
}
});
}
public static Row singleRow(RowSet rows) {
if (rows.size() == 1) {
return rows.iterator().next();
}else {
return null;
}
}
private static Mono startTransaction(MySQLPool pool) {
return Mono.create(sink -> {
log.debug("starting transaction");
pool.begin(transactionAsyncResult -> {
if (transactionAsyncResult.succeeded()) {
sink.success(transactionAsyncResult.result());
} else {
sink.error(transactionAsyncResult.cause());
}
});
});
}
private static Mono commitTransaction(Transaction transaction) {
return Mono.create(sink -> {
log.debug("committing transaction");
transaction.commit(voidAsyncResult -> {
if (voidAsyncResult.succeeded()) {
sink.success();
} else {
sink.error(voidAsyncResult.cause());
}
});
});
}
private static Mono
© 2015 - 2025 Weber Informatics LLC | Privacy Policy