寫入時複製的物件圖形交易
THotPDF 為已載入或組裝的間接物件圖形提供巢狀儲存點,而不會在交易開始時複製整個文件
交易生命週期
PDF.BeginGraphTransaction('metadata edit');
try
Info.AddStringValue('Producer', 'HotPDF');
PDF.CommitGraphTransaction;
except
PDF.RollbackGraphTransaction;
raise;
end;
BeginGraphTransaction 為目前的間接根建立索引並安裝變更觀察器,但不建立任何快照;在該框架中對現有間接根的第一次寫入會建立一個快照,而對同一根的後續寫入則重用該快照
CommitGraphTransaction 保留目前的圖形,並在不複製它的情況下捨棄或轉移快照;RollbackGraphTransaction 就地還原根物件、移除在儲存點之後附加的物件,並還原物件編號配置
回復會在還原物件之前先讓已載入表單關聯快取失效,之後的欄位查閱會從還原後的圖形重建,而不是保留指向已移除欄位或 widget 的參照
巢狀交易是獨立的儲存點;內層的回復傳回內層的進入狀態,而內層的提交則保留足夠的歷史,供稍後的外層回復使用
自動與明確的寫入準備
THPDFDictionaryObject.AddValue、ReplaceValue 與 DeleteValue、THPDFArrayObject.AddObject 與 SetIndexedItem,以及 THPDFStreamObject.Length 變更會自動通知所屬的間接根
公開純量欄位與原始串流位元組無法攔截指派;請在指派 Value、變更公開物件旗標、取代圖形指標或透過 THPDFStreamObject.Stream 寫入之前呼叫 PrepareLoadedObjectForWrite
PDF.BeginGraphTransaction('raw stream edit');
try
PDF.PrepareLoadedObjectForWrite(StreamObject);
StreamObject.Stream.Size:= 0;
StreamObject.Stream.WriteBuffer(Bytes[0], Length(Bytes));
StreamObject.Length:= Length(Bytes);
PDF.CommitGraphTransaction;
except
PDF.RollbackGraphTransaction;
raise;
end;
記憶體與效能
快照記憶體隨所觸及之間接根的數目增長,而非隨文件總大小增長;大型串流載入在超過 GraphTransactionMemoryThreshold 之後會溢出到所屬的暫存檔,其預設為 16 MiB
回復會把已儲存的字典項目、陣列項目與串流儲存交換回現有的根,避免第二次的深層複製;根指標保持穩定,但對直接後代的指標必須在回復後重新取得
GetGraphTransactionStatistics 傳回 Active、巢狀 Depth、SnapshotCount、AddedObjectCount、駐留與溢出的快照位元組,以及尖峰的駐留快照位元組
THPDFBeforeMutationEvent 是低階觀察器簽章,用於把容器與生命週期變更路由到所屬間接根的快照
範圍
交易涵蓋間接物件圖形、生命週期狀態、附加的根與物件編號配置;呼叫端所屬的指標、已載入頁面排序陣列、轉譯快取與其他外觀端側邊狀態則不會被記錄
交易進行期間請勿移除、重新排序或取代 GetLoadedIndirectObjects 中的現有項目;請使用圖形容器方法,並在回復後重新取得直接後代