Documentation PostgreSQL 14.22 » Interfaces client » Large Objects » Fonctions du côté serveur

Précédent | Niveau supérieur | Suivant
35.3. Interfaces client | Sommaire | 35.5. Programme d'exemple

## 35.4. Fonctions du côté serveur

Les fonctions côté serveur conçues pour la manipulation des « Large Objects » en SQL sont listées dans Tableau 35.1.

Tableau 35.1. Fonctions SQL orientées « Large Object »

Fonction Description Exemple(s)
`lo_from_bytea` ( `loid` `oid`, `data` `bytea` ) → `oid` Crée un « Large Object » et stocke des `data` dedans. Si le paramètre `loid` est zéro, alors le système va choisir un OID libre, sinon cet OID est utilisé (avec une erreur s'il existe déjà un « Large Object » sur cet OID). En cas de succès, l'OID du « Large Object » est renvoyé. `lo_from_bytea(0, '\xffffff00')` → `24528`
`lo_put` ( `loid` `oid`, `offset` `bigint`, `data` `bytea` ) → `void` Écrit `data` en commençant au décalage donné à l'intérieur du « Large Object », ce dernier étant agrandi si nécessaire. `lo_put(24528, 1, '\xaa')` → ``
`lo_get` ( `loid` `oid` [, `offset` `bigint`, `length` `integer` ] ) → `bytea` Extrait le contenu du « Large Object », ou une sous-chaîne de celui-ci. `lo_get(24528, 0, 3)` → `\xffaaff`

Il existe d'autres fonctions côté serveur correspondant à chacune des fonctions côté client décrites précédemment. En fait, la plupart des fonctions côté client sont simplement des interfaces vers l'équivalent côté serveur. Celles qu'il est possible d'appeler via des commandes SQL sont `lo_creat`, `lo_create`, `lo_create`, `lo_unlink`, `lo_import` et `lo_export`. Voici des exemples de leur utilisation :

    CREATE TABLE image (
        nom             text,
        donnees         oid
    );

    SELECT lo_creat(-1);       -- renvoie l'OID du nouveau Large Object

    SELECT lo_create(43213);   -- tente de créer le Large Object d'OID 43213

    SELECT lo_unlink(173454);  -- supprime le Large Object d'OID 173454

    INSERT INTO image (nom, donnees)
        VALUES ('superbe image', lo_import('/etc/motd'));

    INSERT INTO image (nom, donnees)  -- identique à ci-dessus, mais précise l'OID à utiliser
        VALUES ('superbe image', lo_import('/etc/motd', 68583));

    SELECT lo_export(image.donnees, '/tmp/motd') FROM image
        WHERE nom = 'superbe image';

Les fonctions `lo_import` et `lo_export` côté serveur se comportent considérablement différemment de leurs analogues côté client. Ces deux fonctions lisent et écrivent des fichiers dans le système de fichiers du serveur en utilisant les droits du propriétaire du serveur de base de données. Du coup, par défaut, leur utilisation est restreinte aux super-utilisateurs PostgreSQL. Au contraire des fonctions côté serveur, les fonctions d'import et d'export côté client lisent et écrivent des fichiers dans le système de fichiers du client en utilisant les droits du programme client. Les fonctions côté client ne nécessitent pas de droits particuliers sur la base, sauf celui de lire et écrire le « Large Object » en question.

### Attention

Il est possible de donner le droit d'utiliser les fonctions serveurs `lo_import` et `lo_export` à des utilisateurs standards avec l'instruction GRANT mais les implications sur la sécurité doivent être appréhendées avec attention. Un utilisateur mal intentionné avec de tels droits pourrait facilement les utiliser pour devenir super-utilisateur (par exemple en réécrivant les fichiers de configuration du serveur) ou pourrait attaquer le reste du système de fichiers du serveur, sans avoir à se soucier d'obtenir les droits de super-utilisateur de la base de données. L'accès aux rôles ayant de tels droits doit de ce fait être gardé très précautionneusement, tout comme l'accès aux rôles super-utilisateur. Néanmoins, si l'utilisation des fonctions serveurs `lo_import` et `lo_export` sont nécessaires pour certaines tâches de routine, il est plus sûr d'utiliser un rôle avec ces droits qu'un rôle avec les droits complets du super-utilisateur car cela aide à réduire le risque de dommages au niveau des erreurs accidentelles.

Les fonctionnalités de `lo_read` et `lo_write` sont aussi disponibles via des appels côté serveur mais les noms des fonctions diffèrent des interfaces côté client du fait qu'elles ne possèdent pas de tiret bas. Vous devez appeler ces fonctions avec `loread` et `lowrite`.