/[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.3 - (show annotations)
Sun Dec 1 22:18:28 2002 UTC (21 years, 7 months ago) by joko
Branch: MAIN
Changes since 1.2: +14 -14 lines
- no interactive implicit deploy
+ only test integrity if storage available

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

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