أوه… لم أفكر قط في تشغيل المستورد أكثر من مرة على بيانات الإنتاج. شكراً جزيلاً على هذه الفكرة.
إذن، بشكل أساسي، سأقوم بعمل نسخة احتياطية من قاعدة بيانات Drupal الإنتاجية وتشغيل استيراد كامل للمدة التي يستغرقها ذلك مع ترك منتدى Drupal مفتوحًا للجمهور، ثم سأضع منتدى Drupal في وضع عدم الاتصال وأقوم بعمل نسخة احتياطية أخرى لقاعدة البيانات وتحميلها في مثيل MySQL للمستورد وإعادة تشغيل البرنامج النصي للمستورد؟
العيب الوحيد الذي يمكنني رؤيته هناك هو أن أي تعديلات على منشورات Drupal أو عمليات حذف للمنشورات أو تغييرات في ملفات تعريف المستخدمين الحالية خلال تلك الفترة (لنسميها 3 أيام) من الاستيراد الأولي حتى الاستيراد الثاني لن يتم استيرادها، فقط المستخدمون والمنشورات الجديدة تمامًا خلال تلك الفترة، صحيح؟
بعد الالتزام النهائي بعملية الاستيراد الإنتاجية مباشرة، كنت أتحقق بشكل عشوائي من بعض سلاسل المنتديات المستوردة عندما اكتشفت مشكلة كبيرة. كما كان الموضوع المتكرر هنا، فإنها ليست حقًا خطأ Discourse أو برنامج الاستيراد. ولكن اتضح أنه عندما يتم تعديل رد موضوع (“تعليق” في مصطلح Drupal) فإنه أحيانًا يغير الطابع الزمني created. على حد علمي، يجب أن يغير الطابع الزمني changed بدلاً من ذلك. ولكن على الرغم من هذه المشكلة في Drupal، إلا أنها لا تزال تحافظ على ترتيب التعليقات. ولكن الطريقة التي يعمل بها برنامج استيراد Drupal لـ Discourse، فإنه يقوم بفرز الردود حسب الطابع الزمني created الخاص بها (على الرغم من أنني لا أرى أي عبارات ORDER في برنامج drupal.rb). من اختباري في phpMyAdmin على قاعدة بيانات Drupal، يبدو أنه يحتاج ببساطة إلى ORDER BY c.cid ASC للحفاظ على ترتيب الترابط الصحيح عبر معرف التعليق الأصلي في Drupal cid الذي هو متسلسل ولا يتغير أبدًا. لكنني لست متأكدًا مما إذا كان مستورد Discourse سيسمح للردود المتسلسلة بأن تكون تواريخها خارج الترتيب، و/أو ما إذا كان سيقوم بفرزها بنفسه حسب تاريخ النشر؟ أود الحصول على رأي المنشئ الأصلي لمستورد drupal.rb (وأي شخص آخر بالطبع)، هل سينجح هذا وهل ستكون هناك أي عواقب غير مقصودة؟
أعتقد (ولكن لا أعرف حقًا، قاعدة بيانات دروبال لا معنى لها بالنسبة لي) أنه يمكنك تعديل الاستعلام لسحب وقت الإنشاء من المنشور الأصلي وليس المنشور المعدل.
أعتقد أن هناك جدولًا يحتوي على المنشور/الوقت الأصلي وجدولًا آخر يحتوي على التعديلات.
لا معنى له حقًا. المشكلة كالتالي، يجب أن يكون الصفان المميزان هما الردان الثاني والثالث في الموضوع، ولكن في Discourse هما في مكان ما بعد الموضع 500 لأنه هذا هو مكان الطابع الزمني الخاص بهما.
وبالطبع قررت Drupal تعيين created و changed ليكونوا نفس الشيء… ويحدث هذا فقط في بعض الأحيان، لا يمكنني تكراره بنفسي عن طريق تعديل المنشورات القديمة. ولكن لدي نفس المشكلة هذه في مواضيع متعددة طويلة الأمد حيث قام منشئ الموضوع بنشره ثم نشر فورًا تعليقًا أو تعليقين متابعين مع كلمة “reserved” في النص لإضافة معلومات لاحقًا، وهو ما فعله بعد عدة سنوات.
هذا منطقي، ولكن إليك نفس التعليق المعدل الإشكالي منتشرًا عبر الجدولين اللذين يستخدمهما:
حسنًا، يبدو أن هذا يعمل، فهو يصلح الخيطين المتشابكين اللذين وجدتهما ولا يبدو أنه يضر بأي شيء آخر.
def import_replies
…
batches(BATCH_SIZE) do |offset|
results = mysql_query(<<-SQL
SELECT c.cid, c.pid, c.nid, c.uid, c.created,
f.comment_body_value body,
f.comment_body_format format
FROM comment c,
field_data_comment_body f,
node n
WHERE c.cid = f.entity_id
AND n.nid = c.nid
AND c.status = 1
AND n.type IN ('poll', 'forum')
AND n.status = 1
AND c.created > UNIX_TIMESTAMP(STR_TO_DATE('#{IMPORT_AFTER}', '%Y-%m-%d'))
ORDER BY c.cid ASC #--- Fixed
LIMIT #{BATCH_SIZE}
OFFSET #{offset}
SQL
).to_a
حسنًا، يبدو أن هذا عاد ليؤذيني. نظرًا لأن الدالة postprocess_posts تستبدل الروابط الداخلية القديمة بعنوان URL الجديد لـ Discourse، فقد قمت بإنشاء استثناء في الكود للروابط https://web.archive.org/web/20230101093741/https://MyOldForum.com/node/98765 التي أنشأها المستورد الخاص بي لاستطلاعات Drupal القديمة في Wayback Machine. ولكن يبدو أن شيئًا ما قد سار بشكل خاطئ، لأنني لاحظت للتو في موقع الترحيل الإنتاجي أن الروابط انتهت بـ https://web.archive.org/web/20230101093741/https://MyOldForum.com/t/-/12345.
لذا، الآن بعد أن لم أعد في سياق حاوية ترحيل، هل لا يزال الحقل المخصص مع عقدة Drupal الأصلية nid متاحًا في جدول مواضيع Discourse؟ إذا كان الأمر كذلك، فسيبدو من الممكن إجراء استبدال للسلسلة في وحدة تحكم Rails على جميع المواضيع مع المنشور الأول الذي يحتوي على View this poll on the Wayback Machine ثم استبدال https://web.archive.org/web/20230101093741/https://MyOldForum.com/t/-/[01234567890]*
بـ https://web.archive.org/web/20230101093741/http://MyOldForum.com/node/$original_nid
إليك دالة استيراد الاستطلاع الأصلية الخاصة بي:
def import_poll_topics
puts '', "importing poll topics"
polls = mysql_query(<<-SQL
SELECT n.nid nid, n.title title, n.uid uid, n.created created, n.sticky sticky, taxonomy_index.tid tid, node_counter.totalcount views
FROM node n
LEFT JOIN taxonomy_index ON n.nid = taxonomy_index.nid
LEFT JOIN node_counter ON n.nid = node_counter.nid
WHERE n.type = 'poll'
AND n.status = 1
SQL
).to_a
create_posts(polls) do |topic|
{
id: "nid:#{topic['nid']}",
user_id: user_id_from_imported_user_id(topic['uid']) || -1,
category: category_id_from_imported_category_id(topic['tid']),
# Use TEMPmyoldforum.com or else postprocess_posts() will try to convert the Wayback Machine /node/YYY link
raw: "### View this poll on the Wayback Machine:\n**https://web.archive.org/web/20230101093741/http://TEMPmyoldforum.com/node/#{topic['nid']}**",
created_at: Time.zone.at(topic['created']),
pinned_at: topic['sticky'].to_i == 1 ? Time.zone.at(topic['created']) : nil,
title: topic['title'].try(:strip),
views: topic['views'],
custom_fields: { import_id: "nid:#{topic['nid']}" }
}
end
end