|
What this is
Other links
The source code/* * MM JDBC Drivers for MySQL * * $Id: DatabaseMetaData.java,v 1.2 1998/08/25 00:53:46 mmatthew Exp $ * * Copyright (C) 1998 Mark Matthews <mmatthew@worldserver.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * See the COPYING file located in the top-level-directory of * the archive of this library for complete text of license. * * Some portions: * * Copyright (c) 1996 Bradley McLean / Jeffrey Medeiros * Modifications Copyright (c) 1996/1997 Martin Rode * Copyright (c) 1997 Peter T Mount */ /** * JDBC Interface to Mysql functions * * <p> * This class provides information about the database as a whole. * * <p> * Many of the methods here return lists of information in ResultSets. * You can use the normal ResultSet methods such as getString and getInt * to retrieve the data from these ResultSets. If a given form of * metadata is not available, these methods show throw a java.sql.SQLException. * * <p> * Some of these methods take arguments that are String patterns. These * methods all have names such as fooPattern. Within a pattern String "%" * means match any substring of 0 or more characters and "_" means match * any one character. * * @author Mark Matthews <mmatthew@worldserver.com> * @version $Id$ */ package org.gjt.mm.mysql; import java.sql.*; import java.net.*; import java.io.*; import java.util.Vector; public class DatabaseMetaData implements java.sql.DatabaseMetaData { private Connection _Conn; private String _Database = null; private static byte[] _Table_As_Bytes = new byte[] {'T', 'A','B', 'L', 'E'}; public DatabaseMetaData(Connection Conn, String Database) { _Conn = Conn; _Database = Database; } /** * Can all the procedures returned by getProcedures be called by the * current user? * * @return true if so */ public boolean allProceduresAreCallable() throws java.sql.SQLException { return false; // not likely we will ever check } /** * Can all the tables returned by getTable be SELECTed by the * current user? * * @return true if so */ public boolean allTablesAreSelectable() throws java.sql.SQLException { return false; // not likely we will ever check } /** * What's the url for this database? * * @return the url or null if it can't be generated */ public String getURL() throws java.sql.SQLException { return new String(_Conn.getURL()); } /** * What's our user name as known to the database? * * @return our database user name */ public String getUserName() throws java.sql.SQLException { return new String(_Conn.getUser()); } /** * Is the database in read-only mode? * * @return true if so */ public boolean isReadOnly() throws java.sql.SQLException { return false; // will this ever be true? } /** * Are NULL values sorted high? * * @return true if so */ public boolean nullsAreSortedHigh() throws java.sql.SQLException { return false; } /** * Are NULL values sorted low? * * @return true if so */ public boolean nullsAreSortedLow() throws java.sql.SQLException { return !nullsAreSortedHigh(); // a guess!? } /** * Are NULL values sorted at the start regardless of sort order? * * @return true if so */ public boolean nullsAreSortedAtStart() throws java.sql.SQLException { return false; // maybe true? } /** * Are NULL values sorted at the end regardless of sort order? * * @return true if so */ public boolean nullsAreSortedAtEnd() throws java.sql.SQLException { return false; } /** * What's the name of this database product? * * @return database product name */ public String getDatabaseProductName() throws java.sql.SQLException { return "MySQL"; } /** * What's the version of this database product? * * @return database version */ public String getDatabaseProductVersion() throws java.sql.SQLException { return new String(_Conn.getServerVersion()); } /** * What's the name of this JDBC driver? * * @return JDBC driver name */ public String getDriverName() throws java.sql.SQLException { return "Mark Matthews' MySQL Driver"; } /** * What's the version of this JDBC driver? * * @return JDBC driver version */ public String getDriverVersion() throws java.sql.SQLException { return "1.2b"; } /** * What's this JDBC driver's major version number? * * @return JDBC driver major version */ public int getDriverMajorVersion() { return Driver._MAJORVERSION; } /** * What's this JDBC driver's minor version number? * * @return JDBC driver minor version number */ public int getDriverMinorVersion() { return Driver._MINORVERSION; } /** * Does the database store tables in a local file? * * @return true if so */ public boolean usesLocalFiles() throws java.sql.SQLException { return false; } /** * Does the database use a file for each table? * * @return true if the database uses a local file for each table */ public boolean usesLocalFilePerTable() throws java.sql.SQLException { return false; } /** * Does the database support mixed case unquoted SQL identifiers? * * @return true if so */ public boolean supportsMixedCaseIdentifiers() throws java.sql.SQLException { return false; // I think } /** * Does the database store mixed case unquoted SQL identifiers in * upper case? * * @return true if so */ public boolean storesUpperCaseIdentifiers() throws java.sql.SQLException { return false; } /** * Does the database store mixed case unquoted SQL identifiers in * lower case? * * @return true if so */ public boolean storesLowerCaseIdentifiers() throws java.sql.SQLException { return false; } /** * Does the database store mixed case unquoted SQL identifiers in * mixed case? * * @return true if so */ public boolean storesMixedCaseIdentifiers() throws java.sql.SQLException { return true; // I think... } /** * Does the database support mixed case quoted SQL identifiers? * * A JDBC compliant driver will always return true. * * @return true if so */ public boolean supportsMixedCaseQuotedIdentifiers() throws java.sql.SQLException { return false; // won't work with MySQL } /** * Does the database store mixed case quoted SQL identifiers in * upper case? * * A JDBC compliant driver will always return true. * * @return true if so */ public boolean storesUpperCaseQuotedIdentifiers() throws java.sql.SQLException { return false; // don't know } /** * Does the database store mixed case quoted SQL identifiers in * lower case? * * A JDBC compliant driver will always return false. * * @return true if so */ public boolean storesLowerCaseQuotedIdentifiers() throws java.sql.SQLException { return false; } /** * Does the database store mixed case quoted SQL identifiers in * mixed case? * * A JDBC compliant driver will always return false. * * @return true if so */ public boolean storesMixedCaseQuotedIdentifiers() throws java.sql.SQLException { return false; // don't really know. } /** * What's the string used to quote SQL identifiers? * This returns a space " " if identifier quoting isn't supported. * * A JDBC compliant driver always uses a double quote character. * * @return the quoting string */ public String getIdentifierQuoteString() throws java.sql.SQLException { return " "; } /** * Get a comma separated list of all a database's SQL keywords * that are NOT also SQL92 keywords. * * @return the list */ public String getSQLKeywords() throws java.sql.SQLException { return "AUTO_INCREMENT,BINARY,BLOB,ENUM,INFILE,LOAD,MEDIUMINT,OPTION,OUTFILE,REPLACE,SET,TEXT,UNSIGNED,ZEROFILL"; } /** * Get a comma separated list of math functions. * * @return the list */ public String getNumericFunctions() throws java.sql.SQLException { return "ABS,ACOS,ASIN,ATAN,ATAN2,BIT_COUNT,CEILING,COS,COT,DEGREES,EXP,FLOOR,LOG,LOG10,MAX,MIN,MOD,PI,POW,POWER,RADIANS,RAND,ROUND,SIN,SQRT,TAN,TRUNCATE"; } /** * Get a comma separated list of string functions. * * @return the list */ public String getStringFunctions() throws java.sql.SQLException { return "ACII,CHAR,CHAR_LENGTH,CHARACTER_LENGTH,CONCAT,ELT,FIELD,FIND_IN_SET,INSERT,INSTR,INTERVAL,LCASE,LEFT,LENGTH,LOCATE,LOWER,LTRIM,MID,POSITION,OCTET_LENGTH,REPEAT,REPLACE,REVERSE,RIGHT,RTRIM,SPACE,SOUNDEX,SUBSTRING,SUBSTRING_INDEX,TRIM,UCASE,UPPER"; } /** * Get a comma separated list of system functions. * * @return the list */ public String getSystemFunctions() throws java.sql.SQLException { return "DATABASE,USER,SYSTEM_USER,SESSION_USER,PASSWORD,ENCRYPT,LAST_INSERT_ID,VERSION"; } /** * Get a comma separated list of time and date functions. * * @return the list */ public String getTimeDateFunctions() throws java.sql.SQLException { return "DAYOFWEEK,WEEKDAY,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME,MONTHNAME,QUARTER,WEEK,YEAR,HOUR,MINUTE,SECOND,PERIOD_ADD,PERIOD_DIFF,TO_DAYS,FROM_DAYS,DATE_FORMAT,TIME_FORMAT,CURDATE,CURRENT_DATE,CURTIME,CURRENT_TIME,NOW,SYSDATE,CURRENT_TIMESTAMP,UNIX_TIMESTAMP,FROM_UNIXTIME,SEC_TO_TIME,TIME_TO_SEC"; } /** * This is the string that can be used to escape '_' or '%' in * the string pattern style catalog search parameters. * * <P>The '_' character represents any single character. * <P>The '%' character represents any sequence of zero or * more characters. * @return the string used to escape wildcard characters */ public String getSearchStringEscape() throws java.sql.SQLException { return "\\"; } /** * Get all the "extra" characters that can be used in unquoted * identifier names (those beyond a-z, 0-9 and _). * * @return the string containing the extra characters */ public String getExtraNameCharacters() throws java.sql.SQLException { return ""; } /** * Is "ALTER TABLE" with add column supported? * * @return true if so */ public boolean supportsAlterTableWithAddColumn() throws java.sql.SQLException { return true; } /** * Is "ALTER TABLE" with drop column supported? * * @return true if so */ public boolean supportsAlterTableWithDropColumn() throws java.sql.SQLException { return true; } /** * Is column aliasing supported? * * <P>If so, the SQL AS clause can be used to provide names for * computed columns or to provide alias names for columns as * required. * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsColumnAliasing() throws java.sql.SQLException { return true; } /** * Are concatenations between NULL and non-NULL values NULL? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean nullPlusNonNullIsNull() throws java.sql.SQLException { return true; // not sure } /** * Is the CONVERT function between SQL types supported? * * @return true if so */ public boolean supportsConvert() throws java.sql.SQLException { return false; // not sure } /** * Is CONVERT between the given SQL types supported? * * @param fromType the type to convert from * @param toType the type to convert to * @return true if so * @see Types */ public boolean supportsConvert(int fromType, int toType) throws java.sql.SQLException { switch (fromType) { /* The char/binary types can be converted * to pretty much anything. */ case java.sql.Types.CHAR: case java.sql.Types.VARCHAR: case java.sql.Types.LONGVARCHAR: case java.sql.Types.BINARY: case java.sql.Types.VARBINARY: case java.sql.Types.LONGVARBINARY: switch (toType) { case java.sql.Types.DECIMAL: case java.sql.Types.NUMERIC: case java.sql.Types.REAL: case java.sql.Types.TINYINT: case java.sql.Types.SMALLINT: case java.sql.Types.INTEGER: case java.sql.Types.BIGINT: case java.sql.Types.FLOAT: case java.sql.Types.DOUBLE: case java.sql.Types.CHAR: case java.sql.Types.VARCHAR: case java.sql.Types.LONGVARCHAR: case java.sql.Types.BINARY: case java.sql.Types.VARBINARY: case java.sql.Types.LONGVARBINARY: case java.sql.Types.OTHER: case java.sql.Types.DATE: case java.sql.Types.TIME: case java.sql.Types.TIMESTAMP: return true; default: return false; } /* We don't handle the BIT type * yet. */ case java.sql.Types.BIT: return false; /* The numeric types. Basically they can convert * among themselves, and with char/binary types. */ case java.sql.Types.DECIMAL: case java.sql.Types.NUMERIC: case java.sql.Types.REAL: case java.sql.Types.TINYINT: case java.sql.Types.SMALLINT: case java.sql.Types.INTEGER: case java.sql.Types.BIGINT: case java.sql.Types.FLOAT: case java.sql.Types.DOUBLE: switch (toType) { case java.sql.Types.DECIMAL: case java.sql.Types.NUMERIC: case java.sql.Types.REAL: case java.sql.Types.TINYINT: case java.sql.Types.SMALLINT: case java.sql.Types.INTEGER: case java.sql.Types.BIGINT: case java.sql.Types.FLOAT: case java.sql.Types.DOUBLE: case java.sql.Types.CHAR: case java.sql.Types.VARCHAR: case java.sql.Types.LONGVARCHAR: case java.sql.Types.BINARY: case java.sql.Types.VARBINARY: case java.sql.Types.LONGVARBINARY: return true; default: return false; } /* MySQL doesn't support a NULL type. */ case java.sql.Types.NULL: return false; /* With this driver, this will always be a serialized * object, so the char/binary types will work. */ case java.sql.Types.OTHER: switch (toType) { case java.sql.Types.CHAR: case java.sql.Types.VARCHAR: case java.sql.Types.LONGVARCHAR: case java.sql.Types.BINARY: case java.sql.Types.VARBINARY: case java.sql.Types.LONGVARBINARY: return true; default: return false; } /* Dates can be converted to char/binary types. */ case java.sql.Types.DATE: switch (toType) { case java.sql.Types.CHAR: case java.sql.Types.VARCHAR: case java.sql.Types.LONGVARCHAR: case java.sql.Types.BINARY: case java.sql.Types.VARBINARY: case java.sql.Types.LONGVARBINARY: return true; default: return false; } /* Time can be converted to char/binary types */ case java.sql.Types.TIME: switch (toType) { case java.sql.Types.CHAR: case java.sql.Types.VARCHAR: case java.sql.Types.LONGVARCHAR: case java.sql.Types.BINARY: case java.sql.Types.VARBINARY: case java.sql.Types.LONGVARBINARY: return true; default: return false; } /* Timestamp can be converted to char/binary types * and date/time types (with loss of precision). */ case java.sql.Types.TIMESTAMP: switch (toType) { case java.sql.Types.CHAR: case java.sql.Types.VARCHAR: case java.sql.Types.LONGVARCHAR: case java.sql.Types.BINARY: case java.sql.Types.VARBINARY: case java.sql.Types.LONGVARBINARY: case java.sql.Types.TIME: case java.sql.Types.DATE: return true; default: return false; } /* We shouldn't get here! */ default: return false; // not sure } } /** * Are table correlation names supported? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsTableCorrelationNames() throws java.sql.SQLException { return true; // not sure } /** * If table correlation names are supported, are they restricted * to be different from the names of the tables? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsDifferentTableCorrelationNames() throws java.sql.SQLException { return true; // not sure } /** * Are expressions in "ORDER BY" lists supported? * * @return true if so */ public boolean supportsExpressionsInOrderBy() throws java.sql.SQLException { return true; } /** * Can an "ORDER BY" clause use columns not in the SELECT? * * @return true if so */ public boolean supportsOrderByUnrelated() throws java.sql.SQLException { return false; // not sure } /** * Is some form of "GROUP BY" clause supported? * * @return true if so */ public boolean supportsGroupBy() throws java.sql.SQLException { return true; } /** * Can a "GROUP BY" clause use columns not in the SELECT? * * @return true if so */ public boolean supportsGroupByUnrelated() throws java.sql.SQLException { return false; // not sure } /** * Can a "GROUP BY" clause add columns not in the SELECT * provided it specifies all the columns in the SELECT? * * @return true if so */ public boolean supportsGroupByBeyondSelect() throws java.sql.SQLException { return true; // not sure } /** * Is the escape character in "LIKE" clauses supported? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsLikeEscapeClause() throws java.sql.SQLException { return true; } /** * Are multiple ResultSets from a single execute supported? * * @return true if so */ public boolean supportsMultipleResultSets() throws java.sql.SQLException { return false; // not sure } /** * Can we have multiple transactions open at once (on different * connections)? * * @return true if so */ public boolean supportsMultipleTransactions() throws java.sql.SQLException { return true; } /** * Can columns be defined as non-nullable? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsNonNullableColumns() throws java.sql.SQLException { return true; } /** * Is the ODBC Minimum SQL grammar supported? * * All JDBC compliant drivers must return true. * * @return true if so */ public boolean supportsMinimumSQLGrammar() throws java.sql.SQLException { return true; } /** * Is the ODBC Core SQL grammar supported? * * @return true if so */ public boolean supportsCoreSQLGrammar() throws java.sql.SQLException { return true; } /** * Is the ODBC Extended SQL grammar supported? * * @return true if so */ public boolean supportsExtendedSQLGrammar() throws java.sql.SQLException { return false; // not sure at all } /** * Is the ANSI92 entry level SQL grammar supported? * * All JDBC compliant drivers must return true. * * @return true if so */ public boolean supportsANSI92EntryLevelSQL() throws java.sql.SQLException { return true; } /** * Is the ANSI92 intermediate SQL grammar supported? * * @return true if so */ public boolean supportsANSI92IntermediateSQL() throws java.sql.SQLException { return false; // not sure } /** * Is the ANSI92 full SQL grammar supported? * * @return true if so */ public boolean supportsANSI92FullSQL() throws java.sql.SQLException { return false; // not sure } /** * Is the SQL Integrity Enhancement Facility supported? * * @return true if so */ public boolean supportsIntegrityEnhancementFacility() throws java.sql.SQLException { return false; // not sure } /** * Is some form of outer join supported? * * @return true if so */ public boolean supportsOuterJoins() throws java.sql.SQLException { return true; } /** * Are full nested outer joins supported? * * @return true if so */ public boolean supportsFullOuterJoins() throws java.sql.SQLException { return false; // not sure } /** * Is there limited support for outer joins? (This will be true * if supportFullOuterJoins is true.) * * @return true if so */ public boolean supportsLimitedOuterJoins() throws java.sql.SQLException { return true; } /** * What's the database vendor's preferred term for "schema"? * * @return the vendor term */ public String getSchemaTerm() throws java.sql.SQLException { return ""; } /** * What's the database vendor's preferred term for "procedure"? * * @return the vendor term */ public String getProcedureTerm() throws java.sql.SQLException { return ""; } /** * What's the database vendor's preferred term for "catalog"? * * @return the vendor term */ public String getCatalogTerm() throws java.sql.SQLException { return "database"; } /** * Does a catalog appear at the start of a qualified table name? * (Otherwise it appears at the end) * * @return true if it appears at the start */ public boolean isCatalogAtStart() throws java.sql.SQLException { return true; } /** * What's the separator between catalog and table name? * * @return the separator string */ public String getCatalogSeparator() throws java.sql.SQLException { return "."; } /** * Can a schema name be used in a data manipulation statement? * * @return true if so */ public boolean supportsSchemasInDataManipulation() throws java.sql.SQLException { return false; } /** * Can a schema name be used in a procedure call statement? * * @return true if so */ public boolean supportsSchemasInProcedureCalls() throws java.sql.SQLException { return false; } /** * Can a schema name be used in a table definition statement? * * @return true if so */ public boolean supportsSchemasInTableDefinitions() throws java.sql.SQLException { return false; } /** * Can a schema name be used in an index definition statement? * * @return true if so */ public boolean supportsSchemasInIndexDefinitions() throws java.sql.SQLException { return false; } /** * Can a schema name be used in a privilege definition statement? * * @return true if so */ public boolean supportsSchemasInPrivilegeDefinitions() throws java.sql.SQLException { return false; } /** * Can a catalog name be used in a data manipulation statement? * * @return true if so */ public boolean supportsCatalogsInDataManipulation() throws java.sql.SQLException { // Servers before 3.22 could not do this if (_Conn.getServerMajorVersion() >= 3) { // newer than version 3? if (_Conn.getServerMajorVersion() == 3) { if (_Conn.getServerMinorVersion() >= 22) { // minor 22? return true; } else { return false; // Old version 3 } } else { return true; // newer than version 3.22 } } else { return false; // older than version 3 } } /** * Can a catalog name be used in a procedure call statement? * * @return true if so */ public boolean supportsCatalogsInProcedureCalls() throws java.sql.SQLException { return false; } /** * Can a catalog name be used in a table definition statement? * * @return true if so */ public boolean supportsCatalogsInTableDefinitions() throws java.sql.SQLException { return false; } /** * Can a catalog name be used in a index definition statement? * * @return true if so */ public boolean supportsCatalogsInIndexDefinitions() throws java.sql.SQLException { return false; } /** * Can a catalog name be used in a privilege definition statement? * * @return true if so */ public boolean supportsCatalogsInPrivilegeDefinitions() throws java.sql.SQLException { return false; } /** * Is positioned DELETE supported? * * @return true if so */ public boolean supportsPositionedDelete() throws java.sql.SQLException { return false; } /** * Is positioned UPDATE supported? * * @return true if so */ public boolean supportsPositionedUpdate() throws java.sql.SQLException { return false; } /** * Is SELECT for UPDATE supported? * * @return true if so */ public boolean supportsSelectForUpdate() throws java.sql.SQLException { return false; } /** * Are stored procedure calls using the stored procedure escape * syntax supported? * * @return true if so */ public boolean supportsStoredProcedures() throws java.sql.SQLException { return false; } /** * Are subqueries in comparison expressions supported? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsSubqueriesInComparisons() throws java.sql.SQLException { return true; // not sure } /** * Are subqueries in exists expressions supported? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsSubqueriesInExists() throws java.sql.SQLException { return false; // no sub-queries yet } /** * Are subqueries in "in" statements supported? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsSubqueriesInIns() throws java.sql.SQLException { return false; // no sub-queries yet } /** * Are subqueries in quantified expressions supported? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsSubqueriesInQuantifieds() throws java.sql.SQLException { return false; // no sub-queries yet } /** * Are correlated subqueries supported? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsCorrelatedSubqueries() throws java.sql.SQLException { return false; // no sub-queries yet } /** * Is SQL UNION supported? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsUnion() throws java.sql.SQLException { return false; // not sure } /** * Is SQL UNION ALL supported? * * A JDBC compliant driver always returns true. * * @return true if so */ public boolean supportsUnionAll() throws java.sql.SQLException { return false; // not sure } /** * Can cursors remain open across commits? * * @return true if so * @see Connection#disableAutoClose */ public boolean supportsOpenCursorsAcrossCommit() throws java.sql.SQLException { return false; } /** * Can cursors remain open across rollbacks? * * @return true if so * @see Connection#disableAutoClose */ public boolean supportsOpenCursorsAcrossRollback() throws java.sql.SQLException { return false; } /** * Can statements remain open across commits? * * @return true if so * @see Connection#disableAutoClose */ public boolean supportsOpenStatementsAcrossCommit() throws java.sql.SQLException { return false; } /** * Can statements remain open across rollbacks? * * @return true if so * @see Connection#disableAutoClose */ public boolean supportsOpenStatementsAcrossRollback() throws java.sql.SQLException { return false; } //---------------------------------------------------------------------- // The following group of methods exposes various limitations // based on the target database with the current driver. // Unless otherwise specified, a result of zero means there is no // limit, or the limit is not known. /** * How many hex characters can you have in an inline binary literal? * * @return max literal length */ public int getMaxBinaryLiteralLength() throws java.sql.SQLException { return 16777208; } /** * What's the max length for a character literal? * * @return max literal length */ public int getMaxCharLiteralLength() throws java.sql.SQLException { return 16777208; } /** * What's the limit on column name length? * * @return max literal length */ public int getMaxColumnNameLength() throws java.sql.SQLException { return 32; } /** * What's the maximum number of columns in a "GROUP BY" clause? * * @return max number of columns */ public int getMaxColumnsInGroupBy() throws java.sql.SQLException { return 16; } /** * What's the maximum number of columns allowed in an index? * * @return max columns */ public int getMaxColumnsInIndex() throws java.sql.SQLException { return 16; } /** * What's the maximum number of columns in an "ORDER BY" clause? * * @return max columns */ public int getMaxColumnsInOrderBy() throws java.sql.SQLException { return 16; } /** * What's the maximum number of columns in a "SELECT" list? * * @return max columns */ public int getMaxColumnsInSelect() throws java.sql.SQLException { return 256; } /** * What's maximum number of columns in a table? * * @return max columns */ public int getMaxColumnsInTable() throws java.sql.SQLException { return 512; } /** * How many active connections can we have at a time to this database? * * @return max connections */ public int getMaxConnections() throws java.sql.SQLException { return 0; } /** * What's the maximum cursor name length? * * @return max cursor name length in bytes */ public int getMaxCursorNameLength() throws java.sql.SQLException { return 64; } /** * What's the maximum length of an index (in bytes)? * * @return max index length in bytes */ public int getMaxIndexLength() throws java.sql.SQLException { return 128; } /** * What's the maximum length allowed for a schema name? * * @return max name length in bytes */ public int getMaxSchemaNameLength() throws java.sql.SQLException { return 0; } /** * What's the maximum length of a procedure name? * * @return max name length in bytes */ public int getMaxProcedureNameLength() throws java.sql.SQLException { return 0; } /** * What's the maximum length of a catalog name? * * @return max name length in bytes */ public int getMaxCatalogNameLength() throws java.sql.SQLException { return 32; } /** * What's the maximum length of a single row? * * @return max row size in bytes */ public int getMaxRowSize() throws java.sql.SQLException { return Integer.MAX_VALUE - 8; // Max buffer size - HEADER } /** * Did getMaxRowSize() include LONGVARCHAR and LONGVARBINARY * blobs? * * @return true if so */ public boolean doesMaxRowSizeIncludeBlobs() throws java.sql.SQLException { return true; } /** * What's the maximum length of a SQL statement? * * @return max length in bytes */ public int getMaxStatementLength() throws java.sql.SQLException { return MysqlIO.MAXBUF - 4; // Max buffer - header } /** * How many active statements can we have open at one time to this * database? * * @return the maximum */ public int getMaxStatements() throws java.sql.SQLException { return 0; } /** * What's the maximum length of a table name? * * @return max name length in bytes */ public int getMaxTableNameLength() throws java.sql.SQLException { return 32; } /** * What's the maximum number of tables in a SELECT? * * @return the maximum */ public int getMaxTablesInSelect() throws java.sql.SQLException { return 256; } /** * What's the maximum length of a user name? * * @return max name length in bytes */ public int getMaxUserNameLength() throws java.sql.SQLException { return 16; } //---------------------------------------------------------------------- /** * What's the database's default transaction isolation level? The * values are defined in java.sql.Connection. * * @return the default isolation level * @see Connection */ public int getDefaultTransactionIsolation() throws java.sql.SQLException { return java.sql.Connection.TRANSACTION_NONE; } /** * Are transactions supported? If not, commit is a noop and the * isolation level is TRANSACTION_NONE. * * @return true if transactions are supported */ public boolean supportsTransactions() throws java.sql.SQLException { return false; } /** * Does the database support the given transaction isolation level? * * @param level the values are defined in java.sql.Connection * @return true if so * @see Connection */ public boolean supportsTransactionIsolationLevel(int level) throws java.sql.SQLException { return false; } /** * Are both data definition and data manipulation statements * within a transaction supported? * * @return true if so */ public boolean supportsDataDefinitionAndDataManipulationTransactions() throws java.sql.SQLException { return false; } /** * Are only data manipulation statements within a transaction * supported? * * @return true if so */ public boolean supportsDataManipulationTransactionsOnly() throws java.sql.SQLException { return false; } /** * Does a data definition statement within a transaction force the * transaction to commit? * * @return true if so */ public boolean dataDefinitionCausesTransactionCommit() throws java.sql.SQLException { return false; } /** * Is a data definition statement within a transaction ignored? * * @return true if so */ public boolean dataDefinitionIgnoredInTransactions() throws java.sql.SQLException { return false; } /** * 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>Each procedure description has the the following columns: * <OL> * <LI>PROCEDURE_CAT String => procedure catalog (may be null) * <LI>PROCEDURE_SCHEM String => procedure schema (may be null) * <LI>PROCEDURE_NAME String => procedure name * <LI> reserved for future use * <LI> reserved for future use * <LI> reserved for future use * <LI>REMARKS String => explanatory comment on the procedure * <LI>PROCEDURE_TYPE short => kind of procedure: * <UL> * <LI> procedureResultUnknown - May return a result * <LI> procedureNoResult - Does not return a result * <LI> procedureReturnsResult - Returns a result * </UL> * </OL> * * @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 * @see #getSearchStringEscape */ public java.sql.ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws java.sql.SQLException { Field[] Fields = new Field[8]; Fields[0] = new Field("", "PROCEDURE_CAT", Types.CHAR, 0); Fields[1] = new Field("", "PROCEDURE_SCHEM", Types.CHAR, 0); Fields[2] = new Field("", "PROCEDURE_NAME", Types.CHAR, 0); Fields[3] = new Field("", "resTABLE_CAT", Types.CHAR, 0); Fields[4] = new Field("", "resTABLE_CAT", Types.CHAR, 0); Fields[5] = new Field("", "resTABLE_CAT", Types.CHAR, 0); Fields[6] = new Field("", "REMARKS", Types.CHAR, 0); Fields[7] = new Field("", "PROCEDURE_TYPE", Types.SMALLINT, 0); return new ResultSet(Fields, new Vector(), _Conn); } /** * Get a description of a catalog's stored procedure parameters * and result columns. * * <P>Only descriptions matching the schema, procedure and * parameter name criteria are returned. They are ordered by * PROCEDURE_SCHEM and PROCEDURE_NAME. Within this, the return value, * if any, is first. Next are the parameter descriptions in call * order. The column descriptions follow in column number order. * * <P>Each row in the ResultSet is a parameter desription or * column description with the following fields: * <OL> * <LI>PROCEDURE_CAT String => procedure catalog (may be null) * <LI>PROCEDURE_SCHEM String => procedure schema (may be null) * <LI>PROCEDURE_NAME String => procedure name * <LI>COLUMN_NAME String => column/parameter name * <LI>COLUMN_TYPE Short => kind of column/parameter: * <UL> * <LI> procedureColumnUnknown - nobody knows * <LI> procedureColumnIn - IN parameter * <LI> procedureColumnInOut - INOUT parameter * <LI> procedureColumnOut - OUT parameter * <LI> procedureColumnReturn - procedure return value * <LI> procedureColumnResult - result column in ResultSet * </UL> * <LI>DATA_TYPE short => SQL type from java.sql.Types * <LI>TYPE_NAME String => SQL type name * <LI>PRECISION int => precision * <LI>LENGTH int => length in bytes of data * <LI>SCALE short => scale * <LI>RADIX short => radix * <LI>NULLABLE short => can it contain NULL? * <UL> * <LI> procedureNoNulls - does not allow NULL values * <LI> procedureNullable - allows NULL values * <LI> procedureNullableUnknown - nullability unknown * </UL> * <LI>REMARKS String => comment describing parameter/column * </OL> * * <P>Note: Some databases may not return the column * descriptions for a procedure. Additional columns beyond * REMARKS can be defined by the database. * * @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 * @param columnNamePattern a column name pattern * @return ResultSet each row is a stored procedure parameter or * column description * @see #getSearchStringEscape */ public java.sql.ResultSet getProcedureColumns(String Catalog, String SchemaPattern, String ProcedureNamePattern, String ColumnNamePattern) throws java.sql.SQLException { Field[] Fields = new Field[14]; Fields[0] = new Field("", "TABLE_CAT", Types.CHAR, 0); Fields[1] = new Field("", "PROCEDURE_CAT", Types.CHAR, 0); Fields[2] = new Field("", "PROCEDURE_SCHEM", Types.CHAR, 0); Fields[3] = new Field("", "PROCEDURE_NAME", Types.CHAR, 0); Fields[4] = new Field("", "COLUMN_NAME", Types.CHAR, 0); Fields[5] = new Field("", "COLUMN_TYPE", Types.CHAR, 0); Fields[6] = new Field("", "DATA_TYPE", Types.SMALLINT, 0); Fields[7] = new Field("", "TYPE_NAME", Types.CHAR, 0); Fields[8] = new Field("", "PRECISION", Types.INTEGER, 0); Fields[9] = new Field("", "LENGTH", Types.INTEGER, 0); Fields[10] = new Field("", "SCALE", Types.SMALLINT, 0); Fields[11] = new Field("", "RADIX", Types.SMALLINT, 0); Fields[12] = new Field("", "NULLABLE", Types.SMALLINT, 0); Fields[13] = new Field("", "REMARKS", Types.CHAR, 0); return new ResultSet(Fields, new Vector(), _Conn); } /** * Get a description of tables available in a catalog. * * <P>Only table descriptions matching the catalog, schema, table * name and type criteria are returned. They are ordered by * TABLE_TYPE, TABLE_SCHEM and TABLE_NAME. * * <P>Each table description has the following columns: * <OL> * <LI>TABLE_CAT String => table catalog (may be null) * <LI>TABLE_SCHEM String => table schema (may be null) * <LI>TABLE_NAME String => table name * <LI>TABLE_TYPE String => table type. Typical types are "TABLE", * "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", * "LOCAL TEMPORARY", "ALIAS", "SYNONYM". * <LI>REMARKS String => explanatory comment on the table * </OL> * * <P>Note: Some databases may not return information for * all tables. * * @param catalog a catalog name; "" retrieves those without a catalog * @param schemaPattern a schema name pattern; "" retrieves those * without a schema * @param tableNamePattern a table name pattern * @param types a list of table types to include; null returns all types * @return ResultSet each row is a table description * @see #getSearchStringEscape */ public java.sql.ResultSet getTables(String Catalog, String SchemaPattern, String TableNamePattern, String Types[]) throws java.sql.SQLException { String DB_Sub = ""; if (Catalog != null) { if (!Catalog.equals("")) { DB_Sub = " FROM " + Catalog; } } else { DB_Sub = " FROM " + _Database; } if (TableNamePattern == null) { TableNamePattern = "%"; } java.sql.ResultSet RS = _Conn.createStatement().executeQuery( "show tables " + DB_Sub + " like '" + TableNamePattern + "'"); java.sql.ResultSetMetaData RsMd = RS.getMetaData(); Field[] Fields = new Field[5]; Fields[0] = new Field("", "TABLE_CAT", java.sql.Types.VARCHAR, (Catalog == null) ? 0 : Catalog.length()); Fields[1] = new Field("", "TABLE_SCHEM", java.sql.Types.VARCHAR, 0); Fields[2] = new Field("", "TABLE_NAME", java.sql.Types.VARCHAR, 255); Fields[3] = new Field("", "TABLE_TYPE", java.sql.Types.VARCHAR, 5); Fields[4] = new Field("", "REMARKS", java.sql.Types.VARCHAR, 0); Vector Tuples = new Vector(); byte[][] Row = null; while (RS.next()) { String Name = RS.getString(1); Row = new byte[5][]; Row[0] = (Catalog == null) ? new byte[0]:Catalog.getBytes(); Row[1] = new byte[0]; Row[2] = Name.getBytes(); Row[3] = _Table_As_Bytes; Row[4] = new byte[0]; Tuples.addElement(Row); } ResultSet Results = new ResultSet(Fields, Tuples, _Conn); return Results; } /** * Get the schema names available in this database. The results * are ordered by schema name. * * <P>The schema column is: * <OL> * <LI>TABLE_SCHEM String => schema name * </OL> * * @return ResultSet each row has a single String column that is a * schema name */ public java.sql.ResultSet getSchemas() throws java.sql.SQLException { Field[] Fields = new Field[1]; Fields[0] = new Field("", "TABLE_SCHEM", java.sql.Types.CHAR, 0); Vector Tuples = new Vector(); ResultSet RS = new ResultSet(Fields, Tuples, _Conn); return RS; } /** * Get the catalog names available in this database. The results * are ordered by catalog name. * * <P>The catalog column is: * <OL> * <LI>TABLE_CAT String => catalog name * </OL> * * @return ResultSet each row has a single String column that is a * catalog name */ public java.sql.ResultSet getCatalogs() throws java.sql.SQLException { java.sql.ResultSet RS = _Conn.createStatement().executeQuery( "SHOW DATABASES"); java.sql.ResultSetMetaData RSMD = RS.getMetaData(); Field[] Fields = new Field[1]; Fields[0] = new Field("", "TABLE_CAT", Types.VARCHAR, RSMD.getColumnDisplaySize(1)); Vector Tuples = new Vector(); while (RS.next()) { byte[][] RowVal = new byte[1][]; RowVal[0] = RS.getBytes(1); Tuples.addElement(RowVal); } return new ResultSet(Fields, Tuples, _Conn); } /** * Get the table types available in this database. The results * are ordered by table type. * * <P>The table type is: * <OL> * <LI>TABLE_TYPE String => table type. Typical types are "TABLE", * "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", * "LOCAL TEMPORARY", "ALIAS", "SYNONYM". * </OL> * * @return ResultSet each row has a single String column that is a * table type */ public java.sql.ResultSet getTableTypes() throws java.sql.SQLException { Vector Tuples = new Vector(); Field[] Fields = new Field[1]; Fields[0] = new Field("", "TABLE_TYPE", Types.VARCHAR, 5); byte[][] TType = new byte[1][]; TType[0] = _Table_As_Bytes; Tuples.addElement(TType); return new ResultSet(Fields, Tuples, _Conn); } /** * Get a description of table columns available in a catalog. * * <P>Only column descriptions matching the catalog, schema, table * and column name criteria are returned. They are ordered by * TABLE_SCHEM, TABLE_NAME and ORDINAL_POSITION. * * <P>Each column description has the following columns: * <OL> * <LI>TABLE_CAT String => table catalog (may be null) * <LI>TABLE_SCHEM String => table schema (may be null) * <LI>TABLE_NAME String => table name * <LI>COLUMN_NAME String => column name * <LI>DATA_TYPE short => SQL type from java.sql.Types * <LI>TYPE_NAME String => Data source dependent type name * <LI>COLUMN_SIZE int => column size. For char or date * types this is the maximum number of characters, for numeric or * decimal types this is precision. * <LI>BUFFER_LENGTH is not used. * <LI>DECIMAL_DIGITS int => the number of fractional digits * <LI>NUM_PREC_RADIX int => Radix (typically either 10 or 2) * <LI>NULLABLE int => is NULL allowed? * <UL> * <LI> columnNoNulls - might not allow NULL values * <LI> columnNullable - definitely allows NULL values * <LI> columnNullableUnknown - nullability unknown * </UL> * <LI>REMARKS String => comment describing column (may be null) * <LI>COLUMN_DEF String => default value (may be null) * <LI>SQL_DATA_TYPE int => unused * <LI>SQL_DATETIME_SUB int => unused * <LI>CHAR_OCTET_LENGTH int => for char types the * maximum number of bytes in the column * <LI>ORDINAL_POSITION int => index of column in table * (starting at 1) * <LI>IS_NULLABLE String => "NO" means column definitely * does not allow NULL values; "YES" means the column might * allow NULL values. An empty string means nobody knows. * </OL> * * @param catalog a catalog name; "" retrieves those without a catalog * @param schemaPattern a schema name pattern; "" retrieves those * without a schema * @param tableNamePattern a table name pattern * @param columnNamePattern a column name pattern * @return ResultSet each row is a column description * @see #getSearchStringEscape */ public java.sql.ResultSet getColumns(String Catalog, String SchemaPattern, String TableName, String ColumnNamePattern) throws java.sql.SQLException { String DB_Sub = ""; if (ColumnNamePattern == null) { ColumnNamePattern = "%"; } if (Catalog != null) { if (!Catalog.equals("")) { DB_Sub = " FROM " + Catalog; } } else { DB_Sub = " FROM " + _Database; } Vector TableNameList = new Vector(); int tablename_length = 0; if (TableName == null) { // Select from all tables java.sql.ResultSet Tables = getTables(Catalog, SchemaPattern, "%", new String[0]); while (Tables.next()) { String TN = Tables.getString("TABLE_NAME"); TableNameList.addElement(TN); if (TN.length() > tablename_length) { tablename_length = TN.length(); } } Tables.close(); } else { TableNameList.addElement(TableName); tablename_length = TableName.length(); } int catalog_length = 0; if (Catalog != null) { catalog_length = Catalog.length(); } java.util.Enumeration TableNames = TableNameList.elements(); Field[] Fields = new Field[18]; Fields[0] = new Field("", "TABLE_CAT" , Types.CHAR, catalog_length); Fields[1] = new Field("", "TABLE_SCHEM" , Types.CHAR, 0); Fields[2] = new Field("", "TABLE_NAME" , Types.CHAR, tablename_length); Fields[3] = new Field("", "COLUMN_NAME" , Types.CHAR, 32); Fields[4] = new Field("", "DATA_TYPE" , Types.SMALLINT, 5); Fields[5] = new Field("", "TYPE_NAME" , Types.CHAR, 16); Fields[6] = new Field("", "COLUMN_SIZE" , Types.INTEGER, Integer.toString(Integer.MAX_VALUE).length()); Fields[7] = new Field("", "BUFFER_LENGTH" , Types.INTEGER, 10); Fields[8] = new Field("", "DECIMAL_DIGITS" , Types.INTEGER, 10); Fields[9] = new Field("", "NUM_PREC_RADIX" , Types.INTEGER, 10); Fields[10] = new Field("", "NULLABLE" , Types.INTEGER, 10); Fields[11] = new Field("", "REMARKS" , Types.CHAR, 0); Fields[12] = new Field("", "COLUMN_DEF" , Types.CHAR, 0); Fields[13] = new Field("", "SQL_DATA_TYPE" , Types.INTEGER, 10); Fields[14] = new Field("", "SQL_DATETIME_SUB", Types.INTEGER, 10); Fields[15] = new Field("", "CHAR_OCTET_LENGTH", Types.INTEGER, Integer.toString(Integer.MAX_VALUE).length()); Fields[16] = new Field("", "ORDINAL_POSITION" , Types.INTEGER, 10); Fields[17] = new Field("", "IS_NULLABLE" , Types.CHAR, 3); Vector Tuples = new Vector(); while (TableNames.hasMoreElements()) { String TableNamePattern = (String)TableNames.nextElement(); org.gjt.mm.mysql.ResultSet RS = _Conn.execSQL( "show columns from " + TableNamePattern + DB_Sub + " like '" + ColumnNamePattern + "'", -1); RS.setConnection(_Conn); java.sql.ResultSetMetaData RSMD = RS.getMetaData(); int ord_pos = 1; /* * Fix up Catalog and TableName */ if (Catalog == null) { Catalog = ""; } if (TableName == null) { TableName = ""; } while (RS.next()) { byte[][] RowVal = new byte[18][]; RowVal[0] = Catalog.getBytes(); // TABLE_CAT RowVal[1] = new byte[0]; // TABLE_SCHEM (No schemas in MySQL) RowVal[2] = TableName.getBytes(); // TABLE_NAME RowVal[3] = RS.getBytes("Field"); String TypeInfo = RS.getString("Type"); if (Driver.debug) { System.out.println("Type: " + TypeInfo); } String MysqlType = ""; if (TypeInfo.indexOf("(") != -1) { MysqlType = TypeInfo.substring(0, TypeInfo.indexOf("(")); } else { MysqlType = TypeInfo; } /* * Convert to XOPEN (thanks JK) */ RowVal[4] = Integer.toString(MysqlDefs.mysqlToJavaType(MysqlType)).getBytes(); // DATA_TYPE (jdbc) RowVal[5] = MysqlType.getBytes(); // TYPE_NAME (native) // Figure Out the Size if (TypeInfo != null) { if (TypeInfo.indexOf("enum") != -1) { String Temp = TypeInfo.substring(TypeInfo.indexOf("("), TypeInfo.indexOf(")")); java.util.StringTokenizer ST = new java.util.StringTokenizer(Temp, ","); int max_length = 0; while (ST.hasMoreTokens()) { max_length = Math.max(max_length, (ST.nextToken().length() - 2)); } RowVal[6] = Integer.toString(max_length).getBytes(); RowVal[8] = new byte[] {(byte)'0'}; } else if (TypeInfo.indexOf(",") != -1) { // Numeric with decimals String Size = TypeInfo.substring((TypeInfo.indexOf("(") + 1), (TypeInfo.indexOf(","))); String Decimals = TypeInfo.substring((TypeInfo.indexOf(",") + 1), (TypeInfo.indexOf(")"))); RowVal[6] = Size.getBytes(); RowVal[8] = Decimals.getBytes(); } else { String Size = "0"; /* If the size is specified with the DDL, use that */ if (TypeInfo.indexOf("(") != -1) { Size = TypeInfo.substring((TypeInfo.indexOf("(") + 1), (TypeInfo.indexOf(")"))); } /* Otherwise resort to defaults */ else if (TypeInfo.toLowerCase().equals("tinyint")) { Size = "1"; } else if (TypeInfo.toLowerCase().equals("smallint")) { Size = "6"; } else if (TypeInfo.toLowerCase().equals("mediumint")) { Size = "6"; } else if (TypeInfo.toLowerCase().equals("int")) { Size = "11"; } else if (TypeInfo.toLowerCase().equals("integer")) { Size = "11"; } else if (TypeInfo.toLowerCase().equals("bigint")) { Size = "25"; } else if (TypeInfo.toLowerCase().equals("int24")) { Size = "25"; } else if (TypeInfo.toLowerCase().equals("real")) { Size = "12"; } else if (TypeInfo.toLowerCase().equals("float")) { Size = "12"; } else if (TypeInfo.toLowerCase().equals("decimal")) { Size = "12"; } else if (TypeInfo.toLowerCase().equals("numeric")) { Size = "12"; } else if (TypeInfo.toLowerCase().equals("double")) { Size = "22"; } else if (TypeInfo.toLowerCase().equals("char")) { Size = "1"; } else if (TypeInfo.toLowerCase().equals("varchar")) { Size = "255"; } else if (TypeInfo.toLowerCase().equals("date")) { Size = "10"; } else if (TypeInfo.toLowerCase().equals("time")) { Size = "8"; } else if (TypeInfo.toLowerCase().equals("timestamp")) { Size = "19"; } else if (TypeInfo.toLowerCase().equals("datetime")) { Size = "19"; } else if (TypeInfo.toLowerCase().equals("tinyblob")) { Size = "255"; } else if (TypeInfo.toLowerCase().equals("blob")) { Size = Integer.toString(Math.min(65535, MysqlIO.getMaxBuf())); } else if (TypeInfo.toLowerCase().equals("mediumblob")) { Size = Integer.toString(Math.min(16277215, MysqlIO.getMaxBuf())); } else if (TypeInfo.toLowerCase().equals("longblob")) { Size = (Integer.toString(MysqlIO.getMaxBuf()).compareTo("2147483657") < 0 ? Integer.toString(MysqlIO.getMaxBuf()) : "2147483657"); } else if (TypeInfo.toLowerCase().equals("tinytext")) { Size = "255"; } else if (TypeInfo.toLowerCase().equals("text")) { Size = "65535"; } else if (TypeInfo.toLowerCase().equals("mediumtext")) { Size = Integer.toString(Math.min(16277215, MysqlIO.getMaxBuf())); } else if (TypeInfo.toLowerCase().equals("enum")) { Size = "255"; } else if (TypeInfo.toLowerCase().equals("set")) { Size = "255"; } RowVal[6] = Size.getBytes(); RowVal[8] = new byte[] {(byte)'0'}; } } else { RowVal[8] = new byte[] {(byte)'0'}; RowVal[6] = new byte[] {(byte)'0'}; } RowVal[7] = Integer.toString(MysqlIO.MAXBUF).getBytes(); // BUFFER_LENGTH RowVal[9] = new byte[] {(byte)'1',(byte)'0'}; // NUM_PREC_RADIX (is this right for char?) String Nullable = RS.getString("Null"); // Nullable? if (Nullable != null) { if (Nullable.equals("YES")) { RowVal[10] = Integer.toString(columnNullable).getBytes(); RowVal[17] = new String("YES").getBytes(); // IS_NULLABLE } else { RowVal[10] = Integer.toString(columnNoNulls).getBytes(); RowVal[17] = new String("NO").getBytes(); } } else { RowVal[10] = Integer.toString(columnNoNulls).getBytes(); RowVal[17] = new String("NO").getBytes(); } RowVal[11] = new byte[0]; // REMARK // COLUMN_DEF byte[] Default = RS.getBytes("Default"); if (Default != null) { RowVal[12] = Default; } else { RowVal[12] = new byte[0]; } RowVal[13] = new byte[] {(byte)'0'}; // SQL_DATA_TYPE RowVal[14] = new byte[] {(byte)'0'}; // SQL_DATE_TIME_SUB RowVal[15] = RowVal[6]; // CHAR_OCTET_LENGTH RowVal[16] = Integer.toString(ord_pos++).getBytes(); // ORDINAL_POSITION Tuples.addElement(RowVal); } RS.close(); } ResultSet Results = new ResultSet(Fields, Tuples, _Conn); return Results; } /** * Get a description of the access rights for a table's columns. * * <P>Only privileges matching the column name criteria are * returned. They are ordered by COLUMN_NAME and PRIVILEGE. * * <P>Each privilige description has the following columns: * <OL> * <LI>TABLE_CAT String => table catalog (may be null) * <LI>TABLE_SCHEM String => table schema (may be null) * <LI>TABLE_NAME String => table name * <LI>COLUMN_NAME String => column name * <LI>GRANTOR => grantor of access (may be null) * <LI>GRANTEE String => grantee of access * <LI>PRIVILEGE String => name of access (SELECT, * INSERT, UPDATE, REFRENCES, ...) * <LI>IS_GRANTABLE String => "YES" if grantee is permitted * to grant to others; "NO" if not; null if unknown * </OL> * * @param catalog a catalog name; "" retrieves those without a catalog * @param schema a schema name; "" retrieves those without a schema * @param table a table name * @param columnNamePattern a column name pattern * @return ResultSet each row is a column privilege description * @see #getSearchStringEscape */ public java.sql.ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws java.sql.SQLException { Field[] Fields = new Field[8]; Fields[0] = new Field("", "TABLE_CAT", Types.CHAR, 1); Fields[1] = new Field("", "TABLE_SCHEM", Types.CHAR, 1); Fields[2] = new Field("", "TABLE_NAME", Types.CHAR, 1); Fields[3] = new Field("", "COLUMN_NAME", Types.CHAR, 1); Fields[4] = new Field("", "GRANTOR", Types.CHAR, 1); Fields[5] = new Field("", "GRANTEE", Types.CHAR, 1); Fields[6] = new Field("", "PRIVILEGE", Types.CHAR, 1); Fields[7] = new Field("", "IS_GRANTABLE", Types.CHAR, 1); return new ResultSet(Fields, new Vector(), _Conn); } /** * Get a description of the access rights for each table available * in a catalog. * * <P>Only privileges matching the schema and table name * criteria are returned. They are ordered by TABLE_SCHEM, * TABLE_NAME, and PRIVILEGE. * * <P>Each privilige description has the following columns: * <OL> * <LI>TABLE_CAT String => table catalog (may be null) * <LI>TABLE_SCHEM String => table schema (may be null) * <LI>TABLE_NAME String => table name * <LI>COLUMN_NAME String => column name * <LI>GRANTOR => grantor of access (may be null) * <LI>GRANTEE String => grantee of access * <LI>PRIVILEGE String => name of access (SELECT, * INSERT, UPDATE, REFRENCES, ...) * <LI>IS_GRANTABLE String => "YES" if grantee is permitted * to grant to others; "NO" if not; null if unknown * </OL> * * @param catalog a catalog name; "" retrieves those without a catalog * @param schemaPattern a schema name pattern; "" retrieves those * without a schema * @param tableNamePattern a table name pattern * @return ResultSet each row is a table privilege description * @see #getSearchStringEscape */ public java.sql.ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws java.sql.SQLException { Field[] Fields = new Field[8]; Fields[0] = new Field("", "TABLE_CAT", Types.CHAR, 1); Fields[1] = new Field("", "TABLE_SCHEM", Types.CHAR, 1); Fields[2] = new Field("", "TABLE_NAME", Types.CHAR, 1); Fields[3] = new Field("", "COLUMN_NAME", Types.CHAR, 1); Fields[4] = new Field("", "GRANTOR", Types.CHAR, 1); Fields[5] = new Field("", "GRANTEE", Types.CHAR, 1); Fields[6] = new Field("", "PRIVILEGE", Types.CHAR, 1); Fields[7] = new Field("", "IS_GRANTABLE", Types.CHAR, 1); return new ResultSet(Fields, new Vector(), _Conn); } /** * Get a description of a table's optimal set of columns that * uniquely identifies a row. They are ordered by SCOPE. * * <P>Each column description has the following columns: * <OL> * <LI>SCOPE short => actual scope of result * <UL> * <LI> bestRowTemporary - very temporary, while using row * <LI> bestRowTransaction - valid for remainder of current transaction * <LI> bestRowSession - valid for remainder of current session * </UL> * <LI>COLUMN_NAME String => column name * <LI>DATA_TYPE short => SQL data type from java.sql.Types * <LI>TYPE_NAME String => Data source dependent type name * <LI>COLUMN_SIZE int => precision * <LI>BUFFER_LENGTH int => not used * <LI>DECIMAL_DIGITS short => scale * <LI>PSEUDO_COLUMN short => is this a pseudo column * like an Oracle ROWID * <UL> * <LI> bestRowUnknown - may or may not be pseudo column * <LI> bestRowNotPseudo - is NOT a pseudo column * <LI> bestRowPseudo - is a pseudo column * </UL> * </OL> * * @param catalog a catalog name; "" retrieves those without a catalog * @param schema a schema name; "" retrieves those without a schema * @param table a table name * @param scope the scope of interest; use same values as SCOPE * @param nullable include columns that are nullable? * @return ResultSet each row is a column description */ public java.sql.ResultSet getBestRowIdentifier(String Catalog, String Schema, String Table, int scope, boolean nullable) throws java.sql.SQLException { Field[] Fields = new Field[8]; Fields[0] = new Field("", "SCOPE", Types.SMALLINT, 5); Fields[1] = new Field("", "COLUMN_NAME", Types.CHAR, 32); Fields[2] = new Field("", "DATA_TYPE", Types.SMALLINT, 32); Fields[3] = new Field("", "TYPE_NAME", Types.CHAR, 32); Fields[4] = new Field("", "COLUMN_SIZE", Types.INTEGER, 10); Fields[5] = new Field("", "BUFFER_LENGTH", Types.INTEGER, 10); Fields[6] = new Field("", "DECIMAL_DIGITS", Types.INTEGER, 10); Fields[7] = new Field("", "PSEUDO_COLUMN", Types.SMALLINT, 5); String DB_Sub = ""; if (Catalog != null) { if (!Catalog.equals("")) { DB_Sub = " FROM " + Catalog; } } else { DB_Sub = " FROM " + _Database; } if (Table == null) { throw new java.sql.SQLException("Table not specified.", "S1009"); } org.gjt.mm.mysql.ResultSet RS = _Conn.execSQL( "show columns from " + Table + DB_Sub, -1); RS.setConnection(_Conn); Vector Tuples = new Vector(); while (RS.next()) { String KeyType = RS.getString("Key"); if (KeyType != null) { if (KeyType.equals("PRI")) { byte[][] Tuple = new byte[8][]; Tuple[0] = Integer.toString(java.sql.DatabaseMetaData.bestRowSession).getBytes(); Tuple[1] = RS.getBytes("Field"); String Type = RS.getString("Type"); int size = MysqlIO.getMaxBuf(); int decimals = 0; /* * Parse the Type column from MySQL */ if (Type.indexOf("enum") != -1) { String Temp = Type.substring(Type.indexOf("("), Type.indexOf(")")); java.util.StringTokenizer ST = new java.util.StringTokenizer(Temp, ","); int max_length = 0; while (ST.hasMoreTokens()) { max_length = Math.max(max_length, (ST.nextToken().length() - 2)); } size = max_length; decimals = 0; Type = "enum"; } else if (Type.indexOf("(") != -1) { if (Type.indexOf(",") != -1) { size = Integer.parseInt(Type.substring(Type.indexOf("(") + 1, Type.indexOf(","))); decimals = Integer.parseInt(Type.substring(Type.indexOf(",") + 1, Type.indexOf(")"))); } else { size = Integer.parseInt(Type.substring(Type.indexOf("(") + 1, Type.indexOf(")"))); } Type = Type.substring(Type.indexOf("(")); } Tuple[2] = new byte[0]; // FIXME! Tuple[3] = Type.getBytes(); Tuple[4] = Integer.toString(size + decimals).getBytes(); Tuple[5] = Integer.toString(size + decimals).getBytes(); Tuple[6] = Integer.toString(decimals).getBytes(); Tuple[7] = Integer.toString(java.sql.DatabaseMetaData.bestRowNotPseudo).getBytes(); Tuples.addElement(Tuple); } } } return new ResultSet(Fields, Tuples, _Conn); } /** * Get a description of a table's columns that are automatically * updated when any value in a row is updated. They are * unordered. * * <P>Each column description has the following columns: * <OL> * <LI>SCOPE short => is not used * <LI>COLUMN_NAME String => column name * <LI>DATA_TYPE short => SQL data type from java.sql.Types * <LI>TYPE_NAME String => Data source dependent type name * <LI>COLUMN_SIZE int => precision * <LI>BUFFER_LENGTH int => length of column value in bytes * <LI>DECIMAL_DIGITS short => scale * <LI>PSEUDO_COLUMN short => is this a pseudo column * like an Oracle ROWID * <UL> * <LI> versionColumnUnknown - may or may not be pseudo column * <LI> versionColumnNotPseudo - is NOT a pseudo column * <LI> versionColumnPseudo - is a pseudo column * </UL> * </OL> * * @param catalog a catalog name; "" retrieves those without a catalog * @param schema a schema name; "" retrieves those without a schema * @param table a table name * @return ResultSet each row is a column description */ public java.sql.ResultSet getVersionColumns(String catalog, String schema, String table) throws java.sql.SQLException { Field[] Fields = new Field[8]; Fields[0] = new Field("", "SCOPE", Types.SMALLINT, 5); Fields[1] = new Field("", "COLUMN_NAME", Types.CHAR, 32); Fields[2] = new Field("", "DATA_TYPE", Types.SMALLINT, 5); Fields[3] = new Field("", "TYPE_NAME", Types.CHAR, 16); Fields[4] = new Field("", "COLUMN_SIZE", Types.CHAR, 16); Fields[5] = new Field("", "BUFFER_LENGTH", Types.CHAR, 16); Fields[6] = new Field("", "DECIMAL_DIGITS", Types.CHAR, 16); Fields[7] = new Field("", "PSEUDO_COLUMN", Types.SMALLINT, 5); return new ResultSet(Fields, new Vector(), _Conn); // do TIMESTAMP columns count? } /** * Get a description of a table's primary key columns. They * are ordered by COLUMN_NAME. * * <P>Each column description has the following columns: * <OL> * <LI>TABLE_CAT String => table catalog (may be null) * <LI>TABLE_SCHEM String => table schema (may be null) * <LI>TABLE_NAME String => table name * <LI>COLUMN_NAME String => column name * <LI>KEY_SEQ short => sequence number within primary key * <LI>PK_NAME String => primary key name (may be null) * </OL> * * @param catalog a catalog name; "" retrieves those without a catalog * @param schema a schema name pattern; "" retrieves those * without a schema * @param table a table name * @return ResultSet each row is a primary key column description */ public java.sql.ResultSet getPrimaryKeys(String Catalog, String Schema, String Table) throws java.sql.SQLException { Field[] Fields = new Field[6]; Fields[0] = new Field("", "TABLE_CAT", Types.CHAR, 255); Fields[1] = new Field("", "TABLE_SCHEM", Types.CHAR, 0); Fields[2] = new Field("", "TABLE_NAME", Types.CHAR, 255); Fields[3] = new Field("", "COLUMN_NAME", Types.CHAR, 32); Fields[4] = new Field("", "KEY_SEQ", Types.SMALLINT, 5); Fields[5] = new Field("", "PK_NAME", Types.CHAR, 32); String DB_Sub = ""; if (Catalog != null) { if (!Catalog.equals("")) { DB_Sub = " FROM " + Catalog; } } else { DB_Sub = " FROM " + _Database; } if (Table == null) { throw new java.sql.SQLException("Table not specified.", "S1009"); } org.gjt.mm.mysql.ResultSet RS = _Conn.execSQL( "show columns from " + Table + DB_Sub, -1); RS.setConnection(_Conn); Vector Tuples = new Vector(); while (RS.next()) { String KeyType = RS.getString("Key"); if (KeyType != null) { if (KeyType.equals("PRI")) { byte[][] Tuple = new byte[6][]; Tuple[0] = (Catalog == null ? new byte[0] : Catalog.getBytes()); Tuple[1] = new byte[0]; Tuple[2] = Table.getBytes(); Tuple[3] = RS.getBytes("Field"); Tuple[4] = s2b("0"); Tuple[5] = RS.getBytes("Field"); Tuples.addElement(Tuple); } } } return new ResultSet(Fields, Tuples, _Conn); } /** * Get a description of the primary key columns that are * referenced by a table's foreign key columns (the primary keys * imported by a table). They are ordered by PKTABLE_CAT, * PKTABLE_SCHEM, PKTABLE_NAME, and KEY_SEQ. * * <P>Each primary key column description has the following columns: * <OL> * <LI>PKTABLE_CAT String => primary key table catalog * being imported (may be null) * <LI>PKTABLE_SCHEM String => primary key table schema * being imported (may be null) * <LI>PKTABLE_NAME String => primary key table name * being imported * <LI>PKCOLUMN_NAME String => primary key column name * being imported * <LI>FKTABLE_CAT String => foreign key table catalog (may be null) * <LI>FKTABLE_SCHEM String => foreign key table schema (may be null) * <LI>FKTABLE_NAME String => foreign key table name * <LI>FKCOLUMN_NAME String => foreign key column name * <LI>KEY_SEQ short => sequence number within foreign key * <LI>UPDATE_RULE short => What happens to * foreign key when primary is updated: * <UL> * <LI> importedKeyCascade - change imported key to agree * with primary key update * <LI> importedKeyRestrict - do not allow update of primary * key if it has been imported * <LI> importedKeySetNull - change imported key to NULL if * its primary key has been updated * </UL> * <LI>DELETE_RULE short => What happens to * the foreign key when primary is deleted. * <UL> * <LI> importedKeyCascade - delete rows that import a deleted key * <LI> importedKeyRestrict - do not allow delete of primary * key if it has been imported * <LI> importedKeySetNull - change imported key to NULL if * its primary key has been deleted * </UL> * <LI>FK_NAME String => foreign key name (may be null) * <LI>PK_NAME String => primary key name (may be null) * </OL> * * @param catalog a catalog name; "" retrieves those without a catalog * @param schema a schema name pattern; "" retrieves those * without a schema * @param table a table name * @return ResultSet each row is a primary key column description * @see #getExportedKeys */ public java.sql.ResultSet getImportedKeys(String catalog, String schema, String table) throws java.sql.SQLException { Field[] Fields = new Field[13]; Fields[0] = new Field("", "PKTABLE_CAT", Types.CHAR, 1); Fields[1] = new Field("", "PKTABLE_SCHEM", Types.CHAR, 1); Fields[2] = new Field("", "PKTABLE_NAME", Types.CHAR, 1); Fields[3] = new Field("", "PKCOLUMN_NAME", Types.CHAR, 1); Fields[4] = new Field("", "FKTABLE_CAT", Types.CHAR, 1); Fields[5] = new Field("", "FKTABLE_SCHEM", Types.CHAR, 1); Fields[6] = new Field("", "FKTABLE_NAME", Types.CHAR, 1); Fields[7] = new Field("", "FKCOLUMN_NAME", Types.CHAR, 1); Fields[8] = new Field("", "KEY_SEQ", Types.SMALLINT, 1); Fields[9] = new Field("", "UPDATE_RULE", Types.SMALLINT, 1); Fields[10] = new Field("", "DELETE_RULE", Types.SMALLINT, 1); Fields[11] = new Field("", "FK_NAME", Types.CHAR, 1); Fields[12] = new Field("", "PK_NAME", Types.CHAR, 1); return new ResultSet(Fields, new Vector(), _Conn); } /** * Get a description of a foreign key columns that reference a * table's primary key columns (the foreign keys exported by a * table). They are ordered by FKTABLE_CAT, FKTABLE_SCHEM, * FKTABLE_NAME, and KEY_SEQ. * * <P>Each foreign key column description has the following columns: * <OL> * <LI>PKTABLE_CAT String => primary key table catalog (may be null) * <LI>PKTABLE_SCHEM String => primary key table schema (may be null) * <LI>PKTABLE_NAME String => primary key table name * <LI>PKCOLUMN_NAME String => primary key column name * <LI>FKTABLE_CAT String => foreign key table catalog (may be null) * being exported (may be null) * <LI>FKTABLE_SCHEM String => foreign key table schema (may be null) * being exported (may be null) * <LI>FKTABLE_NAME String => foreign key table name * being exported * <LI>FKCOLUMN_NAME String => foreign key column name * being exported * <LI>KEY_SEQ short => sequence number within foreign key * <LI>UPDATE_RULE short => What happens to * foreign key when primary is updated: * <UL> * <LI> importedKeyCascade - change imported key to agree * with primary key update * <LI> importedKeyRestrict - do not allow update of primary * key if it has been imported * <LI> importedKeySetNull - change imported key to NULL if * its primary key has been updated * </UL> * <LI>DELETE_RULE short => What happens to * the foreign key when primary is deleted. * <UL> * <LI> importedKeyCascade - delete rows that import a deleted key * <LI> importedKeyRestrict - do not allow delete of primary * key if it has been imported * <LI> importedKeySetNull - change imported key to NULL if * its primary key has been deleted * </UL> * <LI>FK_NAME String => foreign key identifier (may be null) * <LI>PK_NAME String => primary key identifier (may be null) * </OL> * * @param catalog a catalog name; "" retrieves those without a catalog * @param schema a schema name pattern; "" retrieves those * without a schema * @param table a table name * @return ResultSet each row is a foreign key column description * @see #getImportedKeys */ public java.sql.ResultSet getExportedKeys(String catalog, String schema, String table) throws java.sql.SQLException { Field[] Fields = new Field[13]; Fields[0] = new Field("", "PKTABLE_CAT", Types.CHAR, 1); Fields[1] = new Field("", "PKTABLE_SCHEM", Types.CHAR, 1); Fields[2] = new Field("", "PKTABLE_NAME", Types.CHAR, 1); Fields[3] = new Field("", "PKCOLUMN_NAME", Types.CHAR, 1); Fields[4] = new Field("", "FKTABLE_CAT", Types.CHAR, 1); Fields[5] = new Field("", "FKTABLE_SCHEM", Types.CHAR, 1); Fields[6] = new Field("", "FKTABLE_NAME", Types.CHAR, 1); Fields[7] = new Field("", "FKCOLUMN_NAME", Types.CHAR, 1); Fields[8] = new Field("", "KEY_SEQ", Types.SMALLINT, 1); Fields[9] = new Field("", "UPDATE_RULE", Types.SMALLINT, 1); Fields[10] = new Field("", "DELETE_RULE", Types.SMALLINT, 1); Fields[11] = new Field("", "FK_NAME", Types.CHAR, 1); Fields[12] = new Field("", "PK_NAME", Types.CHAR, 1); return new ResultSet(Fields, new Vector(), _Conn); // No foreign keys in MySQL } /** * Get a description of the foreign key columns in the foreign key * table that reference the primary key columns of the primary key * table (describe how one table imports another's key.) This * should normally return a single foreign key/primary key pair * (most tables only import a foreign key from a table once.) They * are ordered by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, and * KEY_SEQ. * * <P>Each foreign key column description has the following columns: * <OL> * <LI>PKTABLE_CAT String => primary key table catalog (may be null) * <LI>PKTABLE_SCHEM String => primary key table schema (may be null) * <LI>PKTABLE_NAME String => primary key table name * <LI>PKCOLUMN_NAME String => primary key column name * <LI>FKTABLE_CAT String => foreign key table catalog (may be null) * being exported (may be null) * <LI>FKTABLE_SCHEM String => foreign key table schema (may be null) * being exported (may be null) * <LI>FKTABLE_NAME String => foreign key table name * being exported * <LI>FKCOLUMN_NAME String => foreign key column name * being exported * <LI>KEY_SEQ short => sequence number within foreign key * <LI>UPDATE_RULE short => What happens to * foreign key when primary is updated: * <UL> * <LI> importedKeyCascade - change imported key to agree * with primary key update * <LI> importedKeyRestrict - do not allow update of primary * key if it has been imported * <LI> importedKeySetNull - change imported key to NULL if * its primary key has been updated * </UL> * <LI>DELETE_RULE short => What happens to * the foreign key when primary is deleted. * <UL> * <LI> importedKeyCascade - delete rows that import a deleted key * <LI> importedKeyRestrict - do not allow delete of primary * key if it has been imported * <LI> importedKeySetNull - change imported key to NULL if * its primary key has been deleted * </UL> * <LI>FK_NAME String => foreign key identifier (may be null) * <LI>PK_NAME String => primary key identifier (may be null) * </OL> * * @param catalog a catalog name; "" retrieves those without a catalog * @param schema a schema name pattern; "" retrieves those * without a schema * @param table a table name * @return ResultSet each row is a foreign key column description * @see #getImportedKeys */ public java.sql.ResultSet getCrossReference(String PrimaryCatalog, String PrimarySchema, String PrimaryTable, String ForeignCatalog, String ForeignSchema, String ForeignTable ) throws java.sql.SQLException { Field[] Fields = new Field[13]; Fields[0] = new Field("", "PKTABLE_CAT", Types.CHAR, 1); Fields[1] = new Field("", "PKTABLE_SCHEM", Types.CHAR, 1); Fields[2] = new Field("", "PKTABLE_NAME", Types.CHAR, 1); Fields[3] = new Field("", "PKCOLUMN_NAME", Types.CHAR, 1); Fields[4] = new Field("", "FKTABLE_CAT", Types.CHAR, 1); Fields[5] = new Field("", "FKTABLE_SCHEM", Types.CHAR, 1); Fields[6] = new Field("", "FKTABLE_NAME", Types.CHAR, 1); Fields[7] = new Field("", "FKCOLUMN_NAME", Types.CHAR, 1); Fields[8] = new Field("", "KEY_SEQ", Types.SMALLINT, 1); Fields[9] = new Field("", "UPDATE_RULE", Types.SMALLINT, 1); Fields[10] = new Field("", "DELETE_RULE", Types.SMALLINT, 1); Fields[11] = new Field("", "FK_NAME", Types.CHAR, 1); Fields[12] = new Field("", "PK_NAME", Types.CHAR, 1); return new ResultSet(Fields, new Vector(), _Conn); // no foreign keys in MySQL } /** * Get a description of all the standard SQL types supported by * this database. They are ordered by DATA_TYPE and then by how * closely the data type maps to the corresponding JDBC SQL type. * * <P>Each type description has the following columns: * <OL> * <LI>TYPE_NAME String => Type name * <LI>DATA_TYPE short => SQL data type from java.sql.Types * <LI>PRECISION int => maximum precision * <LI>LITERAL_PREFIX String => prefix used to quote a literal * (may be null) * <LI>LITERAL_SUFFIX String => suffix used to quote a literal (may be null) * <LI>CREATE_PARAMS String => parameters used in creating * the type (may be null) * <LI>NULLABLE short => can you use NULL for this type? * <UL> * <LI> typeNoNulls - does not allow NULL values * <LI> typeNullable - allows NULL values * <LI> typeNullableUnknown - nullability unknown * </UL> * <LI>CASE_SENSITIVE boolean=> is it case sensitive? * <LI>SEARCHABLE short => can you use "WHERE" based on this type: * <UL> * <LI> typePredNone - No support * <LI> typePredChar - Only supported with WHERE .. LIKE * <LI> typePredBasic - Supported except for WHERE .. LIKE * <LI> typeSearchable - Supported for all WHERE .. * </UL> * <LI>UNSIGNED_ATTRIBUTE boolean => is it unsigned? * <LI>FIXED_PREC_SCALE boolean => can it be a money value? * <LI>AUTO_INCREMENT boolean => can it be used for an * auto-increment value? * <LI>LOCAL_TYPE_NAME String => localized version of type name * (may be null) * <LI>MINIMUM_SCALE short => minimum scale supported * <LI>MAXIMUM_SCALE short => maximum scale supported * <LI>SQL_DATA_TYPE int => unused * <LI>SQL_DATETIME_SUB int => unused * <LI>NUM_PREC_RADIX int => usually 2 or 10 * </OL> * * @return ResultSet each row is a SQL type description */ public java.sql.ResultSet getTypeInfo() throws java.sql.SQLException { Field[] Fields = new Field[18]; Fields[0] = new Field("", "TYPE_NAME", Types.CHAR, 32); Fields[1] = new Field("", "DATA_TYPE", Types.SMALLINT, 5); Fields[2] = new Field("", "PRECISION", Types.INTEGER, 10); Fields[3] = new Field("", "LITERAL_PREFIX", Types.CHAR, 4); Fields[4] = new Field("", "LITERAL_SUFFIX", Types.CHAR, 4); Fields[5] = new Field("", "CREATE_PARAMS", Types.CHAR, 32); Fields[6] = new Field("", "NULLABLE", Types.SMALLINT, 5); Fields[7] = new Field("", "CASE_SENSITIVE", Types.CHAR, 3); Fields[8] = new Field("", "SEARCHABLE", Types.SMALLINT, 3); Fields[9] = new Field("", "UNSIGNED_ATTRIBUTE", Types.CHAR, 3); Fields[10] = new Field("", "FIXED_PREC_SCALE", Types.CHAR, 3); Fields[11] = new Field("", "AUTO_INCREMENT", Types.CHAR, 3); Fields[12] = new Field("", "LOCAL_TYPE_NAME", Types.CHAR, 32); Fields[13] = new Field("", "MINIMUM_SCALE", Types.SMALLINT, 5); Fields[14] = new Field("", "MAXIMUM_SCALE", Types.SMALLINT, 5); Fields[15] = new Field("", "SQL_DATA_TYPE", Types.INTEGER, 10); Fields[16] = new Field("", "SQL_DATETIME_SUB", Types.INTEGER, 10); Fields[17] = new Field("", "NUM_PREC_RADIX", Types.INTEGER, 10); byte[][] RowVal = null; Vector Tuples = new Vector(); /* * The following are ordered by java.sql.Types, and * then by how closely the MySQL type matches the * JDBC Type (per spec) */ /* * MySQL Type: TINYINT * JDBC Type: TINYINT */ RowVal = new byte[18][]; RowVal[0] = s2b("TINYINT"); RowVal[1] = Integer.toString(java.sql.Types.TINYINT).getBytes(); // JDBC Data type RowVal[2] = s2b("3"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M) UNSIGNED ZEROFILL"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("true"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("TINYINT"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: BIGINT * JDBC Type: BIGINT */ RowVal = new byte[18][]; RowVal[0] = s2b("BIGINT"); RowVal[1] = Integer.toString(java.sql.Types.BIGINT).getBytes(); // JDBC Data type RowVal[2] = s2b("19"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M) UNSIGNED ZEROFILL"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("true"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("BIGINT"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: MEDIUMBLOB * JDBC Type: LONGVARBINARY */ RowVal = new byte[18][]; RowVal[0] = s2b("MEDIUMBLOB"); RowVal[1] = Integer.toString(java.sql.Types.LONGVARBINARY).getBytes(); // JDBC Data type RowVal[2] = s2b("16777215"); // Precision RowVal[3] = s2b("'"); // Literal Prefix RowVal[4] = s2b("'"); // Literal Suffix RowVal[5] = s2b(""); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("true"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("false"); // Auto Increment RowVal[12] = s2b("MEDIUMBLOB"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: LONGBLOB * JDBC Type: LONGVARBINARY */ RowVal = new byte[18][]; RowVal[0] = s2b("LONGBLOB"); RowVal[1] = Integer.toString(java.sql.Types.LONGVARBINARY).getBytes(); // JDBC Data type RowVal[2] = Integer.toString(Integer.MAX_VALUE).getBytes(); // Precision RowVal[3] = s2b("'"); // Literal Prefix RowVal[4] = s2b("'"); // Literal Suffix RowVal[5] = s2b(""); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("true"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("false"); // Auto Increment RowVal[12] = s2b("LONGBLOB"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: BLOB * JDBC Type: LONGVARBINARY */ RowVal = new byte[18][]; RowVal[0] = s2b("BLOB"); RowVal[1] = Integer.toString(java.sql.Types.LONGVARBINARY).getBytes(); // JDBC Data type RowVal[2] = s2b("65535"); // Precision RowVal[3] = s2b("'"); // Literal Prefix RowVal[4] = s2b("'"); // Literal Suffix RowVal[5] = s2b(""); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("true"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("false"); // Auto Increment RowVal[12] = s2b("BLOB"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: TINYBLOB * JDBC Type: VARBINARY */ RowVal = new byte[18][]; RowVal[0] = s2b("TINYBLOB"); RowVal[1] = Integer.toString(java.sql.Types.VARBINARY).getBytes(); // JDBC Data type RowVal[2] = s2b("255"); // Precision RowVal[3] = s2b("'"); // Literal Prefix RowVal[4] = s2b("'"); // Literal Suffix RowVal[5] = s2b(""); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("true"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("false"); // Auto Increment RowVal[12] = s2b("TINYBLOB"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: CHAR * JDBC Type: CHAR */ RowVal = new byte[18][]; RowVal[0] = s2b("CHAR"); RowVal[1] = Integer.toString(java.sql.Types.CHAR).getBytes(); // JDBC Data type RowVal[2] = s2b("255"); // Precision RowVal[3] = s2b("'"); // Literal Prefix RowVal[4] = s2b("'"); // Literal Suffix RowVal[5] = s2b("(M) [BINARY]"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("false"); // Auto Increment RowVal[12] = s2b("CHAR"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: NUMERIC * JDBC Type: NUMERIC */ RowVal = new byte[18][]; RowVal[0] = s2b("NUMERIC"); RowVal[1] = Integer.toString(java.sql.Types.NUMERIC).getBytes(); // JDBC Data type RowVal[2] = s2b("17"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M,D)"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("NUMERIC"); // Locale Type Name RowVal[13] = s2b("308"); // Minimum Scale RowVal[14] = s2b("308"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: DECIMAL * JDBC Type: DECIMAL */ RowVal = new byte[18][]; RowVal[0] = s2b("DECIMAL"); RowVal[1] = Integer.toString(java.sql.Types.DECIMAL).getBytes(); // JDBC Data type RowVal[2] = s2b("17"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M,D)"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("DECIMAL"); // Locale Type Name RowVal[13] = s2b("-308"); // Minimum Scale RowVal[14] = s2b("308"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: INT * JDBC Type: INTEGER */ RowVal = new byte[18][]; RowVal[0] = s2b("INT"); RowVal[1] = Integer.toString(java.sql.Types.INTEGER).getBytes(); // JDBC Data type RowVal[2] = s2b("10"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M) UNSIGNED ZEROFILL"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("true"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("INT"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: MEDIUMINT * JDBC Type: INTEGER */ RowVal = new byte[18][]; RowVal[0] = s2b("MEDIUMINT"); RowVal[1] = Integer.toString(java.sql.Types.INTEGER).getBytes(); // JDBC Data type RowVal[2] = s2b("7"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M) UNSIGNED ZEROFILL"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("true"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("MEDIUMINT"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: SMALLINT * JDBC Type: SMALLINT */ RowVal = new byte[18][]; RowVal[0] = s2b("SMALLINT"); RowVal[1] = Integer.toString(java.sql.Types.SMALLINT).getBytes(); // JDBC Data type RowVal[2] = s2b("5"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M) UNSIGNED ZEROFILL"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("true"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("SMALLINT"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: FLOAT * JDBC Type: FLOAT */ RowVal = new byte[18][]; RowVal[0] = s2b("FLOAT"); RowVal[1] = Integer.toString(java.sql.Types.FLOAT).getBytes(); // JDBC Data type RowVal[2] = s2b("10"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M,D)"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("FLOAT"); // Locale Type Name RowVal[13] = s2b("-38"); // Minimum Scale RowVal[14] = s2b("38"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: DOUBLE * JDBC Type: DOUBLE */ RowVal = new byte[18][]; RowVal[0] = s2b("DOUBLE"); RowVal[1] = Integer.toString(java.sql.Types.DOUBLE).getBytes(); // JDBC Data type RowVal[2] = s2b("17"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M,D)"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("DOUBLE"); // Locale Type Name RowVal[13] = s2b("-308"); // Minimum Scale RowVal[14] = s2b("308"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: DOUBLE PRECISION * JDBC Type: DOUBLE */ RowVal = new byte[18][]; RowVal[0] = s2b("DOUBLE PRECISION"); RowVal[1] = Integer.toString(java.sql.Types.DOUBLE).getBytes(); // JDBC Data type RowVal[2] = s2b("17"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M,D)"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("DOUBLE PRECISION"); // Locale Type Name RowVal[13] = s2b("-308"); // Minimum Scale RowVal[14] = s2b("308"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: REAL (does not map to Types.REAL) * JDBC Type: DOUBLE */ RowVal = new byte[18][]; RowVal[0] = s2b("REAL"); RowVal[1] = Integer.toString(java.sql.Types.DOUBLE).getBytes(); // JDBC Data type RowVal[2] = s2b("17"); // Precision RowVal[3] = s2b(""); // Literal Prefix RowVal[4] = s2b(""); // Literal Suffix RowVal[5] = s2b("(M,D)"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("true"); // Auto Increment RowVal[12] = s2b("REAL"); // Locale Type Name RowVal[13] = s2b("-308"); // Minimum Scale RowVal[14] = s2b("308"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: VARCHAR * JDBC Type: VARCHAR */ RowVal = new byte[18][]; RowVal[0] = s2b("VARCHAR"); RowVal[1] = Integer.toString(java.sql.Types.VARCHAR).getBytes(); // JDBC Data type RowVal[2] = s2b("255"); // Precision RowVal[3] = s2b("'"); // Literal Prefix RowVal[4] = s2b("'"); // Literal Suffix RowVal[5] = s2b(""); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("false"); // Auto Increment RowVal[12] = s2b("VARCHAR"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); // DATE = 91; /* * MySQL Type: DATE * JDBC Type: DATE */ RowVal = new byte[18][]; RowVal[0] = s2b("DATE"); RowVal[1] = Integer.toString(java.sql.Types.DATE).getBytes(); // JDBC Data type RowVal[2] = s2b("0"); // Precision RowVal[3] = s2b("'"); // Literal Prefix RowVal[4] = s2b("'"); // Literal Suffix RowVal[5] = s2b(""); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("false"); // Auto Increment RowVal[12] = s2b("DATE"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: TIME * JDBC Type: TIME */ RowVal = new byte[18][]; RowVal[0] = s2b("TIME"); RowVal[1] = Integer.toString(java.sql.Types.TIME).getBytes(); // JDBC Data type RowVal[2] = s2b("0"); // Precision RowVal[3] = s2b("'"); // Literal Prefix RowVal[4] = s2b("'"); // Literal Suffix RowVal[5] = s2b(""); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("false"); // Auto Increment RowVal[12] = s2b("TIME"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: DATETIME * JDBC Type: TIMESTAMP */ RowVal = new byte[18][]; RowVal[0] = s2b("DATETIME"); RowVal[1] = Integer.toString(java.sql.Types.TIMESTAMP).getBytes(); // JDBC Data type RowVal[2] = s2b("0"); // Precision RowVal[3] = s2b("'"); // Literal Prefix RowVal[4] = s2b("'"); // Literal Suffix RowVal[5] = s2b("(M)"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("false"); // Auto Increment RowVal[12] = s2b("DATETIME"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); /* * MySQL Type: TIMESTAMP * JDBC Type: TIMESTAMP */ RowVal = new byte[18][]; RowVal[0] = s2b("TIMESTAMP"); RowVal[1] = Integer.toString(java.sql.Types.TIMESTAMP).getBytes(); // JDBC Data type RowVal[2] = s2b("0"); // Precision RowVal[3] = s2b("'"); // Literal Prefix RowVal[4] = s2b("'"); // Literal Suffix RowVal[5] = s2b("(M)"); // Create Params RowVal[6] = Integer.toString(java.sql.DatabaseMetaData.typeNullable).getBytes(); // Nullable RowVal[7] = s2b("false"); // Case Sensitive RowVal[8] = Integer.toString(java.sql.DatabaseMetaData.typeSearchable).getBytes(); // Searchable RowVal[9] = s2b("false"); // Unsignable RowVal[10] = s2b("false"); // Fixed Prec Scale RowVal[11] = s2b("false"); // Auto Increment RowVal[12] = s2b("TIMESTAMP"); // Locale Type Name RowVal[13] = s2b("0"); // Minimum Scale RowVal[14] = s2b("0"); // Maximum Scale RowVal[15] = s2b(""); // SQL Data Type (not used) RowVal[16] = s2b(""); // SQL DATETIME SUB (not used) RowVal[17] = s2b("10"); // NUM_PREC_RADIX (2 or 10) Tuples.addElement(RowVal); return new ResultSet(Fields, Tuples, _Conn); } /** * Get a description of a table's indices and statistics. They are * ordered by NON_UNIQUE, TYPE, INDEX_NAME, and ORDINAL_POSITION. * * <P>Each index column description has the following columns: * <OL> * <LI>TABLE_CAT String => table catalog (may be null) * <LI>TABLE_SCHEM String => table schema (may be null) * <LI>TABLE_NAME String => table name * <LI>NON_UNIQUE boolean => Can index values be non-unique? * false when TYPE is tableIndexStatistic * <LI>INDEX_QUALIFIER String => index catalog (may be null); * null when TYPE is tableIndexStatistic * <LI>INDEX_NAME String => index name; null when TYPE is * tableIndexStatistic * <LI>TYPE short => index type: * <UL> * <LI> tableIndexStatistic - this identifies table statistics that are * returned in conjuction with a table's index descriptions * <LI> tableIndexClustered - this is a clustered index * <LI> tableIndexHashed - this is a hashed index * <LI> tableIndexOther - this is some other style of index * </UL> * <LI>ORDINAL_POSITION short => column sequence number * within index; zero when TYPE is tableIndexStatistic * <LI>COLUMN_NAME String => column name; null when TYPE is * tableIndexStatistic * <LI>ASC_OR_DESC String => column sort sequence, "A" => ascending, * "D" => descending, may be null if sort sequence is not supported; * null when TYPE is tableIndexStatistic * <LI>CARDINALITY int => When TYPE is tableIndexStatisic then * this is the number of rows in the table; otherwise it is the * number of unique values in the index. * <LI>PAGES int => When TYPE is tableIndexStatisic then * this is the number of pages used for the table, otherwise it * is the number of pages used for the current index. * <LI>FILTER_CONDITION String => Filter condition, if any. * (may be null) * </OL> * * @param catalog a catalog name; "" retrieves those without a catalog * @param schema a schema name pattern; "" retrieves those without a schema * @param table a table name * @param unique when true, return only indices for unique values; * when false, return indices regardless of whether unique or not * @param approximate when true, result is allowed to reflect approximate * or out of data values; when false, results are requested to be * accurate * @return ResultSet each row is an index column description */ public java.sql.ResultSet getIndexInfo(String Catalog, String Schema, String Table, boolean unique, boolean approximate) throws java.sql.SQLException { /* * MySQL stores index information in the following fields: * * Table * Non_unique * Key_name * Seq_in_index * Column_name * Collation * Cardinality * Sub_part */ String DB_Sub = ""; if (Catalog != null) { if (!Catalog.equals("")) { DB_Sub = " FROM " + Catalog; } } else { DB_Sub = " FROM " + _Database; } org.gjt.mm.mysql.ResultSet RS = _Conn.execSQL( "SHOW INDEX FROM " + Table + DB_Sub, -1); RS.setConnection(_Conn); Field[] Fields = new Field[13]; Fields[0] = new Field("", "TABLE_CAT", Types.CHAR, 255); Fields[1] = new Field("", "TABLE_SCHEM", Types.CHAR, 0); Fields[2] = new Field("", "TABLE_NAME", Types.CHAR, 255); Fields[3] = new Field("", "NON_UNIQUE", Types.CHAR, 3); Fields[4] = new Field("", "INDEX_QUALIFIER", Types.CHAR, 1); Fields[5] = new Field("", "INDEX_NAME", Types.CHAR, 32); Fields[6] = new Field("", "TYPE", Types.CHAR, 32); Fields[7] = new Field("", "ORDINAL_POSITION", Types.SMALLINT, 5); Fields[8] = new Field("", "COLUMN_NAME", Types.CHAR, 32); Fields[9] = new Field("", "ASC_OR_DESC", Types.CHAR, 1); Fields[10] = new Field("", "CARDINALITY", Types.CHAR, 32); Fields[11] = new Field("", "PAGES", Types.INTEGER, 10); Fields[12] = new Field("", "FILTER_CONDITION", Types.CHAR, 32); Vector Tuples = new Vector(); while (RS.next()) { byte[][] Tuple = new byte[14][]; Tuple[0] = (Catalog == null ? new byte[0] : Catalog.getBytes()); Tuple[1] = new byte[0]; Tuple[2] = RS.getBytes("Table"); Tuple[3] = (RS.getInt("Non_unique") != 0 ? s2b("true") : s2b("false")); Tuple[4] = new byte[0]; Tuple[5] = RS.getBytes("Key_name"); Tuple[6] = Integer.toString(java.sql.DatabaseMetaData.tableIndexOther).getBytes(); Tuple[7] = RS.getBytes("Seq_in_index"); Tuple[8] = RS.getBytes("Column_name"); Tuple[9] = RS.getBytes("Collation"); Tuple[10] = RS.getBytes("Cardinality"); Tuple[11] = new byte[0]; Tuple[12] = new byte[0]; Tuples.addElement(Tuple); } ResultSet Results = new ResultSet(Fields, Tuples, _Conn); return Results; } private byte[] s2b(String S) { return S.getBytes(); } }; |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.