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

io.reactiverse.pgclient.impl.PgClientBase Maven / Gradle / Ivy

There is a newer version: 0.11.4
Show newest version
/*
 * Copyright (C) 2017 Julien Viet
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package io.reactiverse.pgclient.impl;

import io.reactiverse.pgclient.*;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collector;

public abstract class PgClientBase implements PgClient {

  protected abstract void schedule(CommandBase cmd);

  @Override
  public C query(String sql, Handler> handler) {
    return query(sql, false,PgRowSetImpl.FACTORY, PgRowSetImpl.COLLECTOR, handler);
  }

  @Override
  public  C query(String sql, Collector collector, Handler>> handler) {
    return query(sql, true, PgResultImpl::new, collector, handler);
  }

  private , R3 extends PgResult> C query(
    String sql,
    boolean singleton,
    Function factory,
    Collector collector,
    Handler> handler) {
    PgResultBuilder b = new PgResultBuilder<>(factory, handler);
    schedule(new SimpleQueryCommand<>(sql, singleton, collector, b, b));
    return (C) this;
  }

  @Override
  public C preparedQuery(String sql, Tuple arguments, Handler> handler) {
    return preparedQuery(sql, arguments, false, PgRowSetImpl.FACTORY, PgRowSetImpl.COLLECTOR, handler);
  }

  @Override
  public  C preparedQuery(String sql, Tuple arguments, Collector collector, Handler>> handler) {
    return preparedQuery(sql, arguments, true, PgResultImpl::new, collector, handler);
  }

  private , R3 extends PgResult> C preparedQuery(
    String sql,
    Tuple arguments,
    boolean singleton,
    Function factory,
    Collector collector,
    Handler> handler) {
    schedule(new PrepareStatementCommand(sql, ar -> {
      if (ar.succeeded()) {
        PreparedStatement ps = ar.result();
        String msg = ps.prepare((List) arguments);
        if (msg != null) {
          handler.handle(Future.failedFuture(msg));
        } else {
          PgResultBuilder b = new PgResultBuilder<>(factory, handler);
          schedule(new ExtendedQueryCommand<>(ps, arguments, singleton, collector, b, b));
        }
      } else {
        handler.handle(Future.failedFuture(ar.cause()));
      }
    }));
    return (C) this;
  }

  @Override
  public C preparedQuery(String sql, Handler> handler) {
    return preparedQuery(sql, ArrayTuple.EMPTY, handler);
  }

  @Override
  public  C preparedQuery(String sql, Collector collector, Handler>> handler) {
    return preparedQuery(sql, ArrayTuple.EMPTY, collector, handler);
  }

  @Override
  public C preparedBatch(String sql, List batch, Handler> handler) {
    return preparedBatch(sql, batch, false, PgRowSetImpl.FACTORY, PgRowSetImpl.COLLECTOR, handler);
  }

  @Override
  public  C preparedBatch(String sql, List batch, Collector collector, Handler>> handler) {
    return preparedBatch(sql, batch, true, PgResultImpl::new, collector, handler);
  }

  private , R3 extends PgResult> C preparedBatch(
    String sql,
    List batch,
    boolean singleton,
    Function factory,
    Collector collector,
    Handler> handler) {
    schedule(new PrepareStatementCommand(sql, ar -> {
      if (ar.succeeded()) {
        PreparedStatement ps = ar.result();
        for  (Tuple args : batch) {
          String msg = ps.prepare((List) args);
          if (msg != null) {
            handler.handle(Future.failedFuture(msg));
            return;
          }
        }
        PgResultBuilder b = new PgResultBuilder<>(factory, handler);
        schedule(new ExtendedBatchQueryCommand<>(
          ps,
          batch.iterator(),
          singleton,
          collector,
          b,
          b));
      } else {
        handler.handle(Future.failedFuture(ar.cause()));
      }
    }));
    return (C) this;
  }
}