PHP Conference Nagoya 2025

PDO::pgsqlLOBCreate

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

PDO::pgsqlLOBCreateCria um novo objeto grande

Descrição

public PDO::pgsqlLOBCreate(): string

PDO::pgsqlLOBCreate() cria um objeto grande e retorna o OID desse objeto. Pode-se então abrir um fluxo no objeto usando PDO::pgsqlLOBOpen() para ler ou gravar dados nele. O OID pode ser armazenado em colunas do tipo OID e usado para fazer referência ao objeto grande, sem fazer com que a linha cresça arbitrariamente. O objeto grande continuará no banco de dados até ser removido chamando PDO::pgsqlLOBUnlink().

Objetos grandes podem ter até 2 GB de tamanho, mas são complicados de usar; é necessário garantir que PDO::pgsqlLOBUnlink() seja chamado antes de excluir a última linha que referencia seu OID no banco de dados. Além disso, objetos grandes não possuem controles de acesso. Como alternativa, pode-se experimentar o tipo de coluna bytea; versões recentes do PostgreSQL permitem colunas bytea de até 1 GB de tamanho e gerenciam o armazenamento de forma transparente para obter o tamanho de linha ideal.

Nota: Esta função deve ser chamada dentro de uma transação.

Parâmetros

PDO::pgsqlLOBCreate() não tem nenhum parâmetro.

Valor Retornado

Retorna o OID do objeto grande recentemente criado em caso de sucesso ou false em caso de falha.

Exemplos

Exemplo #1 Um exemplo de PDO::pgsqlLOBCreate()

Este exemplo cria um novo objeto grande e copia nele o conteúdo de um arquivo. O OID é então armazenado em uma tabela.

<?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();
?>

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 2 notes

up
0
Hayley Watson
6 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