이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다토토 사이트 : 문서 : 17 : 33.5. 예제 프로그램버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

30.5. 예제 배트맨 토토

예 30-1is 큰 객체 인터페이스가 어떻게를 보여주는 샘플 배트맨 토토libpq사용할 수 있습니다. 의 일부 배트맨 토토은 주석을 달 수 있지만 독자의 이점. 이 배트맨 토토은에서도 찾을 수 있습니다.src/test/examples/testlo.c소스에서 분포.

예 30-1. 큰 물체libpq예제 배트맨 토토

/*---------------------------------------------------------------------
 *
 * testlo.c--
 * LIBPQ로 큰 물체를 사용하여 테스트하십시오
 *
 * 저작권 (C) 1994, 캘리포니아 대학교 리전트
 *
 *------------------------------------------------------------------------
 */
#include <stdio.h
#include "libpq-fe.h"
#include "libpq/libpq-fs.h"

#define bufsize 1024

/*
 * importFile
 * "in_fileName"파일 가져 오기 "loBjoid"로 큰 개체로 데이터베이스로 가져옵니다.
 *
 */
OID
importfile (pgconn *conn, char *filename)

    Oid lobjid;
    int lobj_fd;
    char buf [bufsize];
    int nbytes,
                TMP;
    int fd;

    /*
     * 읽을 파일을 엽니 다
     */
    fd = Open (filename, o_rdonly, 0666);
    if (fd <0)
     / * 오류 * /
        fprintf (stderr, "Unix 파일을 열 수 없습니다. %s \ n", filename);

    /*
     * 큰 물체를 만듭니다
     */
    lobjid = lo_creat (conn, inv_read | inv_write);
    if (lobjid == 0)
        fprintf (stderr, "큰 객체를 만들 수 없습니다 \ n");

    lobj_fd = lo_open (conn, lobjid, inv_write);

    /*
     * Unix 파일에서 읽고 반전 파일에 쓰기
     */
    while ((nbytes = read (fd, buf, bufsize)) 0)

        tmp = lo_write (conn, lobj_fd, buf, nbytes);
        if (tmp <nbytes)
            fprintf (stderr, "큰 객체를 읽는 동안 오류 \ n");

    (void) 닫기 (fd);
    (void) lo_close (conn, lobj_fd);

    리턴 로지드;

무효의
Pickout (PGCONN *CONN, OID LOBJID, Int Start, Int Len)

    int lobj_fd;
    char *buf;
    int nbytes;
    int nread;

    lobj_fd = lo_open (conn, lobjid, inv_read);
    if (lobj_fd <0)

        fprintf (stderr, "큰 물체 %d \ n을 열 수 없습니다",
                lobjid);

    lo_lseek (conn, lobj_fd, start, seek_set);
    buf = malloc (len + 1);

    nread = 0;
    while (len -nread 0)

        nbytes = lo_read (conn, lobj_fd, buf, len -nread);
        buf [nbytes] = '';
        fprintf (stderr, " %s", buf);
        nread += nbytes;

    무료 (buf);
    fprintf (stderr, "\ n");
    lo_close (Conn, lobj_fd);

무효의
덮어 쓰기 (pgconn *conn, oid lobjid, int start, int len)

    int lobj_fd;
    char *buf;
    int nbytes;
    int nwritten;
    int i;

    lobj_fd = lo_open (conn, lobjid, inv_write);
    if (lobj_fd <0)

        fprintf (stderr, "큰 물체 %d \ n을 열 수 없습니다",
                lobjid);

    lo_lseek (conn, lobj_fd, start, seek_set);
    buf = malloc (len + 1);

    for (i = 0; i <len; i ++)
        buf [i] = 'x';
    buf [i] = '';

    nwrretten = 0;
    while (len -nwritten 0)

        nbytes = lo_write (conn, lobj_fd, buf + nwritten, len -nwritten);
        nwrretten += nbytes;

    무료 (buf);
    fprintf (stderr, "\ n");
    lo_close (Conn, lobj_fd);

/*
 * ExportFile
 * "out_filename"을 제출하려면 큰 개체 "lobjoid"를 내보내십시오.
 *
 */
무효의
ExportFile (PGCONN *CONN, OID LOBJID, Char *Filename)

    int lobj_fd;
    char buf [bufsize];
    int nbytes,
                TMP;
    int fd;

    /*
     * 큰 물체를 엽니 다
     */
    lobj_fd = lo_open (conn, lobjid, inv_read);
    if (lobj_fd <0)

        fprintf (stderr, "큰 물체 %d \ n을 열 수 없습니다",
                lobjid);

    /*
     * 작성할 파일을 엽니 다
     */
    fd = Open (filename, o_creat | o_wronly, 0666);
    if (fd <0)
     / * 오류 * /
        fprintf (stderr, "unix 파일을 열 수 없음",
                filename);

    /*
     * 반전 파일에서 읽고 Unix 파일에 쓰기
     */
    while ((nbytes = lo_read (conn, lobj_fd, buf, bufsize)) 0)

        tmp = 쓰기 (fd, buf, nbytes);
        if (tmp <nbytes)

            fprintf (stderr, " %s \ n을 쓰는 동안 오류",
                    filename);

    (void) lo_close (conn, lobj_fd);
    (void) 닫기 (fd);

    반품;

무효의
exit_nicely (pgconn *conn)

    pqfinish (conn);
    출구 (1);

int
메인 (Int Argc, char ** argv)

    char *in_filename,
               *out_filename;
    char *데이터베이스;
    Oid lobjoid;
    pgconn *conn;
    pgresult *res;

    if (argc! = 4)

        fprintf (stderr, "usage : %s database_name in_filename out_filename \ n",
                argv [0]);
        출구 (1);

    데이터베이스 = argv [1];
    in_filename = argv [2];
    out_filename = argv [3];

    /*
     * 연결을 설정하십시오
     */
    conn = pqsetdb (null, null, null, null, database);

    / * 백엔드 연결이 성공적으로 만들어 졌는지 확인하십시오 */
    if (pqstatus (conn) == connection_bad)

        fprintf (stderr, "데이터베이스 '%s'에 대한 연결 실패. \ n", 데이터베이스);
        fprintf (stderr, "%s", pqerrormessage (conn));
        exit_nicely (conn);

    RES = PQEXEC (Conn, "시작");
    PQCLEAR (RES);

    printf ( "파일 가져 오기 %s \ n", in_filename);
/* lobjoid = importFile (conn, in_filename); */
    lobjoid = lo_import (conn, in_filename);
/*
    printf ( "큰 객체 d. \ n", lobjoid);

    printf ( "큰 객체의 1000-2000 바이트를 따기 \ n");
    픽 아웃 (Conn, Lobjoid, 1000, 1000);

    printf ( "x 's \ n"을 가진 큰 물체의 1000-2000의 초과 쓰기 바이트);
    덮어 쓰기 (Conn, Lobjoid, 1000, 1000);
*/

    printf ( "큰 객체를 파일 s \ n으로 내보내는 것", out_filename);
/* ExportFile (Conn, lobjoid, out_filename); */
    lo_export (conn, lobjoid, out_filename);

    res = pqexec (conn, "end");
    PQCLEAR (RES);
    pqfinish (conn);
    출구 (0);