Transakcje grafu obiektów kopiowanych przy zapisie

THotPDF dostarcza zagnieżdżone punkty zapisu dla załadowanych lub złożonych grafów obiektów pośrednich bez klonowania dokumentu na początku transakcji

Cykl życia transakcji

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

BeginGraphTransaction indeksuje bieżące korzenie pośrednie i instaluje obserwatorów mutacji, ale nie tworzy migawek; pierwszy zapis do istniejącego korzenia pośredniego w tej ramce tworzy jedną migawkę, a późniejsze zapisy do tego samego korzenia ponownie używają jej

CommitGraphTransaction zachowuje bieżący graf i odrzuca lub przenosi migawki bez jego klonowania; RollbackGraphTransaction przywraca obiekty korzeni na miejscu, usuwa obiekty dołączone po punkcie zapisu i przywraca alokację numerów obiektów

Transakcje zagnieżdżone to niezależne punkty zapisu; wewnętrzny wycofanie wraca do stanu wejścia wewnętrznego, podczas gdy wewnętrzne zatwierdzenie zachowuje wystarczająco dużo historii dla późniejszego zewnętrznego wycofania

Automatyczne i jawne przygotowanie zapisu

THPDFDictionaryObject.AddValue, ReplaceValue i DeleteValue, THPDFArrayObject.AddObject i SetIndexedItem oraz zmiany THPDFStreamObject.Length powiadamiają otaczający korzeń pośredni automatycznie

Publiczne pola skalarne i surowe bajty strumienia nie mogą przechwytywać przypisania; wywołaj PrepareLoadedObjectForWrite przed przypisaniem Value, zmianą publicznych flag obiektu, zastąpieniem wskaźników grafu lub zapisem przez 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;

Pamięć i wydajność

Pamięć migawek rośnie z dotkniętymi korzeniami pośrednimi, a nie z całkowitym rozmiarem dokumentu; duże ładunki strumienia przelewają się do własnych plików tymczasowych po GraphTransactionMemoryThreshold, którego domyślną wartością jest 16 MiB

Wycofanie zamienia zapisane wpisy słownika, elementy tablicy i magazyn strumienia z powrotem w istniejący korzeń, unikając drugiej głębokiej kopii; wskaźnik korzenia pozostaje stabilny, ale wskaźniki do bezpośrednich potomków muszą być ponownie pozyskane po wycofaniu

GetGraphTransactionStatistics zwraca Active, zagnieżdżoną Depth, SnapshotCount, AddedObjectCount, rezydentne i rozlane bajty migawek oraz szczytowe rezydentne bajty migawek

THPDFBeforeMutationEvent to sygnatura obserwatora niskiego poziomu używana do kierowania mutacji kontenerów i cyklu życia do migawki otaczającego korzenia pośredniego

Zakres

Transakcje obejmują graf obiektów pośrednich, stan cyklu życia, dołączone korzenie i alokację numerów obiektów; wskaźniki należące do wywołującego, tablice kolejności załadowanych stron, wyrenderowane pamięci podręczne i inne stan boczny fasady nie są rejestrowane

Nie usuwaj, nie porządkuj ani nie zastępuj istniejących wpisów w GetLoadedIndirectObjects, gdy transakcja jest aktywna; używaj metod kontenerów grafu i ponownie pozyskuj bezpośrednich potomków po wycofaniu