Copy-on-Write Object Graph Transactions

THotPDF poskytuje vnorené kontrolné body pre načítané alebo zostavené grafy nepriamych objektov bez klonovania dokumentu na začiatku transakcie

Životný cyklus transakcie

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

BeginGraphTransaction indexuje aktuálne nepriame korene a inštaluje pozorovateľov mutácií, ale nevytvára žiadne snímky; prvý zápis do existujúceho nepriameho koreňa v tomto rámci vytvorí jednu snímku a neskoršie zápisy do toho istého koreňa ju znova použijú

CommitGraphTransaction zachová aktuálny graf a zahodí alebo prenesie snímky bez jeho klonovania; RollbackGraphTransaction obnoví koreňové objekty na mieste, odstráni objekty pridané po kontrolnom bode a obnoví prideľovanie čísel objektov

Vnorené transakcie sú nezávislé kontrolné body; vnútorné vrátenie sa vráti do stavu vstupu vnútornej transakcie, zatiaľ čo vnútorné potvrdenie zachová dostatok histórie pre neskoršie vonkajšie vrátenie

Automatická a explicitná príprava zápisu

THPDFDictionaryObject.AddValue, ReplaceValue a DeleteValue, THPDFArrayObject.AddObject a SetIndexedItem a zmeny THPDFStreamObject.Length automaticky upozornia obklopujúci nepriamy koreň

Verejné skalárne polia a surové bajty prúdu nemôžu zachytiť priradenie; zavolajte PrepareLoadedObjectForWrite pred priradením Value, zmenou verejných príznakov objektu, nahradením ukazovateľov grafu alebo zápisom cez 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;

Pamäť a výkon

Pamäť snímok rastie s dotknutými nepriamymi koreňmi, nie s celkovou veľkosťou dokumentu; veľké užitočné zaťaženia prúdov sa prelievajú do vlastných dočasných súborov po GraphTransactionMemoryThreshold, ktorého predvolená hodnota je 16 MiB

Vrátenie vymení uložené položky slovníka, položky polí a úložisko prúdov späť do existujúceho koreňa, čím sa vyhne druhej hlbokej kópii; ukazovateľ koreňa zostáva stabilný, ale ukazovatele na priamych potomkov sa musia po vrátení znova získať

GetGraphTransactionStatistics vracia Active, hĺbku vnorenia Depth, SnapshotCount, AddedObjectCount, rezidentné a preliate bajty snímok a špičkové rezidentné bajty snímok

THPDFBeforeMutationEvent je podpis pozorovateľa na nízkej úrovni používaný na smerovanie mutácií kontajnera a životného cyklu do snímky obklopujúceho nepriameho koreňa

Rozsah

Transakcie pokrývajú graf nepriamych objektov, stav životného cyklu, pridané korene a prideľovanie čísel objektov; ukazovatele vlastnené volajúcim, polia poradia načítaných stránok, vykreslené vyrovnávacie pamäte a iný vedľajší stav fasády sa neprotokolujú

Neodstraňujte, nepreusporiadavajte ani nenahrádzajte existujúce položky v GetLoadedIndirectObjects, kým je transakcia aktívna; používajte metódy kontajnera grafu a po vrátení znova získajte priamych potomkov