>> Edit article
이름
제목
패스워드
제목 : 크레이지 보드를 적수네보드로 컨버트 글쓴이 : 김형숙 ( mailto:oz@rrsquad.pe.kr ) 글쓴날 : 2000-11-20 -1. 파일 다운 받기 http://rrsquad.pe.kr/crz2red.zip 0. 머릿글 안녕하세요.. 김형숙입니다. 제가 예전부터 크레이지 게시판을 mysql+php 로 짜여진 게시판으로 컨버팅 하여서 게시판을 운영한적이 있었습니다. 그런데 이 게시판은 제가 작성한 것이고 제가 이 소스를 공개 하지 않아서 몇몇 분들이 이 컨버트를 통해서 올바른 게시판 활요에 어렵다고 하시더군여. 그래서 크레이지를 완전히 적수네 게시판으로 바꾸는 것을 하였습니다. 지금 까지는 완벽하게 돌아가는 것이 확인 되었습니다. 유의사항 : 이 컨버팅은 적수네 보드 0.4 버젼으로 제한 합니다. 그 이후는 테스트 해 보시 않았습니다. 그리고 파일은 알고리즘을 알지 못해서 그냥 파일 이름만 넣게 되었습니다. 적수네 보드 0.4로 제한 되었던 것은 1.x 버젼에는 idx 라는 화면에 표시하는 인덱스가 붙습니다. 이부분이 너무 복잡하고 머리가 아파서.. 0.4 버젼으로 하였습니다.. 많은 분들이 필요로 하는 것을 정확히 하지 못한것 같지만 이글을 보시고 직접 해 보셔도 될것 같습니다. 자 방법은 아래와 같습니다. 1. tranDB 를 받아와서 크레이지에서 쓰는 gdbm 파일을 아스키 파일로 바꾼다. 2. 바뀌어진 아스키파일의 ^M(ctrl+v+m)값을 으로 대체한다. 3. 아스키 파일을 하나 하나의 개별적인 파일로 나눈다. 4. 나누어진 파일을 하나 하나 해석해서 적수네게시판으로 바꾼다. 자.. 들어 갑니다.. 1. tranDB 를 받아와서 크레이지에서 쓰는 gdbm 파일을 아스키 파일로 바꾼다. 이 파일은 gdbm를 아스키로 바꾸는 것입니다.. http://http://cwb98.nobreak.com/kr/ 에 접속하여서 잦은 질문란에 가셔서 tranDB 를 다운 받는다. 아 파일에서 손 보아야 하는 부분이있다. convGDBM2ASC.c 에서 56라인에 qURLdecode(encdata); 를 추가해서 컴파일 한다. 컴파일 끝난후에 convGDBM2ASC XXXX.gdbm XXXX.asc 하면 gdbm파일이 아스키 파일로 된다. 2.바뀌어진 아스키파일의 ^M(ctrl+v+m)값을 으로 대체한다. 이 파일의 내부를 보면.. 본문(즉 게시판에서의 내용)은 한 라인(1 줄)으로 되어 있지 않아서 추후 작업하기가 힘들어서 한 라인(1 줄)으로 만든다. 이 부분은.. 음.. 기억나지 않는 분에게서 얻었는데 perl -p -i -e 's/ / /' XXXX.asc 라고 하면 (^M)을 으로 바꾸어 버립니다. 그러면.. 본문은 모두 한 줄로 되죠.. 3. 아스키 파일을 하나 하나의 개별적인 파일로 나눈다. 아스키 파일을 보면.. ----------------tado.asc----------------------------- 582.Filename= 912.Lines=7 966.Access=19 431.Domain=210.113.140.205 1238.Lines=16 574.Lines=5 254.Subject=▶ 제가 신기한 델타버그발견 했어요!<필독> 653.Filesize= ----------------------------------------------------- 이처럼 되어 있기에.. 각각의 번호들을 이름으호 하는 파일로 분리 해 낸다. --## split.pl !/usr/bin/perl $infile = $ARGV[0] ; $outdir= $ARGV[1] ; $options = $ARGV[2] ; open( infileH, $infile ) || die "Cannot open $fileName."; if ( !$options ) { &printsql() ; } ####################### sub printsql() { while ( $aLine = <infileH> ) { if ( $aLine =~ /^d*.[FDESANPLTI]/ ) { ## 라인에서 1999.Text 같은 라인을 찾는다. @arrtext = split( /./,$aLine ) ; if ( $aLine =~ /^d*.Text/ ) { ## 라인에서 1999.Text 같은 라인을 찾는다. $prevno = $arrtext[0]; } elsif ( $aLine =~ /^d*.[FDESANPLI]/ ) { ## 라인에서 1999.Text 같은 라인을 찾는다. $prevno = 0 ; } open ( outfileH, ">>$outdir/$arrtext[0]") || die "Cannot open $arrtext[0]."; printf outfileH "$aLine" ; } close (outfileH ) ; } close( infileH ); } 사용 방법.. shell> ./split.pl XXXX.asc DIR 여기서 DIR 은 먼저 생성되어 있어야 한다. 즉 DIR 안에 파일들을 생성한다는 말입니다.. 예.. shell> ./split.pl tado.asc tado 이러면 tado 디렉토리에 숫자가 이름인 수많은 파일이 생긴다. 4. 나누어진 파일을 하나 하나 해석해서 mysql 게시판으로 바꾼다. 자 이렇게 나누어지 파일 하나로 합쳐야 할 시기이다. 밑에서 조금 고쳐야 하는 부분이 있는데.. for ( $infile = 1 ; $infile <= 1383 ;$infile++ ) 여기서 $infiel <= 5680 은 DIR 디렉토리 에 있는 파일의 마지막 파일 이름 입니다. 즉,, DIR 디렉토리에 5680이라는 파일이 가장 마지막 파일이라는 것이죠. 그리고 시간.. 즉 쓰여지 시간이 문제 인데.. 크레이지는 19990909123015 식으로 저장을 합니다. 즉 1999년 09월 09일 12시 30분 15초 입니다. 저의 게시판은 unixtimestamp로 저장이 되기에 이것을 변형을 시키는 작업을 하기에는 제가 알고 있는 펄의 실력이 너무 모지랍니다.. 그래서 제가 알고 있는 시간으로 그냥 넣어 버렸습니다. 이 부분을 혹시 펄을 잘 아시는 분께서 바꾸어 주시면 감사하겠습니다. -- ## crz2red.pl-- #!/usr/bin/perl use Time::Local; $table = $ARGV[0] ; $options = $ARGV[1] ; if ( !$options ) { &printsql() ; } ####################### sub printsql() { $vitual_no = 0 ; for ( $infile = 1 ; $infile <= 1383 ;$infile++ ) { open( infileH, $infile ) || next ; while ( $aLine = <infileH> ) { $aLine =~ s///g ; @arrtext = split(/=/,$aLine ) ; @field = split(/./,$arrtext[0]); if ($field[1] eq "Name") { $name = $arrtext[1] ; } elsif ($field[1] eq "Subject") { $title= $arrtext[1] ; $title=~ s/'/'/g ; } elsif ($field[1] eq "Access") { $refer = $arrtext[1] ; } elsif ($field[1] eq "Date") { ## 이부분은 적수님께서 알려 주셨습니다. ## $date = $arrtext[1] ; $date =~ /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})$/; $year = $1; $mon = $2 - 1; $day = $3; $hour = $4; $min = $5; $sec = $6; $date= timegm($sec,$min,$hour,$day,$mon,$year); } elsif ($field[1] eq "Email") { $email = $arrtext[1] ; } elsif ($field[1] eq "Thread") { $reno = $arrtext[1] ; } elsif ($field[1] eq "Filename") { $file = $arrtext[1] ; $file =~ s/'/'/g ; } elsif ($field[1] eq "Password") { $password = $arrtext[1] ; } elsif ($field[1] eq "IP") { $host = $arrtext[1] ; } elsif ($field[1] eq "Text" ) { $text = "" ; if ( $#arrtext >= 2 ) { for ( $i = 1 ; $i <= $#arrtext ; $i++ ) { if ( $i == 1 ) { $equel = ""; } else { $equel = "=" ;} $text = $text . $equel . $arrtext[$i] ; } $text =~ s/ //g ; $text =~ s//\\/g ; $text =~ s/'/'/g ; } else { $text = $arrtext[1] ; $text =~ s/ //g ; $text =~ s//\\/g ; $text =~ s/'/'/g ; } } } if ( $reno != 0 ) { #이글은 부모글이 존재하며 부모글이 reno라는 뜻 # print "UPDATE $table SET reyn = '1' WHERE no = '$reno';" ; $num = 0 ; # rede 는 댓글의 level 인데 그 레벨을 한단계 더함 $rede = $reply{"$reno"}->{reno} + 1 ; ## 2차원 hash라고 하는데 ## $reply{"reno"} = {"reno"=>"a값", "reto" => "b값"} ## 가지도록 함. if ( !exists( $reply{"$reno"}->{reto} ) ) { ## 댓글인데 reto가 존재하면 그 값을 가져 오고 아니면 reno 값을 가짐 $reto = $reno; } else { $reto = $reply{"$reno"}->{reto} ; } $reply{"$infile"} = { reno =>$rede, reto =>$reto }; } else { $vitual_no = $vitual_no + 1 ; $num = $vitual_no ; $rede = 0 ; $teto = 0 ; $reyn = 0 ; } print "INSERT INTO $table VALUES ('$infile', '$num', '$date', '$host', '$name', '$password', '$email', '', " ; print "'$title', '$text', '$refer', '$reyn', '$reno', '$rede', '$reto', '$file', '', '' );"; } close( infileH ); } ---------------------------- 사용 방법.. 여기서 디렉토리는 tado 즉 아까 생성한 디렉토리.. <== 중요 이부분을 읽어 보시지 않고 안된다고 메일 주시는 분이 계십니다. 즉.. 수많은 번호로된 파일이 있는 디렉토리 입니다. shell> ./crz2sql.pl tado > tado.sql 여기서 tado 은 생성될 테이블 이름입니다. 자 이러면.. tado.sql이 생성 됩니다. 이러면.. mysql -p DB < tado.sql 마치며.. 덧말 1. 위 방법으로해서 생긴 문제는 제가 책임을 지지 않습니다. 바꾸시기전에 백업을 꼭 해 놓으세요.. 덧말 2. 위에서 바뀐 게시판을 보고 싶으면 아래 사이트로 오시면 됩니다. http://ns.bookmir.com/jsboard-0.4/ 덧말 3. 위의 교보재인 타도게시판을 제공하신 OBJET *DF*님에게 감사 드립니다. 케케.. 덧말 4. 위에서 바꾼 게시판은 제가 즐겨 하고 동호회에서 활동하는 델타 포스 게임 동호회 게시판입니다. 많은 분들이 렌보만 하시더군여.. 델타도 잼 있는데.. 혹시 관심 있는 분들은 http://rrsquad.pe.kr 오셔서 구경하세여.. 고기에 제가 허접하게 짠 보드도 있네여.. 케케 덧말 5. 즐거운 리눅싱 되세요.
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved