التقاط من نقطة إزاحة الدفعة الأخيرة لا يعمل

مرحباً، أنا أحرز تقدماً في ترحيلي من منتدى Drupal كبير جداً. لقد أعدت استخدام الدالة import_private_messages من برنامج استيراد Discuz، والذي كان الأقرب للعمل مع مخطط قاعدة بيانات Drupal الغريب. إنه حالياً يعالج أكثر من 1.5 مليون رسالة خاصة، ولكنه واجه خطأ (لقد قمت بالفعل بتجاوزه) وعندما أعدت تشغيل برنامج الاستيراد، بدأ من البداية مرة أخرى. إنه يعمل أسرع بـ 3-4 مرات حتى يصل إلى النقطة التي فشل فيها من قبل، ولكنه بالتأكيد لا يستأنف من قيمة الإزاحة الدفعية الأخيرة كما يفعل البرنامج عند استيراد المشاركات العامة. هل يمكن لأي شخص ملاحظة أي شيء خاطئ في برنامجي يمنع الاستئناف من العمل؟


def import_private_messages
	puts '', 'إنشاء رسائل خاصة'

	pm_indexes = 'pm_index'
	pm_messages = 'pm_message'
	total_count = mysql_query("SELECT count(*) count FROM #{pm_indexes}").first['count']

	batches(BATCH_SIZE) do |offset|
		results = mysql_query("\
SELECT pi.mid id, thread_id, pi.recipient to_user_id, pi.deleted deleted, pm.author user_id, pm.subject subject, pm.body message, pm.format, pm.timestamp created_at FROM pm_index pi LEFT JOIN pm_message pm ON pi.mid=pm.mid WHERE deleted = 0
             LIMIT #{BATCH_SIZE}
            OFFSET #{offset};")

		break if results.size < 1

		# next if all_records_exist? :posts, results.map {|m| "pm:#{m['id']}"}

		create_posts(results, total: total_count, offset: offset) do |m|
			skip = false
			mapped = {}
			mapped[:id] = "pm:#{m['id']}"
			mapped[:user_id] = user_id_from_imported_user_id(m['user_id']) || -1
			mapped[:raw] = preprocess_raw(m['message'])
			mapped[:created_at] = Time.zone.at(m['created_at'])
			thread_id = "pm_#{m['thread_id']}"
			if is_first_pm(m['id'], m['thread_id'])
				# البحث عن العنوان من جدول القائمة
				#          pm_thread = mysql_query("\
				#                SELECT thread_id, subject
				#                  FROM #{table_name 'ucenter_pm_lists'}
				#                 WHERE plid = #{m['thread_id']};").first
				mapped[:title] = m['subject']
				mapped[:archetype] = Archetype.private_message

          # البحث عن المستخدمين الذين هم جزء من هذه الرسالة الخاصة.
          import_user_ids = mysql_query("\
                SELECT thread_id plid, recipient user_id
                  FROM pm_index
                 WHERE thread_id = #{m['thread_id']};
              ").map { |r| r['user_id'] }.uniq
          mapped[:target_usernames] = import_user_ids.map! do |import_user_id|
            import_user_id.to_s == m['user_id'].to_s ? nil : User.find_by(id: user_id_from_imported_user_id(import_user_id)).try(:username)
          end.compact
          if mapped[:target_usernames].empty? # رسالة خاصة مع نفسك؟
            skip = true
            puts "تخطي pm:#{m['id']} بسبب عدم وجود هدف"
          else
            @first_post_id_by_topic_id[thread_id] = mapped[:id]
          end
        else
          parent = topic_lookup_from_imported_post_id(@first_post_id_by_topic_id[thread_id])
          if parent
            mapped[:topic_id] = parent[:topic_id]
          else
            puts "الموضوع الأب pm thread:#{thread_id} غير موجود. تخطي #{m["id"]}: #{m["message"][0..40]}"
            skip = true
          end
        end
        skip ? nil : mapped
      end

    end
end