001package org.opengion.hayabusa.queue;
002
003// import org.apache.commons.lang3.StringUtils;                                 // 7.0.6.0 (2019/10/07)
004import org.opengion.fukurou.db.ConnectionFactory;
005import org.opengion.fukurou.db.DBFunctionName;
006import org.opengion.fukurou.db.DBUtil;
007import org.opengion.fukurou.db.Transaction;
008import org.opengion.fukurou.db.TransactionReal;
009// import org.opengion.fukurou.util.ApplicationInfo;
010import org.opengion.fukurou.db.ApplicationInfo;                                 // 7.0.6.0 (2019/10/07) util → db に移動のため
011import org.opengion.hayabusa.common.HybsSystem;
012import org.opengion.fukurou.system.DateSet;                                             // 7.0.6.0 (2019/10/07) HybsSystem.getDate( String )
013
014/**
015 * キュー処理用のDBアクセスクラス
016 * キューの受信と送信処理で、
017 * データベースにアクセスして処理を行います。
018 *
019 * 実際のMQ,SQSとの通信そのものはfukurouで行います。
020 * 
021 * @og.group メッセージ連携
022 *
023 * @og.rev 5.10.15.2 (2019/09/20) 新規作成
024 * 
025 * @version 5
026 * @author oota
027 * @since JDK7
028 *
029 */
030public class DBAccessQueue {
031        private static final String DYSET_YMD  = "yyyyMMddHHmmss";
032        private static  ApplicationInfo appInfo = null;
033        private static final String DBID = HybsSystem.sys( "RESOURCE_DBID" );
034        private final String SYSTEM_ID;
035        private final String USRSET;
036        private final String PGUPD;
037        private final String DMN_NAME;
038        
039        // 処理中
040        public static final String  FGKAN_PROCESS = "2";
041        // 完了
042        public static final String  FGKAN_END = "3";
043        // エラー
044        public static final String  FGKAN_ERROR = "4";
045        
046        /** コネクションにアプリケーション情報を追記するかどうか指定 */
047        // パラメータ編集必要
048        private static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
049
050        /**
051         * コンストラクター
052         * 初期処理を行います。
053         * 
054         * @param systemid システムID
055         * @param usrset ユーザID
056         * @param prpupd プログラムID
057         * @param dmnName デーモン名
058         */
059        public DBAccessQueue(final String systemid, final String usrset, final String prpupd, final String dmnName) {
060                SYSTEM_ID = systemid;
061//              USRSET = StringUtils.defaultString(usrset, "UNNONE") ;                  // 7.0.6.0 (2019/10/07)
062//              PGUPD  = StringUtils.defaultString( prpupd, "UNNONE" ) ;                // 7.0.6.0 (2019/10/07)
063//              DMN_NAME = StringUtils.defaultString( dmnName, "UNNONE" ) ;             // 7.0.6.0 (2019/10/07)
064                USRSET          = usrset  == null ? "UNNONE" : usrset ;                         // "" の時、"" を返す必要がある。StringUtil.nval は、"" と null を同値に扱う
065                PGUPD           = prpupd  == null ? "UNNONE" : prpupd ;
066                DMN_NAME        = dmnName == null ? "UNNONE" : dmnName ;
067                
068                if (USE_DB_APPLICATION_INFO) {
069                        appInfo = new ApplicationInfo();
070
071                        // ユーザーID,IPアドレス,ホスト名
072                        appInfo.setClientInfo(USRSET, HybsSystem.HOST_ADRS, HybsSystem.HOST_NAME);
073                        // 画面ID,操作,プログラムID
074                        appInfo.setModuleInfo("DBAccessQueue", null, DMN_NAME);
075                }
076                else {
077                        appInfo = null;
078                }
079        }
080
081        /**
082         * GE65検索
083         * GE65の処理対象リストを取得します。
084         * 
085         * @return 処理対象リスト
086         */
087        public String[][] selectGE65() {
088                final String sql = "SELECT A.YKNO, A.QUEUEID, A.MESSAGE, A.SFDUPID, B.QUESYU, B.JMSURL FROM GE66 A"
089                                + " INNER JOIN GE65 B ON A.SYSTEM_ID = B.SYSTEM_ID AND A.QUEUEID = B.QUEUEID AND B.FGJ = '1'"
090                                + " WHERE A.SYSTEM_ID = ? AND A.FGKAN = '1' AND A.FGJ = '1'";
091                
092                final String[][] vals = DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
093                return vals;
094        }
095        
096        /**
097         * エラー状態に更新
098         * 完了フラグをエラー状態に更新して、
099         * エラー情報を格納します。
100         * 
101         * @param ykno 要求番号
102         * @param errMsg エラーメッセージ
103         */
104        public void updateGE66Error(final String ykno, final String errMsg) {
105                final String updSql = "UPDATE GE66 SET FGKAN = ?, ERRMSG = ?"
106                                + "WHERE SYSTEM_ID = ? AND FGJ = '1' AND YKNO = ?";
107                DBUtil.dbExecute(updSql, new String[] {
108                                FGKAN_ERROR, errMsg, SYSTEM_ID, ykno
109                }, appInfo, DBID);
110        }
111        
112        /**
113         * 完了フラグの更新
114         * 完了フラグを指定された値に更新します。
115         * 
116         * @param ykno 要求番号
117         * @param fgkan 完了フラグ
118         */
119        public void updateGE66(final String ykno, final String fgkan) {
120//              final String dyset = HybsSystem.getDate(DYSET_YMD);
121                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
122                final String updSql = "UPDATE GE66 SET FGKAN = ?, DYUPD = ?, USRUPD = ?, PGUPD = ?"
123                                + "WHERE SYSTEM_ID = ? AND FGJ = '1' AND YKNO = ?";
124                DBUtil.dbExecute(updSql, new String[] {
125                                fgkan, dyset, USRSET, PGUPD, SYSTEM_ID, ykno}, appInfo, DBID);
126        }
127        /**
128         * 受信管理データ取得
129         * 受信管理テーブルから、キューIDとbizlogic名を取得します。
130         * 
131         * @return 受信管理リスト
132         */
133        public String[][] setlectGE67() {
134                // 対象 キュー名(グループ名)とbizlogic名の取得処理
135                final String sql = "SELECT QUEUEID, BIZLOGICID FROM GE67"
136                                + " WHERE SYSTEM_ID = ? AND FGJ = '1'";
137                final String[][] vals = DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
138                return vals;
139        }
140
141        /**
142         * 処理番号生成
143         * GE68_SEQUENCEからシーケンス番号を生成します。
144         * 
145         * @og.rev 7.0.6.4 (2019/11/29) TransactionRealのclose漏れ対応
146         * 
147         * @return 処理番号
148         */
149        public String generateSyoriNo() {
150                String syoriNo = "";
151                
152//              final Transaction tran = new TransactionReal( appInfo );
153
154                // 処理番号生成
155                try( final Transaction tran = new TransactionReal( appInfo ) ) {                                // 7.0.6.4 (2019/11/29) try-with-resources文
156//              try {
157                        final DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( DBID ) );
158                        syoriNo = Integer.toString(dbName.getSequence("GE68S01", tran, DBID));
159//              }finally {
160//                      tran.close();
161                }
162                
163                return syoriNo;
164        }
165        
166        /**
167         * GE68(キュー受信結果テーブル)更新
168         * キュー受信結果テーブルを指定された完了状態に更新します。
169         * 
170         * @param syno 処理番号
171         * @param fgkan 完了フラグ
172         */
173        public void updateGE68(final String syno,  final String fgkan) {
174//              final String dyset = HybsSystem.getDate(DYSET_YMD);
175                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
176
177                final String sql = "UPDATE GE68 SET FGKAN = ?, DYUPD = ?, USRUPD = ?, PGUPD = ?"
178                                + "WHERE FGJ = '1'"
179                                + " AND SYSTEM_ID = ?"
180                                + " AND SYNO = ?";
181                
182                final String[] data = new String[] {fgkan, dyset, USRSET, PGUPD, SYSTEM_ID, syno};
183                
184                // sql実行
185                DBUtil.dbExecute(sql, data, appInfo, DBID);
186        }
187        
188        /**
189         *  GE68(キュー受信結果テーブル)登録
190         * キュー受信結果テーブルに受信データを登録します。 
191         * 
192         * @param queueNm キュー名
193         * @param syno 処理NO
194         * @param bizlogicId ビズロジックID
195         * @param messageText メッセージ
196         */
197        public void insertGE68(final String queueNm, final String syno, final String bizlogicId
198                        ,final String messageText) {
199//              final String dyset = HybsSystem.getDate(DYSET_YMD);
200                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
201
202                final String sql = "INSERT INTO GE68(SYSTEM_ID, QUEUEID, SYNO, BIZLOGICID, MESSAGE, FGKAN, FGJ,"
203                                + "DYSET, DYUPD, USRSET, USRUPD, PGSET,  PGUPD)" 
204                                + " VALUES(?,?,?,?,?,?,'1'"
205                                + ",?,?,?,?,?,?)";
206                
207                final String[] data = new String[] {
208                                SYSTEM_ID, queueNm, syno, bizlogicId, messageText, DBAccessQueue.FGKAN_PROCESS
209                                ,dyset, dyset, USRSET,  USRSET, PGUPD, PGUPD
210                };
211                
212                // sql実行
213                DBUtil.dbExecute(sql,  data, appInfo, DBID);
214        }
215        
216        /**
217         * GE68(キュー受信結果テーブル)エラー更新
218         * キュー受信結果テーブルをエラー状態に更新します。
219         * 
220         * @param syoriNo 処理NO
221         * @param errMsg エラーメッセージ
222         */
223        public void updateGE68Error(final String syoriNo, final String errMsg) {
224                // エラーテーブルに登録
225//              final String dyset = HybsSystem.getDate(DYSET_YMD);
226                final String dyset = DateSet.getDate(DYSET_YMD);                        // 7.0.6.0 (2019/10/07)
227
228                final String sql = "UPDATE GE68"
229                                + " SET ERRMSG = ?, FGKAN = ?"
230                                + " ,DYUPD = ?, USRUPD = ?, PGUPD = ?"
231                                + " WHERE SYSTEM_ID = ? AND FGJ = '1' AND SYNO = ? ";
232
233                final String[] data = new String[] {
234                                  errMsg                                                        // エラーメッセージ
235                                , DBAccessQueue.FGKAN_ERROR
236                                , dyset
237                                , USRSET
238                                , PGUPD
239                                , SYSTEM_ID
240                                , syoriNo
241                };
242
243                // sql実行
244                DBUtil.dbExecute(sql, data, appInfo, DBID);
245        }
246}