28.3. Interfaces client

Cette section décrit les possibilités que les bibliothèques d'interfaces client de PostgreSQL fournissent pour accéder aux objets larges. Toutes les manipulations d'objets larges utilisant ces fonctions doivent prendre place dans un bloc de transaction SQL. (Ce prérequis est forcé strictement avec PostgreSQL 6.5 bien que c'était un prérequis implicite dans les versions précédentes, ce qui a conduit à des mauvais comportements si celui-ci était ignoré.) L'interface des objets larges de PostgreSQL prend comme modèle l'interface des systèmes de fichiers Unix avec des fonctions analogues pour open, read, write, lseek, etc.

Les applications clients utilisant l'interface des objets larges dans libpq doivent inclure le fichier d'en-tête libpq/libpq-fs.h et établir un lien avec la bibliothèque libpq.

28.3.1. Créer un objet large

La fonction

Oid lo_creat(PGconn *conn, int mode);

crée un nouvel objet large. mode est un masque décrivant les différents attributs du nouvel objet. Les constantes symboliques listées ici sont définies dans le fichier d'en-tête libpq/libpq-fs.h. Le type d'accès (lecture, écriture ou les deux) est contrôlé par une combinaison OU des bits INV_READ et INV_WRITE. Les 16 bits de poids faible du masque ont été utilisés historiquement à Berkeley pour désigner le numéro du gestionnaire de stockage sur lequel l'objet large devrait résider. Ces bits devraient toujours être à zéro maintenant. La valeur de retour est l'OID assigné au nouvel objet large.

Un exemple :

inv_oid = lo_creat(INV_READ|INV_WRITE);

28.3.2. Importer un objet large

Pour importer un fichier du système d'exploitation en tant qu'objet large, appelez

Oid lo_import(PGconn *conn, const char *filename);

filename spécifie le nom du fichier à importer comme objet large. Le code de retour est l'OID assigné au nouvel objet large.

28.3.3. Exporter un objet large

Pour exporter un objet large en tant que fichier du système d'exploitation, appelez

int lo_export(PGconn *conn, Oid lobjId, const char *filename);

L'argument lobjId spécifie l'OID de l'objet large à exporter et l'argument filename spécifie le nom du fichier.

28.3.4. Ouvrir un objet large existant

Pour ouvrir un objet large existant, appelez

int lo_open(PGconn *conn, Oid lobjId, int mode);

L'argument lobjId spécifie l'OID de l'objet large à ouvrir. Les bits mode contrôlent si l'objet est ouvert en lecture (INV_READ), écriture (INV_WRITE) ou les deux. Un objet large ne peut pas être ouvert avant d'avoir été créé. lo_open renvoie un descripteur d'objet large pour une utilisation future avec lo_read, lo_write, lo_lseek, lo_tell et lo_close. Le descripteur est uniquement valide pour la durée de la transaction en cours.

28.3.5. Écrire des données dans un objet large

La fonction

int lo_write(PGconn *conn, int fd, const char *buf, size_t len);

écrit len octets de buf dans l'objet large fd. L'argument fd doit avoir été renvoyé par un appel précédent à lo_open. Le nombre d'octets réellement écrits est renvoyé. Dans le cas d'une erreur, une valeur négative est renvoyée.

28.3.6. Lire des données à partir d'un objet large

La fonction

int lo_read(PGconn *conn, int fd, char *buf, size_t len);

lit len octets d'un objet large fd et les place dans buf. L'argument fd doit avoir été renvoyé par un appel précédent à lo_open. Le nombre d'octets réellement lus est renvoyé. Dans le cas d'une erreur, une valeur négative est renvoyée.

28.3.7. Recherche dans un objet large

Pour modifier l'emplacement courant de lecture ou écriture sur un objet large, appelez

int lo_lseek(PGconn *conn, int fd, int offset, int whence);

Cette fonction déplace le pointeur d'emplacement courant pour l'objet large décrit par fd au nouvel emplacement spécifié avec le décalage (offset). Les valeurs valides pour whence sont SEEK_SET (rechercher depuis le début de l'objet), SEEK_CUR (rechercher depuis la position courante) et SEEK_END (rechercher depuis la fin de l'objet). Le code de retour est le nouvel emplacement du pointeur.

28.3.8. Obtenir la position de recherche d'un objet large

Pour obtenir la position actuelle de lecture ou écriture d'un objet large, appelez

int lo_tell(PGconn *conn, int fd);

S'il y a une erreur, le code de retour est négatif.

28.3.9. Fermer un descripteur d'objet large

Un objet large peut être fermé en appelant

int lo_close(PGconn *conn, int fd);

fd est un descripteur d'objet large renvoyé par lo_open. En cas de succès, lo_close renvoie zéro. En cas d'erreur, le code de retour est négatif.

Tous les descripteurs d'objets larges restant ouverts à la fin d'une transaction seront automatiquement fermés.

28.3.10. Supprimer un objet large

Pour supprimer un objet large de la base de données, appelez

int lo_unlink(PGconn *conn, Oid lobjId);

L'argument lobjId spécifie l'OID de l'objet large à supprimer. Dans le cas d'une erreur, le code de retour est négatif.