3 CREATE OR REPLACE FUNCTION vandelay.marc21_extract_fixed_field_list( marc TEXT, ff TEXT, use_default BOOL DEFAULT FALSE ) RETURNS TEXT[] AS $func$
9 collection TEXT[] := '{}'::TEXT[];
11 rtype := (vandelay.marc21_record_type( marc )).code;
12 FOR ff_pos IN SELECT * FROM config.marc21_ff_pos_map WHERE fixed_field = ff AND rec_type = rtype ORDER BY tag DESC LOOP
13 IF ff_pos.tag = 'ldr' THEN
14 val := oils_xpath_string('//*[local-name()="leader"]', marc);
15 IF val IS NOT NULL THEN
16 val := SUBSTRING( val, ff_pos.start_pos + 1, ff_pos.length );
17 collection := collection || val;
20 FOR tag_data IN SELECT value FROM UNNEST( oils_xpath( '//*[@tag="' || UPPER(ff_pos.tag) || '"]/text()', marc ) ) x(value) LOOP
21 val := SUBSTRING( tag_data.value, ff_pos.start_pos + 1, ff_pos.length );
22 collection := collection || val;
25 CONTINUE WHEN NOT use_default;
26 CONTINUE WHEN ARRAY_UPPER(collection, 1) > 0;
27 val := REPEAT( ff_pos.default_val, ff_pos.length );
28 collection := collection || val;
33 $func$ LANGUAGE PLPGSQL;
35 CREATE OR REPLACE FUNCTION vandelay.marc21_extract_fixed_field( marc TEXT, ff TEXT, use_default BOOL DEFAULT FALSE ) RETURNS TEXT AS $func$
42 rtype := (vandelay.marc21_record_type( marc )).code;
43 FOR ff_pos IN SELECT * FROM config.marc21_ff_pos_map WHERE fixed_field = ff AND rec_type = rtype ORDER BY tag DESC LOOP
44 IF ff_pos.tag = 'ldr' THEN
45 val := oils_xpath_string('//*[local-name()="leader"]', marc);
46 IF val IS NOT NULL THEN
47 val := SUBSTRING( val, ff_pos.start_pos + 1, ff_pos.length );
51 FOR tag_data IN SELECT value FROM UNNEST( oils_xpath( '//*[@tag="' || UPPER(ff_pos.tag) || '"]/text()', marc ) ) x(value) LOOP
52 val := SUBSTRING( tag_data.value, ff_pos.start_pos + 1, ff_pos.length );
56 CONTINUE WHEN NOT use_default;
57 val := REPEAT( ff_pos.default_val, ff_pos.length );
63 $func$ LANGUAGE PLPGSQL;
65 CREATE OR REPLACE FUNCTION vandelay.marc21_extract_all_fixed_fields( marc TEXT, use_default BOOL DEFAULT FALSE ) RETURNS SETOF biblio.record_ff_map AS $func$
70 output biblio.record_ff_map%ROWTYPE;
72 rtype := (vandelay.marc21_record_type( marc )).code;
74 FOR ff_pos IN SELECT * FROM config.marc21_ff_pos_map WHERE rec_type = rtype ORDER BY tag DESC LOOP
75 output.ff_name := ff_pos.fixed_field;
76 output.ff_value := NULL;
78 IF ff_pos.tag = 'ldr' THEN
79 output.ff_value := oils_xpath_string('//*[local-name()="leader"]', marc);
80 IF output.ff_value IS NOT NULL THEN
81 output.ff_value := SUBSTRING( output.ff_value, ff_pos.start_pos + 1, ff_pos.length );
83 output.ff_value := NULL;
86 FOR tag_data IN SELECT value FROM UNNEST( oils_xpath( '//*[@tag="' || UPPER(ff_pos.tag) || '"]/text()', marc ) ) x(value) LOOP
87 output.ff_value := SUBSTRING( tag_data, ff_pos.start_pos + 1, ff_pos.length );
88 CONTINUE WHEN output.ff_value IS NULL AND NOT use_default;
89 IF output.ff_value IS NULL THEN output.ff_value := REPEAT( ff_pos.default_val, ff_pos.length ); END IF;
91 output.ff_value := NULL;
99 $func$ LANGUAGE PLPGSQL;
101 CREATE OR REPLACE FUNCTION biblio.marc21_extract_fixed_field_list( rid BIGINT, ff TEXT ) RETURNS TEXT[] AS $func$
102 SELECT * FROM vandelay.marc21_extract_fixed_field_list( (SELECT marc FROM biblio.record_entry WHERE id = $1), $2, TRUE );
105 CREATE OR REPLACE FUNCTION biblio.marc21_extract_fixed_field( rid BIGINT, ff TEXT ) RETURNS TEXT AS $func$
106 SELECT * FROM vandelay.marc21_extract_fixed_field( (SELECT marc FROM biblio.record_entry WHERE id = $1), $2, TRUE );
109 CREATE OR REPLACE FUNCTION biblio.marc21_extract_all_fixed_fields( rid BIGINT ) RETURNS SETOF biblio.record_ff_map AS $func$
110 SELECT $1 AS record, ff_name, ff_value FROM vandelay.marc21_extract_all_fixed_fields( (SELECT marc FROM biblio.record_entry WHERE id = $1), TRUE );
113 DROP FUNCTION IF EXISTS vandelay.marc21_extract_fixed_field_list( text, text );
114 DROP FUNCTION IF EXISTS vandelay.marc21_extract_fixed_field( text, text );
115 DROP FUNCTION IF EXISTS vandelay.marc21_extract_all_fixed_fields( text );