RETURN NULL;
END
$$ LANGUAGE plpgsql;
+
+-- alternate adding subfield 9 function in that it adds them to existing tags where the 856$u matches a correct value only
+DROP FUNCTION IF EXISTS add_sf9(TEXT,TEXT,TEXT);
+CREATE OR REPLACE FUNCTION add_sf9(marc TEXT, partial_u TEXT, new_9 TEXT)
+ RETURNS TEXT
+ LANGUAGE plperlu
+AS $function$
+use strict;
+use warnings;
+
+use MARC::Record;
+use MARC::File::XML (BinaryEncoding => 'utf8');
+
+binmode(STDERR, ':bytes');
+binmode(STDOUT, ':utf8');
+binmode(STDERR, ':utf8');
+
+my $marc_xml = shift;
+my $matching_u_text = shift;
+my $new_9_to_set = shift;
+
+$marc_xml =~ s/(<leader>.........)./${1}a/;
+
+eval {
+ $marc_xml = MARC::Record->new_from_xml($marc_xml);
+};
+if ($@) {
+ #elog("could not parse $bibid: $@\n");
+ import MARC::File::XML (BinaryEncoding => 'utf8');
+ return;
+}
+
+my @uris = $marc_xml->field('856');
+return unless @uris;
+
+foreach my $field (@uris) {
+ my $sfu = $field->subfield('u');
+ my $ind2 = $field->indicator('2');
+ if (!defined $ind2) { next; }
+ if ($ind2 ne '0') { next; }
+ if (!defined $sfu) { next; }
+ if ($sfu =~ m/$matching_u_text/) {
+ $field->add_subfields( '9' => $new_9_to_set );
+ last;
+ }
+}
+
+return $marc_xml->as_xml_record();
+
+$function$;
+
+DROP FUNCTION IF EXISTS add_sf9(INTEGER, TEXT, TEXT);
+CREATE OR REPLACE FUNCTION add_sf9(bib_id INTEGER, target_u_text TEXT, sf9_text TEXT)
+ RETURNS BOOLEAN AS
+$BODY$
+DECLARE
+ source_xml TEXT;
+ new_xml TEXT;
+ r BOOLEAN;
+BEGIN
+
+ SELECT marc FROM biblio.record_entry WHERE id = bib_id INTO source_xml;
+
+ SELECT add_sf9(source_xml, target_u_text, sf9_text) INTO new_xml;
+
+ r = FALSE;
+
+ IF new_xml != source_xml THEN
+ UPDATE biblio.record_entry SET marc = new_xml WHERE id = bib_id;
+ r = TRUE;
+ END IF;
+
+ RETURN r;
+
+END;
+$BODY$ LANGUAGE plpgsql;
+
+-- convenience function for linking to the item staging table
+
+CREATE OR REPLACE FUNCTION migration_tools.handle_item_barcode (TEXT,TEXT,TEXT,TEXT,BOOLEAN) RETURNS VOID AS $$
+ DECLARE
+ table_schema ALIAS FOR $1;
+ table_name ALIAS FOR $2;
+ foreign_column_name ALIAS FOR $3;
+ main_column_name ALIAS FOR $4;
+ btrim_desired ALIAS FOR $5;
+ proceed BOOLEAN;
+ BEGIN
+ EXECUTE 'SELECT EXISTS (
+ SELECT 1
+ FROM information_schema.columns
+ WHERE table_schema = $1
+ AND table_name = $2
+ and column_name = $3
+ )' INTO proceed USING table_schema, table_name, foreign_column_name;
+ IF NOT proceed THEN
+ RAISE EXCEPTION '%.% missing column %', table_schema, table_name, foreign_column_name;
+ END IF;
+
+ EXECUTE 'SELECT EXISTS (
+ SELECT 1
+ FROM information_schema.columns
+ WHERE table_schema = $1
+ AND table_name = ''asset_copy_legacy''
+ and column_name = $2
+ )' INTO proceed USING table_schema, main_column_name;
+ IF NOT proceed THEN
+ RAISE EXCEPTION 'No %.asset_copy_legacy with column %', table_schema, main_column_name;
+ END IF;
+
+ EXECUTE 'ALTER TABLE '
+ || quote_ident(table_name)
+ || ' DROP COLUMN IF EXISTS x_item';
+ EXECUTE 'ALTER TABLE '
+ || quote_ident(table_name)
+ || ' ADD COLUMN x_item BIGINT';
+
+ IF btrim_desired THEN
+ EXECUTE 'UPDATE ' || quote_ident(table_name) || ' a'
+ || ' SET x_item = id FROM asset_copy_legacy b'
+ || ' WHERE BTRIM(a.' || quote_ident(foreign_column_name)
+ || ') = BTRIM(b.' || quote_ident(main_column_name) || ')';
+ ELSE
+ EXECUTE 'UPDATE ' || quote_ident(table_name) || ' a'
+ || ' SET x_item = id FROM asset_copy_legacy b'
+ || ' WHERE a.' || quote_ident(foreign_column_name)
+ || ' = b.' || quote_ident(main_column_name);
+ END IF;
+
+ --EXECUTE 'SELECT migration_tools.assert(
+ -- NOT EXISTS (SELECT 1 FROM ' || quote_ident(table_name) || ' WHERE ' || quote_ident(foreign_column_name) || ' <> '''' AND x_item IS NULL),
+ -- ''Cannot link every barcode'',
+ -- ''Every barcode linked''
+ --);';
+
+ END;
+$$ LANGUAGE PLPGSQL STRICT VOLATILE;
+
+-- convenience function for linking to the user staging table
+
+CREATE OR REPLACE FUNCTION migration_tools.handle_user_barcode (TEXT,TEXT,TEXT,TEXT,BOOLEAN) RETURNS VOID AS $$
+ DECLARE
+ table_schema ALIAS FOR $1;
+ table_name ALIAS FOR $2;
+ foreign_column_name ALIAS FOR $3;
+ main_column_name ALIAS FOR $4;
+ btrim_desired ALIAS FOR $5;
+ proceed BOOLEAN;
+ BEGIN
+ EXECUTE 'SELECT EXISTS (
+ SELECT 1
+ FROM information_schema.columns
+ WHERE table_schema = $1
+ AND table_name = $2
+ and column_name = $3
+ )' INTO proceed USING table_schema, table_name, foreign_column_name;
+ IF NOT proceed THEN
+ RAISE EXCEPTION '%.% missing column %', table_schema, table_name, foreign_column_name;
+ END IF;
+
+ EXECUTE 'SELECT EXISTS (
+ SELECT 1
+ FROM information_schema.columns
+ WHERE table_schema = $1
+ AND table_name = ''actor_usr_legacy''
+ and column_name = $2
+ )' INTO proceed USING table_schema, main_column_name;
+ IF NOT proceed THEN
+ RAISE EXCEPTION 'No %.actor_usr_legacy with column %', table_schema, main_column_name;
+ END IF;
+
+ EXECUTE 'ALTER TABLE '
+ || quote_ident(table_name)
+ || ' DROP COLUMN IF EXISTS x_user';
+ EXECUTE 'ALTER TABLE '
+ || quote_ident(table_name)
+ || ' ADD COLUMN x_user INTEGER';
+
+ IF btrim_desired THEN
+ EXECUTE 'UPDATE ' || quote_ident(table_name) || ' a'
+ || ' SET x_user = id FROM actor_usr_legacy b'
+ || ' WHERE BTRIM(a.' || quote_ident(foreign_column_name)
+ || ') = BTRIM(b.' || quote_ident(main_column_name) || ')';
+ ELSE
+ EXECUTE 'UPDATE ' || quote_ident(table_name) || ' a'
+ || ' SET x_user = id FROM actor_usr_legacy b'
+ || ' WHERE a.' || quote_ident(foreign_column_name)
+ || ' = b.' || quote_ident(main_column_name);
+ END IF;
+
+ --EXECUTE 'SELECT migration_tools.assert(
+ -- NOT EXISTS (SELECT 1 FROM ' || quote_ident(table_name) || ' WHERE ' || quote_ident(foreign_column_name) || ' <> '''' AND x_user IS NULL),
+ -- ''Cannot link every barcode'',
+ -- ''Every barcode linked''
+ --);';
+
+ END;
+$$ LANGUAGE PLPGSQL STRICT VOLATILE;
+
+-- convenience function for linking two tables
+-- e.g. select migration_tools.handle_link(:'migschema','asset_copy','barcode','test_foo','l_barcode','x_acp_id',false);
+CREATE OR REPLACE FUNCTION migration_tools.handle_link (TEXT,TEXT,TEXT,TEXT,TEXT,TEXT,BOOLEAN) RETURNS VOID AS $$
+ DECLARE
+ table_schema ALIAS FOR $1;
+ table_a ALIAS FOR $2;
+ column_a ALIAS FOR $3;
+ table_b ALIAS FOR $4;
+ column_b ALIAS FOR $5;
+ column_x ALIAS FOR $6;
+ btrim_desired ALIAS FOR $7;
+ proceed BOOLEAN;
+ BEGIN
+ EXECUTE 'SELECT EXISTS (
+ SELECT 1
+ FROM information_schema.columns
+ WHERE table_schema = $1
+ AND table_name = $2
+ and column_name = $3
+ )' INTO proceed USING table_schema, table_a, column_a;
+ IF NOT proceed THEN
+ RAISE EXCEPTION '%.% missing column %', table_schema, table_a, column_a;
+ END IF;
+
+ EXECUTE 'SELECT EXISTS (
+ SELECT 1
+ FROM information_schema.columns
+ WHERE table_schema = $1
+ AND table_name = $2
+ and column_name = $3
+ )' INTO proceed USING table_schema, table_b, column_b;
+ IF NOT proceed THEN
+ RAISE EXCEPTION '%.% missing column %', table_schema, table_b, column_b;
+ END IF;
+
+ EXECUTE 'ALTER TABLE '
+ || quote_ident(table_b)
+ || ' DROP COLUMN IF EXISTS ' || quote_ident(column_x);
+ EXECUTE 'ALTER TABLE '
+ || quote_ident(table_b)
+ || ' ADD COLUMN ' || quote_ident(column_x) || ' BIGINT';
+
+ IF btrim_desired THEN
+ EXECUTE 'UPDATE ' || quote_ident(table_b) || ' b'
+ || ' SET ' || quote_ident(column_x) || ' = id FROM ' || quote_ident(table_a) || ' a'
+ || ' WHERE BTRIM(a.' || quote_ident(column_a)
+ || ') = BTRIM(b.' || quote_ident(column_b) || ')';
+ ELSE
+ EXECUTE 'UPDATE ' || quote_ident(table_b) || ' b'
+ || ' SET ' || quote_ident(column_x) || ' = id FROM ' || quote_ident(table_a) || ' a'
+ || ' WHERE a.' || quote_ident(column_a)
+ || ' = b.' || quote_ident(column_b);
+ END IF;
+
+ END;
+$$ LANGUAGE PLPGSQL STRICT VOLATILE;