/[pub]/suikawiki/script/lib/SuikaWiki/DB/Logical/WithStruct.pm
Suika

Contents of /suikawiki/script/lib/SuikaWiki/DB/Logical/WithStruct.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations) (download)
Mon Nov 8 10:01:36 2004 UTC (21 years, 8 months ago) by wakaba
Branch: MAIN
CVS Tags: suikawiki3-redirect, HEAD
Branch point for: helowiki-2005, helowiki
Commited (NOTE: Experimental)

1
2 =head1 NAME
3
4 SuikaWiki::DB::Logical::WithStruct - "Structured cache" binded database
5
6 =head1 DESCRIPTION
7
8
9
10 This module is part of SuikaWiki.
11
12 =cut
13
14 package SuikaWiki::DB::Logical::WithStruct;
15 use strict;
16 our $VERSION=do{my @r=(q$Revision: 1.5 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
17 require SuikaWiki::DB::Util;
18 push our @ISA, 'SuikaWiki::DB::Util::template';
19
20 # new: inherited
21
22 sub get ($$$;%) {
23 my ($self, $prop, $key, %opt) = @_;
24 if ($self->{prop}->{$prop}) {
25 local $Error::Depth = $Error::Depth + 1;
26 unless ($self->{opened}->{$prop}) {
27 $self->open_prop (prop => $prop);
28 }
29 my $db = $self->{prop}->{$prop}->{-db};
30 unless ($opt{struct}) {
31 return $db->get ($prop, $key, %opt);
32 } else {
33 my $sprop = $prop.'__struct_cache';
34 unless ($self->{opened}->{$sprop}) {
35 $self->open_prop (prop => $sprop);
36 }
37 my $sdb = $self->{prop}->{$sprop}->{-db};
38 my $sdata = $sdb->get ($sprop, $key, %opt);
39 if ($db->_content_id ($prop, $key, %opt) eq $sdata->{content_id}) {
40 return $sdata->{value};
41 } else {
42 $sdb->delete ($sprop, $key, %opt);
43 return undef;
44 }
45 }
46 } else {
47 return undef;
48 }
49 }
50
51 sub set ($$$$;%) {
52 my ($self, $prop, $key => $value, %opt) = @_;
53 if ($self->{prop}->{$prop}) {
54 local $Error::Depth = $Error::Depth + 1;
55 unless ($self->{opened}->{$prop}) {
56 $self->open_prop (prop => $prop);
57 }
58 my $db = $self->{prop}->{$prop}->{-db};
59 my $sprop = $prop.'__struct_cache';
60 unless ($self->{opened}->{$sprop}) {
61 $self->open_prop (prop => $sprop);
62 }
63 my $sdb = $self->{prop}->{$sprop}->{-db};
64 unless ($opt{struct}) {
65 $sdb->delete ($sprop, $key);
66 return $db->set ($prop, $key => $value, %opt);
67 } else {
68 return $sdb->set ($sprop,
69 $key => {content_id => $db->_content_id ($prop, $key),
70 value => $value}, %opt);
71 }
72 } else {
73 report SuikaWiki::DB::Util::Error
74 -type => 'KEY_SAVE',
75 -object => $self, method => 'set',
76 prop => $prop, key => $key;
77 }
78 }
79
80 sub exist ($$$;%) {
81 my ($self, $prop, $key, %opt) = @_;
82 $prop .= '__struct_cache' if $opt{struct};
83 if ($self->{prop}->{$prop}) {
84 local $Error::Depth = $Error::Depth + 1;
85 unless ($self->{opened}->{$prop}) {
86 $self->open_prop (prop => $prop);
87 }
88 return $self->{prop}->{$prop}->{-db}->exist ($prop, $key, %opt);
89 } else {
90 return 0;
91 }
92 }
93
94 sub delete ($$$;%) {
95 my ($self, $prop, $key, %opt) = @_;
96 $prop .= '__struct_cache' if $opt{struct};
97 if ($self->{prop}->{$prop}) {
98 local $Error::Depth = $Error::Depth + 1;
99 unless ($self->{opened}->{$prop}) {
100 $self->open_prop (prop => $prop);
101 }
102 return $self->{prop}->{$prop}->{-db}->delete ($prop, $key, %opt);
103 }
104 }
105
106 sub keys ($$;%) {
107 my ($self, $prop, %opt) = @_;
108 $prop .= '__struct_cache' if $opt{struct};
109 if ($self->{prop}->{$prop}) {
110 local $Error::Depth = $Error::Depth + 1;
111 unless ($self->{opened}->{$prop}) {
112 $self->open_prop (prop => $prop);
113 }
114 return $self->{prop}->{$prop}->{-db}->keys ($prop, %opt);
115 } else {
116 return ();
117 }
118 }
119
120 # close: Inherited
121
122 =head1 METHODS
123
124 This module provides common interface of SuikaWiki WikiDatabase
125 modules. See documentation of C<SuikaWiki::DB>.
126
127 In addition, this module implements additional methods.
128
129 =over 4
130
131 =item _set_prop_db ($prop_name, {options})
132
133 Addosiates actual database with property name of this logical (virtual)
134 database, or remove its association by specifying C<undef> instead of
135 C<{options}>.
136
137 Options:
138
139 =over 4
140
141 =item -db => $database_instance (REQUIRED)
142
143 Instance of database module, which implements common WikiDatabase interface.
144
145 =back
146
147 =cut
148
149 sub _set_prop_db ($$$) {
150 my ($self, $prop, $db_and_opt) = @_;
151 $self->{prop}->{$prop} = $db_and_opt;
152 $db_and_opt->{-db_close} ||= sub {
153 my %opt = @_;
154 local $Error::Depth = $Error::Depth + 1;
155 $opt{prop_info}->{-db}->close_prop (prop => $opt{prop_info}->{-prop});
156 };
157 }
158
159 sub ___open_prop ($$) {
160 my ($self, $opt) = @_;
161 return "0 but true" if defined $self->{prop}->{$opt->{prop}}->{-db};
162 local $Error::Depth = $Error::Depth + 2;
163 report SuikaWiki::DB::Util::Error
164 -type => 'STOP_DB_PROP_CANT_OPEN__NOT_DEFINED',
165 -object => $self, method => 'open_prop',
166 prop => $opt->{prop}
167 and return 0
168 unless $self->{prop}->{$opt->{prop}}->{-db} or
169 $self->{prop}->{$opt->{prop}}->{-db_open};
170 $self->{prop}->{$opt->{prop}}->{-db}
171 ||= $self->{prop}->{$opt->{prop}}->{-db_open}->(metadb => $self);
172 if ($opt->{prop} !~ /__struct_cache$/) {
173 report SuikaWiki::DB::Util::Error
174 -type => 'STOP_DB_PROP_CANT_OPEN__REQUIRED_METHOD_NOT_DEFINED',
175 -object => $self, method => 'open_prop',
176 prop => $opt->{prop}, method_name => '_content_id'
177 and return 0
178 unless $self->{prop}->{$opt->{prop}}->{-db}->can ('_content_id');
179 }
180 1;
181 }
182
183 sub ___close_prop ($$) {
184 my ($self, $opt) = @_;
185 return "0 but true" unless $self->{opened}->{$opt->{prop}};
186 local $Error::Depth = $Error::Depth + 2;
187 $self->{prop}->{$_}->{-db_close}->(metadb => $self,
188 prop_info => $self->{prop}->{$_});
189 delete $self->{prop}->{$_}->{-db}
190 if $self->{prop}->{$_}->{-db_open};
191 1;
192 }
193
194 =back
195
196 =head1 LICENSE
197
198 Copyright 2003-2004 Wakaba <[email protected]>. All rights reserved.
199
200 This program is free software; you can redistribute it and/or
201 modify it under the same terms as Perl itself.
202
203 =cut
204
205 1; # $Date: 2003/12/06 02:19:09 $

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24