/[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.7 - (hide annotations) (download)
Sun Feb 1 12:31:51 2004 UTC (22 years, 7 months ago) by wakaba
Branch: MAIN
CVS Tags: HEAD
Changes since 1.6: +2 -2 lines
FILE REMOVED
No longer used

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24