/* Processed by ecpg (15.18 (Debian 15.18-0+deb12u1)) */ /* These include files are added by the preprocessor */ #include #include #include /* End of automatic include section */ #line 1 "app/batch/cm_bt_0009.pgc" /* @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" #line 1 "/usr/include/postgresql/sqlca.h" #ifndef POSTGRES_SQLCA_H #define POSTGRES_SQLCA_H #ifndef PGDLLIMPORT #if defined(WIN32) || defined(__CYGWIN__) #define PGDLLIMPORT __declspec (dllimport) #else #define PGDLLIMPORT #endif /* __CYGWIN__ */ #endif /* PGDLLIMPORT */ #define SQLERRMC_LEN 150 #ifdef __cplusplus extern "C" { #endif struct sqlca_t { char sqlcaid[8]; long sqlabc; long sqlcode; struct { int sqlerrml; char sqlerrmc[SQLERRMC_LEN]; } sqlerrm; char sqlerrp[8]; long sqlerrd[6]; /* Element 0: empty */ /* 1: OID of processed tuple if applicable */ /* 2: number of rows processed */ /* after an INSERT, UPDATE or */ /* DELETE statement */ /* 3: empty */ /* 4: empty */ /* 5: empty */ char sqlwarn[8]; /* Element 0: set to 'W' if at least one other is 'W' */ /* 1: if 'W' at least one character string */ /* value was truncated when it was */ /* stored into a host variable. */ /* * 2: if 'W' a (hopefully) non-fatal notice occurred */ /* 3: empty */ /* 4: empty */ /* 5: empty */ /* 6: empty */ /* 7: empty */ char sqlstate[5]; }; struct sqlca_t *ECPGget_sqlca(void); #ifndef POSTGRES_ECPG_INTERNAL #define sqlca (*ECPGget_sqlca()) #endif #ifdef __cplusplus } #endif #endif #line 20 "app/batch/cm_bt_0009.pgc" 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 */ #line 36 "app/batch/cm_bt_0009.pgc" char h_biz_date [ 9 ] ; #line 37 "app/batch/cm_bt_0009.pgc" char h_ccy [ 4 ] ; #line 38 "app/batch/cm_bt_0009.pgc" long h_rate ; /* exec sql end declare section */ #line 39 "app/batch/cm_bt_0009.pgc" 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; { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into cm_rate ( biz_date , ccy_cd , rate_x100 ) values ( $1 , $2 , $3 )", ECPGt_char,(h_biz_date),(long)9,(long)1,(9)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_char,(h_ccy),(long)4,(long)1,(4)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_long,&(h_rate),(long)1,(long)1,sizeof(long), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);} #line 69 "app/batch/cm_bt_0009.pgc" 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; }