작성 예제
본 장에서는 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;
}