[open-ils-commits] [GIT] Evergreen ILS branch master updated. d153502f9b2b89b364742a41c0fbe9313c544ec9

Evergreen Git git at git.evergreen-ils.org
Fri Jul 27 09:30:04 EDT 2012


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, master has been updated
       via  d153502f9b2b89b364742a41c0fbe9313c544ec9 (commit)
       via  119034544e2934f223ec71a63f884f1eed487d6a (commit)
       via  b0c85c31df44e962c0ecc87e08e067513d6c4825 (commit)
      from  5fd92464a3046a38806bcd88d5e82591494609e2 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit d153502f9b2b89b364742a41c0fbe9313c544ec9
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Fri Jul 27 09:29:35 2012 -0400

    stamp upgrade script for lp1028514
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>

diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql
index 7a48018..a834191 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -87,7 +87,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 ('0723', :eg_version); -- denials/senator
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0724', :eg_version); -- denials/gmcharlt
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_maintain_901_regex.sql b/Open-ILS/src/sql/Pg/upgrade/0724.schema.fix_maintain_901_regex.sql
similarity index 95%
rename from Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_maintain_901_regex.sql
rename to Open-ILS/src/sql/Pg/upgrade/0724.schema.fix_maintain_901_regex.sql
index 334caeb..ddf17d8 100644
--- a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_maintain_901_regex.sql
+++ b/Open-ILS/src/sql/Pg/upgrade/0724.schema.fix_maintain_901_regex.sql
@@ -1,3 +1,7 @@
+BEGIN;
+
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0724', :eg_version); -- denials/gmcharlt
+
 CREATE OR REPLACE FUNCTION evergreen.maintain_901 () RETURNS TRIGGER AS $func$
 use strict;
 use MARC::Record;
@@ -97,3 +101,5 @@ $_TD->{new}{marc} = $xml;
 
 return "MODIFY";
 $func$ LANGUAGE PLPERLU;
+
+COMMIT;

commit 119034544e2934f223ec71a63f884f1eed487d6a
Author: Dan Scott <dscott at laurentian.ca>
Date:   Tue Jul 24 14:14:01 2012 -0400

    Switch to a PLPERLU maintain_901() trigger function
    
    We've been burned by regexes that fail to grok XML properly numerous
    times now. Standardizing on something that actually understands MARC
    seems like a good idea.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/src/sql/Pg/002.functions.config.sql b/Open-ILS/src/sql/Pg/002.functions.config.sql
index b441ad8..274adc3 100644
--- a/Open-ILS/src/sql/Pg/002.functions.config.sql
+++ b/Open-ILS/src/sql/Pg/002.functions.config.sql
@@ -420,67 +420,104 @@ CREATE OR REPLACE FUNCTION oils_json_to_text( TEXT ) RETURNS TEXT AS $f$
 $f$ LANGUAGE PLPERLU;
 
 CREATE OR REPLACE FUNCTION evergreen.maintain_901 () RETURNS TRIGGER AS $func$
-DECLARE
-    use_id_for_tcn BOOLEAN;
-BEGIN
-    -- Remove any existing 901 fields before we insert the authoritative one
-    NEW.marc := REGEXP_REPLACE(NEW.marc, E'<datafield[^>]*?tag="901".+?</datafield>', '', 'g');
+use strict;
+use MARC::Record;
+use MARC::File::XML (BinaryEncoding => 'UTF-8');
+use MARC::Charset;
+use Encode;
+use Unicode::Normalize;
 
-    IF TG_TABLE_SCHEMA = 'biblio' THEN
-        -- Set TCN value to record ID?
-        SELECT enabled FROM config.global_flag INTO use_id_for_tcn
-            WHERE name = 'cat.bib.use_id_for_tcn';
+MARC::Charset->assume_unicode(1);
 
-        IF use_id_for_tcn = 't' THEN
-            NEW.tcn_value := NEW.id;
-        END IF;
+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}; 
+    }
 
-        NEW.marc := REGEXP_REPLACE(
-            NEW.marc,
-            E'(</(?:[^:>]*?:)?record>)',
-            E'<datafield tag="901" ind1=" " ind2=" ">' ||
-                '<subfield code="a">' || REPLACE(evergreen.xml_escape(NEW.tcn_value), E'\\', E'\\\\') || E'</subfield>' ||
-                '<subfield code="b">' || REPLACE(evergreen.xml_escape(NEW.tcn_source), E'\\', E'\\\\') || E'</subfield>' ||
-                '<subfield code="c">' || NEW.id || E'</subfield>' ||
-                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
-                CASE WHEN NEW.owner IS NOT NULL THEN '<subfield code="o">' || NEW.owner || E'</subfield>' ELSE '' END ||
-                CASE WHEN NEW.share_depth IS NOT NULL THEN '<subfield code="d">' || NEW.share_depth || E'</subfield>' ELSE '' END ||
-             E'</datafield>\\1'
-        );
-    ELSIF TG_TABLE_SCHEMA = 'authority' THEN
-        NEW.marc := REGEXP_REPLACE(
-            NEW.marc,
-            E'(</(?:[^:>]*?:)?record>)',
-            E'<datafield tag="901" ind1=" " ind2=" ">' ||
-                '<subfield code="c">' || NEW.id || E'</subfield>' ||
-                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
-             E'</datafield>\\1'
-        );
-    ELSIF TG_TABLE_SCHEMA = 'serial' THEN
-        NEW.marc := REGEXP_REPLACE(
-            NEW.marc,
-            E'(</(?:[^:>]*?:)?record>)',
-            E'<datafield tag="901" ind1=" " ind2=" ">' ||
-                '<subfield code="c">' || NEW.id || E'</subfield>' ||
-                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
-                '<subfield code="o">' || NEW.owning_lib || E'</subfield>' ||
-                CASE WHEN NEW.record IS NOT NULL THEN '<subfield code="r">' || NEW.record || E'</subfield>' ELSE '' END ||
-             E'</datafield>\\1'
-        );
-    ELSE
-        NEW.marc := REGEXP_REPLACE(
-            NEW.marc,
-            E'(</(?:[^:>]*?:)?record>)',
-            E'<datafield tag="901" ind1=" " ind2=" ">' ||
-                '<subfield code="c">' || NEW.id || E'</subfield>' ||
-                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
-             E'</datafield>\\1'
-        );
-    END IF;
+    my $new_901 = MARC::Field->new("901", " ", " ",
+        "a" => $tcn_value,
+        "b" => $_TD->{new}{tcn_source},
+        "c" => $_TD->{new}{id},
+        "t" => $schema
+    );
 
-    RETURN NEW;
-END;
-$func$ LANGUAGE PLPGSQL;
+    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});
+    }
+
+    $marc->append_fields($new_901);
+} elsif ($schema = 'authority') {
+    $marc->append_fields(
+        ["901", " ", " ",
+            "c" => $_TD->{new}{id},
+            "t" => $schema,
+        ]
+    );
+} elsif ($schema = '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 {
+    $marc->append_fields(
+        ["901", " ", " ",
+            "c" => $_TD->{new}{id},
+            "t" => $schema,
+        ]
+    );
+}
+
+my $xml = $marc->as_xml_record();
+$xml =~ s/\n//sgo;
+$xml =~ s/^<\?xml.+\?\s*>//go;
+$xml =~ s/>\s+</></go;
+$xml =~ s/\p{Cc}//go;
+
+# Embed a version of OpenILS::Application::AppUtils->entityize()
+# to avoid having to set PERL5LIB for PostgreSQL as well
+
+# If we are going to convert non-ASCII characters to XML entities,
+# we had better be dealing with a UTF8 string to begin with
+$xml = decode_utf8($xml);
+
+$xml = NFC($xml);
+
+# Convert raw ampersands to entities
+$xml =~ s/&(?!\S+;)/&amp;/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;
 
 CREATE OR REPLACE FUNCTION evergreen.force_unicode_normal_form(string TEXT, form TEXT) RETURNS TEXT AS $func$
 use Unicode::Normalize 'normalize';
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_maintain_901_regex.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_maintain_901_regex.sql
index 607e3a7..334caeb 100644
--- a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_maintain_901_regex.sql
+++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_maintain_901_regex.sql
@@ -1,68 +1,99 @@
-BEGIN;
+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;
 
-SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+MARC::Charset->assume_unicode(1);
 
-CREATE OR REPLACE FUNCTION evergreen.maintain_901 () RETURNS TRIGGER AS $func$
-DECLARE
-    use_id_for_tcn BOOLEAN;
-BEGIN
-    -- Remove any existing 901 fields before we insert the authoritative one
-    NEW.marc := REGEXP_REPLACE(NEW.marc, E'<datafield[^>]*?tag="901".+?</datafield>', '', 'g');
-
-    IF TG_TABLE_SCHEMA = 'biblio' THEN
-        -- Set TCN value to record ID?
-        SELECT enabled FROM config.global_flag INTO use_id_for_tcn
-            WHERE name = 'cat.bib.use_id_for_tcn';
-
-        IF use_id_for_tcn = 't' THEN
-            NEW.tcn_value := NEW.id;
-        END IF;
-
-        NEW.marc := REGEXP_REPLACE(
-            NEW.marc,
-            E'(</(?:[^:>]*?:)?record>)',
-            E'<datafield tag="901" ind1=" " ind2=" ">' ||
-                '<subfield code="a">' || REPLACE(evergreen.xml_escape(NEW.tcn_value), E'\\', E'\\\\') || E'</subfield>' ||
-                '<subfield code="b">' || REPLACE(evergreen.xml_escape(NEW.tcn_source), E'\\', E'\\\\') || E'</subfield>' ||
-                '<subfield code="c">' || NEW.id || E'</subfield>' ||
-                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
-                CASE WHEN NEW.owner IS NOT NULL THEN '<subfield code="o">' || NEW.owner || E'</subfield>' ELSE '' END ||
-                CASE WHEN NEW.share_depth IS NOT NULL THEN '<subfield code="d">' || NEW.share_depth || E'</subfield>' ELSE '' END ||
-             E'</datafield>\\1'
-        );
-    ELSIF TG_TABLE_SCHEMA = 'authority' THEN
-        NEW.marc := REGEXP_REPLACE(
-            NEW.marc,
-            E'(</(?:[^:>]*?:)?record>)',
-            E'<datafield tag="901" ind1=" " ind2=" ">' ||
-                '<subfield code="c">' || NEW.id || E'</subfield>' ||
-                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
-             E'</datafield>\\1'
-        );
-    ELSIF TG_TABLE_SCHEMA = 'serial' THEN
-        NEW.marc := REGEXP_REPLACE(
-            NEW.marc,
-            E'(</(?:[^:>]*?:)?record>)',
-            E'<datafield tag="901" ind1=" " ind2=" ">' ||
-                '<subfield code="c">' || NEW.id || E'</subfield>' ||
-                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
-                '<subfield code="o">' || NEW.owning_lib || E'</subfield>' ||
-                CASE WHEN NEW.record IS NOT NULL THEN '<subfield code="r">' || NEW.record || E'</subfield>' ELSE '' END ||
-             E'</datafield>\\1'
-        );
-    ELSE
-        NEW.marc := REGEXP_REPLACE(
-            NEW.marc,
-            E'(</(?:[^:>]*?:)?record>)',
-            E'<datafield tag="901" ind1=" " ind2=" ">' ||
-                '<subfield code="c">' || NEW.id || E'</subfield>' ||
-                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
-             E'</datafield>\\1'
-        );
-    END IF;
-
-    RETURN NEW;
-END;
-$func$ LANGUAGE PLPGSQL;
-
-COMMIT;
+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}; 
+    }
+
+    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});
+    }
+
+    $marc->append_fields($new_901);
+} elsif ($schema = 'authority') {
+    $marc->append_fields(
+        ["901", " ", " ",
+            "c" => $_TD->{new}{id},
+            "t" => $schema,
+        ]
+    );
+} elsif ($schema = '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 {
+    $marc->append_fields(
+        ["901", " ", " ",
+            "c" => $_TD->{new}{id},
+            "t" => $schema,
+        ]
+    );
+}
+
+my $xml = $marc->as_xml_record();
+$xml =~ s/\n//sgo;
+$xml =~ s/^<\?xml.+\?\s*>//go;
+$xml =~ s/>\s+</></go;
+$xml =~ s/\p{Cc}//go;
+
+# Embed a version of OpenILS::Application::AppUtils->entityize()
+# to avoid having to set PERL5LIB for PostgreSQL as well
+
+# If we are going to convert non-ASCII characters to XML entities,
+# we had better be dealing with a UTF8 string to begin with
+$xml = decode_utf8($xml);
+
+$xml = NFC($xml);
+
+# Convert raw ampersands to entities
+$xml =~ s/&(?!\S+;)/&amp;/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 b0c85c31df44e962c0ecc87e08e067513d6c4825
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Tue Jul 24 11:51:52 2012 -0400

    lp1028514: fix regex replace in maintain_901()
    
    The regex used to insert the 901 field can put the new
    field in the wrong location if the MARCXML record being
    modified uses namespace prefixes.  This patch tightens
    the regexp to avoid this problem.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/sql/Pg/002.functions.config.sql b/Open-ILS/src/sql/Pg/002.functions.config.sql
index 3ea61ae..b441ad8 100644
--- a/Open-ILS/src/sql/Pg/002.functions.config.sql
+++ b/Open-ILS/src/sql/Pg/002.functions.config.sql
@@ -437,7 +437,7 @@ BEGIN
 
         NEW.marc := REGEXP_REPLACE(
             NEW.marc,
-            E'(</(?:[^:]*?:)?record>)',
+            E'(</(?:[^:>]*?:)?record>)',
             E'<datafield tag="901" ind1=" " ind2=" ">' ||
                 '<subfield code="a">' || REPLACE(evergreen.xml_escape(NEW.tcn_value), E'\\', E'\\\\') || E'</subfield>' ||
                 '<subfield code="b">' || REPLACE(evergreen.xml_escape(NEW.tcn_source), E'\\', E'\\\\') || E'</subfield>' ||
@@ -450,7 +450,7 @@ BEGIN
     ELSIF TG_TABLE_SCHEMA = 'authority' THEN
         NEW.marc := REGEXP_REPLACE(
             NEW.marc,
-            E'(</(?:[^:]*?:)?record>)',
+            E'(</(?:[^:>]*?:)?record>)',
             E'<datafield tag="901" ind1=" " ind2=" ">' ||
                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
@@ -459,7 +459,7 @@ BEGIN
     ELSIF TG_TABLE_SCHEMA = 'serial' THEN
         NEW.marc := REGEXP_REPLACE(
             NEW.marc,
-            E'(</(?:[^:]*?:)?record>)',
+            E'(</(?:[^:>]*?:)?record>)',
             E'<datafield tag="901" ind1=" " ind2=" ">' ||
                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
@@ -470,7 +470,7 @@ BEGIN
     ELSE
         NEW.marc := REGEXP_REPLACE(
             NEW.marc,
-            E'(</(?:[^:]*?:)?record>)',
+            E'(</(?:[^:>]*?:)?record>)',
             E'<datafield tag="901" ind1=" " ind2=" ">' ||
                 '<subfield code="c">' || NEW.id || E'</subfield>' ||
                 '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_maintain_901_regex.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_maintain_901_regex.sql
new file mode 100644
index 0000000..607e3a7
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.fix_maintain_901_regex.sql
@@ -0,0 +1,68 @@
+BEGIN;
+
+SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+CREATE OR REPLACE FUNCTION evergreen.maintain_901 () RETURNS TRIGGER AS $func$
+DECLARE
+    use_id_for_tcn BOOLEAN;
+BEGIN
+    -- Remove any existing 901 fields before we insert the authoritative one
+    NEW.marc := REGEXP_REPLACE(NEW.marc, E'<datafield[^>]*?tag="901".+?</datafield>', '', 'g');
+
+    IF TG_TABLE_SCHEMA = 'biblio' THEN
+        -- Set TCN value to record ID?
+        SELECT enabled FROM config.global_flag INTO use_id_for_tcn
+            WHERE name = 'cat.bib.use_id_for_tcn';
+
+        IF use_id_for_tcn = 't' THEN
+            NEW.tcn_value := NEW.id;
+        END IF;
+
+        NEW.marc := REGEXP_REPLACE(
+            NEW.marc,
+            E'(</(?:[^:>]*?:)?record>)',
+            E'<datafield tag="901" ind1=" " ind2=" ">' ||
+                '<subfield code="a">' || REPLACE(evergreen.xml_escape(NEW.tcn_value), E'\\', E'\\\\') || E'</subfield>' ||
+                '<subfield code="b">' || REPLACE(evergreen.xml_escape(NEW.tcn_source), E'\\', E'\\\\') || E'</subfield>' ||
+                '<subfield code="c">' || NEW.id || E'</subfield>' ||
+                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
+                CASE WHEN NEW.owner IS NOT NULL THEN '<subfield code="o">' || NEW.owner || E'</subfield>' ELSE '' END ||
+                CASE WHEN NEW.share_depth IS NOT NULL THEN '<subfield code="d">' || NEW.share_depth || E'</subfield>' ELSE '' END ||
+             E'</datafield>\\1'
+        );
+    ELSIF TG_TABLE_SCHEMA = 'authority' THEN
+        NEW.marc := REGEXP_REPLACE(
+            NEW.marc,
+            E'(</(?:[^:>]*?:)?record>)',
+            E'<datafield tag="901" ind1=" " ind2=" ">' ||
+                '<subfield code="c">' || NEW.id || E'</subfield>' ||
+                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
+             E'</datafield>\\1'
+        );
+    ELSIF TG_TABLE_SCHEMA = 'serial' THEN
+        NEW.marc := REGEXP_REPLACE(
+            NEW.marc,
+            E'(</(?:[^:>]*?:)?record>)',
+            E'<datafield tag="901" ind1=" " ind2=" ">' ||
+                '<subfield code="c">' || NEW.id || E'</subfield>' ||
+                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
+                '<subfield code="o">' || NEW.owning_lib || E'</subfield>' ||
+                CASE WHEN NEW.record IS NOT NULL THEN '<subfield code="r">' || NEW.record || E'</subfield>' ELSE '' END ||
+             E'</datafield>\\1'
+        );
+    ELSE
+        NEW.marc := REGEXP_REPLACE(
+            NEW.marc,
+            E'(</(?:[^:>]*?:)?record>)',
+            E'<datafield tag="901" ind1=" " ind2=" ">' ||
+                '<subfield code="c">' || NEW.id || E'</subfield>' ||
+                '<subfield code="t">' || TG_TABLE_SCHEMA || E'</subfield>' ||
+             E'</datafield>\\1'
+        );
+    END IF;
+
+    RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+COMMIT;

-----------------------------------------------------------------------

Summary of changes:
 Open-ILS/src/sql/Pg/002.functions.config.sql       |  159 ++++++++++++--------
 Open-ILS/src/sql/Pg/002.schema.config.sql          |    2 +-
 .../upgrade/0724.schema.fix_maintain_901_regex.sql |  105 +++++++++++++
 3 files changed, 204 insertions(+), 62 deletions(-)
 create mode 100644 Open-ILS/src/sql/Pg/upgrade/0724.schema.fix_maintain_901_regex.sql


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list