Les Large objects ne sont pas supportés directement par ECPG, mais
les application ECPG peuvent manipuler des large objects au moyen
des fonctions large objects de la libpq, en obtenant l'objet
PGconn
nécessaire par l'appel de la fonction
ECPGget_PGconn
. (Toutefois, l'utilisation directe
de la fonction ECPGget_PGconn
et la manipulation
d'objets PGconn
devrait être effectuée de façon très
prudente, et idéalement pas mélangée avec d'autres appels à la base
par ECPG.)
Pour plus de détails à propos de ECPGget_PGconn
,
voyez Section 36.11. Pour les informations sur
les fonctions d'interfaçage avec les large objects, voyez
Chapitre 35.
Les fonctions large object doivent être appelées dans un bloc de
transaction, donc quand autocommit est à off, les commandes
BEGIN
doivent être effectuées explicitement.
Exemple 36.2 montre un programme de démonstration sur les façons de créer, écrire et lire un large object dans une application ECPG.
Exemple 36.2. Programme ECPG Accédant à un Large Object
#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); /* créer */ loid = lo_create(conn, 0); if (loid < 0) printf("lo_create() failed: %s", PQerrorMessage(conn)); printf("loid = %d\n", loid); /* test d'écriture */ 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)); /* vérifier */ rc = memcmp(buf, buf2, buflen); printf("memcmp() = %d\n", rc); /* nettoyer */ rc = lo_unlink(conn, loid); if (rc < 0) printf("lo_unlink() failed: %s", PQerrorMessage(conn)); EXEC SQL COMMIT; EXEC SQL DISCONNECT ALL; return 0; }