/[pub]/suikawiki/script/lib/Yuki/YukiWikiDBMeta.pm
Suika

Contents of /suikawiki/script/lib/Yuki/YukiWikiDBMeta.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Thu Jan 2 12:14:15 2003 UTC (23 years, 8 months ago) by w
Branch: MAIN
do_index: Removed.

1 w 1.1 package Yuki::YukiWikiDBMeta;
2     use strict;
3     use Yuki::YukiWikiDB2;
4     our @ISA;
5     push @ISA, q(Yuki::YukiWikiDB2);
6     our $VERSION = do{my @r=(q$Revision: 1.26 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
7    
8     sub _write_meta ($$) {
9     my ($self, $key) = @_;
10     $self->_die (qq{_write_meta : method not allowd, mode="$self->{-mode}"}) if $self->{-mode} == 1;
11     my $file=$key;&{$self->{-encode}}($file);$file=$self->{-dir}.'mt--'.$file.'.dat';
12     my $temp = $file.".".time;
13     open (FILE, "> ".$temp) or $self->_die(qq{_write_meta : $! "$temp"});
14     binmode FILE;
15     print FILE "#?SuikaWikiMetaInfo/0.9\n\x02".join "\x1E", map {$_."\x1F".$self->{-metainfo}->{$key}->{$_}} grep {length $self->{-metainfo}->{$key}->{$_}} keys %{$self->{-metainfo}->{$key}};
16     close FILE;
17     if (-e $file){
18     unlink $file or $self->_die(qq{_write_meta : $! "$file"});
19     }
20     rename($temp => $file) or $self->_die(qq{_write_meta : $! "$temp" => "$file"});
21     }
22    
23     sub _read_meta ($$) {
24     my ($self, $key) = @_;
25     return if ref $self->{-metainfo}->{$key};
26     my $file=$key;&{$self->{-encode}}($file);$file=$self->{-dir}.'mt--'.$file.'.dat';
27     if (-e $file) {
28     open (FILE, $file) or $self->_die (qq{_read_meta : $! "$file"});
29     binmode FILE;
30     local $/ = undef;
31     my $val = <FILE>;
32     close FILE;
33     if ($val =~ s!^\#\?SuikaWikiMetaInfo/0.9[^\x02]*\x02!!s) {
34     $self->{-metainfo}->{$key} = {map {split /\x1F/, $_, 2} split /\x1E/, $val};
35     } else {
36     $self->{-metainfo}->{$key} = {};
37     }
38     }
39     }
40    
41     sub STORE {
42     my $self = shift;
43     my ($key, $val, %option) = @_;
44     $self->SUPER::STORE (@_);
45     if (!exists $option{-touch} || $option{-touch}) {
46     $self->_read_meta ('LastModified');
47     $self->{-metainfo}->{LastModified}->{$key} = time;
48     $self->{-metainfo}->{-changed}->{LastModified} = 1;
49     }
50     $val;
51     }
52    
53     sub UNTIE {
54     my $self = shift;
55     for (keys %{$self->{-metainfo}->{-changed}}) {
56     $self->_write_meta ($_);
57     }
58     $self->SUPER::UNTIE (@_);
59     }
60    
61     sub sort_by_mtime{
62     my $self = shift or die qq(sort_by_mtime : usage error.);
63     my $dbname = $self->{-dir};
64     my @key = @_;
65     if(not @key){
66     @key = map{&{$self->{-decode}}($_)} $self->_list_all();
67     }
68     $self->_read_meta ('LastModified');
69     return map {$_->[1]}
70     sort {$b->[0] <=> $a->[0] or $b->[1] cmp $a->[1]}
71     map {[$self->{-metainfo}->{LastModified}->{$_},$_]} @key;
72     }
73    
74     sub mtime ($$;$) {
75     my ($self, $key, $val) = @_;
76     $self->_read_meta ('LastModified');
77     if (defined $val) {
78     $self->{-metainfo}->{LastModified}->{$key} = $val;
79     $self->{-metainfo}->{-changed}->{LastModified} = 1;
80     }
81     $self->{-metainfo}->{LastModified}->{$key};
82     }
83    
84     1;
85     __END__
86     =head1 NAME
87    
88     Yuki::YukiWikiDBMeta --- SuikaWiki: YukiWikiDB2 with meta information extension
89    
90     =head1 LICENSE
91    
92     Copyright 2003 Wakaba <[email protected]>
93    
94     This program is free software; you can redistribute it and/or
95     modify it under the same terms as Perl itself.
96    
97     =cut
98    
99     # $Date: $

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24