/[suikacvs]/webroot/swe/lib/SWE/DB/IDProps.pm
Suika

Contents of /webroot/swe/lib/SWE/DB/IDProps.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide annotations) (download)
Sun Nov 9 14:08:58 2008 UTC (16 years, 5 months ago) by wakaba
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +2 -7 lines
++ swe/lib/SWE/DB/ChangeLog	9 Nov 2008 14:08:47 -0000
	* VersionControl.pm: New module.

	* HashedProps.pm, IDText.pm: Support for |version_control|
	property is added.

	* SuikaWiki3PageList.pm (_save_data): Renamed as |save_data|.  Do
	nothing if the data has not been loaded from the file.
	(delete_data): New method.

2008-11-09  Wakaba  <wakaba@suika.fam.cx>

1 wakaba 1.1 package SWE::DB::IDProps;
2     use strict;
3    
4     sub new ($) {
5     my $self = bless {
6     root_directory_name => './',
7     leaf_suffix => '.props',
8     }, shift;
9     return $self;
10     } # new
11    
12     sub _get_file_name ($$$) {
13     my $self = shift;
14     my $id = $_[0] + 0;
15     my $mkdir = $_[1];
16    
17     my $dir = $self->{root_directory_name} . int ($id / 1000);
18     my $file_name = $dir . '/' . ($id % 1000) . $self->{leaf_suffix};
19    
20     unless ($mkdir) {
21     return $file_name;
22     }
23    
24     unless (-d $dir) {
25     mkdir $dir or die "$0: $dir: $!";
26     }
27    
28 wakaba 1.3 $self->{version_control}->add_directory ($dir) if $self->{version_control};
29 wakaba 1.1
30     return $file_name;
31     } # _get_file_name
32    
33     sub get_data ($$) {
34     my $self = shift;
35     my $file_name = $self->_get_file_name ($_[0]);
36    
37     unless (-f $file_name) {
38 wakaba 1.2 return undef;
39 wakaba 1.1 }
40    
41     my $r = {};
42    
43     open my $file, '<:encoding(utf8)', $file_name or die "$0: $file_name: $!";
44     while (<$file>) {
45     tr/\x0D\x0A//d;
46     my ($n, $v) = split /:/, $_, 2;
47     if ($n =~ s/^\@//) {
48     push @{$r->{$n} ||= []}, $v // '';
49     } elsif ($n =~ s/^%//) {
50     $r->{$n}->{$v // ''} = 1;
51     } else {
52     $n =~ s/^\$//;
53     $r->{$n} = $v // '';
54     }
55     }
56    
57     return $r;
58     } # get_data
59    
60     sub set_data ($$$) {
61     my $self = shift;
62     my $file_name = $self->_get_file_name ($_[0], 1);
63     my $prop = $_[1];
64    
65     open my $file, '>:encoding(utf8)', $file_name or die "$0: $file_name: $!";
66     for my $prop_name (sort {$a cmp $b} keys %$prop) {
67     if (ref $prop->{$prop_name} eq 'ARRAY') {
68     my $v = '@' . $prop_name;
69     $v =~ tr/\x0D\x0A://d;
70     for (@{$prop->{$prop_name}}) {
71     my $pv = $_;
72     $pv =~ tr/\x0D\x0A/ /;
73     print $file $v . ':' . $pv . "\x0A";
74     }
75     } elsif (ref $prop->{$prop_name} eq 'HASH') {
76     my $v = '%' . $prop_name;
77     $v =~ tr/\x0D\x0A://d;
78     for (sort {$a cmp $b} keys %{$prop->{$prop_name}}) {
79     next unless $prop->{$prop_name}->{$_};
80     my $pv = $_;
81     $pv =~ tr/\x0D\x0A/ /;
82     print $file $v . ':' . $pv . "\x0A";
83     }
84     } else {
85     my $v = '$' . $prop_name;
86     $v =~ tr/\x0D\x0A://d;
87     my $pv = $prop->{$prop_name};
88     $pv =~ tr/\x0D\x0A/ /;
89     print $file $v . ':' . $pv . "\x0A";
90     }
91     }
92     close $file;
93    
94 wakaba 1.3 $self->{version_control}->add_file ($file_name) if $self->{version_control};
95 wakaba 1.1 } # set_data
96    
97     1;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24