# 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;
@ISA = qw(Exporter);
@EXPORT = qw(
GetZ3950BatchId
+ GetWebserviceBatchId
GetImportRecordMarc
+ GetImportRecordMarcXML
AddImportBatch
GetImportBatch
AddBiblioToBatch
+ AddItemsToImportBiblio
ModBiblioInBatch
BatchStageMarcRecords
CleanBatch
GetAllImportBatches
+ GetStagedWebserviceBatches
GetImportBatchRangeDesc
GetNumberOfNonZ3950ImportBatches
GetImportBibliosRange
=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,
if (defined $rowref) {
return $rowref->[0];
} else {
- my $batch_id = AddImportBatch('create_new', 'staged', 'z3950', $z3950server, '');
+ my $batch_id = AddImportBatch( {
+ overlay_action => 'create_new',
+ import_status => 'staged',
+ batch_type => 'z3950',
+ file_name => $z3950server,
+ } );
return $batch_id;
}
}
-=head2 GetImportRecordMarc
+=head2 GetWebserviceBatchId
+
+ my $batchid = GetWebserviceBatchId();
-=over 4
+Retrieves the ID of the import batch for webservice.
+If necessary, creates the import batch.
+
+=cut
+
+my $WEBSERVICE_BASE_QRY = <<EOQ;
+SELECT import_batch_id FROM import_batches
+WHERE batch_type = 'webservice'
+AND import_status = 'staged'
+EOQ
+sub GetWebserviceBatchId {
+ my ($params) = @_;
+
+ my $dbh = C4::Context->dbh;
+ my $sql = $WEBSERVICE_BASE_QRY;
+ my @args;
+ foreach my $field (qw(matcher_id overlay_action nomatch_action item_action)) {
+ if (my $val = $params->{$field}) {
+ $sql .= " AND $field = ?";
+ push @args, $val;
+ }
+ }
+ my $id = $dbh->selectrow_array($sql, undef, @args);
+ return $id if $id;
+
+ $params->{batch_type} = 'webservice';
+ $params->{import_status} = 'staged';
+ return AddImportBatch($params);
+}
-my ($marcblob, $encoding) = GetImportRecordMarc($import_record_id);
+=head2 GetImportRecordMarc
-=back
+ my ($marcblob, $encoding) = GetImportRecordMarc($import_record_id);
=cut
}
-=head2 AddImportBatch
-
-=over 4
-
-my $batch_id = AddImportBatch($overlay_action, $import_status, $type, $file_name, $comments);
+=head2 GetImportRecordMarcXML
-=back
+ my $marcxml = GetImportRecordMarcXML($import_record_id);
=cut
-sub AddImportBatch {
- my ($overlay_action, $import_status, $type, $file_name, $comments) = @_;
+sub GetImportRecordMarcXML {
+ my ($import_record_id) = @_;
my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("INSERT INTO import_batches (overlay_action, import_status, batch_type,
- file_name, comments)
- VALUES (?, ?, ?, ?, ?)");
- $sth->execute($overlay_action, $import_status, $type, $file_name, $comments);
- my $batch_id = $dbh->{'mysql_insertid'};
+ my $sth = $dbh->prepare("SELECT marcxml FROM import_records WHERE import_record_id = ?");
+ $sth->execute($import_record_id);
+ my ($marcxml) = $sth->fetchrow();
$sth->finish();
-
- return $batch_id;
+ return $marcxml;
}
-=head2 GetImportBatch
+=head2 AddImportBatch
-=over 4
+ my $batch_id = AddImportBatch($params_hash);
-my $row = GetImportBatch($batch_id);
+=cut
-=back
+sub AddImportBatch {
+ my ($params) = @_;
+
+ my (@fields, @vals);
+ foreach (qw( matcher_id template_id branchcode
+ overlay_action nomatch_action item_action
+ import_status batch_type file_name comments )) {
+ if (exists $params->{$_}) {
+ push @fields, $_;
+ push @vals, $params->{$_};
+ }
+ }
+ my $dbh = C4::Context->dbh;
+ $dbh->do("INSERT INTO import_batches (".join( ',', @fields).")
+ VALUES (".join( ',', map '?', @fields).")",
+ undef,
+ @vals);
+ return $dbh->{'mysql_insertid'};
+}
+
+=head2 GetImportBatch
+
+ my $row = GetImportBatch($batch_id);
Retrieve a hashref of an import_batches row.
=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
=head2 ModBiblioInBatch
-=over 4
-
-ModBiblioInBatch($import_record_id, $marc_record);
-
-=back
+ ModBiblioInBatch($import_record_id, $marc_record);
=cut
=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;
$progress_interval = 0 unless 'CODE' eq ref $progress_callback;
}
- my $batch_id = AddImportBatch('create_new', 'staging', 'batch', $file_name, $comments);
+ my $batch_id = AddImportBatch( {
+ overlay_action => 'create_new',
+ import_status => 'staging',
+ batch_type => 'batch',
+ file_name => $file_name,
+ comments => $comments,
+ } );
if ($parse_items) {
SetImportBatchItemAction($batch_id, 'always_add');
} else {
&$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);
=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
=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
=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
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();
=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
=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
=head2 BatchRevertItems
-=over 4
-
-my $num_items_deleted = BatchRevertItems($import_record_id, $biblionumber);
-
-=back
+ my $num_items_deleted = BatchRevertItems($import_record_id, $biblionumber);
=cut
=head2 CleanBatch
-=over 4
-
-CleanBatch($batch_id)
-
-=back
+ CleanBatch($batch_id)
Deletes all staged records from the import batch
and sets the status of the batch to 'cleaned'. Note
=head2 GetAllImportBatches
-=over 4
-
-my $results = 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
sub GetAllImportBatches {
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare_cached("SELECT * FROM import_batches
- WHERE batch_type = 'batch'
+ WHERE batch_type IN ('batch', 'webservice')
ORDER BY import_batch_id ASC");
my $results = [];
return $results;
}
-=head2 GetImportBatchRangeDesc
+=head2 GetStagedWebserviceBatches
+
+ my $batch_ids = GetStagedWebserviceBatches();
+
+Returns a references to an array of batch id's
+of batch_type 'webservice' that are not imported
+
+=cut
-=over 4
+my $PENDING_WEBSERVICE_BATCHES_QRY = <<EOQ;
+SELECT import_batch_id FROM import_batches
+WHERE batch_type = 'webservice'
+AND import_status = 'staged'
+EOQ
+sub GetStagedWebserviceBatches {
+ my $dbh = C4::Context->dbh;
+ return $dbh->selectcol_arrayref($PENDING_WEBSERVICE_BATCHES_QRY);
+}
-my $results = GetImportBatchRangeDesc($offset, $results_per_group);
+=head2 GetImportBatchRangeDesc
-=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)
my $dbh = C4::Context->dbh;
my $query = "SELECT * FROM import_batches
- WHERE batch_type = 'batch'
+ WHERE batch_type IN ('batch', 'webservice')
ORDER BY import_batch_id DESC";
my @params;
+ if ($results_per_group){
+ $query .= " LIMIT ?";
+ push(@params, $results_per_group);
+ }
if ($offset){
- if ($results_per_group){
- $query .= " LIMIT ?";
- push(@params, $results_per_group);
- }
$query .= " OFFSET ?";
push(@params, $offset);
}
=head2 GetItemNumbersFromImportBatch
+ my @itemsnos = GetItemNumbersFromImportBatch($batch_id);
+
=cut
sub GetItemNumbersFromImportBatch {
=head2 GetNumberOfImportBatches
-=over 4
-
-my $count = GetNumberOfImportBatches();
-
-=back
+ my $count = GetNumberOfImportBatches();
=cut
sub GetNumberOfNonZ3950ImportBatches {
my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("SELECT COUNT(*) FROM import_batches WHERE batch_type='batch'");
+ my $sth = $dbh->prepare("SELECT COUNT(*) FROM import_batches WHERE batch_type != 'z3950'");
$sth->execute();
my ($count) = $sth->fetchrow_array();
$sth->finish();
=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
my $dbh = C4::Context->dbh;
my $query = "SELECT title, author, isbn, issn, import_record_id, record_sequence,
- status, overlay_status
+ status, overlay_status, matched_biblionumber
FROM import_records
JOIN import_biblios USING (import_record_id)
WHERE import_batch_id = ?";
}
$query.=" ORDER BY import_record_id";
+ if($results_per_group){
+ $query .= " LIMIT ?";
+ push(@params, $results_per_group);
+ }
if($offset){
- if($results_per_group){
- $query .= " LIMIT ?";
- push(@params, $results_per_group);
- }
$query .= " OFFSET ?";
push(@params, $offset);
}
=head2 GetBestRecordMatch
-=over 4
-
-my $record_id = GetBestRecordMatch($import_record_id);
-
-=back
+ my $record_id = GetBestRecordMatch($import_record_id);
=cut
=head2 GetImportBatchStatus
-=over 4
-
-my $status = GetImportBatchStatus($batch_id);
-
-=back
+ my $status = GetImportBatchStatus($batch_id);
=cut
=head2 SetImportBatchStatus
-=over 4
-
-SetImportBatchStatus($batch_id, $new_status);
-
-=back
+ SetImportBatchStatus($batch_id, $new_status);
=cut
=head2 GetImportBatchOverlayAction
-=over 4
-
-my $overlay_action = GetImportBatchOverlayAction($batch_id);
-
-=back
+ my $overlay_action = GetImportBatchOverlayAction($batch_id);
=cut
=head2 SetImportBatchOverlayAction
-=over 4
-
-SetImportBatchOverlayAction($batch_id, $new_overlay_action);
-
-=back
+ SetImportBatchOverlayAction($batch_id, $new_overlay_action);
=cut
=head2 GetImportBatchNoMatchAction
-=over 4
-
-my $nomatch_action = GetImportBatchNoMatchAction($batch_id);
-
-=back
+ my $nomatch_action = GetImportBatchNoMatchAction($batch_id);
=cut
=head2 SetImportBatchNoMatchAction
-=over 4
-
-SetImportBatchNoMatchAction($batch_id, $new_nomatch_action);
-
-=back
+ SetImportBatchNoMatchAction($batch_id, $new_nomatch_action);
=cut
=head2 GetImportBatchItemAction
-=over 4
-
-my $item_action = GetImportBatchItemAction($batch_id);
-
-=back
+ my $item_action = GetImportBatchItemAction($batch_id);
=cut
=head2 SetImportBatchItemAction
-=over 4
-
-SetImportBatchItemAction($batch_id, $new_item_action);
-
-=back
+ SetImportBatchItemAction($batch_id, $new_item_action);
=cut
=head2 GetImportBatchMatcher
-=over 4
-
-my $matcher_id = GetImportBatchMatcher($batch_id);
-
-=back
+ my $matcher_id = GetImportBatchMatcher($batch_id);
=cut
=head2 SetImportBatchMatcher
-=over 4
-
-SetImportBatchMatcher($batch_id, $new_matcher_id);
-
-=back
+ SetImportBatchMatcher($batch_id, $new_matcher_id);
=cut
=head2 GetImportRecordOverlayStatus
-=over 4
-
-my $overlay_status = GetImportRecordOverlayStatus($import_record_id);
-
-=back
+ my $overlay_status = GetImportRecordOverlayStatus($import_record_id);
=cut
=head2 SetImportRecordOverlayStatus
-=over 4
-
-SetImportRecordOverlayStatus($import_record_id, $new_overlay_status);
-
-=back
+ SetImportRecordOverlayStatus($import_record_id, $new_overlay_status);
=cut
=head2 GetImportRecordStatus
-=over 4
-
-my $overlay_status = GetImportRecordStatus($import_record_id);
-
-=back
+ my $overlay_status = GetImportRecordStatus($import_record_id);
=cut
=head2 SetImportRecordStatus
-=over 4
-
-SetImportRecordStatus($import_record_id, $new_overlay_status);
-
-=back
+ SetImportRecordStatus($import_record_id, $new_overlay_status);
=cut
=head2 GetImportRecordMatches
-=over 4
-
-my $results = GetImportRecordMatches($import_record_id, $best_only);
-
-=back
+ my $results = GetImportRecordMatches($import_record_id, $best_only);
=cut
=head2 SetImportRecordMatches
-=over 4
-
-SetImportRecordMatches($import_record_id, @matches);
-
-=back
+ SetImportRecordMatches($import_record_id, @matches);
=cut
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();
}
my ($batch_id) = @_;
my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare_cached("UPDATE import_batches SET num_biblios = (
- SELECT COUNT(*)
- FROM import_records
- WHERE import_batch_id = import_batches.import_batch_id
- AND record_type = 'biblio')
+ my $sth = $dbh->prepare_cached("UPDATE import_batches SET
+ num_biblios = (
+ SELECT COUNT(*)
+ FROM import_records
+ WHERE import_batch_id = import_batches.import_batch_id
+ AND record_type = 'biblio'),
+ num_items = (
+ SELECT COUNT(*)
+ FROM import_records
+ JOIN import_items USING (import_record_id)
+ WHERE import_batch_id = import_batches.import_batch_id
+ AND record_type = 'biblio')
WHERE import_batch_id = ?");
$sth->bind_param(1, $batch_id);
$sth->execute();
$sth->finish();
- $sth = $dbh->prepare_cached("UPDATE import_batches SET num_items = (
- SELECT COUNT(*)
- FROM import_records
- JOIN import_items USING (import_record_id)
- WHERE import_batch_id = import_batches.import_batch_id
- AND record_type = 'biblio')
- WHERE import_batch_id = ?");
- $sth->bind_param(1, $batch_id);
- $sth->execute();
- $sth->finish();
-
}
sub _get_commit_action {
=head1 AUTHOR
-Koha Development Team <info@koha.org>
+Koha Development Team <http://koha-community.org/>
Galen Charlton <galen.charlton@liblime.com>