/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2006-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.postgis;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geotools.data.Transaction;
import org.geotools.data.jdbc.JDBCUtils;
public class PostgisDBInfo {
/** The logger for the postgis module. */
protected static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.geotools.data.postgis");
String postgisVersion;
int postgisMajorVersion;
int postgisMinorVersion;
String postgresVersion;
int postgresMajorVersion;
int postgresMinorVersion;
boolean schemaEnabled = true;
boolean byteaEnabled = false;
boolean geosEnabled = false;
/**
* Creates a new DBInfo object and populates its values.
*/
public PostgisDBInfo(Connection conn) {
//get postgis version
try {
String sqlStatement = "SELECT postgis_version();";
Statement statement = conn.createStatement();
ResultSet result = statement.executeQuery(sqlStatement);
if (result.next()) {
postgisVersion = result.getString(1);
LOGGER.fine("PostGIS version is " + postgisVersion);
int[] versionNumbers;
try {
String[] values = postgisVersion.trim().split(" ");
String[] versionNumbersStr = values[0].trim().split("\\.");
versionNumbers = new int[versionNumbersStr.length];
for (int i = 0; i < versionNumbers.length; i++) {
versionNumbers[i] = Integer.parseInt(versionNumbersStr[i]);
}
postgisMajorVersion = versionNumbers[0];
postgisMinorVersion = versionNumbers[1];
// bytea function has been introduced in 0.7.2
if ((postgisMajorVersion > 0) || (postgisMinorVersion > 7)
|| ((versionNumbers.length > 2)
&& (versionNumbers[2] >= 2))) {
byteaEnabled = true;
}
} catch (Exception e) {
LOGGER.log(Level.WARNING,
"Exception occurred while parsing the version number.",
e);
}
if (postgisVersion.indexOf("USE_GEOS=1") != -1) {
this.geosEnabled = true;
} else {
//warn about not using GEOS
LOGGER.warning("GEOS is NOT enabled. This will result in limited functionality and performance.");
}
//check postgres version to determine if schemas should be
// enabled, pre 7.3 -> no
postgresVersion = conn.getMetaData().getDatabaseProductVersion();
LOGGER.fine("Postgres version is " + postgresVersion);
postgresMajorVersion = conn.getMetaData().getDatabaseMajorVersion();
postgresMinorVersion = conn.getMetaData().getDatabaseMinorVersion();
if (postgresMajorVersion < 7 || (postgresMajorVersion == 7 && postgresMinorVersion < 3)) {
schemaEnabled = false; //pre 7.3
}
}
} catch (SQLException sqle) {
String message = sqle.getMessage();
LOGGER.severe(message);
} finally {
JDBCUtils.close(conn, Transaction.AUTO_COMMIT, null);
}
}
public String getVersion() {
return postgisVersion;
}
public int getMajorVersion() {
return postgisMajorVersion;
}
public int getMinorVersion() {
return postgisMinorVersion;
}
public String getPostgresVersion() {
return postgresVersion;
}
public int getPostgresMajorVersion() {
return postgresMajorVersion;
}
public int getPostgresMinorVersion() {
return postgresMinorVersion;
}
public boolean isSchemaEnabled() {
return schemaEnabled;
}
public boolean isGeosEnabled() {
return geosEnabled;
}
public boolean isByteaEnabled() {
return byteaEnabled;
}
}