protected void setSearchPath(String schema) throws SQLException { String sql = "SET search_path TO " + quoteIdentifierString(schema); executeUpdate(sql); }
public BatchSelect newSelectCursor(PreparedQuery preparedQuery, List<ColumnGetter> getters, int fetchRows, int queryTimeout) throws SQLException { return newBatchSelect(preparedQuery, getters, fetchRows, queryTimeout); }
public String apply(ToString value) { if (value == null) { return "null"; } else { return value.toString(); } } }));
@Override public ColumnGetter newColumnGetter(JdbcInputConnection con, AbstractJdbcInputPlugin.PluginTask task, JdbcColumn column, JdbcColumnOption option) { ColumnGetter getter = super.newColumnGetter(con, task, column, option); switch (column.getTypeName()) { case "datetime": return new TimestampWithoutTimeZoneIncrementalHandler(getter); default: return getter; } }
private List<ColumnGetter> newColumnGetters(JdbcInputConnection con, PluginTask task, JdbcSchema querySchema, PageBuilder pageBuilder) throws SQLException { ColumnGetterFactory factory = newColumnGetterFactory(pageBuilder, task.getDefaultTimeZone()); ImmutableList.Builder<ColumnGetter> getters = ImmutableList.builder(); for (JdbcColumn c : querySchema.getColumns()) { JdbcColumnOption columnOption = columnOptionOf(task.getColumnOptions(), task.getDefaultColumnOptions(), c, factory.getJdbcType(c.getSqlType())); getters.add(factory.newColumnGetter(con, task, c, columnOption)); } return getters.build(); }
private static UnsupportedOperationException unsupportedOperationException(JdbcColumn column) { throw new UnsupportedOperationException( String.format(ENGLISH, "Unsupported type %s (sqlType=%d) of '%s' column. Please add '%s: {value_type: string}' to 'column_options: {...}' option to convert the values to strings, or exclude the column from 'select:' option", column.getTypeName(), column.getSqlType(), column.getName(), column.getName())); } }
@Override protected String sqlTypeToValueType(JdbcColumn column, int sqlType) { if ("json".equals(column.getTypeName())) { return "json"; } return super.sqlTypeToValueType(column, sqlType); } }
protected BatchSelect newBatchSelect(PreparedQuery preparedQuery, List<ColumnGetter> getters, int fetchRows, int queryTimeout) throws SQLException { String query = preparedQuery.getQuery(); List<JdbcLiteral> params = preparedQuery.getParameters(); PreparedStatement stmt = connection.prepareStatement(query); stmt.setFetchSize(fetchRows); stmt.setQueryTimeout(queryTimeout); logger.info("SQL: " + query); if (!params.isEmpty()) { logger.info("Parameters: {}", params); prepareParameters(stmt, getters, params); } return new SingleSelect(stmt); }
public ColumnGetter newColumnGetter(JdbcInputConnection con, PluginTask task, JdbcColumn column, JdbcColumnOption option) { return newColumnGetter(con, task, column, option, option.getValueType()); }
private void buildIncrementalOrderTo(StringBuilder sb, JdbcSchema querySchema, List<String> incrementalColumns) throws SQLException { boolean first = true; for (String incrementalColumn : incrementalColumns) { if (first) { first = false; } else { sb.append(", "); } int columnIndex = findIncrementalColumnIndex(querySchema, incrementalColumn); // the following column name is case sensitive, // so should use actual column name got by DatabaseMetaData. sb.append(quoteIdentifierString(querySchema.getColumnName(columnIndex))); } }
protected void prepareParameters(PreparedStatement stmt, List<ColumnGetter> getters, List<JdbcLiteral> parameters) throws SQLException { for (int i = 0; i < parameters.size(); i++) { JdbcLiteral literal = parameters.get(i); ColumnGetter getter = getters.get(literal.getColumnIndex()); int index = i + 1; // JDBC column index begins from 1 getter.decodeFromJsonTo(stmt, index, literal.getValue()); } }
protected JdbcSchema getSchemaOfResultMetadata(ResultSetMetaData metadata) throws SQLException { ImmutableList.Builder<JdbcColumn> columns = ImmutableList.builder(); for (int i=0; i < metadata.getColumnCount(); i++) { int index = i + 1; // JDBC column index begins from 1 String name = metadata.getColumnLabel(index); String typeName = metadata.getColumnTypeName(index); int sqlType = metadata.getColumnType(index); int scale = metadata.getScale(index); int precision = metadata.getPrecision(index); columns.add(new JdbcColumn(name, typeName, sqlType, precision, scale)); } return new JdbcSchema(columns.build()); }
public String getColumnName(int i) { return columns.get(i).getName(); }
@Override public void showDriverVersion() throws SQLException { super.showDriverVersion(); logger.warn("embulk-input-mysql 0.9.0 upgraded the bundled MySQL Connector/J version from 5.1.34 to 5.1.44 ."); logger.warn("And set useLegacyDatetimeCode=false by default in order to get correct datetime value when the server timezone and the client timezone are different."); logger.warn("Set useLegacyDatetimeCode=true if you need to get datetime value same as older embulk-input-mysql."); } }
@Override public ConfigDiff resume(TaskSource taskSource, Schema schema, int taskCount, InputPlugin.Control control) { PluginTask task = taskSource.loadTask(getTaskClass()); // TODO when parallel execution is implemented and enabled, (maybe) order_by // is necessary to resume. transaction() gets the range of order_by // colum and set it to WHERE condition to make the operation deterministic return buildNextConfigDiff(task, control.run(taskSource, schema, taskCount)); }
protected String buildTableName(String tableName) { return quoteIdentifierString(tableName); }
@Override public void close() throws SQLException { // DB2 JDBC Driver requires explicit commit/rollback before closing connection. connection.rollback(); super.close(); }
@JsonValue @Override public String toString() { return this.name().toLowerCase(); }
public JdbcInputConnection(Connection connection, String schemaName) throws SQLException { this.connection = connection; this.schemaName = schemaName; this.databaseMetaData = connection.getMetaData(); this.identifierQuoteString = databaseMetaData.getIdentifierQuoteString(); if (schemaName != null) { setSearchPath(schemaName); } connection.setAutoCommit(false); }
public JdbcSchema getSchemaOfQuery(String query) throws SQLException { PreparedStatement stmt = connection.prepareStatement(query); try { return getSchemaOfResultMetadata(stmt.getMetaData()); } finally { stmt.close(); } }