34.12. Большие объекты#

34.12. Большие объекты

34.12. Большие объекты

Большие объекты не поддерживаются напрямую ECPG, но приложение ECPG может манипулировать большими объектами через функции больших объектов libpq, получая необходимый объект PGconn путем вызова функции ECPGget_PGconn(). (Однако использование функции ECPGget_PGconn() и прямое взаимодействие с объектами PGconn должно быть выполнено очень осторожно и в идеале не смешиваться с другими вызовами доступа к базе данных ECPG).

Для получения более подробной информации о функции ECPGget_PGconn() см. раздел Раздел 34.11. Для получения информации о интерфейсе функций для работы с большими объектами см. раздел Глава 33.

Функции для работы с большими объектами должны вызываться в блоке транзакции, поэтому, когда автокоммит отключен, команды BEGIN должны быть явно указаны.

Пример 34.2 показывает пример программы, иллюстрирующей, как создать, записать и прочитать большой объект в приложении ECPG.

Пример 34.2. ECPG Программа доступа к большим объектам

#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;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT;

    conn = ECPGget_PGconn("con1");
    printf("conn = %p\n", conn);

    /* create */
    loid = lo_create(conn, 0);
    if (loid &lt; 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 &lt; 0)
        printf("lo_open() failed: %s", PQerrorMessage(conn));

    printf("fd = %d\n", fd);

    rc = lo_write(conn, fd, buf, buflen);
    if (rc &lt; 0)
        printf("lo_write() failed\n");

    rc = lo_close(conn, fd);
    if (rc &lt; 0)
        printf("lo_close() failed: %s", PQerrorMessage(conn));

    /* read test */
    fd = lo_open(conn, loid, INV_READ);
    if (fd &lt; 0)
        printf("lo_open() failed: %s", PQerrorMessage(conn));

    printf("fd = %d\n", fd);

    rc = lo_read(conn, fd, buf2, buflen);
    if (rc &lt; 0)
        printf("lo_read() failed\n");

    rc = lo_close(conn, fd);
    if (rc &lt; 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 &lt; 0)
        printf("lo_unlink() failed: %s", PQerrorMessage(conn));

    EXEC SQL COMMIT;
    EXEC SQL DISCONNECT ALL;
    return 0;
}