Documentation PostgreSQL 9.1.24 > Interfaces client > ECPG SQL embarqué en C > Large Objects | |
Fonctions de la Librairie | Applications C++ |
Les Large objects ne sont pas supportés directement par ECPG, mais les application ECPG peuvent manipuler des large objects au moyen les 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 33.11, « Fonctions de la Librairie ». Pour les informations sur les fonctions d'interfaçage avec les large objects, voyez Chapitre 32, Objets larges.
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 33.2, « Programme ECPG Accédant à un Large Object » montre un programme de démonstration sur les façons de créer, écrire et lire un large object dans une application ECPG.
Exemple 33.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; 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; }