make test で必ず失敗するので PDO_PGSQL におけるラージオブジェクトのサポートは腐っているものとばかり思っていたのですが、実はそうではありませんでした。
なんと、腐っていたのはテストケースの方でした。その発想はなかったわ。
というわけで、ちゃんと LOB の読み書きができるコードを書いておきます。
<?php $testfile = 'test.txt'; // データベースに接続 $db = new PDO('pgsql:dbname=test host=localhost', 'test', 'test'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // (必要なら) テーブルを作成する //$db->exec('CREATE TABLE BLOBS (id SERIAL PRIMARY KEY, bloboid OID)'); // ラージオブジェクトの操作はトランザクション内でしか行えない $db->beginTransaction(); // ラージオブジェクトを作成し、ローカルファイルから内容をコピー $oid = $db->pgsqlLOBCreate(); $stream = $db->pgsqlLOBOpen($oid, 'w'); $local = fopen($testfile, 'rb'); if (!$local) { exit; } stream_copy_to_stream($local, $stream); // ストリームを開放する unset($local, $stream); // OID を指定して挿入するプリペアードステートメントを実行 $stmt = $db->prepare('INSERT INTO BLOBS (bloboid) VALUES (:oid)'); $stmt->bindParam(':oid', $oid); $stmt->execute(); // コミット $db->commit(); unset($stmt); // 再びトランザクション開始 $db->beginTransaction(); // 挿入された値を取得するプリペアードステートメントを実行 $stmt = $db->prepare('SELECT * FROM BLOBS'); $stmt->execute(); // 変数をバインドする $stmt->bindColumn('id', $id, PDO::PARAM_INT); $stmt->bindColumn('bloboid', $oid, PDO::PARAM_LOB); // バインドされた変数に代入する形で値を取得 while ($stmt->fetch(PDO::FETCH_BOUND)) { var_dump($id, $oid, stream_get_contents($db->pgsqlLOBOpen($oid, 'r'))); //$db->pgsqlLOBUnlink($oid); } // コミット $db->commit();
ストリーム/ステートメントの開放は明示的にやらなくても自動で良きに計らってくれるはずですが、一応。