/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.jdbc; import java.sql.ResultSetMetaData; import java.sql.SQLException; import org.teiid.client.metadata.ResultsMetadataConstants; import org.teiid.core.types.JDBCSQLTypeInfo; import org.teiid.designer.runtime.version.spi.ITeiidServerVersion; /** */ public class ResultSetMetaDataImpl extends WrapperImpl implements ResultSetMetaData { private MetadataProvider provider; private boolean useJDBC4ColumnNameAndLabelSemantics = true; public ResultSetMetaDataImpl(ITeiidServerVersion teiidVersion, MetadataProvider provider, String supportBackwardsCompatibility) { super(teiidVersion); this.provider = provider; if (supportBackwardsCompatibility != null) { this.useJDBC4ColumnNameAndLabelSemantics = Boolean.parseBoolean(supportBackwardsCompatibility); } } /** * Adjust from 1-based to internal 0-based representation * @param index External 1-based representation * @return Internal 0-based representation */ private int adjustColumn(int index) { return index-1; } public String getVirtualDatabaseName(int index) throws SQLException { return provider.getStringValue(adjustColumn(index), ResultsMetadataConstants.VIRTUAL_DATABASE_NAME); } public String getVirtualDatabaseVersion(int index) throws SQLException { return provider.getStringValue(adjustColumn(index), ResultsMetadataConstants.VIRTUAL_DATABASE_VERSION); } public int getColumnCount() throws SQLException { return provider.getColumnCount(); } public boolean isAutoIncrement(int index) throws SQLException { return provider.getBooleanValue(adjustColumn(index), ResultsMetadataConstants.AUTO_INCREMENTING); } public boolean isCaseSensitive(int index) throws SQLException { return provider.getBooleanValue(adjustColumn(index), ResultsMetadataConstants.CASE_SENSITIVE); } public boolean isSearchable(int index) throws SQLException { Integer searchable = (Integer) provider.getValue(adjustColumn(index), ResultsMetadataConstants.SEARCHABLE); return !(ResultsMetadataConstants.SEARCH_TYPES.UNSEARCHABLE.equals(searchable)); } public boolean isCurrency(int index) throws SQLException { return provider.getBooleanValue(adjustColumn(index), ResultsMetadataConstants.CURRENCY); } public int isNullable(int index) throws SQLException { Object nullable = provider.getValue(adjustColumn(index), ResultsMetadataConstants.NULLABLE); if(nullable.equals(ResultsMetadataConstants.NULL_TYPES.NULLABLE)) { return columnNullable; } else if(nullable.equals(ResultsMetadataConstants.NULL_TYPES.NOT_NULL)) { return columnNoNulls; } else { return columnNullableUnknown; } } public boolean isSigned(int index) throws SQLException { return provider.getBooleanValue(adjustColumn(index), ResultsMetadataConstants.SIGNED); } public int getColumnDisplaySize(int index) throws SQLException { return provider.getIntValue(adjustColumn(index), ResultsMetadataConstants.DISPLAY_SIZE, Integer.MAX_VALUE); } public String getColumnLabel(int index) throws SQLException { String result = provider.getStringValue(adjustColumn(index), ResultsMetadataConstants.ELEMENT_LABEL); if (result != null) { return result; } return getColumnName(index); } public String getColumnName(int index) throws SQLException { if (!useJDBC4ColumnNameAndLabelSemantics) { String result = provider.getStringValue(adjustColumn(index), ResultsMetadataConstants.ELEMENT_LABEL); if (result != null) { return result; } } return provider.getStringValue(adjustColumn(index), ResultsMetadataConstants.ELEMENT_NAME); } public String getSchemaName(int index) throws SQLException { String name = provider.getStringValue(adjustColumn(index), ResultsMetadataConstants.GROUP_NAME); if (name != null) { int dotIndex = name.indexOf('.'); if (dotIndex != -1) { return name.substring(0, dotIndex); } } return null; } public int getPrecision(int index) throws SQLException { return provider.getIntValue(adjustColumn(index), ResultsMetadataConstants.PRECISION); } public int getScale(int index) throws SQLException { return provider.getIntValue(adjustColumn(index), ResultsMetadataConstants.SCALE); } public String getTableName(int index) throws SQLException { String name = provider.getStringValue(adjustColumn(index), ResultsMetadataConstants.GROUP_NAME); if (name != null) { int dotIndex = name.indexOf('.'); if (dotIndex != -1) { return name.substring(dotIndex + 1); } } return name; } public String getCatalogName(int index) throws SQLException { return provider.getStringValue(adjustColumn(index), ResultsMetadataConstants.VIRTUAL_DATABASE_NAME); } public int getColumnType(int index) throws SQLException { String runtimeTypeName = getColumnTypeName(index); return JDBCSQLTypeInfo.getSQLType(getTeiidVersion(), runtimeTypeName); } public String getColumnTypeName(int index) throws SQLException { return provider.getStringValue(adjustColumn(index), ResultsMetadataConstants.DATA_TYPE); } public boolean isReadOnly(int index) throws SQLException { return ! provider.getBooleanValue(adjustColumn(index), ResultsMetadataConstants.WRITABLE); } public boolean isWritable(int index) throws SQLException { return provider.getBooleanValue(adjustColumn(index), ResultsMetadataConstants.WRITABLE); } public boolean isDefinitelyWritable(int index) throws SQLException { return provider.getBooleanValue(adjustColumn(index), ResultsMetadataConstants.WRITABLE); } public String getColumnClassName(int index) throws SQLException { return JDBCSQLTypeInfo.getJavaClassName(getTeiidVersion(), getColumnType(index)); } }