/[cvs]/nfo/perl/libs/Data/Storage/Container.pm
ViewVC logotype

Contents of /nfo/perl/libs/Data/Storage/Container.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (show annotations)
Thu Mar 27 15:31:08 2003 UTC (21 years, 3 months ago) by joko
Branch: MAIN
Changes since 1.8: +7 -4 lines
fixes to modules regarding new namespace(s) below Data::Mungle::*

1 ################################################
2 #
3 # $Id: Container.pm,v 1.8 2003/02/18 19:19:47 joko Exp $
4 #
5 # $Log: Container.pm,v $
6 # Revision 1.8 2003/02/18 19:19:47 joko
7 # + modified locator handling
8 #
9 # Revision 1.7 2003/01/30 22:21:52 joko
10 # + changed 'connect'-behaviour back to old state
11 # + renamed log-output (now using 'initializing' instead of 'booting' - corresponding to 'initStorage')
12 #
13 # Revision 1.6 2003/01/30 21:44:00 joko
14 # + temporary fix: (FIXME) now connecting to storage on storagehandle-instantiation
15 #
16 # Revision 1.5 2003/01/19 02:39:57 joko
17 # + moved 'deep_copy' from module 'libp' to module 'Data.Transform.Deep'
18 # + preserved order for hashes '$self->{config}' and '$self->{locator}' by using Tie::IxHash
19 #
20 # Revision 1.4 2002/12/04 07:38:07 jonen
21 # + deep copy
22 #
23 # Revision 1.3 2002/12/01 22:18:28 joko
24 # - no interactive implicit deploy
25 # + only test integrity if storage available
26 #
27 # Revision 1.2 2002/12/01 07:08:35 joko
28 # + needs to "use Data::Storage;"
29 #
30 # Revision 1.1 2002/11/29 04:54:54 joko
31 # + initial check-in
32 #
33 # Revision 1.1 2002/11/17 06:20:41 joko
34 # + initial check in
35 #
36 #
37 ################################################
38
39
40 package Data::Storage::Container;
41
42 use strict;
43 use warnings;
44
45 # get logger instance
46 my $logger = Log::Dispatch::Config->instance;
47
48
49 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - main
50 use Tie::IxHash;
51 use Data::Dumper;
52
53 use Data::Storage;
54 use Data::Storage::Locator;
55 use Data::Mungle::Transform::Deep qw( deep_copy );
56 use Data::Mungle::Compare::Struct qw( isEmpty );
57
58 sub new {
59 my $invocant = shift;
60 my $class = ref($invocant) || $invocant;
61
62 # get constructor arguments
63 my @args = ();
64 @_ && (@args = @_);
65 $logger->debug( __PACKAGE__ . "->new( @args )" );
66
67 my $self = { @_ };
68 bless $self, $class;
69
70 # preserve order of configuration variables
71 #$self->{config} = {};
72 tie %{$self->{config}}, 'Tie::IxHash';
73 tie %{$self->{locator}}, 'Tie::IxHash';
74
75 return $self;
76 }
77
78 sub addConfig {
79 my $self = shift;
80 my $name = shift;
81 my $config = shift;
82 $self->{config}->{$name} = $config;
83 }
84
85 sub addConfigByDsn {
86 my $self = shift;
87 my $name = shift;
88 my $dsn = shift;
89
90 # HACK: assume DBI as default type for now
91 # TODO: guess type from dsn
92 my $type = "DBI";
93
94 $self->addConfig($name, { type => $type, dsn => $dsn });
95 }
96
97 sub addStorage {
98 my $self = shift;
99 my $name = shift;
100 my $storage = shift;
101 $self->{storage}->{$name} = $storage;
102 }
103
104 sub initLocator {
105 my $self = shift;
106 my $name = shift;
107 my $db_config = $self->{config}->{$name};
108 $db_config ||= {};
109
110 $logger->debug( __PACKAGE__ . "->initLocator( name='$name' )" );
111
112 my $cfg_locator = {};
113
114 # set default settings, if any
115 my $default = deep_copy($self->{config}->{_default});
116 foreach (keys %$default) {
117 $cfg_locator->{$_} = $default->{$_};
118 }
119
120 # merge in specific settings
121 my $specific = deep_copy($db_config);
122 foreach (keys %$specific) {
123 $cfg_locator->{$_} = $specific->{$_};
124 }
125
126 # HACK: transfer dsn from main to dbi settings
127 $cfg_locator->{dbi}->{dsn} = $cfg_locator->{dsn} if $cfg_locator->{dsn};
128
129 # HACK: set classnames empty if none given from config
130 $cfg_locator->{classnames} = [] if !$cfg_locator->{classnames};
131
132 # HACK: set errorhandler if dbi settings are present
133 $cfg_locator->{dbi}->{HandleError} = \&_dbErrorHandler if $cfg_locator->{dbi};
134
135 # trace
136 #print "locator:", "\n";
137 #print Dumper($cfg_locator);
138
139 # check locator metadata
140 if (isEmpty($cfg_locator)) {
141 $logger->warning( __PACKAGE__ . "->initLocator( name='$name' ): Metadata was empty. Please check configuration." );
142 return;
143 }
144
145 # name it
146 $cfg_locator->{name} = $name;
147
148 # create new locator object
149 $self->{locator}->{$name} = Data::Storage::Locator->new( $cfg_locator );
150
151 }
152
153 sub initLocators {
154 my $self = shift;
155 foreach (keys %{$self->{config}}) {
156 #print $_, "\n";
157 $self->initLocator($_, $self->{config}->{$_}) if !/^_/;
158 }
159 #print "locs: ", Dumper($self->{locator});
160 }
161
162 sub getLocator {
163 my $self = shift;
164 my $name = shift;
165 return $self->{locator}->{$name};
166 }
167
168 sub initStorage {
169 my $self = shift;
170 my $name = shift;
171
172 my $locator = $self->getLocator($name);
173 $logger->info( __PACKAGE__ . " is initializing storage declared by locator \"$name\"" );
174
175 my $storage = Data::Storage->new($locator);
176
177 # TODO: do below (after 'testAvailability' and 'testIntegrity') again!!!
178 #$storage->connect();
179
180 my $log_prefix = __PACKAGE__ . "->initStorage: ";
181 $log_prefix .= "dsn=\"$self->{locator}->{$name}->{dsn}\"" if $self->{locator}->{$name}->{dsn};
182
183 # should we test availability of the storage before using it?
184 if ($locator->{test_availability}) {
185 $locator->{status}->{availability} = $storage->testAvailability();
186 if ( !$storage->testAvailability() ) {
187 $logger->error( "$log_prefix: testAvailability failed" );
188 }
189 }
190
191 # should we test integrity of the storage before using it?
192 if ($locator->{status}->{availability} && $locator->{test_integrity}) {
193 #return unless $storage->testIntegrity();
194 $locator->{status}->{integrity} = $storage->testIntegrity();
195 # actions if integrity fails
196 if (!$locator->{status}->{integrity}) {
197 $logger->error( "$log_prefix: testIntegrity failed" );
198 }
199 }
200
201 # try to connect...
202 # TODO:
203 # don't connect right here, do an implicit connect on (later) usage
204 # maybe set ->{meta}->{connectmethod} = "connect" here
205 #return unless $storage->connect();
206 $storage->connect() if $locator->{status}->{integrity};
207
208 # should we check emptyness?
209 if ($locator->{status}->{availability} && $locator->{test_emptyness}) {
210 #print "test empty", "\n";
211 if ( !@{$storage->getChildNodes()} ) {
212 $locator->{status}->{empty} = 1;
213 $logger->warning( "$log_prefix: Storage is empty.");
214 #return;
215 }
216 }
217
218 # expand logging?
219 if ( $locator->{status}->{integrity} && $locator->{logger} ) {
220 # expand logging (to Tangram-Database)
221 # TODO:
222 # - move configuration data from this code to db_config somehow
223 # - do complete handling of this stuff in Data::Storage::* also
224 # - just leave a simple on/off-trigger here and/or
225 # - make it optionally configurable via e.g. get/set-methods
226 # to satisfy "manual"-mode instead of "config"-mode
227 # - (re-)add hierarchical logging (each event may have a parent)
228 no strict;
229 my $creator = sub { return new SystemEvent; };
230 use strict;
231 $storage->addLogDispatchHandler("Tangram11", "Log::Dispatch::Tangram", $logger, $creator);
232 #$storage_left->addLogDispatchHandler("Tangram11", "Log::Dispatch::Tangram", $logger);
233 }
234
235 #$self->{storage}->{$name} = $storage;
236 #print "add storage: $name", "\n";
237 $self->addStorage($name, $storage);
238
239 return 1;
240
241 }
242
243 sub initStorages {
244 my $self = shift;
245 foreach (keys %{$self->{locator}}) {
246 #print $_, "\n";
247 $self->initStorage($_);
248 }
249 }
250
251 sub _dbErrorHandler {
252 my $message_db = shift;
253 # get logger instance
254 #my $logger = Log::Dispatch::Config->instance;
255 #$logger->log(level => 'error', message => "Tangram DBI-Error: $message");
256 my $message_log = "DBI-Error: $message_db";
257 print STDERR $message_log, "\n";
258 #$logger->error( $message_log );
259 #$logger->log_to( name => 'file', level => 'error', message => $message_log);
260 $logger->log_to( name => 'file', level => 'warning', message => $message_log);
261 return 1;
262 }
263
264 1;

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed