001package org.opengion.hayabusa.queue;
002
003import org.apache.commons.lang3.StringUtils;
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;
009import org.opengion.fukurou.util.ApplicationInfo;
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         * @param systemid システムID
053         * @param usrset ユーザID
054         * @param prpupd プログラムID
055         * @param dmnName デーモン名
056         */
057        public DBAccessQueue(final String systemid, final String usrset, final String prpupd, final String dmnName) {
058                SYSTEM_ID = systemid;
059                USRSET = StringUtils.defaultString(usrset, "UNNONE") ;
060                PGUPD  = StringUtils.defaultString( prpupd, "UNNONE" ) ;
061                DMN_NAME = StringUtils.defaultString( dmnName, "UNNONE" ) ;
062                
063                if (USE_DB_APPLICATION_INFO) {
064                        appInfo = new ApplicationInfo();
065                        
066                        // ユーザーID,IPアドレス,ホスト名
067                        appInfo.setClientInfo(USRSET, HybsSystem.HOST_ADRS, HybsSystem.HOST_NAME);
068                        // 画面ID,操作,プログラムID
069                        appInfo.setModuleInfo("DBAccessQueue", null, DMN_NAME);
070                }
071                else {
072                        appInfo = null;
073                }
074        }
075
076        /**
077         * GE65検索
078         * GE65の処理対象リストを取得します。
079         * 
080         * @return 処理対象リスト
081         */
082        public String[][] selectGE65() {
083                String sql = "SELECT A.YKNO, A.QUEUEID, A.MESSAGE, A.SFDUPID, B.QUESYU, B.JMSURL FROM GE66 A"
084                                + " INNER JOIN GE65 B ON A.SYSTEM_ID = B.SYSTEM_ID AND A.QUEUEID = B.QUEUEID AND B.FGJ = '1'"
085                                + " WHERE A.SYSTEM_ID = ? AND A.FGKAN = '1' AND A.FGJ = '1'";
086                
087                String[][] vals = DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
088                return vals;
089        }
090        
091        /**
092         * エラー状態に更新
093         * 完了フラグをエラー状態に更新して、
094         * エラー情報を格納します。
095         * 
096         * @param ykno 要求番号
097         * @param errMsg エラーメッセージ
098         */
099        public void updateGE66Error(String ykno, String errMsg) {
100                String updSql = "UPDATE GE66 SET FGKAN = ?, ERRMSG = ?"
101                                + "WHERE SYSTEM_ID = ? AND FGJ = '1' AND YKNO = ?";
102                DBUtil.dbExecute(updSql, new String[] {
103                                FGKAN_ERROR, errMsg, SYSTEM_ID, ykno
104                }, appInfo, DBID);
105        }
106        
107        /**
108         * 完了フラグの更新
109         * 完了フラグを指定された値に更新します。
110         * 
111         * @param ykno 要求番号
112         * @param fgkan 完了フラグ
113         */
114        public void updateGE66(String ykno, String fgkan) {
115                final String dyset = HybsSystem.getDate(DYSET_YMD);
116                String updSql = "UPDATE GE66 SET FGKAN = ?, DYUPD = ?, USRUPD = ?, PGUPD = ?"
117                                + "WHERE SYSTEM_ID = ? AND FGJ = '1' AND YKNO = ?";
118                DBUtil.dbExecute(updSql, new String[] {
119                                fgkan, dyset, USRSET, PGUPD, SYSTEM_ID, ykno}, appInfo, DBID);
120        }
121        /**
122         * 受信管理データ取得
123         * 受信管理テーブルから、キューIDとbizlogic名を取得します。
124         * 
125         * @return 受信管理リスト
126         */
127        public String[][] setlectGE67() {
128                // 対象 キュー名(グループ名)とbizlogic名の取得処理
129                final String sql = "SELECT QUEUEID, BIZLOGICID FROM GE67"
130                                + " WHERE SYSTEM_ID = ? AND FGJ = '1'";
131                final String[][] vals = DBUtil.dbExecute(sql, new String[] {SYSTEM_ID}, appInfo, DBID);
132                return vals;
133        }
134
135        /**
136         * 処理番号生成
137         * GE68_SEQUENCEからシーケンス番号を生成します。
138         * 
139         * @return 処理番号
140         */
141        public String generateSyoriNo() {
142                String syoriNo = "";
143                
144                Transaction tran = new TransactionReal( appInfo );
145                
146                // 処理番号生成
147                try {
148                        DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( DBID ) );
149                        syoriNo = Integer.toString(dbName.getSequence("GE68S01", tran, DBID));
150                }finally {
151                        tran.close();
152                }
153                
154                return syoriNo;
155        }
156        
157        /**
158         * GE68(キュー受信結果テーブル)更新
159         * キュー受信結果テーブルを指定された完了状態に更新します。
160         * 
161         * @param syno 処理番号
162         * @param fgkan 完了フラグ
163         */
164        public void updateGE68(final String syno,  final String fgkan) {
165                final String dyset = HybsSystem.getDate(DYSET_YMD);
166                
167                final String sql = "UPDATE GE68 SET FGKAN = ?, DYUPD = ?, USRUPD = ?, PGUPD = ?"
168                                + "WHERE FGJ = '1'"
169                                + " AND SYSTEM_ID = ?"
170                                + " AND SYNO = ?";
171                
172                String[] data = new String[] {fgkan, dyset, USRSET, PGUPD, SYSTEM_ID, syno};
173                
174                // sql実行
175                DBUtil.dbExecute(sql, data, appInfo, DBID);
176        }
177        
178        /**
179         *  GE68(キュー受信結果テーブル)登録
180         * キュー受信結果テーブルに受信データを登録します。 
181         * 
182         * @param queueNm キュー名
183         * @param syno 処理NO
184         * @param bizlogicId bizLogicId
185         * @param messageText メッセージ
186         */
187        public void insertGE68(final String queueNm, final String syno, final String bizlogicId
188                        ,final String messageText) {
189                final String dyset = HybsSystem.getDate(DYSET_YMD);
190                final String sql = "INSERT INTO GE68(SYSTEM_ID, QUEUEID, SYNO, BIZLOGICID, MESSAGE, FGKAN, FGJ,"
191                                + "DYSET, DYUPD, USRSET, USRUPD, PGSET,  PGUPD)" 
192                                + " VALUES(?,?,?,?,?,?,'1'"
193                                + ",?,?,?,?,?,?)";
194                
195                final String[] data = new String[] {
196                                SYSTEM_ID, queueNm, syno, bizlogicId, messageText, DBAccessQueue.FGKAN_PROCESS
197                                ,dyset, dyset, USRSET,  USRSET, PGUPD, PGUPD
198                };
199                
200                // sql実行
201                DBUtil.dbExecute(sql,  data, appInfo, DBID);
202        }
203        
204        /**
205         * GE68(キュー受信結果テーブル)エラー更新
206         * キュー受信結果テーブルをエラー状態に更新します。
207         * 
208         * @param syoriNo 処理NO
209         * @param errMsg エラーメッセージ
210         */
211        public void updateGE68Error(String syoriNo, final String errMsg) {
212                // エラーテーブルに登録
213                final String ymd = HybsSystem.getDate(DYSET_YMD);
214                final String sql = "UPDATE GE68"
215                                + " SET ERRMSG = ?, FGKAN = ?"
216                                + " ,DYUPD = ?, USRUPD = ?, PGUPD = ?"
217                                + " WHERE SYSTEM_ID = ? AND FGJ = '1' AND SYNO = ? ";
218
219                final String[] data = new String[] { errMsg // エラーメッセージ
220                                ,DBAccessQueue.FGKAN_ERROR
221                                ,ymd
222                                ,USRSET
223                                ,PGUPD
224                                ,SYSTEM_ID
225                                , syoriNo
226                };
227
228                // sql実行
229                DBUtil.dbExecute(sql, data, appInfo, DBID);
230        }
231}