]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0846.function.vand-add_field.sql
LP#1117808: release notes for New Access points for MARC Overlay
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0846.function.vand-add_field.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('0846', :eg_version);
4
5 CREATE OR REPLACE FUNCTION vandelay.add_field ( target_xml TEXT, source_xml TEXT, field TEXT, force_add INT ) RETURNS TEXT AS $_$
6
7     use MARC::Record;
8     use MARC::File::XML (BinaryEncoding => 'UTF-8');
9     use MARC::Charset;
10     use strict;
11
12     MARC::Charset->assume_unicode(1);
13
14     my $target_xml = shift;
15     my $source_xml = shift;
16     my $field_spec = shift;
17     my $force_add = shift || 0;
18
19     my $target_r = MARC::Record->new_from_xml( $target_xml );
20     my $source_r = MARC::Record->new_from_xml( $source_xml );
21
22     return $target_xml unless ($target_r && $source_r);
23
24     my @field_list = split(',', $field_spec);
25
26     my %fields;
27     for my $f (@field_list) {
28         $f =~ s/^\s*//; $f =~ s/\s*$//;
29         if ($f =~ /^(.{3})(\w*)(?:\[([^]]*)\])?$/) {
30             my $field = $1;
31             $field =~ s/\s+//;
32             my $sf = $2;
33             $sf =~ s/\s+//;
34             my $match = $3;
35             $match =~ s/^\s*//; $match =~ s/\s*$//;
36             $fields{$field} = { sf => [ split('', $sf) ] };
37             if ($match) {
38                 my ($msf,$mre) = split('~', $match);
39                 if (length($msf) > 0 and length($mre) > 0) {
40                     $msf =~ s/^\s*//; $msf =~ s/\s*$//;
41                     $mre =~ s/^\s*//; $mre =~ s/\s*$//;
42                     $fields{$field}{match} = { sf => $msf, re => qr/$mre/ };
43                 }
44             }
45         }
46     }
47
48     for my $f ( keys %fields) {
49         if ( @{$fields{$f}{sf}} ) {
50             for my $from_field ($source_r->field( $f )) {
51                 my @tos = $target_r->field( $f );
52                 if (!@tos) {
53                     next if (exists($fields{$f}{match}) and !$force_add);
54                     my @new_fields = map { $_->clone } $source_r->field( $f );
55                     $target_r->insert_fields_ordered( @new_fields );
56                 } else {
57                     for my $to_field (@tos) {
58                         if (exists($fields{$f}{match})) {
59                             next unless (grep { $_ =~ $fields{$f}{match}{re} } $to_field->subfield($fields{$f}{match}{sf}));
60                         }
61                         for my $old_sf ($from_field->subfields) {
62                             $to_field->add_subfields( @$old_sf ) if grep(/$$old_sf[0]/,@{$fields{$f}{sf}});
63                         }
64                     }
65                 }
66             }
67         } else {
68             my @new_fields = map { $_->clone } $source_r->field( $f );
69             $target_r->insert_fields_ordered( @new_fields );
70         }
71     }
72
73     $target_xml = $target_r->as_xml_record;
74     $target_xml =~ s/^<\?.+?\?>$//mo;
75     $target_xml =~ s/\n//sgo;
76     $target_xml =~ s/>\s+</></sgo;
77
78     return $target_xml;
79
80 $_$ LANGUAGE PLPERLU;
81
82 COMMIT;
83