/* @tier hard @module au @transform authorization-online */ /* * au_ol_0009.pgc - 대행승인 fallback(주센터 실패시 백업) (AU_OL_0009) [tier=hard] * * 주센터(au_center) 가동상태를 임베디드 SQL 로 확인해 정상이면 주센터 * (AU_ISSUER)로, 장애면 곧바로 대행센터(AU_STANDIN)로 tx_call 한다. * 주센터 tx_call 이 실패해도 대행센터로 전환하며, 대행 처리분은 * 대행승인 이력(au_standin_log)에 기록한다. */ #include #include #include "txcore.h" #include "txcore_dbio.h" #include "acq_util.h" #include "au_core.h" EXEC SQL INCLUDE sqlca; TX_SERVICE(AU_OL_0009, ctx) { EXEC SQL BEGIN DECLARE SECTION; char h_center_id[8]; char h_center_status[2]; char h_key[16]; long h_amount; EXEC SQL END DECLARE SECTION; TXBUF *req; char key[16]; long amount = 0; int rc, standin = 0, primary_down; tx_log(TX_LOG_INFO, "[AU_OL_0009] 대행승인 fallback 진입"); if (tx_buf_get(ctx->in, "KEY", key, sizeof(key)) != TX_OK) { tx_log(TX_LOG_ERROR, "[AU_OL_0009] KEY 누락"); tx_return(ctx, TX_EINVAL, ctx->out); return; } tx_buf_getlong(ctx->in, "AMOUNT", &amount); strncpy(h_key, key, sizeof(h_key) - 1); h_key[sizeof(h_key) - 1] = '\0'; h_amount = amount; /* 주센터 가동상태 조회 (center_id='PRIMARY') */ strcpy(h_center_id, "PRIMARY"); strcpy(h_center_status, "U"); EXEC SQL SELECT center_status INTO :h_center_status FROM au_center WHERE center_id = :h_center_id; if (sqlca.sqlcode != TX_SQL_OK && sqlca.sqlcode != TX_SQL_NOTFOUND) { TX_DBIO_LOG_ERR("SELECT au_center"); tx_return(ctx, TX_EDB, ctx->out); return; } /* 상태 'U'(Up)=정상, 그 외는 장애로 간주 */ primary_down = (strncmp(h_center_status, "U", 1) != 0); req = tx_buf_alloc(); if (!req) { tx_return(ctx, TX_ENOMEM, ctx->out); return; } tx_buf_sets(req, "KEY", key); tx_buf_setlong(req, "AMOUNT", amount); if (!primary_down) { rc = tx_call("AU_ISSUER", req, ctx->out); if (rc != TX_OK) { tx_log(TX_LOG_WARN, "[AU_OL_0009] 주센터 응답실패 rc=%d, 대행 전환", rc); primary_down = 1; } } else { rc = TX_FAIL; tx_log(TX_LOG_WARN, "[AU_OL_0009] 주센터 장애(status=%s), 대행 전환", h_center_status); } if (primary_down) { tx_buf_reset(ctx->out); rc = tx_call("AU_STANDIN", req, ctx->out); standin = (rc == TX_OK); } tx_buf_free(req); if (rc != TX_OK) { tx_log(TX_LOG_ERROR, "[AU_OL_0009] 대행승인까지 실패 rc=%d", rc); tx_buf_sets(ctx->out, "RESPCODE", RESP_SYSERR); tx_return(ctx, rc, ctx->out); return; } tx_buf_sets(ctx->out, "STANDIN", standin ? "Y" : "N"); /* 대행 처리분은 이력에 기록 */ if (standin) { if (tx_begin() != TX_OK) tx_log(TX_LOG_WARN, "[AU_OL_0009] tx_begin 경고"); EXEC SQL INSERT INTO au_standin_log (req_key, req_amount, center_status) VALUES (:h_key, :h_amount, :h_center_status); if (sqlca.sqlcode != TX_SQL_OK) { TX_DBIO_LOG_ERR("INSERT au_standin_log"); tx_abort(); } else { tx_commit(); } } tx_log(TX_LOG_INFO, "[AU_OL_0009] fallback 처리완료 key=%s standin=%s", key, standin ? "Y" : "N"); tx_return(ctx, TX_OK, ctx->out); }