org.embulk.input.redshift.RedshiftInputPlugin Maven / Gradle / Ivy
package org.embulk.input.redshift;
import java.util.Optional;
import java.util.Properties;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.time.ZoneId;
import org.embulk.input.jdbc.AbstractJdbcInputPlugin;
import org.embulk.input.jdbc.getter.ColumnGetterFactory;
import org.embulk.input.postgresql.PostgreSQLInputConnection;
import org.embulk.input.redshift.getter.RedshiftColumnGetterFactory;
import org.embulk.spi.PageBuilder;
import org.embulk.util.config.Config;
import org.embulk.util.config.ConfigDefault;
public class RedshiftInputPlugin
extends AbstractJdbcInputPlugin
{
private static final Driver driver = new org.postgresql.Driver();
public interface RedshiftPluginTask
extends PluginTask
{
@Config("host")
public String getHost();
@Config("port")
@ConfigDefault("5439")
public int getPort();
@Config("user")
public String getUser();
@Config("password")
@ConfigDefault("\"\"")
public String getPassword();
@Config("database")
public String getDatabase();
@Config("schema")
@ConfigDefault("\"public\"")
public String getSchema();
@Config("ssl")
@ConfigDefault("false")
public boolean getSsl();
@Config("statement_timeout_millis")
@ConfigDefault("null")
public Optional getStatementTimeoutMillis();
}
@Override
protected Class extends PluginTask> getTaskClass()
{
return RedshiftPluginTask.class;
}
@Override
protected PostgreSQLInputConnection newConnection(PluginTask task) throws SQLException
{
RedshiftPluginTask t = (RedshiftPluginTask) task;
String url = String.format("jdbc:postgresql://%s:%d/%s",
t.getHost(), t.getPort(), t.getDatabase());
Properties props = new Properties();
props.setProperty("user", t.getUser());
props.setProperty("password", t.getPassword());
props.setProperty("loginTimeout", String.valueOf(t.getConnectTimeout())); // seconds
props.setProperty("socketTimeout", String.valueOf(t.getSocketTimeout())); // seconds
// Enable keepalive based on tcp_keepalive_time, tcp_keepalive_intvl and tcp_keepalive_probes kernel parameters.
// Socket options TCP_KEEPCNT, TCP_KEEPIDLE, and TCP_KEEPINTVL are not configurable.
props.setProperty("tcpKeepAlive", "true");
if (t.getSsl()) {
// TODO add ssl_verify (boolean) option to allow users to verify certification.
// see embulk-input-ftp for SSL implementation.
props.setProperty("ssl", "true");
props.setProperty("sslfactory", "org.postgresql.ssl.NonValidatingFactory"); // disable server-side validation
}
// setting ssl=false enables SSL. See org.postgresql.core.v3.openConnectionImpl.
props.putAll(t.getOptions());
logConnectionProperties(url, props);
Connection con = driver.connect(url, props);
try {
PostgreSQLInputConnection c = new PostgreSQLInputConnection(con, t.getSchema(), t.getStatementTimeoutMillis());
con = null;
return c;
} finally {
if (con != null) {
con.close();
}
}
}
@Override
protected ColumnGetterFactory newColumnGetterFactory(final PageBuilder pageBuilder, final ZoneId dateTimeZone)
{
return new RedshiftColumnGetterFactory(pageBuilder, dateTimeZone);
}
}