Rule
in package
このクラスは、バージョンアップ時に「特別な更新処理」を行うためのクラスです。
注意点:
- アップデート処理の実行時には、新しいバージョンで追加されたクラスやメソッドは、まだ読み込まれていないため利用できません。
- そのため、このクラスでは 「オンラインアップデート機能」が追加された v2.8.0 から利用できる機能でのみ実装してください。
例 DB::next() は利用できません。v3.2.0 で追加されたため。
Table of Contents
Constants
- CUSTOM_UNIT_CHUNK_SIZE = 200
- カスタムユニットのデータ移行で一度に取得するユニット数
Properties
- $fromVersion : string
- $toVersion : string
Methods
- pickLatestLastAccessRows() : array<int, array<string, mixed>>
- last_access の行一覧からユーザーごとに最新の1行を選ぶ
- update() : mixed
- 例外的なアップデートを実行
- addGroupConfig() : mixed
- フィールドグループのコンフィグを追加
- addNavigationPublish() : mixed
- navigation_publish = on を追加
- restoreCacheTablePrimaryKey() : void
- キャッシュテーブルの PRIMARY KEY を、欠落しているときだけ復元する。
- restoreLastAccessPrimaryKey() : void
- last_access テーブルの PRIMARY KEY を、欠落しているときだけ復元する。 重複行をユーザーごとに最新の1行へ整理したうえで PRIMARY KEY (last_access_uid) を張り直す。
- updateCustomUnitData() : void
- v3.2.0以前からのアップデート カスタムユニットのフィールドデータをcolumnテーブルからフィールドテーブルに移動
- buildCustomUnitFieldRows() : array<int, array<string, mixed>>
- カスタムユニットのフィールドデータから field テーブルへ挿入する行を組み立てる
- convertCustomUnitChunk() : int
- チャンク単位でカスタムユニットのフィールドデータを field テーブルへ移行する
- convertCustomUnitData() : void
- カスタムユニットのフィールドデータを column テーブルから field テーブルに移動する
- convertPrimaryKeyToSingleId() : void
- 指定テーブルの PRIMARY KEY を ID カラム単体へ張り替える(冪等・重複ガード付き)。
- filterArray() : array<string|int, mixed>
- 配列を再帰的にフィルタリング
- findConvertedCustomUnitKeys() : array<string, true>
- チャンク内ですでに field テーブルへ移行済みのユニットのキーを取得する
- findCustomUnits() : array<int, array<string, mixed>>
- 移行対象のカスタムユニットを主キー順にチャンク取得する
- fixCacheTablesPrimaryKey() : void
- cache_data / cache_tag テーブルの PRIMARY KEY を復元
- fixLastAccessPrimaryKey() : void
- last_access テーブルの PRIMARY KEY を復元
- getCustomUnitKey() : string
- 移行済みかどうかの判定に利用するユニットのキーを返す
- insertCustomUnitFieldRows() : void
- 組み立てた行を field テーブルへ挿入する
- safeLog() : void
- Logger ファサードを防御的に呼び出す。
- update140() : mixed
- v1.4.0以前からのアップデート コンフィグ画面用のconfigフィールドグループを追加
- update142() : mixed
- v1.4.2以前からのアップデート Api_Yahoo_* の名前変更対応
- update150() : mixed
- v1.5.0以前からのアップデート navigation_publish = on を追加
- update2100() : mixed
- v2.10.0以前からのアップデート workflowを
- update3150() : void
- v3.1.50以前からのアップデート フィールドにタイプのカラムを追加 メディアフィールドの検索用インデックスのため
- update320() : void
- v3.2.0以前からのアップデート - カスタムユニットのフィールドデータをcolumnテーブルからフィールドテーブルに移動 - column_align カラムに存在する非表示を acms_column, acms_column_rev テーブルの column_status カラムのデータとして扱えるようにアップデート時にデータコンバートを行う
- update321() : void
- v3.1.55以前からのアップデート
- update3218() : void
- v3.2.18以前からのアップデート エントリーインポートのバグにより壊れたカスタムユニットのメディアフィールドの値を正しい値に修正する
- update3225() : void
- v3.2.25以前からのアップデート
- updateUnitAlignToStatus() : void
- v3.2.0以前からのアップデート column_align カラムに存在する非表示を acms_column, acms_column_rev テーブルの column_status カラムのデータとして扱えるようにアップデート時にデータコンバートを行う 配置は center に変更する
Constants
CUSTOM_UNIT_CHUNK_SIZE
カスタムユニットのデータ移行で一度に取得するユニット数
private
mixed
CUSTOM_UNIT_CHUNK_SIZE
= 200
Properties
$fromVersion
protected
string
$fromVersion
$toVersion
protected
string
$toVersion
Methods
pickLatestLastAccessRows()
last_access の行一覧からユーザーごとに最新の1行を選ぶ
public
static pickLatestLastAccessRows(array<int, array<string, mixed>> $rows) : array<int, array<string, mixed>>
Parameters
- $rows : array<int, array<string, mixed>>
Return values
array<int, array<string, mixed>>update()
例外的なアップデートを実行
public
update(string $fromVersion, string $toVersion) : mixed
Parameters
- $fromVersion : string
- $toVersion : string
addGroupConfig()
フィールドグループのコンフィグを追加
protected
addGroupConfig(string $group, array<string|int, mixed> $vals, null|int $bid[, null|int $rid = null ][, null|int $mid = null ]) : mixed
Parameters
- $group : string
- $vals : array<string|int, mixed>
- $bid : null|int
- $rid : null|int = null
- $mid : null|int = null
addNavigationPublish()
navigation_publish = on を追加
protected
addNavigationPublish(int $bid[, null|int $rid = null ][, null|int $mid = null ]) : mixed
Parameters
- $bid : int
- $rid : null|int = null
- $mid : null|int = null
restoreCacheTablePrimaryKey()
キャッシュテーブルの PRIMARY KEY を、欠落しているときだけ復元する。
protected
restoreCacheTablePrimaryKey(string $table, array<int, string> $primaryKeyColumns) : void
Parameters
- $table : string
-
プレフィックス済みテーブル名
- $primaryKeyColumns : array<int, string>
-
復元する PRIMARY KEY のカラム(複合キーは宣言順)
restoreLastAccessPrimaryKey()
last_access テーブルの PRIMARY KEY を、欠落しているときだけ復元する。 重複行をユーザーごとに最新の1行へ整理したうえで PRIMARY KEY (last_access_uid) を張り直す。
protected
restoreLastAccessPrimaryKey(string $logicalTable) : void
Parameters
- $logicalTable : string
-
プレフィックスを含まない論理テーブル名(SQL ビルダー用)
updateCustomUnitData()
v3.2.0以前からのアップデート カスタムユニットのフィールドデータをcolumnテーブルからフィールドテーブルに移動
protected
updateCustomUnitData() : void
buildCustomUnitFieldRows()
カスタムユニットのフィールドデータから field テーブルへ挿入する行を組み立てる
private
buildCustomUnitFieldRows(Field $field, string $unitId, int $bid, int $revId, bool $isRevision) : array<int, array<string, mixed>>
Parameters
- $field : Field
- $unitId : string
- $bid : int
- $revId : int
- $isRevision : bool
Return values
array<int, array<string, mixed>>convertCustomUnitChunk()
チャンク単位でカスタムユニットのフィールドデータを field テーブルへ移行する
private
convertCustomUnitChunk("field"|"field_rev" $fieldTable, bool $isRevision, array<int, array<string, mixed>> $units) : int
Parameters
- $fieldTable : "field"|"field_rev"
- $isRevision : bool
- $units : array<int, array<string, mixed>>
Return values
int —移行したユニット数
convertCustomUnitData()
カスタムユニットのフィールドデータを column テーブルから field テーブルに移動する
private
convertCustomUnitData("column"|"column_rev" $columnTable, "field"|"field_rev" $fieldTable) : void
カスタムユニットが大量にある環境でもメモリを使い切らないよう、主キー順にチャンク取得して処理する。 すでに field テーブルへ移行済みのユニットはチャンクごとに判定して除外するため、 処理が途中で中断した場合でも、再実行すれば移行できていないユニットだけを続けて処理できる。
Parameters
- $columnTable : "column"|"column_rev"
- $fieldTable : "field"|"field_rev"
convertPrimaryKeyToSingleId()
指定テーブルの PRIMARY KEY を ID カラム単体へ張り替える(冪等・重複ガード付き)。
private
convertPrimaryKeyToSingleId(PrimaryKey $primaryKey, string $table, string $idColumn) : void
すでに ID カラム単体になっていれば何もしない。重複 ID が残っているテーブルは、 PRIMARY KEY 追加が失敗してアップグレードを止めてしまわないよう、スキップして警告ログを残す。
Parameters
- $primaryKey : PrimaryKey
- $table : string
-
プレフィックス無しのテーブル名
- $idColumn : string
-
ID カラム名
filterArray()
配列を再帰的にフィルタリング
private
filterArray(array<string|int, mixed> $data) : array<string|int, mixed>
Why not: Services/Logger/Filter に同等のロジックがあるが、このクラスからは呼ばない。 クラス冒頭の注意にあるとおり、アップデート処理は「差し替え前の古いコードが読み込まれた プロセス」で走る。Filter は LoggerServiceProvider がリクエスト初期に new するため、 ここに到達した時点で「古い Filter の定義がメモリに載っている」状態になる。ファイルが 新しくなっていても既に読み込まれたクラスは差し替わらないので、Filter へ委譲すると 新バージョンで追加・修正した挙動は効かず、シグネチャを変えた場合は fatal になる。
そのため重複を承知でインライン実装のままにする。ここを共通化したくなったら、まず 「アップデート実行時に旧定義がメモリに載っていても壊れないか」を確かめること。
Why not: match / アロー関数 / array_any() / str_contains() を使わない。アップデート処理は リクエスト開始時の古い index.php で走っており、読み込まれている config/polyfill.php も 古い版になる。array_any() の polyfill が入ったのは 3.2.0-alpha.5 なので、3.2.0 より前から アップデートすると undefined function で fatal になる。しかも update321() は setup 経由で 未実行の環境を救うためバージョン比較なしで毎回走るため、3.1.x からの更新で必ず踏む。 match とアロー関数は構文なので polyfill では救えず、古い PHP ではパースエラーになる。 クラス冒頭の「v2.8.0 から利用できる機能でのみ実装する」という制約どおり、素の PHP で書く。
Parameters
- $data : array<string|int, mixed>
Return values
array<string|int, mixed>findConvertedCustomUnitKeys()
チャンク内ですでに field テーブルへ移行済みのユニットのキーを取得する
private
findConvertedCustomUnitKeys("field"|"field_rev" $fieldTable, bool $isRevision, array<int, array<string, mixed>> $units) : array<string, true>
Parameters
- $fieldTable : "field"|"field_rev"
- $isRevision : bool
- $units : array<int, array<string, mixed>>
Return values
array<string, true>findCustomUnits()
移行対象のカスタムユニットを主キー順にチャンク取得する
private
findCustomUnits("column"|"column_rev" $columnTable, bool $isRevision, int $offset) : array<int, array<string, mixed>>
Why not: 直前のチャンクの column_id を条件(column_id > 前回の値)にした、いわゆるカーソル方式に
しない。column_id は varchar だが、SQL ビルダーは数値に見える値との比較を column_id + 0 に
展開するため、比較は数値順、ORDER BY は文字列順という食い違いが起きる。その結果、文字列順では
後ろにあるのに数値としては小さい ID(例: '1976' は '10000' より文字列順では後ろだが数値では
小さい)が、カーソルが追い越した時点で二度と取得されず取りこぼされる。
column / column_rev はこの処理中に変化しないため、OFFSET でページングしても行がずれることはない。
Parameters
- $columnTable : "column"|"column_rev"
- $isRevision : bool
- $offset : int
-
取得開始位置
Return values
array<int, array<string, mixed>>fixCacheTablesPrimaryKey()
cache_data / cache_tag テーブルの PRIMARY KEY を復元
private
fixCacheTablesPrimaryKey() : void
これらのキャッシュテーブルへの書き込みは INSERT ... ON DUPLICATE KEY UPDATE(DB キャッシュ ドライバ。page/config/field/module は既定でこのドライバ)で行われ、「1キー1行」の維持を PRIMARY KEY に依存している。3.2.24 以前の setup「インデックス修復」は PRIMARY を含む全 インデックスを削除する一方で PRIMARY を張り直さなかったため、実行歴のある環境では PRIMARY KEY を失い、以後の書き込みで重複行が蓄積してアップデート時の ADD PRIMARY KEY が失敗する。 last_access と異なり履歴を保持する必要のない純粋なキャッシュのため、重複解消は TRUNCATE で 十分(内容はアクセス時に自動再生成される)。
fixLastAccessPrimaryKey()
last_access テーブルの PRIMARY KEY を復元
private
fixLastAccessPrimaryKey() : void
last_access への書き込みは INSERT ... ON DUPLICATE KEY UPDATE で行われており、 「1ユーザー1行」の維持を PRIMARY KEY (last_access_uid) に依存している。 PRIMARY KEY を失った環境では POST リクエストごとに同一ユーザーの行が増え続け、 last_access を結合するユーザー一覧に同一ユーザーが重複表示される。 重複行をユーザーごとに最新の1行へ整理したうえで PRIMARY KEY を張り直す。
getCustomUnitKey()
移行済みかどうかの判定に利用するユニットのキーを返す
private
getCustomUnitKey(string $unitId, int $revId, bool $isRevision) : string
Parameters
- $unitId : string
- $revId : int
- $isRevision : bool
Return values
stringinsertCustomUnitFieldRows()
組み立てた行を field テーブルへ挿入する
private
insertCustomUnitFieldRows("field"|"field_rev" $fieldTable, array<int, array<string, mixed>> $rows) : void
Why not: SQL::newBulkInsert() でまとめて挿入しない。バルクインサートは v3.2.0 で追加された メソッドで、この移行処理が走るのは v3.2.0 より前からのアップデート時、つまりクラス冒頭の 注意どおり「古い SQL クラスが読み込まれたプロセス」で実行される。ファイルが新しくなって いても既に読み込まれたクラスは差し替わらないため、undefined method で fatal になる。
Parameters
- $fieldTable : "field"|"field_rev"
- $rows : array<int, array<string, mixed>>
safeLog()
Logger ファサードを防御的に呼び出す。
private
safeLog(string $level, string $message[, array<string, mixed> $context = [] ]) : void
アップデート処理はアップグレード元(旧バージョン)のアプリ文脈で実行されることがあり、 後発で追加された Logger サービスがコンテナに未登録の場合がある。ログ出力の失敗が アップグレード自体を止めないよう、クラス存在確認と例外捕捉で保護する。
Parameters
- $level : string
-
'warning' または 'info'
- $message : string
- $context : array<string, mixed> = []
update140()
v1.4.0以前からのアップデート コンフィグ画面用のconfigフィールドグループを追加
private
update140() : mixed
update142()
v1.4.2以前からのアップデート Api_Yahoo_* の名前変更対応
private
update142() : mixed
update150()
v1.5.0以前からのアップデート navigation_publish = on を追加
private
update150() : mixed
update2100()
v2.10.0以前からのアップデート workflowを
private
update2100() : mixed
update3150()
v3.1.50以前からのアップデート フィールドにタイプのカラムを追加 メディアフィールドの検索用インデックスのため
private
update3150() : void
update320()
v3.2.0以前からのアップデート - カスタムユニットのフィールドデータをcolumnテーブルからフィールドテーブルに移動 - column_align カラムに存在する非表示を acms_column, acms_column_rev テーブルの column_status カラムのデータとして扱えるようにアップデート時にデータコンバートを行う
private
update320() : void
update321()
v3.1.55以前からのアップデート
private
update321() : void
監査ログの秘匿化項目をマスク化
update3218()
v3.2.18以前からのアップデート エントリーインポートのバグにより壊れたカスタムユニットのメディアフィールドの値を正しい値に修正する
private
update3218() : void
update3225()
v3.2.25以前からのアップデート
private
update3225() : void
シーケンスで採番するテーブルのうち、ID カラム単体の一意制約を持たないテーブルの PRIMARY KEY を「ID カラム単体」へ張り替える。これにより、移設時のシーケンス未同期などで 同一 ID が重複採番される事故を DB レベルで防止する。
旧来の複合キーは db.index.yaml の定義に従って別インデックスとして自動追加されるため、 本処理は updateIndexs() では実行できない PRIMARY KEY の張り替えのみを担当する。 schedule は 1 件が年月ごとに複数行を持つ仕様のため対象外。
updateUnitAlignToStatus()
v3.2.0以前からのアップデート column_align カラムに存在する非表示を acms_column, acms_column_rev テーブルの column_status カラムのデータとして扱えるようにアップデート時にデータコンバートを行う 配置は center に変更する
private
updateUnitAlignToStatus() : void