2004年10月14日

エントリー保存時にインデックスをリビルドしない

前のエントリーに引き続き、次々エントリーを編集したいときの話。
次々エントリーを編集していくときは、一つ保存するたびにいちいちインデックスをリビルドされると時間とCPUの無駄。なのでリビルド権限のないユーザーを作って試してみたが、エントリー保存の際は権限がなくてもリビルドしてしまう。そこでlib/MT.pmを読んでみると、コード中のコメントに、エントリの依存関係を考慮するのは大変だから前後のエントリーとインデックスは決め打ちでまとめてリビルドしちゃうよーんとか書いてある。一応 BuildDependencies というフラグがあるので、これを利用して他のファイルをリビルドしないように変更する。

lib/MT/App/CMS.pm 2320行目

$app->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or return;
if ($perms->can_rebuild) { $app->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or return; } else { $app->rebuild_entry( Entry => $entry, BuildDependencies => 0 ) or return; }
に変更。

これでリビルド権限のないユーザーで入って編集しているときはエントリー自身以外のファイルはリビルドされなくなった。リビルドしたいときは権限を持ったユーザーで入り直してリビルドする。

追記
しかし考えてみるとエントリー自身のリビルドも無駄。エントリーのタイトルなどを変更した場合はIndividual Archiveをまとめてリビルドしないと前後のエントリーの<MTEntryPrevious>や<MTEntryNext>に表示されるタイトルが古いままになってしまう。Individual Archiveをまとめてリビルドすれば編集したエントリー自身も当然リビルドされるので、二重にリビルドすることになる。

そもそも権限がなくてもリビルドされるようになっているのは、そうじゃないと普通は不便だからだが、ここにあげているような状況の場合は逆に厳密に権限に従うのが理に適っている。
というわけで結局上記の変更は破棄して以下のようにした。

lib/MT/App/CMS.pm 1747行目

if ($obj->status == MT::Entry::RELEASE() || $status_old eq MT::Entry::RELEASE()) {
if ( ($obj->status == MT::Entry::RELEASE() || $status_old eq MT::Entry::RELEASE() ) && $perms->can_rebuild) {
に変更。 Posted by jiro at 2004年10月14日 07:08 | トラックバック (0)
コメント
コメントする









名前、アドレスを登録しますか?