package io.vertx.pgclient;
import io.vertx.pgclient.impl.PgConnectionUriParser;
import io.vertx.codegen.annotations.DataObject;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.json.JsonObject;
import io.vertx.core.net.*;
import io.vertx.sqlclient.SqlConnectOptions;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import static java.lang.Integer.parseInt;
import static java.lang.System.getenv;
@DataObject(generateConverter = true)
public class PgConnectOptions extends SqlConnectOptions {
public static PgConnectOptions fromUri(String connectionUri) throws IllegalArgumentException {
JsonObject parsedConfiguration = PgConnectionUriParser.parse(connectionUri);
return new PgConnectOptions(parsedConfiguration);
}
public static PgConnectOptions fromEnv() {
PgConnectOptions pgConnectOptions = new PgConnectOptions();
if (getenv("PGHOSTADDR") == null) {
if (getenv("PGHOST") != null) {
pgConnectOptions.setHost(getenv("PGHOST"));
}
} else {
pgConnectOptions.setHost(getenv("PGHOSTADDR"));
}
if (getenv("PGPORT") != null) {
try {
pgConnectOptions.setPort(parseInt(getenv("PGPORT")));
} catch (NumberFormatException e) {
}
}
if (getenv("PGDATABASE") != null) {
pgConnectOptions.setDatabase(getenv("PGDATABASE"));
}
if (getenv("PGUSER") != null) {
pgConnectOptions.setUser(getenv("PGUSER"));
}
if (getenv("PGPASSWORD") != null) {
pgConnectOptions.setPassword(getenv("PGPASSWORD"));
}
if (getenv("PGSSLMODE") != null) {
pgConnectOptions.setSslMode(SslMode.of(getenv("PGSSLMODE")));
}
return pgConnectOptions;
}
public static final String DEFAULT_HOST = "localhost";
public static int DEFAULT_PORT = 5432;
public static final String DEFAULT_DATABASE = "db";
public static final String DEFAULT_USER = "user";
public static final String DEFAULT_PASSWORD = "pass";
public static final int DEFAULT_PIPELINING_LIMIT = 256;
public static final SslMode DEFAULT_SSLMODE = SslMode.DISABLE;
public static final Map<String, String> DEFAULT_PROPERTIES;
static {
Map<String, String> defaultProperties = new HashMap<>();
defaultProperties.put("application_name", "vertx-pg-client");
defaultProperties.put("client_encoding", "utf8");
defaultProperties.put("DateStyle", "ISO");
defaultProperties.put("intervalStyle", "postgres");
defaultProperties.put("extra_float_digits", "2");
DEFAULT_PROPERTIES = Collections.unmodifiableMap(defaultProperties);
}
private int pipeliningLimit;
private SslMode sslMode;
public PgConnectOptions() {
super();
}
public PgConnectOptions(JsonObject json) {
super(json);
PgConnectOptionsConverter.fromJson(json, this);
}
public PgConnectOptions(PgConnectOptions other) {
super(other);
pipeliningLimit = other.pipeliningLimit;
sslMode = other.sslMode;
}
@Override
public PgConnectOptions setHost(String host) {
return (PgConnectOptions) super.setHost(host);
}
@Override
public PgConnectOptions setPort(int port) {
return (PgConnectOptions) super.setPort(port);
}
@Override
public PgConnectOptions setUser(String user) {
return (PgConnectOptions) super.setUser(user);
}
@Override
public PgConnectOptions setPassword(String password) {
return (PgConnectOptions) super.setPassword(password);
}
@Override
public PgConnectOptions setDatabase(String database) {
return (PgConnectOptions) super.setDatabase(database);
}
public int getPipeliningLimit() {
return pipeliningLimit;
}
public PgConnectOptions setPipeliningLimit(int pipeliningLimit) {
if (pipeliningLimit < 1) {
throw new IllegalArgumentException();
}
this.pipeliningLimit = pipeliningLimit;
return this;
}
public PgConnectOptions setCachePreparedStatements(boolean cachePreparedStatements) {
return (PgConnectOptions) super.setCachePreparedStatements(cachePreparedStatements);
}
@Override
public PgConnectOptions setPreparedStatementCacheMaxSize(int preparedStatementCacheMaxSize) {
return (PgConnectOptions) super.setPreparedStatementCacheMaxSize(preparedStatementCacheMaxSize);
}
@Override
public PgConnectOptions setPreparedStatementCacheSqlLimit(int preparedStatementCacheSqlLimit) {
return (PgConnectOptions) super.setPreparedStatementCacheSqlLimit(preparedStatementCacheSqlLimit);
}
@Override
public PgConnectOptions setProperties(Map<String, String> properties) {
return (PgConnectOptions) super.setProperties(properties);
}
@Override
public PgConnectOptions addProperty(String key, String value) {
return (PgConnectOptions) super.addProperty(key, value);
}
public SslMode getSslMode() {
return sslMode;
}
public PgConnectOptions setSslMode(SslMode sslmode) {
this.sslMode = sslmode;
return this;
}
@Override
public PgConnectOptions setSendBufferSize(int sendBufferSize) {
return (PgConnectOptions)super.setSendBufferSize(sendBufferSize);
}
@Override
public PgConnectOptions setReceiveBufferSize(int receiveBufferSize) {
return (PgConnectOptions)super.setReceiveBufferSize(receiveBufferSize);
}
@Override
public PgConnectOptions setReuseAddress(boolean reuseAddress) {
return (PgConnectOptions)super.setReuseAddress(reuseAddress);
}
@Override
public PgConnectOptions setTrafficClass(int trafficClass) {
return (PgConnectOptions)super.setTrafficClass(trafficClass);
}
@Override
public PgConnectOptions setTcpNoDelay(boolean tcpNoDelay) {
return (PgConnectOptions)super.setTcpNoDelay(tcpNoDelay);
}
@Override
public PgConnectOptions setTcpKeepAlive(boolean tcpKeepAlive) {
return (PgConnectOptions)super.setTcpKeepAlive(tcpKeepAlive);
}
@Override
public PgConnectOptions setSoLinger(int soLinger) {
return (PgConnectOptions)super.setSoLinger(soLinger);
}
@Override
public PgConnectOptions setUsePooledBuffers(boolean usePooledBuffers) {
return (PgConnectOptions)super.setUsePooledBuffers(usePooledBuffers);
}
@Override
public PgConnectOptions setIdleTimeout(int idleTimeout) {
return (PgConnectOptions)super.setIdleTimeout(idleTimeout);
}
@Override
public PgConnectOptions setIdleTimeoutUnit(TimeUnit idleTimeoutUnit) {
return (PgConnectOptions) super.setIdleTimeoutUnit(idleTimeoutUnit);
}
@Override
public PgConnectOptions setSsl(boolean ssl) {
if (ssl) {
setSslMode(SslMode.VERIFY_CA);
} else {
setSslMode(SslMode.DISABLE);
}
return this;
}
@Override
public PgConnectOptions setKeyCertOptions(KeyCertOptions options) {
return (PgConnectOptions)super.setKeyCertOptions(options);
}
@Override
public PgConnectOptions setKeyStoreOptions(JksOptions options) {
return (PgConnectOptions)super.setKeyStoreOptions(options);
}
@Override
public PgConnectOptions setPfxKeyCertOptions(PfxOptions options) {
return (PgConnectOptions)super.setPfxKeyCertOptions(options);
}
@Override
public PgConnectOptions setPemKeyCertOptions(PemKeyCertOptions options) {
return (PgConnectOptions)super.setPemKeyCertOptions(options);
}
@Override
public PgConnectOptions setTrustOptions(TrustOptions options) {
return (PgConnectOptions)super.setTrustOptions(options);
}
@Override
public PgConnectOptions setTrustStoreOptions(JksOptions options) {
return (PgConnectOptions)super.setTrustStoreOptions(options);
}
@Override
public PgConnectOptions setPemTrustOptions(PemTrustOptions options) {
return (PgConnectOptions)super.setPemTrustOptions(options);
}
@Override
public PgConnectOptions setPfxTrustOptions(PfxOptions options) {
return (PgConnectOptions)super.setPfxTrustOptions(options);
}
@Override
public PgConnectOptions addEnabledCipherSuite(String suite) {
return (PgConnectOptions)super.addEnabledCipherSuite(suite);
}
@Override
public PgConnectOptions addEnabledSecureTransportProtocol(String protocol) {
return (PgConnectOptions)super.addEnabledSecureTransportProtocol(protocol);
}
@Override
public PgConnectOptions addCrlPath(String crlPath) throws NullPointerException {
return (PgConnectOptions)super.addCrlPath(crlPath);
}
@Override
public PgConnectOptions addCrlValue(Buffer crlValue) throws NullPointerException {
return (PgConnectOptions)super.addCrlValue(crlValue);
}
@Override
public PgConnectOptions setTrustAll(boolean trustAll) {
return (PgConnectOptions)super.setTrustAll(trustAll);
}
@Override
public PgConnectOptions setConnectTimeout(int connectTimeout) {
return (PgConnectOptions)super.setConnectTimeout(connectTimeout);
}
@Override
public PgConnectOptions setMetricsName(String metricsName) {
return (PgConnectOptions)super.setMetricsName(metricsName);
}
@Override
public PgConnectOptions setReconnectAttempts(int attempts) {
return (PgConnectOptions)super.setReconnectAttempts(attempts);
}
@Override
public PgConnectOptions setHostnameVerificationAlgorithm(String hostnameVerificationAlgorithm) {
return (PgConnectOptions)super.setHostnameVerificationAlgorithm(hostnameVerificationAlgorithm);
}
@Override
public PgConnectOptions setLogActivity(boolean logEnabled) {
return (PgConnectOptions)super.setLogActivity(logEnabled);
}
@Override
public PgConnectOptions setReconnectInterval(long interval) {
return (PgConnectOptions)super.setReconnectInterval(interval);
}
@Override
public PgConnectOptions setProxyOptions(ProxyOptions proxyOptions) {
return (PgConnectOptions)super.setProxyOptions(proxyOptions);
}
@Override
public PgConnectOptions setLocalAddress(String localAddress) {
return (PgConnectOptions)super.setLocalAddress(localAddress);
}
@Override
public PgConnectOptions setUseAlpn(boolean useAlpn) {
return (PgConnectOptions)super.setUseAlpn(useAlpn);
}
@Override
public PgConnectOptions setSslEngineOptions(SSLEngineOptions sslEngineOptions) {
return (PgConnectOptions)super.setSslEngineOptions(sslEngineOptions);
}
@Override
public PgConnectOptions setJdkSslEngineOptions(JdkSSLEngineOptions sslEngineOptions) {
return (PgConnectOptions)super.setJdkSslEngineOptions(sslEngineOptions);
}
@Override
public PgConnectOptions setOpenSslEngineOptions(OpenSSLEngineOptions sslEngineOptions) {
return (PgConnectOptions)super.setOpenSslEngineOptions(sslEngineOptions);
}
@Override
public PgConnectOptions setReusePort(boolean reusePort) {
return (PgConnectOptions) super.setReusePort(reusePort);
}
@Override
public PgConnectOptions setTcpFastOpen(boolean tcpFastOpen) {
return (PgConnectOptions) super.setTcpFastOpen(tcpFastOpen);
}
@Override
public PgConnectOptions setTcpCork(boolean tcpCork) {
return (PgConnectOptions) super.setTcpCork(tcpCork);
}
@Override
public PgConnectOptions setTcpQuickAck(boolean tcpQuickAck) {
return (PgConnectOptions) super.setTcpQuickAck(tcpQuickAck);
}
@Override
public PgConnectOptions setEnabledSecureTransportProtocols(Set<String> enabledSecureTransportProtocols) {
return (PgConnectOptions) super.setEnabledSecureTransportProtocols(enabledSecureTransportProtocols);
}
@Override
public PgConnectOptions setSslHandshakeTimeout(long sslHandshakeTimeout) {
return (PgConnectOptions) super.setSslHandshakeTimeout(sslHandshakeTimeout);
}
@Override
public PgConnectOptions setSslHandshakeTimeoutUnit(TimeUnit sslHandshakeTimeoutUnit) {
return (PgConnectOptions) super.setSslHandshakeTimeoutUnit(sslHandshakeTimeoutUnit);
}
protected void init() {
this.setHost(DEFAULT_HOST);
this.setPort(DEFAULT_PORT);
this.setUser(DEFAULT_USER);
this.setPassword(DEFAULT_PASSWORD);
this.setDatabase(DEFAULT_DATABASE);
pipeliningLimit = DEFAULT_PIPELINING_LIMIT;
sslMode = DEFAULT_SSLMODE;
this.setProperties(new HashMap<>(DEFAULT_PROPERTIES));
}
@Override
public JsonObject toJson() {
JsonObject json = super.toJson();
PgConnectOptionsConverter.toJson(this, json);
return json;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PgConnectOptions)) return false;
if (!super.equals(o)) return false;
PgConnectOptions that = (PgConnectOptions) o;
if (pipeliningLimit != that.pipeliningLimit) return false;
if (sslMode != that.sslMode) return false;
return true;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + pipeliningLimit;
result = 31 * result + sslMode.hashCode();
return result;
}
public boolean isUsingDomainSocket() {
return this.getHost().startsWith("/");
}
}