Zeroboard -> MetaBBS 컨버터Jan 12, 2007

발로 대충 대충 만들었음.
패스워드에 대한 처리는 함수를 따로 만들거나, 필터를 추가해서 플러그인으로 해결해야 함.

PHP:
  1. <?php
  2. header("Content-type:text/html; charset=utf-8");
  3. define('ZB_DIR', '/home/dna/public_html/bbs');
  4. define('METABBS_DIR', realpath(dirname(__FILE__) . '/'));
  5.  
  6. require 'lib/config.php';
  7. $config = new Config('metabbs.conf.php');
  8.  
  9. define('METABBS_TABLE_PREFIX', $config->get('prefix', 'meta_'));
  10. define('ZB_TABLE_PREFIX', 'zetyx_');
  11.  
  12. $config->set('force_utf8', 1);
  13. $backend = $config->get('backend', 'mysql');
  14.  
  15. require 'lib/model.php';
  16. require 'lib/backends/' . $backend . '/backend.php';
  17. require 'model/board.php';
  18. require 'model/category.php';
  19. require 'model/post.php';
  20. require 'model/comment.php';
  21. require 'model/attachment.php';
  22. require 'model/user.php';
  23.  
  24. require 'lib/user_manager.php';
  25.  
  26. $conn = get_conn();
  27.  
  28. function toutf8(&$item, $key) {
  29.     $item = iconv("euckr", "utf8", $item);
  30. }
  31. function unhtmlspecialchars(&$item) {
  32.     $item = str_replace(array("&amp;","&quot;","&lt;","&gt;","&nbsp;"), array("&","\"","<",">"," "), $item);
  33. }
  34.  
  35. class ZeroBoard {
  36.     function _query($sql, $euckr = true) {
  37.         if ($euckr) mysql_query("SET NAMES euckr");
  38.         $res = mysql_query($sql);
  39.         if ($euckr) mysql_query("SET NAMES utf8");
  40.         return $res;
  41.     }
  42.     function process_users() {
  43.         $res = $this->_query("SELECT user_id, password, name, email, homepage, level FROM ".ZB_TABLE_PREFIX."member_table") or die(mysql_error());
  44.    
  45.         while ($user = mysql_fetch_assoc($res)) {
  46.             array_walk($user, 'toutf8');
  47.             UserManager::signup($user['user_id'], $user['password'], $user['name'], $user['email'], $user['homepage']);
  48.         }
  49.     }
  50.     function get_boards() {
  51.         $res = $this->_query("SELECT name,use_pds,use_category FROM ".ZB_TABLE_PREFIX."admin_table");
  52.         $boards = array();
  53.         while ($board = mysql_fetch_assoc($res)) {
  54.             $boards[] = array(
  55.                 "name" => $board['name'],
  56.                 "use_attachment" => ($board['use_pds']) ? 1 : 0,
  57.                 "use_category" => ($board['use_category']) ? 1 : 0
  58.             );
  59.         }
  60.         return $boards;
  61.     }
  62.     function get_categories($category_name) {
  63.         $res = $this->_query("SELECT name FROM ".ZB_TABLE_PREFIX."board_category_".$category_name);
  64.         $categories = array();
  65.         while ($category = mysql_fetch_assoc($res)) {
  66.             array_walk($category, 'toutf8');
  67.             $categories[] = $category['name'];
  68.         }
  69.         return $categories;
  70.     }
  71.     function get_posts($board) {
  72.         $res = $this->_query("SELECT no,ismember,category,name,subject,memo,password,reg_date,hit,file_name1,file_name2 FROM ".ZB_TABLE_PREFIX."board_".$board['name']." WHERE depth=0 ORDER BY no ASC");
  73.         $posts = array();
  74.         while ($post = mysql_fetch_assoc($res)) {
  75.             array_walk($post, 'toutf8');
  76.             array_walk($post, 'unhtmlspecialchars');
  77.             $posts[] = $post;
  78.         }
  79.         return $posts;
  80.     }
  81.     function get_comments($post, $board) {
  82.         $post['no'];
  83.         $res = $this->_query("SELECT ismember,name,memo,reg_date FROM ".ZB_TABLE_PREFIX."board_comment_".$board['name']." WHERE parent='{$post['no']}'");
  84.         $comments = array();
  85.         while ($comment = mysql_fetch_assoc($res)) {
  86.             array_walk($comment, 'toutf8');
  87.             array_walk($comment, 'unhtmlspecialchars');
  88.             $comments[] = $comment;
  89.         }
  90.         return $comments;
  91.     }
  92.     function find_post_category($post, $board) {
  93.         if (!$board->use_category) return 0;
  94.  
  95.         $category = mysql_fetch_assoc($this->_query("SELECT name FROM ".ZB_TABLE_PREFIX."board_category_".$board->name." WHERE no='{$post['category']}'"));
  96.         $category = mysql_fetch_assoc($this->_query("SELECT id FROM ".METABBS_TABLE_PREFIX."category WHERE board_id='{$board->id}' AND name='{$category['name']}'"));
  97.  
  98.         return ($category['id']) ? $category['id'] : 0;
  99.     }
  100.     function find_owner($post) {
  101.         if ($post['ismember'] <1) return false;
  102.  
  103.         $user = mysql_fetch_assoc($this->_query("SELECT user_id FROM ".ZB_TABLE_PREFIX."member_table WHERE no='{$post['ismember']}'"));
  104.         $user = mysql_fetch_assoc($this->_query("SELECT id, user, name, password FROM ".METABBS_TABLE_PREFIX."user WHERE user='{$user['user_id']}'", false));
  105.  
  106.         return $user;
  107.     }
  108.     function get_attachments($post) {
  109.         $attachments = array();
  110.         if ($post['file_name1']) $attachments[] = $post['file_name1'];
  111.         if ($post['file_name2']) $attachments[] = $post['file_name2'];
  112.         return $attachments;
  113.     }
  114. }
  115.  
  116. $zb = new ZeroBoard();
  117. $zb->process_users();
  118. foreach ($zb->get_boards() as $zb_board) {
  119.     $board = new Board(array('name' => $zb_board['name']));
  120.     $board->use_category = $zb_board['use_category'];
  121.     $board->use_attachment = $zb_board['use_attachment'];
  122.     $board->create();
  123.     $board = Board::find_by_name($zb_board['name']);
  124.     if ($board->use_category) {
  125.         foreach ($zb->get_categories($board->name) as $zb_category) {
  126.             $board->add_category(new Category(array('name' => $zb_category)));
  127.         }
  128.     }
  129.  
  130.     foreach ($zb->get_posts($zb_board) as $zb_post) {
  131.         $user = $zb->find_owner($zb_post);
  132.         $post = new Post(array(
  133.             "board_id" => $board->id,
  134.             "user_id" => ($user) ? $user['id'] : 0,
  135.             "name" => ($user) ? $user['name'] : $zb_post['name'],
  136.             "category_id" => $zb->find_post_category($zb_post, $board),
  137.             "title" => $zb_post['subject'],
  138.             "body" => $zb_post['memo'],
  139.             "password" => null,
  140.             "views" => $zb_post['hit'],
  141.         ));
  142.         $post->create();
  143.         mysql_query("UPDATE ".METABBS_TABLE_PREFIX."post SET created_at=FROM_UNIXTIME('{$zb_post['reg_date']}') WHERE board_id='{$board->id}' AND id='{$post->id}'");
  144.         foreach ($zb->get_comments($zb_post, $zb_board) as $zb_comment) {
  145.             $user = $zb->find_owner($zb_comment);
  146.             $comment = new Comment(array(
  147.                 "board_id" => $board->id,
  148.                 "post_id" => $post->id,
  149.                 "user_id" => ($user) ? $user['id'] : 0,
  150.                 "name" => ($user) ? $user['name'] : $zb_comment['name'],
  151.                 "body" => $zb_comment['memo'],
  152.                 "password" => null,
  153.             ));
  154.             $comment->create();
  155.             mysql_query("UPDATE ".METABBS_TABLE_PREFIX."comment SET created_at=FROM_UNIXTIME('{$zb_comment['reg_date']}') WHERE board_id='{$board->id}' AND id='{$comment->id}'");
  156.         }
  157.         foreach ($zb->get_attachments($zb_post) as $zb_attachment) {
  158.             $attachment = new Attachment(array('post_id' => $post->id, 'filename' => basename($zb_attachment), 'type' => mime_content_type(ZB_DIR."/".$zb_attachment)));
  159.             $attachment->create();
  160.             copy(ZB_DIR."/".iconv("utf8","euckr",$zb_attachment), METABBS_DIR."/data/uploads/".$attachment->id);
  161.         }
  162.     }
  163. }
  164. ?>

Leave a Message

2 Messages

이 컨버터에 대한 좀더 자세한 설명을 해 주실 수 있으신가요? 이걸 metabbs 디렉토리에 zb2meta.php로 저장하고 실행을 해 봤는데, 아무 일도 일어나지 않더군요! 여기든 메타비비에스 포럼이든 메일이든 어느 곳이든 상관없습니다. 미리 감사드립니다.

아무 일도 일어나지 않으면 변환이 되고 있는 겁니다. 그냥 기다리시면 될 듯 합니다.
(물론 ZB_DIR 은 지정해줘야 하고요)

그나저나 성공하신 것 같군요. 답이 늦어서 죄송합니다.

RSS feed for comments on this post.
TrackBack URI : http://encyphered.net/blog/171/trackback/

Leave a Message