>> Edit article
이름
제목
패스워드
제목 : 크레이지 게시판을 SQL DB의 게시판으로 바꾸기.. 분류 : OS : Alzza RedHat 5.2 ( Linux ) 필요 소프트웨어 : perl, tranDB 활용예 : 크레이지 보드를 Mysql+Php 로 짜여진 게시판으로 컨버트 글쓴이 : 김형숙 ( oz@rrsquad.pe.kr ) 글쓴날 : 2000-03-03 오타수정을 합니다.. 안녕하세요.. 김형숙입니다. 크레이지로 된 게시판을 제가 직접 짠 php와 Mysql로 된 게시판으로 바꾸려 는 과정에서 이 같은 정보를 얻게 되었습니다. 많은 분들에게 도움이 되었으면 합니다. 0장. 알려진 버그 %c 크레이지 게시판 본문에 %c라는 글자가 있으면.. split.pl 과 crz2sql.pl이 오작동 합니다. 원인을 밝혀지지 않았지만. 결론은 만들어진 sql파일이 입력 에러 를 내는 것이죠 1장. 방법 1. tranDB 를 받아와서 크레이지에서 쓰는 gdbm 파일을 아스키 파일로 바꾼다. 2. 바뀌어진 아스키파일의 ^M(ctrl+v+m)값을 으로 대체한다. 3. 아스키 파일을 하나 하나의 개별적인 파일로 나눈다. 4. 나누어진 파일을 하나 하나 해석해서 mysql 게시판으로 바꾼다. 자.. 들어 갑니다.. 1. tranDB 를 받아와서 크레이지에서 쓰는 gdbm 파일을 아스키 파일로 바꾼다. 이 파일은 gdbm를 아스키로 바꾸는 것입니다.. http://cwb98.nobreak.com/kr/ 에 접속하여서 잦은 질문란에 가셔서 tranDB 를 다운 받는다. 아 파일에서 손 보아야 하는 부분이있다. convGDBM2ASC.c 에서 57라인에 qURLdecode(encdata); _____54_ for(progress = 1; key.dptr != NULL; progress++) { _____55_ data = gdbm_fetch(dbf, key); _____56_ encdata = qURLencode(data.dptr); _____57_ qURLdecode(encdata); <== 추가 _____58_ /* save */ _____59_ fprintf(fp, "%s=%s", key.dptr, encdata); 를 추가해서 컴파일 한다. 컴파일 끝난후에 convGDBM2ASC XXXX.gdbm XXXX.asc 하면 gdbm파일이 아스키 파일로 된다. 2.바뀌어진 아스키파일의 ^M(ctrl+v+m)값을 으로 대체한다. 이 파일의 내부를 보면.. 본문(즉 게시판에서의 내용)은 한 라인(1 줄)으로 되어 있지 않아서 추후 작업하기가 힘들어서 한 라인(1 줄)으로 만든다. 이 부분은 윤길중(hklife@soback.kornet.net)님께서 가르져 주셨습니다. 감사 합니다. perl -p -i -e 's/ / /' XXXX.asc 라고 하면 (^M)을 으로 바꾸어 버립니다. 그러면.. 본문은 모두 한 줄로 되죠.. 3. 아스키 파일을 하나 하나의 개별적인 파일로 나눈다. 아스키 파일을 보면.. 848.Date=19990906180723 100.Filename= 44.Subject=헤헤헤.. 이렇게.. 되니깐.. 915.Text=안녕하세용.. 지금.. 히히.. 그렇게.. ... ... 324.Email=oz@rrsquad.pe.kr 이처럼 되어 있기에.. 각각의 번호들을 이름으호 하는 파일로 분리 해 낸다. --## 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 ozbrd.asc ozbrd 이러면 qna1 디렉토리에 숫자가 이름인 수많은 파일이 생긴다. 4. 나누어진 파일을 하나 하나 해석해서 mysql 게시판으로 바꾼다. 자 이렇게 나누어지 파일 하나로 합쳐야 할 시기이다. 밑에서 조금 고쳐야 하는 부분이 있는데.. for ( $infile = 1 ; $infile <= 5680 ;$infile++ ) 여기서 $infiel <= 5680 은 DIR 디렉토리 에 있는 파일의 마지막 파일 이름 입니다. 즉,, DIR 디렉토리에 5680이라는 파일이 가장 마지막 파일이라는 것이죠. 그리고 시간.. 즉 쓰여지 시간이 문제 인데.. 크레이지는 19990909123015 식으로 저장을 합니다. 즉 1999년 09월 09일 12시 30분 15초 입니다. 저의 게시판은 unixtimestamp로 저장이 되기에 이것을 변형을 시키는 작업을 하기에는 제가 알고 있는 펄의 실력이 너무 모지랍니다.. 그래서 제가 알고 있는 시간으로 그냥 넣어 버렸습니다. 이 부분을 혹시 펄을 잘 아시는 분께서 바꾸어 주시면 감사하겠습니다. -- ## crz2sql.pl-- 자 아래는 저의 게시판에 맞게 되어 있습니다. 자신에게 맞는 필드를 따로 정의 하여서 바꾸어야 합니다. #!/usr/bin/perl $table = $ARGV[0] ; $options = $ARGV[1] ; if ( !$options ) { &printsql() ; } ####################### sub printsql() { $vitual_no = 0 ; for ( $infile = 1 ; $infile <= 5680 ;$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") { $subject= $arrtext[1] ; $subject=~ s/'/'/g ; } elsif ($field[1] eq "Access") { $hit = $arrtext[1] ; } elsif ($field[1] eq "Email") { $email = $arrtext[1] ; } elsif ($field[1] eq "Thread") { $reno = $arrtext[1] ; } elsif ($field[1] eq "Filename") { $file = $arrtext[1] ; } elsif ($field[1] eq "Password") { $password = $arrtext[1] ; } elsif ($field[1] eq "IP") { $ip = $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 ) { print "UPDATE $table SET re = '1' WHERE no = '$reno';" ; $vno = 0 ; $redt = $redt_hasy{ "$reno" } + 1 ; %redt_hasy = ( "$infile" , $redt ) ; } else { $vitual_no = $vitual_no + 1 ; $vno = $vitual_no ; $redt = 0 ; } print "INSERT INTO $table VALUES ('$infile','0','$reno','$redt','$hit','$vno','935000000','$ip','$name', '','$email','','$subject','$text','$file');"; } close( infileH ); } 여기서 redt는 댓글의 레벨,, re는 부모 레벨에서의 댓글있는가의 여부 reno는 댓글일 경우 부모글의 번호 vno는 보여지는 번호 no는 절대 번호 입니다.. 이부분은 자신에게 맞게끔.. 최적화 해야 겠죠. 사용 방법.. 여기서 디렉토리는 ozbrd 즉 아까 생성한 디렉토리.. 즉.. 수많은 번호로된 파일이 있는 디렉토리 입니다. shell> ./crz2sql.pl ozbrd > ozbrd.sql 여기서 ozbrd 은 생성될 테이블 이름입니다. 자 이러면.. ozbrd.sql이 생성 됩니다. 이러면.. mysql -p DB < ozbrd.sql 2장 마치며.. 제가 혼자 많은 분의 (1분 -- 윤길중님) 도움으로 우리 사이트의 게시판을 다 바꾸었습니다. 예전의 크레이지는 5천개의 글이 잇으면 속도가 3초가 넘어 갔는데 지금 1만1천개의 글이 잇는데도 속도가 2초를 약간 넘네요.. 바꾸기 잘한것 같습니다. 자신에 맞는 옵티마이져를 하기 힘든신분은 제가 약간의 시간으로 해 드리겠습니다. 저같은 사람에게 많은 도움이 되기를 바랍니다.. 덧말. 참고러 제가 많던 게시판이 버젼이 0.0.2b10 인데.. 0.0.3이 되면.. 공개를 할 예정입니다. 아직 어드민 부분이 약해서.. 덧말 2. 펄을 잘 아시는 분은 제가 미쳐 하지 못한 시간을 적당한 unixtimestamp로 바꾸는 방법을 저에게 알려 주십시요. 그 럼.. 제가 버젼업된 컨버트 방법을 생각해 보겠습니다. 덧말 3. 위 방법으로해서 생긴 문제는 제가 책임을 지지 않습니다. 바꾸시기전에 백업을 꼭 해 놓으세요.. 즐거운 리눅싱 되세요.
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved