--- nfo/perl/libs/Data/Storage/Container.pm 2002/12/01 07:08:35 1.2 +++ nfo/perl/libs/Data/Storage/Container.pm 2003/06/25 22:52:58 1.11 @@ -1,8 +1,38 @@ ################################################ # -# $Id: Container.pm,v 1.2 2002/12/01 07:08:35 joko Exp $ +# $Id: Container.pm,v 1.11 2003/06/25 22:52:58 joko Exp $ # # $Log: Container.pm,v $ +# Revision 1.11 2003/06/25 22:52:58 joko +# fix:!? add storage in any case +# +# Revision 1.10 2003/06/06 03:26:24 joko +# + sub existsStorage +# +# Revision 1.9 2003/03/27 15:31:08 joko +# fixes to modules regarding new namespace(s) below Data::Mungle::* +# +# Revision 1.8 2003/02/18 19:19:47 joko +# + modified locator handling +# +# Revision 1.7 2003/01/30 22:21:52 joko +# + changed 'connect'-behaviour back to old state +# + renamed log-output (now using 'initializing' instead of 'booting' - corresponding to 'initStorage') +# +# Revision 1.6 2003/01/30 21:44:00 joko +# + temporary fix: (FIXME) now connecting to storage on storagehandle-instantiation +# +# Revision 1.5 2003/01/19 02:39:57 joko +# + moved 'deep_copy' from module 'libp' to module 'Data.Transform.Deep' +# + preserved order for hashes '$self->{config}' and '$self->{locator}' by using Tie::IxHash +# +# Revision 1.4 2002/12/04 07:38:07 jonen +# + deep copy +# +# Revision 1.3 2002/12/01 22:18:28 joko +# - no interactive implicit deploy +# + only test integrity if storage available +# # Revision 1.2 2002/12/01 07:08:35 joko # + needs to "use Data::Storage;" # @@ -24,10 +54,15 @@ # get logger instance my $logger = Log::Dispatch::Config->instance; -use libp qw( deep_copy ); + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - main +use Tie::IxHash; use Data::Dumper; + use Data::Storage; -#use Data::Storage::Locator; +use Data::Storage::Locator; +use Data::Mungle::Transform::Deep qw( deep_copy ); +use Data::Mungle::Compare::Struct qw( isEmpty ); sub new { my $invocant = shift; @@ -39,7 +74,14 @@ $logger->debug( __PACKAGE__ . "->new( @args )" ); my $self = { @_ }; - return bless $self, $class; + bless $self, $class; + + # preserve order of configuration variables + #$self->{config} = {}; + tie %{$self->{config}}, 'Tie::IxHash'; + tie %{$self->{locator}}, 'Tie::IxHash'; + + return $self; } sub addConfig { @@ -68,12 +110,19 @@ $self->{storage}->{$name} = $storage; } +sub existsStorage { + my $self = shift; + my $name = shift; + return exists $self->{storage}->{$name}; +} + sub initLocator { my $self = shift; my $name = shift; my $db_config = $self->{config}->{$name}; + $db_config ||= {}; - $logger->debug( __PACKAGE__ . "->initLocator( db_config $db_config )" ); + $logger->debug( __PACKAGE__ . "->initLocator( name='$name' )" ); my $cfg_locator = {}; @@ -83,12 +132,10 @@ $cfg_locator->{$_} = $default->{$_}; } - # name it - $cfg_locator->{name} = $name; - # merge in specific settings - foreach (keys %$db_config) { - $cfg_locator->{$_} = $db_config->{$_}; + my $specific = deep_copy($db_config); + foreach (keys %$specific) { + $cfg_locator->{$_} = $specific->{$_}; } # HACK: transfer dsn from main to dbi settings @@ -100,6 +147,19 @@ # HACK: set errorhandler if dbi settings are present $cfg_locator->{dbi}->{HandleError} = \&_dbErrorHandler if $cfg_locator->{dbi}; + # trace + #print "locator:", "\n"; + #print Dumper($cfg_locator); + + # check locator metadata + if (isEmpty($cfg_locator)) { + $logger->warning( __PACKAGE__ . "->initLocator( name='$name' ): Metadata was empty. Please check configuration." ); + return; + } + + # name it + $cfg_locator->{name} = $name; + # create new locator object $self->{locator}->{$name} = Data::Storage::Locator->new( $cfg_locator ); @@ -108,6 +168,7 @@ sub initLocators { my $self = shift; foreach (keys %{$self->{config}}) { + #print $_, "\n"; $self->initLocator($_, $self->{config}->{$_}) if !/^_/; } #print "locs: ", Dumper($self->{locator}); @@ -123,34 +184,38 @@ my $self = shift; my $name = shift; + return if $self->existsStorage($name); + my $locator = $self->getLocator($name); - $logger->info( __PACKAGE__ . " is booting storage declared by locator \"$name\"" ); + $logger->info( __PACKAGE__ . " is initializing storage declared by locator \"$name\"" ); my $storage = Data::Storage->new($locator); + + # TODO: do below (after 'testAvailability' and 'testIntegrity') again!!! + #$storage->connect(); + + $self->addStorage($name, $storage); my $log_prefix = __PACKAGE__ . "->initStorage: "; $log_prefix .= "dsn=\"$self->{locator}->{$name}->{dsn}\"" if $self->{locator}->{$name}->{dsn}; # should we test availability of the storage before using it? if ($locator->{test_availability}) { + $locator->{status}->{availability} = $storage->testAvailability(); if ( !$storage->testAvailability() ) { - $logger->error( "$log_prefix is not available" ); + $logger->error( "$log_prefix: testAvailability failed" ); return; } } # should we test integrity of the storage before using it? - if ($locator->{test_integrity}) { + if ($locator->{status}->{availability} && $locator->{test_integrity}) { #return unless $storage->testIntegrity(); $locator->{status}->{integrity} = $storage->testIntegrity(); # actions if integrity fails if (!$locator->{status}->{integrity}) { - $logger->error( "testIntegrity failed on $log_prefix" ); - print "Try a $locator->{name}.deploySchema()? (y/n) "; - my $res = ; - if ($res =~ m/y/i) { - $storage->deploySchema(); - } + $logger->error( "$log_prefix: testIntegrity failed" ); + return; } } @@ -159,19 +224,20 @@ # don't connect right here, do an implicit connect on (later) usage # maybe set ->{meta}->{connectmethod} = "connect" here #return unless $storage->connect(); - $storage->connect(); + $storage->connect() if $locator->{status}->{integrity}; # should we check emptyness? - if ( $locator->{test_emptyness} && $locator->{status}->{integrity} ) { + if ($locator->{status}->{availability} && $locator->{test_emptyness}) { + #print "test empty", "\n"; if ( !@{$storage->getChildNodes()} ) { $locator->{status}->{empty} = 1; - $logger->warning( "$log_prefix is empty"); - #return; + $logger->warning( "$log_prefix: Storage is empty."); + return; } } # expand logging? - if ( $locator->{logger} && $locator->{status}->{integrity} ) { + if ( $locator->{status}->{integrity} && $locator->{logger} ) { # expand logging (to Tangram-Database) # TODO: # - move configuration data from this code to db_config somehow @@ -188,7 +254,8 @@ } #$self->{storage}->{$name} = $storage; - $self->addStorage($name, $storage); + #print "add storage: $name", "\n"; + #$self->addStorage($name, $storage); return 1; @@ -197,6 +264,7 @@ sub initStorages { my $self = shift; foreach (keys %{$self->{locator}}) { + #print $_, "\n"; $self->initStorage($_); } } @@ -215,3 +283,4 @@ } 1; +__END__