### 작성물 : 크레이지보드 에서 그누보드로 간단하게 이전하기
### 작성자 : 바다웹호스팅 권기성 nonots@hanmail.net
### 작성일 : 2010-10-27
참조 사이트 :
http://www.xpressengine.com/855725
http://www.xpressengine.com/?mid=zb4_tip&sort_index=regdate&order_type=asc&page=4&document_srl=814203
http://terzeron.net/wp/?p=371
...
압축파일을 풀면
CWB2000toZB4.zip : 인터넷에서 다운받은 제로보드로 변환파일(원작자에 감사를)
tranDB.zip : convGDBM2ASC 명령어 컴파일 위한 소스(원작자에 감사를)
convGDBM2ASC.tgz : 내가 컴파일한 명령어
crazy2gnuboard.php : 내가 만든 간단한 php 샘플
..
이렇게 4개의 파일이 나온다.
1.
크레이지 보드 crazywwwboard 라는 건 mysql 같은 DBMS 를 사용하지 않고
파일DB 를 사용한 게시판이다.
크레이지보드가 wwwboard 에 설치가 되어있고
이전할 게시판 이름이 freeboard 라고 하자.
보통
http://www.aaa.co.kr/wwwboard/CrazyWWWBoard.cgi?db=freeboard
이런 식으로 경로가 된다.
고로
게시물이 저장된 파일DB 의 파일명은
wwwboard/data/freeboard.gdbm
와 같이 확장자가 gdbm 으로 되어서 저장된다.
이게 이진파일이어서 텍스트로 못본다. 이걸 일단 아스키파일로 변환해야한다.
2.
위에서 convGDMB2ASC.tgz 을 압축풀면
convGDBM2ASC 와 convASC2GDMB 이렇게 2 개의 이진파일 명령어가 나온다.
이건 위 tranDB.zip 소스를 가지고
CentOS 4.8 ( 32비트) 리눅스에서 컴파일한거다.
tranDB.zip 소스가 좀 오래된거라서 그런지 소스 컴파일환경 맞추기도
골치아프다.
암튼 운좋으면 내가 컴파일한걸로 될꺼다.
convGDBM2ASC ./freeboard.gdbm ./freeboard.asc
와 같이 명령어를 내리면 freeboard.asc 라는 텍스트 문서가 생긴다
게시물의 제목 본문 작성자 등의 정보가 들어있다.
근데 이게 암호같이 들어 있어서 그냥은 알아 먹을수가 없다.
3.
첨부한 CWB2000toZB4.zip 암축풀면 나오는 php 파일을 참조해서
간단한 sql 문 생성하는 소스를 crazy2gnuboard.php 라는
걸로 만들었다.
이래와 같다. 좀 엉성하다.
아래 소스를 웹브라우저로 열어서 화면에 보이는 insert 문을
복사해서 db 에 밀어 넣으면 될꺼다.
그런데 아직은 그누보드 게시판 목록이 좀 이상할꺼다.
4.
그리고 그누모드 관리모드 게시판 관리에서 freeboard 게시판
정보 수정화면에서
"카운트 조정" 이라는 곳에 체크를 하고 저장하기
한번 해야 줄 번호가 정상적으로 보일꺼다.
## 주의 :
크레이지보드에서 첨부파일 있거나 답글 달린건 온전하게 안된다.
답글달린 계층형으로 이전은 안된다.
그냥 gdbm 구조에서 sql 문 만드는 부분만 샘플코드로 참고하길.
..
실력되는 사람은 CWB2000toZB4.zip 소스 보고
제로보드 이전하듯이 그누보드도 이전하면 될꺼다.
#### crazy2gnuboard.php 샘플코드
<?
// crazy 보드의 gdbm 파일에서 변환한 아스키파일
// convGDBM2ASC 명령어로 변환함
$filename = "./freeboard.asc";
$bo_table = "freeboard"; // 이전할 그누보드 bo_table 이름
if(!$f=file($filename)) Error("파일을 읽지 못하였습니다.");
for($i=0; $f[$i]; $i++) {
list($num, $data)=explode(".", $f[$i], 2);
list($key, $value)=explode("=", $data, 2);
// db hack 방지
$c[$num][$key]=addslashes(ereg("%[0-9a-f]{2}",$value) ? urldecode($value) : $value);
//if(!($i%100)) fecho ("<BR>\n");
}
// 관리자 테이블 생성
$cUseCategory = (trim($c[conf][UseCategory]) == "true") ? 1 : 0;
$cHtmlAccept = (trim($c[conf][HtmlAccept]) == "true") ? 2 : 0;
$cDisplayAddress = ( trim($c[conf][DisplayAddress]) == "true") ? 1 : 0;
ksort($c);
$threadnum=0;
while( list($cnum, $temp) = each($c) ) {
// 설정 어레이의 경우 스킵~
if ($cnum=="conf") continue;
if (!$cHtmlAccept) $temp[Text]=nl2br($temp[Text]);
$temp[Email]=trim($temp[Email]);
$temp[Thread]=trim($temp[Thread]);
$temp[passwd]=trim($temp[Password]);
$d=$temp[Date];
if($cUseCategory)
$temp[cate] = $temp[Category] ? $zCate[trim($temp[Category])] : $zCate[_NOTSELECTED];
else
$temp[cate] = 0;
$temp[date]=mktime($d[8].$d[9], $d[10].$d[11], $d[12].$d[13], $d[4].$d[5], $d[6].$d[7], substr($d,0,4));
/*
echo("INSERT INTO (ip, password, name, email, subject, reg_date, hit, vote, category, memo )
VALUES
('$temp[Domain]','$temp[passwd]','$temp[Name]','$temp[Email]','$temp[Subject]', '$temp[date]','$temp[Access]','$cnum','$temp[cate]','$temp[Text]') ");
*/
++$kknum;
$wr_id = $wr_parent = $kknum;
$wr_num = -$wr_id;
$wdate = '';
$wdate = date("Y-m-d H:i:s",$temp[date]);
$sql = "insert into g4_write_{$bo_table} set
wr_id = '".$wr_id."',
wr_num = '".$wr_num."',
wr_parent = '".$wr_parent."',
wr_subject= '".$temp[Subject]."',
wr_content= '".$temp[Text]."',
wr_hit = '".$temp[Access]."',
wr_ip = '".$temp[Domain]."',
mb_id = 'admin',
wr_name = '".$temp[Name]."',
wr_email = '".$temp[Email]."',
wr_datetime = '".$wdate."' ;
";
echo "\n\n";
//echo "$sql \n\n";
$sql .= "insert into g4_board_new ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values
( '$bo_table', '$wr_id', '$wr_id', '".$wdate."', 'admin' );";
echo "\n\n";
echo "$sql ";
}
?>