/*
* Copyright (c) 2004, 2005, 2006 TADA AB - Taby Sweden
* Copyright (c) 2010, 2011 PostgreSQL Global Development Group
*
* Distributed under the terms shown in the file COPYRIGHT
* found in the root folder of this project or at
* http://wiki.tada.se/index.php?title=PLJava_License
*/
package org.postgresql.pljava.jdbc;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import org.postgresql.pljava.internal.Oid;
import org.postgresql.pljava.internal.TupleDesc;
/**
* Implementation of ResultSetMetaData for SPIResultSet
*
* @author Filip Hrbek
*/
public class SPIResultSetMetaData extends AbstractResultSetMetaData
{
private final TupleDesc m_tupleDesc;
/**
* Constructor.
* @param tupleDesc The descriptor for the ResultSet tuples
*/
public SPIResultSetMetaData(TupleDesc tupleDesc)
{
super();
m_tupleDesc = tupleDesc;
}
/**
* Returns the number of columns in this <code>ResultSet</code> object.
*
* @return the number of columns
* @exception SQLException if a database access error occurs
*/
public final int getColumnCount() throws SQLException
{
return m_tupleDesc.size();
}
/**
* Indicates whether the designated column is automatically numbered, thus read-only.
*
* @param column the first column is 1, the second is 2, ...
* @return <code>true</code> if so; <code>false</code> otherwise
* @exception SQLException if a database access error occurs
*/
public final boolean isAutoIncrement(int column) throws SQLException
{
checkColumnIndex(column);
//Could SPIResultSet detect autoincrement columns???
return false;
}
/**
* Gets the designated column's suggested title for use in printouts and
* displays.
*
* @param column the first column is 1, the second is 2, ...
* @return the suggested column title
* @exception SQLException if a database access error occurs
*/
public final String getColumnLabel(int column) throws SQLException
{
checkColumnIndex(column);
return m_tupleDesc.getColumnName(column).toUpperCase();
}
//--------------------------JDBC 2.0-----------------------------------
/**
* <p>Returns the fully-qualified name of the Java class whose instances
* are manufactured if the method <code>ResultSet.getObject</code>
* is called to retrieve a value
* from the column. <code>ResultSet.getObject</code> may return a subclass of the
* class returned by this method.
*
* @param column the first column is 1, the second is 2, ...
* @return the fully-qualified name of the class in the Java programming
* language that would be used by the method
* <code>ResultSet.getObject</code> to retrieve the value in the specified
* column. This is the class name used for custom mapping.
* @exception SQLException if a database access error occurs
* @since 1.2
*/
public final String getColumnClassName(int column) throws SQLException
{
checkColumnIndex(column);
return this.getOid(column).getJavaClass().getName();
}
/**
* Checks if the column index is valid.
*
* @param column the first column is 1, the second is 2, ...
* @exception SQLException if the column is out of index bounds
*/
protected final void checkColumnIndex(int column) throws SQLException
{
if (column < 1 || column > m_tupleDesc.size())
{
throw new SQLException("Invalid column index: " + column);
}
}
/**
* Gets column OID
* @param column Column index
* @return column OID
* @throws SQLException if an error occurs
*/
protected final Oid getOid(int column) throws SQLException
{
return m_tupleDesc.getOid(column);
}
/**
* Gets column length. This method is called if the AbstractResultSet does not
* know how to get column length according to type OID.
* We retutn 0 because we don't know the proper length either.
* @param column Column index
* @return column length
* @throws SQLException if an error occurs
*/
protected final int getFieldLength(int column) throws SQLException
{
return 0;
}
// ************************************************************
// Non-implementation of JDBC 4 methods.
// ************************************************************
public boolean isWrapperFor(Class<?> iface)
throws SQLException
{
throw new SQLFeatureNotSupportedException
( this.getClass()
+ ".isWrapperFor( Class<?> ) not implemented yet.",
"0A000" );
}
public <T> T unwrap(Class<T> iface)
throws SQLException
{
throw new SQLFeatureNotSupportedException
( this.getClass()
+ ".unwrapClass( Class<T> ) not implemented yet.",
"0A000" );
}
}