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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide 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 joko 1.1 ################################################
2     #
3 joko 1.3 # $Id: Container.pm,v 1.2 2002/12/01 07:08:35 joko Exp $
4 joko 1.1 #
5     # $Log: Container.pm,v $
6 joko 1.3 # Revision 1.2 2002/12/01 07:08:35 joko
7     # + needs to "use Data::Storage;"
8     #
9 joko 1.2 # Revision 1.1 2002/11/29 04:54:54 joko
10     # + initial check-in
11     #
12 joko 1.1 # 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 joko 1.2 use Data::Storage;
30     #use Data::Storage::Locator;
31 joko 1.1
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 joko 1.3 $locator->{status}->{availability} = $storage->testAvailability();
137 joko 1.1 if ( !$storage->testAvailability() ) {
138 joko 1.3 $logger->error( "$log_prefix: testAvailability failed" );
139 joko 1.1 }
140     }
141    
142     # should we test integrity of the storage before using it?
143 joko 1.3 if ($locator->{status}->{availability} && $locator->{test_integrity}) {
144 joko 1.1 #return unless $storage->testIntegrity();
145     $locator->{status}->{integrity} = $storage->testIntegrity();
146     # actions if integrity fails
147     if (!$locator->{status}->{integrity}) {
148 joko 1.3 $logger->error( "$log_prefix: testIntegrity failed" );
149 joko 1.1 }
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 joko 1.3 $storage->connect() if $locator->{status}->{integrity};
158 joko 1.1
159     # should we check emptyness?
160 joko 1.3 if ($locator->{status}->{availability} && $locator->{test_emptyness}) {
161     #print "test empty", "\n";
162 joko 1.1 if ( !@{$storage->getChildNodes()} ) {
163     $locator->{status}->{empty} = 1;
164 joko 1.3 $logger->warning( "$log_prefix: Storage is empty.");
165 joko 1.1 #return;
166     }
167     }
168    
169     # expand logging?
170 joko 1.3 if ( $locator->{status}->{integrity} && $locator->{logger} ) {
171 joko 1.1 # 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 joko 1.3 #print "add storage: $name", "\n";
188 joko 1.1 $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