/* * 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.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import org.postgresql.pljava.internal.TupleDesc; /** * A single row ResultSet * * @author Thomas Hallgren */ public abstract class SingleRowResultSet extends ObjectResultSet { public int getConcurrency() throws SQLException { return CONCUR_UPDATABLE; } public int findColumn(String columnName) throws SQLException { return this.getTupleDesc().getColumnIndex(columnName); } public int getFetchDirection() throws SQLException { return FETCH_FORWARD; } public int getFetchSize() throws SQLException { return 1; } /** * Returns the metadata for this result set. */ public ResultSetMetaData getMetaData() throws SQLException { return new SPIResultSetMetaData(this.getTupleDesc()); } public int getRow() throws SQLException { return 1; } public int getType() throws SQLException { return TYPE_FORWARD_ONLY; } /** * Cursor positoning is not implemented. * @throws SQLException indicating that this feature is not supported. */ public void afterLast() throws SQLException { throw new UnsupportedFeatureException("Cursor positioning"); } /** * Cursor positoning is not implemented. * @throws SQLException indicating that this feature is not supported. */ public void beforeFirst() throws SQLException { throw new UnsupportedFeatureException("Cursor positioning"); } /** * Cursor positioning is not implemented. * @throws SQLException indicating that this feature is not supported. */ public boolean first() throws SQLException { throw new UnsupportedFeatureException("Cursor positioning"); } /** * Returns <code>false</code>. */ public boolean isAfterLast() throws SQLException { return false; } /** * Will always return <code>false</code> since a <code>SingleRowWriter * </code> starts on the one and only row. */ public boolean isBeforeFirst() throws SQLException { return false; } /** * Returns <code>true</code>. */ public boolean isFirst() throws SQLException { return true; } /** * Returns <code>true</code>. */ public boolean isLast() throws SQLException { return true; } /** * Cursor positioning is not implemented. * @throws SQLException indicating that this feature is not supported. */ public boolean last() throws SQLException { throw new UnsupportedFeatureException("Cursor positioning"); } /** * This method will always return <code> false</code> but it will not change * the state of the <code>ResultSet</code>. */ public boolean next() throws SQLException { return false; } /** * This method will always return <code> false</code> but it will not change * the state of the <code>ResultSet</code>. */ public boolean previous() throws SQLException { return false; } /** * Only {@link java.sql.ResultSet#FETCH_FORWARD} is supported. * @throws SQLException indicating that this feature is not supported * for other values on <code>direction</code>. */ public void setFetchDirection(int direction) throws SQLException { if(direction != FETCH_FORWARD) throw new UnsupportedFeatureException("Non forward fetch direction"); } /** * Only permitted value for <code>fetchSize</code> is 1. */ public void setFetchSize(int fetchSize) throws SQLException { if(fetchSize != 1) throw new IllegalArgumentException("Illegal fetch size for single row set"); } /** * Cursor positioning is not supported. * @throws SQLException indicating that this feature is not supported. */ public boolean absolute(int row) throws SQLException { throw new UnsupportedFeatureException("Cursor positioning"); } /** * Cursor positioning is not supported. * @throws SQLException indicating that this feature is not supported. */ public boolean relative(int rows) throws SQLException { throw new UnsupportedFeatureException("Cursor positioning"); } /** * This feature is not supported. * @throws SQLException indicating that this feature is not supported. */ public void deleteRow() throws SQLException { throw new UnsupportedFeatureException("Deletes not supported on single row set"); } /** * This feature is not supported. * @throws SQLException indicating that this feature is not supported. */ public void insertRow() throws SQLException { throw new UnsupportedFeatureException("Inserts not supported on single row set"); } /** * This is a no-op since the <code>moveToInsertRow()</code> method is * unsupported. */ public void moveToCurrentRow() throws SQLException { } /** * This feature is not supported on a <code>SingleRowWriter</code>. * @throws SQLException indicating that this feature is not supported. */ public void moveToInsertRow() throws SQLException { throw new UnsupportedFeatureException("Inserts not supported on single row set"); } /** * This is a noop. */ public void updateRow() throws SQLException { } /** * Will always return false. */ public boolean rowDeleted() throws SQLException { return false; } /** * Will always return false. */ public boolean rowInserted() throws SQLException { return false; } /** * The scale is not really supported. This method just strips it off and * calls {@link #updateObject(int, Object)} */ public void updateObject(int columnIndex, Object x, int scale) throws SQLException { // Simply drop the scale. // this.updateObject(columnIndex, x); } // ************************************************************ // Implementation of JDBC 4 methods. // ************************************************************ /** * Returns {@link ResultSet#CLOSE_CURSORS_AT_COMMIT}. Cursors * are actually closed when a function returns to SQL. */ public int getHoldability() { return ResultSet.CLOSE_CURSORS_AT_COMMIT; } // ************************************************************ // End of implementation of JDBC 4 methods. // ************************************************************ protected abstract TupleDesc getTupleDesc() throws SQLException; }