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