use Memoize because Memcache::Memoize is slow for me
[koha.git] / C4 / ImportBatch.pm
index a8bd2cb..b6db406 100644 (file)
@@ -13,9 +13,9 @@ 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;
@@ -45,6 +45,7 @@ BEGIN {
     BatchFindBibDuplicates
     BatchCommitBibRecords
     BatchRevertBibRecords
+    CleanBatch
 
     GetAllImportBatches
     GetImportBatchRangeDesc
@@ -77,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,
@@ -120,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
 
@@ -136,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
 
@@ -167,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.
 
@@ -192,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
 
@@ -216,11 +195,7 @@ sub AddBiblioToBatch {
 
 =head2 ModBiblioInBatch
 
-=over 4
-
-ModBiblioInBatch($import_record_id, $marc_record);
-
-=back
+  ModBiblioInBatch($import_record_id, $marc_record);
 
 =cut
 
@@ -234,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;
@@ -287,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);
@@ -310,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
 
@@ -352,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 
@@ -423,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
@@ -489,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();
@@ -549,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
 
@@ -600,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
 
@@ -667,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
 
@@ -700,13 +656,28 @@ sub BatchRevertItems {
     return $num_items_deleted;
 }
 
-=head2 GetAllImportBatches
+=head2 CleanBatch
+
+  CleanBatch($batch_id)
+
+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.
+
+=cut
 
-=over 4
+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');
+}
 
-my $results = GetAllImportBatches();
+=head2 GetAllImportBatches
 
-=back
+  my $results = GetAllImportBatches();
 
 Returns a references to an array of hash references corresponding
 to all import_batches rows (of batch_type 'batch'), sorted in 
@@ -731,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)
@@ -747,30 +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
 
+  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 ) {
@@ -781,11 +753,7 @@ sub GetItemNumbersFromImportBatch {
 
 =head2 GetNumberOfImportBatches 
 
-=over 4
-
-my $count = GetNumberOfImportBatches();
-
-=back
+  my $count = GetNumberOfImportBatches();
 
 =cut
 
@@ -800,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
@@ -813,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,
-                                           matched_biblionumber, 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;
 
@@ -837,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
 
@@ -861,11 +831,7 @@ sub GetBestRecordMatch {
 
 =head2 GetImportBatchStatus
 
-=over 4
-
-my $status = GetImportBatchStatus($batch_id);
-
-=back
+  my $status = GetImportBatchStatus($batch_id);
 
 =cut
 
@@ -883,11 +849,7 @@ sub GetImportBatchStatus {
 
 =head2 SetImportBatchStatus
 
-=over 4
-
-SetImportBatchStatus($batch_id, $new_status);
-
-=back
+  SetImportBatchStatus($batch_id, $new_status);
 
 =cut
 
@@ -903,11 +865,7 @@ sub SetImportBatchStatus {
 
 =head2 GetImportBatchOverlayAction
 
-=over 4
-
-my $overlay_action = GetImportBatchOverlayAction($batch_id);
-
-=back
+  my $overlay_action = GetImportBatchOverlayAction($batch_id);
 
 =cut
 
@@ -926,11 +884,7 @@ sub GetImportBatchOverlayAction {
 
 =head2 SetImportBatchOverlayAction
 
-=over 4
-
-SetImportBatchOverlayAction($batch_id, $new_overlay_action);
-
-=back
+  SetImportBatchOverlayAction($batch_id, $new_overlay_action);
 
 =cut
 
@@ -946,11 +900,7 @@ sub SetImportBatchOverlayAction {
 
 =head2 GetImportBatchNoMatchAction
 
-=over 4
-
-my $nomatch_action = GetImportBatchNoMatchAction($batch_id);
-
-=back
+  my $nomatch_action = GetImportBatchNoMatchAction($batch_id);
 
 =cut
 
@@ -969,11 +919,7 @@ sub GetImportBatchNoMatchAction {
 
 =head2 SetImportBatchNoMatchAction
 
-=over 4
-
-SetImportBatchNoMatchAction($batch_id, $new_nomatch_action);
-
-=back
+  SetImportBatchNoMatchAction($batch_id, $new_nomatch_action);
 
 =cut
 
@@ -989,11 +935,7 @@ sub SetImportBatchNoMatchAction {
 
 =head2 GetImportBatchItemAction
 
-=over 4
-
-my $item_action = GetImportBatchItemAction($batch_id);
-
-=back
+  my $item_action = GetImportBatchItemAction($batch_id);
 
 =cut
 
@@ -1012,11 +954,7 @@ sub GetImportBatchItemAction {
 
 =head2 SetImportBatchItemAction
 
-=over 4
-
-SetImportBatchItemAction($batch_id, $new_item_action);
-
-=back
+  SetImportBatchItemAction($batch_id, $new_item_action);
 
 =cut
 
@@ -1032,11 +970,7 @@ sub SetImportBatchItemAction {
 
 =head2 GetImportBatchMatcher
 
-=over 4
-
-my $matcher_id = GetImportBatchMatcher($batch_id);
-
-=back
+  my $matcher_id = GetImportBatchMatcher($batch_id);
 
 =cut
 
@@ -1055,11 +989,7 @@ sub GetImportBatchMatcher {
 
 =head2 SetImportBatchMatcher
 
-=over 4
-
-SetImportBatchMatcher($batch_id, $new_matcher_id);
-
-=back
+  SetImportBatchMatcher($batch_id, $new_matcher_id);
 
 =cut
 
@@ -1075,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
 
@@ -1098,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
 
@@ -1118,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
 
@@ -1141,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
 
@@ -1161,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
 
@@ -1197,11 +1107,7 @@ sub GetImportRecordMatches {
 
 =head2 SetImportRecordMatches
 
-=over 4
-
-SetImportRecordMatches($import_record_id, @matches);
-
-=back
+  SetImportRecordMatches($import_record_id, @matches);
 
 =cut
 
@@ -1357,7 +1263,7 @@ __END__
 
 =head1 AUTHOR
 
-Koha Development Team <info@koha.org>
+Koha Development Team <http://koha-community.org/>
 
 Galen Charlton <galen.charlton@liblime.com>