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 }