Wiki(ewiki)でバイナリファイルをアップデートしても情報が更新されていない問題

Wiki(ewiki)でバイナリファイルをアップデートしても情報が更新されていない問題

- Tatsuya Shirai の投稿
返信数: 2

 ewikiで画像データをアップロードしてあるとします.

 その画像のサイズ(縦/横幅)を変更して改めてアップロードしても,データベースに最初に登録した画像のサイズの情報が新しい画像のデータに更新されません.最初の画像が大きかった場合,小さな画像に更新すると画像が引き伸ばされて表示されてしまいます.これはデータベース中にwidthとheightのmeta情報が登録され,HTML出力する際にはその情報を利用して<IMG>タグで表示されるためのようです.なお,画像ファイル自体はmoddataにアップロードされて置き換えられるので画像は変化します.

 mod/wiki/ewiki/ewiki.phpのfunction ewiki_binary_save_image()の終わりの方を見てみると,既にアップロード済みのファイルの場合はewiki_database()を呼んでいません.以下のようにaction引数を"WRITE"ではなく"OVERWRITE"にして追加してみた所,いまのところ正しく動作しているようです.

   #-- write if not exist
   $exists = ewiki_database("FIND", array($id));
   if (! $exists[$id] ) {
      $result = ewiki_database("WRITE", $data);
      ewiki_log("saving of '$id': " . ($result ? "ok" : "error"));
   }
   else {
// (Shirai101): ここから追加
      $result = ewiki_database("OVERWRITE", $data);
// (Shirai101): ここまで追加
      ewiki_log("binary_save_image: '$id' was already in the database", 2);
   }

   return($id);
}

なお,完全にコードを理解して動作確認をした訳ではありません.一応,Trackerには報告しました(MDL-17305).

Tatsuya Shirai への返信

Re: Wiki(ewiki)でバイナリファイルをアップデートしても情報が更新されていない問題

- Tatsuya Shirai の投稿

失礼!

 先ほどチェックした時はうまく機能したのですが,いま再び試したらダメでした.
 もう少しチェックが必要そうです.

Tatsuya Shirai への返信

Re: Wiki(ewiki)でバイナリファイルをアップデートしても情報が更新されていない問題

- Tatsuya Shirai の投稿

 なぜ最初のチェックがうまく動いたのか良く分からないのですが...取り合えずいまは以下の修正でなんとか動いています.

 問題は,ewiki_database()の"OVERWRITE"です.コマンドとしてOVERWRITEを送ると,内部(MySQLの場合)はコマンドを"REPLACE"に置き換えます.ちなみにWRITEの場合は"INSERT"です.ところがswitch文に意図的かどうか分からないのですが細工がしてあり,case "OVERWRITE"でコマンドを"REPLACE"に置き換えた後に何もしないでbreakする.breakを外して直後のcase "WRITE"に突入させるとコマンドは"INSERT"に置き換えられてしまうので,もし既にコマンドが設定されていない場合のみ"INSERT"に置き換えるように設定する.これでコマンドは"REPLACE"で,その他の情報は"INSERT"と同様にセットアップ(シリアライズなど)されるのですが,その先でFatal errorが発生します.case "WRITE"の場合のコード中に「コマンドが"REPLACE"であったら古いテーブルをまず削除せよ」というコードが存在します.当初はcase "OVERWRITE"でcase "WRITE"に突入するように作成されていたと思われる根拠です.でもそのコード中のdelete_record()が存在しないのでFatal error...存在するのはdelete_records()です! バグですね.まぁ,case "OVERWRITE"(つまりコマンドがREPLACEの場合)は直ぐにbreakするようにコードが書かれているので,このdelete_record()を呼ばれることは無いのですが...

 何らかの意図でewiki_database("OVERWRITE",*)は封印されている雰囲気ですので,これを使うのは諦めます.その代わり,ewiki_database("DELETE",*)で現在の画像ファイルのテーブルを削除し,新規にewiki_database(WRITE",*)で登録し直すことにしました.多分,DELETEはメンテナンスされているでしょう(未確認).

   #-- write if not exist
   $exists = ewiki_database("FIND", array($id));
   if (! $exists[$id] ) {
      $result = ewiki_database("WRITE", $data);
      ewiki_log("saving of '$id': " . ($result ? "ok" : "error"));
   }
   else {
// (Shirai101): ここから追加
      $result = ewiki_database("DELETE", $data);
      $result = ewiki_database("WRITE", $data);
// (Shirai101): ここまで追加
      ewiki_log("binary_save_image: '$id' was already in the database", 2);
   }

ewiki_database("DELETE",*)の戻り値はarray()のnulですので,成功したのか失敗したのか...ewiki_database("WRITE",*)はtrueを返します.


 バイナリの画像ファイルをアップロードすると,ページのバージョンは1で決め打ちのはずが,なぜかバージョン2が存在することがありました.今回はこれが原因で動作確認が遅れました.そういえばデバッグ中にファイル名の取り扱いにミスがあり,画像ファイルのmimeタイプが正しく認識されないことがありました.その際にアップロードした画像ファイルは単なるバイナリファイルと認識されて,それでバージョンが2に上がってしまったのかも知れません.いくら新しい画像ファイルをアップロードしても(それはバージョン1として記録されるため)過去にアップロードしたバージョン2の情報が利用されてしまい,表示が全く更新されませんでした.キャッシュやなにやら色々とチェックして時間を浪費しました(少し仕組みには詳しくなりましたが...).