Copy-on-Write transakcije grafa objekata
THotPDF pruža ugnježđene tačke čuvanja za učitane ili formirane grafove indirektnih objekata bez kloniranja dokumenta na početku transakcije
Životni ciklus transakcije
PDF.BeginGraphTransaction('metadata edit');
try
Info.AddStringValue('Producer', 'HotPDF');
PDF.CommitGraphTransaction;
except
PDF.RollbackGraphTransaction;
raise;
end;
BeginGraphTransaction indeksira trenutne indirektne korene i instalira posmatrače izmena ali ne formira snimke; prvi upis u postojeći indirektni koren u tom okviru formira jedan snimak, a kasniji upisi u isti koren ponovo ga koriste
CommitGraphTransaction zadržava trenutni graf i odbacuje ili prenosi snimke bez kloniranja; RollbackGraphTransaction vraća korenske objekte na mestu, uklanja objekte dodane nakon tačke čuvanja i vraća alokaciju brojeva objekata
Ugnježđene transakcije su nezavisne tačke čuvanja; unutrašnje vraćanje vraća se na stanje ulaza unutra, dok unutrašnje potvrđivanje zadržava dovoljno istorije za kasnije spoljno vraćanje
Automatska i eksplicitna priprema upisa
THPDFDictionaryObject.AddValue, ReplaceValue i DeleteValue, THPDFArrayObject.AddObject i SetIndexedItem te izmene THPDFStreamObject.Length automatski obaveštavaju obuhvatajući indirektni koren
Javna skalarna polja i sirovi bajtovi toka ne mogu da presretnu dodelu; pozovite PrepareLoadedObjectForWrite pre dodele Value, menjanja javnih zastavica objekta, zamene pokazivača grafa ili pisanja kroz 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;
Memorija i performanse
Snimak memorije raste sa dirnutim indirektnim korenima pre nego sa ukupnom veličinom dokumenta; veliki sadržaji tokova prelivaju se u vlasničke privremene datoteke nakon GraphTransactionMemoryThreshold, čija je podrazumevana vrednost 16 MiB
Vraćanje zamenjuje sačuvane unose rečnika, stavke niza i skladištenje tokova nazad u postojeći koren, izbegavajući drugu duboku kopiju; pokazivač korena ostaje stabilan, ali se pokazivači na direktne potomke moraju ponovo pribaviti nakon vraćanja
GetGraphTransactionStatistics vraća Active, dubinu ugnježđivanja Depth, SnapshotCount, AddedObjectCount, rezidentne i prelivene bajtove snimka te vršne rezidentne bajtove snimka
THPDFBeforeMutationEvent je potpis posmatrača niskog nivoa koji se koristi za usmeravanje izmena kontejnera i životnog ciklusa ka obuhvatajućem snimku indirektnog korena
Opseg
Transakcije pokrivaju graf indirektnih objekata, stanje životnog ciklusa, dodane korene i alokaciju brojeva objekata; pokazivači u vlasništvu pozivaoca, niz redosleda učitane stranice, renderovani keševi i druga sporedna stanja fasade ne čuvaju se u dnevniku
Ne uklanjajte, ne preuređujte niti ne zamenjujte postojeće unose u GetLoadedIndirectObjects dok je transakcija aktivna; koristite metode kontejnera grafa i ponovo pribavite direktne potomke nakon vraćanja