「カード参照番号の重複」というエラーが出ていた.これは,UndoProcess→ RestoreNumlistの実行によって引き起こされている.現行版では基準ソート時のRenumberを止めてあるので,Numlistの更新は不要と考えられるので,暫定的に停止することによって解消した.これでかなり落ち着いたのではないかと思う.⇒現在,CheckDataLinkを無動作にしていることもあるが,現在実行している再現手順ではまったく障害が発生しなくなっている.
重点的に見直す必要があるのはUNDO処理に他ならないが,UNDO中にはある程度までは不整合が生じるのは避けられないので,とりあえず,出口検査だけに絞っておこう.⇒問題なく動作している.再現リストの手順をチェックしておこう.テストは起動直後に実行するという規定になっているが,連続的にテストしてもよいだろう.⇒まったく問題なさそうだ.さて,気になる点をチェックしておこう.⇒いや,まず,ここでバックアップを取っておこう.
- 現行では基準ソート時のRenumberを停止している.これを復活させたときの動作を確認する ⇒ 将来的には参照番号をユーザから完全に遮蔽することも考えられる.最初のころの仕様では,系統並び替えを実行すると基準ノードがテーブルの先頭に来るようになっていたような気もするのだが… 参照番号をユーザからアクセスできない内部コードとしてしまうのであれば,基準ソートという操作そのものがなくなることになる.⇒いずれにしても,Renumberを復活させて機能していることを確認しておくことは必要だろう.
- UndoProcessでNumlistの更新を停止しているが,その是非を確認する ⇒ 現行ではRenumberしていないので,UNDOでNumlistを更新しないというので特に問題はないが,なぜエラーが発生しているのかを突き止めておく必要はある.現行通り,参照番号をユーザに公開するという仕様が存続する場合には,Numlistの更新も必要になってくる.
- 基準ソート時にRenumberを実施することの得失を考える ⇒ 基準ソートすると飛び飛びの参照番号が通し番号になるというのは仕様的には妥当である.基準ソート時にはRenumberを実施するという方向で調整すべきではないか?
- 検査ルーチンをCheckRoutine.cppに集約し,①副作用のある検査ルーチンと②副作用のない検査ルーチンを峻別する ⇒ 大体整理できたのではないかと思う.名前がCheckで始まる関数は検査ルーチンに限定した方がよい.
- 現行のNODULE::slottypeはオリジナルの仕様で動作している これでフィックスすることの可否 ⇒ 問題が起きなければ,これでよいと思う.これは当初設計が妥当ということを意味する.
- 現行のUndoProcess→ UNDONODE::CountupReferenceで行っているUndoCopyの動作の可否 ⇒ 参照復元操作の見直し@20230104の破棄 ⇒ 当初設計に沿った仕様であり基本的には妥当である.
- recnとrefnumの相違を確立する ⇒ アプリからはrecnでアクセスする場合とrefnumで検索される場合がある.一覧表の操作はすべてrecnで行うのが原則である.アプリからアクセスするときのrecnとは,lookupテーブルのレコード番号ないし,xxxリストと呼ばれる各種テーブルのレコード番号であり,リンクテーブルのrecnとは対象が異なる.
- CLEARTABLEでは参照番号エラーを無視する@20221230 ⇒ CLEARTABLEでもすべての参照番号エラーを検査できるようにする.最終目標の「完全にシームレスなシステム」を実現する.
- CheckStaticMargDataは実動作のとき引数がNULL ⇒ 引数がNULLで検査ではなく,実動作の場合はNULLとし,ダンプを見ればどこでエラーが発生しているかが見えるようにすべきだ.
- 仮修正をフィックスする ⇒ 作業完了した
フィックスした仮修正
- MARGLINK::CheckMargLink 夫/妻カード結婚リンク不在で停止→ 例外をスローするを廃止⇒停止しない
- LINKTABLE::CheckDataLink,LINKTABLE::CheckDataLink 副作用のある動作を抑制
- MARGLINK::CheckMargDataLink,CARDLINK::CheckCardDataLink 修正版に切り替え
- COUPLING::InitLinkTable 参照番号が上限を超えている⇒廃止
- UNDOSYSTEM::UndoProcess 選択リストと実カウントの不一致⇒停止しない
- BASETABLE::getnewRefnum ++maxrefnum⇒emptyrecnを返す
- BASETABLE::emptyrecn getmaxrecn+1を返す⇒maxrefnum+1がレンジ内ならmaxrefnum+1を返す.でなければ空スロット番号を返す
- その他
ここでバックアップ.⇒保留中の修正をフィックスする.
-
- 参照復元操作の見直し@20230104 ⇒ オリジナルの仕様でFIX
- 参照リンクであるか否かの判定@20221228 ⇒ 廃止
- getGenerationの代わりにGetGenerationを使う@20221222 ⇒ getGenerationは絶対座標系では使えない ⇒ 確定
- CommandEndに処理結果を渡す@20221224 ⇒ コマンドの実行結果をCommandEndに渡す必要がある.「アプリケーションの処理結果が負の場合は,コマンドを削除して復帰」 ⇒確定
- setRefnumはCARDBASEで実行する@20230107 ⇒ refnumはCARDDATAとPERSONALでシェアしている ⇒ 確定
- 並び替えではリンクテーブルは操作しない@20221228 ⇒ ClearTableで結婚リンクの参照番号がテーブルサイズを超えた場合をエラーとしない
- 参照番号は必ずしも通番ではない@20220214 ⇒ CARDTABLE::makelinkでカードリンクの参照番号がテーブルサイズを超えた場合をエラーとしない
- ChangeRealReferenceの引数righthandを廃止@20210323 ⇒ かなり昔の修正 ⇒ 確定