CascadiaPHP 2024

PDO::pgsqlLOBCreate

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL pdo_pgsql >= 1.0.2)

PDO::pgsqlLOBCreateCrée un nouvel objet large

Description

public PDO::pgsqlLOBCreate(): string

PDO::pgsqlLOBCreate() crée un objet large et retourne le OID de cet objet. Vous devrez alors ouvrir un flux sur cet objet en utilisant PDO::pgsqlLOBOpen() pour lire et écrire des données à l'intérieur. Le OID peut être enregistré en colonnes de type OID et doit être utilisé pour référencer l'objet large, sans pour autant augmenter arbitrairement la grandeur des lignes. L'objet large continuera a vivre dans la base de données tant qu'il n'est pas supprimé en appelant PDO::pgsqlLOBUnlink().

Les objets larges peuvent atteindre une taille jusqu'à 2GO, mais sont encombrant à utiliser; vous devez vous assurer que PDO::pgsqlLOBUnlink() est appelée avant de supprimer la dernière ligne qui fait référence son OID de votre base de données. De plus, les objets larges n'ont pas de contrôle d'accès. Comme alternative, essayez la colonne de type BYTEA; les nouvelles versions de PostgreSQL autorisent les colonnes BYTEA à atteindre une taille de 1GO et gère de manière transparente l'enregistrement pour avoir une ligne de taille optimale.

Note: Cette fonction doit être appelée à l'intérieur d'une transaction.

Liste de paramètres

PDO::pgsqlLOBCreate() ne prend aucun paramètre.

Valeurs de retour

Retourne le OID du nouvel objet large créé en cas de réussite ou false en cas d'échec.

Exemples

Exemple #1 Exemple avec PDO::pgsqlLOBCreate()

Cet exemple crée un nouvel objet large et copie le contenu d'un fichier à l'intérieur. Le OID est alors enregistré dans une table.

<?php
$db
= new PDO('pgsql:dbname=test host=localhost', $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$oid = $db->pgsqlLOBCreate();
$stream = $db->pgsqlLOBOpen($oid, 'w');
$local = fopen($filename, 'rb');
stream_copy_to_stream($local, $stream);
$local = null;
$stream = null;
$stmt = $db->prepare("INSERT INTO BLOBS (ident, oid) VALUES (?, ?)");
$stmt->execute(array($some_id, $oid));
$db->commit();
?>

Voir aussi

add a note

User Contributed Notes 2 notes

up
0
Hayley Watson
5 years ago
If you're not plausibly going to be storing more than 1GB of binary data in a single field, you might as well use the normal bytea type instead of LOBbing it.

They won't bloat the table as PostgreSQL would store the larger byte streams outside the table anyway (as Large Object storage does, only transparently) - including compressing them if it helps - while retaining all the binary string functions and operators.
up
0
mauroi at digbang dot com
18 years ago
IMHO, there's a better way to handle the deletion of lob objects than the suggested here. The programmer can easily forget to unlink the lob. With the following trigger, no programmer actions are required.
By the way, one problem with bytea fields is that when you query the database, if you ask for that field, the data is actually retrieved. When you query for and oid, only the oid is retrieved and then you can open the lob whenever you want (if it's required).

CREATE OR REPLACE FUNCTION oidtable_after_update_delete()
RETURNS "trigger" AS
$BODY$
BEGIN
IF (TG_OP = 'UPDATE') THEN
IF (OLD.oidfield = NEW.oidfield) OR (OLD.oidfield IS NULL) THEN
RETURN NEW;
END IF;
END IF;
IF (EXISTS (SELECT 1 FROM pg_largeobject WHERE loid = OLD.oidfield)) THEN
PERFORM LO_UNLINK (OLD.oidfield);
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER oidtable_after_update_delete
AFTER UPDATE OR DELETE
ON oidtable
FOR EACH ROW
EXECUTE PROCEDURE oidtable_after_update_delete();
To Top