Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

1.7.2 の変更内容

1.7.2 は後方互換な Rust API の追加と内部改善を含む。 公開日は 2026-10-31。 以下の API は book feature で有効になる。 Python の公開 API と YBB の保存形式は変更しない。

YBB の差分保存

YbbBook::write_ybb_with_patch と write_ybb_with_patch_with_control は、DB2016 と SBK と共通の BookDatabasePatch を使う。 元ファイルを全件ロードせず、PackedSfen のバイト順で差分を整列マージし、別の空の出力先へ全体を書き直す。 出力先には Write + Seek が必要である。 差分の識別単位は手数を除いた局面であり、同じキーへの最後の編集を採用する。 元データはキーの厳密な昇順と一意性を要求し、手数違いを含む重複があれば空差分でも保存を拒否する。

出力前に全元行の構造、範囲、候補手の符号化とキー順を検査する。 削除または置換される元行も検査する。 元行のキーはバイト列として扱い、局面復元、正準性や合法手の全件検査は行わない。 追加または変更する行は局面、候補手の一意性、合法性と表現可能性を検査し、明示的な手数と評価値を要求する。 元ファイルの depth 有無、未変更行の手数、評価値と候補手順を保持し、表現不能な情報の破棄や値の補完は行わない。

制御付き版は Validating と Writing を通知する。 処理数と総数は元行数を表し、段階切替で処理数を 0 に戻す。 追加差分の処理中には元行処理数が変わらないため、出力件数や全体の完了率には使わない。 キャンセルは協調的であり、単一行の処理やソートの途中での即時中断は保証しない。

保存失敗とキャンセル

元ファイルと出力先には別の保存領域を使い、処理完了まで元ファイルを変更しない。 事前検査と Writing 開始通知までの失敗やキャンセルでは、出力への write、seek と flush を行わない。 書き込み開始後の失敗やキャンセルでは部分出力が残り得る。 reader と差分は変更されないため、新しい空の出力先で再試行できる。

成功は flush の完了を意味し、永続化や元ファイルの置換までを保証しない。 呼び出し側で一時ファイルを作成し、成功後に必要な同期と置換を行う。 この責務分担は DB2016 と SBK の差分保存と同じである。 Native .book の editor は元ファイルへの追記と同期を担当し、保存結果が不確かな場合は SaveUncertain と再オープンを要求する別の契約を持つ。

省メモリ writer と明示的な診断

YbbWriter は全索引を保持せず、上限付きの索引ブロックと候補手ブロックを seek しながら出力する。 file-backed reader と差分による保存の追加メモリは、差分、最大行と固定バッファに比例し、全局面数には比例しない。 BookDatabase::write_ybb では所有 IR、Memory reader では元ファイルの保持領域が別途必要となる。 既存の保存形式と重複行の出力順は維持する。

同一 PackedSfen の全行取得と、進捗通知とキャンセルに対応する diagnose_full を追加する。 通常の open と lookup に重複検出のための全走査は追加しない。 重複や手数違いを確認する場合に、利用側が明示的に全件診断を実行する。 診断や低水準 writer の重複行対応は、差分保存の一意キー要件を緩和しない。