--- nfo/perl/libs/Data/Rap/Metadata.pm 2003/03/29 07:13:19 1.3 +++ nfo/perl/libs/Data/Rap/Metadata.pm 2004/08/10 13:59:48 1.6 @@ -1,7 +1,17 @@ ## ---------------------------------------------------------------------- -## $Id: Metadata.pm,v 1.3 2003/03/29 07:13:19 joko Exp $ +## $Id: Metadata.pm,v 1.6 2004/08/10 13:59:48 jonen Exp $ ## ---------------------------------------------------------------------- ## $Log: Metadata.pm,v $ +## Revision 1.6 2004/08/10 13:59:48 jonen +## + bugfix(use of Storable): the FreeBSD port of Perl 5.8.4 uses 64 bits +## +## Revision 1.5 2004/06/20 23:00:23 joko +## minor fix: now creates cache-file in same directory where rap.xml is +## +## Revision 1.4 2004/06/20 16:12:24 joko +## + sub indexTargets +## modified getTargetDetails to use cached target details +## ## Revision 1.3 2003/03/29 07:13:19 joko ## better exception handling if target was not found in xml ## @@ -23,7 +33,13 @@ use Data::Dumper; use DesignPattern::Object; +use Storable; +use File::Basename qw( dirname ); +# NEW 2004-08-05: needed at FreeBSD perl>=5.4.3 +# read http://lists.freebsd.org/pipermail/freebsd-ports/2004-June/013169.html +# or more detailed at 'perldoc Storable' +$Storable::interwork_56_64bit = 1; sub accessMetadata { my $self = shift; @@ -83,6 +99,12 @@ sub getTargetDetails { my $self = shift; my $target = shift; + my $options = shift; + + # check cache and return result from there + if (my $result = $self->{cache}->{targets}->{$target} and not $options->{force}) { + return $result; + } # get metadata for single task from storage my $mdbe = $self->accessMetadata(); @@ -104,6 +126,43 @@ return $tree; } +sub indexTargets { + my $self = shift; + my $options = shift; + + # determine filename for cache-file + my $filename = 'rap.xml.cache'; + if (my $rapfile = $self->{__rap}->{filename}) { + if (my $path = dirname($rapfile)) { + $filename = $path . '/' . $filename; + } + } + + if ($options->{build}) { + $self->log("Building index of Targets", 'notice'); + # clear cache + delete $self->{cache}->{targets}; + my $list = $self->getTargetList(); + foreach my $target (@$list) { + $self->log("Reading target: $target->{name}", 'info'); + my $details = $self->getTargetDetails($target->{name}, { force => 1 }); + $self->{cache}->{targets}->{$target->{name}} = $details; + } + store $self->{cache}->{targets}, $filename; + + } elsif ($options->{load}) { + if (not -e $filename) { + return; + } + if ($self->{cache}->{targets} = retrieve($filename)) { + return 1; + } + + } else { + $self->log("Please call with options build or load", 'warning'); + + } +} 1; __END__