MDB2 を使うのって、どのデータベースでも汎用的に使えるようにしたい! っていうのがありますよね。
現在、モバイル用のクローラーを PHP で作っています。
MySQL 用で作ったのですが、他のデータベースでも使えるように MDB2 で作っていました。
PostgreSQLで実験していたら、getAll() で問題が。
元々、MySQL で下のようなコードを plugin/mysql.php に書いてました。
$sql = "SELECT CONCAT(ReqScheme,'://',ReqHost,ReqPath,( CASE WHEN LENGTH(ReqParam) = 0 THEN '' ELSE CONCAT('?',ReqParam) END)) AS Uri FROM RequestReserve WHERE CrawlCode = 0 AND CrawlVersion = ?"; $res =& $db->getAll($sql,null,array($crawlVersion),array("integer"));
crawlVersion は、いつクロールしたかの ID です。
これは問題なく動いていました。
これを PostgreSQL で下記のようなコードを plugin/pgsql.php に書きました。
$sql = "SELECT (ReqScheme || '://' || ReqHost || ReqPath || ( CASE WHEN LENGTH(ReqParam) = 0 THEN '' ELSE '?' || ReqParam END)) AS Uri FROM RequestReserve WHERE CrawlCode = 0 AND CrawlVersion = ?"; $res =& $db->getAll($sql,null,array($crawlVersion),array("integer"));
するとエラーになります。
デバッグとして、下記のコードを加えて実行しました。
echo $res->getMessage() . "\n"; echo $res->getDebugInfo() . "\n";
すると・・・
何かクエリーがおかしいとのこと。
MDB2 Error: syntax error _skipDelimitedStrings: [Error message: query with an unterminated text string specified] [Last executed query: DEALLOCATE PREPARE mdb2_statement_pgsql_xxxxxxxxxxxxxxxxxxxxxxxxx]
psql で実行すると上手くいくのに、mdb2 を通すと上手く実行できません。
MDB2/Extented.php や MDB2/Driver/pgsql.php を辿っていくと、MDB2/Driver/pgsql.php の prepare でおかしいことになっている。
コードを読むと、エラーメッセージの通り、_skipDelimitedString() を実行している部分で。
MDB2.php 内の _skipDelimitedString() を読んでみたが、 シングルクォートとエラーになるようだ。
今回はコードを直すことで対応した。
$sql = "SELECT (ReqScheme || ? || ReqHost || ReqPath || ( CASE WHEN LENGTH(ReqParam) = 0 THEN ? ELSE ? || ReqParam END)) AS Uri FROM RequestReserve WHERE CrawlCode = 0 AND CrawlVersion = ?"; $res =& $db->getAll($sql,null,array("://","","?",$crawlVersion),array("text","text","text","integer"));