    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.taglib;
    017
    018import org.opengion.fukurou.system.Closer;                                                              // 6.4.2.1 (2016/02/05)
    019import org.opengion.fukurou.db.ConnectionFactory;
    020import org.opengion.fukurou.db.ResultSetValue;                                                  // 6.0.4.0 (2014/11/28)
    021import org.opengion.fukurou.util.ToString;                                                              // 6.1.1.0 (2015/01/17)
    022import org.opengion.hayabusa.common.HybsSystemException;
    023import static org.opengion.fukurou.util.StringUtil.nval ;
    024import static org.opengion.fukurou.system.HybsConst.BR;                                 // 6.1.0.0 (2014/12/26) refactoring
    025import static org.opengion.fukurou.system.HybsConst.BUFFER_LARGE;               // 6.1.0.0 (2014/12/26) refactoring
    026
    027import java.util.ArrayList;
    028
    029import java.sql.DatabaseMetaData ;
    030import java.sql.Connection;
    031import java.sql.ResultSet;
    032import java.sql.SQLException;
    033import java.sql.Types;
    034
    035/**
    036 * DatabaseMetaData の情報を検索するタグです。
    037 *
    038 * ﾃﾞｰﾀﾍﾞｰｽに関する包括的な情報を提供する、DatabaseMetaData の内容を
    039 * 表示する、タグです。テスト的に使用します。
    040 *
    041 * @og.formSample
    042 * ●形式：
    043 *  &lt;og:databaseMetaData
    044 *      dbid            = &quot;{&#064;DBID}&quot;
    045 *      catalog         = &quot;{&#064;catalog}&quot;
    046 *      schema          = &quot;{&#064;schema}&quot;
    047 *      tableName       = &quot;{&#064;tableName}&quot;
    048 *      columnName      = &quot;{&#064;columnName}&quot;
    049 *      typeName        = &quot;{&#064;typeName}&quot;
    050 *      attributeName   = &quot;{&#064;attriName}&quot;
    051 *      procedureName   = &quot;{&#064;procName}&quot;
    052 *      maxRowCount     = &quot;{&#064;maxRowCount}&quot;
    053 *      likeKey         = &quot;{&#064;likeKey}&quot;
    054 *  /&gt;
    055 *
    056 * ●body：なし
    057 *
    058 * ●Tag定義：
    059 *   &lt;og:databaseMetaData
    060 *       dbid               【TAG】(通常は使いません)Queryオブジェクトを作成する時のDB接続IDを指定します(初期値:null)
    061 *       catalog            【TAG】(通常は使いません)Queryオブジェクトを作成する時のカタログを指定します
    062 *       schema             【TAG】(通常は使いません)Queryオブジェクトを作成する時のスキーマを指定します
    063 *       attributeName      【TAG】(通常は使いません)Queryオブジェクトを作成する時の属性名を指定します
    064 *       columnName         【TAG】(通常は使いません)Queryオブジェクトを作成する時のカラム名を指定します
    065 *       procedureName      【TAG】(通常は使いません)Queryオブジェクトを作成する時のプロダクト名を指定します
    066 *       tableName          【TAG】(通常は使いません)Queryオブジェクトを作成する時のテーブル名を指定します
    067 *       typeName           【TAG】(通常は使いません)Queryオブジェクトを作成する時のタイプ名を指定します
    068 *       maxRowCount        【TAG】maxRowCount ResultSetで検索するパラメータの最大検索件数を指定します(初期値:20)
    069 *       likeKey            【TAG】実行するメソッドを選別するための部分一致するｷｰを指定します
    070 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    071 *   /&gt;
    072 *
    073 * ●使用例
    074 *       &lt;og:databaseMetaData /&gt;
    075 *
    076 * @og.group ＤＢ検索
    077 *
    078 * @version  0.9.0      2000/10/17
    079 * @author       Kazuhiko Hasegawa
    080 * @since    JDK5.0,
    081 */
    082public class DatabaseMetaDataTag extends CommonTagSupport {
    083        /** このプログラムのVERSION文字列を設定します。   {@value} */
    084        private static final String VERSION = "6.4.2.1 (2016/02/05)" ;
    085        private static final long serialVersionUID = 642120160205L ;
    086
    087        private static final String getTimeDateFunctions= "このﾃﾞｰﾀﾍﾞｰｽで使用可能な時間関数と日付関数をｺﾝﾏで区切ったﾘｽﾄを取得します。" ;
    088        private static final String supportsConvertFunc = "このﾃﾞｰﾀﾍﾞｰｽによって、SQL の型間の CONVERT 関数がｻﾎﾟｰﾄされるかどうかを取得します。" ;
    089        private static final String getAttributes               = "指定されたｽｷｰﾏおよびｶﾀﾛｸﾞで使用可能なﾕｰｻﾞ定義の型 (UDT) のための指定された型の指定された属性に関する記述を取得します。  " ;
    090        private static final String getColumns                  = "指定されたｶﾀﾛｸﾞで使用可能なﾃｰﾌﾞﾙ列の記述を取得します。  " ;
    091        private static final String getIndexInfo                = "指定されたﾃｰﾌﾞﾙのｲﾝﾃﾞｯｸｽと統計情報に関する記述を取得します。" ;
    092        private static final String getSuperTables              = "このﾃﾞｰﾀﾍﾞｰｽの特定のｽｷｰﾏで定義されているﾃｰﾌﾞﾙ階層の説明を取得します。  " ;
    093        private static final String getSuperTypes               = "このﾃﾞｰﾀﾍﾞｰｽの特定のｽｷｰﾏで定義されているﾕｰｻﾞ定義型 (UDT) 階層の説明を取得します。" ;
    094        private static final String getTypeInfo                 = "このﾃﾞｰﾀﾍﾞｰｽでｻﾎﾟｰﾄされているすべての標準 SQL の型に関する記述を取得します。" ;
    095
    096        private static final MetaDataInvoke[] METHOD_LIST = new MetaDataInvoke[] {
    097                  new MetaDataInvoke( "getCatalogSeparator"             ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽがｶﾀﾛｸﾞ名とﾃｰﾌﾞﾙ名のｾﾊﾟﾚｰﾀとして使用する String" )
    098                , new MetaDataInvoke( "getCatalogTerm"                          ,0,-1,   "「catalog」に対するﾃﾞｰﾀﾍﾞｰｽﾍﾞﾝﾀﾞｰの推奨用語を取得します。" )
    099                , new MetaDataInvoke( "getDatabaseProductName"          ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽ製品の名前を取得します。" )
    100                , new MetaDataInvoke( "getDatabaseProductVersion"       ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽ製品のﾊﾞｰｼﾞｮﾝを取得します。" )
    101                , new MetaDataInvoke( "getDriverMajorVersion"           ,0,-1,   "この JDBC ﾄﾞﾗｲﾊﾞのﾒｼﾞｬｰﾊﾞｰｼﾞｮﾝを取得します。" )
    102                , new MetaDataInvoke( "getDriverMinorVersion"           ,0,-1,   "この JDBC ﾄﾞﾗｲﾊﾞのﾏｲﾅｰﾊﾞｰｼﾞｮﾝを取得します。" )
    103                , new MetaDataInvoke( "getDriverName"                           ,0,-1,   "この JDBC ﾄﾞﾗｲﾊﾞの名前を取得します。" )
    104                , new MetaDataInvoke( "getDriverVersion"                        ,0,-1,   "この JDBC ﾄﾞﾗｲﾊﾞのﾊﾞｰｼﾞｮﾝを String" )
    105                , new MetaDataInvoke( "getExtraNameCharacters"          ,0,-1,   "引用符で囲まれていない識別名に使用できるすべての「特殊」文字 (a-z,A-Z,0-9,および _ 以外) を取得します。" )
    106                , new MetaDataInvoke( "getIdentifierQuoteString"        ,0,-1,   "SQL 識別子を引用するのに使用する文字列を取得します。" )
    107                , new MetaDataInvoke( "getNumericFunctions"                     ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽで使用可能なｺﾝﾏで区切った数学関数のﾘｽﾄを取得します。" )
    108                , new MetaDataInvoke( "getProcedureTerm"                        ,0,-1,   "「procedure」に対するﾃﾞｰﾀﾍﾞｰｽﾍﾞﾝﾀﾞｰの推奨用語を取得します。" )
    109                , new MetaDataInvoke( "getSchemaTerm"                           ,0,-1,   "「schema」に対するﾃﾞｰﾀﾍﾞｰｽﾍﾞﾝﾀﾞｰの推奨用語を取得します。" )
    110                , new MetaDataInvoke( "getSearchStringEscape"           ,0,-1,   "ﾜｲﾙﾄﾞｶｰﾄﾞ文字をｴｽｹｰﾌﾟするのに使用できる文字列を取得します。" )
    111                , new MetaDataInvoke( "getSQLKeywords"                          ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽの SQL ｷｰﾜｰﾄﾞであって、SQL92 のｷｰﾜｰﾄﾞではない、すべてのｷｰﾜｰﾄﾞをｺﾝﾏで区切ったﾘｽﾄを取得します。" )
    112                , new MetaDataInvoke( "getStringFunctions"                      ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽで使用可能なｺﾝﾏで区切った文字列関数のﾘｽﾄを取得します。" )
    113                , new MetaDataInvoke( "getSystemFunctions"                      ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽで使用可能なｺﾝﾏで区切ったｼｽﾃﾑ関数のﾘｽﾄを取得します。" )
    114                , new MetaDataInvoke( "getTimeDateFunctions"            ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽで使用可能な時間関数と日付関数をｺﾝﾏで区切ったﾘｽﾄを取得します。" )
    115                , new MetaDataInvoke( "getURL"                                          ,0,-1,   "この DBMS の URL を取得します。" )
    116                , new MetaDataInvoke( "getUserName"                                     ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽに記録されているﾕｰｻﾞ名を取得します。" )
    117
    118                , new MetaDataInvoke( "getDefaultTransactionIsolation"  ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽのﾃﾞﾌｫﾙﾄのﾄﾗﾝｻﾞｸｼｮﾝ遮断ﾚﾍﾞﾙを取得します。" )
    119                , new MetaDataInvoke( "getSQLStateType"                         ,0,-1,   "Throwable.getSQLState によって返される SQLSTATE が X/Open (現在は Open Group) の SQL CLI であるか SQL99 であるかを示します。" )
    120                , new MetaDataInvoke( "getResultSetHoldability"         ,0,-1,   "この ResultSet ｵﾌﾞｼﾞｪｸﾄのﾃﾞﾌｫﾙﾄの保持機能を取得します。" )
    121                , new MetaDataInvoke( "allProceduresAreCallable"        ,0,-1,   "getProcedures ﾒｿｯﾄﾞによって返されるすべてのﾌﾟﾛｼｰｼﾞｬが、現在のﾕｰｻﾞから呼び出せるかどうかを取得します。" )
    122                , new MetaDataInvoke( "allTablesAreSelectable"          ,0,-1,   "getTables ﾒｿｯﾄﾞによって返されるすべてのﾃｰﾌﾞﾙが、現在のﾕｰｻﾞによって使用できるかどうかを取得します。" )
    123                , new MetaDataInvoke( "dataDefinitionCausesTransactionCommit",0,-1,     "ﾄﾗﾝｻﾞｸｼｮﾝのﾃﾞｰﾀ定義文が、ﾄﾗﾝｻﾞｸｼｮﾝを強制的にコミットさせるかどうかを取得します。" )
    124                , new MetaDataInvoke( "dataDefinitionIgnoredInTransactions"  ,0,-1,     "このﾃﾞｰﾀﾍﾞｰｽによって、ﾄﾗﾝｻﾞｸｼｮﾝでﾃﾞｰﾀ定義文が無視されるかどうかを取得します。" )
    125                , new MetaDataInvoke( "deletesAreDetected"                      ,1,-1,   "ResultSet.rowDeleted ﾒｿｯﾄﾞを呼び出すことによって可視の行が削除されたことを検出できるかどうかを取得します。" )
    126                , new MetaDataInvoke( "doesMaxRowSizeIncludeBlobs"      ,0,-1,   "getMaxRowSize ﾒｿｯﾄﾞの戻り値が SQL ﾃﾞｰﾀの型の LONGVARCHAR および LONGVARBINARY を含むかどうかを取得します。" )
    127                , new MetaDataInvoke( "insertsAreDetected"                      ,1,-1,   "ResultSet.rowInserted ﾒｿｯﾄﾞを呼び出すことによって可視の行が挿入されたことを検出できるかどうかを取得します。" )
    128                , new MetaDataInvoke( "isCatalogAtStart"                        ,0,-1,   "完全修飾されたﾃｰﾌﾞﾙ名の開始部分 (または終了部分) にｶﾀﾛｸﾞが現れるかどうかを取得します。" )
    129                , new MetaDataInvoke( "isReadOnly"                                      ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽが読み込み専用モードかどうかを取得します。" )
    130                , new MetaDataInvoke( "locatorsUpdateCopy"                      ,0,-1,   "LOB への変更が、ｺﾋﾟｰに対して行われたのか、LOB に直接行われたのかを示します。" )
    131                , new MetaDataInvoke( "nullPlusNonNullIsNull"           ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽが、NULL 値と非 NULL 値の連結を NULL とするかどうかを取得します。" )
    132                , new MetaDataInvoke( "nullsAreSortedAtEnd"                     ,0,-1,   "NULL 値が、終了時にｿｰﾄ順にかかわらずｿｰﾄされるかどうかを取得します。" )
    133                , new MetaDataInvoke( "nullsAreSortedAtStart"           ,0,-1,   "NULL 値が、開始時にｿｰﾄ順にかかわらずｿｰﾄされるかどうかを取得します。" )
    134                , new MetaDataInvoke( "nullsAreSortedHigh"                      ,0,-1,   "NULL 値が高位にｿｰﾄされるかどうかを取得します。" )
    135                , new MetaDataInvoke( "nullsAreSortedLow"                       ,0,-1,   "NULL 値が下位にｿｰﾄされるかどうかを取得します。" )
    136                , new MetaDataInvoke( "othersDeletesAreVisible"         ,1,-1,   "他で行われた削除が可視かどうかを取得します。" )
    137                , new MetaDataInvoke( "othersInsertsAreVisible"         ,1,-1,   "他で行われた挿入が可視かどうかを取得します。" )
    138                , new MetaDataInvoke( "othersUpdatesAreVisible"         ,1,-1,   "他で行われた更新が可視かどうかを取得します。" )
    139                , new MetaDataInvoke( "ownDeletesAreVisible"            ,1,-1,   "結果セット自身の削除が可視かどうかを取得します。" )
    140                , new MetaDataInvoke( "ownInsertsAreVisible"            ,1,-1,   "結果セット自身の挿入が可視かどうかを取得します。" )
    141                , new MetaDataInvoke( "ownUpdatesAreVisible"            ,1,-1,   "指定された ResultSet オブジェクトについて、結果セット自身の更新が可視かどうかを取得します。" )
    142                , new MetaDataInvoke( "storesLowerCaseIdentifiers"      ,0,-1,   "このﾃﾞｰﾀﾍﾞｰｽが、大文字小文字が混在する引用符なしの SQL 識別子を、大文字小文字を区別しないで処理し、小文字で格納するかどうかを取得します。" )
    143                , new MetaDataInvoke( "storesLowerCaseQuotedIdentifiers",0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、大文字小文字が混在する引用符付きの SQL 識別子を、大文字小文字を区別しないで処理し、小文字で格納するかどうかを取得します。" )
    144                , new MetaDataInvoke( "storesMixedCaseIdentifiers"              ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、大文字小文字が混在する引用符なしの SQL 識別子を、大文字小文字を区別しないで処理し、大文字小文字混在で格納するかどうかを取得します。" )
    145                , new MetaDataInvoke( "storesMixedCaseQuotedIdentifiers",0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、大文字小文字が混在する引用符付きの SQL 識別子を、大文字小文字を区別しないで処理し、大文字小文字混在で格納するかどうかを取得します。" )
    146                , new MetaDataInvoke( "storesUpperCaseIdentifiers"              ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、大文字小文字が混在する引用符なしの SQL 識別子を、大文字小文字を区別しないで処理し、大文字で格納するかどうかを取得します。" )
    147                , new MetaDataInvoke( "storesUpperCaseQuotedIdentifiers",0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、大文字小文字が混在する引用符付きの SQL 識別子を、大文字小文字を区別しないで処理し、大文字で格納するかどうかを取得します。" )
    148                , new MetaDataInvoke( "supportsAlterTableWithAddColumn" ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、追加列のある ALTER TABLE がｻﾎﾟｰﾄされるかどうかを取得します。" )
    149                , new MetaDataInvoke( "supportsAlterTableWithDropColumn",0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ﾄﾞﾛｯﾌﾟ列のある ALTER TABLE がｻﾎﾟｰﾄされるかどうかを取得します。" )
    150                , new MetaDataInvoke( "supportsANSI92EntryLevelSQL"             ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ANSI92 ｴﾝﾄﾘﾚﾍﾞﾙの SQL 文法がｻﾎﾟｰﾄされるかどうかを取得します。" )
    151                , new MetaDataInvoke( "supportsANSI92FullSQL"                   ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ANSI92 完全ﾚﾍﾞﾙの SQL 文法がｻﾎﾟｰﾄされるかどうかを取得します。" )
    152                , new MetaDataInvoke( "supportsANSI92IntermediateSQL"   ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ANSI92 中間ﾚﾍﾞﾙの SQL 文法がｻﾎﾟｰﾄされるかどうかを取得します。" )
    153                , new MetaDataInvoke( "supportsBatchUpdates"                    ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによってバッチ更新がｻﾎﾟｰﾄされるかどうかを取得します。" )
    154                , new MetaDataInvoke( "supportsCatalogsInDataManipulation"              ,0,-1,   "ﾃﾞｰﾀ操作文でｶﾀﾛｸﾞ名を使用できるかどうかを取得します。" )
    155                , new MetaDataInvoke( "supportsCatalogsInIndexDefinitions"              ,0,-1,   "ｲﾝﾃﾞｯｸｽ定義文でｶﾀﾛｸﾞ名を使用できるかどうかを取得します。" )
    156                , new MetaDataInvoke( "supportsCatalogsInPrivilegeDefinitions"  ,0,-1,  "特権定義文でｶﾀﾛｸﾞ名を使用できるかどうかを取得します。" )
    157                , new MetaDataInvoke( "supportsCatalogsInProcedureCalls"        ,0,-1,  "ﾌﾟﾛｼｰｼﾞｬ呼び出し文でｶﾀﾛｸﾞ名を使用できるかどうかを取得します。" )
    158                , new MetaDataInvoke( "supportsCatalogsInTableDefinitions"      ,0,-1,  "ﾃｰﾌﾞﾙ定義文でｶﾀﾛｸﾞ名を使用できるかどうかを取得します。" )
    159                , new MetaDataInvoke( "supportsColumnAliasing"                          ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって列の別名がｻﾎﾟｰﾄされるかどうかを取得します。  " )
    160        //      , new MetaDataInvoke( "supportsConvertFunc"                                     ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、SQL の型間の CONVERT 関数がｻﾎﾟｰﾄされるかどうかを取得します。" )
    161                , new MetaDataInvoke( "supportsCoreSQLGrammar"                          ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ODBC Core SQL 文法がｻﾎﾟｰﾄされるかどうかを取得します。" )
    162                , new MetaDataInvoke( "supportsCorrelatedSubqueries"            ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって照合関係ｻﾌﾞｸｴﾘｰがｻﾎﾟｰﾄされるかどうかを取得します。" )
    163                , new MetaDataInvoke( "supportsDataDefinitionAndDataManipulationTransactions"   ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ﾄﾗﾝｻﾞｸｼｮﾝで、ﾃﾞｰﾀ定義文とﾃﾞｰﾀ操作文の両方がｻﾎﾟｰﾄされるかどうかを取得します。" )
    164                , new MetaDataInvoke( "supportsDataManipulationTransactionsOnly",0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ﾄﾗﾝｻﾞｸｼｮﾝでﾃﾞｰﾀ操作文だけがｻﾎﾟｰﾄされるかどうかを取得します。" )
    165                , new MetaDataInvoke( "supportsDifferentTableCorrelationNames"  ,0,-1,  "ﾃｰﾌﾞﾙ相互関係名がｻﾎﾟｰﾄされる場合、ﾃｰﾌﾞﾙの名前と異なる名前であるという制限を付けるかどうかを取得します。" )
    166                , new MetaDataInvoke( "supportsExpressionsInOrderBy"            ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ORDER BY ﾘｽﾄ中で式がｻﾎﾟｰﾄされるかどうかを取得します。" )
    167                , new MetaDataInvoke( "supportsExtendedSQLGrammar"                      ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ODBC Extended SQL 文法がｻﾎﾟｰﾄされるかどうかを取得します。" )
    168                , new MetaDataInvoke( "supportsFullOuterJoins"                          ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、完全入れ子の外部結合がｻﾎﾟｰﾄされるかどうかを取得します。" )
    169                , new MetaDataInvoke( "supportsGetGeneratedKeys"                        ,0,-1,  "文が実行されたあとに自動生成ｷｰを取得できるかどうかを取得します。" )
    170                , new MetaDataInvoke( "supportsGroupBy"                                         ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、GROUP BY 節のﾌｫｰﾑがｻﾎﾟｰﾄされるかどうかを取得します。" )
    171                , new MetaDataInvoke( "supportsGroupByBeyondSelect"                     ,0,-1,  "SELECT 文中のすべての列が GROUP BY 節に含まれるという条件で、このﾃﾞｰﾀﾍﾞｰｽによって、GROUP BY 節で SELECT 文中にない列の使用がｻﾎﾟｰﾄされるかどうかを取得します。" )
    172                , new MetaDataInvoke( "supportsGroupByUnrelated"                        ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、GROUP BY 節で SELECT 文中にない列の使用がｻﾎﾟｰﾄされるかどうかを取得します。" )
    173                , new MetaDataInvoke( "supportsIntegrityEnhancementFacility",0,-1,      "このﾃﾞｰﾀﾍﾞｰｽによって、SQL Integrity Enhancement Facility がｻﾎﾟｰﾄされるかどうかを取得します。" )
    174                , new MetaDataInvoke( "supportsLikeEscapeClause"                        ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、LIKE ｴｽｹｰﾌﾟ節の指定がｻﾎﾟｰﾄされるかどうかを取得します。" )
    175                , new MetaDataInvoke( "supportsLimitedOuterJoins"                       ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、外部結合に関し、制限されたｻﾎﾟｰﾄが提供されるかどうかを取得します (supportsFullOuterJoins ﾒｿｯﾄﾞが true を返す場合は true)。" )
    176                , new MetaDataInvoke( "supportsMinimumSQLGrammar"                       ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ODBC Minimum SQL 文法がｻﾎﾟｰﾄされるかどうかを取得します。" )
    177                , new MetaDataInvoke( "supportsMixedCaseIdentifiers"            ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、大文字小文字が混在する引用符なしの SQL 識別子を、大文字小文字を区別して処理し、大文字小文字混在で格納するかどうかを取得します。" )
    178                , new MetaDataInvoke( "supportsMixedCaseQuotedIdentifiers"      ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、大文字小文字が混在する引用符付きの SQL 識別子を、大文字小文字を区別して処理し、結果として大文字小文字混在で格納するかどうかを取得します。" )
    179                , new MetaDataInvoke( "supportsMultipleOpenResults"                     ,0,-1,  "CallableStatement ｵﾌﾞｼﾞｪｸﾄから同時に返された複数の ResultSet ｵﾌﾞｼﾞｪｸﾄを持つことが可能かどうかを取得します。" )
    180                , new MetaDataInvoke( "supportsMultipleResultSets"                      ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、execute ﾒｿｯﾄﾞの単一の呼び出しからの複数の ResultSet ｵﾌﾞｼﾞｪｸﾄの取得がｻﾎﾟｰﾄされるかどうかを取得します。" )
    181                , new MetaDataInvoke( "supportsMultipleTransactions"            ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが一度に複数のﾄﾗﾝｻﾞｸｼｮﾝを (異なった接続で) ｵｰﾌﾟﾝできるかどうかを取得します。" )
    182                , new MetaDataInvoke( "supportsNamedParameters"                         ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、callable 文への名前付きパラメータがｻﾎﾟｰﾄされるかどうかを取得します。" )
    183                , new MetaDataInvoke( "supportsNonNullableColumns"                      ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽの列を非 null として定義できるかどうかを取得します。" )
    184                , new MetaDataInvoke( "supportsOpenCursorsAcrossCommit"         ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ｺﾐｯﾄ間でｶｰｿﾙがｵｰﾌﾟﾝされたままの状態がｻﾎﾟｰﾄされるかどうかを取得します。" )
    185                , new MetaDataInvoke( "supportsOpenCursorsAcrossRollback"       ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ﾛｰﾙﾊﾞｯｸ間でｶｰｿﾙがｵｰﾌﾟﾝされたままの状態がｻﾎﾟｰﾄされるかどうかを取得します。" )
    186                , new MetaDataInvoke( "supportsOpenStatementsAcrossCommit"      ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ｺﾐｯﾄ間で文がｵｰﾌﾟﾝされたままの状態がｻﾎﾟｰﾄされるかどうかを取得します。" )
    187                , new MetaDataInvoke( "supportsOpenStatementsAcrossRollback",0,-1,      "このﾃﾞｰﾀﾍﾞｰｽによって、ﾛｰﾙﾊﾞｯｸ間で文がｵｰﾌﾟﾝされたままの状態がｻﾎﾟｰﾄされるかどうかを取得します。" )
    188                , new MetaDataInvoke( "supportsOrderByUnrelated"                        ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ORDER BY 節で SELECT 文中にない列の使用がｻﾎﾟｰﾄされるかどうかを取得します。" )
    189                , new MetaDataInvoke( "supportsOuterJoins"                                      ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、外部結合のなんらかの形式がｻﾎﾟｰﾄされるかどうかを取得します。" )
    190                , new MetaDataInvoke( "supportsPositionedDelete"                        ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、位置指定された DELETE 文がｻﾎﾟｰﾄされるかどうかを取得します。" )
    191                , new MetaDataInvoke( "supportsPositionedUpdate"                        ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、位置指定された UPDATE 文がｻﾎﾟｰﾄされるかどうかを取得します。" )
    192                , new MetaDataInvoke( "supportsResultSetConcurrency"            ,2,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、指定された結果セットの型と与えられた並行処理の種類の組み合わせをｻﾎﾟｰﾄするかどうかを取得します。" )
    193                , new MetaDataInvoke( "supportsResultSetHoldability"            ,3,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、指定された結果セットの保持機能をｻﾎﾟｰﾄするかどうかを取得します。" )
    194                , new MetaDataInvoke( "supportsResultSetType"                           ,4,ResultSet.TYPE_FORWARD_ONLY          ,       "このﾃﾞｰﾀﾍﾞｰｽが、[TYPE_FORWARD_ONLY]指定された結果セットの型をｻﾎﾟｰﾄするかどうかを取得します。" )
    195                , new MetaDataInvoke( "supportsResultSetType"                           ,4,ResultSet.TYPE_SCROLL_INSENSITIVE,   "このﾃﾞｰﾀﾍﾞｰｽが、[TYPE_SCROLL_INSENSITIVE]指定された結果セットの型をｻﾎﾟｰﾄするかどうかを取得します。" )
    196                , new MetaDataInvoke( "supportsResultSetType"                           ,4,ResultSet.TYPE_SCROLL_SENSITIVE      ,       "このﾃﾞｰﾀﾍﾞｰｽが、[TYPE_SCROLL_SENSITIVE]指定された結果セットの型をｻﾎﾟｰﾄするかどうかを取得します。" )
    197                , new MetaDataInvoke( "supportsSavepoints"                                      ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによってｾｰﾌﾞﾎﾟｲﾝﾄがｻﾎﾟｰﾄされるかどうかを取得します。" )
    198                , new MetaDataInvoke( "supportsSchemasInDataManipulation"       ,0,-1,  "ﾃﾞｰﾀ操作文でｽｷｰﾏ名を使用できるかどうかを取得します。" )
    199                , new MetaDataInvoke( "supportsSchemasInIndexDefinitions"       ,0,-1,  "ｲﾝﾃﾞｯｸｽ定義文でｽｷｰﾏ名を使用できるかどうかを取得します。" )
    200                , new MetaDataInvoke( "supportsSchemasInPrivilegeDefinitions",0,-1,     "特権定義文でｽｷｰﾏ名を使用できるかどうかを取得します。" )
    201                , new MetaDataInvoke( "supportsSchemasInProcedureCalls"         ,0,-1,  "ﾌﾟﾛｼｰｼﾞｬ呼び出し文でｽｷｰﾏ名を使用できるかどうかを取得します。" )
    202                , new MetaDataInvoke( "supportsSchemasInTableDefinitions"       ,0,-1,  "ﾃｰﾌﾞﾙ定義文でｽｷｰﾏ名を使用できるかどうかを取得します。" )
    203                , new MetaDataInvoke( "supportsSelectForUpdate"                         ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって SELECT FOR UPDATE 文がｻﾎﾟｰﾄされるかどうかを取得します。" )
    204                , new MetaDataInvoke( "supportsStatementPooling"                        ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって文のﾌﾟｰﾙがｻﾎﾟｰﾄされるかどうかを取得します。" )
    205                , new MetaDataInvoke( "supportsStoredProcedures"                        ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、ｽﾄｱﾄﾞﾌﾟﾛｼｰｼﾞｬｴｽｹｰﾌﾟ構文を使用するｽﾄｱﾄﾞﾌﾟﾛｼｰｼﾞｬｺｰﾙがｻﾎﾟｰﾄされるかどうかを判定します。" )
    206                , new MetaDataInvoke( "supportsSubqueriesInComparisons"         ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、比較式中でｻﾌﾞｸｴﾘｰがｻﾎﾟｰﾄされるかどうかを取得します。" )
    207                , new MetaDataInvoke( "supportsSubqueriesInExists"                      ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、EXISTS 式中でｻﾌﾞｸｴﾘｰがｻﾎﾟｰﾄされるかどうかを取得します。" )
    208                , new MetaDataInvoke( "supportsSubqueriesInIns"                         ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、IN 文中でｻﾌﾞｸｴﾘｰがｻﾎﾟｰﾄされるかどうかを取得します。" )
    209                , new MetaDataInvoke( "supportsSubqueriesInQuantifieds"         ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、定量化された式中でｻﾌﾞｸｴﾘｰがｻﾎﾟｰﾄされるかどうかを取得します。" )
    210                , new MetaDataInvoke( "supportsTableCorrelationNames"           ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによってﾃｰﾌﾞﾙ相互関係名がｻﾎﾟｰﾄされるかどうかを取得します。" )
    211                , new MetaDataInvoke( "supportsTransactionIsolationLevel"       ,4,Connection.TRANSACTION_READ_COMMITTED        ,       "このﾃﾞｰﾀﾍﾞｰｽが、指定されたﾄﾗﾝｻﾞｸｼｮﾝ遮断ﾚﾍﾞﾙをｻﾎﾟｰﾄするかどうかを取得します。" )
    212                , new MetaDataInvoke( "supportsTransactionIsolationLevel"       ,4,Connection.TRANSACTION_READ_UNCOMMITTED      ,       "このﾃﾞｰﾀﾍﾞｰｽが、指定されたﾄﾗﾝｻﾞｸｼｮﾝ遮断ﾚﾍﾞﾙをｻﾎﾟｰﾄするかどうかを取得します。" )
    213                , new MetaDataInvoke( "supportsTransactionIsolationLevel"       ,4,Connection.TRANSACTION_REPEATABLE_READ       ,       "このﾃﾞｰﾀﾍﾞｰｽが、指定されたﾄﾗﾝｻﾞｸｼｮﾝ遮断ﾚﾍﾞﾙをｻﾎﾟｰﾄするかどうかを取得します。" )
    214                , new MetaDataInvoke( "supportsTransactionIsolationLevel"       ,4,Connection.TRANSACTION_SERIALIZABLE          ,       "このﾃﾞｰﾀﾍﾞｰｽが、指定されたﾄﾗﾝｻﾞｸｼｮﾝ遮断ﾚﾍﾞﾙをｻﾎﾟｰﾄするかどうかを取得します。" )
    215                , new MetaDataInvoke( "supportsTransactions"    ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによってﾄﾗﾝｻﾞｸｼｮﾝがｻﾎﾟｰﾄされるかどうかを取得します。" )
    216                , new MetaDataInvoke( "supportsUnion"                   ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって SQL UNION がｻﾎﾟｰﾄされるかどうかを取得します。" )
    217                , new MetaDataInvoke( "supportsUnionAll"                ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって SQL UNION ALL がｻﾎﾟｰﾄされるかどうかを取得します。" )
    218                , new MetaDataInvoke( "updatesAreDetected"              ,1,-1,  "ResultSet.rowUpdated ﾒｿｯﾄﾞを呼び出すことによって可視の行が更新されたことを検出できるかどうかを取得します。" )
    219                , new MetaDataInvoke( "usesLocalFilePerTable"   ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、各ﾃｰﾌﾞﾙにﾌｧｲﾙを使用するかどうかを取得します。" )
    220                , new MetaDataInvoke( "usesLocalFiles"                  ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、ﾛｰｶﾙﾌｧｲﾙにﾃｰﾌﾞﾙを格納するかどうかを取得します。" )
    221                , new MetaDataInvoke( "getAttributes"                   ,72,-1, "指定されたｽｷｰﾏおよびｶﾀﾛｸﾞで使用可能なﾕｰｻﾞ定義の型 (UDT) のための指定された型の指定された属性に関する記述を取得します。  " )
    222                , new MetaDataInvoke( "getBestRowIdentifier"    ,64,-1, "行を一意に識別するﾃｰﾌﾞﾙの最適な列セットに関する記述を取得します。" )
    223                , new MetaDataInvoke( "getCatalogs"                             ,50,-1, "このﾃﾞｰﾀﾍﾞｰｽで使用可能なｶﾀﾛｸﾞ名を取得します。" )
    224                , new MetaDataInvoke( "getColumnPrivileges"             ,61,-1, "ﾃｰﾌﾞﾙの列へのアクセス権に関する記述を取得します。  " )
    225                , new MetaDataInvoke( "getColumns"                              ,61,-1, "指定されたｶﾀﾛｸﾞで使用可能なﾃｰﾌﾞﾙ列の記述を取得します。  " )
    226                , new MetaDataInvoke( "getCrossReference"               ,65,-1, "指定された主ｷｰﾃｰﾌﾞﾙの主ｷｰ列を参照する指定された外部のｷｰﾃｰﾌﾞﾙ中の、外部のｷｰ列に関する記述 (ﾃｰﾌﾞﾙが別のｷｰをインポートする方法を記述) を取得します。" )
    227                , new MetaDataInvoke( "getExportedKeys"                 ,60,-1, "指定されたﾃｰﾌﾞﾙの主ｷｰ列 (ﾃｰﾌﾞﾙによってｴｸｽﾎﾟｰﾄされた外部ｷｰ) を参照する外部ｷｰ列に関する記述を取得します。" )
    228                , new MetaDataInvoke( "getImportedKeys"                 ,60,-1, "ﾃｰﾌﾞﾙの外部ｷｰ列 (ﾃｰﾌﾞﾙによってｲﾝﾎﾟｰﾄされる主ｷｰ) を参照する主ｷｰ列に関する記述を取得します。" )
    229                , new MetaDataInvoke( "getIndexInfo"                    ,63,-1, "指定されたﾃｰﾌﾞﾙのｲﾝﾃﾞｯｸｽと統計情報に関する記述を取得します。" )
    230                , new MetaDataInvoke( "getPrimaryKeys"                  ,60,-1, "指定されたﾃｰﾌﾞﾙの主ｷｰ列の記述を取得します。" )
    231                , new MetaDataInvoke( "getProcedureColumns"             ,81,-1, "指定されたｶﾀﾛｸﾞのｽﾄｱﾄﾞﾌﾟﾛｼｰｼﾞｬﾊﾟﾗﾒｰﾀと結果列に関する記述を取得します。  " )
    232                , new MetaDataInvoke( "getProcedures"                   ,80,-1, "指定されたｶﾀﾛｸﾞで使用可能なｽﾄｱﾄﾞﾌﾟﾛｼｰｼﾞｬに関する記述を取得します。  " )
    233                , new MetaDataInvoke( "getSchemas"                              ,50,-1, "このﾃﾞｰﾀﾍﾞｰｽで使用可能なｽｷｰﾏ名を取得します。" )
    234                , new MetaDataInvoke( "getSuperTables"                  ,60,-1, "このﾃﾞｰﾀﾍﾞｰｽの特定のｽｷｰﾏで定義されているﾃｰﾌﾞﾙ階層の説明を取得します。  " )
    235                , new MetaDataInvoke( "getSuperTypes"                   ,70,-1, "このﾃﾞｰﾀﾍﾞｰｽの特定のｽｷｰﾏで定義されているﾕｰｻﾞ定義型 (UDT) 階層の説明を取得します。" )
    236                , new MetaDataInvoke( "getTablePrivileges"              ,60,-1, "ｶﾀﾛｸﾞで使用可能な各ﾃｰﾌﾞﾙに対するｱｸｾｽ権に関する記述を取得します。" )
    237                , new MetaDataInvoke( "getTables"                               ,62,-1, "指定されたｶﾀﾛｸﾞで使用可能なﾃｰﾌﾞﾙに関する記述を取得します。" )
    238                , new MetaDataInvoke( "getTableTypes"                   ,50,-1, "このﾃﾞｰﾀﾍﾞｰｽで使用可能なﾃｰﾌﾞﾙの型を取得します。" )
    239                , new MetaDataInvoke( "getTypeInfo"                             ,50,-1, "このﾃﾞｰﾀﾍﾞｰｽでｻﾎﾟｰﾄされているすべての標準 SQL の型に関する記述を取得します。" )
    240                , new MetaDataInvoke( "getUDTs"                                 ,71,-1, "特定のｽｷｰﾏで定義されているﾕｰｻﾞ定義型 (UDT) の説明を取得します。" )
    241                , new MetaDataInvoke( "getVersionColumns"               ,60,-1, "行の任意の値が変更された場合に、自動的に更新されるﾃｰﾌﾞﾙの列に関する記述を取得します。" )
    242
    243        // 5.5.3.2 (2012/06/08) JDk1.6 用のﾒｿｯﾄﾞを追加します。
    244                , new MetaDataInvoke( "autoCommitFailureClosesAllResultSets"    ,0,-1,  "autoCommit が true の場合に、ResultSet が保持可能であっても、すべてのｵｰﾌﾟﾝされた ResultSet がクローズされたことを SQLException が示すかどうかを取得します。" )
    245                , new MetaDataInvoke( "supportsConvert"                                         ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽによって、JDBC 型 fromType と toType の間の変換に使用される JDBC ｽｶﾗｰ関数 CONVERT がｻﾎﾟｰﾄされるかどうかを取得します。" )
    246                , new MetaDataInvoke( "supportsStoredFunctionsUsingCallSyntax"  ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽが、ｽﾄｱﾄﾞﾌﾟﾛｼｰｼﾞｬｰｴｽｹｰﾌﾟ構文を使用した、ﾕｰｻﾞ定義関数またはﾍﾞﾝﾀﾞｰ関数の呼び出しをｻﾎﾟｰﾄするかどうかを取得します。" )
    247                , new MetaDataInvoke( "getDatabaseMajorVersion"         ,0,-1,  "基本となるﾃﾞｰﾀﾍﾞｰｽのﾒｼﾞｬｰﾊﾞｰｼﾞｮﾝ番号を取得します。" )
    248                , new MetaDataInvoke( "getDatabaseMinorVersion"         ,0,-1,  "基本となるﾃﾞｰﾀﾍﾞｰｽのﾏｲﾅｰﾊﾞｰｼﾞｮﾝ番号を取得します。" )
    249                , new MetaDataInvoke( "getJDBCMajorVersion"                     ,0,-1,  "このﾄﾞﾗｲﾊﾞの JDBC ﾒｼﾞｬｰﾊﾞｰｼﾞｮﾝ番号を取得します。" )
    250                , new MetaDataInvoke( "getJDBCMinorVersion"                     ,0,-1,  "このﾄﾞﾗｲﾊﾞの JDBC ﾏｲﾅｰﾊﾞｰｼﾞｮﾝ番号を取得します。" )
    251                , new MetaDataInvoke( "getMaxBinaryLiteralLength"       ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽで、ｲﾝﾗｲﾝﾊﾞｲﾅﾘﾘﾃﾗﾙ中に入れられる 16 進数の最大文字数を取得します。" )
    252                , new MetaDataInvoke( "getMaxCatalogNameLength"         ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ｶﾀﾛｸﾞ名の最大文字数を取得します。" )
    253                , new MetaDataInvoke( "getMaxCharLiteralLength"         ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ｷｬﾗｸﾀﾘﾃﾗﾙの最大文字数を取得します。" )
    254                , new MetaDataInvoke( "getMaxColumnNameLength"          ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、列名の最大文字数を取得します。" )
    255                , new MetaDataInvoke( "getMaxColumnsInGroupBy"          ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、GROUP BY 節中の列数の最大値を取得します。" )
    256                , new MetaDataInvoke( "getMaxColumnsInIndex"            ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ｲﾝﾃﾞｯｸｽ中の列数の最大値を取得します。" )
    257                , new MetaDataInvoke( "getMaxColumnsInOrderBy"          ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ORDER BY 節中の列数の最大値を取得します。" )
    258                , new MetaDataInvoke( "getMaxColumnsInSelect"           ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、SELECT ﾘｽﾄ中の列数の最大値を取得します。" )
    259                , new MetaDataInvoke( "getMaxColumnsInTable"            ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ﾃｰﾌﾞﾙ中の列数の最大値を取得します。" )
    260                , new MetaDataInvoke( "getMaxConnections"                       ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽに対して可能な並行接続の最大数を取得します。" )
    261                , new MetaDataInvoke( "getMaxCursorNameLength"          ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ｶｰｿﾙ名の最大文字数を取得します。" )
    262                , new MetaDataInvoke( "getMaxIndexLength"                       ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ｲﾝﾃﾞｯｸｽの全部分を含む、ｲﾝﾃﾞｯｸｽの最大ﾊﾞｲﾄ数を取得します。" )
    263                , new MetaDataInvoke( "getMaxProcedureNameLength"       ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ﾌﾟﾛｼｰｼﾞｬｰ名の最大文字数を取得します。" )
    264                , new MetaDataInvoke( "getMaxRowSize"                           ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、1 行の最大ﾊﾞｲﾄ数を取得します。" )
    265                , new MetaDataInvoke( "getMaxSchemaNameLength"          ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ｽｷｰﾏ名の最大文字数を取得します。" )
    266                , new MetaDataInvoke( "getMaxStatementLength"           ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、SQL 文の最大文字数を取得します。" )
    267                , new MetaDataInvoke( "getMaxStatements"                        ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽの同時にｵｰﾌﾟﾝできるｱｸﾃｨﾌﾞな文の最大数を取得します。" )
    268                , new MetaDataInvoke( "getMaxTableNameLength"           ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ﾃｰﾌﾞﾙ名の最大文字数を取得します。" )
    269                , new MetaDataInvoke( "getMaxTablesInSelect"            ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、SELECT 文の最大ﾃｰﾌﾞﾙ数を取得します。" )
    270                , new MetaDataInvoke( "getMaxUserNameLength"            ,0,-1,  "このﾃﾞｰﾀﾍﾞｰｽでの、ﾕｰｻﾞ名の最大文字数を取得します。" )
    271
    272                , new MetaDataInvoke( "getClientInfoProperties"         ,50,-1, "ﾄﾞﾗｲﾊﾞがｻﾎﾟｰﾄするｸﾗｲｱﾝﾄ情報ﾌﾟﾛﾊﾟﾃｨｰのﾘｽﾄを取得します。")
    273                , new MetaDataInvoke( "getFunctionColumns"                      ,81,-1, "指定されたｶﾀﾛｸﾞのｼｽﾃﾑ関数またはﾕｰｻﾞ関数のﾊﾟﾗﾒｰﾀと返される型に関する記述を取得します。")
    274                , new MetaDataInvoke( "getFunctions"                            ,80,-1, "指定されたｶﾀﾛｸﾞで使用可能なｼｽﾃﾑ関数およびﾕｰｻﾞ関数に関する記述を取得します。")
    275        } ;
    276
    277        // 4.0.0.0 (2007/10/10) dbid の初期値を、"DEFAULT" から null に変更
    278        private String  dbid                    ;
    279        private String  catalog                 ;
    280        private String  schema                  ;
    281        private String  tableName               ;
    282        private String  columnName              ;
    283        private String  typeName                ;
    284        private String  attributeName   ;
    285        private String  procedureName   ;
    286        private int             rowNo                   ;
    287        private int             maxRowCount             = 20;           // 5.5.3.2 (2012/06/08) 最大検索件数を、指定できるようにする。
    288        private String  likeKey                 ;                       // 5.5.3.2 (2012/06/08) 特定の処理だけを実行できるように、あいまい検索
    289
    290        /**
    291         * デフォルトコンストラクター
    292         *
    293         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    294         */
    295        public DatabaseMetaDataTag() { super(); }               // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    296
    297        /**
    298         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    299         *
    300         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為、ApplicationInfoオブジェクトを設定
    301         * @og.rev 4.0.0.1 (2007/12/03) try ～ catch ～ finally をきちんと行う。
    302         *
    303         * @return      後続処理の指示(EVAL_PAGE)
    304         */
    305        @Override
    306        public int doEndTag() {
    307                debugPrint();           // 4.0.0 (2005/02/28)
    308                Connection conn = null;
    309                boolean errFlag = true;
    310                try {
    311                        conn = ConnectionFactory.connection( dbid,getApplicationInfo() );       // 3.8.7.0 (2006/12/15)
    312                        final DatabaseMetaData metaData = conn.getMetaData() ;
    313
    314                        callPrintMessage( metaData );
    315                        errFlag = false;                // エラーではない
    316                }
    317                catch( final Throwable ex) {
    318                        final String errMsg = "ﾃﾞｰﾀﾍﾞｰｽ処理を実行できませんでした。"
    319                                                + ex.getMessage()  + CR ;
    320
    321                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    322                }
    323                finally {
    324                        // 以下のコーディングの見直しを考える必要有り。
    325                        // Connection はプールしている為、close() しても再利用されるだけ。
    326                        if( errFlag ) { ConnectionFactory.remove( conn,dbid ); }        // 削除
    327                        else {                  ConnectionFactory.close( conn,dbid );  }        // 返却
    328                }
    329
    330                jspPrint( "処理が完了しました。" + CR );          // 5.5.3.2 (2012/06/08) 終了メッセージ追加
    331                return EVAL_PAGE ;
    332        }
    333
    334        /**
    335         * タグリブオブジェクトをリリースします。
    336         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    337         *
    338         * @og.rev 4.0.0.0 (2007/10/10) dbid の初期値を、"DEFAULT" から null に変更
    339         * @og.rev 5.5.3.2 (2012/06/08) maxRowCount 最大検索件数を、指定できるようにする。
    340         * @og.rev 5.5.3.2 (2012/06/08) likeKey 特定の処理だけを実行できるように、あいまい検索
    341         */
    342        @Override
    343        protected void release2() {
    344                super.release2();
    345                dbid                    = null ;
    346                catalog                 = null ;
    347                schema                  = null ;
    348                tableName               = null ;
    349                columnName              = null ;
    350                typeName                = null ;
    351                procedureName   = null ;
    352                attributeName   = null ;
    353                rowNo                   = 0;
    354                maxRowCount             = 20;           // 5.5.3.2 (2012/06/08) 最大検索件数を、指定できるようにする。
    355                likeKey                 = null;         // 5.5.3.2 (2012/06/08) 特定の処理だけを実行できるように、あいまい検索
    356        }
    357
    358        /**
    359         * 画面にテーブルタグの(TR)として、情報を出力します。
    360         *
    361         * 第一引数が、String の場合のオーバーロードメソッドです。
    362         *
    363         * @param       arg1    第一引数(String)
    364         * @param       lbl             ラベル
    365         * @param       msg             メッセージ
    366         */
    367        private void printMessage( final String arg1, final String lbl, final String msg ) {
    368                final String str = "<tr class=\"row_" + (rowNo++ % 2) + "\"><td>"
    369                                 + rowNo + "</td><td>"                  // 5.5.3.2 (2012/06/08) 行番号を表示
    370                                 + lbl + "</td><td>" + arg1 + "</td><td>" + msg + "</td></tr>" + CR ;
    371                jspPrint( str );
    372        }
    373
    374        /**
    375         * 画面にテーブルとして、情報を出力します。
    376         *
    377         * 第一引数が、ResultSet の場合のオーバーロードメソッドです。
    378         *
    379         * @param       resultSet       ResultSetオブジェクト
    380         * @param       msg                     メッセージ
    381         */
    382        private void printMessage( final ResultSet resultSet, final String msg ) {
    383                final String str = msg + CR + makeTableTag( resultToString( resultSet ) ) ;
    384                jspPrint( str );
    385        }
    386
    387        /**
    388         * 画面にテーブルとして、情報を出力します。
    389         *
    390         * 第一引数が、存在しない場合のオーバーロードメソッドです。
    391         *
    392         * @param       lbl     ラベル
    393         * @param       msg     メッセージ
    394         */
    395        private void printMessage( final String lbl, final String msg ) {
    396                final String str = msg + CR + "<table><tr><td>" + lbl + "</td></tr></table>" + CR ;
    397                jspPrint( str );
    398        }
    399
    400        /**
    401         * 指定の文字列配列をテーブル上に表示する為の、テーブルを作成します。
    402         *
    403         * @og.rev 5.5.3.2 (2012/06/08) 行番号を表示するように修正
    404         *
    405         * @param       data    文字列配列の配列
    406         *
    407         * @return      文字列配列を表示する為のHTMLテーブル書式
    408         * @og.rtnNotNull
    409         */
    410        private String makeTableTag( final String[][] data ) {
    411                if( data == null || data.length == 0 ) { return "" ; }
    412
    413                final int maxRow = data.length ;
    414                final int maxClm = data[0].length ;
    415
    416                final StringBuilder buf = new StringBuilder( BUFFER_LARGE )
    417                        .append( "<table>" ).append( CR )
    418                        .append( "<tr class=\"row_h\"><th>No</th>" );           // 5.5.3.2 (2012/06/08) 行番号を表示
    419                for( int clm=0; clm<maxClm; clm++ ) {
    420                        buf.append( "<th>" ).append( data[0][clm] ).append( "</th>" );
    421                }
    422                buf.append( "</tr>" ).append( CR );
    423
    424                for( int row=1; row<maxRow; row++ ) {
    425                        buf.append( "<tr class=\"row_" ).append( (row-1) % 2 )
    426                                .append( "\"><td>" ).append( row ).append( "</td>" );                   // 5.5.3.2 (2012/06/08) 行番号を表示
    427                        for( int clm=0; clm<maxClm; clm++ ) {
    428                                buf.append( "<td>" ).append( data[row][clm] ).append( "</td>" );
    429                        }
    430                        buf.append( "</tr>" ).append( CR );
    431                }
    432                buf.append( "</table>" ).append( CR );
    433
    434                return buf.toString();
    435        }
    436
    437        /**
    438         * ステートメントと引数により、Queryを実行します。
    439         * これは、Prepared クエリーの検索のみ実行します。
    440         * 結果は、すべて文字列に変換されて格納されます。
    441         *
    442         * @og.rev 5.5.3.2 (2012/06/08) 最大検索件数を、指定できるようにする。
    443         * @og.rev 6.0.4.0 (2014/11/28) ResultSetValue を使用するように変更。
    444         *
    445         * @param   resultSet ResultSetオブジェクト
    446         *
    447         * @return  ResultSetの検索結果配列
    448         * @og.rtnNotNull
    449         */
    450        private String[][] resultToString( final ResultSet resultSet ) {
    451                final ArrayList<String[]> data = new ArrayList<>();
    452                try {
    453                        // 6.0.4.0 (2014/11/28) ResultSetValue を使用するように変更。
    454                        final ResultSetValue rsv = new ResultSetValue( resultSet );
    455
    456                        data.add( rsv.getNames() );
    457
    458                        // とりあえず MAX １０件とする。
    459                        int maxcnt = 0 ;
    460                        // 5.5.3.2 (2012/06/08) 最大検索件数を、指定できるようにする。
    461                        while( rsv.next() && maxcnt++ < maxRowCount ) {
    462                                data.add( rsv.getValues() );
    463                        }
    464                }
    465                catch( final SQLException ex) {
    466                        final String errMsg = "処理結果を実行できませんでした。"
    467                                                + ex.getMessage();              // 5.1.8.0 (2010/07/01) errMsg 修正
    468                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    469                }
    470
    471                final int size = data.size();
    472                String[][] rtn = new String[size][];
    473                for( int i=0; i<size; i++ ) {
    474                        rtn[i] = data.get(i);
    475                }
    476
    477                return rtn;
    478        }
    479
    480        /**
    481         * 【TAG】(通常は使いません)Queryオブジェクトを作成する時のDB接続IDを指定します(初期値:null)。
    482         *
    483         * @og.tag Queryオブジェクトを作成する時のDB接続IDを指定します。
    484         *
    485         * @param       id ﾃﾞｰﾀﾍﾞｰｽ接続ID
    486         */
    487        public void setDbid( final String id ) {
    488                dbid = nval( getRequestParameter( id ),dbid );
    489        }
    490
    491        /**
    492         * 【TAG】(通常は使いません)Queryオブジェクトを作成する時のカタログを指定します(初期値:null)。
    493         *
    494         * @og.tag Queryオブジェクトを作成する時のカタログを指定します。
    495         *
    496         * @param       val     ｶﾀﾛｸﾞ情報
    497         */
    498        public void setCatalog( final String val ) {
    499                catalog = nval( getRequestParameter( val ),catalog );
    500        }
    501
    502        /**
    503         * 【TAG】(通常は使いません)Queryオブジェクトを作成する時のスキーマを指定します。
    504         *
    505         * @og.tag Queryオブジェクトを作成する時のｽｷｰﾏを指定します。
    506         *
    507         * @param       val     ｽｷｰﾏ情報
    508         */
    509        public void setSchema( final String val ) {
    510                schema = nval( getRequestParameter( val ),schema );
    511        }
    512
    513        /**
    514         * 【TAG】(通常は使いません)Queryオブジェクトを作成する時のテーブル名を指定します。
    515         *
    516         * @og.tag Queryオブジェクトを作成する時のテーブル名を指定します。
    517         *
    518         * @param       val     テーブル名情報
    519         */
    520        public void setTableName( final String val ) {
    521                tableName = nval( getRequestParameter( val ),tableName );
    522        }
    523
    524        /**
    525         * 【TAG】(通常は使いません)Queryオブジェクトを作成する時のカラム名を指定します。
    526         *
    527         * @og.tag Queryオブジェクトを作成する時のカラム名を指定します。
    528         *
    529         * @param       val     カラム名情報
    530         */
    531        public void setColumnName( final String val ) {
    532                columnName = nval( getRequestParameter( val ),columnName );
    533        }
    534
    535        /**
    536         * 【TAG】(通常は使いません)Queryオブジェクトを作成する時のタイプ名を指定します。
    537         *
    538         * @og.tag Queryオブジェクトを作成する時のタイプ名を指定します。
    539         *
    540         * @param       val     タイプ名情報
    541         */
    542        public void setTypeName( final String val ) {
    543                typeName = nval( getRequestParameter( val ),typeName );
    544        }
    545
    546        /**
    547         * 【TAG】(通常は使いません)Queryオブジェクトを作成する時のプロダクト名を指定します。
    548         *
    549         * @og.tag Queryオブジェクトを作成する時のプロダクト名を指定します。
    550         *
    551         * @param       val     プロダクト名情報
    552         */
    553        public void setProcedureName( final String val ) {
    554                procedureName = nval( getRequestParameter( val ),procedureName );
    555        }
    556
    557        /**
    558         * 【TAG】(通常は使いません)Queryオブジェクトを作成する時の属性名を指定します。
    559         *
    560         * @og.tag Queryオブジェクトを作成する時の属性名を指定します。
    561         *
    562         * @param       val     属性名情報
    563         */
    564        public void setAttributeName( final String val ) {
    565                attributeName = nval( getRequestParameter( val ),attributeName );
    566        }
    567
    568        /**
    569         * 【TAG】maxRowCount ResultSetで検索するパラメータの最大検索件数を指定します(初期値:20)。
    570         *
    571         * @og.tag
    572         ResultSetで検索する最大検索件数を指定します
    573         * 大量に検索されて、処理速度が低下するのを避けるため、最大件数を指定します。
    574         * 他のタグの maxRowCount の初期値設定(初期値:DB_MAX_ROW_COUNT)は利用せず、独自に設定値を持っています。
    575         * 0は、無制限とします。
    576         *
    577         * @og.rev 5.5.3.2 (2012/06/08) likeKey 特定の処理だけを実行できるように、あいまい検索
    578         * @og.rev 5.5.8.5 (2012/11/27) 0を無制限として処理します。
    579         *
    580         * @param       maxSize 最大件数
    581         */
    582        public void setMaxRowCount( final String maxSize ) {
    583                maxRowCount = nval( getRequestParameter( maxSize ),maxRowCount );
    584                if( maxRowCount == 0 ) { maxRowCount = Integer.MAX_VALUE ; }                    // 5.5.8.5 (2012/11/27)
    585        }
    586
    587        /**
    588         * 【TAG】実行するメソッドを選別するための部分一致するキーを指定します。
    589         *
    590         * @og.tag
    591         * DatabaseMetaData で取得できる各種情報をアクセスするにあたり、指定のキーで部分一致する
    592         * メソッドだけ処理するように指定します。
    593         * メソッドの部分一致で判断します。
    594         * 処理は、大文字、小文字を認識したうえで、部分一致で判定します。
    595         *
    596         * @og.rev 5.5.3.2 (2012/06/08) likeKey 特定の処理だけを実行できるように、あいまい検索
    597         *
    598         * @param       key     実行するﾒｿｯﾄﾞを選別するためのｷｰ
    599         */
    600        public void setLikeKey( final String key ) {
    601                likeKey = nval( getRequestParameter( key ),likeKey );
    602        }
    603
    604        /**
    605         * 各ﾒｿｯﾄﾞ情報を画面に出力していきます。
    606         *
    607         * @og.rev 5.5.3.2 (2012/06/08) JDk1.6 用のﾒｿｯﾄﾞを追加します。
    608         * @og.rev 6.4.2.1 (2016/02/05) try-with-resources 文が使えないので、通常の try 文で、close する。
    609         *
    610         * @param metaData DatabaseMetaDataオブジェクト
    611         * @throws Throwable 何らかのエラーが発生した場合。
    612         */
    613        private void callPrintMessage( final DatabaseMetaData metaData ) throws Throwable {
    614                // 単体のリターン値を持つ メタﾃﾞｰﾀ
    615
    616                final Integer type = ResultSet.TYPE_FORWARD_ONLY ;
    617                final Integer concurrency = ResultSet.CONCUR_READ_ONLY;
    618                final Integer holdability = ResultSet.CLOSE_CURSORS_AT_COMMIT;
    619
    620                jspPrint( "<table>" );
    621                jspPrint( "<tr class=\"row_h\"><th>No</th><th>ｷｰ</th><th>値</th><th>説明</th></tr>" );
    622
    623                // 5.5.3.2 (2012/06/08) 個別に呼び出す箇所を、リフレクションに変更。
    624                for( int i=0; i<METHOD_LIST.length; i++ ) {
    625                        final MetaDataInvoke inv = METHOD_LIST[i];
    626                        if( inv.isUseMethod( likeKey ) && inv.getType() < 10 ) {
    627                                Object obj = null;
    628                                boolean isFume = false;         // 6.0.2.5 (2014/10/31) default に break を追記する為に、ロジック修正
    629                                switch( inv.getType() ) {
    630                                        // 6.1.0.0 (2014/12/26) findBugs: Bug type DB_DUPLICATE_SWITCH_CLAUSES (click for details)
    631                                        // switch 文の2つの case のために同じコードを使用しています。
    632                                        case 0:
    633                                        case 4: obj = inv.invokeA( metaData );                                  break;
    634                                        case 1: obj = inv.invokeA( metaData,type );                             break;
    635                                        case 2: obj = inv.invokeA( metaData,type,concurrency ); break;
    636                                        case 3: obj = inv.invokeA( metaData,holdability );              break;
    637                                        default : isFume = true;                                                                break;                          // 6.0.2.5 (2014/10/31)
    638                                }
    639                                if( isFume ) { jspPrint( "*** タイプ不明 ***" + BR ); continue; }    // 6.0.2.5 (2014/10/31)
    640                                final String msg = (obj == null) ? inv.getErrMsg() : String.valueOf( obj );
    641
    642                                final String str = "<tr class=\"row_" + (rowNo++ % 2) + "\"><td>"
    643                                                + rowNo + "</td><td>"                   // 5.5.3.2 (2012/06/08) 行番号を表示
    644                                                + inv.getMethod() + "</td><td>" + msg + "</td><td>" + inv.getComment() + "</td></tr>" + CR ;
    645                                jspPrint( str );
    646                        }
    647                }
    648                try { printMessage( metaData.getTimeDateFunctions() ,"getTimeDateFunctions",getTimeDateFunctions ); }
    649                        catch( final Throwable e ) { printMessage( e.getMessage(),"getTimeDateFunctions",getTimeDateFunctions ); }
    650
    651                jspPrint( "</table>" );
    652
    653                if( metaData.supportsConvert() ) {
    654                        supportsConvert( metaData );
    655                }
    656
    657                // 5.5.3.2 (2012/06/08) 個別に呼び出す箇所を、リフレクションに変更。
    658                for( int i=0; i<METHOD_LIST.length; i++ ) {
    659                        final MetaDataInvoke inv = METHOD_LIST[i];
    660                        if( inv.isUseMethod( likeKey ) && inv.getType() >= 10 ) {
    661                                ResultSet obj = null;
    662                                // 6.4.2.1 (2016/02/05) try-with-resources 文が使えないので、通常の try 文で、close する。
    663                                try {
    664                                        boolean isFume = false;         // 6.0.2.5 (2014/10/31) default に break を追記する為に、ロジック修正
    665                                        switch( inv.getType() ) {
    666                                                case 50: obj = inv.invokeB( metaData ); break;
    667                                                case 60:
    668                                                case 62:
    669                                                case 63:
    670                                                case 64:
    671                                                case 65: obj = inv.invokeB( metaData, catalog, schema, tableName ); break;
    672                                                case 70:
    673                                                case 71: obj = inv.invokeB( metaData, catalog, schema, typeName ); break;
    674                                                case 61: obj = inv.invokeB( metaData, catalog, schema, tableName, columnName ); break;
    675                                                case 72: obj = inv.invokeB( metaData, catalog, schema, typeName, attributeName ); break;
    676                                                case 81: obj = inv.invokeB( metaData, catalog, schema, procedureName, columnName ); break;
    677                                                case 80: obj = inv.invokeB( metaData, catalog, schema, procedureName ); break;
    678                                                default : isFume = true; break;                                                                                         // 6.0.2.5 (2014/10/31)
    679                                        }
    680                                        if( isFume ) { jspPrint( "*** タイプ不明 ***" + BR ); continue; }    // 6.0.2.5 (2014/10/31)
    681
    682                                        jspPrint( inv.getMethod() + ":" + inv.getComment() + BR );
    683                                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    684                                        if( obj == null ) {
    685                                                jspPrint( inv.getErrMsg() + BR );
    686                                        }
    687                                        else {
    688                                                jspPrint( makeTableTag( resultToString( obj ) ) );
    689                                        }
    690                                }
    691                                finally {
    692                                        Closer.resultClose( obj );
    693                                }
    694                        }
    695                }
    696
    697                // 以下、リフレクションが、エラーなどで結果を返さないﾒｿｯﾄﾞ。
    698                jspPrint( "****************************************************************************************************" + BR );
    699
    700                if( likeKey == null || "getAttributes".indexOf( likeKey ) >= 0 ) {
    701                        jspPrint( "getAttributes:" + getAttributes + BR );
    702                        try { printMessage( metaData.getAttributes(catalog, schema, typeName, attributeName) ,getAttributes); }
    703                                catch( final Throwable e ) { printMessage( e.getMessage() ,getAttributes); }
    704                }
    705                if( likeKey == null || "getColumns".indexOf( likeKey ) >= 0 ) {
    706                        jspPrint( "getColumns:" + getColumns + BR );
    707                        try { printMessage( metaData.getColumns(catalog, schema, tableName, columnName) ,getColumns); }
    708                                catch( final Throwable e ) { printMessage( e.getMessage() ,getColumns); }
    709                }
    710                if( likeKey == null || "getIndexInfo".indexOf( likeKey ) >= 0 ) {
    711                        jspPrint( "getIndexInfo:" + getIndexInfo + BR );
    712                        try { printMessage( metaData.getIndexInfo(catalog, schema, tableName, false, false) ,getIndexInfo); }
    713                                catch( final Throwable e ) { printMessage( e.getMessage() ,getIndexInfo); }
    714                }
    715                if( likeKey == null || "getSuperTables".indexOf( likeKey ) >= 0 ) {
    716                        jspPrint( "getSuperTables:" + getSuperTables + BR );
    717                        try { printMessage( metaData.getSuperTables(catalog, schema, tableName) ,getSuperTables); }
    718                                catch( final Throwable e ) { printMessage( e.getMessage() ,getSuperTables); }
    719                }
    720                if( likeKey == null || "getSuperTypes".indexOf( likeKey ) >= 0 ) {
    721                        jspPrint( "getSuperTypes:" + getSuperTypes + BR );
    722                        try { printMessage( metaData.getSuperTypes(catalog, schema, typeName) ,getSuperTypes); }
    723                                catch( final Throwable e ) { printMessage( e.getMessage() ,getSuperTypes); }
    724                }
    725                if( likeKey == null || "getTypeInfo".indexOf( likeKey ) >= 0 ) {
    726                        jspPrint( "getTypeInfo:" + getTypeInfo + BR );
    727                        try { printMessage( metaData.getTypeInfo() ,getTypeInfo); }
    728                                catch( final Throwable e ) { printMessage( e.getMessage() ,getTypeInfo); }
    729                }
    730        }
    731
    732        /**
    733         * ﾃﾞｰﾀﾍﾞｰｽの Types 定数を文字列に変換したテーブルを画面に出力します。
    734         *
    735         * @param metaData DatabaseMetaDataオブジェクト
    736         * @throws Throwable 何らかのエラーが発生した場合。
    737         * @see java.sql.Types
    738         */
    739        private void supportsConvert( final DatabaseMetaData metaData ) throws Throwable {
    740
    741                final int cnt = 36;
    742                int[]    key = new int[cnt] ;
    743                String[] msg = new String[cnt] ;
    744
    745                int i = 0;
    746                key[i] = Types.ARRAY ;                  msg[i++] = "ARRAY" ;                    // 0
    747                key[i] = Types.BIGINT ;                 msg[i++] = "BIGINT" ;                   // 1
    748                key[i] = Types.BINARY ;                 msg[i++] = "BINARY" ;                   // 2
    749                key[i] = Types.BIT ;                    msg[i++] = "BIT" ;                              // 3
    750                key[i] = Types.BLOB ;                   msg[i++] = "BLOB" ;                             // 4
    751                key[i] = Types.BOOLEAN ;                msg[i++] = "BOOLEAN" ;                  // 5
    752                key[i] = Types.CHAR ;                   msg[i++] = "CHAR" ;                             // 6
    753                key[i] = Types.CLOB ;                   msg[i++] = "CLOB" ;                             // 7
    754                key[i] = Types.DATALINK ;               msg[i++] = "DATALINK" ;                 // 8
    755                key[i] = Types.DATE ;                   msg[i++] = "DATE" ;                             // 9
    756                key[i] = Types.DECIMAL ;                msg[i++] = "DECIMAL" ;                  // 10
    757                key[i] = Types.DISTINCT ;               msg[i++] = "DISTINCT" ;                 // 11
    758                key[i] = Types.DOUBLE ;                 msg[i++] = "DOUBLE" ;                   // 12
    759                key[i] = Types.FLOAT ;                  msg[i++] = "FLOAT" ;                    // 13
    760                key[i] = Types.INTEGER ;                msg[i++] = "INTEGER" ;                  // 14
    761                key[i] = Types.JAVA_OBJECT ;    msg[i++] = "JAVA_OBJECT" ;              // 15
    762                key[i] = Types.LONGNVARCHAR ;   msg[i++] = "LONGNVARCHAR" ;             // 16   5.5.3.2 (2012/06/08)
    763                key[i] = Types.LONGVARBINARY ;  msg[i++] = "LONGVARBINARY" ;    // 17
    764                key[i] = Types.LONGVARCHAR ;    msg[i++] = "LONGVARCHAR" ;              // 18
    765                key[i] = Types.NCHAR ;                  msg[i++] = "NCHAR" ;                    // 19   5.5.3.2 (2012/06/08)
    766                key[i] = Types.NCLOB ;                  msg[i++] = "NCLOB" ;                    // 20   5.5.3.2 (2012/06/08)
    767                key[i] = Types.NULL ;                   msg[i++] = "NULL" ;                             // 21
    768                key[i] = Types.NUMERIC ;                msg[i++] = "NUMERIC" ;                  // 22
    769                key[i] = Types.NVARCHAR ;               msg[i++] = "NVARCHAR" ;                 // 23   5.5.3.2 (2012/06/08)
    770                key[i] = Types.OTHER ;                  msg[i++] = "OTHER" ;                    // 24
    771                key[i] = Types.REAL ;                   msg[i++] = "REAL" ;                             // 25
    772                key[i] = Types.REF ;                    msg[i++] = "REF" ;                              // 26
    773                key[i] = Types.ROWID ;                  msg[i++] = "ROWID" ;                    // 27   5.5.3.2 (2012/06/08)
    774                key[i] = Types.SMALLINT ;               msg[i++] = "SMALLINT" ;                 // 28   5.5.3.2 (2012/06/08)
    775                key[i] = Types.SQLXML ;                 msg[i++] = "SQLXML" ;                   // 29
    776                key[i] = Types.STRUCT ;                 msg[i++] = "STRUCT" ;                   // 30
    777                key[i] = Types.TIME ;                   msg[i++] = "TIME" ;                             // 31
    778                key[i] = Types.TIMESTAMP ;              msg[i++] = "TIMESTAMP" ;                // 32
    779                key[i] = Types.TINYINT ;                msg[i++] = "TINYINT" ;                  // 33
    780                key[i] = Types.VARBINARY ;              msg[i++] = "VARBINARY" ;                // 34
    781                key[i] = Types.VARCHAR ;                msg[i  ] = "VARCHAR" ;                  // 35
    782
    783                // それぞれ、Types 名称用のフィールドを追加
    784                String[][] table = new String[cnt+1][cnt+1];            // ヘッダー行を追加
    785                for( int hd=0; hd<cnt; hd++ ) {
    786                        table[0][hd+1] = msg[hd];               // 行のヘッダー
    787                        table[hd+1][0] = msg[hd];               // 列のヘッダー
    788                }
    789
    790                for( int row=0; row<cnt; row++ ) {
    791                        for( int clm=0; clm<cnt; clm++ ) {
    792                                if( metaData.supportsConvert( key[row], key[clm]) ) {
    793                                        table[row+1][clm+1] = "○" ;
    794                                }
    795                                else {
    796                                        table[row+1][clm+1] = "×" ;
    797                                }
    798                        }
    799                }
    800
    801                jspPrint( supportsConvertFunc + BR );
    802                jspPrint( makeTableTag( table ) );
    803        }
    804
    805        /**
    806         * メソッド処理を行う内部クラス
    807         */
    808        private static final class MetaDataInvoke {
    809                private static final int     scope    = 0;
    810                private static final boolean nullable = true;
    811
    812                private final String  method  ;
    813                private final int     type    ;                 // 0:引数なし 1: 2: 3: 4:内部value
    814                private final Integer value   ;
    815                private final String  comment ;
    816
    817                private String errMsg;
    818
    819                /**
    820                 * メソッド処理を行うクラスのコンストラクター
    821                 *
    822                 * @param       method  メソッドの文字列表現
    823                 * @param       type    呼出しタイプ
    824                 * @param       value   設定値
    825                 * @param       comment この処理に関するコメント
    826                 */
    827                public MetaDataInvoke( final String method,final int type,final int value,final String comment ) {
    828                        this.method  = method  ;
    829                        this.type        = type    ;
    830                        this.value   = Integer.valueOf(value) ;
    831                        this.comment = comment ;
    832                }
    833
    834                /**
    835                 * メソッドを返します。
    836                 *
    837                 * @return      メソッド
    838                 */
    839                public String getMethod() { return method; }
    840
    841                /**
    842                 * LIKEキーをメソッドが含むかどうか。
    843                 *
    844                 * @param       likeKey LIKEキー
    845                 * @return      LIKEキーが、null か、または、LIKEキーをメソッドが含む場合、true
    846                 */
    847                public boolean isUseMethod( final String likeKey ) {
    848                        return likeKey == null || method.indexOf( likeKey ) >= 0 ;
    849                }
    850
    851                /**
    852                 * タイプを返します。
    853                 *
    854                 * @return      タイプ
    855                 */
    856                public int getType() { return type; }
    857
    858                /**
    859                 * コメントを返します。
    860                 *
    861                 * @return      コメント
    862                 */
    863                public String getComment() { return comment; }
    864
    865                /**
    866                 * エラーメッセージを返します。
    867                 *
    868                 * @return      エラーメッセージ
    869                 */
    870                public String getErrMsg() { return errMsg; }
    871
    872                /**
    873                 * DatabaseMetaDataのオブジェクトを元に、動的にメソッド呼び出しを行います。
    874                 * メタデータ情報の取出しに使用します。
    875                 * 処理タイプに応じたメソッド呼び出しを行います。
    876                 *
    877                 * 0    引数なし
    878                 * 1    (int)
    879                 * 2    (int,int)
    880                 * 3    (int)
    881                 * 4    内部value
    882                 *
    883                 * @param       metaData        DatabaseMetaDataオブジェクト
    884                 * @param       vals            引数の文字列配列(可変長引数)
    885                 * @return      実行結果のオブジェクト
    886                 */
    887                public Object invokeA( final DatabaseMetaData metaData , final Integer... vals  ) {
    888                        Object obj = null ;
    889                        synchronized( metaData ) {
    890                                try {
    891                                        if( type == 0 ) {
    892                                                obj = metaData.getClass().getMethod( method ).invoke(metaData);
    893                                        } else if( type == 1 || type == 3 ) {
    894                                                obj = metaData.getClass().getMethod( method,int.class )
    895                                                                                                        .invoke(metaData,vals[0]);
    896                                        } else if( type == 2 ) {
    897                                                obj = metaData.getClass().getMethod( method,int.class,int.class )
    898                                                                                                        .invoke(metaData,vals[0],vals[1]);
    899                                        } else if( type == 4 ) {
    900                                                obj = metaData.getClass().getMethod( method,int.class )
    901                                                                                                        .invoke(metaData,value);
    902                                        } else {
    903                                                errMsg = "*** リフレクションタイプなしエラー ***";
    904                                        }
    905                                }
    906                                catch( final Throwable ex ) {
    907                                        errMsg = "*** 実行時エラー ***" + ex.getMessage();
    908                                        obj = null;                             // "*** 実行時エラー ***"
    909                                }
    910                        }
    911                        if( obj == null && errMsg == null ) { errMsg = "ｻﾎﾟｰﾄされない機能です。"; }
    912                        return obj ;
    913                }
    914
    915                /**
    916                 * DatabaseMetaDataのオブジェクトを元に、動的にメソッド呼び出しを行います。
    917                 * メタデータ情報の取出しに使用します。
    918                 * 処理タイプに応じたメソッド呼び出しを行います。
    919                 *
    920                 * 50   引数なし
    921                 * 60   (catalog, schema, tableName)
    922                 * 70   (catalog, schema, typeName)
    923                 * 80   (catalog, schema, procedureName)
    924                 * 62   (catalog, schema, tableName, (String[])null)     // String[]
    925                 * 71   (catalog, schema, typeName, (int[])null)                 // int[]
    926                 * 63   (catalog, schema, tableName, false, false)
    927                 * 61   (catalog, schema, tableName, columnName)
    928                 * 72   (catalog, schema, typeName, attributeName)
    929                 * 81   (catalog, schema, procedureName, columnName)
    930                 * 64   (catalog, schema, tableName, (int)scope, (boolean)nullable)
    931                 * 65   (catalog, schema, tableName, (String)null, (String)null, (String)null)
    932                 *
    933                 * @param       metaData        DatabaseMetaDataオブジェクト
    934                 * @param       vals            引数の文字列配列(可変長引数)
    935                 * @return      ResultSetオブジェクト
    936                 */
    937                public ResultSet invokeB( final DatabaseMetaData metaData , final String... vals  ) {
    938                        ResultSet obj = null ;
    939                        synchronized( metaData ) {
    940                                try {
    941                                        if( type == 50 ) {      // 引数なし
    942                                                obj = (ResultSet)metaData.getClass().getMethod( method ).invoke(metaData);
    943                                        } else if( type == 60 || type == 70 || type == 80 ) {
    944                                                obj = (ResultSet)metaData.getClass()
    945                                                                .getMethod( method,String.class,String.class,String.class )
    946                                                                .invoke(metaData,vals[0],vals[1],vals[2]);
    947                                        } else if( type == 62 ) {
    948                                                obj = (ResultSet)metaData.getClass()
    949                                                                .getMethod( method,String.class,String.class,String.class,String[].class )
    950                                                                .invoke(metaData,vals[0],vals[1],vals[2],null);
    951                                        } else if( type == 71 ) {
    952                                                obj = (ResultSet)metaData.getClass()
    953                                                                .getMethod( method,String.class,String.class,String.class,int[].class )
    954                                                                .invoke(metaData,vals[0],vals[1],vals[2],null);
    955                                        } else if( type == 63 ) {
    956                                                obj = (ResultSet)metaData.getClass()
    957                                                                .getMethod( method,String.class,String.class,String.class,boolean.class,boolean.class )
    958                                                                .invoke(metaData,vals[0],vals[1],vals[2],false,false);
    959                                        } else if( type == 61 || type == 72 || type == 81 ) {
    960                                                obj = (ResultSet)metaData.getClass()
    961                                                                .getMethod( method,String.class,String.class,String.class,String.class )
    962                                                                .invoke(metaData,vals[0],vals[1],vals[2],vals[3]);
    963                                        } else if( type == 64 ) {
    964                                                obj = (ResultSet)metaData.getClass()
    965                                                                .getMethod( method,String.class,String.class,String.class,int.class,boolean.class )
    966                                                                .invoke(metaData,vals[0],vals[1],vals[2],scope,nullable);
    967                                        } else if( type == 65 ) {
    968                                                obj = (ResultSet)metaData.getClass()
    969                                                                .getMethod( method,String.class,String.class,String.class,String.class,String.class,String.class )
    970                                                                .invoke(metaData,vals[0],vals[1],vals[2],null,null,null);
    971                                        } else {
    972                                                errMsg = "*** リフレクションタイプなしエラー ***";
    973                                        }
    974                                }
    975                                catch( final Throwable ex ) {
    976                                        errMsg = "*** 実行時エラー ***" + ex.getMessage();
    977                                        obj = null;                             // "*** 実行時エラー ***"
    978                                }
    979                        }
    980                        if( obj == null && errMsg == null ) { errMsg = "ｻﾎﾟｰﾄされない機能です。"; }
    981                        return obj ;
    982                }
    983        }
    984
    985        /**
    986         * このオブジェクトの文字列表現を返します。
    987         * 基本的にデバッグ目的に使用します。
    988         *
    989         * @return このクラスの文字列表現
    990         * @og.rtnNotNull
    991         */
    992        @Override
    993        public String toString() {
    994                return ToString.title( this.getClass().getName() )
    995                                .println( "VERSION"                     ,VERSION        )
    996                                .println( "dbid"                        ,dbid           )
    997                                .println( "catalog"                     ,catalog        )
    998                                .println( "schema"                      ,schema         )
    999                                .println( "tableName"           ,tableName      )
    1000                                .println( "columnName"          ,columnName     )
    1001                                .println( "typeName"            ,typeName       )
    1002                                .println( "procedureName"       ,procedureName)
    1003                                .println( "attributeName"       ,attributeName)
    1004                                .println( "rowNo"                       ,rowNo          )
    1005                                .println( "Other..."            ,getAttributes().getAttribute() )
    1006                                .fixForm().toString() ;
    1007        }
    1008}