/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.modelgenerator.xml.model; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.MalformedURLException; import java.net.URL; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; import java.sql.Date; import java.sql.NClob; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.RowId; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.sql.SQLWarning; import java.sql.SQLXML; import java.sql.Statement; import java.sql.Struct; import java.sql.Time; import java.sql.Timestamp; import java.sql.Types; import java.text.DateFormat; import java.text.ParseException; import java.util.Calendar; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import org.teiid.designer.modelgenerator.xml.XmlImporterUiPlugin; /** * @since 8.0 */ public class MapResultSet implements ResultSet { List values; // a list of lists Map names; // mapping names to indexes String[] reverseNames; // mapping indexes to names; int row; boolean wasNull; MetaData metaData; public MapResultSet( List values, Map names ) { super(); this.values = Collections.unmodifiableList(values); this.names = names; reverseNames = new String[names.size() + 1]; for (Iterator iter = names.keySet().iterator(); iter.hasNext();) { Object o = iter.next(); String name = (String)o; Number n = (Number)names.get(name); int column = n.intValue(); reverseNames[column] = name; } row = -1; wasNull = false; metaData = new MetaData(); } /** * @see java.sql.ResultSet#getConcurrency() */ @Override public int getConcurrency() { return CONCUR_READ_ONLY; } /** * @see java.sql.ResultSet#getFetchDirection() */ @Override public int getFetchDirection() { return FETCH_FORWARD; } /** * @see java.sql.ResultSet#getFetchSize() */ @Override public int getFetchSize() { return 1; } /** * @see java.sql.ResultSet#getRow() */ @Override public int getRow() { return row + 1; } /** * @see java.sql.ResultSet#getType() */ @Override public int getType() { return TYPE_FORWARD_ONLY; } /** * @see java.sql.ResultSet#afterLast() */ @Override public void afterLast() { row = values.size(); } /** * @see java.sql.ResultSet#beforeFirst() */ @Override public void beforeFirst() { row = -1; } /** * @see java.sql.ResultSet#cancelRowUpdates() */ @Override public void cancelRowUpdates() { } /** * @see java.sql.ResultSet#clearWarnings() */ @Override public void clearWarnings() { } /** * @see java.sql.ResultSet#close() */ @Override public void close() { } /** * @see java.sql.ResultSet#deleteRow() */ @Override public void deleteRow() throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#insertRow() */ @Override public void insertRow() throws SQLException { throwReadOnly(); } private void throwReadOnly() throws SQLException { throw new SQLException(XmlImporterUiPlugin.getDefault().getPluginUtil().getString("MapResultSet.readOnly")); //$NON-NLS-1$ } private void throwNotImplemented() throws SQLException { throw new SQLException(XmlImporterUiPlugin.getDefault().getPluginUtil().getString("MapResultSet.notImplemented")); //$NON-NLS-1$ } /** * @see java.sql.ResultSet#moveToCurrentRow() */ @Override public void moveToCurrentRow() { } /** * @see java.sql.ResultSet#moveToInsertRow() */ @Override public void moveToInsertRow() throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#refreshRow() */ @Override public void refreshRow() throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateRow() */ @Override public void updateRow() throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#first() */ @Override public boolean first() { row = 0; return values.size() > 0; } /** * @see java.sql.ResultSet#isAfterLast() */ @Override public boolean isAfterLast() { return row >= values.size(); } /** * @see java.sql.ResultSet#isBeforeFirst() */ @Override public boolean isBeforeFirst() { return row < 0; } /** * @see java.sql.ResultSet#isFirst() */ @Override public boolean isFirst() { return row == 0; } /** * @see java.sql.ResultSet#isLast() */ @Override public boolean isLast() { return row == values.size() - 1; } /** * @see java.sql.ResultSet#last() */ @Override public boolean last() { row = values.size() - 1; return values.size() > 0; } /** * @see java.sql.ResultSet#next() */ @Override public boolean next() { ++row; return !isAfterLast(); } /** * @see java.sql.ResultSet#previous() */ @Override public boolean previous() { ++row; return !isBeforeFirst(); } /** * @see java.sql.ResultSet#rowDeleted() */ @Override public boolean rowDeleted() { return false; } /** * @see java.sql.ResultSet#rowInserted() */ @Override public boolean rowInserted() { return false; } /** * @see java.sql.ResultSet#rowUpdated() */ @Override public boolean rowUpdated() { return false; } /** * @see java.sql.ResultSet#wasNull() */ @Override public boolean wasNull() { return wasNull; } /** * @see java.sql.ResultSet#getByte(int) */ @Override public byte getByte( int columnIndex ) { String str = getString(columnIndex); wasNull = (str == null); if (wasNull) { return 0; } return new Byte(str).byteValue(); } /** * @see java.sql.ResultSet#getDouble(int) */ @Override public double getDouble( int columnIndex ) { String str = getString(columnIndex); wasNull = (str == null); if (wasNull) { return 0; } return new Double(str).doubleValue(); } /** * @see java.sql.ResultSet#getFloat(int) */ @Override public float getFloat( int columnIndex ) { String str = getString(columnIndex); wasNull = (str == null); if (wasNull) { return 0; } return new Float(str).floatValue(); } /** * @see java.sql.ResultSet#getInt(int) */ @Override public int getInt( int columnIndex ) { String str = getString(columnIndex); wasNull = (str == null); if (wasNull) { return 0; } return new Integer(str).intValue(); } /** * @see java.sql.ResultSet#getLong(int) */ @Override public long getLong( int columnIndex ) { String str = getString(columnIndex); wasNull = (str == null); if (wasNull) { return 0; } return new Long(str).longValue(); } /** * @see java.sql.ResultSet#getShort(int) */ @Override public short getShort( int columnIndex ) { String str = getString(columnIndex); wasNull = (str == null); if (wasNull) { return 0; } return new Short(str).shortValue(); } /** * @see java.sql.ResultSet#setFetchDirection(int) */ @Override public void setFetchDirection( int direction ) { } /** * @see java.sql.ResultSet#setFetchSize(int) */ @Override public void setFetchSize( int rows ) { } /** * @see java.sql.ResultSet#updateNull(int) */ @Override public void updateNull( int columnIndex ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#absolute(int) */ @Override public boolean absolute( int row ) { if (row > 0) { this.row = row - 1; } else { this.row = values.size() + row; } return !isBeforeFirst() && !isAfterLast(); } /** * @see java.sql.ResultSet#getBoolean(int) */ @Override public boolean getBoolean( int columnIndex ) { String str = getString(columnIndex); wasNull = (str == null); if (wasNull) { return false; } return new Boolean(str).booleanValue(); } /** * @see java.sql.ResultSet#relative(int) */ @Override public boolean relative( int rows ) { this.row += rows; return !isBeforeFirst() && !isAfterLast(); } /** * @see java.sql.ResultSet#getBytes(int) */ @Override public byte[] getBytes( int columnIndex ) { Object o = getObject(columnIndex); wasNull = (o == null); if (o instanceof byte[]) { return (byte[])o; } if (wasNull) { return new byte[0]; } return o.toString().getBytes(); } /** * @see java.sql.ResultSet#updateByte(int, byte) */ @Override public void updateByte( int columnIndex, byte x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateDouble(int, double) */ @Override public void updateDouble( int columnIndex, double x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateFloat(int, float) */ @Override public void updateFloat( int columnIndex, float x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateInt(int, int) */ @Override public void updateInt( int columnIndex, int x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateLong(int, long) */ @Override public void updateLong( int columnIndex, long x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateShort(int, short) */ @Override public void updateShort( int columnIndex, short x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateBoolean(int, boolean) */ @Override public void updateBoolean( int columnIndex, boolean x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateBytes(int, byte[]) */ @Override public void updateBytes( int columnIndex, byte[] x ) throws SQLException { throwReadOnly(); } static class ReaderInputStream extends InputStream { // Why on earth is there not a built in class to do this? private Reader reader; private static final String ASCII = "US-ASCII"; //$NON-NLS-1$ private static final String UNICODE = "UTF16"; //$NON-NLS-1$ private String charset; private byte[] buffer; public ReaderInputStream( Reader reader, String charset ) { super(); this.reader = reader; this.charset = charset; buffer = new byte[0]; } // implement the read() method to make this all work @Override public int read() throws IOException { if (buffer.length > 0) { int retval = buffer[0]; byte[] newBytes = new byte[buffer.length - 1]; System.arraycopy(buffer, 1, newBytes, 0, newBytes.length); buffer = newBytes; return retval; } int t = reader.read(); if (t <= 0) { return t; } buffer = new Character((char)t).toString().getBytes(charset); if (buffer.length == 0) { return -1; } int retval = read(); // now we have something in the buffer we call call recursively return retval; } } /** * @see java.sql.ResultSet#getAsciiStream(int) */ @Override public InputStream getAsciiStream( int columnIndex ) throws SQLException { Reader reader = getCharacterStream(columnIndex); wasNull = (reader == null); if (wasNull) { return null; } return new ReaderInputStream(reader, ReaderInputStream.ASCII); } /** * @see java.sql.ResultSet#getBinaryStream(int) */ @Override public InputStream getBinaryStream( int columnIndex ) { Object o = getObject(columnIndex); wasNull = (o == null); if (wasNull) { return null; } if (o instanceof InputStream) { return (InputStream)o; } if (o instanceof Reader) { return new ReaderInputStream((Reader)o, ReaderInputStream.UNICODE); } byte[] bytes = getBytes(columnIndex); return new ByteArrayInputStream(bytes); } /** * @see java.sql.ResultSet#getUnicodeStream(int) */ @Override public InputStream getUnicodeStream( int columnIndex ) throws SQLException { Reader reader = getCharacterStream(columnIndex); wasNull = (reader == null); if (wasNull) { return null; } return new ReaderInputStream(reader, ReaderInputStream.UNICODE); } /** * @see java.sql.ResultSet#updateAsciiStream(int, java.io.InputStream, int) */ @Override public void updateAsciiStream( int columnIndex, InputStream x, int length ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateBinaryStream(int, java.io.InputStream, int) */ @Override public void updateBinaryStream( int columnIndex, InputStream x, int length ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getCharacterStream(int) */ @Override public Reader getCharacterStream( int columnIndex ) throws SQLException { Object o = getObject(columnIndex); wasNull = (o == null); if (wasNull) { return null; } if (o instanceof Reader) { return (Reader)o; } if (o instanceof InputStream) { try { return new InputStreamReader((InputStream)o, ReaderInputStream.UNICODE); } catch (UnsupportedEncodingException e) { throw wrapException(e); } } String str = getString(columnIndex); return new StringReader(str); } private SQLException wrapException( Exception e ) { return new SQLException(e.toString()); } /** * @see java.sql.ResultSet#updateCharacterStream(int, java.io.Reader, int) */ @Override public void updateCharacterStream( int columnIndex, Reader x, int length ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getObject(int) */ @Override public Object getObject( int columnIndex ) { return getObjectFromRow(columnIndex, row); } Object getObjectFromRow( int columnIndex, int rowIndex ) { List rowvalues = (List)values.get(rowIndex); return rowvalues.get(columnIndex - 1); } /** * @see java.sql.ResultSet#updateObject(int, java.lang.Object) */ @Override public void updateObject( int columnIndex, Object x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateObject(int, java.lang.Object, int) */ @Override public void updateObject( int columnIndex, Object x, int scale ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getCursorName() */ @Override public String getCursorName() { return ""; //$NON-NLS-1$ } /** * @see java.sql.ResultSet#getString(int) */ @Override public String getString( int columnIndex ) { Object o = getObject(columnIndex); if (o == null) { return null; } return o.toString(); } /** * @see java.sql.ResultSet#updateString(int, java.lang.String) */ @Override public void updateString( int columnIndex, String x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getByte(java.lang.String) */ @Override public byte getByte( String columnName ) { int index = findColumn(columnName); return getByte(index); } /** * @see java.sql.ResultSet#getDouble(java.lang.String) */ @Override public double getDouble( String columnName ) { int index = findColumn(columnName); return getDouble(index); } /** * @see java.sql.ResultSet#getFloat(java.lang.String) */ @Override public float getFloat( String columnName ) { int index = findColumn(columnName); return getFloat(index); } /** * @see java.sql.ResultSet#findColumn(java.lang.String) */ @Override public int findColumn( String columnName ) { Object o = names.get(columnName); Number n = (Number)o; int index = n.intValue(); return index; } public String reverseFindColumn( int column ) { return reverseNames[column]; } /** * @see java.sql.ResultSet#getInt(java.lang.String) */ @Override public int getInt( String columnName ) { int index = findColumn(columnName); return getInt(index); } /** * @see java.sql.ResultSet#getLong(java.lang.String) */ @Override public long getLong( String columnName ) { int index = findColumn(columnName); return getLong(index); } /** * @see java.sql.ResultSet#getShort(java.lang.String) */ @Override public short getShort( String columnName ) { int index = findColumn(columnName); return getShort(index); } /** * @see java.sql.ResultSet#updateNull(java.lang.String) */ @Override public void updateNull( String columnName ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getBoolean(java.lang.String) */ @Override public boolean getBoolean( String columnName ) { int index = findColumn(columnName); return getBoolean(index); } /** * @see java.sql.ResultSet#getBytes(java.lang.String) */ @Override public byte[] getBytes( String columnName ) { int index = findColumn(columnName); return getBytes(index); } /** * @see java.sql.ResultSet#updateByte(java.lang.String, byte) */ @Override public void updateByte( String columnName, byte x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateDouble(java.lang.String, double) */ @Override public void updateDouble( String columnName, double x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateFloat(java.lang.String, float) */ @Override public void updateFloat( String columnName, float x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateInt(java.lang.String, int) */ @Override public void updateInt( String columnName, int x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateLong(java.lang.String, long) */ @Override public void updateLong( String columnName, long x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateShort(java.lang.String, short) */ @Override public void updateShort( String columnName, short x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateBoolean(java.lang.String, boolean) */ @Override public void updateBoolean( String columnName, boolean x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateBytes(java.lang.String, byte[]) */ @Override public void updateBytes( String columnName, byte[] x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getBigDecimal(int) */ @Override public BigDecimal getBigDecimal( int columnIndex ) { String str = getString(columnIndex); wasNull = (str == null); if (wasNull) { return null; } return new BigDecimal(str); } /** * @see java.sql.ResultSet#getBigDecimal(int, int) */ @Override public BigDecimal getBigDecimal( int columnIndex, int scale ) { return getBigDecimal(columnIndex); } /** * @see java.sql.ResultSet#updateBigDecimal(int, java.math.BigDecimal) */ @Override public void updateBigDecimal( int columnIndex, BigDecimal x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getURL(int) */ @Override public URL getURL( int columnIndex ) throws SQLException { String str = getString(columnIndex); wasNull = (str == null); if (wasNull) { return null; } try { return new URL(str); } catch (MalformedURLException e) { throw wrapException(e); } } /** * @see java.sql.ResultSet#getArray(int) */ @Override public Array getArray( int i ) throws SQLException { throwNotImplemented(); return null; } /** * @see java.sql.ResultSet#updateArray(int, java.sql.Array) */ @Override public void updateArray( int columnIndex, Array x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getBlob(int) */ @Override public Blob getBlob( int i ) throws SQLException { throwNotImplemented(); return null; } /** * @see java.sql.ResultSet#updateBlob(int, java.sql.Blob) */ @Override public void updateBlob( int columnIndex, Blob x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getClob(int) */ @Override public Clob getClob( int i ) throws SQLException { throwNotImplemented(); return null; } /** * @see java.sql.ResultSet#updateClob(int, java.sql.Clob) */ @Override public void updateClob( int columnIndex, Clob x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getDate(int) */ @Override public Date getDate( int columnIndex ) { String str = getString(columnIndex); if (str == null) return null; try { return new Date(DateFormat.getDateInstance().parse(str).getTime()); } catch (ParseException error) { throw new IllegalArgumentException(error); } } /** * @see java.sql.ResultSet#updateDate(int, java.sql.Date) */ @Override public void updateDate( int columnIndex, Date x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getRef(int) */ @Override public Ref getRef( int i ) throws SQLException { throwNotImplemented(); return null; } /** * @see java.sql.ResultSet#updateRef(int, java.sql.Ref) */ @Override public void updateRef( int columnIndex, Ref x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getMetaData() */ @Override public ResultSetMetaData getMetaData() { return metaData; } /** * @see java.sql.ResultSet#getWarnings() */ @Override public SQLWarning getWarnings() { return null; } /** * @see java.sql.ResultSet#getStatement() */ @Override public Statement getStatement() { return null; } /** * @see java.sql.ResultSet#getTime(int) */ @Override public Time getTime( int columnIndex ) { String str = getString(columnIndex); if (str == null) return null; try { return new Time(DateFormat.getTimeInstance().parse(str).getTime()); } catch (ParseException error) { throw new IllegalArgumentException(error); } } /** * @see java.sql.ResultSet#updateTime(int, java.sql.Time) */ @Override public void updateTime( int columnIndex, Time x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getTimestamp(int) */ @Override public Timestamp getTimestamp( int columnIndex ) { String str = getString(columnIndex); if (str == null) return null; try { return new Timestamp(DateFormat.getInstance().parse(str).getTime()); } catch (ParseException error) { throw new IllegalArgumentException(error); } } /** * @see java.sql.ResultSet#updateTimestamp(int, java.sql.Timestamp) */ @Override public void updateTimestamp( int columnIndex, Timestamp x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getAsciiStream(java.lang.String) */ @Override public InputStream getAsciiStream( String columnName ) throws SQLException { int index = findColumn(columnName); return getAsciiStream(index); } /** * @see java.sql.ResultSet#getBinaryStream(java.lang.String) */ @Override public InputStream getBinaryStream( String columnName ) { int index = findColumn(columnName); return getBinaryStream(index); } /** * @see java.sql.ResultSet#getUnicodeStream(java.lang.String) */ @Override public InputStream getUnicodeStream( String columnName ) throws SQLException { int index = findColumn(columnName); return getUnicodeStream(index); } /** * @see java.sql.ResultSet#updateAsciiStream(java.lang.String, java.io.InputStream, int) */ @Override public void updateAsciiStream( String columnName, InputStream x, int length ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateBinaryStream(java.lang.String, java.io.InputStream, int) */ @Override public void updateBinaryStream( String columnName, InputStream x, int length ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getCharacterStream(java.lang.String) */ @Override public Reader getCharacterStream( String columnName ) throws SQLException { int index = findColumn(columnName); return getCharacterStream(index); } /** * @see java.sql.ResultSet#updateCharacterStream(java.lang.String, java.io.Reader, int) */ @Override public void updateCharacterStream( String columnName, Reader reader, int length ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getObject(java.lang.String) */ @Override public Object getObject( String columnName ) { int index = findColumn(columnName); return getObject(index); } /** * @see java.sql.ResultSet#updateObject(java.lang.String, java.lang.Object) */ @Override public void updateObject( String columnName, Object x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#updateObject(java.lang.String, java.lang.Object, int) */ @Override public void updateObject( String columnName, Object x, int scale ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getString(java.lang.String) */ @Override public String getString( String columnName ) { int index = findColumn(columnName); return getString(index); } /** * @see java.sql.ResultSet#updateString(java.lang.String, java.lang.String) */ @Override public void updateString( String columnName, String x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getBigDecimal(java.lang.String) */ @Override public BigDecimal getBigDecimal( String columnName ) { int index = findColumn(columnName); return getBigDecimal(index); } /** * @see java.sql.ResultSet#getBigDecimal(java.lang.String, int) */ @Override public BigDecimal getBigDecimal( String columnName, int scale ) { return getBigDecimal(columnName); } /** * @see java.sql.ResultSet#updateBigDecimal(java.lang.String, java.math.BigDecimal) */ @Override public void updateBigDecimal( String columnName, BigDecimal x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getURL(java.lang.String) */ @Override public URL getURL( String columnName ) throws SQLException { int index = findColumn(columnName); return getURL(index); } /** * @see java.sql.ResultSet#getArray(java.lang.String) */ @Override public Array getArray( String colName ) throws SQLException { int index = findColumn(colName); return getArray(index); } /** * @see java.sql.ResultSet#updateArray(java.lang.String, java.sql.Array) */ @Override public void updateArray( String columnName, Array x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getBlob(java.lang.String) */ @Override public Blob getBlob( String colName ) throws SQLException { int index = findColumn(colName); return getBlob(index); } /** * @see java.sql.ResultSet#updateBlob(java.lang.String, java.sql.Blob) */ @Override public void updateBlob( String columnName, Blob x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getClob(java.lang.String) */ @Override public Clob getClob( String colName ) throws SQLException { int index = findColumn(colName); return getClob(index); } /** * @see java.sql.ResultSet#updateClob(java.lang.String, java.sql.Clob) */ @Override public void updateClob( String columnName, Clob x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getDate(java.lang.String) */ @Override public Date getDate( String columnName ) { int index = findColumn(columnName); return getDate(index); } /** * @see java.sql.ResultSet#updateDate(java.lang.String, java.sql.Date) */ @Override public void updateDate( String columnName, Date x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getDate(int, java.util.Calendar) */ @Override public Date getDate( int columnIndex, Calendar cal ) { return getDate(columnIndex); } /** * @see java.sql.ResultSet#getRef(java.lang.String) */ @Override public Ref getRef( String colName ) throws SQLException { int index = findColumn(colName); return getRef(index); } /** * @see java.sql.ResultSet#updateRef(java.lang.String, java.sql.Ref) */ @Override public void updateRef( String columnName, Ref x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getTime(java.lang.String) */ @Override public Time getTime( String columnName ) { int index = findColumn(columnName); return getTime(index); } /** * @see java.sql.ResultSet#updateTime(java.lang.String, java.sql.Time) */ @Override public void updateTime( String columnName, Time x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getTime(int, java.util.Calendar) */ @Override public Time getTime( int columnIndex, Calendar cal ) { return getTime(columnIndex); } /** * @see java.sql.ResultSet#getTimestamp(java.lang.String) */ @Override public Timestamp getTimestamp( String columnName ) { int index = findColumn(columnName); return getTimestamp(index); } /** * @see java.sql.ResultSet#updateTimestamp(java.lang.String, java.sql.Timestamp) */ @Override public void updateTimestamp( String columnName, Timestamp x ) throws SQLException { throwReadOnly(); } /** * @see java.sql.ResultSet#getTimestamp(int, java.util.Calendar) */ @Override public Timestamp getTimestamp( int columnIndex, Calendar cal ) { return getTimestamp(columnIndex); } /** * @see java.sql.ResultSet#getDate(java.lang.String, java.util.Calendar) */ @Override public Date getDate( String columnName, Calendar cal ) { int index = findColumn(columnName); return getDate(index); } /** * @see java.sql.ResultSet#getTime(java.lang.String, java.util.Calendar) */ @Override public Time getTime( String columnName, Calendar cal ) { int index = findColumn(columnName); return getTime(index); } /** * @see java.sql.ResultSet#getTimestamp(java.lang.String, java.util.Calendar) */ @Override public Timestamp getTimestamp( String columnName, Calendar cal ) { int index = findColumn(columnName); return getTimestamp(index); } class MetaData implements ResultSetMetaData { @Override public String getCatalogName( int column ) { return ""; //$NON-NLS-1$ } @Override public String getColumnClassName( int column ) { Class cls = getColumnClass(column); return cls.getName(); } private Class getColumnClass( int column ) { Class retval = null; for (int i = 0; i < values.size(); ++i) { Object value = getObjectFromRow(column, i); if (value != null) { retval = value.getClass(); break; } } if (retval == null) { retval = Object.class; } return retval; } @Override public int getColumnCount() { return names.size(); } @Override public int getColumnDisplaySize( int column ) { return 32; // arbitrary number } @Override public String getColumnLabel( int column ) { return reverseFindColumn(column); } @Override public String getColumnName( int column ) { return reverseFindColumn(column); } @Override public int getColumnType( int column ) { Class cls = getColumnClass(column); if (cls == String.class) return Types.VARCHAR; if (cls == String.class) return Types.VARCHAR; if (cls == BigDecimal.class) return Types.NUMERIC; if (cls == Boolean.class) return Types.BIT; if (cls == Integer.class) return Types.INTEGER; if (cls == Long.class) return Types.BIGINT; if (cls == Float.class) return Types.REAL; if (cls == Double.class) return Types.DOUBLE; if (cls == byte[].class) return Types.VARBINARY; if (cls == Date.class) return Types.DATE; if (cls == Time.class) return Types.TIME; if (cls == Timestamp.class) return Types.TIMESTAMP; if (cls == Timestamp.class) return Types.TIMESTAMP; if (cls == Clob.class) return Types.CLOB; if (cls == Blob.class) return Types.BLOB; if (cls == Array.class) return Types.ARRAY; if (cls == Struct.class) return Types.STRUCT; if (cls == Ref.class) return Types.REF; return Types.JAVA_OBJECT; } @Override public String getColumnTypeName( int column ) { Class cls = getColumnClass(column); return cls.getName(); } @Override public int getPrecision( int column ) { return 10; // arbitrary number } @Override public int getScale( int column ) { return 10; // arbitrary number } @Override public String getSchemaName( int column ) { return ""; //$NON-NLS-1$ } @Override public String getTableName( int column ) { return ""; //$NON-NLS-1$ } @Override public boolean isAutoIncrement( int column ) { return false; } @Override public boolean isCaseSensitive( int column ) { return true; } @Override public boolean isCurrency( int column ) { return false; } @Override public boolean isDefinitelyWritable( int column ) { return false; } @Override public int isNullable( int column ) { return 0; } @Override public boolean isReadOnly( int column ) { return true; } @Override public boolean isSearchable( int column ) { return false; } @Override public boolean isSigned( int column ) { return false; } @Override public boolean isWritable( int column ) { return false; } @Override public boolean isWrapperFor( Class<?> iface ) { return false; } @Override public <T> T unwrap( Class<T> iface ) { return null; } } @Override public int getHoldability() { return 0; } @Override public Reader getNCharacterStream( int columnIndex ) { return null; } @Override public Reader getNCharacterStream( String columnLabel ) { return null; } @Override public NClob getNClob( int columnIndex ) { return null; } @Override public NClob getNClob( String columnLabel ) { return null; } @Override public String getNString( int columnIndex ) { return null; } @Override public String getNString( String columnLabel ) { return null; } @Override public Object getObject( int columnIndex, Map<String, Class<?>> map ) { return getObject(columnIndex); } @Override public Object getObject( String columnLabel, Map<String, Class<?>> map ) { int index = findColumn(columnLabel); return getObject(index); } @Override public RowId getRowId( int columnIndex ) { return null; } @Override public RowId getRowId( String columnLabel ) { return null; } @Override public SQLXML getSQLXML( int columnIndex ) { return null; } @Override public SQLXML getSQLXML( String columnLabel ) { return null; } @Override public boolean isClosed() { return false; } @Override public void updateAsciiStream( int columnIndex, InputStream x ) { } @Override public void updateAsciiStream( String columnLabel, InputStream x ) { } @Override public void updateAsciiStream( int columnIndex, InputStream x, long length ) { } @Override public void updateAsciiStream( String columnLabel, InputStream x, long length ) { } @Override public void updateBinaryStream( int columnIndex, InputStream x ) { } @Override public void updateBinaryStream( String columnLabel, InputStream x ) { } @Override public void updateBinaryStream( int columnIndex, InputStream x, long length ) { } @Override public void updateBinaryStream( String columnLabel, InputStream x, long length ) { } @Override public void updateBlob( int columnIndex, InputStream inputStream ) { } @Override public void updateBlob( String columnLabel, InputStream inputStream ) { } @Override public void updateBlob( int columnIndex, InputStream inputStream, long length ) { } @Override public void updateBlob( String columnLabel, InputStream inputStream, long length ) { } @Override public void updateCharacterStream( int columnIndex, Reader x ) { } @Override public void updateCharacterStream( String columnLabel, Reader reader ) { } @Override public void updateCharacterStream( int columnIndex, Reader x, long length ) { } @Override public void updateCharacterStream( String columnLabel, Reader reader, long length ) { } @Override public void updateClob( int columnIndex, Reader reader ) { } @Override public void updateClob( String columnLabel, Reader reader ) { } @Override public void updateClob( int columnIndex, Reader reader, long length ) { } @Override public void updateClob( String columnLabel, Reader reader, long length ) { } @Override public void updateNCharacterStream( int columnIndex, Reader x ) { } @Override public void updateNCharacterStream( String columnLabel, Reader reader ) { } @Override public void updateNCharacterStream( int columnIndex, Reader x, long length ) { } @Override public void updateNCharacterStream( String columnLabel, Reader reader, long length ) { } @Override public void updateNClob( int columnIndex, NClob clob ) { } @Override public void updateNClob( String columnLabel, NClob clob ) { } @Override public void updateNClob( int columnIndex, Reader reader ) { } @Override public void updateNClob( String columnLabel, Reader reader ) { } @Override public void updateNClob( int columnIndex, Reader reader, long length ) { } @Override public void updateNClob( String columnLabel, Reader reader, long length ) { } @Override public void updateNString( int columnIndex, String string ) { } @Override public void updateNString( String columnLabel, String string ) { } @Override public void updateRowId( int columnIndex, RowId x ) { } @Override public void updateRowId( String columnLabel, RowId x ) { } @Override public void updateSQLXML( int columnIndex, SQLXML xmlObject ) { } @Override public void updateSQLXML( String columnLabel, SQLXML xmlObject ) { } @Override public boolean isWrapperFor( Class<?> iface ) { return false; } @Override public <T> T unwrap( Class<T> iface ) { return null; } public <T> T getObject(int columnIndex, Class<T> type) throws SQLException { throw new SQLFeatureNotSupportedException(); } public <T> T getObject(String columnLabel, Class<T> type) throws SQLException { throw new SQLFeatureNotSupportedException(); } }