はじめに
プリザンターではそれぞれのサイトの設定をJSON型式でデータベースに格納しています。機能の追加などの過程で設定を保持しているプロパティが追加されていますが、原則は互換性を破壊しないように追加のみでリネームや削除はできるだけおこなわないようになっています。
ただし、どうしても変更しないといけないシーンが出てくるため、内部的に新しいバージョンに対応出来るように設定を書き換えるマイグレーションの機能があります。今回は、その機能を紹介します。
実装をみてみよう
まずは、設定を保持しているモデルを見てみます。SiteSettingsになります。
これがJSONにシリアライズされ、データベースのSitesテーブルのSiteSettingsフィールドに格納されています。重要なのはVersionプロパティになります。
前方互換性のないSiteSettingsのプロパティの変更がおこなわれた場合は、このVersionがインクリメントされます。プログラム的には古いバージョンのSiteSettingsが読み込まれた場合は、SiteSettingsMigratorによって、SiteSettingsのマイグレーションがおこなわれます。
このマイグレーション操作がバージョンアップ方向にしか定義されていないため、SiteSettingsのバージョンの後方方向へのダウングレードができないという制約がついています。
通常のプロパティの追加パターンだとJSONからモデルにデシリアライズするときには追加されたプロパティは読み飛ばされるので、バージョンダウンに与える影響はありません。(もちろんデータベース構造が変更になるときには、ここ以外で引っかかる部分は出てきますが)
過去のバージョンを見てみよう
現行のバージョンは1.017となっています。これは本体バージョンの1.2.20.0で変更されたものになります。
1.017に至るまでのバージョンの変遷を追ってみましょう。GitHubの公式レポジトリではEnterprise Edition導入のタイミングで過去のコミットが一括削除されているので、完全には追えないので注意が必要です。
リネームされたプロパティ
| バージョン |
変更前 |
変更後 |
| 1.002 |
Column.GridDateTime |
Column.GridFormat |
| 1.002 |
Column.ControlDateTime |
Column.EditorFormat |
| 1.004 |
GridColumnsOrder |
GridColumns |
| 1.004 |
FilterColumnsOrder |
FilterColumns |
| 1.004 |
EditorColumnsOrder |
EditorColumns |
| 1.004 |
TitleColumnsOrder |
TitleColumns |
| 1.004 |
LinkColumnsOrder |
LinkColumns |
| 1.004 |
HistoryColumnsOrder |
HistoryColumns |
| 1.006 |
Column.ControlFormat |
Column.EditorFormat |
| 1.007 |
ColumnCollection |
Columns |
| 1.007 |
AggregationCollection |
Aggregations |
| 1.007 |
LinkCollection |
Links |
| 1.007 |
SummaryCollection |
Summaries |
| 1.009 |
View.KambanGroupBy |
View.KambanGroupByX |
| 1.013 |
View.CalendarColumn |
View.CalendarFromTo |
| 1.014 |
ColumnAccessControl.AllowedUsers |
ColumnAccessControl.RecordUsers |
データ構造が変更されたプロパティ
| バージョン |
変更前 |
変更後 |
| 1.003 |
LinkColumnSiteIdHash (Dictionary) |
LinkCollection (List<Link>) |
| 1.005 |
FormulaHash (Dictionary) |
Formulas (SettingList<FormulaSet>) |
| 1.012 |
NewStyle, EditStyle, GridStyle
|
Styles (SettingList<Style>) |
| 1.012 |
NewScript, EditScript, GridScript
|
Scripts (SettingList<Script>) |
| 1.016 |
EditInDialog (bool?) |
GridEditorType (GridEditorTypes) |
| 1.017 |
EditorColumns (List<string>) |
EditorColumnHash (Dictionary) |
追加されたプロパティ
| バージョン |
プロパティ |
| 1.008 |
Notification.Id |
| 1.011 |
ViewLatestId |
| 1.017 |
Sections, SectionLatestId
|
バージョン別マイグレーション内容
Version 1.001
追加
-
Version プロパティを追加(decimal型)
-
Migrated プロパティを追加(NonSerialized)
-
OnDeserialized でマイグレーション処理を呼び出し
Version 1.002
リネーム
| 変更前 |
変更後 |
Column.GridDateTime |
Column.GridFormat |
Column.ControlDateTime |
Column.EditorFormat |
Version 1.003
変更
| 変更前 |
変更後 |
LinkColumnSiteIdHash (Dictionary) |
LinkCollection (List<Link>) |
-
LinkColumnSiteIdHash を LinkCollection に変換
Version 1.004
リネーム
| 変更前 |
変更後 |
GridColumnsOrder |
GridColumns |
FilterColumnsOrder |
FilterColumns |
EditorColumnsOrder |
EditorColumns |
TitleColumnsOrder |
TitleColumns |
LinkColumnsOrder |
LinkColumns |
HistoryColumnsOrder |
HistoryColumns |
Version 1.005
変更
| 変更前 |
変更後 |
FormulaHash (Dictionary<string, Formula>) |
Formulas (SettingList<FormulaSet>) |
- Dictionary形式から SettingList形式に変換
Version 1.006
リネーム
| 変更前 |
変更後 |
Column.ControlFormat |
Column.EditorFormat |
-
ControlFormat を EditorFormat にリネーム
Version 1.007
リネーム
| 変更前 |
変更後 |
ColumnCollection |
Columns |
AggregationCollection |
Aggregations |
LinkCollection |
Links |
SummaryCollection |
Summaries |
Version 1.008
拡張
-
Notifications の各項目に Id プロパティを追加
- インデックス(1から開始)を
Id として設定
Version 1.009
リネーム
| 変更前 |
変更後 |
View.KambanGroupBy |
View.KambanGroupByX |
Version 1.010
変更
-
EditorColumns に "Comments" を追加(未設定の場合)
Version 1.011
追加
-
ViewLatestId プロパティを追加
- 既存の
Views から最大の Id を計算して設定
Version 1.012
削除
NewStyle
EditStyle
GridStyle
NewScript
EditScript
GridScript
追加
-
Styles (SettingList<Style>)
-
Scripts (SettingList<Script>)
変更
-
NewStyle → Styles に New = true として追加
-
EditStyle → Styles に Edit = true として追加
-
GridStyle → Styles に Index = true として追加
Version 1.013
リネーム
| 変更前 |
変更後 |
View.CalendarColumn |
View.CalendarFromTo |
Version 1.014
リネーム
| 変更前 |
変更後 |
ColumnAccessControl.AllowedUsers |
ColumnAccessControl.RecordUsers |
対象コレクション:
CreateColumnAccessControls
ReadColumnAccessControls
UpdateColumnAccessControls
Version 1.015
変更
-
Export.Join のデータを ExportColumn.ColumnName に統合
-
ExportColumn.SiteId を null に設定
-
Export.Join を null に設定
Version 1.016
変更
| 変更前 |
変更後 |
EditInDialog = true |
GridEditorType = GridEditorTypes.Dialog |
Version 1.017
変更
| 変更前 |
変更後 |
EditorColumns (List<string>) |
EditorColumnHash (Dictionary<string, List<string>>) |
- カラムのセクション情報を
Sections リストに追加
-
Column.Section プロパティを null に設定
- タブ・セクション機能のための新規プロパティ追加
まとめ
今回はサイト設定の変遷を紹介しました。構築時期が古い環境でAPIでSiteSettingsを触るときなど1.017以外のバージョンを触るときなど、プロパティの読み換えが必要な時に参考にしてみてください。