aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/libpq/fe-lobj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/libpq/fe-lobj.c')
-rw-r--r--src/interfaces/libpq/fe-lobj.c939
1 files changed, 501 insertions, 438 deletions
diff --git a/src/interfaces/libpq/fe-lobj.c b/src/interfaces/libpq/fe-lobj.c
index 9b566cea339..1636edc7f42 100644
--- a/src/interfaces/libpq/fe-lobj.c
+++ b/src/interfaces/libpq/fe-lobj.c
@@ -1,13 +1,13 @@
/*-------------------------------------------------------------------------
*
* fe-lobj.c--
- * Front-end large object interface
+ * Front-end large object interface
*
* Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v 1.7 1997/05/06 07:19:04 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v 1.8 1997/09/07 05:03:34 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -21,207 +21,227 @@
#include "libpq-fe.h"
#include "libpq/libpq-fs.h"
-#define LO_BUFSIZE 1024
+#define LO_BUFSIZE 1024
-static int lo_initialize(PGconn *conn);
+static int lo_initialize(PGconn * conn);
/*
* lo_open
- * opens an existing large object
+ * opens an existing large object
*
* returns the file descriptor for use in later lo_* calls
* return -1 upon failure.
*/
int
-lo_open(PGconn* conn, Oid lobjId, int mode)
+lo_open(PGconn * conn, Oid lobjId, int mode)
{
- int fd;
- int result_len;
- PQArgBlock argv[2];
- PGresult *res;
-
- argv[0].isint = 1;
- argv[0].len = 4;
- argv[0].u.integer = lobjId;
-
- argv[1].isint = 1;
- argv[1].len = 4;
- argv[1].u.integer = mode;
-
- if(conn->lobjfuncs == (PGlobjfuncs *)NULL) {
- if(lo_initialize(conn) < 0) {
- return -1;
- }
- }
-
- res = PQfn(conn, conn->lobjfuncs->fn_lo_open,&fd,&result_len,1,argv,2);
- if (PQresultStatus(res) == PGRES_COMMAND_OK) {
- PQclear(res);
+ int fd;
+ int result_len;
+ PQArgBlock argv[2];
+ PGresult *res;
+
+ argv[0].isint = 1;
+ argv[0].len = 4;
+ argv[0].u.integer = lobjId;
+
+ argv[1].isint = 1;
+ argv[1].len = 4;
+ argv[1].u.integer = mode;
+
+ if (conn->lobjfuncs == (PGlobjfuncs *) NULL)
+ {
+ if (lo_initialize(conn) < 0)
+ {
+ return -1;
+ }
+ }
+
+ res = PQfn(conn, conn->lobjfuncs->fn_lo_open, &fd, &result_len, 1, argv, 2);
+ if (PQresultStatus(res) == PGRES_COMMAND_OK)
+ {
+ PQclear(res);
- /* have to do this to reset offset in shared fd cache */
- /* but only if fd is valid */
- if (fd >= 0 && lo_lseek(conn, fd, 0L, SEEK_SET) < 0)
- return -1;
- return fd;
- } else
- return -1;
+ /* have to do this to reset offset in shared fd cache */
+ /* but only if fd is valid */
+ if (fd >= 0 && lo_lseek(conn, fd, 0L, SEEK_SET) < 0)
+ return -1;
+ return fd;
+ }
+ else
+ return -1;
}
/*
* lo_close
- * closes an existing large object
+ * closes an existing large object
*
* returns 0 upon success
* returns -1 upon failure.
*/
int
-lo_close(PGconn *conn, int fd)
+lo_close(PGconn * conn, int fd)
{
- PQArgBlock argv[1];
- PGresult *res;
- int retval;
- int result_len;
-
- if(conn->lobjfuncs == (PGlobjfuncs *)NULL) {
- if(lo_initialize(conn) < 0) {
- return -1;
- }
- }
-
- argv[0].isint = 1;
- argv[0].len = 4;
- argv[0].u.integer = fd;
- res = PQfn(conn, conn->lobjfuncs->fn_lo_close,
- &retval,&result_len,1,argv,1);
- if (PQresultStatus(res) == PGRES_COMMAND_OK) {
- PQclear(res);
- return retval;
- } else
- return -1;
+ PQArgBlock argv[1];
+ PGresult *res;
+ int retval;
+ int result_len;
+
+ if (conn->lobjfuncs == (PGlobjfuncs *) NULL)
+ {
+ if (lo_initialize(conn) < 0)
+ {
+ return -1;
+ }
+ }
+
+ argv[0].isint = 1;
+ argv[0].len = 4;
+ argv[0].u.integer = fd;
+ res = PQfn(conn, conn->lobjfuncs->fn_lo_close,
+ &retval, &result_len, 1, argv, 1);
+ if (PQresultStatus(res) == PGRES_COMMAND_OK)
+ {
+ PQclear(res);
+ return retval;
+ }
+ else
+ return -1;
}
/*
* lo_read
- * read len bytes of the large object into buf
+ * read len bytes of the large object into buf
*
* returns the length of bytes read.
* the CALLER must have allocated enough space to hold the result returned
*/
int
-lo_read(PGconn *conn, int fd, char *buf, int len)
+lo_read(PGconn * conn, int fd, char *buf, int len)
{
- PQArgBlock argv[2];
- PGresult *res;
- int result_len;
-
- if(conn->lobjfuncs == (PGlobjfuncs *)NULL) {
- if(lo_initialize(conn) < 0) {
- return -1;
- }
- }
-
- argv[0].isint = 1;
- argv[0].len = 4;
- argv[0].u.integer = fd;
-
- argv[1].isint = 1;
- argv[1].len = 4;
- argv[1].u.integer = len;
-
- res = PQfn(conn, conn->lobjfuncs->fn_lo_read,
- (int*)buf,&result_len,0,argv,2);
- if (PQresultStatus(res) == PGRES_COMMAND_OK) {
- PQclear(res);
- return result_len;
- } else
- return -1;
+ PQArgBlock argv[2];
+ PGresult *res;
+ int result_len;
+
+ if (conn->lobjfuncs == (PGlobjfuncs *) NULL)
+ {
+ if (lo_initialize(conn) < 0)
+ {
+ return -1;
+ }
+ }
+
+ argv[0].isint = 1;
+ argv[0].len = 4;
+ argv[0].u.integer = fd;
+
+ argv[1].isint = 1;
+ argv[1].len = 4;
+ argv[1].u.integer = len;
+
+ res = PQfn(conn, conn->lobjfuncs->fn_lo_read,
+ (int *) buf, &result_len, 0, argv, 2);
+ if (PQresultStatus(res) == PGRES_COMMAND_OK)
+ {
+ PQclear(res);
+ return result_len;
+ }
+ else
+ return -1;
}
/*
* lo_write
- * write len bytes of buf into the large object fd
+ * write len bytes of buf into the large object fd
*
*/
int
-lo_write(PGconn *conn, int fd, char *buf, int len)
+lo_write(PGconn * conn, int fd, char *buf, int len)
{
- PQArgBlock argv[2];
- PGresult *res;
- int result_len;
- int retval;
-
- if(conn->lobjfuncs == (PGlobjfuncs *)NULL) {
- if(lo_initialize(conn) < 0) {
- return -1;
- }
- }
-
- if (len <= 0)
- return 0;
+ PQArgBlock argv[2];
+ PGresult *res;
+ int result_len;
+ int retval;
+
+ if (conn->lobjfuncs == (PGlobjfuncs *) NULL)
+ {
+ if (lo_initialize(conn) < 0)
+ {
+ return -1;
+ }
+ }
- argv[0].isint = 1;
- argv[0].len = 4;
- argv[0].u.integer = fd;
+ if (len <= 0)
+ return 0;
- argv[1].isint = 0;
- argv[1].len = len;
- argv[1].u.ptr = (int*)buf;
+ argv[0].isint = 1;
+ argv[0].len = 4;
+ argv[0].u.integer = fd;
- res = PQfn(conn, conn->lobjfuncs->fn_lo_write,
- &retval,&result_len,1,argv,2);
- if (PQresultStatus(res) == PGRES_COMMAND_OK) {
- PQclear(res);
- return retval;
- } else
- return -1;
+ argv[1].isint = 0;
+ argv[1].len = len;
+ argv[1].u.ptr = (int *) buf;
+
+ res = PQfn(conn, conn->lobjfuncs->fn_lo_write,
+ &retval, &result_len, 1, argv, 2);
+ if (PQresultStatus(res) == PGRES_COMMAND_OK)
+ {
+ PQclear(res);
+ return retval;
+ }
+ else
+ return -1;
}
/*
* lo_lseek
- * change the current read or write location on a large object
+ * change the current read or write location on a large object
* currently, only L_SET is a legal value for whence
*
*/
int
-lo_lseek(PGconn *conn, int fd, int offset, int whence)
+lo_lseek(PGconn * conn, int fd, int offset, int whence)
{
- PQArgBlock argv[3];
- PGresult *res;
- int retval;
- int result_len;
-
- if(conn->lobjfuncs == (PGlobjfuncs *)NULL) {
- if(lo_initialize(conn) < 0) {
- return -1;
- }
- }
-
- argv[0].isint = 1;
- argv[0].len = 4;
- argv[0].u.integer = fd;
-
- argv[1].isint = 1;
- argv[1].len = 4;
- argv[1].u.integer = offset;
-
- argv[2].isint = 1;
- argv[2].len = 4;
- argv[2].u.integer = whence;
-
- res = PQfn(conn, conn->lobjfuncs->fn_lo_lseek,
- &retval,&result_len,1,argv,3);
- if (PQresultStatus(res) == PGRES_COMMAND_OK) {
- PQclear(res);
- return retval;
- } else
- return -1;
+ PQArgBlock argv[3];
+ PGresult *res;
+ int retval;
+ int result_len;
+
+ if (conn->lobjfuncs == (PGlobjfuncs *) NULL)
+ {
+ if (lo_initialize(conn) < 0)
+ {
+ return -1;
+ }
+ }
+
+ argv[0].isint = 1;
+ argv[0].len = 4;
+ argv[0].u.integer = fd;
+
+ argv[1].isint = 1;
+ argv[1].len = 4;
+ argv[1].u.integer = offset;
+
+ argv[2].isint = 1;
+ argv[2].len = 4;
+ argv[2].u.integer = whence;
+
+ res = PQfn(conn, conn->lobjfuncs->fn_lo_lseek,
+ &retval, &result_len, 1, argv, 3);
+ if (PQresultStatus(res) == PGRES_COMMAND_OK)
+ {
+ PQclear(res);
+ return retval;
+ }
+ else
+ return -1;
}
/*
* lo_creat
- * create a new large object
+ * create a new large object
* the mode is a bitmask describing different attributes of the new object
*
* returns the oid of the large object created or
@@ -229,209 +249,233 @@ lo_lseek(PGconn *conn, int fd, int offset, int whence)
*/
Oid
-lo_creat(PGconn *conn, int mode)
+lo_creat(PGconn * conn, int mode)
{
- PQArgBlock argv[1];
- PGresult *res;
- int retval;
- int result_len;
-
- if(conn->lobjfuncs == (PGlobjfuncs *)NULL) {
- if(lo_initialize(conn) < 0) {
- return -1;
- }
- }
-
- argv[0].isint = 1;
- argv[0].len = 4;
- argv[0].u.integer = mode;
- res = PQfn(conn, conn->lobjfuncs->fn_lo_creat,
- &retval,&result_len,1,argv,1);
- if (PQresultStatus(res) == PGRES_COMMAND_OK) {
- PQclear(res);
- return (Oid)retval;
- } else
- return InvalidOid;
+ PQArgBlock argv[1];
+ PGresult *res;
+ int retval;
+ int result_len;
+
+ if (conn->lobjfuncs == (PGlobjfuncs *) NULL)
+ {
+ if (lo_initialize(conn) < 0)
+ {
+ return -1;
+ }
+ }
+
+ argv[0].isint = 1;
+ argv[0].len = 4;
+ argv[0].u.integer = mode;
+ res = PQfn(conn, conn->lobjfuncs->fn_lo_creat,
+ &retval, &result_len, 1, argv, 1);
+ if (PQresultStatus(res) == PGRES_COMMAND_OK)
+ {
+ PQclear(res);
+ return (Oid) retval;
+ }
+ else
+ return InvalidOid;
}
/*
* lo_tell
- * returns the current seek location of the large object
+ * returns the current seek location of the large object
*
*/
int
-lo_tell(PGconn *conn, int fd)
+lo_tell(PGconn * conn, int fd)
{
- int retval;
- PQArgBlock argv[1];
- PGresult *res;
- int result_len;
-
- if(conn->lobjfuncs == (PGlobjfuncs *)NULL) {
- if(lo_initialize(conn) < 0) {
- return -1;
- }
- }
-
- argv[0].isint = 1;
- argv[0].len = 4;
- argv[0].u.integer = fd;
-
- res = PQfn(conn, conn->lobjfuncs->fn_lo_tell,
- &retval,&result_len,1,argv,1);
- if (PQresultStatus(res) == PGRES_COMMAND_OK) {
- PQclear(res);
- return retval;
- } else
- return -1;
+ int retval;
+ PQArgBlock argv[1];
+ PGresult *res;
+ int result_len;
+
+ if (conn->lobjfuncs == (PGlobjfuncs *) NULL)
+ {
+ if (lo_initialize(conn) < 0)
+ {
+ return -1;
+ }
+ }
+
+ argv[0].isint = 1;
+ argv[0].len = 4;
+ argv[0].u.integer = fd;
+
+ res = PQfn(conn, conn->lobjfuncs->fn_lo_tell,
+ &retval, &result_len, 1, argv, 1);
+ if (PQresultStatus(res) == PGRES_COMMAND_OK)
+ {
+ PQclear(res);
+ return retval;
+ }
+ else
+ return -1;
}
/*
* lo_unlink
- * delete a file
+ * delete a file
*
*/
int
-lo_unlink(PGconn *conn, Oid lobjId)
+lo_unlink(PGconn * conn, Oid lobjId)
{
- PQArgBlock argv[1];
- PGresult *res;
- int result_len;
- int retval;
-
- if(conn->lobjfuncs == (PGlobjfuncs *)NULL) {
- if(lo_initialize(conn) < 0) {
- return -1;
- }
- }
-
- argv[0].isint = 1;
- argv[0].len = 4;
- argv[0].u.integer = lobjId;
-
- res = PQfn(conn, conn->lobjfuncs->fn_lo_unlink,
- &retval,&result_len,1,argv,1);
- if (PQresultStatus(res) == PGRES_COMMAND_OK) {
- PQclear(res);
- return retval;
- } else
- return -1;
+ PQArgBlock argv[1];
+ PGresult *res;
+ int result_len;
+ int retval;
+
+ if (conn->lobjfuncs == (PGlobjfuncs *) NULL)
+ {
+ if (lo_initialize(conn) < 0)
+ {
+ return -1;
+ }
+ }
+
+ argv[0].isint = 1;
+ argv[0].len = 4;
+ argv[0].u.integer = lobjId;
+
+ res = PQfn(conn, conn->lobjfuncs->fn_lo_unlink,
+ &retval, &result_len, 1, argv, 1);
+ if (PQresultStatus(res) == PGRES_COMMAND_OK)
+ {
+ PQclear(res);
+ return retval;
+ }
+ else
+ return -1;
}
/*
* lo_import -
- * imports a file as an (inversion) large object.
- * returns the oid of that object upon success,
+ * imports a file as an (inversion) large object.
+ * returns the oid of that object upon success,
* returns InvalidOid upon failure
*
*/
Oid
-lo_import(PGconn *conn, char* filename)
+lo_import(PGconn * conn, char *filename)
{
- int fd;
- int nbytes, tmp;
- char buf[LO_BUFSIZE];
- Oid lobjOid;
- int lobj;
-
- /*
- * open the file to be read in
- */
- fd = open(filename, O_RDONLY, 0666);
- if (fd < 0) { /* error */
- sprintf(conn->errorMessage,
- "lo_import: can't open unix file\"%s\"\n", filename);
- return InvalidOid;
- }
-
- /*
- * create an inversion "object"
- */
- lobjOid = lo_creat(conn, INV_READ|INV_WRITE);
- if (lobjOid == InvalidOid) {
- sprintf(conn->errorMessage,
- "lo_import: can't create inv object for \"%s\"", filename);
- return InvalidOid;
- }
-
- lobj = lo_open(conn, lobjOid, INV_WRITE);
- if (lobj == -1) {
- sprintf(conn->errorMessage,
- "lo_import: could not open inv object oid %d",lobjOid);
- return InvalidOid;
- }
- /*
- * read in from the Unix file and write to the inversion file
- */
- while ((nbytes = read(fd, buf, LO_BUFSIZE)) > 0) {
- tmp = lo_write(conn,lobj, buf, nbytes);
- if (tmp < nbytes) {
- sprintf(conn->errorMessage,
- "lo_import: error while reading \"%s\"",filename);
- return InvalidOid;
- }
- }
-
- (void) close(fd);
- (void) lo_close(conn, lobj);
-
- return lobjOid;
+ int fd;
+ int nbytes,
+ tmp;
+ char buf[LO_BUFSIZE];
+ Oid lobjOid;
+ int lobj;
+
+ /*
+ * open the file to be read in
+ */
+ fd = open(filename, O_RDONLY, 0666);
+ if (fd < 0)
+ { /* error */
+ sprintf(conn->errorMessage,
+ "lo_import: can't open unix file\"%s\"\n", filename);
+ return InvalidOid;
+ }
+
+ /*
+ * create an inversion "object"
+ */
+ lobjOid = lo_creat(conn, INV_READ | INV_WRITE);
+ if (lobjOid == InvalidOid)
+ {
+ sprintf(conn->errorMessage,
+ "lo_import: can't create inv object for \"%s\"", filename);
+ return InvalidOid;
+ }
+
+ lobj = lo_open(conn, lobjOid, INV_WRITE);
+ if (lobj == -1)
+ {
+ sprintf(conn->errorMessage,
+ "lo_import: could not open inv object oid %d", lobjOid);
+ return InvalidOid;
+ }
+
+ /*
+ * read in from the Unix file and write to the inversion file
+ */
+ while ((nbytes = read(fd, buf, LO_BUFSIZE)) > 0)
+ {
+ tmp = lo_write(conn, lobj, buf, nbytes);
+ if (tmp < nbytes)
+ {
+ sprintf(conn->errorMessage,
+ "lo_import: error while reading \"%s\"", filename);
+ return InvalidOid;
+ }
+ }
+
+ (void) close(fd);
+ (void) lo_close(conn, lobj);
+
+ return lobjOid;
}
/*
* lo_export -
- * exports an (inversion) large object.
+ * exports an (inversion) large object.
* returns -1 upon failure, 1 otherwise
*/
int
-lo_export(PGconn *conn, Oid lobjId, char *filename)
+lo_export(PGconn * conn, Oid lobjId, char *filename)
{
- int fd;
- int nbytes, tmp;
- char buf[LO_BUFSIZE];
- int lobj;
-
- /*
- * create an inversion "object"
- */
- lobj = lo_open(conn, lobjId, INV_READ);
- if (lobj == -1) {
- sprintf(conn->errorMessage,
- "lo_export: can't open inv object %d",lobjId);
- return -1;
- }
-
- /*
- * open the file to be written to
- */
- fd = open(filename, O_CREAT|O_WRONLY, 0666);
- if (fd < 0) { /* error */
- sprintf(conn->errorMessage,
- "lo_export: can't open unix file\"%s\"",filename);
- return 0;
- }
+ int fd;
+ int nbytes,
+ tmp;
+ char buf[LO_BUFSIZE];
+ int lobj;
+
+ /*
+ * create an inversion "object"
+ */
+ lobj = lo_open(conn, lobjId, INV_READ);
+ if (lobj == -1)
+ {
+ sprintf(conn->errorMessage,
+ "lo_export: can't open inv object %d", lobjId);
+ return -1;
+ }
+
+ /*
+ * open the file to be written to
+ */
+ fd = open(filename, O_CREAT | O_WRONLY, 0666);
+ if (fd < 0)
+ { /* error */
+ sprintf(conn->errorMessage,
+ "lo_export: can't open unix file\"%s\"", filename);
+ return 0;
+ }
- /*
- * read in from the Unix file and write to the inversion file
- */
- while ((nbytes = lo_read(conn, lobj, buf, LO_BUFSIZE)) > 0) {
- tmp = write(fd, buf, nbytes);
- if (tmp < nbytes) {
- sprintf(conn->errorMessage,
- "lo_export: error while writing \"%s\"",
- filename);
- return -1;
+ /*
+ * read in from the Unix file and write to the inversion file
+ */
+ while ((nbytes = lo_read(conn, lobj, buf, LO_BUFSIZE)) > 0)
+ {
+ tmp = write(fd, buf, nbytes);
+ if (tmp < nbytes)
+ {
+ sprintf(conn->errorMessage,
+ "lo_export: error while writing \"%s\"",
+ filename);
+ return -1;
+ }
}
- }
- (void) lo_close(conn,lobj);
- (void) close(fd);
+ (void) lo_close(conn, lobj);
+ (void) close(fd);
- return 1;
+ return 1;
}
@@ -443,31 +487,33 @@ lo_export(PGconn *conn, Oid lobjId, char *filename)
* functions that are required for large object operations.
* ----------------
*/
-static int lo_initialize(PGconn *conn)
+static int
+lo_initialize(PGconn * conn)
{
- PGresult *res;
- PGlobjfuncs *lobjfuncs;
- int n;
- char *fname;
- Oid foid;
-
- /* ----------------
- * Allocate the structure to hold the functions OID's
- * ----------------
- */
- lobjfuncs = (PGlobjfuncs *)malloc(sizeof(PGlobjfuncs));
- if (lobjfuncs == (PGlobjfuncs *)NULL) {
- strcpy(conn->errorMessage,
- "FATAL: malloc() failed in lo_initialize()\n");
- return -1;
- }
- memset((char *)lobjfuncs, 0, sizeof(PGlobjfuncs));
-
- /* ----------------
- * Execute the query to get all the functions at once
- * ----------------
- */
- res = PQexec(conn, "select proname, oid from pg_proc \
+ PGresult *res;
+ PGlobjfuncs *lobjfuncs;
+ int n;
+ char *fname;
+ Oid foid;
+
+ /* ----------------
+ * Allocate the structure to hold the functions OID's
+ * ----------------
+ */
+ lobjfuncs = (PGlobjfuncs *) malloc(sizeof(PGlobjfuncs));
+ if (lobjfuncs == (PGlobjfuncs *) NULL)
+ {
+ strcpy(conn->errorMessage,
+ "FATAL: malloc() failed in lo_initialize()\n");
+ return -1;
+ }
+ memset((char *) lobjfuncs, 0, sizeof(PGlobjfuncs));
+
+ /* ----------------
+ * Execute the query to get all the functions at once
+ * ----------------
+ */
+ res = PQexec(conn, "select proname, oid from pg_proc \
where proname = 'lo_open' \
or proname = 'lo_close' \
or proname = 'lo_creat' \
@@ -476,114 +522,131 @@ static int lo_initialize(PGconn *conn)
or proname = 'lo_tell' \
or proname = 'loread' \
or proname = 'lowrite'");
- if (res == (PGresult *)NULL) {
- free(lobjfuncs);
- return -1;
- }
+ if (res == (PGresult *) NULL)
+ {
+ free(lobjfuncs);
+ return -1;
+ }
+
+ if (res->resultStatus != PGRES_TUPLES_OK)
+ {
+ free(lobjfuncs);
+ PQclear(res);
+ strcpy(conn->errorMessage,
+ "ERROR: SELECT didn't return data in lo_initialize()\n");
+ return -1;
+ }
+
+ /* ----------------
+ * Examine the result and put the OID's into the struct
+ * ----------------
+ */
+ for (n = 0; n < PQntuples(res); n++)
+ {
+ fname = PQgetvalue(res, n, 0);
+ foid = (Oid) atoi(PQgetvalue(res, n, 1));
+ if (!strcmp(fname, "lo_open"))
+ {
+ lobjfuncs->fn_lo_open = foid;
+ }
+ else if (!strcmp(fname, "lo_close"))
+ {
+ lobjfuncs->fn_lo_close = foid;
+ }
+ else if (!strcmp(fname, "lo_creat"))
+ {
+ lobjfuncs->fn_lo_creat = foid;
+ }
+ else if (!strcmp(fname, "lo_unlink"))
+ {
+ lobjfuncs->fn_lo_unlink = foid;
+ }
+ else if (!strcmp(fname, "lo_lseek"))
+ {
+ lobjfuncs->fn_lo_lseek = foid;
+ }
+ else if (!strcmp(fname, "lo_tell"))
+ {
+ lobjfuncs->fn_lo_tell = foid;
+ }
+ else if (!strcmp(fname, "loread"))
+ {
+ lobjfuncs->fn_lo_read = foid;
+ }
+ else if (!strcmp(fname, "lowrite"))
+ {
+ lobjfuncs->fn_lo_write = foid;
+ }
+ }
- if (res->resultStatus != PGRES_TUPLES_OK) {
- free(lobjfuncs);
PQclear(res);
- strcpy(conn->errorMessage,
- "ERROR: SELECT didn't return data in lo_initialize()\n");
- return -1;
- }
-
- /* ----------------
- * Examine the result and put the OID's into the struct
- * ----------------
- */
- for(n = 0; n < PQntuples(res); n++) {
- fname = PQgetvalue(res, n, 0);
- foid = (Oid)atoi(PQgetvalue(res, n, 1));
- if(!strcmp(fname, "lo_open")) {
- lobjfuncs->fn_lo_open = foid;
- } else
- if(!strcmp(fname, "lo_close")) {
- lobjfuncs->fn_lo_close = foid;
- } else
- if(!strcmp(fname, "lo_creat")) {
- lobjfuncs->fn_lo_creat = foid;
- } else
- if(!strcmp(fname, "lo_unlink")) {
- lobjfuncs->fn_lo_unlink = foid;
- } else
- if(!strcmp(fname, "lo_lseek")) {
- lobjfuncs->fn_lo_lseek = foid;
- } else
- if(!strcmp(fname, "lo_tell")) {
- lobjfuncs->fn_lo_tell = foid;
- } else
- if(!strcmp(fname, "loread")) {
- lobjfuncs->fn_lo_read = foid;
- } else
- if(!strcmp(fname, "lowrite")) {
- lobjfuncs->fn_lo_write = foid;
- }
- }
-
- PQclear(res);
-
- /* ----------------
- * Finally check that we really got all large object
- * interface functions.
- * ----------------
- */
- if(lobjfuncs->fn_lo_open == 0) {
- strcpy(conn->errorMessage,
- "ERROR: Cannot determine OID for function lo_open\n");
- free(lobjfuncs);
- return -1;
- }
- if(lobjfuncs->fn_lo_close == 0) {
- strcpy(conn->errorMessage,
- "ERROR: Cannot determine OID for function lo_close\n");
- free(lobjfuncs);
- return -1;
- }
- if(lobjfuncs->fn_lo_creat == 0) {
- strcpy(conn->errorMessage,
- "ERROR: Cannot determine OID for function lo_creat\n");
- free(lobjfuncs);
- return -1;
- }
- if(lobjfuncs->fn_lo_unlink == 0) {
- strcpy(conn->errorMessage,
- "ERROR: Cannot determine OID for function lo_unlink\n");
- free(lobjfuncs);
- return -1;
- }
- if(lobjfuncs->fn_lo_lseek == 0) {
- strcpy(conn->errorMessage,
- "ERROR: Cannot determine OID for function lo_lseek\n");
- free(lobjfuncs);
- return -1;
- }
- if(lobjfuncs->fn_lo_tell == 0) {
- strcpy(conn->errorMessage,
- "ERROR: Cannot determine OID for function lo_tell\n");
- free(lobjfuncs);
- return -1;
- }
- if(lobjfuncs->fn_lo_read == 0) {
- strcpy(conn->errorMessage,
- "ERROR: Cannot determine OID for function loread\n");
- free(lobjfuncs);
- return -1;
- }
- if(lobjfuncs->fn_lo_write == 0) {
- strcpy(conn->errorMessage,
- "ERROR: Cannot determine OID for function lowrite\n");
- free(lobjfuncs);
- return -1;
- }
-
- /* ----------------
- * Put the structure into the connection control
- * ----------------
- */
- conn->lobjfuncs = lobjfuncs;
- return 0;
-}
+ /* ----------------
+ * Finally check that we really got all large object
+ * interface functions.
+ * ----------------
+ */
+ if (lobjfuncs->fn_lo_open == 0)
+ {
+ strcpy(conn->errorMessage,
+ "ERROR: Cannot determine OID for function lo_open\n");
+ free(lobjfuncs);
+ return -1;
+ }
+ if (lobjfuncs->fn_lo_close == 0)
+ {
+ strcpy(conn->errorMessage,
+ "ERROR: Cannot determine OID for function lo_close\n");
+ free(lobjfuncs);
+ return -1;
+ }
+ if (lobjfuncs->fn_lo_creat == 0)
+ {
+ strcpy(conn->errorMessage,
+ "ERROR: Cannot determine OID for function lo_creat\n");
+ free(lobjfuncs);
+ return -1;
+ }
+ if (lobjfuncs->fn_lo_unlink == 0)
+ {
+ strcpy(conn->errorMessage,
+ "ERROR: Cannot determine OID for function lo_unlink\n");
+ free(lobjfuncs);
+ return -1;
+ }
+ if (lobjfuncs->fn_lo_lseek == 0)
+ {
+ strcpy(conn->errorMessage,
+ "ERROR: Cannot determine OID for function lo_lseek\n");
+ free(lobjfuncs);
+ return -1;
+ }
+ if (lobjfuncs->fn_lo_tell == 0)
+ {
+ strcpy(conn->errorMessage,
+ "ERROR: Cannot determine OID for function lo_tell\n");
+ free(lobjfuncs);
+ return -1;
+ }
+ if (lobjfuncs->fn_lo_read == 0)
+ {
+ strcpy(conn->errorMessage,
+ "ERROR: Cannot determine OID for function loread\n");
+ free(lobjfuncs);
+ return -1;
+ }
+ if (lobjfuncs->fn_lo_write == 0)
+ {
+ strcpy(conn->errorMessage,
+ "ERROR: Cannot determine OID for function lowrite\n");
+ free(lobjfuncs);
+ return -1;
+ }
+ /* ----------------
+ * Put the structure into the connection control
+ * ----------------
+ */
+ conn->lobjfuncs = lobjfuncs;
+ return 0;
+}