T

PostgreSQL小ネタ

PostgreSQLのラージオブジェクトについて、妙なことを聞かされて以下のようなことを無条件に信じていたのだが。

  • PHPでリモートサーバ上のPostgreSQLに格納されたラージオブジェクトを取得することはできない
  • なぜなら、pg_lo_exportはローカルのファイルパスを指定できるが、それだとリモートサーバ上にファイルが書きだされるだけだから

どう考えても納得できないので、試してみたらやっぱり間違っていた。もっとも、pg_lo_exportは使わなかったが。以下がサンプル。

<?php

require_once 'DB.php';

$dsn = array(
'hostspec' => '192.168.0.0',//どっかのリモートサーバ
'phptype' => 'pgsql',
'database' => 'test',
'username' => 'postgres',
'port' => '5432',
);

$db = DB::connect($dsn);

$file = './orig.png';
$to_file = './test.png';
$content = '';

//まずインポートしてPostgreSQL上にラージオブジェクトを作成
$db->query("BEGIN");
$pid = pg_lo_import($db->connection, $file);
$db->query("COMMIT");

//取り出し
$db->query("BEGIN");
if($lo = pg_lo_open($db->connection, $pid, 'r') !== false){
        do{
                $data = pg_lo_read($lo);
                if(strlen($data) == 0){
                        break;
                }
                $content .= $data;
        }while(true);
}
$db->query("COMMIT");
$db->disconnect();

//書き出し
$fp = fopen($to_file, 'w');
fputs($fp, $content);
fclose($fp);

?>

どうということもない内容だが、どうしてこれが出来ないと思いこんでいたのだろうか。

Posted by on 1月 1, 2009 in PHP, PostgreSQL

コメントを残す