1 ###############################################################################
3 # FSWiki¥Ç¥Õ¥©¥ë¥È¤Î¥¹¥È¥ì¡¼¥¸¥×¥é¥°¥¤¥ó¡£
6 # setup.dat¤Îbackup=1¤â¤·¤¯¤Ïbackup¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò¾Êά¤·¤¿¾ì¹ç¤Ï£±À¤Âå¤Î¤ß¡¢
7 # backup=2°Ê¾å¤â¤·¤¯¤Ï0¤ò»ØÄꤷ¤¿¾ì¹ç¤ÏÀ¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤ËÂбþ¤·¤Þ¤¹¡£
8 # backup=0¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï̵À©¸Â¤Ë¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¹Ô¤¤¤Þ¤¹¡£
10 ###############################################################################
11 package Wiki::DefaultStorage;
14 use vars qw($MODTIME_FILE $PAGE_LIST_FILE);
16 # ¥Ú¡¼¥¸¤ÎºÇ½ª¹¹¿·Æü»þ¤òµÏ¿¤¹¤ë¥Õ¥¡¥¤¥ë
17 $MODTIME_FILE = "modtime.dat";
19 # ¥Ú¡¼¥¸°ìÍ÷¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò³ÊǼ¤¹¤ë¥Õ¥¡¥¤¥ë
20 $PAGE_LIST_FILE = "pagelist.cache";
22 #==============================================================================
26 #==============================================================================
30 my $backup = $wiki->{config}->{'backup'};
32 if(!defined($backup) || $backup eq ""){
37 $self->{wiki} = $wiki;
38 $self->{backup} = $backup;
39 $self->{exists_cache} = {};
40 $self->{modtime_cache} = undef;
41 return bless $self,$class;
44 #==============================================================================
48 #==============================================================================
54 my $dir = $self->{wiki}->config('data_dir');
60 my $filename = &Util::make_filename($dir,&Util::url_encode($page),"wiki");
62 open(DATA,$filename) or die $!;
65 $content = $content.$_;
73 #==============================================================================
77 #==============================================================================
83 my $wiki = $self->{wiki};
85 $content = '' if($content =~ /^[\r\n]+$/s); # added for opera
87 # ¥Ú¡¼¥¸Ì¾¤È¥Ú¡¼¥¸ÆâÍƤÎÊäÀµ
88 $page = Util::trim($page);
89 $content =~ s/\r\n/\n/g;
90 $content =~ s/\r/\n/g;
92 my $wikifile = &Util::make_filename($wiki->config('data_dir'),&Util::url_encode($page),"wiki");
93 my $tmpfile = "$wikifile.tmp";
95 Util::file_lock($wikifile,1);
98 my $BACKUP = $self->get_page($page);
99 if($BACKUP ne '' && $BACKUP eq $content){
100 Util::file_unlock($wikifile);
107 if($self->{backup}==1){
108 $backupfile = &Util::make_filename($wiki->config('backup_dir'),&Util::url_encode($page),"bak");
110 $self->_rename_old_history($page);
111 my $number = $self->_get_backup_number($page);
112 $backupfile = &Util::make_filename($wiki->config('backup_dir'),&Util::url_encode($page),"$number.bak");
114 open(DATA,">$backupfile") or die $!;
119 # backup¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢page_level¤ò¥Ç¥Õ¥©¥ë¥ÈÃͤËÀßÄꤹ¤ë¡£
121 my $login = $wiki->get_login_info();
123 if (defined($login)) {
124 if ($login->{type} == 1) {
126 } elsif ($login->{type} == 0) {
130 if ($level > $wiki->config('refer_level')) {
131 $level = $wiki->config('refer_level');
133 $wiki->set_page_level($page, $level);
136 # ¹¹¿·Æü»þµÏ¿¥Õ¥¡¥¤¥ë¤¬¤Ê¤¤¾ì¹ç¤ÏºîÀ®
137 unless(-e $wiki->config('config_dir')."/".$MODTIME_FILE){
138 my @list = $self->get_page_list();
140 foreach my $p (@list){
141 $hash->{$p}=$self->get_last_modified($p);
143 &Util::save_config_hash($wiki,$MODTIME_FILE,$hash);
147 $self->_create_page_list_file($page, 'remove');
149 $wiki->set_page_level($page);
151 my $modtime = &Util::load_config_hash($wiki,$MODTIME_FILE);
152 delete $modtime->{$page};
153 &Util::save_config_hash($wiki,$MODTIME_FILE,$modtime);
154 # ºï½ü»þ¤Ï¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ò»Ä¤¹
155 #unlink(&Util::make_filename($wiki->config('backup_dir'),&Util::url_encode($page),"bak"));
157 $self->_create_page_list_file($page, $flag);
159 open(DATA,">$tmpfile") or die $!;
163 # sage¤Ç¤Ê¤¤¾ì¹ç¤Ï¹¹¿·Æü»þ¤ò¹¹¿·
165 my $modtime = &Util::load_config_hash($wiki,$MODTIME_FILE);
166 $modtime->{$page} = time();
167 &Util::save_config_hash($wiki,$MODTIME_FILE,$modtime);
171 rename($tmpfile, $wikifile);
172 Util::file_unlock($wikifile);
173 delete $self->{exists_cache}->{":$page"}; # page_exists() ¤Î¥¥ã¥Ã¥·¥å¤ò¥¯¥ê¥¢¡£
178 #------------------------------------------------------------------------------
180 # ¥Ú¡¼¥¸°ìÍ÷¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¥Õ¥¡¥¤¥ë¤òºîÀ®¡¢¹¹¿·¤·¤Þ¤¹¡£
181 # Âè°ì°ú¿ô¤Ë¥Ú¡¼¥¸Ì¾¡¢ÂèÆó°ú¿ô¤Ë'create'¡¢'update'¡¢'remove'¤Î¤¤¤º¤ì¤«¤ò»ØÄꤷ¤Þ¤¹¡£
182 # ¥¤¥ó¥Ç¥Ã¥¯¥¹¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï°ú¿ô¤Ë´Ø¤ï¤é¤º¥¤¥ó¥Ç¥Ã¥¯¥¹¥Õ¥¡¥¤¥ë¤ÎºîÀ®¤ò¹Ô¤¤¤Þ¤¹¡£
184 #------------------------------------------------------------------------------
185 sub _create_page_list_file {
189 my $wiki = $self->{'wiki'};
190 my $file = $wiki->config('log_dir')."/".$PAGE_LIST_FILE;
194 opendir(DIR, $wiki->config('data_dir')) or die $!;
196 while($entry = readdir(DIR)){
197 my $name = &Util::url_decode(substr($entry,0,rindex($entry,".")));
198 my $type = substr($entry,rindex($entry,"."));
200 if($type eq ".wiki"){
205 Util::save_config_text(undef, $file, $buf);
207 if($flag eq "remove"){
208 my $names = Util::load_config_text(undef, $file);
209 $names =~ s/(^|\n)\Q$page\E\n/$1/;
210 Util::save_config_text(undef, $file, $names);
211 } elsif($flag eq 'update'){
212 # ¥Ú¡¼¥¸¤Î¹¹¿·»þ¤Ï²¿¤â¤·¤Ê¤¤
213 } elsif($flag eq 'create') {
214 open(DATA, ">>$file");
215 print DATA "$page\n";
220 #------------------------------------------------------------------------------
222 # ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ËÉÕÍ¿¤¹¤ëÀ¤ÂåÈÖ¹æ¤ò¼èÆÀ¤¹¤ë¥×¥é¥¤¥Ù¡¼¥È¥á¥½¥Ã¥É
224 #------------------------------------------------------------------------------
225 sub _get_backup_number {
228 my $wiki = $self->{wiki};
230 my @backups = glob($wiki->config('backup_dir')."/".&Util::url_encode($page).".*.bak");
231 foreach my $backup (@backups){
232 if($backup =~ /^.+\.([0-9]+)\.bak$/){
241 #------------------------------------------------------------------------------
243 # ÊݸÀ¤Âå¿ô¤òĶ¤¨¤¿Ê¬¤òºï½ü¤¹¤ë¥×¥é¥¤¥Ù¡¼¥È¥á¥½¥Ã¥É
245 #------------------------------------------------------------------------------
246 sub _rename_old_history {
249 my $wiki = $self->{wiki};
251 # ̵À©¸Â¤Î¾ì¹ç¤Ï²¿¤â¤·¤Ê¤¤
252 if($self->{backup}==0){
256 my @files = glob($wiki->config('backup_dir')."/".&Util::url_encode($page).".*.bak");
259 $a =~ /^.+\.([0-9]+)\.bak$/;
261 $b =~ /^.+\.([0-9]+)\.bak$/;
263 return $num_a <=> $num_b;
267 for(my $i=0;$i<=$#files;$i++){
268 if($i > $#files - $self->{backup} + 1){
269 my $newfile = &Util::make_filename($wiki->config('backup_dir'),&Util::url_encode($page),"$count.bak");
270 move($files[$i],$newfile) or die $!;
278 #==============================================================================
280 # ¥Ú¡¼¥¸¤Î°ìÍ÷¤ò¼èÆÀ¡£
282 #==============================================================================
286 my $wiki = $self->{wiki};
293 if(defined($args->{-sort})){
294 $sort = $args->{-sort};
296 if(defined($args->{-permit})){
297 $permit = $args->{-permit};
299 if(defined($args->{-max})){
300 $max = $args->{-max};
305 my $file = $wiki->config('log_dir')."/".$PAGE_LIST_FILE;
306 $self->_create_page_list_file(undef, 'update') unless(-e $file);
307 my $names = Util::load_config_text(undef, $file);
309 foreach my $name (split(/\n/,$names)){
311 # »²¾È¸¢¤Î¤¢¤ë¥Ú¡¼¥¸¤Î¤ß
312 if($permit eq "show"){
313 if($wiki->can_show($name)){
317 } elsif($permit eq "modify"){
318 if($wiki->can_modify_page($name)){
323 } elsif($permit eq "all"){
326 # ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¥¨¥é¡¼
328 die "permit¥ª¥×¥·¥ç¥ó¤Î»ØÄ꤬ÉÔÀµ¤Ç¤¹¡£";
337 @list = sort { $a cmp $b } @list;
339 # ¹¹¿·Æü»þ¡Ê¿·Ãå½ç¡Ë¤Ë¥½¡¼¥È
340 } elsif($sort eq "last_modified"){
341 @list = map { $_->[0] }
342 sort { $b->[1] <=> $a->[1] }
343 map { [$_, $wiki->get_last_modified2($_)] } @list;
345 # ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¥¨¥é¡¼
347 die "sort¥ª¥×¥·¥ç¥ó¤Î»ØÄ꤬ÉÔÀµ¤Ç¤¹¡£";
350 return $max == 0 ? @list : splice(@list, 0, $max);
353 #==============================================================================
355 # ¥Ú¡¼¥¸¤ÎºÇ½ª¹¹¿·»þ¹ï¤ò¼èÆÀ¡ÊʪÍýŪ¡Ë
357 #==============================================================================
358 sub get_last_modified {
361 my @status = stat(&Util::make_filename($self->{wiki}->config('data_dir'),&Util::url_encode($page),"wiki"));
366 #==============================================================================
368 # ¥Ú¡¼¥¸¤ÎºÇ½ª¹¹¿·»þ¹ï¤ò¼èÆÀ¡ÊÏÀÍýŪ¡Ë
370 #==============================================================================
371 sub get_last_modified2 {
374 my $modtime = $self->{modtime_cache};
376 unless(defined($modtime)){
377 $modtime = &Util::load_config_hash($self->{wiki},$MODTIME_FILE);
378 $self->{modtime_cache} = $modtime;
381 if(defined($modtime->{$page})){
382 return $modtime->{$page};
384 return $self->get_last_modified($page);
388 #===============================================================================
390 # ¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë
392 #===============================================================================
398 if($self->{exists_cache} and defined($self->{exists_cache}->{"$path:$page"})){
399 return $self->{exists_cache}->{"$path:$page"};
402 my $dir = $self->{wiki}->config('data_dir');
403 if(defined $path and $path ne ""){
407 my $exists = (-e &Util::make_filename($dir,&Util::url_encode($page),"wiki"));
408 $self->{exists_cache}->{"$path:$page"} = $exists;
413 #==============================================================================
415 # ¥Ð¥Ã¥¯¥¢¥Ã¥×¥¿¥¤¥×¤ò¼èÆÀ(single|all)¡£
416 # setup.dat¤ÎÀßÄêÆâÍƤˤè¤Ã¤Æ¡¢£±À¤Âå¤Î¤ß¤Î¾ì¹ç¤Ïsingle¡¢
417 # À¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¹Ô¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ïall¤òÊֵѤ·¤Þ¤¹¡£
419 #==============================================================================
423 if($self->{backup}==1){
430 #==============================================================================
432 # ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òºï½ü¤·¤Þ¤¹¡£
434 #==============================================================================
435 sub delete_backup_files {
440 my @files = glob($wiki->config('backup_dir')."/".Util::url_encode($page).".*.bak");
441 foreach my $file (@files){
446 #==============================================================================
448 # À¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¹Ô¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ë¥Ð¥Ã¥¯¥¢¥Ã¥×»þ¹ï¤Î°ìÍ÷¤ò¼èÆÀ¤·¤Þ¤¹¡£
449 # £±À¤Âå¤Î¤ß¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÀßÄê¤ÇÆ°ºî¤·¤Æ¤¤¤ë¾ì¹ç¤Ïundef¤òÊÖ¤·¤Þ¤¹¡£
451 #==============================================================================
452 sub get_backup_list {
456 if($self->{backup}==1){
459 my $wiki = $self->{wiki};
460 my @files = glob($wiki->config('backup_dir')."/".Util::url_encode($page).".*.bak");
463 $a =~ /^.+\.([0-9]+)\.bak$/;
465 $b =~ /^.+\.([0-9]+)\.bak$/;
467 return $num_b <=> $num_a;
472 foreach my $file (@files){
473 my @status = stat($file);
474 push(@datelist, $status[9]);
481 #==============================================================================
483 # ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼èÆÀ¤·¤Þ¤¹¡£
484 # backup_type=all¤Î¾ì¹ç¤ÏÂèÆó°ú¿ô¤ÇÀ¤Âå(0¡Á)¤ò»ØÄꤷ¤Þ¤¹¡£
486 #==============================================================================
494 if($self->{backup}!=1){
495 # À¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤«¤ÄÀ¤Âå»ØÄ꤬¤Ê¤¤¾ì¹ç¤ÏºÇ¿·¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼èÆÀ
496 if(!defined($gen) || $gen eq ""){
497 my @list = $self->get_backup_list($page);
500 $filename = &Util::make_filename($self->{wiki}->config('backup_dir'),&Util::url_encode($page),($gen+1).".bak");
501 Util::debug("¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë̾:$filename");
503 $filename = &Util::make_filename($self->{wiki}->config('backup_dir'),&Util::url_encode($page),"bak");
506 open(DATA,$filename) or die $!;
509 $content = $content.$_;
517 #==============================================================================
521 #==============================================================================
524 my $pagename = shift;
526 if(!$self->is_freeze($pagename)){
527 my $freeze_file = $self->{wiki}->config('log_dir')."/".$self->{wiki}->config('freeze_file');
528 Util::file_lock($freeze_file);
529 open(DATA,">>$freeze_file") or die $!;
531 print DATA $pagename."\n";
533 Util::file_unlock($freeze_file);
535 # ¥ê¥À¥¤¥ì¥¯¥È¤¹¤ì¤ÐÉÔÍפÀ¤±¤É¡Ä
536 push(@{$self->{freeze_list}},$pagename);
540 #==============================================================================
542 # ¥Ú¡¼¥¸¤ÎÅà·ë¤ò²ò½ü¤·¤Þ¤¹
544 #==============================================================================
547 my $pagename = shift;
549 if($self->is_freeze($pagename)){
551 open(DATA,$self->{wiki}->config('log_dir')."/".$self->{wiki}->config('freeze_file')) or die $!;
560 open(DATA,">".$self->{wiki}->config('log_dir')."/".$self->{wiki}->config('freeze_file')) or die $!;
565 # ¥ê¥À¥¤¥ì¥¯¥È¤¹¤ì¤ÐÉÔÍפÀ¤±¤É¡Ä
566 @{$self->{freeze_list}} = grep(!/^\Q$pagename\E$/,@{$self->{freeze_list}});
570 #==============================================================================
574 #==============================================================================
575 sub get_freeze_list {
583 if(defined($self->{"$path:freeze_list"})){
584 return @{$self->{"$path:freeze_list"}};
587 my $logdir = $self->{wiki}->config('log_dir');
593 if(!-e "$logdir/".$self->{wiki}->config('freeze_file')){
597 open(DATA,"$logdir/".$self->{wiki}->config('freeze_file')) or die $!;
604 $self->{"$path:freeze_list"} = \@list;
608 #==============================================================================
610 # °ú¿ô¤ÇÅϤ·¤¿¥Ú¡¼¥¸¤¬Åà·ëÃ椫¤É¤¦¤«¤·¤é¤Ù¤Þ¤¹
612 #==============================================================================
615 my $pagename = shift;
618 foreach my $freeze_page ($self->get_freeze_list($path)){
619 if($freeze_page eq $pagename){
627 #==============================================================================
629 # ¥Ú¡¼¥¸¤Î»²¾È¥ì¥Ù¥ë¤òÀßÄꤷ¤Þ¤¹¡£
631 #==============================================================================
637 my $all = &Util::load_config_hash($self->{wiki},"showlevel.log");
639 $all->{$page} = $level;
641 delete($all->{$page});
643 &Util::save_config_hash($self->{wiki},"showlevel.log",$all);
644 $self->{":show_level"} = $all;
647 #==============================================================================
649 # ¥Ú¡¼¥¸¤Î»²¾È¥ì¥Ù¥ë¤ò¼èÆÀ¤·¤Þ¤¹¡£
651 #==============================================================================
661 unless(defined($self->{"$path:show_level"})){
662 # config_dir¤òº¹¤·Âؤ¨¤Æ¼Â¹Ô
663 my $configdir = $self->{wiki}->config('config_dir');
665 $self->{wiki}->config('config_dir',"$configdir/$path");
668 $self->{"$path:show_level"} = &Util::load_config_hash($self->{wiki},"showlevel.log");
670 # config_dir¤ò¸µ¤ËÌ᤹
671 $self->{wiki}->config('config_dir',$configdir);
675 if(defined($self->{"$path:show_level"}->{$page})){
676 return $self->{"$path:show_level"}->{$page};
678 #return $self->{wiki}->config('refer_level');
682 return $self->{"$path:show_level"};
686 #==============================================================================
688 # ½ªÎ»»þ¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤Î»²¾È¤ò²òÊü¤·¤Þ¤¹¡£
690 #==============================================================================
693 undef($self->{wiki});