/*
* RHQ Management Platform
* Copyright (C) 2005-2008 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;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import mazz.i18n.Logger;
/**
* Provides database utilities. See also {@link DatabaseTypeFactory} for additional database functionality.
*
* @author John Mazzitelli
*
* @see DatabaseTypeFactory
*/
public class DbUtil {
private static final Logger LOG = DbUtilsI18NFactory.getLogger(DbUtil.class);
/**
* Prevents instantiation.
*/
private DbUtil() {
}
/**
* Given a JDBC URL, this will attempt to create a connection to the database. The connection can then be used to
* get the {@link DatabaseType} object via {@link DatabaseTypeFactory#getDatabaseType(Connection)}.
*
* @param jdbc_url a connection URL to the database
* @param username may be <code>null</code> in which case an anonymous login will be attempted
* @param password
*
* @return a live database connection
*
* @throws SQLException if failed to connect to the database
*/
public static Connection getConnection(String jdbc_url, String username, String password) throws SQLException {
DatabaseTypeFactory.loadJdbcDriver(jdbc_url); // ignore null return - let the connection attempt fail with exception
Connection conn;
if (username != null) {
conn = DriverManager.getConnection(jdbc_url, username, password);
} else {
conn = DriverManager.getConnection(jdbc_url);
}
return conn;
}
/**
* Pings a database by simply connecting to it. If the user credentials allow for a successful connection to the
* given JDBC URL, this returns <code>true</code>. If the connection attempt fails, this returns <code>false</code>.
*
* @param jdbc_url
* @param username
* @param password
*
* @return <code>true</code> if a connection to the database can be made
*/
public static boolean ping(String jdbc_url, String username, String password) {
Connection conn = null;
boolean ping;
try {
conn = getConnection(jdbc_url, username, password);
ping = true;
} catch (Exception e) {
conn = null;
ping = false;
} finally {
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
}
}
}
return ping;
}
/**
* Given an SQL exception, this will return a string that contains the error code and message for it and its causes.
*
* @param e the SQL exception
*
* @return error message containing all the SQL error codes and messages
*/
public static String getSQLExceptionString(SQLException e) {
StringBuilder str = new StringBuilder();
do {
if (e instanceof ExtendedSQLException) {
str.append("SQL=[" + ((ExtendedSQLException) e).getSQL() + "]; ");
}
str.append("ErrorCode=[" + e.getErrorCode() + "]; ");
str.append("SQLState=[" + e.getSQLState() + "]; ");
str.append("Message=[" + e.getMessage() + "]; ");
str.append("Type=[" + e.getClass().getName() + "]");
e = e.getNextException();
if (e != null) {
str.append(" -> ");
}
} while (e != null);
return str.toString();
}
}