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 }