X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FImportBatch.pm;h=63cc60b600c0a9b531f5d7a1f3a7e64d28a3a130;hb=0a9ba9d9dffb7291eb9a8d7cfa24523a8b1bdd1c;hp=f490fb78f15a70055f9d5548107267ec676d4d88;hpb=e37f6a385a07d2b474add5d272827ebb405a6c88;p=koha_gimpoz diff --git a/C4/ImportBatch.pm b/C4/ImportBatch.pm index f490fb78f1..63cc60b600 100644 --- a/C4/ImportBatch.pm +++ b/C4/ImportBatch.pm @@ -13,11 +13,13 @@ package C4::ImportBatch; # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, -# Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. use strict; +use warnings; + use C4::Context; use C4::Koha; use C4::Biblio; @@ -43,6 +45,7 @@ BEGIN { BatchFindBibDuplicates BatchCommitBibRecords BatchRevertBibRecords + CleanBatch GetAllImportBatches GetImportBatchRangeDesc @@ -75,21 +78,13 @@ C4::ImportBatch - manage batches of imported MARC records =head1 SYNOPSIS -=over 4 - use C4::ImportBatch; -=back - =head1 FUNCTIONS =head2 GetZ3950BatchId -=over 4 - -my $batchid = GetZ3950BatchId($z3950server); - -=back + my $batchid = GetZ3950BatchId($z3950server); Retrieves the ID of the import batch for the Z39.50 reservoir for the given target. If necessary, @@ -118,11 +113,7 @@ sub GetZ3950BatchId { =head2 GetImportRecordMarc -=over 4 - -my ($marcblob, $encoding) = GetImportRecordMarc($import_record_id); - -=back + my ($marcblob, $encoding) = GetImportRecordMarc($import_record_id); =cut @@ -134,17 +125,14 @@ sub GetImportRecordMarc { $sth->execute($import_record_id); my ($marc, $encoding) = $sth->fetchrow(); $sth->finish(); - return $marc; + return $marc, $encoding; } =head2 AddImportBatch -=over 4 - -my $batch_id = AddImportBatch($overlay_action, $import_status, $type, $file_name, $comments); - -=back + my $batch_id = AddImportBatch($overlay_action, $import_status, $type, + $file_name, $comments); =cut @@ -165,11 +153,7 @@ sub AddImportBatch { =head2 GetImportBatch -=over 4 - -my $row = GetImportBatch($batch_id); - -=back + my $row = GetImportBatch($batch_id); Retrieve a hashref of an import_batches row. @@ -190,11 +174,8 @@ sub GetImportBatch { =head2 AddBiblioToBatch -=over 4 - -my $import_record_id = AddBiblioToBatch($batch_id, $record_sequence, $marc_record, $encoding, $z3950random, $update_counts); - -=back + my $import_record_id = AddBiblioToBatch($batch_id, $record_sequence, + $marc_record, $encoding, $z3950random, $update_counts); =cut @@ -214,11 +195,7 @@ sub AddBiblioToBatch { =head2 ModBiblioInBatch -=over 4 - -ModBiblioInBatch($import_record_id, $marc_record); - -=back + ModBiblioInBatch($import_record_id, $marc_record); =cut @@ -232,20 +209,16 @@ sub ModBiblioInBatch { =head2 BatchStageMarcRecords -=over 4 - -($batch_id, $num_records, $num_items, @invalid_records) = - BatchStageMarcRecords($marc_flavor, $marc_records, $file_name, + ($batch_id, $num_records, $num_items, @invalid_records) = + BatchStageMarcRecords($encoding, $marc_records, $file_name, $comments, $branch_code, $parse_items, $leave_as_staging, $progress_interval, $progress_callback); -=back - =cut sub BatchStageMarcRecords { - my $marc_flavor = shift; + my $encoding = shift; my $marc_records = shift; my $file_name = shift; my $comments = shift; @@ -285,13 +258,16 @@ sub BatchStageMarcRecords { &$progress_callback($rec_num); } my ($marc_record, $charset_guessed, $char_errors) = - MarcToUTF8Record($marc_blob, C4::Context->preference("marcflavour")); + MarcToUTF8Record($marc_blob, C4::Context->preference("marcflavour"), $encoding); + + $encoding = $charset_guessed unless $encoding; + my $import_record_id; if (scalar($marc_record->fields()) == 0) { push @invalid_records, $marc_blob; } else { $num_valid++; - $import_record_id = AddBiblioToBatch($batch_id, $rec_num, $marc_record, $marc_flavor, int(rand(99999)), 0); + $import_record_id = AddBiblioToBatch($batch_id, $rec_num, $marc_record, $encoding, int(rand(99999)), 0); if ($parse_items) { my @import_items_ids = AddItemsToImportBiblio($batch_id, $import_record_id, $marc_record, 0); $num_items += scalar(@import_items_ids); @@ -308,11 +284,8 @@ sub BatchStageMarcRecords { =head2 AddItemsToImportBiblio -=over 4 - -my @import_items_ids = AddItemsToImportBiblio($batch_id, $import_record_id, $marc_record, $update_counts); - -=back + my @import_items_ids = AddItemsToImportBiblio($batch_id, + $import_record_id, $marc_record, $update_counts); =cut @@ -350,11 +323,8 @@ sub AddItemsToImportBiblio { =head2 BatchFindBibDuplicates -=over 4 - -my $num_with_matches = BatchFindBibDuplicates($batch_id, $matcher, $max_matches, $progress_interval, $progress_callback); - -=back + my $num_with_matches = BatchFindBibDuplicates($batch_id, $matcher, + $max_matches, $progress_interval, $progress_callback); Goes through the records loaded in the batch and attempts to find duplicates for each one. Sets the matching status @@ -421,17 +391,15 @@ sub BatchFindBibDuplicates { =head2 BatchCommitBibRecords -=over 4 - -my ($num_added, $num_updated, $num_items_added, $num_items_errored, $num_ignored) = - BatchCommitBibRecords($batch_id, $progress_interval, $progress_callback); - -=back + my ($num_added, $num_updated, $num_items_added, $num_items_errored, + $num_ignored) = BatchCommitBibRecords($batch_id, $framework, + $progress_interval, $progress_callback); =cut sub BatchCommitBibRecords { my $batch_id = shift; + my $framework = shift; # optional callback to monitor status # of job @@ -487,7 +455,7 @@ sub BatchCommitBibRecords { if ($bib_result eq 'create_new') { $num_added++; - my ($biblionumber, $biblioitemnumber) = AddBiblio($marc_record, ''); + my ($biblionumber, $biblioitemnumber) = AddBiblio($marc_record, $framework); my $sth = $dbh->prepare_cached("UPDATE import_biblios SET matched_biblionumber = ? WHERE import_record_id = ?"); $sth->execute($biblionumber, $rowref->{'import_record_id'}); $sth->finish(); @@ -547,11 +515,8 @@ sub BatchCommitBibRecords { =head2 BatchCommitItems -=over 4 - -($num_items_added, $num_items_errored) = BatchCommitItems($import_record_id, $biblionumber); - -=back + ($num_items_added, $num_items_errored) = + BatchCommitItems($import_record_id, $biblionumber); =cut @@ -598,11 +563,8 @@ sub BatchCommitItems { =head2 BatchRevertBibRecords -=over 4 - -my ($num_deleted, $num_errors, $num_reverted, $num_items_deleted, $num_ignored) = BatchRevertBibRecords($batch_id); - -=back + my ($num_deleted, $num_errors, $num_reverted, $num_items_deleted, + $num_ignored) = BatchRevertBibRecords($batch_id); =cut @@ -654,6 +616,8 @@ sub BatchRevertBibRecords { $num_items_deleted += BatchRevertItems($rowref->{'import_record_id'}, $rowref->{'matched_biblionumber'}); SetImportRecordStatus($rowref->{'import_record_id'}, 'reverted'); } + my $sth2 = $dbh->prepare_cached("UPDATE import_biblios SET matched_biblionumber = NULL WHERE import_record_id = ?"); + $sth2->execute($rowref->{'import_record_id'}); } $sth->finish(); @@ -663,11 +627,7 @@ sub BatchRevertBibRecords { =head2 BatchRevertItems -=over 4 - -my $num_items_deleted = BatchRevertItems($import_record_id, $biblionumber); - -=back + my $num_items_deleted = BatchRevertItems($import_record_id, $biblionumber); =cut @@ -696,13 +656,28 @@ sub BatchRevertItems { return $num_items_deleted; } -=head2 GetAllImportBatches +=head2 CleanBatch -=over 4 + CleanBatch($batch_id) -my $results = GetAllImportBatches(); +Deletes all staged records from the import batch +and sets the status of the batch to 'cleaned'. Note +that deleting a stage record does *not* affect +any record that has been committed to the database. -=back +=cut + +sub CleanBatch { + my $batch_id = shift; + return unless defined $batch_id; + + C4::Context->dbh->do('DELETE FROM import_records WHERE import_batch_id = ?', {}, $batch_id); + SetImportBatchStatus($batch_id, 'cleaned'); +} + +=head2 GetAllImportBatches + + my $results = GetAllImportBatches(); Returns a references to an array of hash references corresponding to all import_batches rows (of batch_type 'batch'), sorted in @@ -727,11 +702,7 @@ sub GetAllImportBatches { =head2 GetImportBatchRangeDesc -=over 4 - -my $results = GetImportBatchRangeDesc($offset, $results_per_group); - -=back + my $results = GetImportBatchRangeDesc($offset, $results_per_group); Returns a reference to an array of hash references corresponding to import_batches rows (sorted in descending order by import_batch_id) @@ -743,32 +714,35 @@ sub GetImportBatchRangeDesc { my ($offset, $results_per_group) = @_; my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare_cached("SELECT * FROM import_batches + my $query = "SELECT * FROM import_batches WHERE batch_type = 'batch' - ORDER BY import_batch_id DESC - LIMIT ? OFFSET ?"); - $sth->bind_param(1, $results_per_group); - $sth->bind_param(2, $offset); - - my $results = []; - $sth->execute(); - while (my $row = $sth->fetchrow_hashref) { - push @$results, $row; + ORDER BY import_batch_id DESC"; + my @params; + if ($results_per_group){ + $query .= " LIMIT ?"; + push(@params, $results_per_group); + } + if ($offset){ + $query .= " OFFSET ?"; + push(@params, $offset); } + my $sth = $dbh->prepare_cached($query); + $sth->execute(@params); + my $results = $sth->fetchall_arrayref({}); $sth->finish(); return $results; } =head2 GetItemNumbersFromImportBatch -=over 4 -=back + my @itemsnos = GetItemNumbersFromImportBatch($batch_id); + =cut sub GetItemNumbersFromImportBatch { my ($batch_id) = @_; my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("select itemnumber from import_batches,import_records,import_items where import_batches.import_batch_id=import_records.import_batch_id and import_records.import_record_id=import_items.import_record_id and import_batches.import_batch_id=?"); + my $sth = $dbh->prepare("SELECT itemnumber FROM import_batches,import_records,import_items WHERE import_batches.import_batch_id=import_records.import_batch_id AND import_records.import_record_id=import_items.import_record_id AND import_batches.import_batch_id=?"); $sth->execute($batch_id); my @items ; while ( my ($itm) = $sth->fetchrow_array ) { @@ -779,11 +753,7 @@ sub GetItemNumbersFromImportBatch { =head2 GetNumberOfImportBatches -=over 4 - -my $count = GetNumberOfImportBatches(); - -=back + my $count = GetNumberOfImportBatches(); =cut @@ -798,11 +768,7 @@ sub GetNumberOfNonZ3950ImportBatches { =head2 GetImportBibliosRange -=over 4 - -my $results = GetImportBibliosRange($batch_id, $offset, $results_per_group); - -=back + my $results = GetImportBibliosRange($batch_id, $offset, $results_per_group); Returns a reference to an array of hash references corresponding to import_biblios/import_records rows for a given batch @@ -811,23 +777,33 @@ starting at the given offset. =cut sub GetImportBibliosRange { - my ($batch_id, $offset, $results_per_group) = @_; + my ($batch_id, $offset, $results_per_group, $status) = @_; my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare_cached("SELECT title, author, isbn, issn, import_record_id, record_sequence, - status, overlay_status + my $query = "SELECT title, author, isbn, issn, import_record_id, record_sequence, + status, overlay_status, matched_biblionumber FROM import_records JOIN import_biblios USING (import_record_id) - WHERE import_batch_id = ? - ORDER BY import_record_id LIMIT ? OFFSET ?"); - $sth->bind_param(1, $batch_id); - $sth->bind_param(2, $results_per_group); - $sth->bind_param(3, $offset); - my $results = []; - $sth->execute(); - while (my $row = $sth->fetchrow_hashref) { - push @$results, $row; + WHERE import_batch_id = ?"; + my @params; + push(@params, $batch_id); + if ($status) { + $query .= " AND status=?"; + push(@params,$status); + } + $query.=" ORDER BY import_record_id"; + + if($results_per_group){ + $query .= " LIMIT ?"; + push(@params, $results_per_group); + } + if($offset){ + $query .= " OFFSET ?"; + push(@params, $offset); } + my $sth = $dbh->prepare_cached($query); + $sth->execute(@params); + my $results = $sth->fetchall_arrayref({}); $sth->finish(); return $results; @@ -835,11 +811,7 @@ sub GetImportBibliosRange { =head2 GetBestRecordMatch -=over 4 - -my $record_id = GetBestRecordMatch($import_record_id); - -=back + my $record_id = GetBestRecordMatch($import_record_id); =cut @@ -859,11 +831,7 @@ sub GetBestRecordMatch { =head2 GetImportBatchStatus -=over 4 - -my $status = GetImportBatchStatus($batch_id); - -=back + my $status = GetImportBatchStatus($batch_id); =cut @@ -871,22 +839,17 @@ sub GetImportBatchStatus { my ($batch_id) = @_; my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("SELECT import_status FROM import_batches WHERE batch_id = ?"); + my $sth = $dbh->prepare("SELECT import_status FROM import_batches WHERE import_batch_id = ?"); $sth->execute($batch_id); my ($status) = $sth->fetchrow_array(); $sth->finish(); - return; + return $status; } - =head2 SetImportBatchStatus -=over 4 - -SetImportBatchStatus($batch_id, $new_status); - -=back + SetImportBatchStatus($batch_id, $new_status); =cut @@ -902,11 +865,7 @@ sub SetImportBatchStatus { =head2 GetImportBatchOverlayAction -=over 4 - -my $overlay_action = GetImportBatchOverlayAction($batch_id); - -=back + my $overlay_action = GetImportBatchOverlayAction($batch_id); =cut @@ -925,11 +884,7 @@ sub GetImportBatchOverlayAction { =head2 SetImportBatchOverlayAction -=over 4 - -SetImportBatchOverlayAction($batch_id, $new_overlay_action); - -=back + SetImportBatchOverlayAction($batch_id, $new_overlay_action); =cut @@ -945,11 +900,7 @@ sub SetImportBatchOverlayAction { =head2 GetImportBatchNoMatchAction -=over 4 - -my $nomatch_action = GetImportBatchNoMatchAction($batch_id); - -=back + my $nomatch_action = GetImportBatchNoMatchAction($batch_id); =cut @@ -968,11 +919,7 @@ sub GetImportBatchNoMatchAction { =head2 SetImportBatchNoMatchAction -=over 4 - -SetImportBatchNoMatchAction($batch_id, $new_nomatch_action); - -=back + SetImportBatchNoMatchAction($batch_id, $new_nomatch_action); =cut @@ -988,11 +935,7 @@ sub SetImportBatchNoMatchAction { =head2 GetImportBatchItemAction -=over 4 - -my $item_action = GetImportBatchItemAction($batch_id); - -=back + my $item_action = GetImportBatchItemAction($batch_id); =cut @@ -1011,11 +954,7 @@ sub GetImportBatchItemAction { =head2 SetImportBatchItemAction -=over 4 - -SetImportBatchItemAction($batch_id, $new_item_action); - -=back + SetImportBatchItemAction($batch_id, $new_item_action); =cut @@ -1031,11 +970,7 @@ sub SetImportBatchItemAction { =head2 GetImportBatchMatcher -=over 4 - -my $matcher_id = GetImportBatchMatcher($batch_id); - -=back + my $matcher_id = GetImportBatchMatcher($batch_id); =cut @@ -1054,11 +989,7 @@ sub GetImportBatchMatcher { =head2 SetImportBatchMatcher -=over 4 - -SetImportBatchMatcher($batch_id, $new_matcher_id); - -=back + SetImportBatchMatcher($batch_id, $new_matcher_id); =cut @@ -1074,11 +1005,7 @@ sub SetImportBatchMatcher { =head2 GetImportRecordOverlayStatus -=over 4 - -my $overlay_status = GetImportRecordOverlayStatus($import_record_id); - -=back + my $overlay_status = GetImportRecordOverlayStatus($import_record_id); =cut @@ -1097,11 +1024,7 @@ sub GetImportRecordOverlayStatus { =head2 SetImportRecordOverlayStatus -=over 4 - -SetImportRecordOverlayStatus($import_record_id, $new_overlay_status); - -=back + SetImportRecordOverlayStatus($import_record_id, $new_overlay_status); =cut @@ -1117,11 +1040,7 @@ sub SetImportRecordOverlayStatus { =head2 GetImportRecordStatus -=over 4 - -my $overlay_status = GetImportRecordStatus($import_record_id); - -=back + my $overlay_status = GetImportRecordStatus($import_record_id); =cut @@ -1140,11 +1059,7 @@ sub GetImportRecordStatus { =head2 SetImportRecordStatus -=over 4 - -SetImportRecordStatus($import_record_id, $new_overlay_status); - -=back + SetImportRecordStatus($import_record_id, $new_overlay_status); =cut @@ -1160,11 +1075,7 @@ sub SetImportRecordStatus { =head2 GetImportRecordMatches -=over 4 - -my $results = GetImportRecordMatches($import_record_id, $best_only); - -=back + my $results = GetImportRecordMatches($import_record_id, $best_only); =cut @@ -1196,11 +1107,7 @@ sub GetImportRecordMatches { =head2 SetImportRecordMatches -=over 4 - -SetImportRecordMatches($import_record_id, @matches); - -=back + SetImportRecordMatches($import_record_id, @matches); =cut @@ -1243,7 +1150,7 @@ sub _update_import_record_marc { my $dbh = C4::Context->dbh; my $sth = $dbh->prepare("UPDATE import_records SET marc = ?, marcxml = ? WHERE import_record_id = ?"); - $sth->execute($marc_record->as_usmarc(), $marc_record->as_xml(), $import_record_id); + $sth->execute($marc_record->as_usmarc(), $marc_record->as_xml(C4::Context->preference('marcflavour')), $import_record_id); $sth->finish(); } @@ -1253,10 +1160,7 @@ sub _add_biblio_fields { my ($title, $author, $isbn, $issn) = _parse_biblio_fields($marc_record); my $dbh = C4::Context->dbh; # FIXME no controlnumber, originalsource - # FIXME 2 - should regularize normalization of ISBN wherever it is done - $isbn =~ s/\(.*$//; - $isbn =~ tr/ -_//; - $isbn = uc $isbn; + $isbn = C4::Koha::_isbn_cleanup($isbn); # FIXME C4::Koha::_isbn_cleanup should be made public my $sth = $dbh->prepare("INSERT INTO import_biblios (import_record_id, title, author, isbn, issn) VALUES (?, ?, ?, ?, ?)"); $sth->execute($import_record_id, $title, $author, $isbn, $issn); $sth->finish(); @@ -1359,7 +1263,7 @@ __END__ =head1 AUTHOR -Koha Development Team +Koha Development Team Galen Charlton