/**
*
* Copyright 2004, 2005 The Apache Software Foundation or its licensors, as applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.geronimo.console.internaldb;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.Map;
public class InternalDBHelper {
private static final int RDBMS_DERBY = 1;
private static final int RDBMS_MSSQL = 2;
private static final String JNDI_DERBY = "java:comp/env/SystemDatasource";
private static final Map derbyDBInfo = new Hashtable();
/**
* Returns the database metadata as a map.
*
* @return
*/
public Map getDBInfo() {
derbyDBInfo.clear();
Connection conn = null;
try {
conn = DerbyConnectionUtil.getSystemDBConnection();
DatabaseMetaData dbMD = (DatabaseMetaData) conn.getMetaData();
// DB
derbyDBInfo.put("URL", removeNull(dbMD.getURL()));
derbyDBInfo.put("Username", removeNull(dbMD.getUserName()));
derbyDBInfo.put("Read Only", removeNull(String.valueOf(dbMD
.isReadOnly())));
derbyDBInfo.put("DB Product Name", removeNull(dbMD
.getDatabaseProductName()));
derbyDBInfo.put("DB Product Version", removeNull(dbMD
.getDatabaseProductVersion()));
derbyDBInfo.put("DB Major Version", removeNull(String.valueOf(dbMD
.getDatabaseMajorVersion())));
derbyDBInfo.put("DB Minor Version", removeNull(String.valueOf(dbMD
.getDatabaseMinorVersion())));
// Driver
derbyDBInfo.put("Driver Name", removeNull(dbMD.getDriverName()));
derbyDBInfo.put("Driver Version", removeNull(dbMD
.getDriverVersion()));
derbyDBInfo.put("Driver Major Version", removeNull(String
.valueOf(dbMD.getDriverMajorVersion())));
derbyDBInfo.put("Driver Minor Version", removeNull(String
.valueOf(dbMD.getDriverMinorVersion())));
// JDBC
derbyDBInfo.put("JDBC Major Version", removeNull(String
.valueOf(dbMD.getJDBCMajorVersion())));
derbyDBInfo.put("JDBC Minor Version", removeNull(String
.valueOf(dbMD.getJDBCMinorVersion())));
// Functions
derbyDBInfo.put("Numeric Functions", removeNull(dbMD
.getNumericFunctions()));
derbyDBInfo.put("String Functions", removeNull(dbMD
.getStringFunctions()));
derbyDBInfo.put("System Functions", removeNull(dbMD
.getSystemFunctions()));
derbyDBInfo.put("Time Date Functions", removeNull(dbMD
.getTimeDateFunctions()));
// Etc
derbyDBInfo.put("Supported SQL Keywords", removeNull(dbMD
.getSQLKeywords().replace(',', ' ')));
derbyDBInfo.put("Supported Types", removeNull(getColumnData(dbMD
.getTypeInfo(), "TYPE_NAME")));
derbyDBInfo.put("Table Types", removeNull(getColumnData(dbMD
.getTableTypes(), "TABLE_TYPE")));
derbyDBInfo.put("Schemas", removeNull(getColumnData(dbMD
.getSchemas(), "TABLE_SCHEM")));
String tx = null;
switch (dbMD.getDefaultTransactionIsolation()) {
case Connection.TRANSACTION_NONE:
tx = "not supported";
break;
case Connection.TRANSACTION_READ_COMMITTED:
tx = "dirty reads are prevented; non-repeatable reads and phantom reads can occur";
break;
case Connection.TRANSACTION_READ_UNCOMMITTED:
tx = "dirty reads, non-repeatable reads and phantom reads can occur";
break;
case Connection.TRANSACTION_REPEATABLE_READ:
tx = "dirty reads and non-repeatable reads are prevented; phantom reads can occur";
break;
case Connection.TRANSACTION_SERIALIZABLE:
tx = "dirty reads, non-repeatable reads and phantom reads are prevented";
break;
default:
tx = "";
break;
}
derbyDBInfo.put("Default Transaction Isolation", removeNull(tx));
String holdability = null;
switch (dbMD.getResultSetHoldability()) {
case ResultSet.HOLD_CURSORS_OVER_COMMIT:
holdability = "hold cursors over commit";
break;
case ResultSet.CLOSE_CURSORS_AT_COMMIT:
holdability = "close cursors at commit";
break;
default:
holdability = "";
break;
}
derbyDBInfo.put("Result Set Holdability", removeNull(holdability));
String sqlStateType = null;
switch (dbMD.getSQLStateType()) {
case DatabaseMetaData.sqlStateXOpen:
sqlStateType = "X/Open SQL CLI";
break;
case DatabaseMetaData.sqlStateSQL99:
sqlStateType = "SQL99";
break;
default:
sqlStateType = "";
break;
}
derbyDBInfo.put("SQL State Type", removeNull(sqlStateType));
} catch (SQLException e) {
printSQLError((SQLException) e);
} finally {
// close DB connection
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// problem closing DB connection
}
}
return derbyDBInfo;
}
private String removeNull(String s) {
return ((s == null) ? "" : s);
}
/**
* Get a specific column data as a string separated by ','.
*
* @param rs
* @param colName
* @return
*/
private String getColumnData(ResultSet rs, String colName) {
StringBuffer result = new StringBuffer();
try {
ResultSetMetaData rsmd = rs.getMetaData();
// 1) Get column number
int selectedCol = -1;
int numberOfColumns = rsmd.getColumnCount();
for (int i = 1; i <= numberOfColumns; i++) {
String columnName = rsmd.getColumnName(i);
if (columnName.equals(colName)) {
selectedCol = i;
break;
}
}
// 2) Get data
boolean firstData = true;
while (rs.next()) {
for (int i = 1; i <= numberOfColumns; i++) {
if (i == selectedCol) {
if (firstData) {
firstData = false;
} else {
result.append(',');
}
String columnValue = rs.getString(i);
result.append(columnValue);
}
}
}
} catch (SQLException e) {
printSQLError((SQLException) e);
}
return result.toString();
}
/**
* Print the SQL exception including chained exceptions
* if there is one.
*
* @param e
*/
private void printSQLError(SQLException e) {
while (e != null) {
System.out.println(e.toString());
e = e.getNextException();
}
}
}