OSDN Git Service

BugTrack-wiki/344 pagelist.cacheの先頭行が削除される場合に改行だけの行ができてしまいページが表示できなくなってしまうという問題を修正。
[fswiki/fswiki.git] / lib / Wiki / DefaultStorage.pm
1 ###############################################################################
2 # <p>
3 # FSWiki¥Ç¥Õ¥©¥ë¥È¤Î¥¹¥È¥ì¡¼¥¸¥×¥é¥°¥¤¥ó¡£
4 # </p>
5 # <p>
6 # setup.dat¤Îbackup=1¤â¤·¤¯¤Ïbackup¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò¾Êά¤·¤¿¾ì¹ç¤Ï£±À¤Âå¤Î¤ß¡¢
7 # backup=2°Ê¾å¤â¤·¤¯¤Ï0¤ò»ØÄꤷ¤¿¾ì¹ç¤ÏÀ¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤ËÂбþ¤·¤Þ¤¹¡£
8 # backup=0¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï̵À©¸Â¤Ë¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¹Ô¤¤¤Þ¤¹¡£
9 # </p>
10 ###############################################################################
11 package Wiki::DefaultStorage;
12 use File::Copy;
13 use strict;
14 use vars qw($MODTIME_FILE $PAGE_LIST_FILE);
15
16 # ¥Ú¡¼¥¸¤ÎºÇ½ª¹¹¿·Æü»þ¤òµ­Ï¿¤¹¤ë¥Õ¥¡¥¤¥ë
17 $MODTIME_FILE = "modtime.dat";
18
19 # ¥Ú¡¼¥¸°ìÍ÷¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò³ÊǼ¤¹¤ë¥Õ¥¡¥¤¥ë
20 $PAGE_LIST_FILE = "pagelist.cache";
21
22 #==============================================================================
23 # <p>
24 # ¥³¥ó¥¹¥È¥é¥¯¥¿
25 # </p>
26 #==============================================================================
27 sub new {
28         my $class  = shift;
29         my $wiki   = shift;
30         my $backup = $wiki->{config}->{'backup'};
31         
32         if(!defined($backup) || $backup eq ""){
33                 $backup = 1;
34         }
35         
36         my $self = {};
37         $self->{wiki}          = $wiki;
38         $self->{backup}        = $backup;
39         $self->{exists_cache}  = {};
40         $self->{modtime_cache} = undef;
41         return bless $self,$class;
42 }
43
44 #==============================================================================
45 # <p>
46 # ¥Ú¡¼¥¸¤ò¼èÆÀ
47 # </p>
48 #==============================================================================
49 sub get_page {
50         my $self = shift;
51         my $page = shift;
52         my $path = shift;
53         
54         my $dir = $self->{wiki}->config('data_dir');
55         if($path ne ""){
56                 $dir = "$dir/$path";
57         }
58         
59         my $content = "";
60         my $filename = &Util::make_filename($dir,&Util::url_encode($page),"wiki");
61         if(-e $filename){
62                 open(DATA,$filename) or die $!;
63                 binmode(DATA);
64                 while(<DATA>){
65                         $content = $content.$_;
66                 }
67                 close(DATA);
68         }
69         
70         return $content;
71 }
72
73 #==============================================================================
74 # <p>
75 # ¥Ú¡¼¥¸¤òÊݸ
76 # </p>
77 #==============================================================================
78 sub save_page {
79         my $self    = shift;
80         my $page    = shift;
81         my $content = shift;
82         my $sage    = shift;
83         my $wiki    = $self->{wiki};
84         
85         $content = '' if($content =~ /^[\r\n]+$/s); # added for opera
86         
87         # ¥Ú¡¼¥¸Ì¾¤È¥Ú¡¼¥¸ÆâÍƤÎÊäÀµ
88         $page = Util::trim($page);
89         $content =~ s/\r\n/\n/g;
90         $content =~ s/\r/\n/g;
91         
92         my $wikifile = &Util::make_filename($wiki->config('data_dir'),&Util::url_encode($page),"wiki");
93         my $tmpfile  = "$wikifile.tmp";
94         
95         Util::file_lock($wikifile,1);
96         
97         # ¥Ð¥Ã¥¯¥¢¥Ã¥×
98         my $BACKUP = $self->get_page($page);
99         if($BACKUP ne '' && $BACKUP eq $content){
100                 Util::file_unlock($wikifile);
101                 return 0;
102         }
103         my $flag = '';
104         if($BACKUP ne ""){
105                 $flag = 'update';
106                 my $backupfile = "";
107                 if($self->{backup}==1){
108                         $backupfile = &Util::make_filename($wiki->config('backup_dir'),&Util::url_encode($page),"bak");
109                 } else {
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");
113                 }
114                 open(DATA,">$backupfile") or die $!;
115                 binmode(DATA);
116                 print DATA $BACKUP;
117                 close(DATA);
118         } else {
119                 # backup¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢page_level¤ò¥Ç¥Õ¥©¥ë¥ÈÃͤËÀßÄꤹ¤ë¡£
120                 $flag = 'create';
121                 my $login = $wiki->get_login_info();
122                 my $level = 0;
123                 if (defined($login)) {
124                         if ($login->{type} == 1) {
125                                 $level = 1;
126                         } elsif ($login->{type} == 0) {
127                                 $level = 2;
128                         }
129                 }
130                 if ($level > $wiki->config('refer_level')) {
131                         $level = $wiki->config('refer_level');
132                 }
133                 $wiki->set_page_level($page, $level);
134         }
135
136         # ¹¹¿·Æü»þµ­Ï¿¥Õ¥¡¥¤¥ë¤¬¤Ê¤¤¾ì¹ç¤ÏºîÀ®
137         unless(-e $wiki->config('config_dir')."/".$MODTIME_FILE){
138                 my @list = $self->get_page_list();
139                 my $hash = {};
140                 foreach my $p (@list){
141                         $hash->{$p}=$self->get_last_modified($p);
142                 }
143                 &Util::save_config_hash($wiki,$MODTIME_FILE,$hash);
144         }
145         # ½ñ¤­¹þ¤à
146         if($content eq ""){
147                 $self->_create_page_list_file($page, 'remove');
148                 unlink($wikifile);
149                 $wiki->set_page_level($page);
150                 # ¹¹¿·Æü»þ¤òºï½ü
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"));
156         } else {
157                 $self->_create_page_list_file($page, $flag);
158                 # ¾å½ñ¤­¤¹¤ë
159                 open(DATA,">$tmpfile") or die $!;
160                 binmode(DATA);
161                 print DATA $content;
162                 close(DATA);            
163                 # sage¤Ç¤Ê¤¤¾ì¹ç¤Ï¹¹¿·Æü»þ¤ò¹¹¿·
164                 if($sage != 1){
165                         my $modtime = &Util::load_config_hash($wiki,$MODTIME_FILE);
166                         $modtime->{$page} = time();
167                         &Util::save_config_hash($wiki,$MODTIME_FILE,$modtime);
168                 }
169         }
170         
171         rename($tmpfile, $wikifile);
172         Util::file_unlock($wikifile);
173         delete $self->{exists_cache}->{":$page"}; # page_exists() ¤Î¥­¥ã¥Ã¥·¥å¤ò¥¯¥ê¥¢¡£
174         
175         return 1;
176 }
177
178 #------------------------------------------------------------------------------
179 # <p>
180 # ¥Ú¡¼¥¸°ìÍ÷¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¥Õ¥¡¥¤¥ë¤òºîÀ®¡¢¹¹¿·¤·¤Þ¤¹¡£
181 # Âè°ì°ú¿ô¤Ë¥Ú¡¼¥¸Ì¾¡¢ÂèÆó°ú¿ô¤Ë'create'¡¢'update'¡¢'remove'¤Î¤¤¤º¤ì¤«¤ò»ØÄꤷ¤Þ¤¹¡£
182 # ¥¤¥ó¥Ç¥Ã¥¯¥¹¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï°ú¿ô¤Ë´Ø¤ï¤é¤º¥¤¥ó¥Ç¥Ã¥¯¥¹¥Õ¥¡¥¤¥ë¤ÎºîÀ®¤ò¹Ô¤¤¤Þ¤¹¡£
183 # </p>
184 #------------------------------------------------------------------------------
185 sub _create_page_list_file {
186         my $self = shift;
187         my $page = shift;
188         my $flag = shift;
189         my $wiki = $self->{'wiki'};
190         my $file = $wiki->config('log_dir')."/".$PAGE_LIST_FILE;
191         my $buf = "";
192         
193         unless(-e $file){
194                 opendir(DIR, $wiki->config('data_dir')) or die $!;
195                 my ($entry,@list);
196                 while($entry = readdir(DIR)){
197                         my $name = &Util::url_decode(substr($entry,0,rindex($entry,".")));
198                         my $type = substr($entry,rindex($entry,"."));
199                         my $flag = 0;
200                         if($type eq ".wiki"){
201                                 $buf .= "$name\n";
202                         }
203                 }
204                 closedir(DIR);
205                 Util::save_config_text(undef, $file, $buf);
206         }
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";
216                 close(DATA);
217         }
218 }
219
220 #------------------------------------------------------------------------------
221 # <p>
222 # ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ËÉÕÍ¿¤¹¤ëÀ¤ÂåÈÖ¹æ¤ò¼èÆÀ¤¹¤ë¥×¥é¥¤¥Ù¡¼¥È¥á¥½¥Ã¥É
223 # </p>
224 #------------------------------------------------------------------------------
225 sub _get_backup_number {
226         my $self = shift;
227         my $page = shift;
228         my $wiki = $self->{wiki};
229         my $num  = 0;
230         my @backups = glob($wiki->config('backup_dir')."/".&Util::url_encode($page).".*.bak");
231         foreach my $backup (@backups){
232                 if($backup =~ /^.+\.([0-9]+)\.bak$/){
233                         if($num < $1){
234                                 $num = $1;
235                         }
236                 }
237         }
238         return $num + 1;
239 }
240
241 #------------------------------------------------------------------------------
242 # <p>
243 # ÊݸÀ¤Âå¿ô¤òĶ¤¨¤¿Ê¬¤òºï½ü¤¹¤ë¥×¥é¥¤¥Ù¡¼¥È¥á¥½¥Ã¥É
244 # </p>
245 #------------------------------------------------------------------------------
246 sub _rename_old_history {
247         my $self  = shift;
248         my $page  = shift;
249         my $wiki  = $self->{wiki};
250         
251         # ÌµÀ©¸Â¤Î¾ì¹ç¤Ï²¿¤â¤·¤Ê¤¤
252         if($self->{backup}==0){
253                 return;
254         }
255         
256         my @files = glob($wiki->config('backup_dir')."/".&Util::url_encode($page).".*.bak");
257         
258         @files = sort {
259                 $a =~ /^.+\.([0-9]+)\.bak$/;
260                 my $num_a = $1;
261                 $b =~ /^.+\.([0-9]+)\.bak$/;
262                 my $num_b = $1;
263                 return $num_a <=> $num_b;
264         } @files;
265         
266         my $count = 1;
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 $!;
271                         $count++;
272                 } else {
273                         unlink($files[$i]);
274                 }
275         }
276 }
277
278 #==============================================================================
279 # <p>
280 # ¥Ú¡¼¥¸¤Î°ìÍ÷¤ò¼èÆÀ¡£
281 # </p>
282 #==============================================================================
283 sub get_page_list {
284         my $self   = shift;
285         my $args   = shift;
286         my $wiki   = $self->{wiki};
287         my $sort   = "name";
288         my $permit = "all";
289         my $max    = 0;
290         
291         # °ú¿ô¤ò²ò¼á
292         if(defined($args)){
293                 if(defined($args->{-sort})){
294                         $sort = $args->{-sort};
295                 }
296                 if(defined($args->{-permit})){
297                         $permit = $args->{-permit};
298                 }
299                 if(defined($args->{-max})){
300                         $max = $args->{-max};
301                 }
302         }
303         
304         # ¥Ú¡¼¥¸¤Î°ìÍ÷¤ò¼èÆÀ
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);
308         my @list  = ();
309         foreach my $name (split(/\n/,$names)){
310                 my $flag = 0;
311                 # »²¾È¸¢¤Î¤¢¤ë¥Ú¡¼¥¸¤Î¤ß
312                 if($permit eq "show"){
313                         if($wiki->can_show($name)){
314                                 $flag = 1;
315                         }
316                         
317                 } elsif($permit eq "modify"){
318                         if($wiki->can_modify_page($name)){
319                                 $flag = 1;
320                         }
321                         
322                 # Á´¤Æ¤Î¥Ú¡¼¥¸
323                 } elsif($permit eq "all"){
324                         $flag = 1;
325                 
326                 # ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¥¨¥é¡¼
327                 } else {
328                         die "permit¥ª¥×¥·¥ç¥ó¤Î»ØÄ꤬ÉÔÀµ¤Ç¤¹¡£";
329                 }
330                 if($flag == 1){
331                         push(@list,$name);
332                 }
333         }
334         
335         # Ì¾Á°¤Ç¥½¡¼¥È
336         if($sort eq "name"){
337                 @list = sort { $a cmp $b } @list;
338                 
339         # ¹¹¿·Æü»þ¡Ê¿·Ãå½ç¡Ë¤Ë¥½¡¼¥È
340         } elsif($sort eq "last_modified"){
341                 @list =  map  { $_->[0] }
342                          sort { $b->[1] <=> $a->[1] }
343                          map  { [$_, $wiki->get_last_modified2($_)] } @list;
344         
345         # ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¥¨¥é¡¼
346         } else {
347                 die "sort¥ª¥×¥·¥ç¥ó¤Î»ØÄ꤬ÉÔÀµ¤Ç¤¹¡£";
348         }
349         
350         return $max == 0 ? @list : splice(@list, 0, $max);
351 }
352
353 #==============================================================================
354 # <p>
355 # ¥Ú¡¼¥¸¤ÎºÇ½ª¹¹¿·»þ¹ï¤ò¼èÆÀ¡ÊʪÍýŪ¡Ë
356 # </p>
357 #==============================================================================
358 sub get_last_modified {
359         my $self   = shift;
360         my $page   = shift;
361         my @status = stat(&Util::make_filename($self->{wiki}->config('data_dir'),&Util::url_encode($page),"wiki"));
362         
363         return $status[9];
364 }
365
366 #==============================================================================
367 # <p>
368 # ¥Ú¡¼¥¸¤ÎºÇ½ª¹¹¿·»þ¹ï¤ò¼èÆÀ¡ÊÏÀÍýŪ¡Ë
369 # </p>
370 #==============================================================================
371 sub get_last_modified2 {
372         my $self    = shift;
373         my $page    = shift;
374         my $modtime = $self->{modtime_cache};
375         
376         unless(defined($modtime)){
377                 $modtime = &Util::load_config_hash($self->{wiki},$MODTIME_FILE);
378                 $self->{modtime_cache} = $modtime;
379         }
380         
381         if(defined($modtime->{$page})){
382                 return $modtime->{$page};
383         } else {
384                 return $self->get_last_modified($page);
385         }
386 }
387
388 #===============================================================================
389 # <p>
390 # ¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë
391 # </p>
392 #===============================================================================
393 sub page_exists {
394         my $self = shift;
395         my $page = shift;
396         my $path = shift;
397         
398         if($self->{exists_cache} and defined($self->{exists_cache}->{"$path:$page"})){
399                 return $self->{exists_cache}->{"$path:$page"};
400         }
401         
402         my $dir = $self->{wiki}->config('data_dir');
403         if(defined $path and $path ne ""){
404                 $dir = "$dir/$path";
405         }
406         
407         my $exists = (-e &Util::make_filename($dir,&Util::url_encode($page),"wiki"));
408         $self->{exists_cache}->{"$path:$page"} = $exists;
409         
410         return $exists;
411 }
412
413 #==============================================================================
414 # <p>
415 # ¥Ð¥Ã¥¯¥¢¥Ã¥×¥¿¥¤¥×¤ò¼èÆÀ(single|all)¡£
416 # setup.dat¤ÎÀßÄêÆâÍƤˤè¤Ã¤Æ¡¢£±À¤Âå¤Î¤ß¤Î¾ì¹ç¤Ïsingle¡¢
417 # À¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¹Ô¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ïall¤òÊֵѤ·¤Þ¤¹¡£
418 # </p>
419 #==============================================================================
420 sub backup_type {
421         my $self = shift;
422         
423         if($self->{backup}==1){
424                 return "single";
425         } else {
426                 return "all";
427         }
428 }
429
430 #==============================================================================
431 # <p>
432 # ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òºï½ü¤·¤Þ¤¹¡£
433 # </p>
434 #==============================================================================
435 sub delete_backup_files {
436         my $self = shift;
437         my $wiki = shift;
438         my $page = shift;
439         
440         my @files = glob($wiki->config('backup_dir')."/".Util::url_encode($page).".*.bak");
441         foreach my $file (@files){
442                 unlink($file);
443         }
444 }
445
446 #==============================================================================
447 # <p>
448 # À¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¹Ô¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ë¥Ð¥Ã¥¯¥¢¥Ã¥×»þ¹ï¤Î°ìÍ÷¤ò¼èÆÀ¤·¤Þ¤¹¡£
449 # £±À¤Âå¤Î¤ß¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÀßÄê¤ÇÆ°ºî¤·¤Æ¤¤¤ë¾ì¹ç¤Ïundef¤òÊÖ¤·¤Þ¤¹¡£
450 # </p>
451 #==============================================================================
452 sub get_backup_list {
453         my $self = shift;
454         my $page = shift;
455         
456         if($self->{backup}==1){
457                 return undef;
458         } else {
459                 my $wiki = $self->{wiki};
460                 my @files = glob($wiki->config('backup_dir')."/".Util::url_encode($page).".*.bak");
461                 
462                 @files = sort {
463                         $a =~ /^.+\.([0-9]+)\.bak$/;
464                         my $num_a = $1;
465                         $b =~ /^.+\.([0-9]+)\.bak$/;
466                         my $num_b = $1;
467                         return $num_b <=> $num_a;
468                 } @files;
469                 
470                 my @datelist;
471                 
472                 foreach my $file (@files){
473                         my @status = stat($file);
474                         push(@datelist, $status[9]);
475                 }
476                 
477                 return @datelist;
478         }
479 }
480
481 #==============================================================================
482 # <p>
483 # ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼èÆÀ¤·¤Þ¤¹¡£
484 # backup_type=all¤Î¾ì¹ç¤ÏÂèÆó°ú¿ô¤ÇÀ¤Âå(0¡Á)¤ò»ØÄꤷ¤Þ¤¹¡£
485 # </p>
486 #==============================================================================
487 sub get_backup {
488         my $self     = shift;
489         my $page     = shift;
490         my $gen      = shift;
491         my $content  = "";
492         my $filename = "";
493         
494         if($self->{backup}!=1){
495                 # À¤Âå¥Ð¥Ã¥¯¥¢¥Ã¥×¤«¤ÄÀ¤Âå»ØÄ꤬¤Ê¤¤¾ì¹ç¤ÏºÇ¿·¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼èÆÀ
496                 if(!defined($gen) || $gen eq ""){
497                         my @list = $self->get_backup_list($page);
498                         $gen = $#list;
499                 }
500                 $filename = &Util::make_filename($self->{wiki}->config('backup_dir'),&Util::url_encode($page),($gen+1).".bak");
501                 Util::debug("¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë̾:$filename");
502         } else {
503                 $filename = &Util::make_filename($self->{wiki}->config('backup_dir'),&Util::url_encode($page),"bak");
504         }
505         if(-e $filename){
506                 open(DATA,$filename) or die $!;
507                 binmode(DATA);
508                 while(<DATA>){
509                         $content = $content.$_;
510                 }
511                 close(DATA);
512         }
513         
514         return $content;
515 }
516
517 #==============================================================================
518 # <p>
519 # ¥Ú¡¼¥¸¤òÅà·ë¤·¤Þ¤¹
520 # </p>
521 #==============================================================================
522 sub freeze_page {
523         my $self     = shift;
524         my $pagename = shift;
525         
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 $!;
530                 binmode(DATA);
531                 print DATA $pagename."\n";
532                 close(DATA);
533                 Util::file_unlock($freeze_file);
534                 
535                 # ¥ê¥À¥¤¥ì¥¯¥È¤¹¤ì¤ÐÉÔÍפÀ¤±¤É¡Ä
536                 push(@{$self->{freeze_list}},$pagename);
537         }
538 }
539
540 #==============================================================================
541 # <p>
542 # ¥Ú¡¼¥¸¤ÎÅà·ë¤ò²ò½ü¤·¤Þ¤¹
543 # </p>
544 #==============================================================================
545 sub un_freeze_page {
546         my $self = shift;
547         my $pagename = shift;
548         
549         if($self->is_freeze($pagename)){
550                 my $buf = "";
551                 open(DATA,$self->{wiki}->config('log_dir')."/".$self->{wiki}->config('freeze_file')) or die $!;
552                 while(<DATA>){
553                         chomp $_;
554                         if($pagename ne $_){
555                                 $buf .= $_."\n";
556                         }
557                 }
558                 close(DATA);
559                 
560                 open(DATA,">".$self->{wiki}->config('log_dir')."/".$self->{wiki}->config('freeze_file')) or die $!;
561                 binmode(DATA);
562                 print DATA $buf;
563                 close(DATA);
564                 
565                 # ¥ê¥À¥¤¥ì¥¯¥È¤¹¤ì¤ÐÉÔÍפÀ¤±¤É¡Ä
566                 @{$self->{freeze_list}} = grep(!/^\Q$pagename\E$/,@{$self->{freeze_list}});
567         }
568 }
569
570 #==============================================================================
571 # <p>
572 # Åà·ë¥ê¥¹¥È¤ò¼èÆÀ
573 # </p>
574 #==============================================================================
575 sub get_freeze_list {
576         my $self = shift;
577         my $path = shift;
578         
579         if(!defined($path)){
580                 $path = "";
581         }
582         
583         if(defined($self->{"$path:freeze_list"})){
584                 return @{$self->{"$path:freeze_list"}};
585         }
586         
587         my $logdir = $self->{wiki}->config('log_dir');
588         if($path ne ""){
589                 $logdir .= "/$path";
590         }
591         
592         my @list;
593         if(!-e "$logdir/".$self->{wiki}->config('freeze_file')){
594                 return @list;
595         }
596         
597         open(DATA,"$logdir/".$self->{wiki}->config('freeze_file')) or die $!;
598         while(<DATA>){
599                 chomp $_;
600                 push @list,$_;
601         }
602         close(DATA);
603         
604         $self->{"$path:freeze_list"} = \@list;
605         return @list;
606 }
607
608 #==============================================================================
609 # <p>
610 # °ú¿ô¤ÇÅϤ·¤¿¥Ú¡¼¥¸¤¬Åà·ëÃ椫¤É¤¦¤«¤·¤é¤Ù¤Þ¤¹
611 # </p>
612 #==============================================================================
613 sub is_freeze {
614         my $self     = shift;
615         my $pagename = shift;
616         my $path     = shift;
617         
618         foreach my $freeze_page ($self->get_freeze_list($path)){
619                 if($freeze_page eq $pagename){
620                         return 1;
621                 }
622         }
623         
624         return 0;
625 }
626
627 #==============================================================================
628 # <p>
629 # ¥Ú¡¼¥¸¤Î»²¾È¥ì¥Ù¥ë¤òÀßÄꤷ¤Þ¤¹¡£
630 # </p>
631 #==============================================================================
632 sub set_page_level {
633         my $self  = shift;
634         my $page  = shift;
635         my $level = shift;
636         
637         my $all = &Util::load_config_hash($self->{wiki},"showlevel.log");
638         if(defined($level)){
639                 $all->{$page} = $level;
640         } else {
641                 delete($all->{$page});
642         }
643         &Util::save_config_hash($self->{wiki},"showlevel.log",$all);
644         $self->{":show_level"} = $all;
645 }
646
647 #==============================================================================
648 # <p>
649 # ¥Ú¡¼¥¸¤Î»²¾È¥ì¥Ù¥ë¤ò¼èÆÀ¤·¤Þ¤¹¡£
650 # </p>
651 #==============================================================================
652 sub get_page_level {
653         my $self = shift;
654         my $page = shift;
655         my $path = shift;
656         
657         if(!defined($path)){
658                 $path = "";
659         }
660         
661         unless(defined($self->{"$path:show_level"})){
662                 # config_dir¤òº¹¤·Âؤ¨¤Æ¼Â¹Ô
663                 my $configdir = $self->{wiki}->config('config_dir');
664                 if($path ne ""){
665                         $self->{wiki}->config('config_dir',"$configdir/$path");
666                 }
667                 
668                 $self->{"$path:show_level"} = &Util::load_config_hash($self->{wiki},"showlevel.log");
669                 
670                 # config_dir¤ò¸µ¤ËÌ᤹
671                 $self->{wiki}->config('config_dir',$configdir);
672         }
673         
674         if(defined($page)){
675                 if(defined($self->{"$path:show_level"}->{$page})){
676                         return $self->{"$path:show_level"}->{$page};
677                 } else {
678                         #return $self->{wiki}->config('refer_level');
679                         return 0;
680                 }
681         } else {
682                 return $self->{"$path:show_level"};
683         }
684 }
685
686 #==============================================================================
687 # <p>
688 # ½ªÎ»»þ¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤Î»²¾È¤ò²òÊü¤·¤Þ¤¹¡£
689 # </p>
690 #==============================================================================
691 sub finalize {
692         my $self = shift;
693         undef($self->{wiki});
694 }
695
696 1;