/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.gce.imagemosaic.jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.logging.Level;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.referencing.CRS;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import com.vividsolutions.jts.io.WKBWriter;
/**
* JDBCAccess Implentation for DB2 Spatial Extended
*
* @author mcr
*
*/
class JDBCAccessDB2 extends JDBCAccessBase {
static String SRSSelect = "select srs_id,srs_name from db2gse.st_geometry_columns where table_schema=? and table_name=? and column_name=? ";
static String SRSSelectCurrentSchema = "select srs_id,srs_name from db2gse.st_geometry_columns where table_schema=(select current schema from sysibm.sysdummy1) and table_name=? and column_name=? ";
static String CRSSelect = "select definition from db2gse.st_spatial_reference_systems where srs_id=?";
private String extentSelect = null;
private String allSelect = null;
private String allSelectJoined = null;
private String gridSelect = null;
private String gridSelectJoined = null;
JDBCAccessDB2(Config config) throws IOException {
super(config);
initStatementStrings(config);
}
/**
* initialize the sql statement strings
*
* @param config
*/
private void initStatementStrings(Config config) {
String geomAttr = config.getGeomAttributeNameInSpatialTable();
extentSelect = "select " + "min(db2gse.st_minx(" + geomAttr + ")), "
+ "min(db2gse.st_miny(" + geomAttr + ")), "
+ "max(db2gse.st_maxx(" + geomAttr + ")), "
+ "max(db2gse.st_maxy(" + geomAttr + ")) " + " from {0}";
String spatialSelectClause = "select s."
+ config.getKeyAttributeNameInSpatialTable() + ","
+ "db2gse.st_minx(s." + geomAttr + "), " + "db2gse.st_miny(s."
+ geomAttr + "), " + "db2gse.st_maxx(s." + geomAttr + "), "
+ "db2gse.st_maxy(s." + geomAttr + ") ";
allSelect = spatialSelectClause + ",s."
+ config.getBlobAttributeNameInTileTable() + " from {0} s";
allSelectJoined = spatialSelectClause + ",t."
+ config.getBlobAttributeNameInTileTable()
+ " from {0} s, {1} t WHERE ";
allSelectJoined += (" s." + config.getKeyAttributeNameInSpatialTable()
+ " = t." + config.getKeyAttributeNameInTileTable());
String whereClause = "db2gse.st_mbrIntersects(s."
+ geomAttr
+ ","
+ "db2gse.ST_GEOMETRY(CAST(? AS BLOB(128)),CAST(? AS INT))) = 1 SELECTIVITY 0.0000001";
gridSelect = allSelect + " WHERE " + whereClause;
gridSelectJoined = allSelectJoined + " AND " + whereClause;
}
/*
* (non-Javadoc)
*
* @see org.geotools.gce.imagemosaic.jdbc.JDBCAccessBase#getRandomTileStatement(org.geotools.gce.imagemosaic.jdbc.ImageLevelInfo)
*/
@Override
protected String getRandomTileStatement(ImageLevelInfo li) {
if (li.isImplementedAsTableSplit()) {
return MessageFormat.format(allSelectJoined, new Object[] {
li.getSpatialTableName(), li.getTileTableName() });
} else {
return MessageFormat.format(allSelect, new Object[] { li
.getSpatialTableName() });
}
}
/*
* (non-Javadoc)
*
* @see org.geotools.gce.imagemosaic.jdbc.JDBCAccessBase#getGridSelectStatement(org.geotools.gce.imagemosaic.jdbc.ImageLevelInfo)
*/
@Override
protected String getGridSelectStatement(ImageLevelInfo li) {
if (li.isImplementedAsTableSplit()) {
return MessageFormat.format(gridSelectJoined, new Object[] {
li.getSpatialTableName(), li.getTileTableName() });
} else {
return MessageFormat.format(gridSelect, new Object[] { li
.getSpatialTableName() });
}
}
/*
* (non-Javadoc)
*
* @see org.geotools.gce.imagemosaic.jdbc.JDBCAccessBase#getExtentSelectStatment(org.geotools.gce.imagemosaic.jdbc.ImageLevelInfo)
*/
@Override
protected String getExtentSelectStatment(ImageLevelInfo li) {
return MessageFormat.format(extentSelect, new Object[] { li
.getSpatialTableName() });
}
/*
* (non-Javadoc)
*
* @see org.geotools.gce.imagemosaic.jdbc.JDBCAccessBase#getSRSID(org.geotools.gce.imagemosaic.jdbc.ImageLevelInfo,
* java.sql.Connection)
*/
@Override
protected Integer getSRSID(ImageLevelInfo li, Connection con)
throws IOException {
Integer result = null;
String schema = null;
try {
schema = getSchemaFromSpatialTable(li.getSpatialTableName());
PreparedStatement s = null;
if (schema == null) {
s = con.prepareStatement(SRSSelectCurrentSchema);
s.setString(1, li.getSpatialTableName());
s.setString(2, config.getGeomAttributeNameInSpatialTable());
} else {
s = con.prepareStatement(SRSSelect);
s.setString(1, schema);
s.setString(2, li.getSpatialTableName());
s.setString(3, config.getGeomAttributeNameInSpatialTable());
}
ResultSet r = s.executeQuery();
if (r.next()) {
result = (Integer) r.getObject(1);
}
r.close();
s.close();
} catch (SQLException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
throw new IOException(e.getMessage());
}
if (result == null) {
String msg = MessageFormat.format(
"No entry in db2gse.st_geometry_columns for {0},{1},{2}",
new Object[] {
(schema != null) ? schema : "currrent schema",
li.getSpatialTableName(),
config.getGeomAttributeNameInSpatialTable() });
LOGGER.log(Level.SEVERE, msg);
throw new IOException(msg);
}
return result;
}
/*
* (non-Javadoc)
*
* @see org.geotools.gce.imagemosaic.jdbc.JDBCAccessBase#getCRS(org.geotools.gce.imagemosaic.jdbc.ImageLevelInfo,
* java.sql.Connection)
*/
@Override
protected CoordinateReferenceSystem getCRS(ImageLevelInfo li, Connection con)
throws IOException {
CoordinateReferenceSystem result = null;
try {
PreparedStatement s = con.prepareStatement(CRSSelect);
s.setInt(1, li.getSrsId());
ResultSet r = s.executeQuery();
if (r.next()) {
String definition = r.getString(1);
result = CRS.parseWKT(definition);
}
r.close();
s.close();
} catch (Exception e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
throw new IOException(e.getMessage());
}
return result;
}
/*
* (non-Javadoc)
*
* @see org.geotools.gce.imagemosaic.jdbc.JDBCAccessBase#setGridSelectParams(java.sql.PreparedStatement,
* org.geotools.geometry.GeneralEnvelope,
* org.geotools.gce.imagemosaic.jdbc.ImageLevelInfo)
*/
@Override
protected void setGridSelectParams(PreparedStatement s,
GeneralEnvelope envelope, ImageLevelInfo li) throws SQLException {
WKBWriter w = new WKBWriter();
byte[] bytes = w.write(polyFromEnvelope(envelope));
s.setBytes(1, bytes);
s.setInt(2, li.getSrsId());
}
}