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