/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source 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; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source 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, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Emil Ong */ package com.caucho.sql; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import com.caucho.management.server.AbstractManagedObject; import com.caucho.management.server.JdbcQueryMXBean; import com.caucho.management.server.JdbcQueryResult; import com.caucho.management.server.JdbcTableColumn; public class QueryAdmin extends AbstractManagedObject implements JdbcQueryMXBean { private DBPool _pool; public QueryAdmin(DBPool pool) { _pool = pool; } public String getUrl() { return _pool.getURL(); } public JdbcQueryResult query(String sql) throws SQLException { Connection connection = null; try { connection = _pool.getConnection(); Statement statement = connection.createStatement(); JdbcQueryResult result = new JdbcQueryResult(); if (statement.execute(sql)) { ArrayList<String[]> rows = new ArrayList<String[]>(); ResultSet resultSet = statement.getResultSet(); ResultSetMetaData metadata = resultSet.getMetaData(); int columnCount = metadata.getColumnCount(); // add column names String []names = new String[columnCount]; for (int i = 0; i < columnCount; i++) names[i] = metadata.getColumnName(i + 1); result.setRowNames(names); // add results while (resultSet.next()) { String []row = new String[columnCount]; for (int i = 0; i < columnCount; i++) { try { row[i] = resultSet.getString(i + 1); } catch (SQLException e) { // MySQL zero date conversion issue if (e.getMessage().startsWith("Cannot convert value '0000-00-00")) row[i] = "0000-00-00 00:00:00"; else throw e; } } rows.add(row); } String [][]rowsArray = new String[rows.size()][]; rows.toArray(rowsArray); result.setResultData(rowsArray); return result; } return null; } finally { if (connection != null) connection.close(); } } public String []listTables() throws SQLException { Connection connection = null; try { connection = _pool.getConnection(); String catalog = connection.getCatalog(); DatabaseMetaData metadata = connection.getMetaData(); ResultSet results = metadata.getTables(catalog, null, null, null); ArrayList<String> tables = new ArrayList<String>(); while (results.next()) { String table = results.getString("TABLE_NAME"); tables.add(table); } String []tablesArray = new String[tables.size()]; tables.toArray(tablesArray); return tablesArray; } finally { if (connection != null) connection.close(); } } public JdbcTableColumn []listColumns(String table) throws SQLException { Connection connection = null; try { connection = _pool.getConnection(); DatabaseMetaData metadata = connection.getMetaData(); ResultSet results = metadata.getColumns(null, null, table, null); ArrayList<JdbcTableColumn> columns = new ArrayList<JdbcTableColumn>(); while (results.next()) { String name = results.getString("COLUMN_NAME"); String type = results.getString("TYPE_NAME"); columns.add(new JdbcTableColumn(name, type)); } JdbcTableColumn []columnsArray = new JdbcTableColumn[columns.size()]; columns.toArray(columnsArray); return columnsArray; } finally { if (connection != null) connection.close(); } } @Override public String getName() { return _pool.getName(); } void register() { registerSelf(); } public String toString() { return getClass().getSimpleName() + "[" + getObjectName() + "]"; } }