/[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.2 - (hide annotations) (download)
Fri Jan 3 03:27:30 2003 UTC (23 years, 8 months ago) by w
Branch: MAIN
Changes since 1.1: +12 -2 lines
YukiWikiDBMeta support

1 w 1.1 package Yuki::YukiWikiDBMeta;
2     use strict;
3     use Yuki::YukiWikiDB2;
4     our @ISA;
5     push @ISA, q(Yuki::YukiWikiDB2);
6 w 1.2 our $VERSION = do{my @r=(q$Revision: 1.1 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
7 w 1.1
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 w 1.2 sub meta ($$$;$) {
85     my ($self, $metakey, $key, $val) = @_;
86     $self->_read_meta ($metakey);
87     if (defined $val) {
88     $self->{-metainfo}->{$metakey}->{$key} = $val;
89     $self->{-metainfo}->{-changed}->{$metakey} = 1;
90     }
91     $self->{-metainfo}->{$metakey}->{$key};
92     }
93    
94 w 1.1 1;
95     __END__
96     =head1 NAME
97    
98     Yuki::YukiWikiDBMeta --- SuikaWiki: YukiWikiDB2 with meta information extension
99    
100     =head1 LICENSE
101    
102     Copyright 2003 Wakaba <[email protected]>
103    
104     This program is free software; you can redistribute it and/or
105     modify it under the same terms as Perl itself.
106    
107     =cut
108    
109 w 1.2 # $Date: 2003/01/02 12:14:15 $

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24