Transaksi Graph Objek Copy-on-Write

THotPDF menyediakan savepoint bertingkat untuk graph objek tidak langsung yang dimuat atau dirakit tanpa mengkloning dokumen di awal transaksi

Siklus hidup transaksi

PDF.BeginGraphTransaction('metadata edit');
try
  Info.AddStringValue('Producer', 'HotPDF');
  PDF.CommitGraphTransaction;
except
  PDF.RollbackGraphTransaction;
  raise;
end;

BeginGraphTransaction mengindeks akar tidak langsung saat ini dan memasang observer mutasi tetapi tidak membuat snapshot; penulisan pertama ke akar tidak langsung yang ada dalam bingkai itu membuat satu snapshot, dan penulisan berikutnya ke akar yang sama menggunakannya kembali

CommitGraphTransaction mempertahankan graph saat ini dan membuang atau mentransfer snapshot tanpa mengkloningnya; RollbackGraphTransaction memulihkan objek akar di tempat, menghapus objek yang ditambahkan setelah savepoint, dan memulihkan alokasi nomor objek

Transaksi bertingkat adalah savepoint independen; rollback dalam mengembalikan ke status masuk dalam, sementara commit dalam mempertahankan cukup riwayat untuk rollback luar nanti

Persiapan penulisan otomatis dan eksplisit

THPDFDictionaryObject.AddValue, ReplaceValue, dan DeleteValue, THPDFArrayObject.AddObject dan SetIndexedItem, serta perubahan THPDFStreamObject.Length memberi tahu akar tidak langsung penutup secara otomatis

Bidang skalar publik dan byte stream mentah tidak dapat mencegat penugasan; panggil PrepareLoadedObjectForWrite sebelum menetapkan Value, mengubah flag objek publik, mengganti pointer graph, atau menulis melalui THPDFStreamObject.Stream

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;

Memori dan performa

Memori snapshot tumbuh seiring akar tidak langsung yang disentuh, bukan ukuran dokumen total; payload stream besar tumpah ke file sementara yang dimiliki setelah GraphTransactionMemoryThreshold, yang default-nya 16 MiB

Rollback menukar entri dictionary tersimpan, item array, dan penyimpanan stream kembali ke akar yang ada, menghindari salinan dalam kedua; pointer akar tetap stabil, tetapi pointer ke turunan langsung harus diperoleh kembali setelah rollback

GetGraphTransactionStatistics mengembalikan Active, Depth bertingkat, SnapshotCount, AddedObjectCount, byte snapshot residen dan tumpah, serta byte snapshot residen puncak

THPDFBeforeMutationEvent adalah tanda tangan observer tingkat rendah yang digunakan untuk merutekan mutasi kontainer dan siklus hidup ke snapshot akar tidak langsung penutup

Cakupan

Transaksi mencakup graph objek tidak langsung, status siklus hidup, akar yang ditambahkan, dan alokasi nomor objek; pointer milik pemanggil, array urutan halaman yang dimuat, cache yang dirender, dan status sisi fasad lainnya tidak dijurnal

Jangan menghapus, mengurutkan ulang, atau mengganti entri yang ada di GetLoadedIndirectObjects sementara transaksi aktif; gunakan metode kontainer graph dan peroleh kembali turunan langsung setelah rollback