작성 예제

본 장에서는 ProSort가 제공하는 API를 이용하여 C 프로그램을 작성한 예를 기술한다.

1. SORT 연산

#include <stdio.h>
#include <stdlib.h>
#include "prosort.h"

static void print_err_msg(int ec)
{
    fprintf(stderr,"Error[%d]:\n", ec);
    fprintf(stderr,"%s\n", ps_err_code_to_cause(ec));
    fprintf(stderr,"%s\n", ps_err_code_to_action(ec));
    fprintf(stderr,"%s\n", ps_err_get_last_msg());
}

/* 16byte record */
#define REC_LEN 16

#define RAND (char) (rand() % 24) + 'A'
int main(int argc, char **argv)
{
    int   i      = 0;
    int   j      = 0;
    int   rc     = 0;

    void *ps_ctx;

    char buf[REC_LEN];
    const char *script = "MEMORY 100M\n"
                         "DATASIZE 100M\n"
                         "DEFREC FIXED, SIZE=16\n"
                         "SORT FIELDS = (1,8,CH,A)\n";

    /* 스크립트 설정 */
    rc = prosort_setup (script, NULL, 0, &ps_ctx);

    if (rc < 0) {
        print_err_msg (rc);
        exit (rc);
    }

    /* 레코드 입력 */
    for (i = 0; i < 100; i++) {

        for (j = 0; j < REC_LEN - 1; j++)
            buf[j] = RAND;
        buf[j] = 0;

        rc = prosort_release_record (ps_ctx, buf, REC_LEN);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
    }
    /* 레코드 입력 완료 */
    prosort_release_end (ps_ctx);

    do {
        char outbuf[REC_LEN];
        char *outbufs[1];
        unsigned int len = REC_LEN;

        outbufs[0] = outbuf;

        rc = prosort_return_record (ps_ctx, outbufs, &len);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
        if (len == 0)
            break;
        printf ("%s\n", outbuf);

    } while (1);

    prosort_end (ps_ctx);
    return 0;
}

2. COPY 연산

#include <stdio.h>
#include <stdlib.h>
#include "prosort.h"

static void print_err_msg(int ec)
{
    fprintf(stderr,"Error[%d]:\n", ec);
    fprintf(stderr,"%s\n", ps_err_code_to_cause(ec));
    fprintf(stderr,"%s\n", ps_err_code_to_action(ec));
    fprintf(stderr,"%s\n", ps_err_get_last_msg());
}

/* 16byte 레코드 */
#define REC_LEN 16

#define RAND (char) (rand() % 24) + 'A'

static int total_record = 0;
static char buf[16];

/* 레코드 입력 callback function */
int copy_source_func (char **record, int *len)
{
    int j;
    if (total_record >= 100) {
        /* 종료 */
        return 0;
    }
    total_record++;
    for (j = 0; j < 15; j++)
        buf[j] = RAND;
    buf[j] = 0;

    *record = buf;
    *len = REC_LEN;
    return 1;
}

int main(int argc, char **argv)
{
    int   i      = 0;
    int   j      = 0;
    int   rc     = 0;

    void *ps_ctx;

    int (*source[1])(char **, int *);

    /* function의 배열을 setup에 입력한다 */
    source[0] = copy_source_func;

    char buf[REC_LEN];
    const char *script = "MEMORY 100M\n"
                         "DATASIZE 100M\n"
                         "DEFREC FIXED, SIZE=16\n"
                         "SORT FIELDS = (COPY)\n";

    /* 스크립트 설정 */
    rc = prosort_setup (script, source, 1, &ps_ctx);

    if (rc < 0) {
        print_err_msg (rc);
        exit (rc);
    }

    do {
        char outbuf[REC_LEN];
        char *outbufs[1];
        unsigned int len = REC_LEN;

        outbufs[0] = outbuf;

        rc = prosort_return_record (ps_ctx, outbufs, &len);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
        if (len == 0)
            break;
        printf ("%s\n", outbuf);

    } while (1);

    prosort_end (ps_ctx);
    return 0;
}

3. MERGE 연산

#include <stdio.h>
#include <stdlib.h>
#include "prosort.h"

static void print_err_msg(int ec)
{
    fprintf(stderr,"Error[%d]:\n", ec);
    fprintf(stderr,"%s\n", ps_err_code_to_cause(ec));
    fprintf(stderr,"%s\n", ps_err_code_to_action(ec));
    fprintf(stderr,"%s\n", ps_err_get_last_msg());
}

/* 16byte 레코드 */
#define REC_LEN 16

#define RAND (char) (rand() % 24) + 'A'

static int total_record1 = 0;
static char buf1[16];

/* 레코드 입력 callback function */
int merge_source_func1 (char **record, int *len)
{
    int j;
    if (total_record1 >= 100) {
        /* 종료 */
        return 0;
    }
    total_record1++;
    for (j = 0; j < 15; j++)
        buf1[j] = RAND;
    buf1[j] = 0;

    *record = buf1;
    *len = REC_LEN;
    return 1;
}

static int total_record2 = 0;
static char buf2[16];

/* 레코드 입력 callback function */
int merge_source_func2 (char **record, int *len)
{
    int j;
    if (total_record2 >= 100) {
        /* 종료 */
        return 0;
    }
    total_record2++;
    for (j = 0; j < 15; j++)
        buf2[j] = RAND;
    buf2[j] = 0;

    *record = buf2;
    *len = REC_LEN;
    return 1;
}

int main(int argc, char **argv)
{
    int   i      = 0;
    int   j      = 0;
    int   rc     = 0;

    void *ps_ctx;

    int (*source[2])(char **, int *);

    /* function의 배열을 setup에 입력한다 */
    source[0] = merge_source_func1;
    source[1] = merge_source_func2;

    char buf[REC_LEN];
    const char *script = "MEMORY 100M\n"
                         "DATASIZE 100M\n"
                         "DEFREC FIXED, SIZE=16\n"
                         "MERGE FIELDS = (1,16,CH,A)\n";

    /* 스크립트 설정 */
    rc = prosort_setup (script, source, 2, &ps_ctx);

    if (rc < 0) {
        print_err_msg (rc);
        exit (rc);
    }

    do {
        char outbuf[REC_LEN];
        char *outbufs[1];
        unsigned int len = REC_LEN;

        outbufs[0] = outbuf;

        rc = prosort_return_record (ps_ctx, outbufs, &len);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
        if (len == 0)
            break;
        printf ("%s\n", outbuf);

    } while (1);

    prosort_end (ps_ctx);
    return 0;
}

4. OUTFIL 연산

include <stdio.h>
#include <stdlib.h>
#include "prosort.h"

static void
print_err_msg(int ec)
{
    fprintf(stderr,"Error[%d]:\n", ec);
    fprintf(stderr,"%s\n", ps_err_code_to_cause(ec));
    fprintf(stderr,"%s\n", ps_err_code_to_action(ec));
    fprintf(stderr,"%s\n", ps_err_get_last_msg());
}

/* 16byte 레코드 */
#define REC_LEN 16

#define RAND (char) (rand() % 24) + 'A'
int main(int argc, char **argv)
{
    int   i      = 0;
    int   j      = 0;
    int   rc     = 0;

    void *ps_ctx;

    char buf[REC_LEN];
    const char *script = "MEMORY 100M\n"
                         "DATASIZE 100M\n"
                         "DEFREC FIXED, SIZE=16\n"
                         "SORT FIELDS = (1,8,CH,A)\n"
                         "OUTFIL FNAMES = (a), OUTREC=(1,8)\n";

    /* 스크립트 설정 */
    rc = prosort_setup (script, NULL, 0, &ps_ctx);

    if (rc < 0) {
        print_err_msg (rc);
        exit (rc);
    }

    /* 레코드 입력 */
    for (i = 0; i < 100; i++) {

        for (j = 0; j < REC_LEN - 1; j++)
            buf[j] = RAND;
        buf[j] = 0;

        rc = prosort_release_record (ps_ctx, buf, REC_LEN);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
    }
    /* 레코드 입력 완료 */
    prosort_release_end (ps_ctx);

    do {
        char outbuf0[REC_LEN];
        char outbuf1[REC_LEN];
        char *outbufs[2];
        unsigned int len[2];

        outbufs[0] = outbuf0;
        outbufs[1] = outbuf1;

        len[0] = REC_LEN;
        len[1] = REC_LEN;
        rc = prosort_return_record (ps_ctx, outbufs, len);
        if (rc < 0) {
            print_err_msg (rc);
            exit (rc);
        }
        if (len[0] == 0 && len[1] == 0)
            break;
        printf ("%s\n", outbuf0);
        printf ("%s\n", outbuf1);

    } while (1);

    prosort_end (ps_ctx);
    return 0;
}

5. prosort_run_script

#include <stdio.h>
#include <stdlib.h>
#include "prosort.h"

int main(int argc, char **argv)
{
    int rc;
    char *script =
        "DEFREC FIXED,SIZE=256 "
        "MEMORY 500M "
        "INFILE = (x1,100M, x2, 100M, x3, 100M, x4, 100M) "
        "SORT FIELDS=(1,13,AC,A) "
        "OUTFIL FNAMES = xresult ";
    rc = prosort_run_script (script);
    if (rc < 0) {
        fprintf(stderr,"Error[%d]:\n", rc);
        fprintf(stderr,"%s\n", ps_err_code_to_cause(rc));
        fprintf(stderr,"%s\n", ps_err_code_to_action(rc));

        exit (rc);
    }

    return 0;
}