--
-- cal_uid__upsert/3
--
create or replace function cal_uid__upsert(
p_cal_uid text,
p_activity_id integer,
p_ical_vars text
) returns void as $$
BEGIN
LOOP
--
-- We might have duplicates on the activity_id and on the cal_uid,
-- both should be unique.
--
update cal_uids
set ical_vars = p_ical_vars
where cal_uid = p_cal_uid;
IF found THEN
return;
END IF;
-- not there, so try to insert the key
-- if someone else inserts the same key concurrently,
-- we could get a unique-key failure
BEGIN
-- Try to delete entry to avoid duplicates (might fail)
delete from cal_uids where on_which_activity = p_activity_id;
-- Insert value
insert into cal_uids
(cal_uid, on_which_activity, ical_vars)
values
(p_cal_uid, p_activity_id, p_ical_vars);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- Do nothing, and loop to try the UPDATE again.
END;
END LOOP;
END;
$$ language plpgsql;