XForum konverzió

Pál úr képe

Üdv,

Hosszas kutakodás eredménye képpen arra jutottam, hogy a korábban beüzemelt, PostNuke 0.708 alapú portál XForum (1.81.1-es verzió) adatainak konverzióját nem lesz könnyű megoldani. Erre utalt a drupal.org alábbi fórumszála is.

Nem lévén más megoldás, egy kis php-szkriptet írtam hozzá, mely -- eddigi tapasztalataim szerint -- szépen áthozott minden adatot. Csak annyit tudok megjegyezni róla, hogy nálam minden adat a helyére került, mindenki használja backup-olás után egészséggel.

Néhány alapfeltétel, ami eszembe jut:

  • előszöris én egyszerűen betettem az XForum által használt 3 táblát a drupal adatbázisába
  • másodszoris feltétel, hogy csak akkor fogják a fórumtémák megtalálni a helyüket, ha a Kategóriákban (Taxonomy) a drupal fórumtémái betűre ugyanazok, mint a régi, XForum-os témái
  • mivel a fórumok a felhasználók neveit is tartalmazzák, előtte a korábbi felhasználói adatokat át kell hozni, és ebbe beletartoznak a felhasználók által megadott valódi nevek is...

<?php
require ('config.php'); // egy teljesen primitív adatbáziskapcsolat-készítő 3 sor
 
if(!isset($config)) include("config.php");
dbconnect();
 
$threads_query = "SELECT * FROM `nuke_XForum_threads`"; 
$threads_list = mysql_query($threads_query);
 
while($threads = mysql_fetch_array($threads_list)) {
	$nid_query = "SELECT id FROM sequences WHERE name = 'node_nid'";
    $nid_list = mysql_query($nid_query);
    $_nid = mysql_fetch_array($nid_list);
    $nid = $_nid['id'] + 1;  	
	$update_seq_nid = "UPDATE sequences SET id = '".$nid."' WHERE name = 'node_nid'";
 
    echo $update_seq_nid; // csak hogy lássam is, mi történik
	$q1 = mysql_query($update_seq_nid) or die("Hiba: q1 - ".mysql_error());
    echo "<br>";
 
 
    $vid_query = "SELECT id FROM sequences WHERE name = 'node_revisions_vid'";
    $vid_list = mysql_query($vid_query);
    $_vid = mysql_fetch_array($vid_list);
    $vid = $_vid['id'] + 1;
 
    $update_seq_vid = "UPDATE sequences SET id = '".$vid."' WHERE name = 'node_revisions_vid'";
 
    echo $update_seq_vid;
	$q2 = mysql_query($update_seq_vid) or die("Hiba: q2 - ".mysql_error());
    echo "<br>";
 
    $user_query = "SELECT uid FROM users WHERE name = '".$threads['author']."'"; // ez feltételezi, hogy korábban a régi nuke rendszer users tábláit is beemeltük
    $user_list = mysql_query($user_query);
    $user = mysql_fetch_array($user_list);
 
    $changed = explode('|', $threads['lastpost']);
 
    $insert_node = "INSERT INTO node SET nid = '".$nid."', vid = '".$vid."', type = 'forum', title = '".$threads['subject']."', ".
		" uid = '".$user['uid']."', status = '1', ".
		" created = '".$threads['dateline']."', changed = '".$changed[0]."'" ;
 
    echo $insert_node;
	$q3 = mysql_query($insert_node) or die("Hiba: q3 - ".mysql_error());
    echo "<br>";
 
    $insert_node_rev = "INSERT INTO node_revisions SET nid = '".$nid."', vid = '".$vid."', uid = '".$user['uid']."', ".
		" title = '".$threads['subject']."', body = '".$threads['message']."', teaser = '".$threads['message']."', timestamp = '".$changed[0]."', format = '1'";
 
    echo $insert_node_rev;
	$q4 = mysql_query($insert_node_rev) or die("Hiba: q4 - ".mysql_error());
    echo "<br>";
 
	$posts_query = "SELECT * FROM nuke_XForum_posts WHERE fid = '".$threads['fid']."' AND tid = '".$threads['tid']."' ORDER BY dateline DESC"; 
	echo $posts_query;
	echo "<br>";
 
	$posts_count = 0;
 
	$posts_lists = mysql_query($posts_query);
	while($posts = mysql_fetch_array($posts_lists)) {
		$cid_query = "SELECT id FROM sequences WHERE name = 'comments_cid'";
		$cid_list = mysql_query($cid_query);
		$_cid = mysql_fetch_array($cid_list);
		$cid = $_cid['id'] + 1;
 
		$update_seq_cid = "UPDATE sequences SET id = '".$cid."' WHERE name = 'comments_cid'";
 
		echo $update_seq_cid;
		echo "<br>";
		$q5 = mysql_query($update_seq_cid) or die("Hiba: q5 - ".mysql_error());
 
		$user_query = "SELECT uid FROM users WHERE name = '".$posts['author']."'";
		$user_list = mysql_query($user_query);
		$user = mysql_fetch_array($user_list);
 
		$subject = explode(' ', $posts['message']);  // ez talán nem a legszebb megoldás, de így kerül valami a hozzászóás tárgyába
 
		$comment_insert = "INSERT INTO comments SET cid = '".$cid."', pid = '".$posts['pid']."', nid = '".$nid."', uid = '".$user['uid']."', subject = '".$subject[0].' '.$subject[1]."...', ".
			"comment = '".$posts['message']."', hostname = '".$posts['useip']."', timestamp = '".$posts['dateline']."', format = '1', ".
			"name = '".$posts['author']."'";
		echo $comment_insert;
		$q6 = mysql_query($comment_insert) or die("Hiba: q6 - ".mysql_error());
		echo "<br>";
 
		$posts_count++;
	}
 
    $forum_query = "SELECT td.tid FROM term_data td, nuke_XForum_forums x, nuke_XForum_threads t ".
		"WHERE td.name = x.name AND t.fid = x.fid AND td.vid >= 3 AND t.fid = '".$threads['fid']."'";  // a td.vid-re vonatkozó szűkítés csak az én rendszeremben igaz így! (Logikus módon a megfelelő vocabulary_id-re kell szűkíteni
    $forum_list = mysql_query($forum_query);
    $forum = mysql_fetch_array($forum_list);
 
    $insert_forum = "INSERT INTO forum SET nid = '".$nid."', vid = '".$vid."', tid = '".$forum['tid']."'";
 
    echo $insert_forum;
	$q7 = mysql_query($insert_forum) or die("Hiba: q7 - ".mysql_error());
 
	echo "<br>";
	$insert_term_node = "INSERT INTO term_node SET nid = '".$nid."', tid = '".$forum['tid']."'";
    echo $insert_term_node;
	$q8 = mysql_query($insert_term_node) or die("Hiba: q8 - ".mysql_error());
 
	echo "<br>";
	$lasttimestamp_query = "SELECT c.uid, c.timestamp, p.value FROM comments c LEFT JOIN (profile_values p) ON (c.uid = p.uid AND p.fid = '1') WHERE c.nid = '".$nid."' ORDER BY timestamp DESC LIMIT 1"; // valószínűleg a LIMIT 1 sem gyönyörű megoldás, de hasznos, hogy az "utolsó hozzászólás" mező kis kitöltésre kerülhessen
	$lasttimestamp_list = mysql_query($lasttimestamp_query);
	$lastts = mysql_fetch_array($lasttimestamp_list);
 
	if($lastts['value'] == '') {
		$last_comment_name = 'NULL';
		}
	else {
		$last_comment_name = $lastts['value'];
		}
 
	$insert_node_comments_count = "INSERT INTO node_comment_statistics SET nid = '".$nid."', ".
		"last_comment_timestamp = '".$lastts['timestamp']."', last_comment_name = '".$last_comment_name."', last_comment_uid = '".$lastts['uid']."', comment_count = '".$posts_count."'";
    echo $insert_node_comments_count;
	$q9 = mysql_query($insert_node_comments_count) or die("Hiba: q9 - ".mysql_error());
 
	echo "<br>";
	$update_node = "UPDATE node SET comment = '".$posts_count."' WHERE nid = '".$nid."'";
    echo $update_node;
	$q10 = mysql_query($update_node) or die("Hiba: q10 - ".mysql_error());
 
	echo "<br><hr>";
}
 
?>

Mivel a fenti konvertálás lefuttatása sok próbálkozás eredménye, közzéteszem azokat az sql-orokat is, amivel a feleslegesen betöltött sorokat lehetett törölni:

DELETE FROM comments WHERE cid > 1; -- mert ezek lesznek az első kommentek
DELETE FROM forum WHERE vid > 117; -- mert 117 sor már korábban volt a _revisions táblában
DELETE FROM node WHERE vid > 117;  -- mert 117 sor már korábban volt a _revisions táblában
DELETE FROM node_revisions WHERE vid > 117;  -- mert 117 sor már korábban volt a _revisions táblában
DELETE FROM node_comment_statistics WHERE nid > '63';  -- mert 63 node más tartalommal már korábban elkészült
UPDATE sequences SET id = '63' WHERE name = 'node_nid'; -- mert 63 node más tartalommal már korábban elkészült
UPDATE sequences SET id = '117' WHERE name = 'node_revisions_vid';
UPDATE sequences SET id = '1' WHERE name = 'comments_cid';
DELETE FROM term_node WHERE nid > 63; -- mert 63 node más tartalommal már korábban elkészült

Üdv,
P.