From: Rogan Hamby Date: Fri, 26 Jul 2019 20:22:01 +0000 (-0400) Subject: lp1387722 to modify 005 and leader 05 on record update X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=refs%2Fheads%2Fuser%2Frogan%2Flp1387722_record_status;p=working%2FEvergreen.git lp1387722 to modify 005 and leader 05 on record update --- diff --git a/Open-ILS/src/sql/Pg/010.schema.biblio.sql b/Open-ILS/src/sql/Pg/010.schema.biblio.sql index 857307e499..e83c36cef1 100644 --- a/Open-ILS/src/sql/Pg/010.schema.biblio.sql +++ b/Open-ILS/src/sql/Pg/010.schema.biblio.sql @@ -123,4 +123,45 @@ $$ LANGUAGE PLPGSQL; CREATE TRIGGER norm_sort_label BEFORE INSERT OR UPDATE ON biblio.monograph_part FOR EACH ROW EXECUTE PROCEDURE biblio.normalize_biblio_monograph_part_sortkey(); +CREATE OR REPLACE FUNCTION biblio.set_record_status() RETURNS TRIGGER AS $func$ +use strict; +use MARC::Record; +use MARC::Field; +use MARC::File::XML (BinaryEncoding => 'utf8'); +use Unicode::Normalize; +use POSIX 'strftime'; + +my $old_marc = MARC::Record->new_from_xml($_TD->{new}{marc}); +my $old_leader = $old_marc->leader(); +my $old_status = substr($old_leader,5,1); + +my $status; +if ($_TD->{event} eq 'INSERT') {$status = 'n';} +elsif ($_TD->{event} eq 'UPDATE' && $_TD->{new}{deleted} eq 't') {$status = 'd';} +elsif ($_TD->{event} eq 'UPDATE' && $_TD->{new}{deleted} eq 'f') {$status = 'c';} + +my $marc = MARC::Record->new_from_xml($_TD->{new}{marc}); + +if ($old_status ne $status) { + my $leader = $marc->leader(); + substr($leader,5,1) = $status; + $marc->leader($leader); +} + +my $old_time_field = $marc->field('005'); +my $rightnow = strftime "%Y%m%d%H%M%S.0", localtime; +my $new_time_field = MARC::Field->new('005',$rightnow); +$marc->delete_fields($old_time_field); +$marc->insert_fields_ordered($new_time_field); + +my $marc_xml = $marc->as_xml_record(); +$marc_xml = NFC($marc_xml); +$_TD->{new}{marc} = $marc_xml; + +return "MODIFY"; + +$func$ LANGUAGE PLPERLU; + +CREATE TRIGGER set_record_status BEFORE INSERT OR UPDATE ON biblio.record_entry FOR EACH ROW EXECUTE PROCEDURE biblio.set_record_status(); + COMMIT; diff --git a/Open-ILS/src/sql/Pg/t/lp1387722_record_status.pg b/Open-ILS/src/sql/Pg/t/lp1387722_record_status.pg new file mode 100644 index 0000000000..d88231e2b4 --- /dev/null +++ b/Open-ILS/src/sql/Pg/t/lp1387722_record_status.pg @@ -0,0 +1,39 @@ +BEGIN; + +SELECT plan(4); + +---------------------------------- +-- Setup Test environment and data +---------------------------------- + +-- create bib 70,000 +INSERT into biblio.record_entry (id, marc, last_xact_id) + VALUES (70000, + $$ + 00934|jm a2200241 a 450003-000374519991118131708.0971016n nyuuuu eng 4539Bartók, Béla,1881-1945.Concertos,piano,no. 1,Sz. 83(1926) Concertos,piano,no. 1,Sz. 83,(1926)Piano concerto no. 1 (1926) ; Rhapsody, op. 1 (1904)New York, NY :Vox + $$, + 'PGTAP' + ); + +----------------------------------- +-- Test biblio.set_record_status() +----------------------------------- + +-- initially the status is undefined so now it should be 'n' +SELECT is((SELECT SUBSTR(ARRAY_TO_STRING(oils_xpath('//*[local-name()="leader"]/text()',marc),''),6,1) FROM biblio.record_entry WHERE id = 70000), 'n', 'Record is marked new.'); + +-- check to see if it sets to 'c' correctly upon editing +UPDATE biblio.record_entry SET marc = REPLACE(marc,'piano','dydraulophone') WHERE id = 70000; +SELECT is((SELECT SUBSTR(ARRAY_TO_STRING(oils_xpath('//*[local-name()="leader"]/text()',marc),''),6,1) FROM biblio.record_entry WHERE id = 70000), 'c', 'Record is marked updated.'); + +-- see if the record correctly marks as deleted 'd' +UPDATE biblio.record_entry SET deleted = TRUE WHERE id = 70000; +SELECT is((SELECT SUBSTR(ARRAY_TO_STRING(oils_xpath('//*[local-name()="leader"]/text()',marc),''),6,1) FROM biblio.record_entry WHERE id = 70000), 'd', 'Record is marked deleted.'); + +-- see if the record is correctly set to 'c' when undeleted +UPDATE biblio.record_entry SET deleted = FALSE WHERE id = 70000; +SELECT is((SELECT SUBSTR(ARRAY_TO_STRING(oils_xpath('//*[local-name()="leader"]/text()',marc),''),6,1) FROM biblio.record_entry WHERE id = 70000), 'c', 'Record is marked updated.'); + +SELECT * FROM finish(); + +ROLLBACK; diff --git a/Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_trigger.sql b/Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_trigger.sql new file mode 100644 index 0000000000..93a94c7ef7 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_trigger.sql @@ -0,0 +1,46 @@ +BEGIN; + +SELECT evergreen.upgrade_deps_block_check('xxxx', :eg_version); + +CREATE OR REPLACE FUNCTION biblio.set_record_status() RETURNS TRIGGER AS $func$ +use strict; +use MARC::Record; +use MARC::Field; +use MARC::File::XML (BinaryEncoding => 'utf8'); +use Unicode::Normalize; +use POSIX 'strftime'; + +my $old_marc = MARC::Record->new_from_xml($_TD->{new}{marc}); +my $old_leader = $old_marc->leader(); +my $old_status = substr($old_leader,5,1); + +my $status; +if ($_TD->{event} eq 'INSERT') {$status = 'n';} +elsif ($_TD->{event} eq 'UPDATE' && $_TD->{new}{deleted} eq 't') {$status = 'd';} +elsif ($_TD->{event} eq 'UPDATE' && $_TD->{new}{deleted} eq 'f') {$status = 'c';} + +my $marc = MARC::Record->new_from_xml($_TD->{new}{marc}); + +if ($old_status ne $status) { + my $leader = $marc->leader(); + substr($leader,5,1) = $status; + $marc->leader($leader); +} + +my $old_time_field = $marc->field('005'); +my $rightnow = strftime "%Y%m%d%H%M%S.0", localtime; +my $new_time_field = MARC::Field->new('005',$rightnow); +$marc->delete_fields($old_time_field); +$marc->insert_fields_ordered($new_time_field); + +my $marc_xml = $marc->as_xml_record(); +$marc_xml = NFC($marc_xml); +$_TD->{new}{marc} = $marc_xml; + +return "MODIFY"; + +$func$ LANGUAGE PLPERLU; + +CREATE TRIGGER set_record_status BEFORE INSERT OR UPDATE ON biblio.record_entry FOR EACH ROW EXECUTE PROCEDURE biblio.set_record_status(); + +COMMIT; diff --git a/docs/RELEASE_NOTES_NEXT/Cataloging/bib_status_updated.adoc b/docs/RELEASE_NOTES_NEXT/Cataloging/bib_status_updated.adoc new file mode 100644 index 0000000000..e0f0564202 --- /dev/null +++ b/docs/RELEASE_NOTES_NEXT/Cataloging/bib_status_updated.adoc @@ -0,0 +1,5 @@ +MARC Status Updated on Bib Deletion, Creation and Update +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +There is now a trigger in on the bibliographic record table that +will update the Leader/05 when a new record is inserted, updated or +deleted. A 005 will also be created or updated with a timestamp.