From: Galen Charlton Date: Fri, 12 Aug 2016 18:15:29 +0000 (-0400) Subject: LP#1587639: stamp schema upgrade X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=dffd94b2e673c87faae1e5e49153d0f05bf35d6f;p=evergreen%2Ftadl.git LP#1587639: stamp schema upgrade Signed-off-by: Galen Charlton --- diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql index 0e8b5a2e79..3c897abbdd 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 ('0988', :eg_version); -- gmcharlt/miker +INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0989', :eg_version); -- berick/miker/gmcharlt CREATE TABLE config.bib_source ( id SERIAL PRIMARY KEY, diff --git a/Open-ILS/src/sql/Pg/upgrade/0989.schema.authority-vandeley-edit-date.sql b/Open-ILS/src/sql/Pg/upgrade/0989.schema.authority-vandeley-edit-date.sql new file mode 100644 index 0000000000..fe2118120f --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/0989.schema.authority-vandeley-edit-date.sql @@ -0,0 +1,124 @@ +BEGIN; + +SELECT evergreen.upgrade_deps_block_check('0989', :eg_version); -- berick/miker/gmcharlt + +CREATE OR REPLACE FUNCTION vandelay.overlay_authority_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$ +DECLARE + merge_profile vandelay.merge_profile%ROWTYPE; + dyn_profile vandelay.compile_profile%ROWTYPE; + editor_string TEXT; + new_editor INT; + new_edit_date TIMESTAMPTZ; + source_marc TEXT; + target_marc TEXT; + eg_marc_row authority.record_entry%ROWTYPE; + eg_marc TEXT; + v_marc TEXT; + replace_rule TEXT; + match_count INT; + update_query TEXT; +BEGIN + + SELECT * INTO eg_marc_row + FROM authority.record_entry b + JOIN vandelay.authority_match m ON (m.eg_record = b.id AND m.queued_record = import_id) + LIMIT 1; + + SELECT q.marc INTO v_marc + FROM vandelay.queued_record q + JOIN vandelay.authority_match m ON (m.queued_record = q.id AND q.id = import_id) + LIMIT 1; + + eg_marc := eg_marc_row.marc; + + IF eg_marc IS NULL OR v_marc IS NULL THEN + -- RAISE NOTICE 'no marc for vandelay or authority record'; + RETURN FALSE; + END IF; + + -- Extract the editor string before any modification to the vandelay + -- MARC occur. + editor_string := + (oils_xpath('//*[@tag="905"]/*[@code="u"]/text()',v_marc))[1]; + + -- If an editor value can be found, update the authority record + -- editor and edit_date values. + IF editor_string IS NOT NULL AND editor_string <> '' THEN + + -- Vandelay.pm sets the value to 'usrname' when needed. + SELECT id INTO new_editor + FROM actor.usr WHERE usrname = editor_string; + + IF new_editor IS NULL THEN + SELECT usr INTO new_editor + FROM actor.card WHERE barcode = editor_string; + END IF; + + IF new_editor IS NOT NULL THEN + new_edit_date := NOW(); + ELSE -- No valid editor, use current values + new_editor = eg_marc_row.editor; + new_edit_date = eg_marc_row.edit_date; + END IF; + ELSE + new_editor = eg_marc_row.editor; + new_edit_date = eg_marc_row.edit_date; + END IF; + + dyn_profile := vandelay.compile_profile( v_marc ); + + IF merge_profile_id IS NOT NULL THEN + SELECT * INTO merge_profile FROM vandelay.merge_profile WHERE id = merge_profile_id; + IF FOUND THEN + dyn_profile.add_rule := BTRIM( dyn_profile.add_rule || ',' || COALESCE(merge_profile.add_spec,''), ','); + dyn_profile.strip_rule := BTRIM( dyn_profile.strip_rule || ',' || COALESCE(merge_profile.strip_spec,''), ','); + dyn_profile.replace_rule := BTRIM( dyn_profile.replace_rule || ',' || COALESCE(merge_profile.replace_spec,''), ','); + dyn_profile.preserve_rule := BTRIM( dyn_profile.preserve_rule || ',' || COALESCE(merge_profile.preserve_spec,''), ','); + END IF; + END IF; + + IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN + -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule; + RETURN FALSE; + END IF; + + IF dyn_profile.replace_rule = '' AND dyn_profile.preserve_rule = '' AND dyn_profile.add_rule = '' AND dyn_profile.strip_rule = '' THEN + --Since we have nothing to do, just return a NOOP "we did it" + RETURN TRUE; + ELSIF dyn_profile.replace_rule <> '' THEN + source_marc = v_marc; + target_marc = eg_marc; + replace_rule = dyn_profile.replace_rule; + ELSE + source_marc = eg_marc; + target_marc = v_marc; + replace_rule = dyn_profile.preserve_rule; + END IF; + + UPDATE authority.record_entry + SET marc = vandelay.merge_record_xml( target_marc, source_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule ), + editor = new_editor, + edit_date = new_edit_date + WHERE id = eg_id; + + IF NOT FOUND THEN + -- Import/merge failed. Nothing left to do. + RETURN FALSE; + END IF; + + -- Authority record successfully merged / imported. + + -- Update the vandelay record to show the successful import. + UPDATE vandelay.queued_authority_record + SET imported_as = eg_id, + import_time = NOW() + WHERE id = import_id; + + RETURN TRUE; + +END; +$$ LANGUAGE PLPGSQL; + + +COMMIT; + diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql deleted file mode 100644 index 968a5202bb..0000000000 --- a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql +++ /dev/null @@ -1,124 +0,0 @@ -BEGIN; - --- SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version); - -CREATE OR REPLACE FUNCTION vandelay.overlay_authority_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$ -DECLARE - merge_profile vandelay.merge_profile%ROWTYPE; - dyn_profile vandelay.compile_profile%ROWTYPE; - editor_string TEXT; - new_editor INT; - new_edit_date TIMESTAMPTZ; - source_marc TEXT; - target_marc TEXT; - eg_marc_row authority.record_entry%ROWTYPE; - eg_marc TEXT; - v_marc TEXT; - replace_rule TEXT; - match_count INT; - update_query TEXT; -BEGIN - - SELECT * INTO eg_marc_row - FROM authority.record_entry b - JOIN vandelay.authority_match m ON (m.eg_record = b.id AND m.queued_record = import_id) - LIMIT 1; - - SELECT q.marc INTO v_marc - FROM vandelay.queued_record q - JOIN vandelay.authority_match m ON (m.queued_record = q.id AND q.id = import_id) - LIMIT 1; - - eg_marc := eg_marc_row.marc; - - IF eg_marc IS NULL OR v_marc IS NULL THEN - -- RAISE NOTICE 'no marc for vandelay or authority record'; - RETURN FALSE; - END IF; - - -- Extract the editor string before any modification to the vandelay - -- MARC occur. - editor_string := - (oils_xpath('//*[@tag="905"]/*[@code="u"]/text()',v_marc))[1]; - - -- If an editor value can be found, update the authority record - -- editor and edit_date values. - IF editor_string IS NOT NULL AND editor_string <> '' THEN - - -- Vandelay.pm sets the value to 'usrname' when needed. - SELECT id INTO new_editor - FROM actor.usr WHERE usrname = editor_string; - - IF new_editor IS NULL THEN - SELECT usr INTO new_editor - FROM actor.card WHERE barcode = editor_string; - END IF; - - IF new_editor IS NOT NULL THEN - new_edit_date := NOW(); - ELSE -- No valid editor, use current values - new_editor = eg_marc_row.editor; - new_edit_date = eg_marc_row.edit_date; - END IF; - ELSE - new_editor = eg_marc_row.editor; - new_edit_date = eg_marc_row.edit_date; - END IF; - - dyn_profile := vandelay.compile_profile( v_marc ); - - IF merge_profile_id IS NOT NULL THEN - SELECT * INTO merge_profile FROM vandelay.merge_profile WHERE id = merge_profile_id; - IF FOUND THEN - dyn_profile.add_rule := BTRIM( dyn_profile.add_rule || ',' || COALESCE(merge_profile.add_spec,''), ','); - dyn_profile.strip_rule := BTRIM( dyn_profile.strip_rule || ',' || COALESCE(merge_profile.strip_spec,''), ','); - dyn_profile.replace_rule := BTRIM( dyn_profile.replace_rule || ',' || COALESCE(merge_profile.replace_spec,''), ','); - dyn_profile.preserve_rule := BTRIM( dyn_profile.preserve_rule || ',' || COALESCE(merge_profile.preserve_spec,''), ','); - END IF; - END IF; - - IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN - -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule; - RETURN FALSE; - END IF; - - IF dyn_profile.replace_rule = '' AND dyn_profile.preserve_rule = '' AND dyn_profile.add_rule = '' AND dyn_profile.strip_rule = '' THEN - --Since we have nothing to do, just return a NOOP "we did it" - RETURN TRUE; - ELSIF dyn_profile.replace_rule <> '' THEN - source_marc = v_marc; - target_marc = eg_marc; - replace_rule = dyn_profile.replace_rule; - ELSE - source_marc = eg_marc; - target_marc = v_marc; - replace_rule = dyn_profile.preserve_rule; - END IF; - - UPDATE authority.record_entry - SET marc = vandelay.merge_record_xml( target_marc, source_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule ), - editor = new_editor, - edit_date = new_edit_date - WHERE id = eg_id; - - IF NOT FOUND THEN - -- Import/merge failed. Nothing left to do. - RETURN FALSE; - END IF; - - -- Authority record successfully merged / imported. - - -- Update the vandelay record to show the successful import. - UPDATE vandelay.queued_authority_record - SET imported_as = eg_id, - import_time = NOW() - WHERE id = import_id; - - RETURN TRUE; - -END; -$$ LANGUAGE PLPGSQL; - - -COMMIT; -