/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-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.data.h2; import java.io.IOException; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; import org.geotools.data.jdbc.FilterToSQL; import org.geotools.jdbc.BasicSQLDialect; import org.geotools.jdbc.JDBCDataStore; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; import org.opengis.feature.type.GeometryDescriptor; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKBReader; import com.vividsolutions.jts.io.WKTWriter; /** * H2 database dialect based on basic (non-prepared) statements. * * @author Justin Deoliveira, OpenGEO * * * * @source $URL$ */ public class H2DialectBasic extends BasicSQLDialect { H2Dialect delegate; public H2DialectBasic(JDBCDataStore dataStore) { super(dataStore); delegate = new H2Dialect( dataStore ); } @Override public void initializeConnection(Connection cx) throws SQLException { delegate.initializeConnection(cx); } @Override public boolean includeTable(String schemaName, String tableName, Connection cx) throws SQLException { return delegate.includeTable(schemaName, tableName, cx); } @Override public String getNameEscape() { return delegate.getNameEscape(); } @Override public void registerSqlTypeToClassMappings(Map<Integer, Class<?>> mappings) { delegate.registerSqlTypeToClassMappings(mappings); } @Override public void registerClassToSqlMappings(Map<Class<?>, Integer> mappings) { delegate.registerClassToSqlMappings(mappings); } @Override public Class<?> getMapping(ResultSet columnMetaData, Connection cx) throws SQLException { return delegate.getMapping(columnMetaData, cx); } @Override public void encodePostColumnCreateTable(AttributeDescriptor att, StringBuffer sql) { delegate.encodePostColumnCreateTable(att, sql); } @Override public void encodePostCreateTable(String tableName, StringBuffer sql) { delegate.encodePostCreateTable(tableName, sql); } @Override public void postCreateTable(String schemaName, SimpleFeatureType featureType, Connection cx) throws SQLException { delegate.postCreateTable(schemaName, featureType, cx); } @Override public void postCreateFeatureType(SimpleFeatureType featureType, DatabaseMetaData metadata, String schemaName, Connection cx) throws SQLException { delegate.postCreateFeatureType(featureType, metadata, schemaName, cx); } @Override public Integer getGeometrySRID(String schemaName, String tableName, String columnName, Connection cx) throws SQLException { return delegate.getGeometrySRID(schemaName, tableName, columnName, cx); } @Override public void encodePrimaryKey(String column, StringBuffer sql) { delegate.encodePrimaryKey(column, sql); } @Override public String getSequenceForColumn(String schemaName, String tableName, String columnName, Connection cx) throws SQLException { return delegate.getSequenceForColumn(schemaName, tableName, columnName, cx); } @Override public Object getNextSequenceValue(String schemaName, String sequenceName, Connection cx) throws SQLException { return delegate.getNextSequenceValue(schemaName, sequenceName, cx); } @Override public boolean lookupGeneratedValuesPostInsert() { return delegate.lookupGeneratedValuesPostInsert(); } @Override public Object getNextAutoGeneratedValue(String schemaName, String tableName, String columnName, Connection cx) throws SQLException { return delegate.getNextAutoGeneratedValue(schemaName, tableName, columnName, cx); } @Override public Object getLastAutoGeneratedValue(String schemaName, String tableName, String columnName, Connection cx) throws SQLException { return delegate.getLastAutoGeneratedValue(schemaName, tableName, columnName, cx); } @Override public void encodeGeometryEnvelope(String tableName, String geometryColumn, StringBuffer sql) { delegate.encodeGeometryEnvelope(tableName, geometryColumn, sql); } @Override public Envelope decodeGeometryEnvelope(ResultSet rs, int column, Connection cx) throws SQLException, IOException { return delegate.decodeGeometryEnvelope(rs, column, cx); } // // non-prepared statement api // @Override public void encodeValue(Object value, Class type, StringBuffer sql) { if (byte[].class == type) { byte[] b = (byte[]) value; //encode as hex string sql.append("'"); for (int i=0; i < b.length; i++) { sql.append(Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 )); } sql.append("'"); } else { super.encodeValue(value, type, sql); } } @Override public void encodeGeometryValue(Geometry value, int srid, StringBuffer sql) throws IOException { if (value != null) { sql.append("ST_GeomFromText ('"); sql.append(new WKTWriter().write(value)); sql.append("',"); sql.append(srid); sql.append(")"); } else { sql.append("NULL"); } } @Override public Geometry decodeGeometryValue(GeometryDescriptor descriptor, ResultSet rs, String column, GeometryFactory factory, Connection cx) throws IOException, SQLException { byte[] bytes = rs.getBytes(column); if (bytes == null) { return null; } try { return new WKBReader(factory).read(bytes); } catch (ParseException e) { throw (IOException) new IOException().initCause(e); } } @Override public boolean isLimitOffsetSupported() { return delegate.isLimitOffsetSupported(); } @Override public void applyLimitOffset(StringBuffer sql, int limit, int offset) { delegate.applyLimitOffset(sql, limit, offset); } @Override public FilterToSQL createFilterToSQL() { return new H2FilterToSQL(); } }