View | Details | Raw Unified | Return to bug 35104
Collapse All | Expand All

(-)a/C4/Biblio.pm (-2 / +23 lines)
Lines 298-303 sub AddBiblio { Link Here
298
                    {
298
                    {
299
                        skip_record_index => 1,
299
                        skip_record_index => 1,
300
                        record_source_id  => $options->{record_source_id},
300
                        record_source_id  => $options->{record_source_id},
301
                        ( ref $options->{warnings} eq 'ARRAY' ? ( warnings => $options->{warnings} ) : () ),
301
                    }
302
                    }
302
                );
303
                );
303
304
Lines 394-400 sub ModBiblio { Link Here
394
              ( exists $options->{record_source_id} )
395
              ( exists $options->{record_source_id} )
395
            ? ( record_source_id => $options->{record_source_id} )
396
            ? ( record_source_id => $options->{record_source_id} )
396
            : ()
397
            : ()
397
        )
398
        ),
399
        (
400
              ( ref $options->{warnings} eq 'ARRAY' )
401
            ? ( warnings => $options->{warnings} )
402
            : ()
403
        ),
398
    };
404
    };
399
405
400
    if ( !$record ) {
406
    if ( !$record ) {
Lines 2344-2350 sub TransformHtmlToMarc { Link Here
2344
                    if ( $fval ne '' && $newfield ) {
2350
                    if ( $fval ne '' && $newfield ) {
2345
                        $newfield->add_subfields( $fkey => $fval );
2351
                        $newfield->add_subfields( $fkey => $fval );
2346
                    } elsif ( $fval ne '' ) {
2352
                    } elsif ( $fval ne '' ) {
2347
                        $fval     = StripNonXmlChars($fval);   #Strip out any non-XML characters like control characters
2348
                        $newfield = MARC::Field->new( $tag, $ind1, $ind2, $fkey => $fval );
2353
                        $newfield = MARC::Field->new( $tag, $ind1, $ind2, $fkey => $fval );
2349
                    }
2354
                    }
2350
                    $j += 2;
2355
                    $j += 2;
Lines 2998-3003 sub ModBiblioMarc { Link Here
2998
        }
3003
        }
2999
    )->store;
3004
    )->store;
3000
3005
3006
    if ( ref $options->{warnings} eq 'ARRAY' ) {
3007
        my ($nonxml_msg) = grep { $_->message eq 'nonxml_stripped' } @{ $m_rs->object_messages };
3008
        if ($nonxml_msg) {
3009
            my @occurrences = @{ $nonxml_msg->payload // [] };
3010
            my $message     = @occurrences
3011
                ? sprintf(
3012
                "%s: invalid char value %d (U+%04X) at position %d\n%s",
3013
                $occurrences[0]{field},    $occurrences[0]{char_ord},
3014
                $occurrences[0]{char_ord}, $occurrences[0]{position},
3015
                $occurrences[0]{snippet}
3016
                )
3017
                : 'non-XML characters stripped';
3018
            push @{ $options->{warnings} }, { type => 'nonxml_stripped', message => $message };
3019
        }
3020
    }
3021
3001
    unless ($skip_record_index) {
3022
    unless ($skip_record_index) {
3002
        my $indexer = Koha::SearchEngine::Indexer->new( { index => $Koha::SearchEngine::BIBLIOS_INDEX } );
3023
        my $indexer = Koha::SearchEngine::Indexer->new( { index => $Koha::SearchEngine::BIBLIOS_INDEX } );
3003
        $indexer->index_records( $biblionumber, "specialUpdate", "biblioserver" );
3024
        $indexer->index_records( $biblionumber, "specialUpdate", "biblioserver" );
(-)a/Koha/Biblio/Metadata.pm (-34 / +24 lines)
Lines 64-70 I<Koha::Exceptions::Metadata::Invalid> exception is thrown. Link Here
64
sub store {
64
sub store {
65
    my $self = shift;
65
    my $self = shift;
66
66
67
    my $nonxml_error_message;
67
    # Reset messages so object_messages reflects only this store call
68
    $self->{_messages} = [];
69
70
    my $nonxml_chars;    # arrayref of bad-char occurrences when stripping was needed
68
71
69
    # Check marcxml will roundtrip
72
    # Check marcxml will roundtrip
70
    if ( $self->format eq 'marcxml' ) {
73
    if ( $self->format eq 'marcxml' ) {
Lines 87-96 sub store { Link Here
87
            if ($stripped_marcxml) {
90
            if ($stripped_marcxml) {
88
91
89
                # Stripping fixed it – enumerate every bad character for the error log
92
                # Stripping fixed it – enumerate every bad character for the error log
90
                my @nonxml_chars  = _find_nonxml_chars( $self->metadata );
93
                my @found         = _find_nonxml_chars( $self->metadata );
91
                my $field_context = do {
94
                my $field_context = do {
92
                    my %seen;
95
                    my %seen;
93
                    join( ', ', grep { !$seen{$_}++ } map { $_->{field} } @nonxml_chars )
96
                    join( ', ', grep { !$seen{$_}++ } map { $_->{field} } @found )
94
                        || 'unknown location';
97
                        || 'unknown location';
95
                };
98
                };
96
99
Lines 101-107 sub store { Link Here
101
                    )
104
                    )
102
                );
105
                );
103
                $self->metadata($stripped_metadata);
106
                $self->metadata($stripped_metadata);
104
                $nonxml_error_message = \@nonxml_chars || $marcxml_error;
107
                $nonxml_chars = \@found;
105
            } else {
108
            } else {
106
109
107
                # Truly unrecoverable
110
                # Truly unrecoverable
Lines 119-136 sub store { Link Here
119
122
120
    $self->SUPER::store;
123
    $self->SUPER::store;
121
124
122
    # If this save triggered fresh stripping, add to any existing nonxml_stripped
125
    # If this save triggered fresh stripping, record each bad character as a DB error
123
    # errors with the new set.  If the save was clean (no stripping needed), leave
126
    # row and signal the event via object_messages.  If the save was clean (no stripping
124
    # any existing errors alone – they are review flags requiring explicit human
127
    # needed), leave any existing DB error rows alone – they are review flags requiring
125
    # resolution and should not be silently cleared by a routine re-save.
128
    # explicit human resolution and should not be silently cleared by a routine re-save.
126
    if ($nonxml_error_message) {
129
    if ($nonxml_chars) {
127
        my @occurrences =
130
        if (@$nonxml_chars) {
128
            ref $nonxml_error_message eq 'ARRAY'
131
            for my $occ (@$nonxml_chars) {
129
            ? @{$nonxml_error_message}
130
            : ();
131
132
        if (@occurrences) {
133
            for my $occ (@occurrences) {
134
                Koha::Biblio::Metadata::Error->new(
132
                Koha::Biblio::Metadata::Error->new(
135
                    {
133
                    {
136
                        metadata_id => $self->id,
134
                        metadata_id => $self->id,
Lines 145-180 sub store { Link Here
145
            }
143
            }
146
        } else {
144
        } else {
147
145
148
            # Fallback: couldn't pinpoint individual chars – store the parser error
146
            # Fallback: couldn't pinpoint individual chars – store a generic message
149
            Koha::Biblio::Metadata::Error->new(
147
            Koha::Biblio::Metadata::Error->new(
150
                {
148
                {
151
                    metadata_id => $self->id,
149
                    metadata_id => $self->id,
152
                    error_type  => 'nonxml_stripped',
150
                    error_type  => 'nonxml_stripped',
153
                    message     => $nonxml_error_message,
151
                    message     => 'non-XML characters stripped (details unavailable)',
154
                }
152
                }
155
            )->store;
153
            )->store;
156
        }
154
        }
157
    }
158
155
159
    $self->{_stripped_on_last_store} = $nonxml_error_message ? 1 : 0;
156
        $self->add_message(
157
            {
158
                message => 'nonxml_stripped',
159
                type    => 'warning',
160
                payload => $nonxml_chars,
161
            }
162
        );
163
    }
160
164
161
    return $self;
165
    return $self;
162
}
166
}
163
167
164
=head3 stripped_on_last_store
165
166
    if ( $metadata->stripped_on_last_store ) { ... }
167
168
Returns true if the most recent call to C<store> triggered non-XML character
169
stripping.  Returns false (including before C<store> has ever been called).
170
171
=cut
172
173
sub stripped_on_last_store {
174
    my $self = shift;
175
    return $self->{_stripped_on_last_store} // 0;
176
}
177
178
=head3 metadata_errors
168
=head3 metadata_errors
179
169
180
    my $errors = $metadata->metadata_errors;
170
    my $errors = $metadata->metadata_errors;
(-)a/Koha/Import/Record.pm (-1 / +5 lines)
Lines 20-25 use Modern::Perl; Link Here
20
use Carp;
20
use Carp;
21
use MARC::Record;
21
use MARC::Record;
22
22
23
use C4::Charset qw( StripNonXmlChars );
23
use C4::Context;
24
use C4::Context;
24
use C4::Biblio          qw(ModBiblio);
25
use C4::Biblio          qw(ModBiblio);
25
use C4::AuthoritiesMarc qw(GuessAuthTypeCode ModAuthority);
26
use C4::AuthoritiesMarc qw(GuessAuthTypeCode ModAuthority);
Lines 56-62 sub get_marc_record { Link Here
56
        $format = 'UNIMARCAUTH';
57
        $format = 'UNIMARCAUTH';
57
    }
58
    }
58
59
59
    my $record = MARC::Record->new_from_xml( $self->marcxml, 'UTF-8', $format );
60
    my $record = eval { MARC::Record->new_from_xml( $self->marcxml, 'UTF-8', $format ) };
61
    unless ($record) {
62
        $record = eval { MARC::Record->new_from_xml( StripNonXmlChars( $self->marcxml ), 'UTF-8', $format ) };
63
    }
60
64
61
    return $record;
65
    return $record;
62
}
66
}
(-)a/cataloguing/addbiblio.pl (-30 / +63 lines)
Lines 703-710 if ( $op eq "cud-addbiblio" ) { Link Here
703
    # it is not a duplicate (determined either by Koha itself or by user checking it's not a duplicate)
703
    # it is not a duplicate (determined either by Koha itself or by user checking it's not a duplicate)
704
    if ( !$duplicatebiblionumber or $confirm_not_duplicate ) {
704
    if ( !$duplicatebiblionumber or $confirm_not_duplicate ) {
705
        my $oldbibitemnum;
705
        my $oldbibitemnum;
706
        my @save_warnings;
706
        my $encode_error = try {
707
        my $encode_error = try {
707
            if ( $is_a_modif ) {
708
            if ($is_a_modif) {
708
                ModBiblio(
709
                ModBiblio(
709
                    $record,
710
                    $record,
710
                    $biblionumber,
711
                    $biblionumber,
Lines 714-724 if ( $op eq "cud-addbiblio" ) { Link Here
714
                            source       => $z3950 ? 'z3950' : 'intranet',
715
                            source       => $z3950 ? 'z3950' : 'intranet',
715
                            categorycode => $logged_in_patron->categorycode,
716
                            categorycode => $logged_in_patron->categorycode,
716
                            userid       => $logged_in_patron->userid,
717
                            userid       => $logged_in_patron->userid,
717
                        }
718
                        },
719
                        warnings => \@save_warnings,
718
                    }
720
                    }
719
                );
721
                );
720
            } else {
722
            } else {
721
                ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode );
723
                ( $biblionumber, $oldbibitemnum ) =
724
                    AddBiblio( $record, $frameworkcode, { warnings => \@save_warnings } );
722
            }
725
            }
723
            return 0;
726
            return 0;
724
        } catch {
727
        } catch {
Lines 730-770 if ( $op eq "cud-addbiblio" ) { Link Here
730
            }
733
            }
731
            return 1;
734
            return 1;
732
        };
735
        };
733
        if (!$encode_error && ($redirect eq "items" || ($mode ne "popup" && !$is_a_modif && $redirect ne "view" && $redirect ne "just_save"))){
736
734
            if ($frameworkcode eq 'FA'){
737
        my ($nonxml_stripped) = grep { $_->{type} eq 'nonxml_stripped' } @save_warnings;
735
            print $input->redirect(
738
        if ( $nonxml_stripped && !$encode_error ) {
736
                '/cgi-bin/koha/cataloguing/additem.pl?'
739
            $record = Koha::Biblios->find($biblionumber)->metadata->record;
737
                .'biblionumber='.$biblionumber
740
            build_tabs( $template, $record, $dbh, $encoding, $input );
738
                .'&frameworkcode='.$frameworkcode
741
            $template->param(
739
                .'&circborrowernumber='.$fa_circborrowernumber
742
                biblionumber    => $biblionumber,
740
                .'&branch='.$fa_branch
743
                popup           => $mode,
741
                .'&barcode='.uri_escape_utf8($fa_barcode)
744
                frameworkcode   => $frameworkcode,
742
                .'&stickyduedate='.$fa_stickyduedate
745
                itemtype        => $frameworkcode,
743
                .'&duedatespec='.$fa_duedatespec
746
                borrowernumber  => $loggedinuser,
747
                tab             => scalar $input->param('tab'),
748
                NONXML_STRIPPED => $nonxml_stripped->{message},
744
            );
749
            );
750
            output_html_with_http_headers $input, $cookie, $template->output;
745
            exit;
751
            exit;
746
            }
752
        }
747
            else {
753
        if (
748
            print $input->redirect(
754
            !$encode_error
755
            && ( $redirect eq "items"
756
                || ( $mode ne "popup" && !$is_a_modif && $redirect ne "view" && $redirect ne "just_save" ) )
757
            )
758
        {
759
            if ( $frameworkcode eq 'FA' ) {
760
                print $input->redirect( '/cgi-bin/koha/cataloguing/additem.pl?'
761
                        . 'biblionumber='
762
                        . $biblionumber
763
                        . '&frameworkcode='
764
                        . $frameworkcode
765
                        . '&circborrowernumber='
766
                        . $fa_circborrowernumber
767
                        . '&branch='
768
                        . $fa_branch
769
                        . '&barcode='
770
                        . uri_escape_utf8($fa_barcode)
771
                        . '&stickyduedate='
772
                        . $fa_stickyduedate
773
                        . '&duedatespec='
774
                        . $fa_duedatespec );
775
                exit;
776
            } else {
777
                print $input->redirect(
749
                    "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid"
778
                    "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid"
750
            );
779
                );
751
            exit;
780
                exit;
752
            }
781
            }
753
        } elsif(!$encode_error && (($is_a_modif || $redirect eq "view") && $redirect ne "just_save")){
782
        } elsif ( !$encode_error && ( ( $is_a_modif || $redirect eq "view" ) && $redirect ne "just_save" ) ) {
754
            my $defaultview = C4::Context->preference('IntranetBiblioDefaultView');
783
            my $defaultview = C4::Context->preference('IntranetBiblioDefaultView');
755
            my $views = { C4::Search::enabled_staff_search_views };
784
            my $views       = {C4::Search::enabled_staff_search_views};
756
            if ($defaultview eq 'isbd' && $views->{can_view_ISBD}) {
785
            if ( $defaultview eq 'isbd' && $views->{can_view_ISBD} ) {
757
                print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber&searchid=$searchid");
786
                print $input->redirect(
758
            } elsif  ($defaultview eq 'marc' && $views->{can_view_MARC}) {
787
                    "/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber&searchid=$searchid");
759
                print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid");
788
            } elsif ( $defaultview eq 'marc' && $views->{can_view_MARC} ) {
760
            } elsif  ($defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC}) {
789
                print $input->redirect(
761
                print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber&searchid=$searchid");
790
                    "/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid"
791
                );
792
            } elsif ( $defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC} ) {
793
                print $input->redirect(
794
                    "/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber&searchid=$searchid");
762
            } else {
795
            } else {
763
                print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber&searchid=$searchid");
796
                print $input->redirect(
797
                    "/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber&searchid=$searchid");
764
            }
798
            }
765
            exit;
799
            exit;
766
        }
800
        } elsif ( !$encode_error && ( $redirect eq "just_save" ) ) {
767
        elsif ( !$encode_error && ( $redirect eq "just_save" ) ) {
768
            my $tab = $input->param('current_tab');
801
            my $tab = $input->param('current_tab');
769
            print $input->redirect(
802
            print $input->redirect(
770
                "/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=$biblionumber&framework=$frameworkcode&tab=$tab&searchid=$searchid"
803
                "/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=$biblionumber&framework=$frameworkcode&tab=$tab&searchid=$searchid"
(-)a/cataloguing/merge.pl (-2 / +6 lines)
Lines 92-99 if ( $op eq 'cud-merge' ) { Link Here
92
92
93
    # Modifying the reference record
93
    # Modifying the reference record
94
    my $invalid_metadata;
94
    my $invalid_metadata;
95
    my @merge_warnings;
95
    my $modded = try {
96
    my $modded = try {
96
        ModBiblio($record, $ref_biblionumber, $frameworkcode);
97
        ModBiblio( $record, $ref_biblionumber, $frameworkcode, { warnings => \@merge_warnings } );
97
        return 1;
98
        return 1;
98
    } catch {
99
    } catch {
99
        my $exception = $_;
100
        my $exception = $_;
Lines 105-110 if ( $op eq 'cud-merge' ) { Link Here
105
        return 0;
106
        return 0;
106
    };
107
    };
107
108
109
    my ($nonxml_stripped) = grep { $_->{type} eq 'nonxml_stripped' } @merge_warnings;
110
108
    my $report_header = {};
111
    my $report_header = {};
109
    if ($modded) {
112
    if ($modded) {
110
        foreach my $biblionumber ( $ref_biblionumber, @biblionumbers ) {
113
        foreach my $biblionumber ( $ref_biblionumber, @biblionumbers ) {
Lines 159-165 if ( $op eq 'cud-merge' ) { Link Here
159
        result           => 1,
162
        result           => 1,
160
        report_records   => \@report_records,
163
        report_records   => \@report_records,
161
        report_header    => $report_header,
164
        report_header    => $report_header,
162
        ref_biblionumber => scalar $input->param('ref_biblionumber')
165
        ref_biblionumber => scalar $input->param('ref_biblionumber'),
166
        ( $nonxml_stripped ? ( NONXML_STRIPPED => $nonxml_stripped->{message} ) : () ),
163
    );
167
    );
164
168
165
    #-------------------------
169
    #-------------------------
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt (+12 lines)
Lines 805-810 Link Here
805
            <pre class="problem">[% INVALID_METADATA | html %]</pre>
805
            <pre class="problem">[% INVALID_METADATA | html %]</pre>
806
        </div>
806
        </div>
807
    [% END %]
807
    [% END %]
808
    [% IF ( NONXML_STRIPPED ) %]
809
        <div class="alert alert-warning">
810
            <h1>Record saved with modifications</h1>
811
            <p
812
                ><strong
813
                    >Non-XML characters were automatically stripped from this record before saving. The record has been saved successfully, but please review it to ensure the data is correct. If data appears to be missing or incorrect, edit
814
                    and re-save the record.</strong
815
                ></p
816
            >
817
            <pre class="problem">[% NONXML_STRIPPED | html %]</pre>
818
        </div>
819
    [% END %]
808
820
809
    [% IF marc21_fixlen %]
821
    [% IF marc21_fixlen %]
810
        <div class="alert alert-warning"><h1>WARNING</h1><p>The following fixed-length control field(s) have an invalid length: [% marc21_fixlen.failed.join(',') | html %]. Please fix.</p></div>
822
        <div class="alert alert-warning"><h1>WARNING</h1><p>The following fixed-length control field(s) have an invalid length: [% marc21_fixlen.failed.join(',') | html %]. Please fix.</p></div>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/merge.tt (-1 / +10 lines)
Lines 62-68 Link Here
62
                    [% IF error.code == 'CANNOT_MOVE' %]
62
                    [% IF error.code == 'CANNOT_MOVE' %]
63
                        The following items could not be moved from the old record to the new one: [% error.value | html %]
63
                        The following items could not be moved from the old record to the new one: [% error.value | html %]
64
                    [% ELSIF error.code == 'INVALID_METADATA' %]
64
                    [% ELSIF error.code == 'INVALID_METADATA' %]
65
                        <p>This record had encoding issues, non-xml characters have been stripped in order to allow editing. Please be cautious when saving that some data may have been removed from the record.</p>
65
                        <p>The merged record could not be saved because it contains characters that are not valid XML. The merge has been aborted.</p>
66
                        <pre class="problem">[% error.value | html %]</pre>
66
                        <pre class="problem">[% error.value | html %]</pre>
67
                    [% ELSE %]
67
                    [% ELSE %]
68
                        [% error | html %]
68
                        [% error | html %]
Lines 73-78 Link Here
73
            [% END %]
73
            [% END %]
74
        [% ELSE %]
74
        [% ELSE %]
75
            <div class="alert alert-info">The merge was successful. <a href="/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=[% ref_biblionumber | uri %]">View the merged record.</a></div>
75
            <div class="alert alert-info">The merge was successful. <a href="/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=[% ref_biblionumber | uri %]">View the merged record.</a></div>
76
            [% IF NONXML_STRIPPED %]
77
                <div class="alert alert-warning">
78
                    <strong
79
                        >Non-XML characters were automatically stripped from the merged record before saving. Please <a href="/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=[% ref_biblionumber | uri %]">review the record</a> to ensure
80
                        the data is correct.</strong
81
                    >
82
                    <pre class="problem">[% NONXML_STRIPPED | html %]</pre>
83
                </div>
84
            [% END %]
76
            <div class="page-section">
85
            <div class="page-section">
77
                <h3>Report</h3>
86
                <h3>Report</h3>
78
                <table>
87
                <table>
(-)a/misc/migration_tools/bulkmarcimport.pl (-1 / +16 lines)
Lines 565-570 RECORD: while () { Link Here
565
                }
565
                }
566
566
567
                # Create biblio, unless we already have it (either match or ISBN)
567
                # Create biblio, unless we already have it (either match or ISBN)
568
                my @import_warnings;
569
                $mod_biblio_options->{warnings} = \@import_warnings;
570
                $add_biblio_options->{warnings} = \@import_warnings;
568
                if ($matched_record_id) {
571
                if ($matched_record_id) {
569
                    eval { $biblioitemnumber = Koha::Biblios->find($matched_record_id)->biblioitem->biblioitemnumber; };
572
                    eval { $biblioitemnumber = Koha::Biblios->find($matched_record_id)->biblioitem->biblioitemnumber; };
570
                    if ($update) {
573
                    if ($update) {
Lines 625-630 RECORD: while () { Link Here
625
                    ) if ($logfile);
628
                    ) if ($logfile);
626
                    next RECORD;
629
                    next RECORD;
627
                }
630
                }
631
                for my $w ( grep { $_->{type} eq 'nonxml_stripped' } @import_warnings ) {
632
                    warn sprintf(
633
                        "WARNING: Non-XML characters stripped from biblio %s: %s",
634
                        $record_id // $originalid, $w->{message}
635
                    );
636
                    printlog(
637
                        {
638
                            id     => $record_id // $originalid,
639
                            op     => "import",
640
                            status => "warning : non-XML characters stripped"
641
                        }
642
                    ) if ($logfile);
643
                }
628
                my $record_has_added_items = 0;
644
                my $record_has_added_items = 0;
629
                if ($record_id) {
645
                if ($record_id) {
630
                    $yamlhash->{$originalid} = $record_id if $yamlfile;
646
                    $yamlhash->{$originalid} = $record_id if $yamlfile;
631
- 

Return to bug 35104