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

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

- Tatsuya Shirai の投稿
返信数: 0

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

 問題は,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の情報が利用されてしまい,表示が全く更新されませんでした.キャッシュやなにやら色々とチェックして時間を浪費しました(少し仕組みには詳しくなりましたが...).