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

1 joko 1.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