Copy-on-Write-objektgraf-transaktioner

THotPDF tillhandahåller nästlade savepoints för inlästa eller sammansatta indirekta-objektgrafer utan att klona dokumentet vid transaktionsstart

Transaktionslivscykel

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

BeginGraphTransaction indexerar de aktuella indirekta rötterna och installerar muteringsobservatörer men skapar inga snapshots; den första skrivningen till en befintlig indirekt rot i den ramen skapar en snapshot, och senare skrivningar till samma rot återanvänder den

CommitGraphTransaction behåller den aktuella grafen och slänger eller överför snapshots utan att klona den; RollbackGraphTransaction återställer rotobjekt på plats, tar bort objekt som lagts till efter savepointen och återställer objektnummerallokering

Rollback ogiltigförklarar cachen för inlästa formulärrelationer innan objekten återställs, så att senare fältuppslag byggs om från den återställda grafen i stället för att behålla referenser till borttagna fält eller widgetar

Nästlade transaktioner är oberoende savepoints; en inre rollback återgår till det inre ingångstillståndet, medan en inre commit behåller tillräckligt mycket historik för en senare yttre rollback

Automatisk och explicit skrivförberedelse

THPDFDictionaryObject.AddValue, ReplaceValue och DeleteValue, THPDFArrayObject.AddObject och SetIndexedItem samt THPDFStreamObject.Length-ändringar meddelar den omslutande indirekta roten automatiskt

Offentliga skalärfält och råa strömbytes kan inte fånga upp tilldelning; anropa PrepareLoadedObjectForWrite före tilldelning av Value, ändring av offentliga objektflaggor, ersättning av grafpekare eller skrivning genom 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;

Minne och prestanda

Snapshotminne växer med berörda indirekta rötter i stället för total dokumentstorlek; stora strömnyttolaster spills till ägda temporära filer efter GraphTransactionMemoryThreshold, vars standardvärde är 16 MiB

Rollback byter tillbaka sparade ordliste-poster, arrayelement och strömlagring in i den befintliga roten, vilket undviker en andra djupkopiering; rotpekaren förblir stabil, men pekare till direkta avkomlingar måste återanskaffas efter rollback

GetGraphTransactionStatistics returnerar Active, nästlings-Depth, SnapshotCount, AddedObjectCount, residenta och spillda snapshotbytes samt topp-residenta snapshotbytes

THPDFBeforeMutationEvent är den lågnivåobservatörssignaturen som används för att dirigera behållar- och livscykelmutationer till den omslutande indirekta-rot-snapshoten

Omfattning

Transaktioner täcker den indirekta objektgrafen, livscykeltillstånd, tillagda rötter och objektnummerallokering; anropare-ägda pekare, sid-ordningsarrayer för inlästa sidor, renderade cachear och annat fasadsidstillstånd journalförs inte

Ta inte bort, omordna eller ersätt befintliga poster i GetLoadedIndirectObjects medan en transaktion är aktiv; använd grafbehållarmetoder och återanskaffa direkta avkomlingar efter rollback