From a4f58d2bd63bb51b43eb1c47bd640ec5fbe858bf Mon Sep 17 00:00:00 2001 From: miker Date: Thu, 23 Dec 2010 01:35:05 +0000 Subject: [PATCH] allow vandelay.replace_field() to handle a complex field spec by splitting and looping git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_1_6_2@19046 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/src/sql/Pg/012.schema.vandelay.sql | 29 +++++++++++------- .../upgrade/0473.schema.vandelay-replace_field.sql | 35 ++++++++++++++++++++++ 2 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 Open-ILS/src/sql/Pg/upgrade/0473.schema.vandelay-replace_field.sql diff --git a/Open-ILS/src/sql/Pg/012.schema.vandelay.sql b/Open-ILS/src/sql/Pg/012.schema.vandelay.sql index 93fe5df99b..d928376303 100644 --- a/Open-ILS/src/sql/Pg/012.schema.vandelay.sql +++ b/Open-ILS/src/sql/Pg/012.schema.vandelay.sql @@ -269,17 +269,26 @@ CREATE OR REPLACE FUNCTION vandelay.replace_field ( target_xml TEXT, source_xml DECLARE xml_output TEXT; parsed_target TEXT; + curr_field TEXT; BEGIN - parsed_target := vandelay.strip_field( target_xml, ''); -- this dance normalized the format of the xml for the IF below - xml_output := vandelay.strip_field( parsed_target, field); - - IF xml_output <> parsed_target AND field ~ E'~' THEN - -- we removed something, and there was a regexp restriction in the field definition, so proceed - xml_output := vandelay.add_field( xml_output, source_xml, field, 1 ); - ELSIF field !~ E'~' THEN - -- No regexp restriction, add the field - xml_output := vandelay.add_field( xml_output, source_xml, field, 0 ); - END IF; + + parsed_target := vandelay.strip_field( target_xml, ''); -- this dance normalizes the format of the xml for the IF below + + FOR curr_field IN SELECT UNNEST( STRING_TO_ARRAY(field, ',') ) LOOP -- naive split, but it's the same we use in the perl + + xml_output := vandelay.strip_field( parsed_target, curr_field); + + IF xml_output <> parsed_target AND curr_field ~ E'~' THEN + -- we removed something, and there was a regexp restriction in the curr_field definition, so proceed + xml_output := vandelay.add_field( xml_output, source_xml, curr_field, 1 ); + ELSIF curr_field !~ E'~' THEN + -- No regexp restriction, add the curr_field + xml_output := vandelay.add_field( xml_output, source_xml, curr_field, 0 ); + END IF; + + parsed_target := xml_output; -- in prep for any following loop iterations + + END LOOP; RETURN xml_output; END; diff --git a/Open-ILS/src/sql/Pg/upgrade/0473.schema.vandelay-replace_field.sql b/Open-ILS/src/sql/Pg/upgrade/0473.schema.vandelay-replace_field.sql new file mode 100644 index 0000000000..8a5802be83 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/0473.schema.vandelay-replace_field.sql @@ -0,0 +1,35 @@ + +BEGIN; + +INSERT INTO config.upgrade_log (version) VALUES ('0473'); -- miker + +CREATE OR REPLACE FUNCTION vandelay.replace_field ( target_xml TEXT, source_xml TEXT, field TEXT ) RETURNS TEXT AS $_$ +DECLARE + xml_output TEXT; + parsed_target TEXT; + curr_field TEXT; +BEGIN + + parsed_target := vandelay.strip_field( target_xml, ''); -- this dance normalizes the format of the xml for the IF below + + FOR curr_field IN SELECT UNNEST( STRING_TO_ARRAY(field, ',') ) LOOP -- naive split, but it's the same we use in the perl + + xml_output := vandelay.strip_field( parsed_target, curr_field); + + IF xml_output <> parsed_target AND curr_field ~ E'~' THEN + -- we removed something, and there was a regexp restriction in the curr_field definition, so proceed + xml_output := vandelay.add_field( xml_output, source_xml, curr_field, 1 ); + ELSIF curr_field !~ E'~' THEN + -- No regexp restriction, add the curr_field + xml_output := vandelay.add_field( xml_output, source_xml, curr_field, 0 ); + END IF; + + parsed_target := xml_output; -- in prep for any following loop iterations + + END LOOP; + + RETURN xml_output; +END; +$_$ LANGUAGE PLPGSQL; + +COMMIT; -- 2.11.0