All about XC Legacy
Smart Update Summary (3)

Status

update() メソッドが全ての情報構造体のステータスを変更した後、smartUpdateAllOfBlocks() はこれらのステータスをチェックしながら DB を変更していきます。どのように DB が変更されるかはステータスによって決定されます。

smartUpdateBlock_kindsofstatus

Loaded

情報構造体はロードされています。そして、この情報と最新コレクションの別の情報には違いがありません。したがって、この情報に関して DB を変更する必要はありません。

Updated

情報構造体と別の情報には違いがあります。そして、この情報はもう一方の情報によって既に更新されています。従って、この情報に関するデータベースのレコードを更新する必要があります。updateBlockByInfo() はそのためによいユーティリティメソッドです。

Order Updated

情報構造体と別の情報は同じ内容です。しかし、ただオーダーのみが異なります。従って、この情報に関するレコードのオーダーフィールドのみを更新する必要があります。なお、ブロックにはオーダー情報はありません。このステータスはプリファレンスのみに適用されます。

New

現在のコレクションがある情報を持っていなかったとき、それは現在のコレクションへ追加されます。そして、その情報のステータスは 'New' に変更されます。この場合、 DB にそれを挿入する必要があります。InstallBlockByInfo() はそのために良いユーティリティメソッドです。

Deleted

この情報構造体が最新コレクションの中でみつからなかったので、この情報のステータスは'deleted' に変更されています。この場合、それを DB から削除する必要があります。 uinstallBlockByInfo() はそのために良いユーティリティメソッドです。

結論

smartUpdateAllOfBlocks() smartUpdateAllOfPreferences() は非常に便利です、なぜならそれらは私がここ最近で説明した十分なプロセスを実装しているからです。ほとんどの場合、あなたはアップデート処理をこれらのユーティリティメソッドに委ねることができるでしょう。しかし、もしあなたがあなたのフェイズド・アップグレードの中で高度なアップデートを必要とするのであれば、あなたはこれらのクラスを理解するべきです。
|
Smart Update Summary (2)
Smart update for blocks is good to understand the basic activity of these classes. smartUpdateAllOfBlocks() is in Legacy_InstallModuleUtils.

smartUpdateBlock_act01

  • Gets the current collection from DB with ModinfoX2DBReader.
  • Gets the latest collection form xoops_version with ModinfoX2FileReader.
  • Update the current collection with the latest collection.

In these process, the current collection merges the latest collection without losing values if at all possible.

Let's see BlockInfoCollection::update().

    function update(&$collection)
   
{
       
foreach (array_keys($this->mBlocks) as $idx) {
           
$t_block =& $collection->get($this->mBlocks[$idx]->mFuncNum);
           
if ($t_block == null) {
                
if (!$collection->funcExists($this->mBlocks[$idx])) {
                    
$this->mBlocks[$idx]->mStatus = LEGACY_INSTALLINFO_STATUS_DELETED;
               
} else {
                    
$this->mBlocks[$idx]->mStatus = LEGACY_INSTALLINFO_STATUS_UPDATED;
               
}
           
}
           
elseif (!$this->mBlocks[$idx]->isEqual($t_block)) {
               
$this->mBlocks[$idx]->update($t_block);
           
}

Deleted

}
       
       
foreach (array_keys($collection->mBlocks) as $idx) {
           
$func_num = $collection->mBlocks[$idx]->mFuncNum;
           
if (!isset($this->mBlocks[$func_num])) {
               
$this->add($collection->mBlocks[$idx]);
               
$this->mBlocks[$func_num]->mStatus = LEGACY_INSTALLINFO_STATUS_NEW;
           
}
       
}
   
}

BlockInfoCollection::get() is useful to check whether another collection has the same information structure as this collection. If another collection doesn't return an instance with the same key, this block has been deleted in the latest version. In this case, changes the status of the information to "deleted". Because the collection doesn't know how to delete data from a resource, it doesn't have the process to delete. There are several kinds of status.
|
Smart Update Summary (1)
Legacy_ModuleInstallUtils クラスはインストールのための静的メソッドを集めています。このユーティリティの smartUpdateAllOfBlocks() と smartUpdateAllOfPreferences() はブロックとプロパティを迅速に更新します。

この更新プロセスは XOOPS2 および XOOPS2 JP においては厳格ではありませんでした。しかし、 Legacy 2.1 はそれを厳格にしました。私はここに「賢いアップデート」の仕組みを書こうと思います。モジュール開発者はそれを学習する必要はありませんが、もしあなたがカスタム-インストーラを使おうとするのであれば、知っておいた方が良いでしょう。

ユーザーがモジュールを更新しようとするとき、モジュールは2つの情報……DB(現在)と xoops_version (最新)を持っています。アップデートとは DB の値を失う事なく DB を xoops_version で交換するプロセスです。

Smart-update は現在のモジュールのコンフィグレーションと、最新のモジュールのコンフィグレーションの差異を認識します。そのために多くのクラスが定義されています。しかし、これらは一般的なパターンですので、簡単に理解できると思います。

smart01

Legacy_BlockInfomation と Legacy_PreferenceInformation は値を保持し、値を他の構造体と比較するシンプルな構造体です。isEqual() は別の構造体と値を比較します。update() は別の構造体と値をマージします。

smart02

各情報構造体のためにコレクションクラスがあります。コレクションクラスは複数の構造体を保持し、それらを別のコレクションと比較します。 add() は指定された構造体をソートしながらコレクションリストに追加します。update() は別のコレクションと構造体を比較してマージします。

smart03

これらの情報構造体もこれらのコレクションクラスもいかなる保管資源とも結び付いていません。すなわち、これらは DB も xoops_version も参照しません。それをするのはリーダークラスです。リーダークラスは DB や xoops_version といった保管資源をロードすることでコレクションクラスのインスタンスを構築します。将来、新しいフォーマットが登場した場合は、新しいリーダークラスを追加すればよいわけです。
|