Транзакції графа об'єктів із копіюванням під час запису

THotPDF надає вкладені контрольні точки для завантаженого або зібраного графа непрямих об'єктів без клонування документа на початку транзакції

Життєвий цикл транзакції

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

BeginGraphTransaction індексує поточні непрямі корені та встановлює спостерігачі змін, але не створює знімків; перший запис в існуючий непрямий корінь у цьому кадрі створює один знімок, а пізніші записи в той самий корінь повторно використовують його

CommitGraphTransaction зберігає поточний граф і відкидає або передає знімки без його клонування; RollbackGraphTransaction відновлює кореневі об'єкти на місці, видаляє об'єкти, додані після контрольної точки, і відновлює розподілення номерів об'єктів

Вкладені транзакції є незалежними контрольними точками; внутрішній відкат повертається до стану входу внутрішньої транзакції, тоді як внутрішній комміт зберігає достатньо історії для пізнішого зовнішнього відкату

Автоматична та явна підготовка до запису

THPDFDictionaryObject.AddValue, ReplaceValue і DeleteValue, THPDFArrayObject.AddObject і SetIndexedItem та зміни THPDFStreamObject.Length автоматично повідомляють охоплюючий непрямий корінь

Публічні скалярні поля та сирі байти потоку не можуть перехоплювати присвоєння; викличте PrepareLoadedObjectForWrite перед присвоєнням Value, зміною публічних прапорців об'єкта, заміною вказівників графа або записом через 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;

Пам'ять і продуктивність

Пам'ять знімків зростає із зачепленими непрямими коренями, а не із загальним розміром документа; великі корисні навантаження потоків виливаються у власні тимчасові файли після GraphTransactionMemoryThreshold, чий стандарт становить 16 МіБ

Відкат повертає збережені записи словників, елементи масивів і сховища потоків в існуючий корінь, уникаючи другого глибокого копіювання; вказівник кореня залишається стабільним, але вказівники на прямі нащадки слід отримати знову після відкату

GetGraphTransactionStatistics повертає Active, глибину вкладеності Depth, SnapshotCount, AddedObjectCount, резидентні та вилиті байти знімків і пікові резидентні байти знімків

THPDFBeforeMutationEvent — це сигнатура низькорівневого спостерігача, яка використовується для маршрутизації змін контейнера та життєвого циклу до охоплюючого знімка непрямого кореня

Обсяг

Транзакції охоплюють граф непрямих об'єктів, стан життєвого циклу, додані корені та розподілення номерів об'єктів; вказівники, якими володіє викликаючий код, масиви впорядкування сторінок, рендер-кеші та інший сторонній стан фасаду не журналюються

Не видаляйте, не перевпорядковуйте та не замінюйте існуючі записи в GetLoadedIndirectObjects, поки транзакція активна; використовуйте методи контейнерів графа та отримуйте прямі нащадки знову після відкату