]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0350.schema.action-apply-fieldset.sql
LP1894131 Sticky catalog holdings org select
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0350.schema.action-apply-fieldset.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0350'); -- Scott McKellar
4
5 CREATE OR REPLACE FUNCTION action.apply_fieldset(
6         fieldset_id IN INT,        -- id from action.fieldset
7         table_name  IN TEXT,       -- table to be updated
8         pkey_name   IN TEXT,       -- name of primary key column in that table
9         query       IN TEXT        -- query constructed by qstore (for query-based
10                                    --    fieldsets only; otherwise null
11 )
12 RETURNS TEXT AS $$
13 DECLARE
14         statement TEXT;
15         fs_status TEXT;
16         fs_pkey_value TEXT;
17         fs_query TEXT;
18         sep CHAR;
19         status_code TEXT;
20         msg TEXT;
21         update_count INT;
22         cv RECORD;
23 BEGIN
24         -- Sanity checks
25         IF fieldset_id IS NULL THEN
26                 RETURN 'Fieldset ID parameter is NULL';
27         END IF;
28         IF table_name IS NULL THEN
29                 RETURN 'Table name parameter is NULL';
30         END IF;
31         IF pkey_name IS NULL THEN
32                 RETURN 'Primary key name parameter is NULL';
33         END IF;
34         --
35         statement := 'UPDATE ' || table_name || ' SET';
36         --
37         SELECT
38                 status,
39                 quote_literal( pkey_value )
40         INTO
41                 fs_status,
42                 fs_pkey_value
43         FROM
44                 action.fieldset
45         WHERE
46                 id = fieldset_id;
47         --
48         IF fs_status IS NULL THEN
49                 RETURN 'No fieldset found for id = ' || fieldset_id;
50         ELSIF fs_status = 'APPLIED' THEN
51                 RETURN 'Fieldset ' || fieldset_id || ' has already been applied';
52         END IF;
53         --
54         sep := '';
55         FOR cv IN
56                 SELECT  col,
57                                 val
58                 FROM    action.fieldset_col_val
59                 WHERE   fieldset = fieldset_id
60         LOOP
61                 statement := statement || sep || ' ' || cv.col
62                                          || ' = ' || coalesce( quote_literal( cv.val ), 'NULL' );
63                 sep := ',';
64         END LOOP;
65         --
66         IF sep = '' THEN
67                 RETURN 'Fieldset ' || fieldset_id || ' has no column values defined';
68         END IF;
69         --
70         -- Add the WHERE clause.  This differs according to whether it's a
71         -- single-row fieldset or a query-based fieldset.
72         --
73         IF query IS NULL        AND fs_pkey_value IS NULL THEN
74                 RETURN 'Incomplete fieldset: neither a primary key nor a query available';
75         ELSIF query IS NOT NULL AND fs_pkey_value IS NULL THEN
76             fs_query := rtrim( query, ';' );
77             statement := statement || ' WHERE ' || pkey_name || ' IN ( '
78                          || fs_query || ' );';
79         ELSIF query IS NULL     AND fs_pkey_value IS NOT NULL THEN
80                 statement := statement || ' WHERE ' || pkey_name || ' = '
81                                      || fs_pkey_value || ';';
82         ELSE  -- both are not null
83                 RETURN 'Ambiguous fieldset: both a primary key and a query provided';
84         END IF;
85         --
86         -- Execute the update
87         --
88         BEGIN
89                 EXECUTE statement;
90                 GET DIAGNOSTICS update_count = ROW_COUNT;
91                 --
92                 IF UPDATE_COUNT > 0 THEN
93                         status_code := 'APPLIED';
94                         msg := NULL;
95                 ELSE
96                         status_code := 'ERROR';
97                         msg := 'No eligible rows found for fieldset ' || fieldset_id;
98         END IF;
99         EXCEPTION WHEN OTHERS THEN
100                 status_code := 'ERROR';
101                 msg := 'Unable to apply fieldset ' || fieldset_id
102                            || ': ' || sqlerrm;
103         END;
104         --
105         -- Update fieldset status
106         --
107         UPDATE action.fieldset
108         SET status       = status_code,
109             applied_time = now()
110         WHERE id = fieldset_id;
111         --
112         RETURN msg;
113 END;
114 $$ LANGUAGE plpgsql;
115
116 COMMENT ON FUNCTION action.apply_fieldset( INT, TEXT, TEXT, TEXT ) IS $$
117 /**
118  * Applies a specified fieldset, using a supplied table name and primary
119  * key name.  The query parameter should be non-null only for
120  * query-based fieldsets.
121  *
122  * Returns NULL if successful, or an error message if not.
123  */
124 $$;
125
126 COMMIT;