1 package org.davidmoten.rx.jdbc;
2
3 import java.sql.Connection;
4 import java.util.concurrent.atomic.AtomicReference;
5
6 import javax.annotation.Nonnull;
7
8 import com.github.davidmoten.guavamini.Preconditions;
9
10 import io.reactivex.Flowable;
11
12 public final class TransactedReturnGeneratedKeysBuilder implements GetterTx {
13
14 private final TransactedUpdateBuilder update;
15 private final Database db;
16
17 TransactedReturnGeneratedKeysBuilder(TransactedUpdateBuilder update, Database db) {
18 this.update = update;
19 this.db = db;
20 }
21
22
23
24
25
26
27
28
29 @Override
30 public <T> Flowable<Tx<T>> get(@Nonnull ResultSetMapper<? extends T> mapper) {
31 Preconditions.checkNotNull(mapper, "mapper cannot be null");
32 return Flowable.defer(() -> {
33 AtomicReference<Connection> connection = new AtomicReference<Connection>();
34 Flowable<T> o = Update.<T>createReturnGeneratedKeys(
35 update.updateBuilder.connections
36 .map(c -> Util.toTransactedConnection(connection, c)),
37 update.parameterGroupsToFlowable(), update.updateBuilder.sql, mapper, false);
38 return o.materialize()
39 .flatMap(n -> Tx.toTx(n, connection.get(), db))
40 .doOnNext(tx -> {
41 if (tx.isComplete()) {
42 ((TxImpl<T>) tx).connection().commit();
43 }
44 });
45 });
46 }
47
48 public ValuesOnly valuesOnly() {
49 return new ValuesOnly(this);
50 }
51
52 public static final class ValuesOnly implements Getter {
53
54 private final TransactedReturnGeneratedKeysBuilder builder;
55
56 public ValuesOnly(TransactedReturnGeneratedKeysBuilder builder) {
57 this.builder = builder;
58 }
59
60 @Override
61 public <T> Flowable<T> get(ResultSetMapper<? extends T> function) {
62 return builder.get(function).flatMap(Tx.flattenToValuesOnly());
63 }
64
65 }
66
67 }