List:Internals« Previous MessageNext Message »
From:mmatthews Date:July 18 2005 4:08pm
Subject:Connector/J commit: r3958 - branches/branch_5_0/connector-j/src/com/mysql/jdbc
View as plain text  
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/jdbcmmatthews18 Jul