/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2009, 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 static org.geotools.data.postgis.PostgisNGDataStoreFactory.*;
import static org.geotools.jdbc.JDBCDataStoreFactory.DATABASE;
import static org.geotools.jdbc.JDBCDataStoreFactory.DBTYPE;
import static org.geotools.jdbc.JDBCDataStoreFactory.HOST;
import static org.geotools.jdbc.JDBCDataStoreFactory.PASSWD;
import static org.geotools.jdbc.JDBCDataStoreFactory.USER;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.geotools.data.DataUtilities;
import org.geotools.feature.SchemaException;
import org.geotools.jdbc.JDBCDataStore;
import org.geotools.test.OnlineTestCase;
/**
*
*
* @source $URL$
*/
public class PostgisNGCreateDatabaseOnlineTest extends OnlineTestCase {
private static final String CREATE_DROP_TESTDB = "gt2_create_drop_testdb";
@Override
protected boolean isOnline() throws Exception {
PostgisNGDataStoreFactory factory = new PostgisNGDataStoreFactory();
JDBCDataStore closer = new JDBCDataStore();
Class.forName(factory.getDriverClassName());
// get host and port
String host = fixture.getProperty(HOST.key);
String port = fixture.getProperty(PORT.key);
String user = fixture.getProperty(USER.key);
String password = fixture.getProperty(PASSWD.key);
String url = "jdbc:postgresql" + "://" + host + ":" + port + "/template1";
Connection cx = null;
Statement st = null;
ResultSet rs = null;
try {
cx = DriverManager.getConnection(url, user, password);
st = cx.createStatement();
rs = st.executeQuery("select rolcreatedb from pg_authid where rolname = '" + user + "'");
boolean canCreate = false;
if(rs.next()) {
canCreate = rs.getBoolean(1);
}
rs.close();
if(!canCreate) {
System.out.println("User " + user + " has no database creation options, skipping test");
return false;
}
// creation options available, let's check if we have the postgis extension available then
rs = st.executeQuery("select * from pg_available_extensions where name = 'postgis'");
boolean hasPostgisExtension = false;
if(rs.next()) {
hasPostgisExtension = true;
}
rs.close();
if(!hasPostgisExtension) {
System.out.println("This version of postgresql has no postgis extension available (as in, one that can be used by the \"create extension\" command, skipping it");
return false;
}
// drop the database if available
rs = st.executeQuery("select * from pg_database where datname = 'create_drop_testdb'");
boolean databaseExists = rs.next();
rs.close();
if(databaseExists) {
st.execute("drop database " + CREATE_DROP_TESTDB);
}
return true;
} catch(SQLException e) {
System.out.println("Failed to check if the user has database creation privileges and postgis is an available extension");
e.printStackTrace();
return false;
} finally {
closer.closeSafe(rs);
closer.closeSafe(cx);
closer.closeSafe(st);
}
}
public void testCreateDrop() throws IOException, SQLException, SchemaException {
PostgisNGDataStoreFactory factory = new PostgisNGDataStoreFactory();
Properties db = fixture;
Map<String, Object> params = new HashMap<String, Object>();
params.put(HOST.key, db.getProperty(HOST.key));
params.put(DATABASE.key, CREATE_DROP_TESTDB);
params.put(PORT.key, db.getProperty(PORT.key));
params.put(USER.key, db.getProperty(USER.key));
params.put(PASSWD.key, db.getProperty(PASSWD.key));
params.put(DBTYPE.key, "postgis");
params.put(PostgisNGDataStoreFactory.CREATE_DB_IF_MISSING.key, true);
// we can work with it
assertTrue(factory.canProcess(params));
// force database creation and check the store functions
JDBCDataStore store = factory.createDataStore(params);
assertNotNull(store);
store.createSchema(DataUtilities.createType("test", "id:String,polygonProperty:Polygon:srid=32615"));
store.getSchema("test");
// now disconnect and drop
store.dispose();
factory.dropDatabase(params);
// try to connect again, it must fail
params.remove(PostgisNGDataStoreFactory.CREATE_DB_IF_MISSING.key);
try {
store = factory.createDataStore(params);
store.getTypeNames();
fail("This one should have failed, the database has just been dropped");
} catch(Exception e) {
// fine, it's what we expected
}
}
@Override
protected String getFixtureId() {
return "postgis-createdrop";
}
}