Transazioni del Grafo di Oggetti Copy-on-Write
THotPDF fornisce savepoint annidati per i grafi di oggetti indiretti caricati o assemblati senza clonare il documento all'avvio della transazione
Ciclo di vita della transazione
PDF.BeginGraphTransaction('metadata edit');
try
Info.AddStringValue('Producer', 'HotPDF');
PDF.CommitGraphTransaction;
except
PDF.RollbackGraphTransaction;
raise;
end;
BeginGraphTransaction indicizza le radici indirette correnti e installa degli osservatori di mutazione ma non crea snapshot; la prima scrittura su una radice indiretta esistente in quel frame crea uno snapshot e le scritture successive sulla stessa radice lo riusano
CommitGraphTransaction conserva il grafo corrente e scarta o trasferisce gli snapshot senza clonarlo; RollbackGraphTransaction ripristina gli oggetti radice in posizione, rimuove gli oggetti aggiunti dopo il savepoint e ripristina l'allocazione dei numeri di oggetto
Le transazioni annidate sono savepoint indipendenti; un rollback interno torna allo stato di ingresso interno, mentre un commit interno conserva la cronologia sufficiente per un rollback esterno successivo
Preparazione della scrittura automatica ed esplicita
THPDFDictionaryObject.AddValue, ReplaceValue e DeleteValue, THPDFArrayObject.AddObject e SetIndexedItem e le modifiche a THPDFStreamObject.Length notificano automaticamente la radice indiretta che li contiene
I campi scalari pubblici e i byte grezzi del flusso non possono intercettare l'assegnazione; chiamare PrepareLoadedObjectForWrite prima di assegnare Value, cambiare i flag pubblici degli oggetti, sostituire i puntatori del grafo o scrivere tramite 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;
Memoria e prestazioni
La memoria degli snapshot cresce con le radici indirette toccate piuttosto che con la dimensione totale del documento; i payload di flusso di grandi dimensioni traboccano in file temporanei di proprietà dopo GraphTransactionMemoryThreshold, il cui predefinito è 16 MiB
Il rollback scambia le voci di dizionario salvate, gli elementi di array e lo storage del flusso di nuovo nella radice esistente, evitando una seconda copia profonda; il puntatore della radice rimane stabile, ma i puntatori ai discendenti diretti devono essere riacquisiti dopo il rollback
GetGraphTransactionStatistics restituisce Active, la Depth di annidamento, SnapshotCount, AddedObjectCount, i byte residenti e traboccati degli snapshot e i byte residenti di picco degli snapshot
THPDFBeforeMutationEvent è la firma dell'osservatore di basso livello usata per instradare le mutazioni dei contenitori e del ciclo di vita allo snapshot della radice indiretta che li contiene
Ambito
Le transazioni coprono il grafo degli oggetti indiretti, lo stato del ciclo di vita, le radici aggiunte e l'allocazione dei numeri di oggetto; i puntatori di proprietà del chiamante, gli array di ordinamento delle pagine caricate, le cache renderizzate e altro stato laterale della facciata non vengono registrati
Non rimuovere, riordinare o sostituire voci esistenti in GetLoadedIndirectObjects mentre una transazione è attiva; usare i metodi dei contenitori del grafo e riacquisire i discendenti diretti dopo il rollback