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     */
016    package org.opengion.hayabusa.db;
017    
018    import org.opengion.hayabusa.common.HybsSystemException;
019    import org.opengion.hayabusa.resource.ResourceManager;
020    import org.opengion.fukurou.db.ConnectionFactory;
021    import org.opengion.fukurou.db.DBUtil;
022    import org.opengion.fukurou.util.ApplicationInfo;
023    
024    import java.util.Locale ;
025    
026    import java.sql.DatabaseMetaData ;
027    import java.sql.Connection;
028    import java.sql.ResultSet;
029    import java.sql.SQLException;
030    
031    /**
032     * 【検索】DatabaseMetaData のæƒ??を検索するタグですã?
033     *
034     * ãƒ??タベã?スに関するåŒ?‹¬çš?�ªæƒ??を提供するã?DatabaseMetaData のå†?®¹ã‚?
035     * 表示する、タグですã?ãƒ?‚¹ト的に使用しますã?
036     *
037     * @og.formSample
038     * ●形式ï¼?
039     *       ・<og:databaseMetaData />
040     * ●body?šなã�?
041     *
042     * ●使用ä¾?
043     *       <og:databaseMetaData />
044     *
045     * @og.group ãƒ??ブル管ç�?
046     *
047     * @version  4.0
048     * @author       Kazuhiko Hasegawa
049     * @since    JDK5.0,
050     */
051    public class DBMetaData {
052            private String  dbid = null ;
053            private ResourceManager resource = null ;
054            private ApplicationInfo appInfo  = null;        // 3.8.7.0 (2006/12/15)
055    
056            /**
057             * DatabaseMetaData を作æ?する時ã?DB接続IDを指定しますã?
058             *
059             * @param       id ãƒ??タベã?ス接続ID
060             */
061            public void setDbid( final String id ) {
062                    dbid = id;
063            }
064    
065            /**
066             * リソースマネージャーをセãƒ?ƒˆしますã?
067             * リソースマネージャーが設定されてã�?�ªã�??またã?、所定ã?キーの DBColumn ã�?
068             * リソースに存在しなã�??合ã?、デフォルトã? DBColumn オブジェクトを作æ?しますã?
069             *
070             * @param       resource リソースマネージャー
071             */
072            public void setResourceManager( final ResourceManager resource ) {
073                    this.resource = resource;
074            }
075    
076            /**
077             * アクセスログ取得ã?為,ApplicationInfoオブジェクトを設定しますã?
078             *
079             * @og.rev 3.8.7.0 (2006/12/15) 新規追åŠ?
080             *
081             * @param   appInfo アプリæƒ??オブジェクãƒ?
082             */
083            public void setApplicationInfo( final ApplicationInfo appInfo ) {
084                    this.appInfo = appInfo;
085            }
086    
087            /**
088             * ResultSet より、DBTableModel を作æ?して返しますã?
089             *
090             * @param       resultSet ResultSetオブジェクãƒ?
091             *
092             * @return      作æ?されã�?DBTableModelオブジェクãƒ?
093             */
094            private DBTableModel makeDBTableModel( final ResultSet resultSet ) {
095    
096                    String[][] data = DBUtil.resultToArray( resultSet,true );       // ヘッãƒ??付き配å?
097    
098                    DBTableModel table = DBTableModelUtil.newDBTable() ;
099    
100                    int numberOfColumns =  data[0].length;
101                    table.init( numberOfColumns );
102    
103                    for(int column = 0; column < numberOfColumns; column++) {
104                            String  name = data[0][column].toUpperCase(Locale.JAPAN) ;
105                            DBColumn clm = resource.makeDBColumn( name );
106                            table.setDBColumn( column,clm );
107                    }
108    
109                    // ãƒ??タ部の設å®?
110                    for( int row=1; row<data.length; row++ ) {
111                            table.addColumnValues( data[row] );
112                    }
113                    return table ;
114            }
115    
116            /**
117             * こã?ãƒ??タベã?スで使用可能なスキーマ名を取得しますã?
118             * 結果はスキーマ名でé ?º�付けられますã?
119             * スキーマå?は次のようになりますã?
120             *
121             * ・<b>TABLE_SCHEM</b> String â‡?スキーマ名
122             * ・<b>TABLE_CATALOG</b> String â‡?カタログå�?(null の可能性があã‚?
123             *
124             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
125             *
126             * @return      スキーマ名をDBTableModelオブジェクトにラãƒ??
127             * @see java.sql.DatabaseMetaData#getSchemas()
128             */
129            public DBTableModel getSchemas() {
130                    final DBTableModel table ;
131                    Connection conn = null ;
132                    try {
133                            conn = ConnectionFactory.connection( dbid,appInfo );
134                            DatabaseMetaData metaData = conn.getMetaData();
135                            // ====== table 求めの個所のみ、異なりますã?
136                            table = makeDBTableModel( metaData.getSchemas() );
137                            // ====== ここまで
138                    }
139                    catch ( SQLException ex) {
140                            ConnectionFactory.remove( conn,dbid );
141                            conn = null;
142                            throw new HybsSystemException( ex );
143                    }
144                    finally {
145                            ConnectionFactory.close( conn,dbid );
146    //                      conn = null;
147                    }
148                    return table ;
149            }
150    
151            /**
152             * æŒ?®šされたカタログで使用可能なãƒ??ブルに関する記述を取得しますã?
153             * カタログ、スキーマã?ãƒ??ブル名およã?型ã?条件にä¸??するãƒ??ブルの記述ã�?�‘が返されますã?
154             * それらã?、TABLE_TYPE、TABLE_SCHEM、TABLE_NAME によってé ?º�付けられますã?
155             *
156             * å�?ƒ†ーブルの記述には次の列がありますã?
157             *
158             * ・<b>TABLE_CAT</b> String â‡?ãƒ??ブルカタログ (null の可能性があã‚?
159             * ・<b>TABLE_SCHEM</b> String â‡?ãƒ??ブルスキーãƒ?(null の可能性があã‚?
160             * ・<b>TABLE_NAME</b> String â‡?ãƒ??ブルå�?
161             * ・<b>TABLE_TYPE</b> String â‡?ãƒ??ブルの型ã?典型的な型ã?ã€?TABLE"ã€?VIEW"ã€?SYSTEM TABLE"ã€?GLOBAL TEMPORARY"ã€?LOCAL TEMPORARY"ã€?ALIAS"ã€?SYNONYM" である
162             * ・<b>REMARKS</b> String â‡?ãƒ??ブルに関する説æ˜?
163             * ・<b>TYPE_CAT</b> String â‡?の型ã?カタログ (null の可能性があã‚?
164             * ・<b>TYPE_SCHEM</b> String â‡?の型ã?スキーãƒ?(null の可能性があã‚?
165             * ・<b>TYPE_NAME</b> String â‡?の型名 (null の可能性があã‚?
166             * ・<b>SELF_REFERENCING_COL_NAME</b> String â‡?型付きãƒ??ブルのæŒ?®šされた「識別子ã?列ã?名前 (null の可能性があã‚?
167             * ・<b>REF_GENERATION</b> String â‡?SELF_REFERENCING_COL_NAME の値の作æ?方法をæŒ?®šするã?値はã€?SYSTEM"ã€?USER"ã€?DERIVED" (null の可能性があã‚?
168             *
169             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
170             *
171             * @param       catalog カタログ名ã?(カタログ名とä¸??ã€?" はカタログなしã?null は、カタログ名無条件)
172             * @param       schema  スキーマ名パターンã€?スキーマ名とä¸??ã€?" はスキーマなしã?null は、スキーマ名無条件)
173             * @param       tableName       ãƒ??ブル名パターンã€?
174             *
175             * @return      ãƒ??ブルに関する記述をDBTableModelオブジェクトにラãƒ??
176             * @see java.sql.DatabaseMetaData#getSchemas()
177             */
178            public DBTableModel getTables( final String catalog,
179                                                                            final String schema,
180                                                                            final String tableName ) {
181                    final DBTableModel table ;
182                    Connection conn = null ;
183                    try {
184                            conn = ConnectionFactory.connection( dbid,appInfo );
185                            DatabaseMetaData metaData = conn.getMetaData();
186                            // ====== table 求めの個所のみ、異なりますã?
187                            // types String[] çµ?�¿込ã‚?ƒ†ーブルの型ã?リストã?null はすべての型を返す
188                            table = makeDBTableModel( metaData.getTables(catalog, schema, tableName, null) );
189                            // ====== ここまで
190                    }
191                    catch ( SQLException ex) {
192                            ConnectionFactory.remove( conn,dbid );
193                            conn = null;
194                            throw new HybsSystemException( ex );
195                    }
196                    finally {
197                            ConnectionFactory.close( conn,dbid );
198    //                      conn = null;
199                    }
200                    return table ;
201            }
202    
203            /**
204             * æŒ?®šされたカタログで使用可能なãƒ??ブル列ã?記述を取得しますã?
205             * カタログ、スキーマã?ãƒ??ブル名ã?および列名の条件にä¸??する列ã?
206             * 記述ã�?�‘が返されますã?
207             * それらã?、TABLE_SCHEM、TABLE_NAME、ORDINAL_POSITION によってé ?º�付けられますã?
208             * å�??の説明を次にしまã�?
209             *
210             * ・<b>TABLE_CAT</b> String â‡?ãƒ??ブルカタログ (null の可能性があã‚?
211             * ・<b>TABLE_SCHEM</b> String â‡?ãƒ??ブルスキーãƒ?(null の可能性があã‚?
212             * ・<b>TABLE_NAME</b> String â‡?ãƒ??ブルå�?
213             * ・<b>COLUMN_NAME</b> String â‡?列名
214             * ・<b>DATA_TYPE</b> short â‡?java.sql.Types からの SQL のåž?
215             * ・<b>TYPE_NAME</b> String â‡?ãƒ??タソース依存ã?型名。UDT の場合ã?型名は完å?æŒ?®?
216             * ・<b>COLUMN_SIZE</b> int â‡?列サイズ。char ã‚?date の型につã�?�¦はæœ?¤§æ–?­—数、numeric ã‚?decimal の型につã�?�¦は精度
217             * ・<b>BUFFER_LENGTH</b> - 未使用
218             * ・<b>DECIMAL_DIGITS</b> int â‡?小数点以下ã?桁数
219             * ・<b>NUM_PREC_RADIX</b> int â‡?基数 (通常はã€?0 またã? 2 のどちらか)
220             * ・<b>NULLABLE</b> int â‡?NULL は許されるか
221             * ・<b>columnNoNulls</b> - NULL 値を許さなã�?�¯能性があã‚?
222             * ・<b>columnNullable</b> - å¿?�š NULL 値を許ã�?
223             * ・<b>columnNullableUnknown</b> - NULL 値を許すかどã�?�‹は不æ?
224             * ・<b>REMARKS</b> String â‡?コメント記述åˆ?(null の可能性があã‚?
225             * ・<b>COLUMN_DEF</b> String â‡?ãƒ?ƒ•ォルトå? (null の可能性があã‚?
226             * ・<b>SQL_DATA_TYPE</b> int â‡?未使用
227             * ・<b>SQL_DATETIME_SUB</b> int â‡?未使用
228             * ・<b>CHAR_OCTET_LENGTH</b> int â‡?char の型につã�?�¦は列ã?æœ?¤§バイト数
229             * ・<b>ORDINAL_POSITION</b> int â‡?ãƒ??ブル中の列ã?インãƒ?ƒƒクス (1 から始まã‚?
230             * ・<b>IS_NULLABLE</b> String â‡?"NO" は、å?は決して NULL 値を許さなã�?�“とを意味するã€?YES" は NULL 値を許す可能性があることを意味する。空のæ–?­—å?は不æ?であることを意味する
231             * ・<b>SCOPE_CATLOG</b> String â‡?参ç?属æ?のスコープであるãƒ??ブルのカタログ (DATA_TYPE ã�?REF でなã�??合ã? null)
232             * ・<b>SCOPE_SCHEMA</b> String â‡?参ç?属æ?のスコープであるãƒ??ブルのスキーãƒ?(DATA_TYPE ã�?REF でなã�??合ã? null)
233             * ・<b>SCOPE_TABLE</b> String â‡?参ç?属æ?のスコープであるãƒ??ブルå�?(DATA_TYPE ã�?REF でなã�??合ã? null)
234             * ・<b>SOURCE_DATA_TYPE</b> short â‡?個別の型またã?ユーザ生æ? Ref 型ã?java.sql.Types の SQL 型ã?ソースのåž?(DATA_TYPE ã�?DISTINCT またã?ユーザ生æ? REF でなã�??合ã? null)
235             *
236             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
237             *
238             * @param       catalog カタログ名ã?(カタログ名とä¸??ã€?" はカタログなしã?null は、カタログ名無条件)
239             * @param       schema  スキーマ名パターンã€?スキーマ名とä¸??ã€?" はスキーマなしã?null は、スキーマ名無条件)
240             * @param       tableName       ãƒ??ブル名パターンã€?
241             * @param       columnName      列名パターン
242             *
243             * @return      ãƒ??ブル列ã?記述をDBTableModelオブジェクトにラãƒ??
244             * @see java.sql.DatabaseMetaData#getSchemas()
245             */
246            public DBTableModel getColumns( final String catalog,
247                                                                            final String schema,
248                                                                            final String tableName,
249                                                                            final String columnName ) {
250                    final DBTableModel table ;
251                    Connection       conn   = null ;
252                    try {
253                            conn = ConnectionFactory.connection( dbid,appInfo );
254                            DatabaseMetaData metaData = conn.getMetaData();
255                            // ====== table 求めの個所のみ、異なりますã?
256                            table = makeDBTableModel( metaData.getColumns(catalog, schema, tableName, columnName) );
257                            // ====== ここまで
258                    }
259                    catch ( SQLException ex) {
260                            ConnectionFactory.remove( conn,dbid );
261                            conn = null;
262                            throw new HybsSystemException( ex );
263                    }
264                    finally {
265                            ConnectionFactory.close( conn,dbid );
266    //                      conn = null;
267                    }
268                    return table ;
269            }
270    
271            /**
272             * æŒ?®šされたãƒ??ブルのインãƒ?ƒƒクスと統計情報に関する記述を取得しますã?
273             * それらã?、NON_UNIQUE、TYPE、INDEX_NAME、ORDINAL_POSITION によってé ?º�付けされますã?
274             * å�?‚¤ンãƒ?ƒƒクス列ã?記述には次の列がありまã�?
275             *
276             * ・<b>TABLE_CAT</b> String â‡?ãƒ??ブルカタログ (null の可能性があã‚?
277             * ・<b>TABLE_SCHEM</b> String â‡?ãƒ??ブルスキーãƒ?(null の可能性があã‚?
278             * ・<b>TABLE_NAME</b> String â‡?ãƒ??ブルå�?
279             * ・<b>NON_UNIQUE</b> boolean â‡?インãƒ?ƒƒクス値はä¸?„�でなã�??にできるかã?TYPE ã�?tableIndexStatistic の場合ã? false
280             * ・<b>INDEX_QUALIFIER</b> String â‡?インãƒ?ƒƒクスカタログ (null の可能性があã‚?。TYPE ã�?tableIndexStatistic の場合ã? null
281             * ・<b>INDEX_NAME</b> String â‡?インãƒ?ƒƒクス名ã?TYPE ã�?tableIndexStatistic の場合ã? null
282             * ・<b>TYPE</b> short â‡?インãƒ?ƒƒクスのåž?
283             *
284             * ・tableIndexStatistic - ãƒ??ブルのインãƒ?ƒƒクスの記述に連動して返されるãƒ??ブルの統計情報を識別する
285             * ・tableIndexClustered - クラスタ化されたインãƒ?ƒƒクス
286             * ・tableIndexHashed - ハッシュ化されたインãƒ?ƒƒクス
287             * ・tableIndexOther - インãƒ?ƒƒクスのそã?他ã?スタイル
288             *
289             * ・<b>ORDINAL_POSITION</b> short â‡?インãƒ?ƒƒクス中の列シーケンス。TYPE ã�?tableIndexStatistic の場合ã? 0
290             * ・<b>COLUMN_NAME</b> String â‡?列名。TYPE ã�?tableIndexStatistic の場合ã? null
291             * ・<b>ASC_OR_DESC</b> String â‡?列ソートシーケンスã€?A" â‡?æ˜??ã€?D" â‡?降é?ã€?
292                                    ソートシーケンスがサポã?トされてã�?�ªã�??合ã?、null の可能性があるã?TYPE ã�?tableIndexStatistic の場合ã? null
293             * ・<b>CARDINALITY</b> int â‡?TYPE ã�?tableIndexStatistic の場合ã?ãƒ??ブル中の列数。そã�?�§なã�??合ã?、インãƒ?ƒƒクス中のä¸?„�の値の数
294             * ・<b>PAGES</b> int â‡?TYPE ã�?tableIndexStatistic の場合ã?ãƒ??ブルで使用されるã?ージ数。そã�?�§なã�??合ã?、現在のインãƒ?ƒƒクスで使用されるã?ージ数
295             * ・<b>FILTER_CONDITION</b> String â‡?もしあれば、フィルタ条件 (null の可能性があã‚?
296             *
297             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
298             *
299             * @param       catalog カタログ名ã?(カタログ名とä¸??ã€?" はカタログなしã?null は、カタログ名無条件)
300             * @param       schema  スキーマ名パターンã€?スキーマ名とä¸??ã€?" はスキーマなしã?null は、スキーマ名無条件)
301             * @param       tableName       ãƒ??ブル名ã?こã?ãƒ??タベã?スに格納されたãƒ??ブル名とä¸??しなければならなã�?
302             * @param       unique  true の場合ã?、ä¸?„�の値のインãƒ?ƒƒクスã�?�‘を返す。false の場合ã?、ä¸?„�であるかどã�?�‹にかかわらずインãƒ?ƒƒクスを返す
303             * @param       approximate     true の場合ã?、結果は概数またã?ãƒ??タ値から外れることもあるã?false の場合ã?、正確であることが要求される
304             *
305             * @return      インãƒ?ƒƒクスと統計情報に関する記述をDBTableModelオブジェクトにラãƒ??
306             * @see java.sql.DatabaseMetaData#getSchemas()
307             */
308            public DBTableModel getIndexInfo( final String catalog,
309                                                                                    final String schema,
310                                                                                    final String tableName,
311                                                                                    final boolean unique,
312                                                                                    final boolean approximate ) {
313                    final DBTableModel table ;
314                    Connection conn = null ;
315                    try {
316                            conn = ConnectionFactory.connection( dbid,appInfo );
317                            DatabaseMetaData metaData = conn.getMetaData();
318                            // ====== table 求めの個所のみ、異なりますã?
319                            table = makeDBTableModel( metaData.getIndexInfo(catalog, schema, tableName, unique, approximate) );
320                            // ====== ここまで
321                    }
322                    catch ( SQLException ex) {
323                            ConnectionFactory.remove( conn,dbid );
324                            conn = null;
325                            throw new HybsSystemException( ex );
326                    }
327                    finally {
328                            ConnectionFactory.close( conn,dbid );
329    //                      conn = null;
330                    }
331                    return table ;
332            }
333    
334            /**
335             * æŒ?®šされたカタログで使用可能なストアドã?ロシージャに関する記述を取得しますã?
336             * スキーマとプロシージャ名ã?条件にä¸??するプロシージャの記述ã�?�‘が返されますã?
337             * それらã?、PROCEDURE_SCHEM と PROCEDURE_NAME によってé ?º�付けられますã?
338             *
339             * å�??ロシージャの記述には次の列がありますã?
340             *
341             * ・PROCEDURE_CAT String â‡?プロシージャカタログ (null の可能性があã‚?
342             * ・PROCEDURE_SCHEM String â‡?プロシージャスキーãƒ?(null の可能性があã‚?
343             * ・PROCEDURE_NAME String â‡?プロシージャå�?
344             * ・å°?�¥使用するための予ç´?
345             * ・å°?�¥使用するための予ç´?
346             * ・å°?�¥使用するための予ç´?
347             * ・REMARKS String â‡?プロシージャの説明文
348             * ・PROCEDURE_TYPE short â‡?プロシージャの種é¡?
349             *
350             * ・procedureResultUnknown - 結果を返す可能性があã‚?
351             * ・procedureNoResult - 結果を返さなã�?
352             * ・procedureReturnsResult - 結果を返す
353             *
354             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
355             *
356             * @param       catalog カタログ名ã?(カタログ名とä¸??ã€?" はカタログなしã?null は、カタログ名無条件)
357             * @param       schema  スキーマ名パターンã€?スキーマ名とä¸??ã€?" はスキーマなしã?null は、スキーマ名無条件)
358             * @param       procName        プロシージャ名パターン。データベã?スに格納されたプロシージャ名とä¸??しなければならなã�?
359             *
360             * @return      ストアドã?ロシージャに関する記述をDBTableModelオブジェクトにラãƒ??
361             * @see java.sql.DatabaseMetaData#getSchemas()
362             */
363            public DBTableModel getProcedures( final String catalog,
364                                                                                    final String schema,
365                                                                                    final String procName ) {
366                    final DBTableModel table ;
367                    Connection conn = null ;
368                    try {
369                            conn = ConnectionFactory.connection( dbid,appInfo );
370                            DatabaseMetaData metaData = conn.getMetaData();
371                            // ====== table 求めの個所のみ、異なりますã?
372                            table = makeDBTableModel( metaData.getProcedures(catalog, schema, procName) );
373                            // ====== ここまで
374                    }
375                    catch ( SQLException ex) {
376                            ConnectionFactory.remove( conn,dbid );
377                            conn = null;
378                            throw new HybsSystemException( ex );
379                    }
380                    finally {
381                            ConnectionFactory.close( conn,dbid );
382    //                      conn = null;
383                    }
384                    return table ;
385            }
386    }