All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.vertx.rxjava.ext.sql.SQLClientHelper Maven / Gradle / Ivy

There is a newer version: 5.0.0.CR1
Show newest version
/*
 * Copyright (c) 2011-2018 Contributors to the Eclipse Foundation
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 * which is available at https://www.apache.org/licenses/LICENSE-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 */

package io.vertx.rxjava.ext.sql;

import io.vertx.rxjava.ext.sql.impl.InTransactionCompletable;
import io.vertx.rxjava.ext.sql.impl.InTransactionObservable;
import io.vertx.rxjava.ext.sql.impl.InTransactionSingle;
import rx.Completable;
import rx.Observable;
import rx.Single;
import rx.exceptions.Exceptions;

import java.util.function.Function;

/**
 * Utilities for generating observables with a {@link SQLClient}.
 *
 * @author Thomas Segismont
 */
public class SQLClientHelper {

  /**
   * Creates a {@link Observable.Transformer} decorating an {@link Observable} with transaction management for a given {@link SQLConnection}.
   * 

* If the upstream {@link Observable} completes (onComplete), the transaction is committed. * If the upstream {@link Observable} emits an error (onError), the transaction is rollbacked. *

* Eventually, the given {@link SQLConnection} is put back in autocommit mode. * * @param sqlConnection the {@link SQLConnection} used for database operations and transaction management * @param the type of the items emitted by the upstream {@link Observable} * @return a {@link Observable.Transformer} decorating an {@link Observable} with transaction management */ public static Observable.Transformer txObservableTransformer(SQLConnection sqlConnection) { return new InTransactionObservable<>(sqlConnection); } /** * Generates a {@link Observable} from {@link SQLConnection} operations executed inside a transaction. * * @param client the {@link SQLClient} * @param sourceSupplier a user-provided function returning a {@link Observable} generated by interacting with the given {@link SQLConnection} * @param the type of the items emitted by the {@link Observable} * @return an {@link Observable} generated from {@link SQLConnection} operations executed inside a transaction */ public static Observable inTransactionObservable(SQLClient client, Function> sourceSupplier) { return usingConnectionObservable(client, conn -> sourceSupplier.apply(conn).compose(txObservableTransformer(conn))); } /** * Creates a {@link Single.Transformer} decorating a {@link Single} with transaction management for a given {@link SQLConnection}. *

* If the upstream {@link Single} emits a value (onSuccess), the transaction is committed. * If the upstream {@link Single} emits an error (onError), the transaction is rollbacked. *

* Eventually, the given {@link SQLConnection} is put back in autocommit mode. * * @param sqlConnection the {@link SQLConnection} used for database operations and transaction management * @param the type of the item emitted by the upstream {@link Single} * @return a {@link Single.Transformer} decorating a {@link Single} with transaction management */ public static Single.Transformer txSingleTransformer(SQLConnection sqlConnection) { return new InTransactionSingle<>(sqlConnection); } /** * Generates a {@link Single} from {@link SQLConnection} operations executed inside a transaction. * * @param client the {@link SQLClient} * @param sourceSupplier a user-provided function returning a {@link Single} generated by interacting with the given {@link SQLConnection} * @param the type of the item emitted by the {@link Single} * @return a {@link Single} generated from {@link SQLConnection} operations executed inside a transaction */ public static Single inTransactionSingle(SQLClient client, Function> sourceSupplier) { return usingConnectionSingle(client, conn -> sourceSupplier.apply(conn).compose(txSingleTransformer(conn))); } /** * Creates a {@link Completable.Transformer} decorating a {@link Completable} with transaction management for a given {@link SQLConnection}. *

* If the upstream {@link Completable} completes (onComplete), the transaction is committed. * If the upstream {@link Completable} emits an error (onError), the transaction is rollbacked. *

* Eventually, the given {@link SQLConnection} is put back in autocommit mode. * * @param sqlConnection the {@link SQLConnection} used for database operations and transaction management * @return a {@link Completable.Transformer} decorating a {@link Completable} with transaction management */ public static Completable.Transformer txCompletableTransformer(SQLConnection sqlConnection) { return new InTransactionCompletable(sqlConnection); } /** * Generates a {@link Completable} from {@link SQLConnection} operations executed inside a transaction. * * @param client the {@link SQLClient} * @param sourceSupplier a user-provided function returning a {@link Completable} generated by interacting with the given {@link SQLConnection} * @return a {@link Completable} generated from {@link SQLConnection} operations executed inside a transaction */ public static Completable inTransactionCompletable(SQLClient client, Function sourceSupplier) { return usingConnectionCompletable(client, conn -> sourceSupplier.apply(conn).compose(txCompletableTransformer(conn))); } /** * Generates a {@link Observable} from {@link SQLConnection} operations. * * @param client the {@link SQLClient} * @param sourceSupplier a user-provided function returning a {@link Observable} generated by interacting with the given {@link SQLConnection} * @param the type of the items emitted by the {@link Observable} * @return an {@link Observable} generated from {@link SQLConnection} operations */ public static Observable usingConnectionObservable(SQLClient client, Function> sourceSupplier) { return client.rxGetConnection().flatMapObservable(conn -> { try { return sourceSupplier.apply(conn).doAfterTerminate(conn::close); } catch (Throwable t) { Exceptions.throwIfFatal(t); conn.close(); return Observable.error(t); } }); } /** * Generates a {@link Single} from {@link SQLConnection} operations. * * @param client the {@link SQLClient} * @param sourceSupplier a user-provided function returning a {@link Single} generated by interacting with the given {@link SQLConnection} * @param the type of the item emitted by the {@link Single} * @return a {@link Single} generated from {@link SQLConnection} operations */ public static Single usingConnectionSingle(SQLClient client, Function> sourceSupplier) { return client.rxGetConnection().flatMap(conn -> { try { return sourceSupplier.apply(conn).doAfterTerminate(conn::close); } catch (Throwable t) { Exceptions.throwIfFatal(t); conn.close(); return Single.error(t); } }); } /** * Generates a {@link Completable} from {@link SQLConnection} operations. * * @param client the {@link SQLClient} * @param sourceSupplier a user-provided function returning a {@link Completable} generated by interacting with the given {@link SQLConnection} * @return a {@link Completable} generated from {@link SQLConnection} operations */ public static Completable usingConnectionCompletable(SQLClient client, Function sourceSupplier) { return client.rxGetConnection().flatMapCompletable(conn -> { try { return sourceSupplier.apply(conn).doAfterTerminate(conn::close); } catch (Throwable t) { Exceptions.throwIfFatal(t); conn.close(); return Completable.error(t); } }); } private SQLClientHelper() { // Utility } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy