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 }