Copy-on-Write Object Graph Transactions
THotPDF برای گرافهای شیءِ غیرمستقیمِ بارگذاریشده یا سرهمشده بدون شبیهسازی سند در شروع تراکنش، savepointهای تودرتو فراهم میکند
چرخهٔ عمر تراکنش
PDF.BeginGraphTransaction('metadata edit');
try
Info.AddStringValue('Producer', 'HotPDF');
PDF.CommitGraphTransaction;
except
PDF.RollbackGraphTransaction;
raise;
end;
BeginGraphTransaction ریشههای غیرمستقیم کنونی را نمایه کرده و مشاهدهگرهای تغییر را نصب میکند اما هیچ snapshot ای نمیسازد؛ نخستین نوشتن روی یک ریشهٔ غیرمستقیمِ موجود در آن قاب یک snapshot میسازد، و نوشتنهای بعدی روی همان ریشه آن را بازاستفاده میکنند
CommitGraphTransaction گراف کنونی را نگه میدارد و snapshotها را بدون شبیهسازی آن دور میریزد یا منتقل میکند؛ RollbackGraphTransaction اشیاء ریشه را درجا بازنشانده، اشیاءِ ضمیمهشده پس از savepoint را حذف و اختصاص شمارهٔ شیء را بازنشانده میکند
تراکنشهای تودرتو savepointهای مستقل هستند؛ بازگشت داخلی به حالت ورود داخلی بازمیگردد، در حالی که یک commit داخلی تاریخچهٔ کافی برای یک بازگشت بیرونیِ بعدی نگه میدارد
آمادهسازی خودکار و صریح نوشتن
THPDFDictionaryObject.AddValue، ReplaceValue و DeleteValue، THPDFArrayObject.AddObject و SetIndexedItem، و تغییرات THPDFStreamObject.Length بهصورت خودکار ریشهٔ غیرمستقیمِ دربرگیرنده را مطلع میکنند
فیلدهای اسکالر عمومی و بایتهای جریان خام نمیتوانند اختصاص را رهگیری کنند؛ پیش از اختصاص Value، تغییر پرچمهای شیء عمومی، جایگزینی اشارهگرهای گراف یا نوشتن از طریق THPDFStreamObject.Stream، PrepareLoadedObjectForWrite را فراخوانی کنید
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;
حافظه و عملکرد
حافظهٔ snapshot با ریشههای غیرمستقیمِ دستخورده رشد میکند نه با اندازهٔ کل سند؛ بارهای جریانِ بزرگ پس از GraphTransactionMemoryThreshold که پیشفرض آن ۱۶ MiB است، به فایلهای موقتِ متعلق به خود ریخته میشوند
بازگشت، ورودیهای دیکشنری ذخیرهشده، آیتمهای آرایه و ذخیرهسازی جریان را در ریشهٔ موجود بازمیچرخاند و از یک کپی عمیق دوم پرهیز میشود؛ اشارهگر ریشه پایدار میماند، اما اشارهگرهای نسلِ مستقیم پس از بازگشت باید دوباره بهدست بیایند
GetGraphTransactionStatistics مقدار Active، Depth تودرتو، SnapshotCount، AddedObjectCount، بایتهای snapshot ساکن و ریختهشده و اوج بایتهای snapshot ساکن را بازمیگرداند
THPDFBeforeMutationEvent امضای مشاهدهگر سطح پایین است که برای هدایت تغییرات ظرف و چرخهٔ عمر به snapshot ریشهٔ غیرمستقیمِ دربرگیرنده استفاده میشود
دامنه
تراکنشها گراف شیءِ غیرمستقیم، وضعیت چرخهٔ عمر، ریشههای ضمیمهشده و اختصاص شمارهٔ شیء را پوشش میدهند؛ اشارهگرهای متعلق به فراخوان، آرایههای ترتیب صفحهٔ بارگذاریشده، کشهای رندرشده و سایر وضعیت جانبی façade ثبت گزارش نمیشوند
در حالی که یک تراکنش فعال است، ورودیهای موجود در GetLoadedIndirectObjects را حذف، مرتبسازی مجدد یا جایگزین نکنید؛ از روشهای ظرف گراف استفاده کنید و پس از بازگشت، نسلهای مستقیم را دوباره بهدست آورید