PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 03/09/2017 23:14:16

skylendar
Membre

écriture d'un large object

Tout d'abord et comme d'habitude, bonsoir et merci de lire ce message et d'y répondre si vous pouvez.

Ceci dit, je tente d'écrire un programme en C qui crée un 'large object' et de l'initialiser avec une image.

Voilà ce que cela donne:

int fd, w, size=10000;
char image[10000];

Oid o = lo_creat(conn, INV_READ|INV_WRITE);
if(!o) return false;

fd = lo_open(conn, o, INV_READ|INV_WRITE);
if(fd == -1) return false;
/* ici, fd = 0 */

w = lo_write(conn, fd, image, size);
fprintf(f, "%s\n", PQerrorMessage(conn))

Et c'est là le problème: lo_open retourne 0, une valeur apparemment valide mais que lo_write n'accepte pas. PQerrorMessage renvoie : "descripteur invalide de « Large Object » : 0"

Que se passe-t-il donc ? Où est mon erreur ?

Sur postgresql 9.6.5 linux-i86_64, binaire téléchargé depuis postgresql.com.

Merci encore de lire cette question.

Hors ligne

#2 04/09/2017 08:32:34

gleu
Administrateur

Re : écriture d'un large object

Avez-vous ouvert une transaction avant ce code ? parce que le Large Object n'est ouvert que pour la durée de la transaction en cours.


Guillaume.

Hors ligne

#3 05/09/2017 22:40:24

skylendar
Membre

Re : écriture d'un large object

Merci pour la remarque!

En effet, si j'entoure mes instructions par un BEGIN/END, ça marche. Mais cette disposition me semble par être explicitée dans la doc, mais dans l'exemple fournis, oui.

Si, il y a 20 ans, j'avais décrit PostgreSQL, open source avec toutes ses possibilités, on m'aurait ris au nez.

Merci encore pour l'aide fournie.

Hors ligne

#4 06/09/2017 08:13:14

gleu
Administrateur

Re : écriture d'un large object

C'est explicité dans la doc. Deuxième paragraphe du chapitre https://www.postgresql.org/docs/9.6/sta … faces.html : "All large object manipulation using these functions must take place within an SQL transaction block, since large object file descriptors are only valid for the duration of a transaction."


Guillaume.

Hors ligne

Pied de page des forums