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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations)
Sun Nov 17 06:20:41 2002 UTC (21 years, 7 months ago) by joko
Branch: MAIN
+ initial check in

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

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