/[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 - (show 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 package Yuki::YukiWikiDBMeta;
2 use strict;
3 use Yuki::YukiWikiDBNS;
4 our @ISA;
5 push @ISA, q(Yuki::YukiWikiDBNS);
6 our $VERSION = do{my @r=(q$Revision: 1.6 $=~/\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 : 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 close FILE;
20 if (-e $file) {
21 unlink $file or $self->_die (qq{_write_meta : Remove "$file" : $!});
22 }
23 #$self->_warn (qq(Temporary "$temp" => real "$file"));
24 rename ($temp => $file) or $self->_die(qq{_write_meta : Rename "$temp" => "$file": $!});
25 }
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 } else {
43 $self->{-metainfo}->{$key} = {};
44 }
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 my ($self, $option) = (shift, shift || {});
69 my $dbname = $self->{-dir};
70 my @key = @_;
71 if(not @key){
72 @key = $self->list_items ({%$option, type => 'key'});
73 }
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 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 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 # $Date: 2003/07/17 23:57:19 $

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24