-- -- sec_session_property__upsert/6 -- create or replace function sec_session_property__upsert( p_session_id bigint, p_module character varying, p_name character varying, p_value character varying, 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;