페이지를 삭제할 때 keep 화일은 지우지 않도록 함
- /북마크를 구현할 때, 삭제된 페이지의 삭제 이전 내용을 볼 수 있는 기능을 추가하기 위해서 구현한 패치
- 필수 요구 사항 : 없음
- 추가 요구 사항 : 없음
- 관리 메뉴에서 페이지를 삭제할 경우, 기존에는 페이지의 현재 버전이 들어 있는 .db 화일과 이전 버전들이 모아져 있는 .kp 화일을 다 삭제하였다.
- 이 패치를 적용하면, 페이지를 삭제하면 다음과 같이 동작한다.
- 현재 페이지의 내용을 keep 화일에 추가로 기록한다.
- .kp 화일은 놔두고 *.db 화일만을 삭제한다. 따라서 최근변경내역 화면에서 deleted 아이콘을 클릭했을 때 .kp 화일을 읽어서 삭제되기 이전의 내역을 볼 수 있다. 이를 이용하면 실수로 지운 페이지도 복구할 수 있다.
- 만일 삭제한 페이지를 다시 같은 이름으로 생성하게 되면, 그 시점에서 남아 있던 .kp 화일을 삭제한다. 그렇지 않을 경우 이전의 kp 화일의 내용과 새로 생성된 이후에 추가되는 kp 화일의 내용이 섞여서 history 가 꼬이게 된다. 따라서 삭제했던 페이지를 다시 생성한 이후에는 삭제 이전의 내용을 되찾을 수 없다.
- 관리 메뉴에서 하단에 있는 "RecentChanges 갱신" 옵션은, 삭제에 대해서는 더 이상 작동하지 않는다. 그 옵션의 체크 여부와 관계없이, 페이지를 삭제해도 rclog 화일에서 그 페이지에 관한 라인을 없애지 않는다.
- /페이지숨김기능을 사용하여 숨긴 페이지의 경우는 이 패치가 적용되지 않는다. 즉 rclog 화일에서 해당 페이지에 대한 내용이 무조건 지워지고, keep 화일 역시 삭제된다. 주의할 것.
- 부작용: 아직 모름
- 본인 스스로도 "자신이 뭘 하고 있는지" 제대로 알지 못하면서 작업한 패치이다. :-/
- 삭제하기 직전에 현재 페이지의 내용을 keep 화일에 기록하는 부분이 제일 문제가 된다. (그렇다고 해서 이 과정을 생략할 경우, 삭제되기 전의 가장 최신의 페이지를 찾을 수 없다)
- 테스트할 때는 별 문제가 없었다. :-)
-
sub SaveKeepSection {
my $file = &KeepFileName();
my $data;
if ($Section{'revision'} < 1) {
if (-f $file) {
unlink($file) || die "error while removing obsolete keep file [$file]";
}
return;
}
$Section{'keepts'} = $Now;
$data = $FS1 . join($FS2, %Section);
&CreatePageDir($KeepDir, $OpenPageName);
&AppendStringToFile($file, $data);
}
-
sub DeletePage {
my ($page, $doRC, $doText) = @_;
my ($fname, $status);
$page =~ s/ /_/g;
$page =~ s/\[+//;
$page =~ s/\]+//;
$status = &ValidId($page);
if ($status ne "") {
print Ts('Delete-Page: page %s is invalid', $page) . ".<br>" . Ts('error is: %s', $status) . "<br>\n";
return;
}
&OpenPage($page);
&OpenDefaultText();
&SaveKeepSection();
&ExpireKeepFile();
&WriteRcLog($OpenPageName, "*", 0, $Now, &GetParam("username",""), &GetRemoteHost(0));
$fname = &GetPageFile($page);
unlink($fname) if (-f $fname);
$fname = &GetLockedPageFile($page);
unlink($fname) if (-f $fname);
&UnlinkHtmlCache($page);
unlink($IndexFile) if ($UseIndex);
}
Note
에.. history가 꼬이는 것은 SavePage같은 곳에 kp화일의 revision을 따로 체크하는 방법이 있지 않을까요? 저는 이패치 적용 후에 일반 사용자들에게도 삭제권한을 줄 생각인데, 그렇게 되면 지금의 방법으로는 악의적인 사용자을을 막기 힘들지 않을까 싶네요. garbage kp화일은 어차피 따로 지우는 루틴을 두면 될테니까요. 세벌식 치기가 너무 힘드네요 ㅠㅠ. 좋은하루 되세요. --
Bab2 2003-2-15 3:10 am
- 또 일거리를... ㅠ,.ㅠ 뭘 원하시는 지는 압니다. 저도 계속 그 고민 하고 있었으니까요. 그런데 그러자면... 페이지를 재생성한 후에도 예전의 내역을 보려면 재생성할 때 revision 번호를 1 부터 시작하게 하지 않고 (kp 화일에 있는 마지막 revision 번호 + 1) 부터 붙여 나가던가 (이러면 history 를 볼 때, 갓 생성된 페이지가 "20번째 수정본" 이라고 나오겠군요) 아니면 지금 사용하는 revision 말고, 재생성할 때마다 1 이 증가하는 또 다른 개념의 버전을 추가로 도입해야겠죠. 그러면 페이지를 열고 변경 내역을 보고 diff 를 보고 하는 루틴들을 죄다 고쳐 주어야 할 겁니다. 지금도 솔직히 전혀 문제가 없는지 확신하지 못하는 패치인데, 이 이상 그렇게 건드리고 싶지는 않습니다. :-) 요 며칠 동안 timezone 적용 문제 때문에 이전 패치를 다시 고치면서 느낀 건데... 제가 테스트해보고 잘 돌아간다고 해서 안심할 수가 없겠더군요. cache 를 사용하느냐 마느냐, index 화일을 사용하느냐 마느냐, major diff 를 기본으로 보느냐 minor diff 를 기본으로 보느냐, (timezone 설정 정도는 약과일지도) 등등 사용환경이 사람마다 다르니까요.
- 따라서 일단 궁리는 해 보겠지만, 쉽게 패치가 나오지는 못하겠습니다. :-) 그리고 페이지 삭제 권한을 뭐하러 공개하죠? 정 지워야겠다는 페이지가 있다면 페이지의 내용을 싹 지우고 delete this page 태그를 붙이라고 하세요. 굳이 칼을 쥐어주고 그것을 휘두를까봐 걱정거리를 늘릴 필요가 없지 않을까요.
- 아니면, 저 위에서 현재는 패에지를 새로 생성할 때 kp 화일을 지우도록 했는데 거기만 바꿔서, kp 화일을 따로 지정한 디렉토리로 옮겨 버리도록 하시면 금방 되겠네요. 이미 옮겨져 있다면 뒤에 번호를 추가로 붙여서 보관해야겠죠 (.kp.1 .kp.2 .kp.3 ...) 나중에 예전 버전을 되돌리고 싶으면 마지막으로 저장된 .kp 화일을 다시 keep 디렉토리로 복사해서 쓰면 되겠죠. 좀 어거지인 듯 합니다만 :-)
2003-02-17 일자로 코드가 수정되었습니다. 최근에 변경된 적이 없는 페이지를 삭제할 경우 최근변경내역 화면에 나타나지 않게 되는데.. 페이지를 삭제하는 것도 rclog 화일에 새로 기록을 하여서 최근변경내역의 제일 최근 기록에 나타나도록 하였습니다.
sub DeletePage {
...
&SaveKeepSection();
&ExpireKeepFile();
&WriteRcLog($OpenPageName, "*", 0, $Now, &GetParam("username",""), &GetRemoteHost(0));
...
}
위키위키분류