Added:
branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaDataUsingInfoSchema.java
Modified:
branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java
branches/branch_5_0/connector-j/src/com/mysql/jdbc/ResultSet.java
Log:
Added INFORMATION_SCHEMA implementation of DatabaseMetaData.
Modified: branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java
===================================================================
--- branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java 2005-07-18 00:10:17 UTC (rev 3957)
+++ branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java 2005-07-18 14:08:07 UTC (rev 3958)
@@ -306,7 +306,7 @@
protected Connection conn;
/** The 'current' database name being used */
- private String database = null;
+ protected String database = null;
/** What character to use when quoting identifiers */
private String quotedId = null;
Added: branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaDataUsingInfoSchema.java
===================================================================
--- branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaDataUsingInfoSchema.java 2005-07-18 00:10:17 UTC (rev 3957)
+++ branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaDataUsingInfoSchema.java 2005-07-18 14:08:07 UTC (rev 3958)
@@ -0,0 +1,266 @@
+/*
+ Copyright (C) 2002-2004 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of version 2 of the GNU General Public License as
+ published by the Free Software Foundation.
+
+ There are special exceptions to the terms and conditions of the GPL
+ as it is applied to this software. View the full text of the
+ exception in file EXCEPTIONS-CONNECTOR-J in the directory of this
+ software distribution.
+
+ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ */
+package com.mysql.jdbc;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * DatabaseMetaData implementation that uses INFORMATION_SCHEMA
+ * available in MySQL-5.0 and newer.
+ */
+public class DatabaseMetaDataUsingInfoSchema extends DatabaseMetaData {
+
+ public DatabaseMetaDataUsingInfoSchema(Connection connToSet,
+ String databaseToSet) {
+ super(connToSet, databaseToSet);
+ }
+
+ /**
+ * Get a description of stored procedures available in a catalog.
+ * <P>
+ * Only procedure descriptions matching the schema and procedure name
+ * criteria are returned. They are ordered by PROCEDURE_SCHEM, and
+ * PROCEDURE_NAME.
+ * </p>
+ * <P>
+ * Each procedure description has the the following columns:
+ * <OL>
+ * <li> <B>PROCEDURE_CAT</B> String => procedure catalog (may be null)
+ * </li>
+ * <li> <B>PROCEDURE_SCHEM</B> String => procedure schema (may be null)
+ * </li>
+ * <li> <B>PROCEDURE_NAME</B> String => procedure name </li>
+ * <li> reserved for future use </li>
+ * <li> reserved for future use </li>
+ * <li> reserved for future use </li>
+ * <li> <B>REMARKS</B> String => explanatory comment on the procedure </li>
+ * <li> <B>PROCEDURE_TYPE</B> short => kind of procedure:
+ * <UL>
+ * <li> procedureResultUnknown - May return a result </li>
+ * <li> procedureNoResult - Does not return a result </li>
+ * <li> procedureReturnsResult - Returns a result </li>
+ * </ul>
+ * </li>
+ * </ol>
+ * </p>
+ *
+ * @param catalog
+ * a catalog name; "" retrieves those without a catalog
+ * @param schemaPattern
+ * a schema name pattern; "" retrieves those without a schema
+ * @param procedureNamePattern
+ * a procedure name pattern
+ * @return ResultSet each row is a procedure description
+ * @throws SQLException
+ * if a database access error occurs
+ * @see #getSearchStringEscape
+ */
+ public ResultSet getProcedures(String catalog,
+ String schemaPattern,
+ String procedureNamePattern) throws SQLException {
+
+ if ((procedureNamePattern == null)
+ || (procedureNamePattern.length() == 0)) {
+ if (this.conn.getNullNamePatternMatchesAll()) {
+ procedureNamePattern = "%";
+ } else {
+ throw new SQLException(
+ "Procedure name pattern can not be NULL or empty.",
+ SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
+ }
+ }
+
+ String db = null;
+
+ if (catalog == null) {
+ db = this.database;
+ } else if (catalog.length() > 0) {
+ db = catalog;
+ } else {
+ if (!this.conn.getNullCatalogMeansCurrent()) {
+ throw new SQLException(
+ "'catalog' parameter can not be null",
+ SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
+ }
+
+ catalog = null;
+ db = null;
+ }
+
+ String sql =
+ "SELECT ROUTINE_SCHEMA AS PROCEDURE_CAT, "
+ + "NULL AS PROCEDURE_SCHEM, "
+ + "ROUTINE_NAME AS PROCEDURE_NAME, "
+ + "NULL AS RESERVED_1, "
+ + "NULL AS RESERVED_2, "
+ + "NULL AS RESERVED_3, "
+ + "ROUTINE_COMMENT AS REMARKS, "
+ + "CASE " + procedureNoResult
+ + " WHEN ROUTINE_TYPE = 'PROCEDURE' "
+ + procedureReturnsResult + " WHEN ROUTINE_TYPE='FUNCTION' ELSE "
+ + procedureResultUnknown + " AS PROCEDURE_TYPE,"
+ + "FROM INFORMATION_SCHEMA.ROUTINES WHERE "
+ + "ROUTINE_SCHEMA LIKE ? AND ROUTINE_NAME LIKE ? "
+ + "ORDER BY ROUTINE_SCHEMA, ROUTINE_NAME";
+
+ PreparedStatement pStmt = null;
+
+ try {
+ pStmt = this.conn.clientPrepareStatement(sql);
+ pStmt.setString(1, db);
+ pStmt.setString(2, procedureNamePattern);
+
+ ResultSet metadataRs = pStmt.executeQuery();
+ ((com.mysql.jdbc.ResultSet)metadataRs).setOwningStatement(null);
+
+ return metadataRs;
+ } finally {
+
+ }
+ }
+
+ /*
+ *
+ get tables
+
+ if (getMysqlVersion() > 49999)
+ {
+ sprintf(query, "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, " \
+ "IF(STRCMP(TABLE_TYPE,'BASE TABLE'), TABLE_TYPE, 'TABLE'), TABLE_COMMENT " \
+ "FROM INFORMATION_SCHEMA.TABLES WHERE " \
+ "TABLE_SCHEMA LIKE '%s' AND TABLE_NAME LIKE '%s'" \
+ "ORDER BY TABLE_TYPE, TABLE_SCHEMA, TABLE_NAME",
+ schemaName,
+ tableName);
+
+ getColumns
+
+ sprintf(query, "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE," \
+ "CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, TABLE_COMMENT," \
+ "COLUMN_DEFAULT, CHARACTER_OCTET_LENGTH, ORDINAL_POSITION, IS_NULLABLE " \
+ "FROM INFORMATION_SCHEMA.COLUMNS WHERE " \
+ "TABLE_SCHEMA LIKE '%s' AND TABLE_NAME LIKE '%s' AND COLUMN_NAME LIKE '%s' " \
+ "ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION",
+ schemaName, tableName, columnName);
+
+ getColumnPrivileges
+
+ sprintf(query, "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, GRANTEE, PRIVILEGE_TYPE, " \
+ "IS_GRANTABLE FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE " \
+ "TABLE_SCHEMA = '%s' AND TABLE_NAME ='%s' AND COLUMN_NAME LIKE '%s' ORDER BY " \
+ "COLUMN_NAME, PRIVILEGE_TYPE",
+ OUStringToOString(schema, m_pSettings->encoding).getStr(),
+ OUStringToOString(table, m_pSettings->encoding).getStr(),
+ columnName);
+
+ getTablePrivileges
+
+ if (getMysqlVersion() > 49999)
+ {
+ if (!strcasecmp("localhost", m_pSettings->pConnection->host))
+ {
+ sprintf(user, "A.GRANTEE = \"'%s'@'localhost'\" OR A.GRANTEE LIKE \"'%'@'localhost'\"",
+ m_pSettings->pConnection->user, m_pSettings->pConnection->user);
+ } else {
+ sprintf(user, "\"'%s'@'%s'\" LIKE A.GRANTEE",
+ m_pSettings->pConnection->user, m_pSettings->pConnection->host);
+ }
+
+ sprintf(query,
+ "SELECT DISTINCT A.TABLE_CATALOG, B.TABLE_SCHEMA, B.TABLE_NAME, CURRENT_USER(), " \
+ "A.PRIVILEGE_TYPE FROM INFORMATION_SCHEMA.USER_PRIVILEGES A, INFORMATION_SCHEMA.TABLES B " \
+ "WHERE B.TABLE_SCHEMA LIKE '%s' AND B.TABLE_NAME LIKE '%s' AND (%s) " \
+ "UNION " \
+ "SELECT DISTINCT A.TABLE_CATALOG, B.TABLE_SCHEMA, B.TABLE_NAME, CURRENT_USER(), A.PRIVILEGE_TYPE " \
+ "FROM INFORMATION_SCHEMA.SCHEMA_PRIVILEGES A, INFORMATION_SCHEMA.TABLES B WHERE " \
+ "B.TABLE_SCHEMA LIKE '%s' AND B.TABLE_NAME LIKE '%s' AND (%s) " \
+ "UNION "\
+ "SELECT DISTINCT A.TABLE_CATALOG, A.TABLE_SCHEMA, A.TABLE_NAME, CURRENT_USER, A.PRIVILEGE_TYPE FROM " \
+ "INFORMATION_SCHEMA.TABLE_PRIVILEGES A WHERE A.TABLE_SCHEMA LIKE '%s' AND A.TABLE_NAME LIKE '%s' " \
+ "AND (%s)",
+ schemaName, tableName, user, schemaName, tableName, user, schemaName, tableName, user );
+
+ getPrimaryKeys
+
+ sprintf(query, "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, " \
+ "SEQ_IN_INDEX FROM INFORMATION_SCHEMA.STATISTICS " \
+ "WHERE TABLE_SCHEMA LIKE '%s' AND TABLE_NAME LIKE '%s' AND " \
+ "INDEX_NAME='PRIMARY' ORDER BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX",
+ OUStringToOString(schema, m_pSettings->encoding).getStr(),
+ OUStringToOString(table, m_pSettings->encoding).getStr());
+
+ getImportedKeys
+
+ sprintf(query, "SELECT A.REFERENCED_TABLE_SCHEMA, A.REFERENCED_TABLE_NAME, " \
+ "A.REFERENCED_COLUMN_NAME, A.TABLE_SCHEMA, A.TABLE_NAME, " \
+ "A.COLUMN_NAME, A.ORDINAL_POSITION, B.CONSTRAINT_METHOD, " \
+ "A.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE A, " \
+ "INFORMATION_SCHEMA.TABLE_CONSTRAINTS B WHERE A.TABLE_SCHEMA='%s' " \
+ "AND A.CONSTRAINT_NAME=B.CONSTRAINT_NAME AND A.TABLE_NAME='%s' " \
+ "AND B.TABLE_NAME='%s' AND A.REFERENCED_TABLE_SCHEMA IS NOT NULL " \
+ "ORDER BY A.REFERENCED_TABLE_SCHEMA, A.REFERENCED_TABLE_NAME, " \
+ "A.ORDINAL_POSITION",
+
+
+
+ getExportedKeys
+
+ sprintf(query, "SELECT A.REFERENCED_TABLE_SCHEMA, A.REFERENCED_TABLE_NAME, " \
+ "A.REFERENCED_COLUMN_NAME, A.TABLE_SCHEMA, A.TABLE_NAME, " \
+ "A.COLUMN_NAME, A.ORDINAL_POSITION, B.CONSTRAINT_METHOD, A.CONSTRAINT_NAME " \
+ "FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE A,INFORMATION_SCHEMA.TABLE_CONSTRAINTS B " \
+ "WHERE A.TABLE_SCHEMA=B.TABLE_SCHEMA AND A.TABLE_NAME=B.TABLE_NAME " \
+ "AND A.CONSTRAINT_NAME=B.CONSTRAINT_NAME AND B.CONSTRAINT_METHOD IS NOT NULL " \
+ "AND A.REFERENCED_TABLE_SCHEMA='%s' AND A.REFERENCED_TABLE_NAME='%s' " \
+ "ORDER BY A.TABLE_SCHEMA, A.TABLE_NAME, A.ORDINAL_POSITION",
+ OUStringToOString(schema, m_pSettings->encoding).getStr(),
+ OUStringToOString(table, m_pSettings->encoding).getStr());
+
+ getCrossReference
+
+ sprintf(query, "SELECT A.REFERENCED_TABLE_SCHEMA, A.REFERENCED_TABLE_NAME, " \
+ "A.REFERENCED_COLUMN_NAME, A.TABLE_SCHEMA, A.TABLE_NAME, " \
+ "A.COLUMN_NAME, A.ORDINAL_POSITION, B.CONSTRAINT_METHOD, A.CONSTRAINT_NAME " \
+ "FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE A,INFORMATION_SCHEMA.TABLE_CONSTRAINTS B " \
+ "WHERE A.TABLE_SCHEMA=B.TABLE_SCHEMA AND A.TABLE_NAME=B.TABLE_NAME " \
+ "AND A.CONSTRAINT_NAME=B.CONSTRAINT_NAME AND B.CONSTRAINT_METHOD IS NOT NULL " \
+ "AND A.REFERENCED_TABLE_SCHEMA='%s' AND A.REFERENCED_TABLE_NAME='%s' " \
+ "AND A.TABLE_SCHEMA='%s' AND A.TABLE_NAME='%s' " \
+ "ORDER BY A.TABLE_SCHEMA, A.TABLE_NAME, A.ORDINAL_POSITION",
+ OUStringToOString(primarySchema, m_pSettings->encoding).getStr(),
+ OUStringToOString(primaryTable, m_pSettings->encoding).getStr(),
+ OUStringToOString(foreignSchema, m_pSettings->encoding).getStr(),
+ OUStringToOString(foreignTable, m_pSettings->encoding).getStr());
+
+ getIndexInfo
+
+ sprintf(query, "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, NON_UNIQUE, " \
+ "INDEX_NAME, SEQ_IN_INDEX, COLUMN_NAME, CARDINALITY " \
+ "FROM INFORMATION_SCHEMA.STATISTICS WHERE " \
+ "TABLE_SCHEMA LIKE '%s' AND TABLE_NAME LIKE '%s'" \
+ "ORDER BY NON_UNIQUE, INDEX_NAME, SEQ_IN_INDEX",
+ OUStringToOString(schema, m_pSettings->encoding).getStr(),
+ OUStringToOString(table, m_pSettings->encoding).getStr());
+ */
+}
Modified: branches/branch_5_0/connector-j/src/com/mysql/jdbc/ResultSet.java
===================================================================
--- branches/branch_5_0/connector-j/src/com/mysql/jdbc/ResultSet.java 2005-07-18 00:10:17 UTC (rev 3957)
+++ branches/branch_5_0/connector-j/src/com/mysql/jdbc/ResultSet.java 2005-07-18 14:08:07 UTC (rev 3958)
@@ -7595,4 +7595,8 @@
public boolean wasNull() throws SQLException {
return this.wasNullFlag;
}
+
+ protected void setOwningStatement(com.mysql.jdbc.Statement owningStatement) {
+ this.owningStatement = owningStatement;
+ }
}
| Thread |
|---|
| • Connector/J commit: r3958 - branches/branch_5_0/connector-j/src/com/mysql/jdbc | mmatthews | 18 Jul |