/* * RHQ Management Platform * Copyright (C) 2005-2009 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.core.db.reset; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.db.DbUtil; import org.rhq.core.db.ExtendedSQLException; //import groovy.sql.Sql; /** * @author Stefan Negrea * */ public class DBReset { private static Log log = LogFactory.getLog(DBReset.class); private static final String DB_NAME = System.getProperty("rhq.ds.db-name", "rhq_installer_test_db"); private static final String SERVER = System.getProperty("rhq.ds.server-name", "127.0.0.1"); private static final String DB_URL = System.getProperty("rhq.ds.connection-url", "jdbc:postgresql://" + SERVER + ":5432/" + DB_NAME); private static final String USER = System.getProperty("rhq.ds.user-name", "rhqadmin"); private static final String ADMIN_USER = System.getProperty("rhq.db.admin.username", "postgres"); private static final String ADMIN_PASSWORD = System.getProperty("rhq.db.admin.password", "postgres"); private static final String DB_TYPE_MAPPING = System.getProperty("rhq.ds.type-mapping", "PostgreSQL"); private static final String DB_RESET = System.getProperty("dbreset", "false"); /** * @param args */ public static void main(String[] args) { if (DB_RESET.equals("false")) { return; } DBReset dbreset = new DBReset(); try { dbreset.performDBReset(DB_TYPE_MAPPING, DB_URL, DB_NAME, USER, ADMIN_USER, ADMIN_PASSWORD); System.setProperty("dbsetup", "true"); } catch (Exception e) { log.info(e); System.exit(1); } } public void performDBReset(String dbTypeMapping, String dbUrl, String dbName, String user, String adminUser, String adminPassword) throws Exception { try { if (dbTypeMapping.equals("PostgreSQL")) { System.out.println("PostgreSQL started!"); Connection connection = null; Statement dropDB = null; Statement createDB = null; try { connection = DbUtil.getConnection(dbUrl.replace(dbName, "postgres"), adminUser, adminPassword); dropDB = connection.createStatement(); String dropSql = "drop database if exists " + dbName; try { dropDB.execute(dropSql); } catch (SQLException e) { throw new ExtendedSQLException(e, dropSql); } createDB = connection.createStatement(); String createSql = "create database " + dbName + " with owner " + user; try { createDB.execute(createSql); } catch (SQLException e) { throw new ExtendedSQLException(e, createSql); } log.info("Dropped and created postgres database " + dbName + "."); } finally { if (dropDB != null) { dropDB.close(); } if (createDB != null) { createDB.close(); } if (connection != null) { connection.close(); } } } else if (dbTypeMapping.equals("Oracle10g")) { Connection connection = null; PreparedStatement cleanUserStatement = null; try { connection = DbUtil.getConnection(dbUrl, adminUser, adminPassword); connection.setAutoCommit(false); String plsql = "declare cursor all_objects_to_drop is\n" + "select * from user_objects where object_type in ('TABLE', 'VIEW', 'FUNCTION', 'SEQUENCE');\n" + "begin\n" + " for obj in all_objects_to_drop loop\n" + " begin\n" + " if obj.object_type = 'TABLE' then\n" + " execute immediate('DROP '||obj.object_type||' '||obj.object_name||' CASCADE CONSTRAINTS PURGE');\n" + " else\n" + " execute immediate('DROP '||obj.object_type||' '||obj.object_name);\n" + " end if;\n" + " exception when others then null;\n" + " end;\n" + " end loop;\n" + " end;\n"; try { cleanUserStatement = connection.prepareStatement(plsql); } catch (SQLException e) { throw new ExtendedSQLException(e, plsql); } cleanUserStatement.execute(); connection.commit(); log.info("Cleaned Oracle database " + dbName + "."); } finally { if (cleanUserStatement != null) { cleanUserStatement.close(); } if (connection != null) { connection.close(); } } } else { throw new Exception("dbreset not supported for "+ dbTypeMapping +"!"); } } catch (SQLException e) { log.error(DbUtil.getSQLExceptionString(e)); throw e; } } }