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             * ・<b>PROCEDURE_CAT String ?プロシージャカタログ (null の可能性があ?
342             * ・<b>PROCEDURE_SCHEM String ?プロシージャスキー?(null の可能性があ?
343             * ・<b>PROCEDURE_NAME String ?プロシージャ?
344             * ・<b>?使用するための予?
345             * ・<b>?使用するための予?
346             * ・<b>?使用するための予?
347             * ・<b>REMARKS String ?プロシージャの説明文
348             * ・<b>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    }