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

32.5. 예제 범퍼카 토토

예 32-1큰 객체 인터페이스가 어떻게를 보여주는 샘플 범퍼카 토토입니다.libpq사용할 수 있습니다. 범퍼카 토토의 일부는 언급되어 있지만 독자의 이익을 위해 출처에 남아 있습니다. 이 범퍼카 토토은에서도 찾을 수 있습니다.src/test/examples/testlo.c소스 분포에서.

예 32-1. 큰 물체libpq예제 범퍼카 토토

/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
 *
 * testlo.c
 * LIBPQ로 큰 물체를 사용하여 테스트하십시오
 *
 * 일부 저작권 (C) 1996-2015, 토토 사이트
 * 일부 저작권 (C) 1994, 캘리포니아 대학교 리전트
 *
 *
 * 식별
 * src/test/examples/testlo.c
 *
 *------------------------------------------------------------------------------------------------
 */
#include <stdio.h
#include <stdlib.h

#include <sys/type.h
#include <sys/stat.h
#include <fcntl.h
#include <unistd.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, "큰 객체를 만들 수 없음");

    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, "읽는 동안 오류 \"%s \ "", filename);

    닫기 (FD);
    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, "큰 물체를 열 수 없음 %u", 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] = '\ 0';
        fprintf (stderr, " %s", buf);
        nread += nbytes;
        if (nbytes <= 0)
            부서지다;              /* 더 이상 데이터가 없습니까? */

    무료 (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, "큰 물체를 열 수 없음 %u", lobjid);

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

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

    nwrretten = 0;
    while (len -nwritten 0)

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

            fprintf (stderr, "\ nwrite 실패! \ n");
            부서지다;

    무료 (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, "큰 물체를 열 수 없음 %u", lobjid);

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

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

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

            fprintf (stderr, "\"%s \ "를 작성하는 동안"오류 ",
                    filename);

    lo_close (Conn, lobj_fd);
    닫기 (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_ok)

        fprintf (stderr, "데이터베이스 연결 실패 : %s",
                pqerrormessage (conn));
        exit_nicely (conn);

    /* 항상 보안 검색 경로를 설정하므로 악의적 인 사용자가 제어 할 수 없습니다. */
    res = pqexec (conn,
                 "pg_catalog.set_config ( 'search_path', '', false)를 선택하십시오.");
    if (pqresultstatus (res)! = pgres_tuples_ok)

        fprintf (stderr, "set 실패 : %s", pqerrormessage (conn));
        PQCLEAR (RES);
        exit_nicely (conn);

    PQCLEAR (RES);

    RES = PQEXEC (Conn, "시작");
    PQCLEAR (RES);
    printf ( "파일 가져 오기 \"%s \ "... \ n", in_filename);
/* lobjoid = importFile (conn, in_filename); */
    lobjoid = lo_import (conn, in_filename);
    if (lobjoid == 0)
        fprintf (stderr, "%s \ n", pqerrormessage (conn));
    또 다른

        printf ( "\ tas 큰 물체 %u. \ 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); */
        if (lo_export (conn, lobjoid, out_filename) <0)
            fprintf (stderr, "%s \ n", pqerrormessage (conn));

    res = pqexec (conn, "end");
    PQCLEAR (RES);
    pqfinish (conn);
    반환 0;