/* @tier medium @module cm @transform common-batch */ /* * cm_bt_0009.pgc - 환율 일괄 적재 배치 [tier=medium] * * 지정일(argv1)의 기준 환율 세트를 통화 배열을 순회하며 통화별로 * cm_rate 에 raw INSERT(반복)한다. 유효하지 않은 환율은 건너뛰고, * 적재된 통화 수를 리포트한다. 배치 main 엔트리 포함. * * 실행: cm_bt_0009 [db@host] */ #include #include #include #include "txcore.h" #include "txcore_dbio.h" #include "acq_util.h" #include "cm_core.h" EXEC SQL INCLUDE sqlca; typedef struct { const char *ccy; /* 통화코드 */ long rate_x100; /* 원/통화 환율 x100 (소수2자리) */ } cm_rate_seed_t; /* 환율(원/통화 x100) 유효성: 양수이며 상한 이내 */ static int cm_rate_is_valid(long rate_x100) { return (rate_x100 > 0 && rate_x100 < 100000000L) ? 1 : 0; } static int run_cm_bt_0009(const char *biz_date) { EXEC SQL BEGIN DECLARE SECTION; char h_biz_date[9]; char h_ccy[4]; long h_rate; EXEC SQL END DECLARE SECTION; static const cm_rate_seed_t seeds[] = { { "USD", 138550L }, { "EUR", 150200L }, { "JPY", 920L }, { "CNY", 19180L }, { "GBP", 176300L }, { "HKD", 17720L }, }; int nseed = (int)(sizeof(seeds) / sizeof(seeds[0])); long loaded = 0, skipped = 0, errcnt = 0; int i; strncpy(h_biz_date, biz_date, sizeof(h_biz_date) - 1); h_biz_date[sizeof(h_biz_date) - 1] = '\0'; if (tx_begin() != TX_OK) tx_log(TX_LOG_WARN, "[cm_bt_0009] tx_begin 경고"); for (i = 0; i < nseed; i++) { if (!cm_rate_is_valid(seeds[i].rate_x100)) { skipped++; continue; } strncpy(h_ccy, seeds[i].ccy, sizeof(h_ccy) - 1); h_ccy[sizeof(h_ccy) - 1] = '\0'; h_rate = seeds[i].rate_x100; EXEC SQL INSERT INTO cm_rate (biz_date, ccy_cd, rate_x100) VALUES (:h_biz_date, :h_ccy, :h_rate); if (sqlca.sqlcode != TX_SQL_OK) { TX_DBIO_LOG_ERR("INSERT cm_rate"); errcnt++; continue; } loaded++; tx_log(TX_LOG_DEBUG, "[cm_bt_0009] 환율적재 ccy=%s rate=%ld.%02ld", h_ccy, h_rate / 100, h_rate % 100); } if (errcnt == 0) tx_commit(); else tx_abort(); tx_log(TX_LOG_INFO, "[cm_bt_0009] 환율적재 date=%s 적재=%ld 스킵=%ld 오류=%ld", biz_date, loaded, skipped, errcnt); printf("========== 환율 일괄 적재 [cm_bt_0009] ==========\n"); printf(" 기준 일자 : %s\n", biz_date); printf(" 대상 통화 : %d\n", nseed); printf(" 적재 통화 : %ld\n", loaded); printf(" 스킵(무효) : %ld\n", skipped); printf(" 적재 오류 : %ld\n", errcnt); printf("=============================================\n"); return (errcnt == 0) ? TX_OK : TX_FAIL; } int main(int argc, char **argv) { const char *biz_date; const char *target; int rc; tx_set_loglevel(TX_LOG_INFO); if (argc < 2) { fprintf(stderr, "사용법: %s [db@host]\n", argv[0]); return 2; } biz_date = argv[1]; target = (argc >= 3) ? argv[2] : NULL; if (!date_is_valid(biz_date)) { fprintf(stderr, "오류: 유효하지 않은 영업일 '%s'\n", biz_date); return 2; } tx_log(TX_LOG_INFO, "[cm_bt_0009] 환율적재 배치 시작 date=%s", biz_date); rc = cm_dbio_connect(target); if (rc != TX_OK) { tx_log(TX_LOG_ERROR, "[cm_bt_0009] DB 접속 실패 rc=%d", rc); return 1; } rc = run_cm_bt_0009(biz_date); cm_dbio_disconnect(); tx_log(TX_LOG_INFO, "[cm_bt_0009] 배치 종료 rc=%d(%s)", rc, tx_strerror(rc)); return (rc == TX_OK) ? 0 : 1; }