9.3 9.4 9.5 9.6 10 11 12 13 14 Current(15)
阿里云PostgreSQL 问题报告 纠错本页面
PostgreSQL 9.4.4 中文手册
上一页上一级章 32. 大对象下一页

32.5. 例子程序

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

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

/*--------------------------------------------------------------
 *
 * testlo.c
 * test using large objects with libpq
 *
 * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 * src/test/examples/testlo.c
 *
 *--------------------------------------------------------------
 */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "libpq-fe.h"
#include "libpq/libpq-fs.h"
#define BUFSIZE 1024
/*
 * importFile -
 * import file "in_filename" into database as large object "lobjOid"
 *
 */
static Oid
importFile(PGconn *conn, char *filename)
{
 Oid lobjId;
 int lobj_fd;
 char buf[BUFSIZE];
 int nbytes,
 tmp;
 int fd;
 /*
 * open the file to be read in
 */
 fd = open(filename, O_RDONLY, 0666);
 if (fd < 0)
 { /* error */
 fprintf(stderr, "cannot open unix file\"%s\"\n", filename);
 }
 /*
 * create the large object
 */
 lobjId = lo_creat(conn, INV_READ | INV_WRITE);
 if (lobjId == 0)
 fprintf(stderr, "cannot create large object");
 lobj_fd = lo_open(conn, lobjId, INV_WRITE);
 /*
 * read in from the Unix file and write to the inversion file
 */
 while ((nbytes = read(fd, buf, BUFSIZE)) > 0)
 {
 tmp = lo_write(conn, lobj_fd, buf, nbytes);
 if (tmp < nbytes)
 fprintf(stderr, "error while reading \"%s\"", filename);
 }
 close(fd);
 lo_close(conn, lobj_fd);
 return lobjId;
}
static void
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, "cannot open large object %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)
 break; /* no more data? */
 }
 free(buf);
 fprintf(stderr, "\n");
 lo_close(conn, lobj_fd);
}
static void
overwrite(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, "cannot open large object %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円';
 nwritten = 0;
 while (len - nwritten > 0)
 {
 nbytes = lo_write(conn, lobj_fd, buf + nwritten, len - nwritten);
 nwritten += nbytes;
 if (nbytes <= 0)
 {
 fprintf(stderr, "\nWRITE FAILED!\n");
 break;
 }
 }
 free(buf);
 fprintf(stderr, "\n");
 lo_close(conn, lobj_fd);
}
/*
 * exportFile -
 * export large object "lobjOid" to file "out_filename"
 *
 */
static void
exportFile(PGconn *conn, Oid lobjId, char *filename)
{
 int lobj_fd;
 char buf[BUFSIZE];
 int nbytes,
 tmp;
 int fd;
 /*
 * open the large object
 */
 lobj_fd = lo_open(conn, lobjId, INV_READ);
 if (lobj_fd < 0)
 fprintf(stderr, "cannot open large object %u", lobjId);
 /*
 * open the file to be written to
 */
 fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666);
 if (fd < 0)
 { /* error */
 fprintf(stderr, "cannot open unix file\"%s\"",
 filename);
 }
 /*
 * read in from the inversion file and write to the Unix file
 */
 while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) > 0)
 {
 tmp = write(fd, buf, nbytes);
 if (tmp < nbytes)
 {
 fprintf(stderr, "error while writing \"%s\"",
 filename);
 }
 }
 lo_close(conn, lobj_fd);
 close(fd);
 return;
}
static void
exit_nicely(PGconn *conn)
{
 PQfinish(conn);
 exit(1);
}
int
main(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];
 /*
 * set up the connection
 */
 conn = PQsetdb(NULL, NULL, NULL, NULL, database);
 /* check to see that the backend connection was successfully made */
 if (PQstatus(conn) != CONNECTION_OK)
 {
 fprintf(stderr, "Connection to database failed: %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);
 if (lobjOid == 0)
 fprintf(stderr, "%s\n", PQerrorMessage(conn));
 else
 {
 printf("\tas large object %u.\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); */
 if (lo_export(conn, lobjOid, out_filename) < 0)
 fprintf(stderr, "%s\n", PQerrorMessage(conn));
 }
 res = PQexec(conn, "end");
 PQclear(res);
 PQfinish(conn);
 return 0;
}

上一页起始页下一页
服务器端函数上一级ECPG - 在C中嵌入SQL
<
/BODY>

AltStyle によって変換されたページ (->オリジナル) /