/** * Licensed to JumpMind Inc under one or more contributor * license agreements. See the NOTICE file distributed * with this work for additional information regarding * copyright ownership. JumpMind Inc licenses this file * to you under the GNU General Public License, version 3.0 (GPLv3) * (the "License"); you may not use this file except in compliance * with the License. * * You should have received a copy of the GNU General Public License, * version 3.0 (GPLv3) along with this library; if not, see * <http://www.gnu.org/licenses/>. * * 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 org.jumpmind.db.platform.redshift; import java.sql.SQLException; import java.sql.Types; import java.util.Map; import org.jumpmind.db.model.Column; import org.jumpmind.db.model.TypeMap; import org.jumpmind.db.platform.AbstractJdbcDdlReader; import org.jumpmind.db.platform.DatabaseMetaDataWrapper; import org.jumpmind.db.platform.IDatabasePlatform; public class RedshiftDdlReader extends AbstractJdbcDdlReader { public RedshiftDdlReader(IDatabasePlatform platform) { super(platform); setDefaultCatalogPattern(null); setDefaultSchemaPattern(null); setDefaultTablePattern(null); } @Override protected Column readColumn(DatabaseMetaDataWrapper metaData, Map<String,Object> values) throws SQLException { Column column = super.readColumn(metaData, values); if (column.getJdbcTypeCode() == Types.VARCHAR && column.getSizeAsInt() == 65535) { column.setJdbcTypeCode(Types.LONGVARCHAR); column.setMappedTypeCode(Types.LONGVARCHAR); column.setSize(null); } String defaultValue = column.getDefaultValue(); if ((defaultValue != null) && (defaultValue.length() > 0)) { // If the default value looks like "identity"(102643, 0, '1,1'::text) // then it is an auto-increment column if (defaultValue.startsWith("\"identity\"")) { column.setAutoIncrement(true); defaultValue = null; } else { // PostgreSQL returns default values in the forms // "-9000000000000000000::bigint" or // "'some value'::character varying" or "'2000-01-01'::date" switch (column.getMappedTypeCode()) { case Types.INTEGER: case Types.BIGINT: case Types.DECIMAL: case Types.NUMERIC: defaultValue = extractUndelimitedDefaultValue(defaultValue); break; case Types.CHAR: case Types.VARCHAR: case Types.LONGVARCHAR: case Types.DATE: case Types.TIME: case Types.TIMESTAMP: defaultValue = extractDelimitedDefaultValue(defaultValue); break; } if (TypeMap.isTextType(column.getMappedTypeCode())) { // We assume escaping via double quote (see also the // backslash_quote setting: // http://www.postgresql.org/docs/7.4/interactive/runtime-config.html#RUNTIME-CONFIG-COMPATIBLE) defaultValue = unescape(defaultValue, "'", "''"); } } column.setDefaultValue(defaultValue); } return column; } /* * Extracts the default value from a default value spec of the form * "'some value'::character varying" or "'2000-01-01'::date". * * @param defaultValue The default value spec * * @return The default value */ private String extractDelimitedDefaultValue(String defaultValue) { if (defaultValue.startsWith("'")) { int valueEnd = defaultValue.indexOf("'::"); if (valueEnd > 0) { return defaultValue.substring("'".length(), valueEnd); } } return defaultValue; } /* * Extracts the default value from a default value spec of the form * "-9000000000000000000::bigint". * * @param defaultValue The default value spec * * @return The default value */ private String extractUndelimitedDefaultValue(String defaultValue) { int valueEnd = defaultValue.indexOf("::"); if (valueEnd > 0) { defaultValue = defaultValue.substring(0, valueEnd); } else { if (defaultValue.startsWith("(") && defaultValue.endsWith(")")) { defaultValue = defaultValue.substring(1, defaultValue.length() - 1); } } return defaultValue; } }