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