CREATE TABLE IF NOT EXISTS cal_uids ( -- primary key cal_uid text constraint cal_uid_pk primary key, on_which_activity integer constraint cal_uid_fk not null references acs_activities on delete cascade, ical_vars text ); --- --- The new ical_vars are now triples, containing the tag name, the tag --- parameters and the value. Previously it wer just pairs. --- UPDATE cal_uids SET ical_vars = NULL; select define_function_args('cal_uid__upsert','cal_uid,activity_id,ical_vars'); 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;