ユーザログイン


Drupalのbrowscapモジュールとpostgresでのエラー

夫です。

先日に引き続き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:一部機能がうまく動かない部分を追加修正

この記事をはてなブックマーク: