[open-ils-commits] r16942 - in trunk/Open-ILS/src/sql/Pg: . upgrade (dbs)

svn at svn.open-ils.org svn at svn.open-ils.org
Thu Jul 15 15:22:29 EDT 2010


Author: dbs
Date: 2010-07-15 15:22:19 -0400 (Thu, 15 Jul 2010)
New Revision: 16942

Added:
   trunk/Open-ILS/src/sql/Pg/upgrade/0339.schema.authority_records.sql
Modified:
   trunk/Open-ILS/src/sql/Pg/002.schema.config.sql
   trunk/Open-ILS/src/sql/Pg/011.schema.authority.sql
Log:
Protect authority records from real deletion and add a "merge authorities" function


Modified: trunk/Open-ILS/src/sql/Pg/002.schema.config.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/002.schema.config.sql	2010-07-15 17:17:53 UTC (rev 16941)
+++ trunk/Open-ILS/src/sql/Pg/002.schema.config.sql	2010-07-15 19:22:19 UTC (rev 16942)
@@ -68,7 +68,7 @@
     install_date    TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
 );
 
-INSERT INTO config.upgrade_log (version) VALUES ('0338'); -- dbs
+INSERT INTO config.upgrade_log (version) VALUES ('0339'); -- dbs
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,

Modified: trunk/Open-ILS/src/sql/Pg/011.schema.authority.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/011.schema.authority.sql	2010-07-15 17:17:53 UTC (rev 16941)
+++ trunk/Open-ILS/src/sql/Pg/011.schema.authority.sql	2010-07-15 19:22:19 UTC (rev 16942)
@@ -1,7 +1,9 @@
 /*
  * Copyright (C) 2004-2008  Georgia Public Library Service
  * Copyright (C) 2008  Equinox Software, Inc.
+ * Copyright (C) 2010  Laurentian University
  * Mike Rylander <miker at esilibrary.com> 
+ * Dan Scott <dscott at laurentian.ca>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -41,6 +43,7 @@
 CREATE TRIGGER a_marcxml_is_well_formed BEFORE INSERT OR UPDATE ON authority.record_entry FOR EACH ROW EXECUTE PROCEDURE biblio.check_marcxml_well_formed();
 CREATE TRIGGER b_maintain_901 BEFORE INSERT OR UPDATE ON authority.record_entry FOR EACH ROW EXECUTE PROCEDURE maintain_901();
 CREATE TRIGGER c_maintain_control_numbers BEFORE INSERT OR UPDATE ON authority.record_entry FOR EACH ROW EXECUTE PROCEDURE maintain_control_numbers();
+CREATE RULE protect_authority_rec_delete AS ON DELETE TO authority.record_entry DO INSTEAD (UPDATE authority.record_entry SET deleted = TRUE WHERE OLD.id = authority.record_entry.id);
 
 CREATE TABLE authority.bib_linking (
     id          BIGSERIAL   PRIMARY KEY,
@@ -192,5 +195,43 @@
     SELECT authority.generate_overlay_template( $1, NULL );
 $func$ LANGUAGE SQL;
 
+CREATE OR REPLACE FUNCTION authority.merge_records ( target_record BIGINT, source_record BIGINT ) RETURNS INT AS $func$
+DECLARE
+    moved_objects INT := 0;
+    bib_id        INT := 0;
+    bib_rec       biblio.record_entry%ROWTYPE;
+    auth_link     authority.bib_linking%ROWTYPE;
+BEGIN
 
+    -- 1. Make source_record MARC a copy of the target_record to get auto-sync in linked bib records
+    UPDATE authority.record_entry
+      SET marc = (
+        SELECT marc
+          FROM authority.record_entry
+          WHERE id = target_record
+      )
+      WHERE id = source_record;
+
+    -- 2. Update all bib records with the ID from target_record in their $0
+    FOR bib_rec IN SELECT bre.* FROM biblio.record_entry bre 
+      INNER JOIN authority.bib_linking abl ON abl.bib = bre.id
+      WHERE abl.authority = target_record LOOP
+
+        UPDATE biblio.record_entry
+          SET marc = REGEXP_REPLACE(marc, 
+            E'(<subfield\\s+code="0"\\s*>[^<]*?\\))' || source_record || '<',
+            E'\\1' || target_record || '<', 'g')
+          WHERE id = bib_rec.id;
+
+          moved_objects := moved_objects + 1;
+    END LOOP;
+
+    -- 3. "Delete" source_record
+    DELETE FROM authority.record_entry
+      WHERE id = source_record;
+
+    RETURN moved_objects;
+END;
+$func$ LANGUAGE plpgsql;
+
 COMMIT;

Added: trunk/Open-ILS/src/sql/Pg/upgrade/0339.schema.authority_records.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/upgrade/0339.schema.authority_records.sql	                        (rev 0)
+++ trunk/Open-ILS/src/sql/Pg/upgrade/0339.schema.authority_records.sql	2010-07-15 19:22:19 UTC (rev 16942)
@@ -0,0 +1,46 @@
+BEGIN;
+
+INSERT INTO config.upgrade_log (version) VALUES ('0339'); -- dbs
+
+CREATE RULE protect_authority_rec_delete AS ON DELETE TO authority.record_entry DO INSTEAD (UPDATE authority.record_entry SET deleted = TRUE WHERE OLD.id = authority.record_entry.id);
+
+CREATE OR REPLACE FUNCTION authority.merge_records ( target_record BIGINT, source_record BIGINT ) RETURNS INT AS $func$
+DECLARE
+    moved_objects INT := 0;
+    bib_id        INT := 0;
+    bib_rec       biblio.record_entry%ROWTYPE;
+    auth_link     authority.bib_linking%ROWTYPE;
+BEGIN
+
+    -- 1. Make source_record MARC a copy of the target_record to get auto-sync in linked bib records
+    UPDATE authority.record_entry
+      SET marc = (
+        SELECT marc
+          FROM authority.record_entry
+          WHERE id = target_record
+      )
+      WHERE id = source_record;
+
+    -- 2. Update all bib records with the ID from target_record in their $0
+    FOR bib_rec IN SELECT bre.* FROM biblio.record_entry bre 
+      INNER JOIN authority.bib_linking abl ON abl.bib = bre.id
+      WHERE abl.authority = target_record LOOP
+
+        UPDATE biblio.record_entry
+          SET marc = REGEXP_REPLACE(marc, 
+            E'(<subfield\\s+code="0"\\s*>[^<]*?\\))' || source_record || '<',
+            E'\\1' || target_record || '<', 'g')
+          WHERE id = bib_rec.id;
+
+          moved_objects := moved_objects + 1;
+    END LOOP;
+
+    -- 3. "Delete" source_record
+    DELETE FROM authority.record_entry
+      WHERE id = source_record;
+
+    RETURN moved_objects;
+END;
+$func$ LANGUAGE plpgsql;
+
+COMMIT;



More information about the open-ils-commits mailing list