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