#!/usr/bin/env perl
#
# crazy2zero.pl
#
# CrazyWWWBoard-3.0.1에서 사용되던 GDBM 데이터를 zeroboard로 옮기기 위한
# 변환 스크립트
# 1. 제로보드에서 관리자 권한으로 새로운 게시판을 생성한다.
# 2. 이 변환 스크립트를 실행하여 SQL 파일을 생성한다.
# 3. SQL 파일을 MySQL에 로드한다.
# 4. 게시물이 보이지 않으면, 다음을 실행한다.
# update zetyx_board_1997 set total_article = <게시물 갯수>;
# 5. 제로보드에서 관리자 권한으로 게시물 정리를 한 번 수행해 준다.
#
# ToDo or Bugs
# 1) prev_no, next_no에 대한 처리가 제대로 되어 있지 않음
# 2) father, child에 대한 관계가 불명확함(thread 개념이 없음)
# 3) 사용자 권한이 부여되지 않음(어쩔 수 없는 문제)
use FileHandle;
use English;
use GDBM_File;
use Time::Local;
# 다음 설정을 변경할 것
#my $dbmfilename = "XXXXXXXXXXXXX.gdbm";
my $dbmfilename = "95.gdbm";
my $tablename = "zetyx_board_YYYYYYYYYYYYYY";
my $outfilename = "ZZZZZZZZZZZZZ.sql.txt";
my %hash;
my $no = 1;
my $prev_no = 1;
my $count = 0;
my $max_num = 0;
my $key;
my $value;
my $subject;
my $thread;
my $access;
my $date;
my $year;
my $mon;
my $mday;
my $hour;
my $min;
my $sec;
my $reg_date;
my $ip;
my $domain;
my $email;
my $filename;
my $name;
my $text;
my $depth;
my $addr;
my $password;
tie(%hash, "GDBM_File", $dbmfilename, $GDBM_RDONLY, 0644) or
die "can't open GDBM file\n";
sub get_hash_value {
my $no = shift @_;
my $name = shift @_;
$key = $no . "." . $name;
$key =~ s/$/\x00/;
$value = $hash{$key};
$value =~ s/\x00$//;
$value;
}
$OUTPUT_AUTOFLUSH = 1;
print "Determining all keys in the GDBM file...\n";
my @list = keys %hash;
print "Determining maximum article number...\n";
print "|";
print "";
foreach $a_key (@list) {
$a_key =~ /(\d+)\.\w+/;
if ($max_num < $1) {
$max_num = $1;
}
$count++;
if ($count == 10) {
print "\b-";
print "";
} elsif ($count == 20) {
print "\b\\";
print "";
} elsif ($count == 30) {
print "\b|";
print "";
} elsif ($count == 40) {
print "\b/";
print "";
$count = 0;
}
}
print "\bThe maximum article number: $max_num\n";
print "Writing SQL statements to a file...\n";
open(FILE, "> $outfilename") or
die "can't open file '$outfilename' for writing, $!\n";
for ($no = 1; $no <= $max_num; $no++) {
$subject = get_hash_value($no, "Subject");
if (not defined $subject or $subject eq "") {
next;
}
$subject =~ s/\'/\\\'/g;
$thread = get_hash_value($no, "Thread");
$access = get_hash_value($no, "Access");
$date = get_hash_value($no, "Date");
($year, $mon, $mday, $hour, $min, $sec) =
$date =~ /(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/;
$sec = 0;
#print "$year $mon $mday $hours $min $sec\n";
$reg_date = timelocal($sec, $min, $hour, $mday, $mon - 1, $year);
$ip = get_hash_value($no, "IP");
$domain = get_hash_value($no, "Domain");
if (defined $domain and $domain ne "") {
$addr = $domain;
} else {
$addr = $ip;
}
$email = get_hash_value($no, "Email");
$filename = get_hash_value($no, "Filename");
$name = get_hash_value($no, "Name");
$name =~ s/\'/\\\'/g;
$password = get_hash_value($no, "Password");
$text = get_hash_value($no, "Text");
$text =~ s/\'/\\\'/g;
$text =~ s/\r//g;
$text =~ s/\n/\\n/g;
if (defined $thread and $thread ne "0" and $thread ne "") {
$depth = 1;
} else {
$depth = 0;
}
print FILE "insert into $tablename values ($no, 1, -$no, 0, 0, ";
print FILE ($no - 1) . ", " . ($no + 1) . ", $thread, 0, 0, 0, ";
print FILE "'$text', '$addr', '$password', '$name', '', '$email', ";
print FILE "'$subject', '', '', 1, '', '', '', '', '', '', '', 0, 0, ";
print FILE "$reg_date, $access, 0, 0, '', '');\n";
$count++;
if ($count == 10) {
print "\b-";
print "";
} elsif ($count == 20) {
print "\b\\";
print "";
} elsif ($count == 30) {
print "\b|";
print "";
} elsif ($count == 40) {
print "\b/";
print "";
$count = 0;
}
}
close(FILE);
untie %hash;
댓글 2개
kevin
안녕하세요? 혹시 여기 댓글을 보실지는 모르겠지만..
can’t open GDBM file 이 나오고 자꾸 죽어버리네요..
물론 파일명은 맞춰줬구요.. 권한도 777로 줬는데도요..
혹 원인을 아시면 부탁드립니다 ^^
감사합니다.
terzeron
kevin님, 아마 GDBM 라이브러리가 시스템에 설치되어 있지 않아서 발생하는 문제가 아닐까요?
아니면 perl과 GDBM을 연동해주는 라이브러리(GDBM_File?)가 설치되어 있지 않아서 발생하는 문제일 수도 있습니다.
이 답변은 메일로도 드립니다.