>> Read No. 432 article  
크레이지 게시판을 SQL DB의 게시판으로 바꾸기..

등록 2000-03-03 15:29:00     조회 5
이름 김형숙    

		제목 : 크레이지 게시판을 SQL DB의 게시판으로 바꾸기..
분류 :
         OS : Alzza RedHat 5.2 ( Linux )
	필요 소프트웨어 : perl, tranDB
활용예 : 크레이지 보드를 Mysql+Php 로 짜여진 게시판으로 컨버트
글쓴이 : 김형숙 ( oz at 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 at soback.kornet.net)님께서 가르져 주셨습니다.
감사 합니다.
 perl -p -i -e 's/
/
/' XXXX.asc
 라고 하면 (^M)을
으로 바꾸어 버립니다.
그러면.. 본문은 모두 한 줄로 되죠..
 3. 아스키 파일을 하나 하나의 개별적인 파일로 나눈다.
아스키 파일을 보면..
848.Date=19990906180723
100.Filename=
44.Subject=헤헤헤.. 이렇게.. 되니깐..
915.Text=안녕하세용.. 지금..
히히.. 그렇게..
 ... ...
324.Email=oz at 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초를 약간 넘네요..
바꾸기 잘한것 같습니다.
 자신에 맞는 옵티마이져를 하기 힘든신분은 제가 약간의
시간으로 해 드리겠습니다.
저같은 사람에게 많은 도움이 되기를 바랍니다..
 덧말.
참고러 제가 많던 게시판이 버젼이 emoticon.2b10 인데..
emoticon.3이 되면.. 공개를 할 예정입니다.
아직 어드민 부분이 약해서..
 덧말 2.
펄을 잘 아시는 분은 제가 미쳐 하지 못한
시간을 적당한 unixtimestamp로 바꾸는 방법을 저에게 알려 주십시요. 그
럼.. 제가 버젼업된 컨버트 방법을 생각해 보겠습니다.
 덧말 3.
위 방법으로해서 생긴 문제는 제가 책임을 지지 않습니다.
바꾸시기전에 백업을 꼭 해 놓으세요..
 즐거운 리눅싱 되세요.
이름
암호


>> 관련글
432 크레이지 게시판을 SQL DB의 게시판으로 바꾸기..  김형숙  2000.03.03  ....
  답장 RE: perl에서 시간 형식 변환  적수  2000.02.15  ....
  목록보기 윗글 아랫글
글쓰기
답장쓰기 수정 삭제
정규표현식 [ 상세 검색 ]
페이지로딩: [ 0.83 초 ] 작업시간: [ 0.43 초 ]

Copyleft 1999-2026 by JSBoard Open Project
Theme Designed by IDOO All right reserved
[TOP]

적수네 동네
+
| 적수네 동네
| 공부방
| 리눅스 잡지 서고
| LSN 소스
| 링크 모음
+---+
게시판
+
| 떠들어보세!
| 질문과 답변
| 새소식과 정보
| 1원짜리 팁?
| 대화방
+---+
칼럼?
+
| 세하 훔쳐보기
| Welcome2nite
| 혜진의 염장판
+---+
리눅스 상표권
+
| 반대 서명란
| 토론 게시판
+---+
GNU
+
| GNU 선언문
| GNU GPL
| GNU 미러 목록
+---+
프로젝트?
+
| 리눅스카운터
| RC5DES
| 실질헌법 제작
+---+
커널 소식
+
| 안정 버젼: 2.4.14
+---+
테마 선택
+
LSN 방송국?
+
| OFF AIR
+---+
회원
+
| 로그인
+---+
[ 적수네 동네 ] [ 리눅스 상표권 독점 반대 ] [ 한글 리눅스 문서 프로젝트 ] [ KrLine ] [ 사랑넷 ] [ Valid HTML 4.0! ] [ SlashDot ] [ Freshmeat ]
Copyleft (C) 1998-2001 Byeong-Chan Kim . License
TIME: 1791034220
System by WYZsoft, HDD by I.O.Linux, Mizi Research, Embryo, WOWLINUX, Domain by SarangNet, Network by KrLine.