كتلة ثنائية تحتوي على 30 عاماً من قواعد العمل بداخلها
يبدأ كل ملف .fmb بترويسة بحجم 512 بايت حيث تُعرّف أول أربعة بايتات الملف كوحدة نماذج، متبوعة بختم إصدار، ورمز مجموعة الأحرف، ومؤشر إلى الكائن الجذر في شجرة الكائنات. بعد تلك الترويسة، الملف هو تسلسل متشابك من الكائنات المُعلّمة بالنوع مع حمولات متغيرة الطول: الكتل، والعناصر، والمُشغّلات، ومجموعات السجلات، وLOVs، واللوحات، كل منها يشير إلى الأخرى بمعرفات صحيحة. لم تنشر Oracle التخطيط رسمياً قط. لقد حلّلنا الآن 2,400 من هذه الملفات عبر مشاريع الترحيل، والمحتويات متسقة بشكل ملحوظ. سلّم لنا مشغّل لوجستي أوروبي 612 منها العام الماضي — 184 ميجابايت إجمالاً، تحتوي على 28,400 مُشغّل، و9,100 LOV، وحوالي 1.2 مليون سطر من PL/SQL المدمج.
فقدت الشركة تاريخ التحكم في المصدر في 2011. كانت ملفات .fmb هي مصدر الحقيقة.
أتذكر الجلوس في غرفة اجتماعات بلا نوافذ في وارسو في 2006، أحدّق في محرر hex بجانب زميل من دعم Oracle، أحاول معرفة لماذا لن يفتح ملف .fmb من 6i في Forms 10g Builder. افتُح الملف بشكل جيد على جهاز واحد وألقى ORA-06508 على آخر. بعد يومين تتبعناه إلى بايت واحد في ترويسة الوحدة يُرمّز بيانات وصفية لمجموعة الأحرف. كان ذلك الأسبوع الذي توقفت فيه عن الثقة في الأدوات الداخلية لـ Oracle للتعامل مع ملفاتها الخاصة بشكل نظيف، وبدأت في إجراء نسخ احتياطية على مستوى البايت قبل كل ترقية.
ما هو ملف .fmb فعلاً
.fmb هو تسلسل ثنائي ملكي لوحدة Oracle Forms. ليس تفريغ قاعدة بيانات وليس AST بسيطاً. إنها شجرة من الكائنات — الكتل، والعناصر، والمُشغّلات، واللوحات، والنوافذ، وLOVs، ومجموعات السجلات، ووحدات البرامج — كل منها مُعلَّم برمز نوع وحمولة متغيرة الطول. تحوّل التنسيق بدقة عبر Forms 4.5، 6i، 10g، 11g، و12c، لكن البنية الأساسية مستقرة.
تحكي الملفات المصاحبة قصة مماثلة. .fmx هو الثنائي المُجمَّع لوقت التشغيل. .fmt هو تصدير نصي تقدمه Oracle، لكنه ناقص — تُحذف أو تُعاد كتابة إحداثيات التخطيط، وبيانات الخط الوصفية، وبعض افتراضيات الخصائص. عمليات الترحيل التي تعتمد على .fmt فقط تفوت ما بين 4% و9% من السلوك الأصلي.
شجرة الكائنات، بالأرقام
عبر عينتنا، يحتوي متوسط .fmb على:
التوزيع منحرف بشدة. تحتوي أعلى 10% من الملفات على أكثر من نصف المنطق الإجمالي. رأينا ملفات .fmb واحدة بـ 480 مُشغّلاً و14,000 سطر من PL/SQL — عادةً شاشة ترحيل دفتر الأستاذ العام أو حصان إدخال الطلبات.
أين يعيش منطق العمل فعلاً
كان لدى مطوّري Forms أربعة أماكن لوضع الكود: مُشغّلات على مستوى النموذج، ومُشغّلات على مستوى الكتلة، ومُشغّلات على مستوى العنصر، ووحدات برامج مُرفقة بالوحدة. في الممارسة، ينتهي معظم المنطق على مستوى العنصر، داخل WHEN-VALIDATE-ITEM، POST-QUERY، وKEY-NEXT-ITEM — 38% من المنطق الإجمالي في عينتنا يجلس في WHEN-VALIDATE-ITEM وحده.
-- حمولة WHEN-VALIDATE-ITEM نموذجية داخل .fmb
IF :ORDERS.TOTAL_AMOUNT > 50000 AND :ORDERS.APPROVAL_ID IS NULL THEN
MESSAGE('Orders over 50000 require approval');
RAISE FORM_TRIGGER_FAILURE;
END IF;
يتم تخزين هذا المقتطف داخل الثنائي كسلسلة ذات بادئة طول مُرفقة بعقدة عنصر. العثور عليها يتطلب المشي عبر شجرة الكائنات. اضرب في 47 مُشغّلاً لكل ملف و612 ملفاً ويصبح الاستخراج مشكلة محلل، لا مشكلة grep.
الخصائص التي لا يُوثّقها أحد
بخلاف الكود، يحمل كل عنصر بين 80 و140 خاصية: القيم الافتراضية، وأقنعة التنسيق، وشروط الاستعلام، وتلميحات التنقل، وارتباطات أعمدة قاعدة البيانات، وإحداثيات التخطيط. حوالي 30% من هذه الخصائص تُرمّز سلوكاً افترض المطورون أنه “مجرد طريقة عمل Forms” — LOVs المتتالية التي تُشغّلها وراثة قناع التنسيق، على سبيل المثال، أو سلوك الالتزام الضمني المرتبط بخاصية Database Block.
عندما نعيد بناء شاشة في TypeScript، تمثل هذه الخصائص الضمنية معظم المفاجآت. كود المُشغّل المرئي هو الجزء السهل.
التحليل بدون وقت تشغيل Oracle
تستدعي معظم أدوات الترحيل Forms Builder أو Forms API لقراءة ملفات .fmb. يعمل هذا النهج، لكنه يتطلب تثبيت Oracle مرخصاً ويقيّد إنتاجية الاستخراج بحوالي 40 ملفاً في الساعة. بنينا محللاً ثنائياً مباشراً يقرأ شجرة الكائنات بدون وقت التشغيل. يعالج نفس الـ 612 ملفاً في أقل من 90 ثانية ويُنتج واصف JSON لكل وحدة.
الواصف — تنسيق JSON الذي بنينا حوله خط الأنابيب بأكمله — يصبح الإدخال لكل شيء أسفل: مُولّد TypeScript، ومخزون التحكم للتدقيق، وأداة المقارنة البصرية التي تقارن الشاشات القديمة والجديدة جنباً إلى جنب.
الخلاصة
ملف .fmb ليس صندوقاً أسوداً. إنه شجرة منظمة جيداً ملفوفة في مغلف ثنائي غير موثّق. بمجرد فتح المغلف، تصبح 30 عاماً من قواعد العمل قابلة للبحث والمقارنة والترحيل — بهذا الترتيب. كل ترحيل شحنّاه بدأ بتحليل كامل لملفات المصدر، لأن كل اختصار في تلك المرحلة يظهر كخلل بعد ستة أشهر.