/[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.1 - (show annotations)
Fri Nov 29 04:54:54 2002 UTC (21 years, 7 months ago) by joko
Branch: MAIN
+ initial check-in

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

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