/*
* Copyright (c) 2004, 2005, 2006 TADA AB - Taby Sweden
* Distributed under the terms shown in the file COPYRIGHT
* found in the root folder of this project or at
* http://eng.tada.se/osprojects/COPYRIGHT.html
*/
package org.postgresql.pljava.jdbc;
import java.sql.SQLException;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
/**
* A Synthetic ResultSet that provides direct access to data stored
* in a {@link java.util.ArrayList}. This kind of ResultSet has nothing
* common with any statement.
*
* @author Filip Hrbek
*/
public class SyntheticResultSet extends ResultSetBase
{
private final ResultSetField[] m_fields;
private final ArrayList m_tuples;
private final HashMap m_fieldIndexes;
SyntheticResultSet(ResultSetField[] fields, ArrayList tuples)
throws SQLException
{
super(tuples.size());
m_fields = fields;
m_tuples = tuples;
m_fieldIndexes = new HashMap();
int i = m_fields.length;
while(--i >= 0)
m_fieldIndexes.put(m_fields[i].getColumnLabel(), new Integer(i+1));
Object[][] tupleTest = (Object[][]) m_tuples.toArray(new Object[0][]);
Object value;
for (i=0; i < tupleTest.length; i++)
{
int j = m_fields.length;
while(--j >= 0)
{
value = tupleTest[i][j];
if (value != null && !m_fields[j].canContain(value.getClass()))
{
throw new SQLException(
"Unable to store class " + value.getClass() +
" in ResultSetField '" + m_fields[j].getColumnLabel() + "'" +
" with OID " + m_fields[j].getOID() +
" (expected class: " + m_fields[j].getJavaClass() + ")");
}
}
}
}
public void close()
throws SQLException
{
m_tuples.clear();
super.close();
}
public int findColumn(String columnName)
throws SQLException
{
Integer idx = (Integer)m_fieldIndexes.get(columnName.toUpperCase());
if(idx != null)
{
return idx.intValue();
}
throw new SQLException("No such field: '" + columnName + "'");
}
protected Object getObjectValue(int columnIndex)
throws SQLException
{
return getCurrentRow()[columnIndex-1];
}
protected final Object[] getCurrentRow()
throws SQLException
{
int row = this.getRow();
if(row < 1 || row > m_tuples.size())
throw new SQLException("ResultSet is not positioned on a valid row");
return (Object[])m_tuples.get(row-1);
}
public boolean isLast() throws SQLException
{
return this.getRow() == m_tuples.size();
}
public boolean next() throws SQLException
{
int row = this.getRow();
if(row < m_tuples.size())
{
this.setRow(row+1);
return true;
}
return false;
}
public ResultSetMetaData getMetaData()
throws SQLException
{
return new SyntheticResultSetMetaData(m_fields);
}
}