Copy-on-write-transaktioner for objektgrafer

THotPDF leverer indlejrede gemmepunkter for indlæste eller sammensatte indirekte objektgrafer uden at klone dokumentet ved transaktionsstart

Transaktionslivscyklus

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

BeginGraphTransaction indekserer de aktuelle indirekte rødder og installerer mutationsobservatører, men opretter ingen snapshots; den første skrivning til en eksisterende indirekte rod i den ramme opretter ét snapshot, og senere skrivninger til samme rod genbruger det

CommitGraphTransaction beholder den aktuelle graf og kasserer eller overfører snapshots uden at klone den; RollbackGraphTransaction gendanner rodobjekter på stedet, fjerner objekter tilføjet efter gemmepunktet og gendanner allokeringen af objektnumre

Indlejrede transaktioner er uafhængige gemmepunkter; en indre rollback vender tilbage til den indre indgangstilstand, mens en indre commit beholder tilstrækkelig historik til en senere ydre rollback

Automatisk og eksplicit skriveforberedelse

THPDFDictionaryObject.AddValue, ReplaceValue og DeleteValue, THPDFArrayObject.AddObject og SetIndexedItem samt ændringer af THPDFStreamObject.Length underretter automatisk den omsluttende indirekte rod

Offentlige skalare felter og rå strømbytes kan ikke opfange tildeling; kald PrepareLoadedObjectForWrite før tildeling af Value, ændring af offentlige objektflag, udskiftning af grafpointere eller skrivning gennem 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;

Hukommelse og ydeevne

Snapshothukommelse vokser med berørte indirekte rødder snarere end den samlede dokumentstørrelse; store strømdata flyttes til ejede midlertidige filer efter GraphTransactionMemoryThreshold, der som standard er 16 MiB

Rollback bytter gemte ordbogsposter, arrayelementer og strømlager tilbage i den eksisterende rod og undgår en anden dyb kopi; rodpointeren er stabil, men pointere til direkte efterkommere skal hentes igen efter rollback

GetGraphTransactionStatistics returnerer Active, indlejrings-Depth, SnapshotCount, AddedObjectCount, residente og udskilte snapshotbytes samt maksimale residente snapshotbytes

THPDFBeforeMutationEvent er observatørsignaturen på lavt niveau, der dirigerer container- og livscyklusmutationer til det omsluttende snapshot for indirekte rod

Omfang

Transaktioner omfatter den indirekte objektgraf, livscyklustilstand, tilføjede rødder og allokering af objektnumre; kalder-ejede pointere, rækkefølgearrays for indlæste sider, gengivne cacher og anden facade-sidetilstand journalføres ikke

Fjern, omordn eller erstat ikke eksisterende poster i GetLoadedIndirectObjects, mens en transaktion er aktiv; brug grafcontainer-metoder og hent direkte efterkommere igen efter rollback