/* * Copyright (c) 2004, 2005, 2006 TADA AB - Taby Sweden * Copyright (c) 2010 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.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.Date; import java.sql.Ref; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Time; import java.sql.Timestamp; import java.math.BigDecimal; import java.net.URL; import java.util.Calendar; import java.util.Map; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; /** * @author Thomas Hallgren */ public abstract class ObjectResultSet extends AbstractResultSet { private boolean m_wasNull = false; /** * This is a noop since warnings are not supported. */ public void clearWarnings() throws SQLException { } public Array getArray(int columnIndex) throws SQLException { return (Array)this.getValue(columnIndex, Array.class); } public InputStream getAsciiStream(int columnIndex) throws SQLException { Clob c = this.getClob(columnIndex); return (c == null) ? null : c.getAsciiStream(); } public BigDecimal getBigDecimal(int columnIndex) throws SQLException { return (BigDecimal)this.getValue(columnIndex, BigDecimal.class); } /** * @deprecated */ public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException { throw new UnsupportedFeatureException("getBigDecimal(int, int)"); } public InputStream getBinaryStream(int columnIndex) throws SQLException { Blob b = this.getBlob(columnIndex); return (b == null) ? null : b.getBinaryStream(); } public Blob getBlob(int columnIndex) throws SQLException { byte[] bytes = this.getBytes(columnIndex); return (bytes == null) ? null : new BlobValue(bytes); } public boolean getBoolean(int columnIndex) throws SQLException { Boolean b = (Boolean)this.getValue(columnIndex, Boolean.class); return (b == null) ? false : b.booleanValue(); } public byte getByte(int columnIndex) throws SQLException { Number b = this.getNumber(columnIndex, byte.class); return (b == null) ? 0 : b.byteValue(); } public byte[] getBytes(int columnIndex) throws SQLException { return (byte[])this.getValue(columnIndex, byte[].class); } public Reader getCharacterStream(int columnIndex) throws SQLException { Clob c = this.getClob(columnIndex); return (c == null) ? null : c.getCharacterStream(); } public Clob getClob(int columnIndex) throws SQLException { String str = this.getString(columnIndex); return (str == null) ? null : new ClobValue(str); } public Date getDate(int columnIndex) throws SQLException { return (Date)this.getValue(columnIndex, Date.class); } public Date getDate(int columnIndex, Calendar cal) throws SQLException { return (Date)this.getValue(columnIndex, Date.class, cal); } public double getDouble(int columnIndex) throws SQLException { Number d = this.getNumber(columnIndex, double.class); return (d == null) ? 0 : d.doubleValue(); } public float getFloat(int columnIndex) throws SQLException { Number f = this.getNumber(columnIndex, float.class); return (f == null) ? 0 : f.floatValue(); } public int getInt(int columnIndex) throws SQLException { Number i = this.getNumber(columnIndex, int.class); return (i == null) ? 0 : i.intValue(); } public long getLong(int columnIndex) throws SQLException { Number l = this.getNumber(columnIndex, long.class); return (l == null) ? 0 : l.longValue(); } /** * ResultSetMetaData is not yet supported. * @throws SQLException indicating that this feature is not supported. */ public ResultSetMetaData getMetaData() throws SQLException { throw new UnsupportedFeatureException("ResultSet meta data is not yet implemented"); } public final Object getObject(int columnIndex) throws SQLException { Object value = this.getObjectValue(columnIndex); m_wasNull = (value == null); return value; } public final Object getObject(int columnIndex, Map map) throws SQLException { Object value = this.getObjectValue(columnIndex, map); m_wasNull = (value == null); return value; } public Ref getRef(int columnIndex) throws SQLException { return (Ref)this.getValue(columnIndex, Ref.class); } public short getShort(int columnIndex) throws SQLException { Number s = this.getNumber(columnIndex, short.class); return (s == null) ? 0 : s.shortValue(); } public String getString(int columnIndex) throws SQLException { return (String)this.getValue(columnIndex, String.class); } public Time getTime(int columnIndex) throws SQLException { return (Time)this.getValue(columnIndex, Time.class); } public Time getTime(int columnIndex, Calendar cal) throws SQLException { return (Time)this.getValue(columnIndex, Time.class, cal); } public Timestamp getTimestamp(int columnIndex) throws SQLException { return (Timestamp)this.getValue(columnIndex, Timestamp.class); } public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { return (Timestamp)this.getValue(columnIndex, Timestamp.class, cal); } /** * @deprecated */ public InputStream getUnicodeStream(int columnIndex) throws SQLException { throw new UnsupportedFeatureException("ResultSet.getUnicodeStream"); } public URL getURL(int columnIndex) throws SQLException { return (URL)this.getValue(columnIndex, URL.class); } public SQLWarning getWarnings() throws SQLException { return null; } /** * Refresh row is not yet implemented. * @throws SQLException indicating that this feature is not supported. */ public void refreshRow() throws SQLException { throw new UnsupportedFeatureException("Refresh row"); } public void updateArray(int columnIndex, Array x) throws SQLException { this.updateObject(columnIndex, x); } public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException { try { this.updateObject(columnIndex, new ClobValue(new InputStreamReader(x, "US-ASCII"), length)); } catch(UnsupportedEncodingException e) { throw new SQLException("US-ASCII encoding is not supported by this JVM"); } } public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException { this.updateObject(columnIndex, x); } public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException { this.updateBlob(columnIndex, (Blob) new BlobValue(x, length)); } public void updateBlob(int columnIndex, Blob x) throws SQLException { this.updateObject(columnIndex, x); } public void updateBoolean(int columnIndex, boolean x) throws SQLException { this.updateObject(columnIndex, x ? Boolean.TRUE : Boolean.FALSE); } public void updateByte(int columnIndex, byte x) throws SQLException { this.updateObject(columnIndex, new Byte(x)); } public void updateBytes(int columnIndex, byte[] x) throws SQLException { this.updateObject(columnIndex, x); } public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException { this.updateClob(columnIndex, (Clob) new ClobValue(x, length)); } public void updateClob(int columnIndex, Clob x) throws SQLException { this.updateObject(columnIndex, x); } public void updateDate(int columnIndex, Date x) throws SQLException { this.updateObject(columnIndex, x); } public void updateDouble(int columnIndex, double x) throws SQLException { this.updateObject(columnIndex, new Double(x)); } public void updateFloat(int columnIndex, float x) throws SQLException { this.updateObject(columnIndex, new Float(x)); } public void updateInt(int columnIndex, int x) throws SQLException { this.updateObject(columnIndex, new Integer(x)); } public void updateLong(int columnIndex, long x) throws SQLException { this.updateObject(columnIndex, new Long(x)); } public void updateNull(int columnIndex) throws SQLException { this.updateObject(columnIndex, null); } public void updateRef(int columnIndex, Ref x) throws SQLException { this.updateObject(columnIndex, x); } public void updateShort(int columnIndex, short x) throws SQLException { this.updateObject(columnIndex, new Short(x)); } public void updateString(int columnIndex, String x) throws SQLException { this.updateObject(columnIndex, x); } public void updateTime(int columnIndex, Time x) throws SQLException { this.updateObject(columnIndex, x); } public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException { this.updateObject(columnIndex, x); } public boolean wasNull() { return m_wasNull; } protected final Number getNumber(int columnIndex, Class cls) throws SQLException { Object value = this.getObjectValue(columnIndex); m_wasNull = (value == null); return SPIConnection.basicNumericCoersion(cls, value); } protected final Object getValue(int columnIndex, Class cls) throws SQLException { return SPIConnection.basicCoersion(cls, this.getObject(columnIndex)); } protected Object getValue(int columnIndex, Class cls, Calendar cal) throws SQLException { return SPIConnection.basicCalendricalCoersion(cls, this.getObject(columnIndex), cal); } protected Object getObjectValue(int columnIndex, Map typeMap) throws SQLException { if(typeMap == null) return this.getObjectValue(columnIndex); throw new UnsupportedFeatureException("Obtaining values using explicit Map"); } protected abstract Object getObjectValue(int columnIndex) throws SQLException; }