/*
 * mm_codemap_gc_batch.pgc - 비활성 코드 매핑 정리(GC) 배치 (집합 DELETE 2단 + XA).
 *
 * (1) MAP_* 네임스페이스의 INACTIVE 매핑 행을 즉시 삭제하고,
 * (2) MERCH_REL 관계의 INACTIVE 행은 보존일수 경과분만 삭제한다.
 * 커서 없이 집합 DELETE 두 번으로 처리, 삭제 건수는 sqlca.sqlerrd 로 집계.
 * 전 구간 ONE global XA transaction.
 * host 변수는 전용 카피북 mm_codemap_gc_cpy.h 를 EXEC SQL INCLUDE.
 * Usage: mm_codemap_gc_batch [REL_KEEP_DAYS=90]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>

int main(int argc, char **argv)
{
    long map_gone, rel_gone;

    EXEC SQL INCLUDE mm_codemap_gc_cpy;

    b_days = (argc > 1) ? atol(argv[1]) : 90;
    if (b_days < 1) b_days = 90;

    if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
    if (tpopen() < 0)     { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
    if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }

    EXEC SQL DELETE FROM mm_code
        WHERE substr(code_group, 1, 4) = 'MAP_' AND status = 'INACTIVE';
    if (sqlca.sqlcode < 0) { fprintf(stderr, "DELETE(MAP) FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    map_gone = sqlca.sqlerrd[2];

    EXEC SQL DELETE FROM mm_code
        WHERE code_group = 'MERCH_REL' AND status = 'INACTIVE'
          AND created_at < now() - :b_days * interval '1 day';
    if (sqlca.sqlcode < 0) { fprintf(stderr, "DELETE(REL) FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    rel_gone = sqlca.sqlerrd[2];

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> mm_codemap_gc_batch COMMIT: 매핑 삭제=%ld건 관계 삭제=%ld건 (보존 %ld일)\n",
           map_gone, rel_gone, b_days);

    tpclose(); tpterm();
    return 0;
}
