select define_function_args('sec_session_property__upsert','session_id,module,name,secure_p,last_hit');
CREATE OR REPLACE FUNCTION sec_session_property__upsert(
p_session_id bigint,
p_module varchar,
p_name varchar,
p_value varchar,
p_secure_p boolean,
p_last_hit integer
) RETURNS void as
$$
BEGIN
LOOP
-- first try to update the key
update sec_session_properties
set property_value = p_value, secure_p = p_secure_p, last_hit = p_last_hit
where session_id = p_session_id and module = p_module and property_name = p_name;
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
insert into sec_session_properties
(session_id, module, property_name, secure_p, last_hit)
values (p_session_id, p_module, p_name, p_secure_p, p_last_hit);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- Do nothing, and loop to try the UPDATE again.
END;
END LOOP;
END;
$$ LANGUAGE plpgsql;