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