夫です。
先日に引き続きDrupalのモジュールネタです。
potgresqlを使ったDrupalでうまく動かないモジュールとしてbrowscap(http://drupal.org/project/browscap)モジュールがあります。
Browscapモジュールは、サイトを見てくれた人が、どんなブラウザを使っていたのか、統計情報を取得し、上位のモジュールと組み合わせると、ブラウザ、ユーザ環境に特化したHTMLを生成することができるとのことです。
Browscapモジュールは、Browser Capabilities Project(http://browsers.garykeith.com/downloads.asp)から、最新のブラウザ情報一覧を取り込み、基本データベースを生成するのですが、このデータベース生成にMySQL出しか使えない、"REPLACE INTO" 構文が使用されています。
このSQL構文を、普遍的なSQLである、SELECT文の結果を見て、INSERTもしくはUPDATEを行う処理に変更しないと、postgresqlではうまく動いてくれません。
ということで早速以下のように修正しました。上記以外にも、若干SELECT文がpostgresqlではうまく動かない点を修正してあります。
Written by Takashi Ikebe (iktaka at gmail.com)
--- browscap.module.org 2008-08-27 19:54:42.000000000 +0900
+++ browscap.module 2008-08-28 19:37:54.000000000 +0900
@@ -201,7 +201,7 @@
$result = pager_query($query, 50, 0, $query_cnt);
while ($useragent = db_fetch_object($result)) {
- if (db_result(db_query_range('SELECT useragent FROM {browscap} WHERE useragent = "%s"', $useragent->parent, 0, 1))) {
+ if (db_result(db_query_range("SELECT useragent FROM {browscap} WHERE useragent = '%s'", $useragent->parent, 0, 1))) {
$parent = l($useragent->parent, 'admin/reports/browscap/useragent/'. urlencode($useragent->parent));
}
else {
@@ -332,7 +332,18 @@
}
$useragent = strtr($key, '*?', '%_');
$e = array_change_key_case($e);
- db_query("REPLACE INTO {browscap} (useragent, data) VALUES('%s','%s')", $useragent, serialize($e));
+ switch ($GLOBALS['db_type']) {
+ case 'mysql':
+ case 'mysqli':
+ db_query("REPLACE INTO {browscap} (useragent, data) VALUES('%s','%s')", $useragent, serialize($e));
+ case 'pgsql':
+ $ret = db_result(db_query("SELECT useragent FROM {browscap} WHERE useragent= '%s'", $useragent));
+ if($ret==FALSE){
+ db_query("INSERT INTO {browscap} (useragent, data) VALUES('%s','%s')", $useragent, serialize($e));
+ }else{
+ db_query("UPDATE {browscap} SET (useragent, data) VALUES('%s','%s') WHERE useragent=%s'", $useragent, serialize($e), $useragent);
+ }
+ }
}
cache_clear_all('*', 'cache_browscap', TRUE);
@@ -373,7 +384,7 @@
drupal_not_found();
return;
}
- $row = db_fetch_object(db_query('SELECT * FROM {browscap} WHERE useragent = "%s"', $useragent));
+ $row = db_fetch_object(db_query("SELECT * FROM {browscap} WHERE useragent = '%s'", $useragent));
if (!$row) {
drupal_not_found();
return;
処理自体はシンプルです。一応Drupal本家にも投稿しておきましたが、取り込まれるかはわからないので・・・。
どなたかのお役に立てば幸いです。
8/29:一部機能がうまく動かない部分を追加修正