    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 */
    016package org.opengion.hayabusa.db;
    017
    018import java.sql.Connection;
    019import java.sql.ResultSet;
    020import java.sql.SQLException;
    021
    022import org.opengion.fukurou.db.Transaction;
    023import org.opengion.fukurou.db.ConnectionFactory;               // 5.3.8.0 (2011/08/01)
    024import org.opengion.fukurou.util.ErrorMessage;
    025import org.opengion.hayabusa.common.HybsSystem;
    026import org.opengion.hayabusa.common.HybsSystemException;
    027import org.opengion.hayabusa.resource.ResourceManager;
    028
    029/**
    030 * Query インターフェースを継承した Query の実装クラスです。
    031 * クエリークラスにステートメントを与えて execute()することにより内部に DBTableModel を
    032 * 作成します。
    033 * このクラスは、Abstract クラスのため、実装は個々のサブクラスで行います。
    034 * 唯一実装する必要があるのは, execute() メソッドだけです。
    035 *
    036 * @og.group ＤＢ検索
    037 * @og.group ＤＢ登録
    038 *
    039 * @version  4.0
    040 * @author       Kazuhiko Hasegawa
    041 * @since    JDK5.0,
    042 */
    043public class AbstractQuery implements Query {
    044        private Connection              connection      = null ;
    045        private Transaction             transaction     = null ;        // 5.1.9.0 (2010/08/01)
    046        private int                     rtnCode         = ErrorMessage.OK;
    047        private ErrorMessage    errMessage      = null;
    048        private ResourceManager resource        = null;
    049
    050        private DBTableModel table                      = null;
    051        private String           connID                 = null;
    052        private String           stmtString             = null;
    053        private int              executeCount   = -1 ;
    054        private int              skipRowCount   = 0 ;
    055        private int              maxRowCount    = HybsSystem.sysInt( "DB_MAX_ROW_COUNT" ) ;
    056        private boolean          updateFlag             = true ;
    057        private DBEditConfig config                     = null; // 5.3.6.0 (2011/06/01)
    058
    059        // 5.1.9.0 (2010/08/01) DB_RETRY_COUNT,DB_RETRY_TIME 廃止
    060        protected static final int DB_MAX_QUERY_TIMEOUT = HybsSystem.sysInt( "DB_MAX_QUERY_TIMEOUT" ) ;
    061
    062        // 3.5.2.0 (2003/10/20) 内部オブジェクトタイプ名を システムパラメータ で定義します。
    063        /** 内部オブジェクトタイプ名  {@value} */
    064        public static final String ARG_ARRAY            = "ARG_ARRAY" ;
    065        /** 内部オブジェクトタイプ名  {@value} */
    066        public static final String SYSARG_ARRAY         = "SYSARG_ARRAY" ;
    067        /** 内部オブジェクトタイプ名  {@value} */
    068        public static final String ERR_MSG                      = "ERR_MSG" ;
    069        /** 内部オブジェクトタイプ名  {@value} */
    070        public static final String ERR_MSG_ARRAY        = "ERR_MSG_ARRAY" ;
    071
    072        /**
    073         * Queryオブジェクトを初期化します。
    074         * これは、QueryFactory のプールから取り出すときに(または戻すとき)に
    075         * 初期化するのに使用します。
    076         *
    077         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    078         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    079         * @og.rev 5.1.9.0 (2010/08/01) transaction 属性(外部Transactionの使用)追加
    080         * @og.rev 5.3.6.0 (2011/06/01) DBEditConfig 追加
    081         *
    082         */
    083        public void init() {
    084                close();                                        // 先にクローズ処理を行います。(transaction = null がセット)
    085                rtnCode                 = ErrorMessage.OK;
    086                errMessage              = null;
    087                resource                = null;
    088                table                   = null;
    089                connID                  = null;
    090                stmtString              = null;
    091                executeCount    = -1 ;
    092                skipRowCount    = 0 ;
    093                maxRowCount             = HybsSystem.sysInt( "DB_MAX_ROW_COUNT" ) ;
    094                updateFlag              = true ;
    095                connection              = null;         // 5.1.9.0 (2010/08/01) キャッシュの初期化
    096                config                  = null;         // 5.3.6.0 (2011/06/01) DBEditConfig追加
    097        }
    098
    099        /**
    100         * ステートメント文字列をセットします。
    101         *
    102         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    103         *
    104         * @param       stmt ステートメント文字列
    105         *
    106         */
    107        public void setStatement( final String stmt ) {
    108                this.stmtString = stmt.trim();
    109        }
    110
    111        /**
    112         * ステートメント文字列を取り出します。
    113         *
    114         * @return       ステートメント文字列
    115         *
    116         */
    117        public String getStatement() {
    118                return stmtString;
    119        }
    120
    121        /**
    122         * クエリーを実行します。
    123         * 実行方法等は各サブクラスの実装に依存します。
    124         * セットされているステートメント文字列とそのタイプが合っていない場合は,
    125         * エラーになります。
    126         * 実行結果は、DBTableModel にセットされます。
    127         * 実行結果の件数は #getExecuteCount() で取得できます。
    128         * ※ このクラスでは実装されていません。
    129         *
    130         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    131         *
    132         */
    133        public void execute() {
    134                String errMsg = "このクラスでは実装されていません。execute()";
    135                throw new UnsupportedOperationException( errMsg );
    136        }
    137
    138        /**
    139         * 引数配列付のクエリーを実行します。
    140         * 処理自体は, #execute() と同様に、各サブクラスの実装に依存します。
    141         * これは、PreparedQuery で使用する引数を配列でセットするものです。
    142         * select * from emp where deptno = ? and job = ? などの PreparedQuery や
    143         * { call xxxx( ?,?,? ) } などの CallableStatement の ? 部分の引数を
    144         * 順番にセットしていきます。
    145         * ※ このクラスでは実装されていません。
    146         *
    147         * @param       args オブジェクトの引数配列
    148         */
    149        public void execute( final String[] args ) {
    150                String errMsg = "このクラスでは実装されていません。execute( String[] )";
    151                throw new UnsupportedOperationException( errMsg );
    152        }
    153
    154        /**
    155         * 引数配列付のクエリーを実行します。
    156         * 処理自体は, #execute() と同様に、各サブクラスの実装に依存します。
    157         * これは、PreparedQuery で使用する引数を配列でセットするものです。
    158         * select * from emp where deptno = ? and job = ? などの PreparedQuery の
    159         * ? 部分の引数を
    160         * 順番にセットしていきます。
    161         * ※ このクラスでは実装されていません。
    162         *
    163         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
    164         *
    165         * @param   keys オブジェクトのキー配列
    166         * @param   args オブジェクトの引数配列
    167         */
    168        public void execute( final String[] keys, final String[] args ) {
    169                String errMsg = "このクラスでは実装されていません。execute( String[],String[] )";
    170                throw new UnsupportedOperationException( errMsg );
    171        }
    172
    173        /**
    174         * 引数配列付のクエリーを実行します。
    175         * 処理自体は, #execute() と同様に、各サブクラスの実装に依存します。
    176         * これは、PreparedQuery で使用する引数を配列でセットするものです。
    177         * select * from emp where deptno = ? and job = ? などの PreparedQuery の
    178         * ? 部分の引数を
    179         * 順番にセットしていきます。
    180         * ※ このクラスでは実装されていません。
    181         *
    182         * @og.rev 4.0.0.0 (2005/01/31) 引数をすべて受け取って実行するメソッドを標準メソッドとして追加
    183         *
    184         * @param       names           カラム名(CSV形式)
    185         * @param       dbArrayType     アレイタイプ名称
    186         * @param       sysArg          DBSysArg配列
    187         * @param       userArg         DBUserArg配列
    188         */
    189        public void execute( final String names,final String dbArrayType,
    190                                                final DBSysArg[] sysArg,final DBUserArg[] userArg ) {
    191                String errMsg = "このクラスでは実装されていません。execute( String,String,DBSysArg[],DBUserArg[] )";
    192                throw new UnsupportedOperationException( errMsg );
    193        }
    194
    195        /**
    196         * 引数配列付のクエリーを実行します。
    197         * 処理自体は, #execute() と同様に、各サブクラスの実装に依存します。
    198         * これは、PreparedQuery で使用する引数を配列でセットするものです。
    199         * select * from emp where deptno = ? and job = ? などの PreparedQuery の
    200         * [カラム名] 部分の引数を、DBTableModelから順番にセットしていきます。
    201         * ※ このクラスでは実装されていません。
    202         *
    203         * @param   rowNo 選択された行番号配列(登録する対象行)
    204         * @param   table DBTableModelオブジェクト(登録する元データ)
    205         */
    206        public void execute( final int[] rowNo, final DBTableModel table ) {
    207                String errMsg = "このクラスでは実装されていません。execute( final int[] rowNo, final DBTableModel table )";
    208                throw new UnsupportedOperationException( errMsg );
    209        }
    210
    211        /**
    212         * コミットを行います。
    213         *
    214         * 外部からコネクションが与えられた場合は、何も行いません。
    215         *
    216         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    217         * @og.rev 3.8.0.8 (2005/10/03) エラーメッセージの出力順をメッセージ＋Queryに変更します。
    218         * @og.rev 5.1.9.0 (2010/08/01) transaction 属性追加。
    219         *
    220         */
    221        public void commit() {
    222                if( transaction == null ) { return; }
    223
    224                if( !transaction.commit() ) {
    225                        transaction.rollback();
    226                        realClose();
    227                        String errMsg = "コミットすることが出来ませんでした。" + HybsSystem.CR
    228                                                + getStatement() + HybsSystem.CR ;
    229                        throw new HybsSystemException( errMsg );
    230                }
    231        }
    232
    233        /**
    234         * ロールバックを行います。
    235         *
    236         * 外部からコネクションが与えられた場合は、何も行いません。
    237         *
    238         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    239         * @og.rev 3.8.0.8 (2005/10/03) エラーメッセージの出力順をメッセージ＋Queryに変更します。
    240         * @og.rev 5.1.9.0 (2010/08/01) transaction 属性追加。
    241         *
    242         */
    243        public void rollback() {
    244                if( transaction == null ) { return; }
    245
    246                if( !transaction.rollback() ) {
    247                        realClose();
    248                        String errMsg = "ロールバックすることが出来ません。" + HybsSystem.CR
    249                                                 + getStatement() + HybsSystem.CR ;
    250                        throw new HybsSystemException( errMsg );
    251                }
    252        }
    253
    254        /**
    255         * 使用した Statementオブジェクトをクロースし、Connection オブジェクトを
    256         * プールに返します。
    257         * 主に、正常終了した場合のクローズ処理になります。
    258         *
    259         * 外部からコネクションが与えられた場合は、何も行いません。
    260         *
    261         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    262         * @og.rev 3.6.0.4 (2004/10/14) SQLWarning の取得(getWarning)をコメントアウトします。
    263         * @og.rev 5.1.9.0 (2010/08/01) transaction 属性追加。
    264         * @og.rev 5.3.8.0 (2011/08/01) Transaction発生箇所でclose()するため、ここではclose() しない。
    265         *
    266         */
    267        public void close() {}
    268
    269        /**
    270         * Connection オブジェクトを実際にクローズ(破棄)します。
    271         * プールからも削除します。
    272         * 実行時エラー等が発生したときに、このメソッドを呼び出します。
    273         *
    274         * 外部からコネクションが与えられた場合は、何も行いません。
    275         *
    276         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    277         * @og.rev 5.1.9.0 (2010/08/01) transaction 属性追加。
    278         * @og.rev 5.3.8.0 (2011/08/01) Transaction発生箇所でclose()するため、ここではclose() しない。
    279         *
    280         */
    281        public void realClose() {}
    282
    283        /**
    284         * クエリーの実行結果件数をセットします。
    285         * 初期値は -1 です。(クエリーが失敗した場合や,CallableStatement の呼び出し等で
    286         * 実行件数が明確でない場合の戻り値)。
    287         *
    288         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    289         *
    290         * @param       executeCount 実行結果件数
    291         */
    292        protected void setExecuteCount( final int executeCount ) {
    293                this.executeCount = executeCount;
    294        }
    295
    296        /**
    297         * クエリーの実行結果を返します。
    298         * クエリーが失敗した場合や,CallableStatement の呼び出し等で実行件数が明確でない
    299         * 場合は, -1 が返されます。
    300         *
    301         * @return      実行結果件数
    302         */
    303        public int getExecuteCount() {
    304                return executeCount;
    305        }
    306
    307        /**
    308         * DBTableModel をセットします。
    309         * なお、検索系実行前に setDBTableModel() でテーブルをセットしていたとしても
    310         * そのオブジェクトは破棄されて、新しい DBTableModel が生成されます。
    311         *
    312         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    313         *
    314         * @param       table DBTableModelオブジェクト
    315         */
    316        protected void setDBTableModel( final DBTableModel table ) {
    317                this.table = table;
    318        }
    319
    320        /**
    321         * 実行結果の DBTableModel を返します。
    322         *
    323         * @return      DBTableModelオブジェクト
    324         */
    325        public DBTableModel getDBTableModel() {
    326                return table;
    327        }
    328
    329        /**
    330         * データベースの最大検索件数を返します。
    331         *              (初期値:DB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])。
    332         * データベース自体の検索は,指定されたSQLの全件を検索しますが,
    333         * DBTableModelのデータとして登録する最大件数をこの値に設定します。0は無制限です。
    334         * サーバーのメモリ資源と応答時間の確保の為です。
    335         *
    336         * @return      最大検索件数
    337         */
    338        public int getMaxRowCount() {
    339                return maxRowCount;
    340        }
    341
    342        /**
    343         * データベースの最大検索件数をセットします。
    344         * データベース自体の検索は,指定されたSQLの全件を検索しますが,
    345         * DBTableModelのデータとして登録する最大件数をこの値に設定します。
    346         * サーバーのメモリ資源と応答時間の確保の為です。
    347         * ゼロ、または、負の値を設定すると、無制限(Integer.MAX_VALUE)になります。
    348         *
    349         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    350         * @og.rev 4.0.0.0 (2005/08/31) ゼロ、または、負の値は、無制限(Integer.MAX_VALUE)にする。
    351         *
    352         * @param       maxRowCount 最大検索件数
    353         */
    354        public void setMaxRowCount( final int maxRowCount ) {
    355                this.maxRowCount = ( maxRowCount > 0 ) ? maxRowCount : Integer.MAX_VALUE ;
    356        }
    357
    358        /**
    359         * データベースの検索スキップ件数を返します。
    360         * データベース自体の検索は,指定されたSQLの全件を検索しますが,
    361         * DBTableModelのデータとしては、スキップ件数分は登録されません。
    362         * サーバーのメモリ資源と応答時間の確保の為です。
    363         *
    364         * @return      最大検索件数
    365         */
    366        public int getSkipRowCount() {
    367                return skipRowCount;
    368        }
    369
    370        /**
    371         * データベースの検索スキップ件数をセットします。
    372         * データベース自体の検索は,指定されたSQLの全件を検索しますが,
    373         * DBTableModelのデータとしては、スキップ件数分は登録されません。
    374         * サーバーのメモリ資源と応答時間の確保の為です。
    375         *
    376         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    377         *
    378         * @param       skipRowCount スキップ件数
    379         */
    380        public void setSkipRowCount( final int skipRowCount ) {
    381                this.skipRowCount = skipRowCount;
    382        }
    383
    384        /**
    385         * アップデートフラグをセットします。
    386         * これは、Query で更新処理の SQL 文を実行したときにセットされます。
    387         * 更新処理が実行：true / 検索処理のみ：false をセットします。
    388         * このメソッドを呼び出さない場合は、デフォルト：true  です。
    389         *
    390         * @og.rev 2.1.2.3 (2002/12/02) データベース更新時に、更新フラグをセットするように変更
    391         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    392         *
    393         * @param       up      アップデートされたかどうか[true:更新処理/false:検索処理]
    394         */
    395        protected void setUpdateFlag( final boolean up ) {
    396                updateFlag = up;
    397        }
    398
    399        /**
    400         * アップデートフラグを取得します。
    401         * これは、Query で更新処理の SQL 文を実行したときに true にセットされます。
    402         * 更新処理が実行：true / 検索処理のみ：false を取得できます。
    403         *
    404         * @og.rev 2.1.2.3 (2002/12/02) データベース更新時に、更新フラグをセットするように変更
    405         * @og.rev 4.0.0.0 (2007/07/20) メソッド名変更( getUpdateFlag() ⇒ isUpdate() )
    406         *
    407         * @return       アップデートされたかどうか[true:更新処理/false:検索処理]
    408         */
    409        public boolean isUpdate() {
    410                return updateFlag ;
    411        }
    412
    413        /**
    414         * リソースマネージャーをセットします。
    415         * これは、言語(ロケール)に応じた DBColumn をあらかじめ設定しておく為に
    416         * 必要です。
    417         * リソースマネージャーが設定されていない、または、所定のキーの DBColumn が
    418         * リソースに存在しない場合は、内部で DBColumn オブジェクトを作成します。
    419         *
    420         * @og.rev 4.0.0.0 (2005/01/31) lang ⇒ ResourceManager へ変更
    421         *
    422         * @param       resource リソースマネージャー
    423         */
    424        public void setResourceManager( final ResourceManager resource ) {
    425                this.resource = resource;
    426        }
    427
    428        /**
    429         * エラーコード を取得します。
    430         * エラーコード は、ErrorMessage クラスで規定されているコードです。
    431         *
    432         * @return   エラーコード
    433         */
    434        public int getErrorCode() { return rtnCode; }
    435
    436        /**
    437         * エラーコード をセットします。
    438         * エラーコード は、ErrorMessage クラスで規定されているコードです。
    439         *
    440         * @param   cd エラーコード
    441         */
    442        protected void setErrorCode( final int cd ) { rtnCode = cd; }
    443
    444        /**
    445         * エラーメッセージオブジェクト を取得します。
    446         *
    447         * @return   エラーメッセージオブジェクト
    448         */
    449        public ErrorMessage getErrorMessage() { return errMessage; }
    450
    451        /**
    452         * エラーメッセージオブジェクト をセットします。
    453         *
    454         * @param   em エラーメッセージオブジェクト
    455         */
    456        protected void setErrorMessage( final ErrorMessage em ) { errMessage = em; }
    457
    458        /**
    459         * エディット設定オブジェクトをセットします。
    460         *
    461         * @og.rev 5.3.6.0 (2011/06/01) 新規追加
    462         *
    463         * @param config エディット設定オブジェクト
    464         */
    465        public void setEditConfig( final DBEditConfig config ) {
    466                this.config = config;
    467        }
    468
    469        /**
    470         * エディット設定オブジェクトを取得します。
    471         *
    472         * @og.rev 5.3.6.0 (2011/06/01) 新規追加
    473         *
    474         * @return エディット設定オブジェクト
    475         */
    476        protected DBEditConfig getEditConfig() {
    477                return config;
    478        }
    479
    480        //////////////////////////////////////////////////////////////////////////
    481        //
    482        //       継承時にサブクラスから使用するメソッド類( protected )
    483        //
    484        //////////////////////////////////////////////////////////////////////////
    485
    486        /**
    487         * ResultSet を DBTableModelに割り当てます。
    488         *
    489         * 毎回,検索毎に,DBTableModel にコピーするイメージです。
    490         * ResulSet 以外のオブジェクトから，DBTableModelを作成する場合は,
    491         * このメソッドをオーバーライドします。
    492         *
    493         * このメソッドは， execute からのみ,呼び出されます。
    494         * それ以外からは呼出し出来ません。
    495         *
    496         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    497         * @og.rev 3.3.3.3 (2003/08/06) カラムのラベル名を、大文字に変換する。
    498         * @og.rev 3.8.5.0 (2006/03/02) CLOB カラムかどうかを判定しCLOBの場合は、Clob オブジェクトから文字列を取り出します。
    499         * @og.rev 3.8.8.8 (2007/05/11) ROWID対応(小数点対応 "0.3" が ".3" と表示される対策)
    500         * @og.rev 4.0.0.0 (2006/01/31) CLOB カラムかどうかを判定しCLOBの場合は、ストリームから値を取り出します。
    501         * @og.rev 5.3.6.0 (2011/06/01) DBTableModel作成処理をDBTableModelUtilに移動＆集計機能対応
    502         *
    503         * @param       resultSet ResultSetオブジェクト
    504         */
    505        protected void createTableModel( final ResultSet resultSet ) {
    506                try {
    507                        if( config == null ) {
    508                                table = DBTableModelUtil.makeDBTable( resultSet, getSkipRowCount(), maxRowCount, resource );
    509                        }
    510                        else {
    511                                table = DBTableModelUtil.makeEditDBTable( resultSet, getSkipRowCount(), maxRowCount, resource, config );
    512                        }
    513
    514                        setExecuteCount( table.getRowCount() );
    515                }
    516                catch( SQLException ex ) {
    517                        realClose();
    518                        String errMsg = "テーブルモデルを作成できませんでした。";
    519                        throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    520                }
    521        }
    522
    523        /**
    524         * ConnectionFactory.connection( String ); を利用して,Connection
    525         * オブジェクトを取り出します。
    526         *
    527         * コネクションプールが一杯の場合は、即エラーになります。
    528         *
    529         * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。
    530         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    531         * @og.rev 5.1.9.0 (2010/08/01) transaction 属性追加。
    532         *
    533         * @return      コネクション
    534         */
    535        protected Connection getConnection() {
    536                if( connection == null ) {
    537                        // 5.1.9.0 (2010/08/01) transaction 属性追加。
    538                        if( transaction == null ) {
    539                                String errMsg = "Transaction をセットする前に、コネクションを取り出す要求がなされました。"
    540                                                                + HybsSystem.CR
    541                                                                + "connID = [" + connID + "]" ;
    542                                throw new HybsSystemException( errMsg );
    543                        }
    544                        else {
    545                                connection = transaction.getConnection( connID );
    546                        }
    547                }
    548
    549                return connection;
    550        }
    551
    552        /**
    553         * Transactionオブジェクトを外部から設定します。
    554         *
    555         * 通常は、ConnectionFactory を使用して、内部で Connection を作成しますが、
    556         * 一連のトランザクション処理を実施するには、外部から Transactionオブジェクトを
    557         * を与えて、そこから、Connection を取り出す必要があります。
    558         *
    559         * ここでは、内部の connection が存在しない場合に限り、セットを許可します。
    560         *
    561         * @og.rev 5.1.9.0 (2010/08/01) 新規追加
    562         *
    563         * @param       connID  接続先ID
    564         * @param       tran    Transactionオブジェクト
    565         */
    566        public void setTransaction( final String connID , final Transaction tran ) {
    567                if( transaction == null ) {
    568                        transaction     = tran;
    569                        this.connID = connID;
    570                }
    571                else {
    572                        String errMsg = "トランザクションは、すでに設定済みです。"
    573                                                        + HybsSystem.CR
    574                                                        + "connID = [" + connID + "]" ;
    575                        throw new HybsSystemException( errMsg );
    576                }
    577        }
    578
    579        /**
    580         * connection オブジェクトから，ワーニングデータを取り出します。
    581         *
    582         * ワーニングデータは，SQLWarning クラスのオブジェクトに複数件貯えられます。
    583         * query 実行後に,確認しておく必要があります。
    584         *
    585         * このメソッドは， execute からのみ,呼び出されます。
    586         * それ以外からは呼出し出来ません。
    587         *
    588         * @param       connection Connection
    589         *
    590         * @return      ワーニング ErrorMessage
    591         */
    592        //      protected ErrorMessage getWarning( final Connection connection ) {
    593        //              if( connection == null ) { return null; }
    594        //
    595        //              try {
    596        //                      ErrorMessage em = new ErrorMessage();
    597        //                      for( SQLWarning warning = connection.getWarnings();
    598        //                                                      warning != null ;
    599        //                                                      warning = warning.getNextWarning() ) {
    600        //                              em.addMessage( 0,ErrorMessage.WARNING,warning.getMessage(),warning.getSQLState() );
    601        //                      }
    602        //                      return em;
    603        //              }
    604        //              catch (SQLException ex) {
    605        //                      realClose();
    606        //                      String errMsg = "ワーニングを取り出すことが出来ませんでした。";
    607        //                      errMsg += System.getProperty( "line.separator" );
    608        //                      errMsg += ex.getMessage() + ":" + ex.getSQLState();
    609        //                      throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並び順変更
    610        //              }
    611        //      }
    612
    613        /**
    614         * この接続が、PreparedStatement#getParameterMetaData() を使用するかどうかを判定します。
    615         *
    616         * ConnectionFactory#useParameterMetaData(String) の結果を返します。(postgreSQL対応)
    617         *
    618         * @og.rev 5.3.8.0 (2011/08/01) 新規追加
    619         *
    620         * @return      使用する場合：true / その他:false
    621         * @see org.opengion.fukurou.db.ConnectionFactory#useParameterMetaData(String)
    622         */
    623        protected boolean useParameterMetaData() {
    624                return ConnectionFactory.useParameterMetaData( connID );
    625        }
    626
    627        //////////////////////////////////////////////////////////////////////////
    628        //
    629        //       Object クラスのオーバーライド部分
    630        //
    631        //////////////////////////////////////////////////////////////////////////
    632
    633        /**
    634         * オブジェクトの識別子として，最後のクエリーを返します。
    635         *
    636         * @return      最後のクエリー
    637         */
    638        @Override
    639        public String toString() {
    640                return  "LastQuery  :[" + getStatement() + "] ";
    641        }
    642}