diff --git a/perl/exit_strategy.pl b/perl/exit_strategy.pl index 6f291adc674ad1b0eb7788596e928861bc091589..63e9448b370b14c9a6ff19ac75e814b289d4e3f5 100644 --- a/perl/exit_strategy.pl +++ b/perl/exit_strategy.pl @@ -43,7 +43,7 @@ use constant DEBUG => 0; # no debug use Carp; use DBD::SQLite; use DBI; -use File::Basename qw(basename); +use File::Basename qw(basename dirname); use File::Find; use Getopt::Long; use IO::Handle; @@ -105,6 +105,7 @@ sub write_tables_creation ($dbh) { ie_id TEXT NOT NULL, lza_id TEXT, version INTEGER NOT NULL, + dir_path TEXT NOT NULL, PRIMARY KEY(id AUTOINCREMENT) ); SQL_CREATE1 @@ -144,6 +145,7 @@ SQL_CREATE4 file_id INTEGER NOT NULL REFERENCES sourcedatafile (id), location TEXT NOT NULL, sourcetype TEXT NOT NULL, + filesize INTEGER, PRIMARY KEY(id AUTOINCREMENT) ); SQL_CREATE5 @@ -168,7 +170,6 @@ CREATE TABLE transferAIP ( ); SQL_CREATE7 - my $sth1 = $dbh->prepare($sql1); $sth1->execute() or die "sql problem detected", $dbh->errstr; my $sth2 = $dbh->prepare($sql2); $sth2->execute() or die "sql problem detected", $dbh->errstr; my $sth3 = $dbh->prepare($sql3); $sth3->execute() or die "sql problem detected", $dbh->errstr; @@ -188,7 +189,7 @@ sub write_prepare_insert ($dbh) { sub prepare_addsql( $dbh) { my $sql_aip_plan=<<"SQL_AIP_PLAN"; - INSERT INTO aip (ie_id, lza_id, version) VALUES (\$1, \$2, \$3); + INSERT INTO aip (ie_id, lza_id, version, dir_path) VALUES (\$1, \$2, \$3, \$4); SQL_AIP_PLAN my $sql_ie_plan=<<"SQL_IE_PLAN"; INSERT INTO metadatafile (aip_id, location, sourcetype) VALUES ( @@ -201,10 +202,10 @@ SQL_IE_PLAN ); SQL_FILE_PLAN my $sql_locat_plan=<<"SQL_LOCAT_PLAN"; - INSERT INTO sourcedatalocat (file_id, location, sourcetype) VALUES ( + INSERT INTO sourcedatalocat (file_id, location, sourcetype, filesize) VALUES ( (SELECT sourcedatafile.id FROM sourcedatafile,aip WHERE sourcedatafile.aip_id=aip.id AND aip.ie_id=\$1 AND aip.version=\$2 AND - sourcedatafile.name=\$3), \$4, \$5 + sourcedatafile.name=\$3), \$4, \$5, \$6 ); SQL_LOCAT_PLAN my $sql_dc_plan=<<"SQL_DC_PLAN"; @@ -260,6 +261,7 @@ SQL_DELETE_PLAN my %lza_id_counter_hash; sub write_addsql($dbh, $plans, $refhash) { my $iefile = basename($refhash->{"filename"}); + my $dir = dirname($refhash->{"filename"}); my ($ieid, $ieversion); if ($iefile =~ m/^V(\d+)-(IE\d*)\.xml$/) { $ieversion = $1; @@ -284,14 +286,16 @@ SQL_DELETE_PLAN } } # start SQL insert - eval {$plans->{aip}->execute($ieid, $lza_id, $ieversion)} or die "sql problem detected with $ieid ($ieversion), plz check if there is a dublette dir, ", $dbh->errstr; + eval {$plans->{aip}->execute($ieid, $lza_id, $ieversion, $dir)} or die "sql problem detected with $ieid ($ieversion), plz check if there is a dublette dir, ", $dbh->errstr; # FIXME if multiple locations exists eval {$plans->{ie}->execute($ieid, $ieversion, $iefile, $sourcetype)} or die "sql problem detected with $ieid ($ieversion, $iefile, $sourcetype), ", $dbh->errstr; foreach my $location (@{$refhash->{"files"}}) { my $file = basename($location); # FIXME if multiple locations + my $size = $refhash->{"sizes"}->{$location}; + $location=~s#//#/#g; # post correct file paths, because sometimes in Rosetta // is used eval {$plans->{file}->execute($ieid, $ieversion, $file)} or die "sql problem detected with $ieid ($ieversion, $file), ", $dbh->errstr; - eval {$plans->{locat}->execute($ieid, $ieversion, $file, $location, $sourcetype)} or die "sql problem detected with $ieid ($ieversion, $file, $location, $sourcetype), ", $dbh->errstr; + eval {$plans->{locat}->execute($ieid, $ieversion, $file, $location, $sourcetype, $size)} or die "sql problem detected with $ieid ($ieversion, $file, $location, $sourcetype, $size), ", $dbh->errstr; } foreach my $dcpair (@{$refhash->{"dcrecords"}}) { my ($dckey, $dcvalue) = @{$dcpair}; @@ -406,6 +410,7 @@ sub check_if_db_conform ($string, $filename) { my $compiled_xpath_purged_event_date = XML::LibXML::XPathExpression->new($xpath_if_purged_expr .'dnx:key[@id="eventDateTime"]/text()'); my $compiled_xpath_purged_event_authorized_by = XML::LibXML::XPathExpression->new($xpath_if_purged_expr . 'dnx:key[@id="linkingAgentIdentifierValue1"]/text()'); my $compiled_xpath_purged_event_reason = XML::LibXML::XPathExpression->new($xpath_if_purged_expr . 'dnx:key[@id="eventOutcomeDetail1"]/text()'); + ############################################################ sub get_title ($xp, $dmd){ # get title @@ -446,10 +451,29 @@ sub check_if_db_conform ($string, $filename) { sub get_files_ref ($xp, $fsp, $repid){ my $filegrp = $xp->findnodes("mets:fileGrp[\@ADMID='$repid']", $fsp)->[0]; my @files_nodes = $xp->findnodes($compiled_xpath_files, $filegrp); - my @files = map { my $tmp= $_->nodeValue; $tmp=~ s#//#/#g; $tmp } @files_nodes; + my @files = map { my $tmp= $_->nodeValue; $tmp } @files_nodes; return \@files; } + sub get_filesize ($xp, $filepath) { + my $xpath_id =<<"XPATH"; +/mets:mets/mets:fileSec/mets:fileGrp/mets:file[mets:FLocat/\@*[ + namespace-uri()='http://www.w3.org/1999/xlink' and local-name()='href']='$filepath']/\@ID +XPATH + my $xpath =<<"XPATH2"; + /mets:mets/mets:amdSec/mets:techMD[ + $xpath_id + and + starts-with(\@ID,$xpath_id) + ]/mets:mdWrap/mets:xmlData/*[namespace-uri()='http://www.exlibrisgroup.com/dps/dnx' and local-name()='dnx'] + /*[namespace-uri()='http://www.exlibrisgroup.com/dps/dnx' and local-name()='section'] + /*[namespace-uri()='http://www.exlibrisgroup.com/dps/dnx' and local-name()='record'] + /*[namespace-uri()='http://www.exlibrisgroup.com/dps/dnx' and local-name()='key' and \@id='fileSizeBytes']/text() +XPATH2 + my $size = $xp->findvalue($xpath); + return $size; + } + sub get_purged_states($xp, $amd) { # we need to earch for eventIdentifierValue 272 or 274. # the eventDescription should be @@ -536,6 +560,10 @@ sub check_if_db_conform ($string, $filename) { ############################################ # get all files of LOCAL representation $ret->{"files"} = get_files_ref($xp, $filesec, $repid); + foreach my $location (@{$ret->{"files"}}) { + $ret->{"sizes"}->{$location} = get_filesize($xp, $location); + } + return $ret; }