package com.vividsolutions.jump.datastore.postgis;
import java.sql.*;
import org.postgresql.PGConnection;
import com.vividsolutions.jump.datastore.AdhocQuery;
import com.vividsolutions.jump.datastore.DataStoreConnection;
import com.vividsolutions.jump.datastore.DataStoreException;
import com.vividsolutions.jump.datastore.DataStoreMetadata;
import com.vividsolutions.jump.datastore.FilterQuery;
import com.vividsolutions.jump.datastore.Query;
import com.vividsolutions.jump.datastore.SpatialReferenceSystemID;
import com.vividsolutions.jump.io.FeatureInputStream;
/**
*/
public class PostgisDSConnection
implements DataStoreConnection
{
private PostgisDSMetadata dbMetadata;
private Connection connection;
public PostgisDSConnection(Connection conn) {
connection = conn;
dbMetadata = new PostgisDSMetadata(this);
}
public Connection getConnection()
{
return connection;
}
public DataStoreMetadata getMetadata()
{
return dbMetadata;
}
public FeatureInputStream execute(Query query) {
if (query instanceof FilterQuery) {
try {
return executeFilterQuery((FilterQuery) query);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (query instanceof AdhocQuery) {
return executeAdhocQuery((AdhocQuery) query);
}
throw new IllegalArgumentException("Unsupported Query type");
}
/**
* Executes a filter query.
*
* The SRID is optional for queries - it will be determined automatically
* from the table metadata if not supplied.
*
* @param query the query to execute
* @return the results of the query
* @throws SQLException
*/
public FeatureInputStream executeFilterQuery(FilterQuery query) throws SQLException
{
SpatialReferenceSystemID srid = dbMetadata.getSRID(query.getDatasetName(), query.getGeometryAttributeName());
String[] colNames = dbMetadata.getColumnNames(query.getDatasetName());
PostgisSQLBuilder builder = new PostgisSQLBuilder(srid, colNames);
String queryString = builder.getSQL(query);
PostgisFeatureInputStream ifs = new PostgisFeatureInputStream(connection, queryString);
return ifs;
}
public FeatureInputStream executeAdhocQuery(AdhocQuery query)
{
String queryString = query.getQuery();
PostgisFeatureInputStream ifs = new PostgisFeatureInputStream(connection, queryString);
return ifs;
}
public void close()
throws DataStoreException
{
try {
connection.close();
}
catch (Exception ex) { throw new DataStoreException(ex); }
}
public boolean isClosed() throws DataStoreException {
try {
return connection.isClosed();
} catch (SQLException e) {
throw new DataStoreException(e);
}
}
}