From: Mike Rylander Date: Tue, 9 Aug 2016 18:55:30 +0000 (-0400) Subject: Stamping upgrade for bib_source-in-901 X-Git-Tag: sprint4-merge-nov22~193 X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=5317ba59cace4fd62365fc084addac6a3315fcd0;p=working%2FEvergreen.git Stamping upgrade for bib_source-in-901 Signed-off-by: Mike Rylander --- diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql index 963eb2251d..0e8b5a2e79 100644 --- a/Open-ILS/src/sql/Pg/002.schema.config.sql +++ b/Open-ILS/src/sql/Pg/002.schema.config.sql @@ -91,7 +91,7 @@ CREATE TRIGGER no_overlapping_deps BEFORE INSERT OR UPDATE ON config.db_patch_dependencies FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates'); -INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0987', :eg_version); -- jboyer/miker +INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0988', :eg_version); -- gmcharlt/miker CREATE TABLE config.bib_source ( id SERIAL PRIMARY KEY, diff --git a/Open-ILS/src/sql/Pg/upgrade/0988.schema.bib_source_in_901.sql b/Open-ILS/src/sql/Pg/upgrade/0988.schema.bib_source_in_901.sql new file mode 100644 index 0000000000..ca5f379cf6 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/0988.schema.bib_source_in_901.sql @@ -0,0 +1,122 @@ +BEGIN; + +SELECT evergreen.upgrade_deps_block_check('0988', :eg_version); + +CREATE OR REPLACE FUNCTION evergreen.maintain_901 () RETURNS TRIGGER AS $func$ +use strict; +use MARC::Record; +use MARC::File::XML (BinaryEncoding => 'UTF-8'); +use MARC::Charset; +use Encode; +use Unicode::Normalize; + +MARC::Charset->assume_unicode(1); + +my $schema = $_TD->{table_schema}; +my $marc = MARC::Record->new_from_xml($_TD->{new}{marc}); + +my @old901s = $marc->field('901'); +$marc->delete_fields(@old901s); + +if ($schema eq 'biblio') { + my $tcn_value = $_TD->{new}{tcn_value}; + + # Set TCN value to record ID? + my $id_as_tcn = spi_exec_query(" + SELECT enabled + FROM config.global_flag + WHERE name = 'cat.bib.use_id_for_tcn' + "); + if (($id_as_tcn->{processed}) && $id_as_tcn->{rows}[0]->{enabled} eq 't') { + $tcn_value = $_TD->{new}{id}; + $_TD->{new}{tcn_value} = $tcn_value; + } + + my $new_901 = MARC::Field->new("901", " ", " ", + "a" => $tcn_value, + "b" => $_TD->{new}{tcn_source}, + "c" => $_TD->{new}{id}, + "t" => $schema + ); + + if ($_TD->{new}{owner}) { + $new_901->add_subfields("o" => $_TD->{new}{owner}); + } + + if ($_TD->{new}{share_depth}) { + $new_901->add_subfields("d" => $_TD->{new}{share_depth}); + } + + if ($_TD->{new}{source}) { + my $plan = spi_prepare(' + SELECT source + FROM config.bib_source + WHERE id = $1 + ', 'INTEGER'); + my $source_name = + spi_exec_prepared($plan, {limit => 1}, $_TD->{new}{source})->{rows}[0]{source}; + spi_freeplan($plan); + $new_901->add_subfields("s" => $source_name) if $source_name; + } + + $marc->append_fields($new_901); +} elsif ($schema eq 'authority') { + my $new_901 = MARC::Field->new("901", " ", " ", + "c" => $_TD->{new}{id}, + "t" => $schema, + ); + $marc->append_fields($new_901); +} elsif ($schema eq 'serial') { + my $new_901 = MARC::Field->new("901", " ", " ", + "c" => $_TD->{new}{id}, + "t" => $schema, + "o" => $_TD->{new}{owning_lib}, + ); + + if ($_TD->{new}{record}) { + $new_901->add_subfields("r" => $_TD->{new}{record}); + } + + $marc->append_fields($new_901); +} else { + my $new_901 = MARC::Field->new("901", " ", " ", + "c" => $_TD->{new}{id}, + "t" => $schema, + ); + $marc->append_fields($new_901); +} + +my $xml = $marc->as_xml_record(); +$xml =~ s/\n//sgo; +$xml =~ s/^<\?xml.+\?\s*>//go; +$xml =~ s/>\s+entityize() +# to avoid having to set PERL5LIB for PostgreSQL as well + +$xml = NFC($xml); + +# Convert raw ampersands to entities +$xml =~ s/&(?!\S+;)/&/gso; + +# Convert Unicode characters to entities +$xml =~ s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe; + +$xml =~ s/[\x00-\x1f]//go; +$_TD->{new}{marc} = $xml; + +return "MODIFY"; +$func$ LANGUAGE PLPERLU; + +COMMIT; + +\qecho Now running an update to set the 901$s for bibliographic +\qecho records that have a source set. This may take a while. +\qecho +\qecho The update can be cancelled now \qecho and run later +\qecho using the following SQL statement: +\qecho +\qecho UPDATE biblio.record_entry SET id = id WHERE source IS NOT NULL; +\qecho +UPDATE biblio.record_entry SET id = id WHERE source IS NOT NULL; diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql deleted file mode 100644 index 9644936bca..0000000000 --- a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql +++ /dev/null @@ -1,122 +0,0 @@ -BEGIN; - --- SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version); - -CREATE OR REPLACE FUNCTION evergreen.maintain_901 () RETURNS TRIGGER AS $func$ -use strict; -use MARC::Record; -use MARC::File::XML (BinaryEncoding => 'UTF-8'); -use MARC::Charset; -use Encode; -use Unicode::Normalize; - -MARC::Charset->assume_unicode(1); - -my $schema = $_TD->{table_schema}; -my $marc = MARC::Record->new_from_xml($_TD->{new}{marc}); - -my @old901s = $marc->field('901'); -$marc->delete_fields(@old901s); - -if ($schema eq 'biblio') { - my $tcn_value = $_TD->{new}{tcn_value}; - - # Set TCN value to record ID? - my $id_as_tcn = spi_exec_query(" - SELECT enabled - FROM config.global_flag - WHERE name = 'cat.bib.use_id_for_tcn' - "); - if (($id_as_tcn->{processed}) && $id_as_tcn->{rows}[0]->{enabled} eq 't') { - $tcn_value = $_TD->{new}{id}; - $_TD->{new}{tcn_value} = $tcn_value; - } - - my $new_901 = MARC::Field->new("901", " ", " ", - "a" => $tcn_value, - "b" => $_TD->{new}{tcn_source}, - "c" => $_TD->{new}{id}, - "t" => $schema - ); - - if ($_TD->{new}{owner}) { - $new_901->add_subfields("o" => $_TD->{new}{owner}); - } - - if ($_TD->{new}{share_depth}) { - $new_901->add_subfields("d" => $_TD->{new}{share_depth}); - } - - if ($_TD->{new}{source}) { - my $plan = spi_prepare(' - SELECT source - FROM config.bib_source - WHERE id = $1 - ', 'INTEGER'); - my $source_name = - spi_exec_prepared($plan, {limit => 1}, $_TD->{new}{source})->{rows}[0]{source}; - spi_freeplan($plan); - $new_901->add_subfields("s" => $source_name) if $source_name; - } - - $marc->append_fields($new_901); -} elsif ($schema eq 'authority') { - my $new_901 = MARC::Field->new("901", " ", " ", - "c" => $_TD->{new}{id}, - "t" => $schema, - ); - $marc->append_fields($new_901); -} elsif ($schema eq 'serial') { - my $new_901 = MARC::Field->new("901", " ", " ", - "c" => $_TD->{new}{id}, - "t" => $schema, - "o" => $_TD->{new}{owning_lib}, - ); - - if ($_TD->{new}{record}) { - $new_901->add_subfields("r" => $_TD->{new}{record}); - } - - $marc->append_fields($new_901); -} else { - my $new_901 = MARC::Field->new("901", " ", " ", - "c" => $_TD->{new}{id}, - "t" => $schema, - ); - $marc->append_fields($new_901); -} - -my $xml = $marc->as_xml_record(); -$xml =~ s/\n//sgo; -$xml =~ s/^<\?xml.+\?\s*>//go; -$xml =~ s/>\s+entityize() -# to avoid having to set PERL5LIB for PostgreSQL as well - -$xml = NFC($xml); - -# Convert raw ampersands to entities -$xml =~ s/&(?!\S+;)/&/gso; - -# Convert Unicode characters to entities -$xml =~ s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe; - -$xml =~ s/[\x00-\x1f]//go; -$_TD->{new}{marc} = $xml; - -return "MODIFY"; -$func$ LANGUAGE PLPERLU; - -COMMIT; - -\qecho Now running an update to set the 901$s for bibliographic -\qecho records that have a source set. This may take a while. -\qecho -\qecho The update can be cancelled now \qecho and run later -\qecho using the following SQL statement: -\qecho -\qecho UPDATE biblio.record_entry SET id = id WHERE source IS NOT NULL; -\qecho -UPDATE biblio.record_entry SET id = id WHERE source IS NOT NULL;