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