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())); } }
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()); }
@Override protected String sqlTypeToValueType(JdbcColumn column, int sqlType) { if ("json".equals(column.getTypeName())) { return "json"; } return super.sqlTypeToValueType(column, sqlType); } }
@Override public ColumnGetter newColumnGetter(JdbcInputConnection con, PluginTask task, JdbcColumn column, JdbcColumnOption option) { if (column.getTypeName().equals("hstore") && getToType(option) == Types.JSON) { // converting hstore to json needs a special handling return new HstoreToJsonColumnGetter(to, Types.JSON); } if (column.getSqlType() == java.sql.Types.ARRAY) { return new ArrayColumnGetter(to, getToType(option)); } if ("uuid".equals(column.getTypeName())) { return new StringColumnGetter(to, getToType(option)); } ColumnGetter getter = super.newColumnGetter(con, task, column, option); // incremental loading wrapper switch (column.getTypeName()) { case "timestamptz": return new TimestampWithTimeZoneIncrementalHandler(getter); case "timestamp": return new TimestampWithoutTimeZoneIncrementalHandler(getter); default: return getter; } }
switch (column.getTypeName()) { case "DATETIME": case "TIMESTAMP": int index = task.getQuerySchema().findColumn(column.getName()).get(); if (!task.getIncremental() || !task.getIncrementalColumnIndexes().contains(index)) { return getter; if (column.getTypeName().equals("DATETIME")) { return new MySQLDateTimeTimestampIncrementalHandler(sessionTimeZone, getter);
for (int i = 0; i < querySchema.getCount(); i++) { JdbcColumn column = querySchema.getColumn(i); JdbcColumnOption columnOption = columnOptionOf(task.getColumnOptions(), task.getDefaultColumnOptions(), column, factory.getJdbcType(column.getSqlType())); columns.add(new Column(i, column.getName(), factory.newColumnGetter(con, task, column, columnOption).getToType()));
public String getColumnName(int i) { return columns.get(i).getName(); }
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(); }
@Override protected String sqlTypeToValueType(JdbcColumn column, int sqlType) { switch(column.getTypeName()) { case "json": case "jsonb": return "json"; case "hstore": case "array": // array & hstore is converted to string by default return "string"; default: return super.sqlTypeToValueType(column, sqlType); } } }
case "coalesce": return newColumnGetter(con, task, column, option, sqlTypeToValueType(column, column.getSqlType())); case "long": return new LongColumnGetter(to, toType); default: throw new ConfigException(String.format(ENGLISH, "Unknown value_type '%s' for column '%s'", option.getValueType(), column.getName()));
public Optional<Integer> findColumn(String caseInsensitiveName) { // find by case sensitive first for (int i = 0; i < columns.size(); i++) { if (getColumn(i).getName().equals(caseInsensitiveName)) { return Optional.of(i); } } // find by case insensitive for (int i = 0; i < columns.size(); i++) { if (getColumn(i).getName().equalsIgnoreCase(caseInsensitiveName)) { return Optional.of(i); } } return Optional.absent(); } }
@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 static JdbcColumnOption columnOptionOf(Map<String, JdbcColumnOption> columnOptions, Map<String, JdbcColumnOption> defaultColumnOptions, JdbcColumn targetColumn, String targetColumnSQLType) { JdbcColumnOption columnOption = columnOptions.get(targetColumn.getName()); if (columnOption == null) { String foundName = null; for (Map.Entry<String, JdbcColumnOption> entry : columnOptions.entrySet()) { if (entry.getKey().equalsIgnoreCase(targetColumn.getName())) { if (columnOption != null) { throw new ConfigException(String.format("Cannot specify column '%s' because both '%s' and '%s' exist in column_options.", targetColumn.getName(), foundName, entry.getKey())); } foundName = entry.getKey(); columnOption = entry.getValue(); } } } return Optional .fromNullable(columnOption) .or(Optional.fromNullable(defaultColumnOptions.get(targetColumnSQLType))) .or( // default column option new Supplier<JdbcColumnOption>() { public JdbcColumnOption get() { return Exec.newConfigSource().loadConfig(JdbcColumnOption.class); } }); }
JdbcColumn jsonColumn = new JdbcColumn("any_column_name", "JSON", 1, 0, 0); // 1: CHAR
@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 "DATE": return new TimestampWithoutTimeZoneIncrementalHandler(getter); case "TIMESTAMP": return new TimestampWithoutTimeZoneIncrementalHandler(getter); default: return getter; } }
@Override public ColumnGetter newColumnGetter(JdbcInputConnection con, PluginTask task, JdbcColumn column, JdbcColumnOption option) { ColumnGetter getter = super.newColumnGetter(con, task, column, option); // incremental loading wrapper switch (column.getTypeName()) { case "timestamptz": return new TimestampWithTimeZoneIncrementalHandler(getter); case "timestamp": return new TimestampWithoutTimeZoneIncrementalHandler(getter); default: return getter; } } }