返回介绍

I. 教程

II. SQL 语言

III. 服务器管理

IV. 客户端接口

V. 服务器端编程

VI. 参考手册

VII. 内部

VIII. 附录

29.5. 例子程序

发布于 2019-09-30 03:08:15 字数 5769 浏览 984 评论 0 收藏 0

Example 29-1是一个例子程序,显示如何使用libpq里面的大对象接口。程序的一部分是注释掉的,但仍然保留在源码里面供读者参考。这个程序可以在源码发布的 src/test/examples/testlo.c里找到.

Example 29-1. libpq 的大对象例子程序

/*-------------------------------------------------------------- * * testlo.c-- *    test using large objects with libpq * * Copyright (c) 1994, Regents of the University of California * *-------------------------------------------------------------- */#include <stdio.h>#include "libpq-fe.h"#include "libpq/libpq-fs.h"#define BUFSIZE          1024/* * importFile *    把文件 "in_filename" 以大对象 "lob jOid" 的形式输入到数据库中 * */OidimportFile(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, "can't open unix file %s\n", filename);    }    /*     * 创建大对象     */    lobjId = lo_creat(conn, INV_READ | INV_WRITE);    if (lobjId == 0)        fprintf(stderr, "can't create large object\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, "error while reading large object\n");    }    (void) close(fd);    (void) lo_close(conn, lobj_fd);    return lobjId;}voidpickout(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, "can't open large object %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;    }    free(buf);    fprintf(stderr, "\n");    lo_close(conn, lobj_fd);}voidoverwrite(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_READ);    if (lobj_fd < 0)    {        fprintf(stderr, "can't open large object %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] = ' ';    nwritten = 0;    while (len - nwritten > 0)    {        nbytes = lo_write(conn, lobj_fd, buf + nwritten, len - nwritten);        nwritten += nbytes;    }    free(buf);    fprintf(stderr, "\n");    lo_close(conn, lobj_fd);}/* * exportFile *    把大对象 "lobjOid" 输出到文件 "out_filename" * */voidexportFile(PGconn *conn, Oid lobjId, char *filename){    int         lobj_fd;    char        buf[BUFSIZE];    int         nbytes,                tmp;    int         fd;    /*     * 创建一个转置 "object"     */    lobj_fd = lo_open(conn, lobjId, INV_READ);    if (lobj_fd < 0)    {        fprintf(stderr, "can't open large object %d\n",                lobjId);    }    /*     * 打开文件写     */    fd = open(filename, O_CREAT | O_WRONLY, 0666);    if (fd < 0)    {                           /* 错误 */        fprintf(stderr, "can't open unix file %s\n",                filename);    }    /*     * 从大对象中读取并且写入 Unix 文件     */    while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) > 0)    {        tmp = write(fd, buf, nbytes);        if (tmp < nbytes)        {            fprintf(stderr, "error while writing %s\n",                    filename);        }    }    (void) lo_close(conn, lobj_fd);    (void) close(fd);    return;}voidexit_nicely(PGconn *conn){    PQfinish(conn);    exit(1);}intmain(int argc, char **argv){    char       *in_filename,               *out_filename;    char       *database;    Oid         lobjOid;    PGconn     *conn;    PGresult   *res;    if (argc != 4)    {        fprintf(stderr, "Usage: %s database_name in_filename out_filename\n",                argv[0]);        exit(1);    }    database = argv[1];    in_filename = argv[2];    out_filename = argv[3];    /*     * 设置连接     */    conn = PQsetdb(NULL, NULL, NULL, NULL, database);    /* check to see that the backend connection was successfully made */    if (PQstatus(conn) == CONNECTION_BAD)    {        fprintf(stderr, "Connection to database '%s' failed.\n", database);        fprintf(stderr, "%s", PQerrorMessage(conn));        exit_nicely(conn);    }    res = PQexec(conn, "begin");    PQclear(res);    printf("importing file %s\n", in_filename);/*  lobjOid = importFile(conn, in_filename); */    lobjOid = lo_import(conn, in_filename);/*    printf("as large object %d.\n", lobjOid);    printf("picking out bytes 1000-2000 of the large object\n");    pickout(conn, lobjOid, 1000, 1000);    printf("overwriting bytes 1000-2000 of the large object with X's\n");    overwrite(conn, lobjOid, 1000, 1000);*/    printf("exporting large object to file %s\n", out_filename);/*    exportFile(conn, lobjOid, out_filename); */    lo_export(conn, lobjOid, out_filename);    res = PQexec(conn, "end");    PQclear(res);    PQfinish(conn);    exit(0);}
<
PrevHomeNext
服务器端函数Upecpg - 在 C 里嵌入 SQL

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文