diff --git a/perl/exit_strategy.pl b/perl/exit_strategy.pl index 53b5391d9d224034e2c2f6e808c6c1ebccce1154..7fb4ad0de398a56a9085bee76ff1907a8775264c 100644 --- a/perl/exit_strategy.pl +++ b/perl/exit_strategy.pl @@ -150,36 +150,7 @@ sub write_prepare_insert ($dbh) { return 1; } - -############################################################################### -# write add SQL entry, expects a hashref which contains ff. params -# (foreach file location/copy): -# INSERT INTO aip (ie_id) VALUES ($ieid); -# INSERT INTO iefile (aip_id, location, sourcetype) VALUES ( -# (SELECT id FROM aip where aip.ieid = $ieid), $location, $sourcetype); -# INSERT INTO file (aip_id, name) VALUES ( -# (SELECT id FROM aip where aip.ieid = $ieid), $name); -# INSERT INTO locat (file_id, location, sourcetype) VALUES ( -# (SELECT file.aip_id FROM file where file.aip_id = aip.id -# AND aip.ie_id=$ieid), $location, $sourcetype) -# INSERT INTO dc (aip_id, element, value) VALUES ( -# (SELECT id FROM aip where aip.ieid = $ieid), $element, $value); -# TODO: needs additional work -# expects a reference of an hash: -# $ret{"filename" } = $filename; -# $ret{"title"} = $title; -# $ret{"repid"} = $repid; -# $ret{"files"} = \@files; -# $ret{"dcrecords"} = \@dcrecords; -############################################################################### -sub write_addsql ($dbh, $refhash) { - my $iefile = path($refhash->{"filename"})->basename(); - my ($ieid,$ieversion); - if ($iefile =~ m/^V(\d+)-(IE\d*)\.xml$/) { - $ieversion=$1; $ieid=$2; - } else { - die "Could not detect PID and Version from IEFile '$iefile'\n"; - } +sub prepare_addsql( $dbh) { my $sql_aip_plan=<<"SQL_AIP_PLAN"; INSERT INTO aip (ie_id, version) VALUES (\$1, \$2); SQL_AIP_PLAN @@ -205,27 +176,65 @@ SQL_LOCAT_PLAN (SELECT id FROM aip WHERE aip.ie_id=\$1 AND aip.version=\$2), \$3, \$4 ); SQL_DC_PLAN - $dbh->begin_work; my $sth_aip_plan = $dbh->prepare($sql_aip_plan); my $sth_ie_plan = $dbh->prepare($sql_ie_plan); my $sth_file_plan = $dbh->prepare($sql_file_plan); my $sth_locat_plan = $dbh->prepare($sql_locat_plan); my $sth_dc_plan = $dbh->prepare($sql_dc_pan); + my $plans; + $plans->{aip} = $sth_aip_plan; + $plans->{ie} = $sth_ie_plan; + $plans->{file} = $sth_file_plan; + $plans->{locat} = $sth_locat_plan; + $plans->{dc} = $sth_dc_plan; + return $plans; +} + +############################################################################### +# write add SQL entry, expects a hashref which contains ff. params +# (foreach file location/copy): +# INSERT INTO aip (ie_id) VALUES ($ieid); +# INSERT INTO iefile (aip_id, location, sourcetype) VALUES ( +# (SELECT id FROM aip where aip.ieid = $ieid), $location, $sourcetype); +# INSERT INTO file (aip_id, name) VALUES ( +# (SELECT id FROM aip where aip.ieid = $ieid), $name); +# INSERT INTO locat (file_id, location, sourcetype) VALUES ( +# (SELECT file.aip_id FROM file where file.aip_id = aip.id +# AND aip.ie_id=$ieid), $location, $sourcetype) +# INSERT INTO dc (aip_id, element, value) VALUES ( +# (SELECT id FROM aip where aip.ieid = $ieid), $element, $value); +# TODO: needs additional work +# expects a reference of an hash: +# $ret{"filename" } = $filename; +# $ret{"title"} = $title; +# $ret{"repid"} = $repid; +# $ret{"files"} = \@files; +# $ret{"dcrecords"} = \@dcrecords; +############################################################################### +sub write_addsql ($dbh, $plans, $refhash) { + my $iefile = path($refhash->{"filename"})->basename(); + my ($ieid,$ieversion); + if ($iefile =~ m/^V(\d+)-(IE\d*)\.xml$/) { + $ieversion=$1; $ieid=$2; + } else { + die "Could not detect PID and Version from IEFile '$iefile'\n"; + } + $dbh->begin_work; # start SQL insert - $sth_aip_plan->execute($ieid, $ieversion) or die "sql problem detected", $dbh->errstr; + $plans->{aip}->execute($ieid, $ieversion) or die "sql problem detected", $dbh->errstr; # FIXME if multiple locations exists - $sth_ie_plan->execute( $ieid, $ieversion, $iefile, $sourcetype) or die "sql problem detected", $dbh->errstr; + $plans->{ie}->execute( $ieid, $ieversion, $iefile, $sourcetype) or die "sql problem detected", $dbh->errstr; foreach my $location (@{$refhash->{"files"}}) { my $file = path($location)->basename(); # FIXME if multiple locations - $sth_file_plan->execute($ieid, $ieversion, $file) or die "sql problem detected", $dbh->errstr; - $sth_locat_plan->execute($ieid, $ieversion, $file, $location, $sourcetype) or die "sql problem detected", $dbh->errstr; + $plans->{file}->execute($ieid, $ieversion, $file) or die "sql problem detected", $dbh->errstr; + $plans->{locat}->execute($ieid, $ieversion, $file, $location, $sourcetype) or die "sql problem detected", $dbh->errstr; } foreach my $dcpair (@{$refhash->{"dcrecords"}}) { my ($dckey,$dcvalue) = @{$dcpair}; # quote ' in dcvalue $dcvalue=~tr/'/"/; - $sth_dc_plan->execute($ieid, $ieversion, $dckey, $dcvalue) or die "sql problem detected", $dbh->errstr; + $plans->{dc}->execute($ieid, $ieversion, $dckey, $dcvalue) or die "sql problem detected", $dbh->errstr; } $dbh->commit; return 1; @@ -536,12 +545,14 @@ $dbh = DBI->connect("dbi:SQLite:dbname=$db_filename", "", "", { RaiseError => 1, sqlite_unicode => 1, }) or die "could not connect to database (file '$db_filename')", $DBI::errstr; + +my $plans = prepare_addsql( $dbh); while (<$fh_unsorted_IEs>) { chomp; print $progressbar->report("parse IE files: %40b ETA: %E \r", $count++); s/V0*(\d+-IE)/V$1/; # revert fake version my $ret = parse_iexml($_, $flag_recovery); - write_addsql($dbh, $ret); + write_addsql($dbh, $plans, $ret); } $dbh->disconnect or warn("disconnecting problems, ", $dbh->errstr); say "\rprocessed $count uniq IEs ";