package com.vividsolutions.jump.datastore.postgis;
import java.sql.*;
import org.postgresql.*;
import com.vividsolutions.jump.feature.Feature;
import com.vividsolutions.jump.feature.FeatureSchema;
import com.vividsolutions.jump.io.BaseFeatureInputStream;
/**
* Reads features from a PostgreSQL/PostGIS database.
*/
public class PostgisFeatureInputStream
extends BaseFeatureInputStream
{
private FeatureSchema featureSchema;
private Connection conn;
private String queryString;
private boolean initialized = false;
private Exception savedException;
private Statement stmt = null;
private ResultSet rs = null;
private PostgisResultSetConverter mapper;
int geometryColIndex = -1;
public PostgisFeatureInputStream(Connection conn, String queryString) {
this.conn = conn;
this.queryString = queryString;
}
/**
* @return The underlaying {@link Connection}.
*/
public Connection getConnection(){return conn;}
/**
* @return The underlaying {@link Statement}.
* Useful to cancel the query on the server if the PlugIn is interrupted
*/
public Statement getStatement(){return stmt;}
private void init()
throws SQLException
{
if (initialized)
return;
initialized = true;
//conn.setDefaultRowPrefetch(100);
stmt = conn.createStatement();
String parsedQuery = queryString;
//String parsedQuery = QueryUtil.parseQuery(queryString);
rs = stmt.executeQuery(parsedQuery);
mapper = new PostgisResultSetConverter(conn, rs);
featureSchema = mapper.getFeatureSchema();
}
protected Feature readNext()
throws Exception
{
if (savedException != null)
throw savedException;
if (! initialized)
init();
if (rs == null)
return null;
if (! rs.next())
return null;
return getFeature();
}
private Feature getFeature()
throws Exception
{
return mapper.getFeature();
}
public void close() throws SQLException {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
}
public FeatureSchema getFeatureSchema()
{
if (featureSchema != null)
return featureSchema;
try {
init();
}
catch (SQLException ex)
{
savedException = ex;
}
if (featureSchema == null)
featureSchema = new FeatureSchema();
return featureSchema;
}
}