X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=tools%2Fstage-marc-import.pl;h=d8de9055f81b6b494200cc4650a60e420fb9a674;hb=09d153d85a2fcfe08fa862da30b65214ff78f3cf;hp=b3b2aa48154d8f9b70cc99ca62e862ca1f7bd8b7;hpb=853aa657ba1891d804d0c8fbe9059317f2949fff;p=koha.git diff --git a/tools/stage-marc-import.pl b/tools/stage-marc-import.pl index b3b2aa4815..d8de9055f8 100755 --- a/tools/stage-marc-import.pl +++ b/tools/stage-marc-import.pl @@ -13,7 +13,7 @@ # # Koha is free software; you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later +# Foundation; either version 2 of the License, or (at your op) any later # version. # # Koha is distributed in the hope that it will be useful, but WITHOUT ANY @@ -28,38 +28,31 @@ use strict; # standard or CPAN modules used use CGI; +use CGI::Cookie; use MARC::File::USMARC; # Koha modules used use C4::Context; use C4::Auth; -use C4::Input; use C4::Output; use C4::Biblio; use C4::ImportBatch; use C4::Matcher; - -#------------------ -# Constants - -my $includes = C4::Context->config('includes') || - "/usr/local/www/hdl/htdocs/includes"; - -# HTML colors for alternating lines -my $lc1='#dddddd'; -my $lc2='#ddaaaa'; - -#------------- -#------------- -# Initialize - -my $userid=$ENV{'REMOTE_USER'}; +use C4::UploadedFile; +use C4::BackgroundJob; my $input = new CGI; my $dbh = C4::Context->dbh; - -my $uploadmarc=$input->param('uploadmarc'); -my $check_for_matches = $input->param('check_for_matches'); +$dbh->{AutoCommit} = 0; + +my $fileID=$input->param('uploadedfileid'); +my $runinbackground = $input->param('runinbackground'); +my $completedJobID = $input->param('completedJobID'); +my $matcher_id = $input->param('matcher'); +my $overlay_action = $input->param('overlay_action'); +my $nomatch_action = $input->param('nomatch_action'); +my $parse_items = $input->param('parse_items'); +my $item_action = $input->param('item_action'); my $comments = $input->param('comments'); my $syntax = $input->param('syntax'); my ($template, $loggedinuser, $cookie) @@ -67,41 +60,156 @@ my ($template, $loggedinuser, $cookie) query => $input, type => "intranet", authnotrequired => 0, - flagsrequired => {tools => 1}, + flagsrequired => {tools => 'stage_marc_import'}, debug => 1, }); $template->param(SCRIPT_NAME => $ENV{'SCRIPT_NAME'}, - uploadmarc => $uploadmarc); -my $filename = $uploadmarc; -if ($uploadmarc && length($uploadmarc)>0) { + uploadmarc => $fileID); + +my %cookies = parse CGI::Cookie($cookie); +my $sessionID = $cookies{'CGISESSID'}->value; +if ($completedJobID) { + my $job = C4::BackgroundJob->fetch($sessionID, $completedJobID); + my $results = $job->results(); + $template->param(map { $_ => $results->{$_} } keys %{ $results }); +} elsif ($fileID) { + my $uploaded_file = C4::UploadedFile->fetch($sessionID, $fileID); + my $fh = $uploaded_file->fh(); my $marcrecord=''; - while (<$uploadmarc>) { + $/ = "\035"; + while (<$fh>) { + s/^\s+//; + s/\s+$//; $marcrecord.=$_; } + my $filename = $uploaded_file->name(); + my $job = undef; + my $staging_callback = sub { }; + my $matching_callback = sub { }; + if ($runinbackground) { + my $job_size = () = $marcrecord =~ /\035/g; + # if we're matching, job size is doubled + $job_size *= 2 if ($matcher_id ne ""); + $job = C4::BackgroundJob->new($sessionID, $filename, $ENV{'SCRIPT_NAME'}, $job_size); + my $jobID = $job->id(); + + # fork off + if (my $pid = fork) { + # parent + # return job ID as JSON + + # prevent parent exiting from + # destroying the kid's database handle + # FIXME: according to DBI doc, this may not work for Oracle + $dbh->{InactiveDestroy} = 1; + + my $reply = CGI->new(""); + print $reply->header(-type => 'text/html'); + print "{ jobID: '$jobID' }"; + exit 0; + } elsif (defined $pid) { + # child + # close STDOUT to signal to Apache that + # we're now running in the background + close STDOUT; + close STDERR; + } else { + # fork failed, so exit immediately + warn "fork failed while attempting to run $ENV{'SCRIPT_NAME'} as a background job"; + exit 0; + } + + # if we get here, we're a child that has detached + # itself from Apache + $staging_callback = staging_progress_callback($job, $dbh); + $matching_callback = matching_progress_callback($job, $dbh); + + } + # FIXME branch code - my ($batch_id, $num_valid, @import_errors) = BatchStageMarcRecords($syntax, $marcrecord, $filename, $comments, '', 0); - my $matcher = C4::Matcher->new('biblio'); - $matcher->add_matchpoint("020", "a", '', 'isbn', 1000); + my ($batch_id, $num_valid, $num_items, @import_errors) = BatchStageMarcRecords($syntax, $marcrecord, $filename, + $comments, '', $parse_items, 0, + 50, staging_progress_callback($job, $dbh)); + $dbh->commit(); my $num_with_matches = 0; my $checked_matches = 0; - if ($check_for_matches) { - $checked_matches = 1; - $num_with_matches = BatchFindBibDuplicates($batch_id, $matcher); + my $matcher_failed = 0; + my $matcher_code = ""; + if ($matcher_id ne "") { + my $matcher = C4::Matcher->fetch($matcher_id); + if (defined $matcher) { + $checked_matches = 1; + $matcher_code = $matcher->code(); + $num_with_matches = BatchFindBibDuplicates($batch_id, $matcher, + 10, 50, matching_progress_callback($job, $dbh)); + SetImportBatchMatcher($batch_id, $matcher_id); + SetImportBatchOverlayAction($batch_id, $overlay_action); + SetImportBatchNoMatchAction($batch_id, $nomatch_action); + SetImportBatchItemAction($batch_id, $item_action); + $dbh->commit(); + } else { + $matcher_failed = 1; + } } - # FIXME we're not committing now - # my ($num_added, $num_updated, $num_ignored) = BatchCommitBibRecords($batch_id); - $template->param(staged => $num_valid, - matched => $num_with_matches, - import_errors => scalar(@import_errors), - total => $num_valid + scalar(@import_errors), - checked_matches => $checked_matches, - import_batch_id => $batch_id - ); + my $results = { + staged => $num_valid, + matched => $num_with_matches, + num_items => $num_items, + import_errors => scalar(@import_errors), + total => $num_valid + scalar(@import_errors), + checked_matches => $checked_matches, + matcher_failed => $matcher_failed, + matcher_code => $matcher_code, + import_batch_id => $batch_id + }; + if ($runinbackground) { + $job->finish($results); + } else { + $template->param(staged => $num_valid, + matched => $num_with_matches, + num_items => $num_items, + import_errors => scalar(@import_errors), + total => $num_valid + scalar(@import_errors), + checked_matches => $checked_matches, + matcher_failed => $matcher_failed, + matcher_code => $matcher_code, + import_batch_id => $batch_id + ); + } +} else { + # initial form + if (C4::Context->preference("marcflavour") eq "UNIMARC") { + $template->param("UNIMARC" => 1); + } + my @matchers = C4::Matcher::GetMatcherList(); + $template->param(available_matchers => \@matchers); } output_html_with_http_headers $input, $cookie, $template->output; +exit 0; + +sub staging_progress_callback { + my $job = shift; + my $dbh = shift; + return sub { + my $progress = shift; + $job->progress($progress); + $dbh->commit(); + } +} + +sub matching_progress_callback { + my $job = shift; + my $dbh = shift; + my $start_progress = $job->progress(); + return sub { + my $progress = shift; + $job->progress($start_progress + $progress); + $dbh->commit(); + } +}