/[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 - (show 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 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 $self->{version_control}->add_directory ($dir) if $self->{version_control};
29
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 return undef;
39 }
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 $self->{version_control}->add_file ($file_name) if $self->{version_control};
95 } # set_data
96
97 1;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24  
Google Analytics is used in this page; Cookies are used. 忍者AdMax is used in this page; Cookies are used. Privacy policy.