Oh… Ni siquiera había pensado en ejecutar el importador más de una vez en los datos de producción. Muchas gracias por esa idea.
Básicamente, ¿haría un volcado de la base de datos de producción de Drupal y ejecutaría una importación completa durante el tiempo que tarde, dejando el foro de Drupal abierto al público, luego pondría el foro de Drupal en modo offline, haría otro volcado de la base de datos, lo cargaría en la instancia MySQL del importador y volvería a ejecutar el script del importador?
La única desventaja que veo ahí es que cualquier edición de publicación en Drupal, o eliminación de publicación, o cambios en el perfil de usuario existente durante ese intervalo (llamémoslo 3 días) desde la importación inicial hasta la segunda importación no se importarían, ¿solo los usuarios y publicaciones completamente nuevos durante ese intervalo, correcto?
Es correcto. Los datos que se editen se perderán. La alternativa es poner el foro fuera de servicio durante ese tiempo. Podrías advertir a la gente. En la práctica, nadie se ha quejado.
Justo después de comprometerme con la ejecución final de la importación de producción, estaba revisando aleatoriamente algunos de los hilos del foro importados cuando descubrí un gran problema. Como ha sido el tema recurrente aquí, en realidad no es culpa de Discourse ni del script del importador. Pero resulta que cuando se edita una respuesta de tema (“comentario” en la jerga de Drupal) a veces cambia la marca de tiempo created. Por lo que puedo decir, debería cambiar la marca de tiempo changed en su lugar. Pero a pesar de este error en Drupal, todavía mantiene el orden de los comentarios. Pero la forma en que funciona el script del importador de Drupal para Discourse es que aparentemente ordena las respuestas por su marca de tiempo created (aunque no veo ninguna cláusula ORDER en el script drupal.rb). Por mis pruebas en phpMyAdmin en la base de datos de Drupal, parece que simplemente necesita un ORDER BY c.cid ASC para mantener el orden correcto de los comentarios a través del ID de comentario original de Drupal cid, que es secuencial y nunca cambia. Pero no estoy seguro de si el importador de Discourse permitirá que las respuestas secuenciales tengan fechas que estén desordenadas, y/o si hará su propia clasificación por fecha de publicación. Me gustaría obtener la opinión del creador original del importador drupal.rb (y de cualquier otra persona, por supuesto), ¿funcionaría esto y habría alguna consecuencia no deseada?
Creo (pero en realidad no lo sé, la base de datos de Drupal no tiene sentido para mí) que puedes ajustar la consulta para obtener la fecha de creación de la publicación original y no la editada.
Creo que hay una tabla que contiene la publicación/hora original y otra con las ediciones.
Realmente no tiene ningún sentido. El problema es el siguiente: las dos filas resaltadas deberían ser la segunda y tercera respuesta en el hilo, pero en Discourse están en alguna posición después de la 500 porque ahí es donde está su marca de tiempo.
Y, por supuesto, Drupal decidió establecer created y changed en lo mismo… Y solo sucede a veces, no puedo reproducirlo editando publicaciones antiguas. Pero tengo el mismo problema en varios hilos de larga duración donde el OP del tema lo publicó y luego inmediatamente publicó uno o dos comentarios de seguimiento con “reservado” en el cuerpo para agregar información adicional más tarde, lo que hizo varios años después.
Eso tendría sentido, pero aquí está el mismo comentario editado problemático distribuido entre las dos tablas que utiliza:
OK, parece que esto funciona, soluciona los dos hilos mezclados que encontré y no parece perjudicar nada más.
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
Hmm, parece que esto me ha pasado factura. Dado que la función postprocess_posts reemplaza los enlaces internos antiguos con la nueva URL de Discourse, había hecho una excepción en el código para los enlaces https://web.archive.org/web/20230101093741/https://MyOldForum.com/node/98765 que mi importador creó para las antiguas encuestas de Drupal en la Wayback Machine. Pero aparentemente algo salió mal, porque acabo de notar en el sitio de migración de producción que los enlaces terminaron como https://web.archive.org/web/20230101093741/https://MyOldForum.com/t/-/12345.
Entonces, ahora que ya no estoy en el contexto de un contenedor de migración, ¿el campo personalizado con el nid original del nodo de Drupal todavía está disponible en la tabla de temas de Discourse? Si es así, parecería posible hacer un reemplazo de cadenas en la consola de Rails en todos los temas con la primera publicación que contenga View this poll on the Wayback Machine y luego reemplazar https://web.archive.org/web/20230101093741/https://MyOldForum.com/t/-/[01234567890]*
con https://web.archive.org/web/20230101093741/http://MyOldForum.com/node/$original_nid
Aquí está mi función original de importación de encuestas:
def import_poll_topics
puts '', "importando temas de encuestas"
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']),
# Usa TEMPmyoldforum.com o de lo contrario postprocess_posts() intentará convertir el enlace Wayback Machine /node/YYY
raw: "### Ver esta encuesta en la 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