From 3ed55ac41ef0fb4b4633ec6889783e639bf083f4 Mon Sep 17 00:00:00 2001 From: Jason Etheridge Date: Sun, 25 Feb 2018 23:02:42 -0500 Subject: [PATCH] migration_tools.handle_shelf for example: mig sql -c "select migration_tools.handle_shelf(:'migschema','map_item_l_location_clean','ORGSHORTNAME',1);" Signed-off-by: Jason Etheridge --- sql/base/base.sql | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 59 insertions(+), 0 deletions(-) diff --git a/sql/base/base.sql b/sql/base/base.sql index ed92afa..d52b6fe 100644 --- a/sql/base/base.sql +++ b/sql/base/base.sql @@ -2709,5 +2709,64 @@ CREATE OR REPLACE FUNCTION migration_tools.set_salted_passwd(INTEGER,TEXT) RETUR $$ LANGUAGE PLPGSQL STRICT VOLATILE; +-- convenience functions for handling copy_location maps +CREATE OR REPLACE FUNCTION migration_tools.handle_shelf (TEXT,TEXT,TEXT,INTEGER) RETURNS VOID AS $$ + DECLARE + table_schema ALIAS FOR $1; + table_name ALIAS FOR $2; + org_shortname ALIAS FOR $3; + org_range ALIAS FOR $4; + proceed BOOLEAN; + org INTEGER; + org_list INTEGER[]; + o INTEGER; + BEGIN + EXECUTE 'SELECT EXISTS ( + SELECT 1 + FROM information_schema.columns + WHERE table_schema = $1 + AND table_name = $2 + and column_name = ''desired_shelf'' + )' INTO proceed USING table_schema, table_name; + IF NOT proceed THEN + RAISE EXCEPTION 'Missing column desired_shelf'; + END IF; + + SELECT id INTO org FROM actor.org_unit WHERE shortname = org_shortname; + IF org IS NULL THEN + RAISE EXCEPTION 'Cannot find org by shortname'; + END IF; + + SELECT INTO org_list ARRAY_ACCUM(id) FROM actor.org_unit_full_path( org ); + + EXECUTE 'ALTER TABLE ' + || quote_ident(table_name) + || ' DROP COLUMN IF EXISTS x_shelf'; + EXECUTE 'ALTER TABLE ' + || quote_ident(table_name) + || ' ADD COLUMN x_shelf INTEGER'; + + EXECUTE 'UPDATE ' || quote_ident(table_name) || ' a' + || ' SET x_shelf = id FROM asset_copy_location b' + || ' WHERE BTRIM(UPPER(a.desired_shelf)) = BTRIM(UPPER(b.name))' + || ' AND b.owning_lib = $1' + USING org; + + FOREACH o IN ARRAY org_list LOOP + EXECUTE 'UPDATE ' || quote_ident(table_name) || ' a' + || ' SET x_shelf = id FROM asset.copy_location b' + || ' WHERE BTRIM(UPPER(a.desired_shelf)) = BTRIM(UPPER(b.name))' + || ' AND b.owning_lib = $1 AND x_shelf IS NULL' + USING o; + END LOOP; + + EXECUTE 'SELECT migration_tools.assert( + NOT EXISTS (SELECT 1 FROM ' || quote_ident(table_name) || ' WHERE desired_shelf <> '''' AND x_shelf IS NULL), + ''Cannot find a desired location'', + ''Found all desired locations'' + );'; + + END; +$$ LANGUAGE PLPGSQL STRICT VOLATILE; -- 1.7.2.5