--- nfo/perl/libs/Data/Storage/Handler/Abstract.pm 2003/01/19 02:31:51 1.10 +++ nfo/perl/libs/Data/Storage/Handler/Abstract.pm 2003/04/18 16:07:53 1.16 @@ -1,7 +1,27 @@ -## -------------------------------------------------------------------------------- -## $Id: Abstract.pm,v 1.10 2003/01/19 02:31:51 joko Exp $ -## -------------------------------------------------------------------------------- +## ------------------------------------------------------------------------ +## $Id: Abstract.pm,v 1.16 2003/04/18 16:07:53 joko Exp $ +## ------------------------------------------------------------------------ ## $Log: Abstract.pm,v $ +## Revision 1.16 2003/04/18 16:07:53 joko +## just use logger if instantiation successed +## +## Revision 1.15 2003/02/20 20:19:13 joko +## tried to get auto-disconnect working again - failed with that +## +## Revision 1.14 2003/02/09 05:12:28 joko +## + quoting of strings used in sql-queries! +## +## Revision 1.13 2003/01/30 22:27:05 joko +## + added new abstract methods +## +## Revision 1.12 2003/01/30 21:46:32 joko +## + fixed behaviour of AUTOLOAD-method +## +## Revision 1.11 2003/01/20 16:43:18 joko +## + better argument-property merging +## + debugging-output !!! +## + abstract-dummy 'sub createChildNode' +## ## Revision 1.10 2003/01/19 02:31:51 joko ## + fix to 'sub AUTOLOAD' ## @@ -33,7 +53,7 @@ ## ## Revision 1.1 2002/10/10 03:44:07 cvsjoko ## + new -## -------------------------------------------------------------------------------- +## ------------------------------------------------------------------------ package Data::Storage::Handler::Abstract; @@ -43,12 +63,18 @@ use base qw( DesignPattern::Object ); + use Data::Dumper; use Tie::SecureHash; #use Data::Storage::Handler; +use Hash::Merge qw( merge ); + +#use Log::Dispatch::Config; +#Log::Dispatch::Config->configure(); # get logger instance -my $logger = Log::Dispatch::Config->instance; +my $logger; +eval('$logger = Log::Dispatch::Config->instance;'); #our $lock_info; @@ -57,7 +83,7 @@ my $class = ref($invocant) || $invocant; # logging info about the actual handler called - $logger->debug( "$invocant->new( @_ )" ); + $logger->debug( "$invocant->new( @_ )" ) if $logger; #$logger->debug( __PACKAGE__ . "->" . "new()" ); # V1 - arguments become properties automagically / normal perl mode blessing @@ -95,15 +121,24 @@ #=cut # merge passed-in arguments to constructor as properties into already blessed secure object - + # mungle arguments from array into hash - perl does the job ;) - my %args = @_; - + #my %args = @_; + #my %args = (); + +#print Dumper(@_); + # merge attributes one-by-one # TODO: deep_copy? / merge_deep? - foreach (keys %args) { - #print "key: $_", "\n"; - $self->{$_} = $args{$_}; + while (my $elemName = shift @_) { + #print "elemName: $elemName", "\n"; + if (my $elemValue = shift @_) { + #print Dumper($elemValue); + #print "elemName=$elemName, elemValue=$elemValue", "\n"; + $self->{$elemName} = $elemValue; + } + #$self->{$_} = $args{$_}; + #$self->{$_} = $args{$_}; } # V3 - rolling our own security (just for {COREHANDLE} - nothing else) - nope, Tie::SecureHash works wonderful @@ -193,11 +228,15 @@ $handlertype ||= ''; my $err_msg_core = __PACKAGE__ . "[$handlertype]" . ": " . "COREHANDLE is undefined while trying to execute method \"$methodname\""; -print $err_msg_core, "\n"; - if ($self->exists('lock_info') && !$self->{lock_info}->{log_lock}) { + +#print $err_msg_core, "\n"; + + #if ($self->exists('lock_info') && !$self->{lock_info}->{log_lock}) { $logger->error( $err_msg_core ); - } + #} + return; + } #=cut @@ -250,8 +289,34 @@ sub DESTROY { my $self = shift; - #if ($self->{COREHANDLE}) { - if ($self->exists('_COREHANDLE')) { + +return; + + $logger->debug( __PACKAGE__ . "[$self->{metainfo}->{type}]" . "->DESTROY" ); + + my $disconnectMethod = $self->{metainfo}->{disconnectMethod}; + print "meth: ", $disconnectMethod, "\n"; + + #$disconnectMethod && $self->{_COREHANDLE} && ( $self->{_COREHANDLE}->$disconnectMethod() ); + $self->{_COREHANDLE}->$disconnectMethod(); + #$self->$disconnectMethod(); + + #my $core1 = $self->getCOREHANDLE() if $self->can('getCOREHANDLE'); + #$core1->$disconnectMethod(); + +return; + + print "DESTROY-1", "\n"; + #if ($self->{__COREHANDLE}) { + #if ($self->exists('_COREHANDLE')) { + + # get corehandle instance from underlying handler + my $core; + $core = $self->getCOREHANDLE() if $self->can('getCOREHANDLE'); + + #if ($self->{STORAGEHANDLE}) { + if ($core) { + print "DESTROY-2", "\n"; $logger->debug( __PACKAGE__ . "[$self->{metainfo}->{type}]" . "->DESTROY" ); my $disconnectMethod = $self->{metainfo}->{disconnectMethod}; @@ -278,10 +343,23 @@ sub existsChildNode { my $self = shift; my $nodename = shift; - #$nodename = 'TransactionRoutingTable'; - $logger->debug( __PACKAGE__ . "->existsChildNode( nodename $nodename )" ); + + # TODO: don't use $self->{meta}->{childnodes} directly in here + # get it returned from $self->getChildNodes()!!! + + $logger->debug( __PACKAGE__ . "->existsChildNode( nodename=$nodename )" ); $self->getChildNodes() unless $self->{meta}->{childnodes}; - my $result = grep(m/$nodename/i, @{$self->{meta}->{childnodes}}); # TODO: use "/i" only on win32-systems! + + # quote this, it might contain meta characters which don't work in a regex + $nodename = quotemeta($nodename); + + # trace + #print Dumper($self->{meta}); + #print "nodename: $nodename", "\n"; + + # FIXME: use "/i" only on win32-systems! + my $result = grep(m/$nodename/i, @{$self->{meta}->{childnodes}}); + return $result; } @@ -316,6 +394,11 @@ $self->_abstract_function('sendCommand'); } + sub createChildNode { + my $self = shift; + $self->_abstract_function('createChildNode'); + } + sub existsChildNode_tmp { my $self = shift; $self->_abstract_function('existsChildNode'); @@ -397,4 +480,28 @@ return; } + sub getDbName { + my $self = shift; + $self->_abstract_function('getDbName'); + return; + } + + sub testAvailability { + my $self = shift; + $self->_abstract_function('testAvailability'); + return; + } + + sub isConnected { + my $self = shift; + $self->_abstract_function('isConnected'); + return; + } + + sub testDsn { + my $self = shift; + $self->_abstract_function('testDsn'); + return; + } + 1;