| Postgres-XC 1.2.1 Documentation | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 32. ECPG - Embedded SQL in C | Fast Forward | Next | 
Note: The following description applies both to Postgres-XC and PostgreSQL if not described explicitly. You can read PostgreSQL as Postgres-XC except for version number, which is specific to each product.
   Large objects are not directly supported by ECPG, but ECPG
   application can manipulate large objects through the libpq large
   object functions, obtaining the necessary PGconn
   object by calling the ECPGget_PGconn()
   function.  (However, use of
   the ECPGget_PGconn() function and touching
   PGconn objects directly should be done very carefully
   and ideally not mixed with other ECPG database access calls.)
  
   For more details about the ECPGget_PGconn(), see
   Section 32.11.  For information about the large
   object function interface, see Chapter 31.
  
Large object functions have to be called in a transaction block, so when autocommit is off, BEGIN commands have to be issued explicitly.
Example 32-2 shows an example program that illustrates how to create, write, and read a large object in an ECPG application.
Example 32-2. ECPG Program Accessing Large Objects
#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>
#include <libpq/libpq-fs.h>
EXEC SQL WHENEVER SQLERROR STOP;
int
main(void)
{
    PGconn     *conn;
    Oid         loid;
    int         fd;
    char        buf[256];
    int         buflen = 256;
    char        buf2[256];
    int         rc;
    memset(buf, 1, buflen);
    EXEC SQL CONNECT TO testdb AS con1;
    conn = ECPGget_PGconn("con1");
    printf("conn = %p\n", conn);
    /* create */
    loid = lo_create(conn, 0);
    if (loid < 0)
        printf("lo_create() failed: %s", PQerrorMessage(conn));
    printf("loid = %d\n", loid);
    /* write test */
    fd = lo_open(conn, loid, INV_READ|INV_WRITE);
    if (fd < 0)
        printf("lo_open() failed: %s", PQerrorMessage(conn));
    printf("fd = %d\n", fd);
    rc = lo_write(conn, fd, buf, buflen);
    if (rc < 0)
        printf("lo_write() failed\n");
    rc = lo_close(conn, fd);
    if (rc < 0)
        printf("lo_close() failed: %s", PQerrorMessage(conn));
    /* read test */
    fd = lo_open(conn, loid, INV_READ);
    if (fd < 0)
        printf("lo_open() failed: %s", PQerrorMessage(conn));
    printf("fd = %d\n", fd);
    rc = lo_read(conn, fd, buf2, buflen);
    if (rc < 0)
        printf("lo_read() failed\n");
    rc = lo_close(conn, fd);
    if (rc < 0)
        printf("lo_close() failed: %s", PQerrorMessage(conn));
    /* check */
    rc = memcmp(buf, buf2, buflen);
    printf("memcmp() = %d\n", rc);
    /* cleanup */
    rc = lo_unlink(conn, loid);
    if (rc < 0)
        printf("lo_unlink() failed: %s", PQerrorMessage(conn));
    EXEC SQL COMMIT;
    EXEC SQL DISCONNECT ALL;
    return 0;
}