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);
?>
どうということもない内容だが、どうしてこれが出来ないと思いこんでいたのだろうか。
Popularity: 2% [?]
