/[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.4 - (hide annotations) (download)
Wed Mar 26 07:16:38 2003 UTC (23 years, 5 months ago) by wakaba
Branch: MAIN
Changes since 1.3: +6 -6 lines
Namespaced database support

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     our $VERSION = do{my @r=(q$Revision: 1.3 $=~/\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 w 1.3 } else {
39     $self->{-metainfo}->{$key} = {};
40 w 1.1 }
41     }
42    
43     sub STORE {
44     my $self = shift;
45     my ($key, $val, %option) = @_;
46     $self->SUPER::STORE (@_);
47     if (!exists $option{-touch} || $option{-touch}) {
48     $self->_read_meta ('LastModified');
49     $self->{-metainfo}->{LastModified}->{$key} = time;
50     $self->{-metainfo}->{-changed}->{LastModified} = 1;
51     }
52     $val;
53     }
54    
55     sub UNTIE {
56     my $self = shift;
57     for (keys %{$self->{-metainfo}->{-changed}}) {
58     $self->_write_meta ($_);
59     }
60     $self->SUPER::UNTIE (@_);
61     }
62    
63     sub sort_by_mtime{
64 wakaba 1.4 my ($self, $option) = (shift, shift);
65 w 1.1 my $dbname = $self->{-dir};
66     my @key = @_;
67     if(not @key){
68 wakaba 1.4 @key = $self->list_items ({%$option, type => 'key'});
69 w 1.1 }
70     $self->_read_meta ('LastModified');
71     return map {$_->[1]}
72     sort {$b->[0] <=> $a->[0] or $b->[1] cmp $a->[1]}
73     map {[$self->{-metainfo}->{LastModified}->{$_},$_]} @key;
74     }
75    
76     sub mtime ($$;$) {
77     my ($self, $key, $val) = @_;
78     $self->_read_meta ('LastModified');
79     if (defined $val) {
80     $self->{-metainfo}->{LastModified}->{$key} = $val;
81     $self->{-metainfo}->{-changed}->{LastModified} = 1;
82     }
83     $self->{-metainfo}->{LastModified}->{$key};
84     }
85    
86 w 1.2 sub meta ($$$;$) {
87     my ($self, $metakey, $key, $val) = @_;
88     $self->_read_meta ($metakey);
89     if (defined $val) {
90     $self->{-metainfo}->{$metakey}->{$key} = $val;
91     $self->{-metainfo}->{-changed}->{$metakey} = 1;
92     }
93     $self->{-metainfo}->{$metakey}->{$key};
94     }
95    
96 w 1.1 1;
97     __END__
98     =head1 NAME
99    
100     Yuki::YukiWikiDBMeta --- SuikaWiki: YukiWikiDB2 with meta information extension
101    
102     =head1 LICENSE
103    
104     Copyright 2003 Wakaba <[email protected]>
105    
106     This program is free software; you can redistribute it and/or
107     modify it under the same terms as Perl itself.
108    
109     =cut
110    
111 wakaba 1.4 # $Date: 2003/01/26 01:38:37 $

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24