lp1387722 to modify 005 and leader 05 on record update user/rogan/lp1387722_record_status
authorRogan Hamby <rogan.hamby@gmail.com>
Fri, 26 Jul 2019 20:22:01 +0000 (16:22 -0400)
committerRogan Hamby <rogan.hamby@gmail.com>
Fri, 26 Jul 2019 20:22:01 +0000 (16:22 -0400)
Open-ILS/src/sql/Pg/010.schema.biblio.sql
Open-ILS/src/sql/Pg/t/lp1387722_record_status.pg [new file with mode: 0644]
Open-ILS/src/sql/Pg/upgrade/xxxx.schema.set_record_status_trigger.sql [new file with mode: 0644]
docs/RELEASE_NOTES_NEXT/Cataloging/bib_status_updated.adoc [new file with mode: 0644]

index 857307e..e83c36c 100644 (file)
@@ -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 (file)
index 0000000..d88231e
--- /dev/null
@@ -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, 
+  $$
+  <record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd" xmlns="http://www.loc.gov/MARC21/slim"><leader>00934|jm a2200241 a 4500</leader><controlfield tag="001">03-0003745</controlfield><controlfield tag="005">19991118131708.0</controlfield><controlfield tag="008">971016n nyuuuu eng </controlfield><datafield tag="050" ind1=" " ind2=" "><subfield code="a">4539</subfield></datafield><datafield tag="100" ind1="1" ind2=" "><subfield code="a">Bart&#xF3;k, B&#xE9;la,</subfield><subfield code="d">1881-1945.</subfield></datafield><datafield tag="240" ind1=" " ind2=" "><subfield code="t">Concertos,</subfield><subfield code="m">piano,</subfield><subfield code="n">no. 1,</subfield><subfield code="n">Sz. 83</subfield><subfield code="f">(1926) </subfield><subfield code="a">Concertos,</subfield><subfield code="m">piano,</subfield><subfield code="n">no. 1,</subfield><subfield code="n">Sz. 83,</subfield><subfield code="n">(1926)</subfield></datafield><datafield tag="245" ind1=" " ind2=" "><subfield code="a">Piano concerto no. 1 (1926) ; Rhapsody, op. 1 (1904)</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="a">New York, NY :</subfield><subfield code="b">Vox</subfield></datafield></record>
+  $$,
+  '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 (file)
index 0000000..93a94c7
--- /dev/null
@@ -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 (file)
index 0000000..e0f0564
--- /dev/null
@@ -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.