Two new tables in action schema: fieldset and fieldset_col_val.
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0346.schema.action-fieldset.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0346'); -- Scott McKellar
4
5 CREATE TABLE action.fieldset (
6     id              SERIAL          PRIMARY KEY,
7     owner           INT             NOT NULL REFERENCES actor.usr (id)
8                                     DEFERRABLE INITIALLY DEFERRED,
9         owning_lib      INT             NOT NULL REFERENCES actor.org_unit (id)
10                                     DEFERRABLE INITIALLY DEFERRED,
11         status          TEXT            NOT NULL
12                                         CONSTRAINT valid_status CHECK ( status in
13                                                                         ( 'PENDING', 'APPLIED', 'ERROR' )),
14     creation_time   TIMESTAMPTZ     NOT NULL DEFAULT NOW(),
15     scheduled_time  TIMESTAMPTZ,
16     applied_time    TIMESTAMPTZ,
17     classname       TEXT            NOT NULL, -- an IDL class name
18     name            TEXT            NOT NULL,
19     stored_query    INT             REFERENCES query.stored_query (id)
20                                     DEFERRABLE INITIALLY DEFERRED,
21     pkey_value      TEXT,
22         CONSTRAINT lib_name_unique UNIQUE (owning_lib, name),
23     CONSTRAINT fieldset_one_or_the_other CHECK (
24         (stored_query IS NOT NULL AND pkey_value IS NULL) OR
25         (pkey_value IS NOT NULL AND stored_query IS NULL)
26     )
27         -- the CHECK constraint means we can update the fields for a single
28         -- row without all the extra overhead involved in a query
29 );
30
31 CREATE INDEX action_fieldset_sched_time_idx ON action.fieldset( scheduled_time );
32 CREATE INDEX action_owner_idx               ON action.fieldset( owner );
33
34
35 CREATE TABLE action.fieldset_col_val (
36     id              SERIAL  PRIMARY KEY,
37     fieldset        INT     NOT NULL REFERENCES action.fieldset
38                                          ON DELETE CASCADE
39                                          DEFERRABLE INITIALLY DEFERRED,
40     col             TEXT    NOT NULL,  -- "field" from the idl ... the column on the table
41     val             TEXT,              -- value for the column ... NULL means, well, NULL
42     CONSTRAINT fieldset_col_once_per_set UNIQUE (fieldset, col)
43 );
44
45 CREATE OR REPLACE FUNCTION actor.usr_purge_data(
46         src_usr  IN INTEGER,
47         dest_usr IN INTEGER
48 ) RETURNS VOID AS $$
49 DECLARE
50         suffix TEXT;
51         renamable_row RECORD;
52 BEGIN
53
54         UPDATE actor.usr SET
55                 active = FALSE,
56                 card = NULL,
57                 mailing_address = NULL,
58                 billing_address = NULL
59         WHERE id = src_usr;
60
61         -- acq.*
62         UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
63         UPDATE acq.lineitem SET creator = dest_usr WHERE creator = src_usr;
64         UPDATE acq.lineitem SET editor = dest_usr WHERE editor = src_usr;
65         UPDATE acq.lineitem SET selector = dest_usr WHERE selector = src_usr;
66         UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
67         UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
68         DELETE FROM acq.lineitem_usr_attr_definition WHERE usr = src_usr;
69
70         -- Update with a rename to avoid collisions
71         FOR renamable_row in
72                 SELECT id, name
73                 FROM   acq.picklist
74                 WHERE  owner = src_usr
75         LOOP
76                 suffix := ' (' || src_usr || ')';
77                 LOOP
78                         BEGIN
79                                 UPDATE  acq.picklist
80                                 SET     owner = dest_usr, name = name || suffix
81                                 WHERE   id = renamable_row.id;
82                         EXCEPTION WHEN unique_violation THEN
83                                 suffix := suffix || ' ';
84                                 CONTINUE;
85                         END;
86                         EXIT;
87                 END LOOP;
88         END LOOP;
89
90         UPDATE acq.picklist SET creator = dest_usr WHERE creator = src_usr;
91         UPDATE acq.picklist SET editor = dest_usr WHERE editor = src_usr;
92         UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
93         UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
94         UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
95         UPDATE acq.purchase_order SET creator = dest_usr WHERE creator = src_usr;
96         UPDATE acq.purchase_order SET editor = dest_usr WHERE editor = src_usr;
97         UPDATE acq.claim_event SET creator = dest_usr WHERE creator = src_usr;
98
99         -- action.*
100         DELETE FROM action.circulation WHERE usr = src_usr;
101         UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
102         UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
103         UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
104         UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
105         UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
106         DELETE FROM action.hold_request WHERE usr = src_usr;
107         UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
108         UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
109         DELETE FROM action.non_cataloged_circulation WHERE patron = src_usr;
110         UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
111         DELETE FROM action.survey_response WHERE usr = src_usr;
112         UPDATE action.fieldset SET owner = dest_usr WHERE owner = src_usr;
113
114         -- actor.*
115         DELETE FROM actor.card WHERE usr = src_usr;
116         DELETE FROM actor.stat_cat_entry_usr_map WHERE target_usr = src_usr;
117
118         -- The following update is intended to avoid transient violations of a foreign
119         -- key constraint, whereby actor.usr_address references itself.  It may not be
120         -- necessary, but it does no harm.
121         UPDATE actor.usr_address SET replaces = NULL
122                 WHERE usr = src_usr AND replaces IS NOT NULL;
123         DELETE FROM actor.usr_address WHERE usr = src_usr;
124         DELETE FROM actor.usr_note WHERE usr = src_usr;
125         UPDATE actor.usr_note SET creator = dest_usr WHERE creator = src_usr;
126         DELETE FROM actor.usr_org_unit_opt_in WHERE usr = src_usr;
127         UPDATE actor.usr_org_unit_opt_in SET staff = dest_usr WHERE staff = src_usr;
128         DELETE FROM actor.usr_setting WHERE usr = src_usr;
129         DELETE FROM actor.usr_standing_penalty WHERE usr = src_usr;
130         UPDATE actor.usr_standing_penalty SET staff = dest_usr WHERE staff = src_usr;
131
132         -- asset.*
133         UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
134         UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
135         UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
136         UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
137         UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
138         UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
139
140         -- auditor.*
141         DELETE FROM auditor.actor_usr_address_history WHERE id = src_usr;
142         DELETE FROM auditor.actor_usr_history WHERE id = src_usr;
143         UPDATE auditor.asset_call_number_history SET creator = dest_usr WHERE creator = src_usr;
144         UPDATE auditor.asset_call_number_history SET editor  = dest_usr WHERE editor  = src_usr;
145         UPDATE auditor.asset_copy_history SET creator = dest_usr WHERE creator = src_usr;
146         UPDATE auditor.asset_copy_history SET editor  = dest_usr WHERE editor  = src_usr;
147         UPDATE auditor.biblio_record_entry_history SET creator = dest_usr WHERE creator = src_usr;
148         UPDATE auditor.biblio_record_entry_history SET editor  = dest_usr WHERE editor  = src_usr;
149
150         -- biblio.*
151         UPDATE biblio.record_entry SET creator = dest_usr WHERE creator = src_usr;
152         UPDATE biblio.record_entry SET editor = dest_usr WHERE editor = src_usr;
153         UPDATE biblio.record_note SET creator = dest_usr WHERE creator = src_usr;
154         UPDATE biblio.record_note SET editor = dest_usr WHERE editor = src_usr;
155
156         -- container.*
157         -- Update buckets with a rename to avoid collisions
158         FOR renamable_row in
159                 SELECT id, name
160                 FROM   container.biblio_record_entry_bucket
161                 WHERE  owner = src_usr
162         LOOP
163                 suffix := ' (' || src_usr || ')';
164                 LOOP
165                         BEGIN
166                                 UPDATE  container.biblio_record_entry_bucket
167                                 SET     owner = dest_usr, name = name || suffix
168                                 WHERE   id = renamable_row.id;
169                         EXCEPTION WHEN unique_violation THEN
170                                 suffix := suffix || ' ';
171                                 CONTINUE;
172                         END;
173                         EXIT;
174                 END LOOP;
175         END LOOP;
176
177         FOR renamable_row in
178                 SELECT id, name
179                 FROM   container.call_number_bucket
180                 WHERE  owner = src_usr
181         LOOP
182                 suffix := ' (' || src_usr || ')';
183                 LOOP
184                         BEGIN
185                                 UPDATE  container.call_number_bucket
186                                 SET     owner = dest_usr, name = name || suffix
187                                 WHERE   id = renamable_row.id;
188                         EXCEPTION WHEN unique_violation THEN
189                                 suffix := suffix || ' ';
190                                 CONTINUE;
191                         END;
192                         EXIT;
193                 END LOOP;
194         END LOOP;
195
196         FOR renamable_row in
197                 SELECT id, name
198                 FROM   container.copy_bucket
199                 WHERE  owner = src_usr
200         LOOP
201                 suffix := ' (' || src_usr || ')';
202                 LOOP
203                         BEGIN
204                                 UPDATE  container.copy_bucket
205                                 SET     owner = dest_usr, name = name || suffix
206                                 WHERE   id = renamable_row.id;
207                         EXCEPTION WHEN unique_violation THEN
208                                 suffix := suffix || ' ';
209                                 CONTINUE;
210                         END;
211                         EXIT;
212                 END LOOP;
213         END LOOP;
214
215         FOR renamable_row in
216                 SELECT id, name
217                 FROM   container.user_bucket
218                 WHERE  owner = src_usr
219         LOOP
220                 suffix := ' (' || src_usr || ')';
221                 LOOP
222                         BEGIN
223                                 UPDATE  container.user_bucket
224                                 SET     owner = dest_usr, name = name || suffix
225                                 WHERE   id = renamable_row.id;
226                         EXCEPTION WHEN unique_violation THEN
227                                 suffix := suffix || ' ';
228                                 CONTINUE;
229                         END;
230                         EXIT;
231                 END LOOP;
232         END LOOP;
233
234         DELETE FROM container.user_bucket_item WHERE target_user = src_usr;
235
236         -- money.*
237         DELETE FROM money.billable_xact WHERE usr = src_usr;
238         DELETE FROM money.collections_tracker WHERE usr = src_usr;
239         UPDATE money.collections_tracker SET collector = dest_usr WHERE collector = src_usr;
240
241         -- permission.*
242         DELETE FROM permission.usr_grp_map WHERE usr = src_usr;
243         DELETE FROM permission.usr_object_perm_map WHERE usr = src_usr;
244         DELETE FROM permission.usr_perm_map WHERE usr = src_usr;
245         DELETE FROM permission.usr_work_ou_map WHERE usr = src_usr;
246
247         -- reporter.*
248         -- Update with a rename to avoid collisions
249         BEGIN
250                 FOR renamable_row in
251                         SELECT id, name
252                         FROM   reporter.output_folder
253                         WHERE  owner = src_usr
254                 LOOP
255                         suffix := ' (' || src_usr || ')';
256                         LOOP
257                                 BEGIN
258                                         UPDATE  reporter.output_folder
259                                         SET     owner = dest_usr, name = name || suffix
260                                         WHERE   id = renamable_row.id;
261                                 EXCEPTION WHEN unique_violation THEN
262                                         suffix := suffix || ' ';
263                                         CONTINUE;
264                                 END;
265                                 EXIT;
266                         END LOOP;
267                 END LOOP;
268         EXCEPTION WHEN undefined_table THEN
269                 -- do nothing
270         END;
271
272         BEGIN
273                 UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
274         EXCEPTION WHEN undefined_table THEN
275                 -- do nothing
276         END;
277
278         -- Update with a rename to avoid collisions
279         BEGIN
280                 FOR renamable_row in
281                         SELECT id, name
282                         FROM   reporter.report_folder
283                         WHERE  owner = src_usr
284                 LOOP
285                         suffix := ' (' || src_usr || ')';
286                         LOOP
287                                 BEGIN
288                                         UPDATE  reporter.report_folder
289                                         SET     owner = dest_usr, name = name || suffix
290                                         WHERE   id = renamable_row.id;
291                                 EXCEPTION WHEN unique_violation THEN
292                                         suffix := suffix || ' ';
293                                         CONTINUE;
294                                 END;
295                                 EXIT;
296                         END LOOP;
297                 END LOOP;
298         EXCEPTION WHEN undefined_table THEN
299                 -- do nothing
300         END;
301
302         BEGIN
303                 UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
304         EXCEPTION WHEN undefined_table THEN
305                 -- do nothing
306         END;
307
308         BEGIN
309                 UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
310         EXCEPTION WHEN undefined_table THEN
311                 -- do nothing
312         END;
313
314         -- Update with a rename to avoid collisions
315         BEGIN
316                 FOR renamable_row in
317                         SELECT id, name
318                         FROM   reporter.template_folder
319                         WHERE  owner = src_usr
320                 LOOP
321                         suffix := ' (' || src_usr || ')';
322                         LOOP
323                                 BEGIN
324                                         UPDATE  reporter.template_folder
325                                         SET     owner = dest_usr, name = name || suffix
326                                         WHERE   id = renamable_row.id;
327                                 EXCEPTION WHEN unique_violation THEN
328                                         suffix := suffix || ' ';
329                                         CONTINUE;
330                                 END;
331                                 EXIT;
332                         END LOOP;
333                 END LOOP;
334         EXCEPTION WHEN undefined_table THEN
335         -- do nothing
336         END;
337
338         -- vandelay.*
339         -- Update with a rename to avoid collisions
340         FOR renamable_row in
341                 SELECT id, name
342                 FROM   vandelay.queue
343                 WHERE  owner = src_usr
344         LOOP
345                 suffix := ' (' || src_usr || ')';
346                 LOOP
347                         BEGIN
348                                 UPDATE  vandelay.queue
349                                 SET     owner = dest_usr, name = name || suffix
350                                 WHERE   id = renamable_row.id;
351                         EXCEPTION WHEN unique_violation THEN
352                                 suffix := suffix || ' ';
353                                 CONTINUE;
354                         END;
355                         EXIT;
356                 END LOOP;
357         END LOOP;
358
359 END;
360 $$ LANGUAGE plpgsql;
361 COMMIT;