Rem drv: Rem Rem $Header: http_session_pkgbody.sql 01-jul-2005.21:27:00 gsbhatia Exp $ Rem Rem http_session_pkgbody.sql Rem Rem Copyright (c) 2002, 2005, Oracle. All rights reserved. Rem Rem NAME Rem http_session_pkgbody.sql - Rem Rem DESCRIPTION Rem Rem Rem NOTES Rem This package has routines that support association of backend Rem objects with http sessions, and their removal when the session Rem expires Rem Rem MODIFIED Rem gsbhatia 07/01/05 - New repmgr header impl Rem skini 09/17/04 - skini_interactive_jobs Rem skini 09/14/04 - Deal with oms death Rem CREATE OR REPLACE PACKAGE BODY MGMT_HTTP_SESSION AS -- Associate the specified object with the specified http session. -- The object will be cleaned up when the session expires. PROCEDURE associate_object(p_object_type VARCHAR2, p_object_guid RAW, p_http_session VARCHAR2, p_oms_id NUMBER) IS BEGIN INSERT INTO MGMT_HTTP_SESSION_OBJECTS(session_id, object_type, object_guid, oms_failover_id) VALUES (p_http_session, p_object_type, p_object_guid, p_oms_id); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN -- Shouldn't happen, ignore if it does NULL; END; -- Call this procedure from the console when a http session expires PROCEDURE session_expired(p_http_session VARCHAR2) IS l_object_types SMP_EMD_STRING_ARRAY; l_callbacks SMP_EMD_STRING_ARRAY; BEGIN SELECT DISTINCT object_type BULK COLLECT INTO l_object_types FROM MGMT_HTTP_SESSION_OBJECTS WHERE session_id=p_http_session; IF l_object_types IS NOT NULL AND l_object_types.COUNT > 0 THEN FOR i IN 1..l_object_types.COUNT LOOP IF l_callbacks IS NOT NULL THEN l_callbacks.DELETE; l_callbacks := null; END IF; SELECT callback_name BULK COLLECT INTO l_callbacks FROM MGMT_HTTP_SESSION_CALLBACKS WHERE object_type=l_object_types(i); IF l_callbacks IS NOT NULL AND l_callbacks.COUNT > 0 THEN FOR j IN 1..l_callbacks.COUNT LOOP EXECUTE IMMEDIATE 'BEGIN ' || l_callbacks(j) || '(:1,:2); END;' USING l_object_types(i), p_http_session; END LOOP; END IF; END LOOP; DELETE FROM MGMT_HTTP_SESSION_OBJECTS WHERE session_id=p_http_session; END IF; END; PROCEDURE handle_oms_death(p_oms_id INTEGER, p_last_timestamp DATE) IS l_sessions SMP_EMD_STRING_ARRAY; BEGIN SELECT DISTINCT session_id BULK COLLECT INTO l_sessions FROM MGMT_HTTP_SESSION_OBJECTS WHERE oms_failover_id=p_oms_id; IF l_sessions IS NULL OR l_sessions.COUNT = 0 THEN RETURN; END IF; FOR i IN 1..l_sessions.COUNT LOOP session_expired(l_sessions(i)); END LOOP; END; -- Register a callback for the specified object type -- The callback should have the following signature: -- PROCEDURE callback(p_object_type VARCHAR2, p_http_session VARCHAR2); -- PROCEDURE register_expiry_callback(p_object_type VARCHAR2, p_callback VARCHAR2) IS BEGIN INSERT INTO MGMT_HTTP_SESSION_CALLBACKS(object_type, callback_name) VALUES (p_object_type, p_callback); END; END MGMT_HTTP_SESSION; / show errors;