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