// jTDS JDBC Driver for Microsoft SQL Server and Sybase
// Copyright (C) 2004 The jTDS Project
//
// 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
package net.sourceforge.jtds.jdbc;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
* jTDS implementation of the java.sql.ResultSetMetaData interface.
* <p>
* Implementation notes:
* <ol>
* <li>New simple implementation required by the new column info structure.
* <li>Unlike the equivalent in the older jTDS, this version is generic and does
* not need to know details of the TDS protocol.
* </ol>
*
* @author Mike Hutchinson
* @version $Id: JtdsResultSetMetaData.java,v 1.9.2.3 2009-12-30 08:45:34 ickzon Exp $
*/
public class JtdsResultSetMetaData implements ResultSetMetaData {
private final ColInfo[] columns;
private final int columnCount;
private final boolean useLOBs;
/**
* Construct ResultSetMetaData object over the current ColInfo array.
*
* @param columns The current ColInfo row descriptor array.
* @param columnCount The number of visible columns.
*/
JtdsResultSetMetaData(ColInfo[] columns, int columnCount, boolean useLOBs) {
this.columns = columns;
this.columnCount = columnCount;
this.useLOBs = useLOBs;
}
/**
* Return the column descriptor given a column index.
*
* @param column The column index (from 1 .. n).
* @return The column descriptor as a <code>ColInfo<code>.
* @throws SQLException
*/
ColInfo getColumn(int column) throws SQLException {
if (column < 1 || column > columnCount) {
throw new SQLException(
Messages.get("error.resultset.colindex",
Integer.toString(column)), "07009");
}
return columns[column - 1];
}
// ------ java.sql.ResultSetMetaData methods follow -------
public int getColumnCount() throws SQLException {
return this.columnCount;
}
public int getColumnDisplaySize(int column) throws SQLException {
return getColumn(column).displaySize;
}
public int getColumnType(int column) throws SQLException {
if (useLOBs) {
return getColumn(column).jdbcType;
} else {
return Support.convertLOBType(getColumn(column).jdbcType);
}
}
public int getPrecision(int column) throws SQLException {
return getColumn(column).precision;
}
public int getScale(int column) throws SQLException {
return getColumn(column).scale;
}
public int isNullable(int column) throws SQLException {
return getColumn(column).nullable;
}
public boolean isAutoIncrement(int column) throws SQLException {
return getColumn(column).isIdentity;
}
public boolean isCaseSensitive(int column) throws SQLException {
return getColumn(column).isCaseSensitive;
}
public boolean isCurrency(int column) throws SQLException {
return TdsData.isCurrency(getColumn(column));
}
public boolean isDefinitelyWritable(int column) throws SQLException {
getColumn(column);
return false;
}
public boolean isReadOnly(int column) throws SQLException {
return !getColumn(column).isWriteable;
}
public boolean isSearchable(int column) throws SQLException {
return TdsData.isSearchable(getColumn(column));
}
public boolean isSigned(int column) throws SQLException {
return TdsData.isSigned(getColumn(column));
}
public boolean isWritable(int column) throws SQLException {
return getColumn(column).isWriteable;
}
public String getCatalogName(int column) throws SQLException {
ColInfo col = getColumn(column);
return (col.catalog == null) ? "" : col.catalog;
}
public String getColumnClassName(int column) throws SQLException {
String c = Support.getClassName(getColumnType(column));
if (!useLOBs) {
if ("java.sql.Clob".equals(c)) {
return "java.lang.String";
}
if ("java.sql.Blob".equals(c)) {
return "[B";
}
}
return c;
}
public String getColumnLabel(int column) throws SQLException {
return getColumn(column).name;
}
public String getColumnName(int column) throws SQLException {
return getColumn(column).name;
}
public String getColumnTypeName(int column) throws SQLException {
return getColumn(column).sqlType;
}
public String getSchemaName(int column) throws SQLException {
ColInfo col = getColumn(column);
return (col.schema == null) ? "" : col.schema;
}
public String getTableName(int column) throws SQLException {
ColInfo col = getColumn(column);
return (col.tableName == null) ? "" : col.tableName;
}
/////// JDBC4 demarcation, do NOT put any JDBC3 code below this line ///////
/* (non-Javadoc)
* @see java.sql.Wrapper#isWrapperFor(java.lang.Class)
*/
public boolean isWrapperFor(Class arg0) throws SQLException {
// TODO Auto-generated method stub
throw new AbstractMethodError();
}
/* (non-Javadoc)
* @see java.sql.Wrapper#unwrap(java.lang.Class)
*/
public Object unwrap(Class arg0) throws SQLException {
// TODO Auto-generated method stub
throw new AbstractMethodError();
}
}