DBA Data[Home] [Help]

PACKAGE BODY: APPS.XNP_TIMER

Source


1 PACKAGE BODY xnp_timer AS
2 /* $Header: XNPTIMRB.pls 120.2 2006/02/13 07:57:10 dputhiye ship $ */
3 
4 /* forward declarations */
5 PROCEDURE add_timer (
6 	p_msg_header IN xnp_message.msg_header_rec_type,
7 	p_msg_text IN VARCHAR2,
8 	p_dummy_for IN VARCHAR2 DEFAULT NULL,
9 	x_error_code OUT NOCOPY NUMBER,
10 	x_error_message OUT NOCOPY VARCHAR2 ) ;
11 
12 /* end forward declarations */
13 
14 --------------------------------------------------------------------------
15 ---- PROCEDURE:   start_timer()
16 ---- PURPOSE:     Checks the delay and the interval, if delay is greater
17 ----              than zero, introduces a dummy timer into the system.
18 ----              Otherwise enqueues the actual timer.
19 --------------------------------------------------------------------------
20 PROCEDURE start_timer (
21 
22 	p_msg_header IN xnp_message.msg_header_rec_type
23 	,p_msg_text IN VARCHAR2
24 	,x_error_code OUT NOCOPY NUMBER
25 	,x_error_message OUT NOCOPY VARCHAR2
26 
27 )
28 IS
29 
30 	l_delay NUMBER := 0 ;
31 	l_interval NUMBER  := 0 ;
32 
33 	l_temp VARCHAR2(1024) ;
34 	l_msg_header  xnp_message.msg_header_rec_type;
35 	l_msg_text  VARCHAR2(32767) ;
36 
37 	l_payload varchar2(32767) ;
38 
39 BEGIN
40 	x_error_code := 0;
41 	x_error_message := NULL;
42 
43 
44 	xnp_xml_utils.decode(p_msg_text,'DELAY',l_temp) ;
45 	l_delay := TO_NUMBER(l_temp) ;
46 
47 	xnp_xml_utils.decode(p_msg_text,'INTERVAL',l_temp) ;
48 	l_interval := TO_NUMBER(l_temp) ;
49 
50 
51 	IF (l_delay <= 0) THEN
52 
53 		add_timer(p_msg_header => p_msg_header,
54 			p_msg_text => p_msg_text,
55 			x_error_code => x_error_code,
56 			x_error_message => x_error_message);
57 	ELSE
58 		xnp_xml_utils.decode(p_msg_text,
59 			p_msg_header.message_code,
60 			l_payload) ;
61 
62 		xnp_t_dummy_u.create_msg(x_msg_header => l_msg_header,
63 			x_msg_text => l_msg_text,
64 			x_error_code => x_error_code,
65 			x_error_message => x_error_message,
66 			p_sender_name => p_msg_header.sender_name,
67 			p_recipient_list => p_msg_header.recipient_name,
68 			p_version => p_msg_header.version,
69 			p_reference_id => p_msg_header.reference_id,
70 			p_opp_reference_id => p_msg_header.opp_reference_id,
71 			p_order_id => p_msg_header.order_id,
72 			p_wi_instance_id => p_msg_header.wi_instance_id,
73 			p_fa_instance_id => p_msg_header.fa_instance_id,
74 			p_delay => 0,
75 			p_interval => l_delay,
76 			xnp$payload => l_payload);
77 
78 		IF (x_error_code = 0) THEN
79 
80 			add_timer(p_msg_header => l_msg_header,
81 				p_msg_text => l_msg_text,
82 				p_dummy_for => p_msg_header.message_code,
83 				x_error_code => x_error_code,
84 				x_error_message => x_error_message);
85 
86 		END IF ;
87 
88 	END IF ;
89 
90 END start_timer;
91 
92 ---------------------------------------------------------------------
93 -- Purpose:	Bug # 1351421
94 --			Get the timer_id for the ACTIVE timer with
95 -- 			same reference_id and timer_message_code.
96 --			checks both for DUMMY and the actual timer
97 --			and wrt both DUMMY and actual timer.
98 -- Caller:	add_to_registry
99 ----------------------------------------------------------------------
100 
101 PROCEDURE get_active_timer(
102   p_msg_header IN xnp_message.msg_header_rec_type,
103   p_dummy_for IN VARCHAR2,
104   p_timer_id OUT NOCOPY NUMBER,
105   x_error_code OUT NOCOPY NUMBER,
106   x_error_message OUT NOCOPY VARCHAR2)
107 IS
108   CURSOR c_timer_reg(p_message_code IN VARCHAR2) IS
109     SELECT timer_id,timer_message_code,next_timer
110     FROM  xnp_timer_registry
111     WHERE
112           reference_id=p_msg_header.reference_id
113     AND
114     (
115           timer_message_code = p_message_code
116        OR
117           next_timer= p_message_code
118     )
119     AND   status = 'ACTIVE';
120 
121    l_msg_code VARCHAR2(20); -- AS PER XNP_TIMER_REGISTRY.TIMER_MESSAGE_CODE
122 BEGIN
123   x_error_code := 0;
124   IF p_dummy_for IS NULL THEN
125   	l_msg_code := p_msg_header.message_code;
126   ELSE
127   	l_msg_code := p_dummy_for;
128   END IF;
129 
130   FOR rec in c_timer_reg(l_msg_code)
131     LOOP
132        p_timer_id := rec.timer_id;
133        EXIT;
134     END LOOP;
135 EXCEPTION
136   WHEN OTHERS THEN
137       x_error_code := SQLCODE;
138       x_error_message := SQLERRM;
139 END;
140 
141 -------------------------------------------------------------------------
142 ---- PROCEDURE:   add_timer()
143 ---- PURPOSE:     Adds the timer to the queue and to the registry.
144 -------------------------------------------------------------------------
145 PROCEDURE add_timer (
146 	p_msg_header IN xnp_message.msg_header_rec_type,
147 	p_msg_text IN VARCHAR2,
148 	p_dummy_for IN VARCHAR2 DEFAULT NULL,
149 	x_error_code OUT NOCOPY NUMBER,
150 	x_error_message OUT NOCOPY VARCHAR2 )
151 
152 IS
153 
154 	l_interval  NUMBER ;
155 	l_interval_txt  VARCHAR2(1024) ;
156 	l_dummy_text VARCHAR2(32767) ;
157 
158 	l_status VARCHAR2(1024) ;
159 	l_timer_id NUMBER ;
160 
161 	l_start_time DATE ;
162 	l_end_time DATE ;
163 
164 BEGIN
165 
166 	-- Bug # 1351421
167 	-- Check if there is a ACTIVE timer already fired for
168 	-- same reference_id and message_code
169 	-- If so remove that timer.
170 	-- Note that add_timer is called both for dummy as well
171 	-- as the actual timer.  For each case need to take care
172 	-- of earlier DUMMY or actual timers.
173 
174 
175 	get_active_timer(
176 		p_msg_header => p_msg_header,
177 		p_dummy_for => p_dummy_for,
178 		p_timer_id => l_timer_id,
179 		x_error_code => x_error_code,
180 		x_error_message => x_error_message);
181 
182 	IF (x_error_code <> 0) THEN
183 		return;
184 	ELSE
185 		IF l_timer_id IS NOT NULL THEN
186 			xnp_timer_core.remove_timer(
187 				p_timer_id => l_timer_id,
188 				x_error_code => x_error_code,
189 				x_error_message => x_error_message) ;
190 
191 			IF (x_error_code <> 0) THEN
192 				RETURN ;
193 			END IF ;
194 		END IF;
195 	END IF;
196 
197 	IF (p_msg_header.message_code = 'T_DUMMY') THEN
198 
199 		xnp_xml_utils.decode(p_msg_text,'T_DUMMY',l_dummy_text);
200 
201 		xnp_xml_utils.decode(l_dummy_text, 'INTERVAL',
202 			l_interval_txt) ;
203 	ELSE
204 
205 		xnp_xml_utils.decode(p_msg_text, 'INTERVAL', l_interval_txt) ;
206 
207 	END IF ;
208 
209 	l_interval := TO_NUMBER(l_interval_txt) ;
210 
211 	xnp_message.push(p_msg_header => p_msg_header,
212 		p_body_text => p_msg_text,
213 		p_queue_name => xnp_event.c_timer_q,
214 		p_priority => 1,
215 		p_delay => l_interval,
216 		p_commit_mode => xnp_message.c_on_commit) ;
217 
218 
219 	l_start_time := SYSDATE ;
220 	l_end_time := l_start_time + (l_interval/86400) ; --24*3600 replaced by 86400
221 
222 	INSERT INTO xnp_timer_registry (
223 		timer_id,
224 		reference_id,
225 		timer_message_code,
226 		status,
227 		start_time,
228 		end_time,
229 		next_timer,
230 		order_id,
231 		wi_instance_id,
232 		fa_instance_id,
233 		created_by,
234 		creation_date,
235 		last_updated_by,
236 		last_update_date
237 	)
238 	VALUES (
239 		p_msg_header.message_id,
240 		p_msg_header.reference_id,
241 		p_msg_header.message_code,
242 		'ACTIVE',
243 		l_start_time,
244 		l_end_time,
245 		p_dummy_for,
246 		p_msg_header.order_id,
247 		p_msg_header.wi_instance_id,
248 		p_msg_header.fa_instance_id,
249 		fnd_global.user_id,
250 		sysdate,
251 		fnd_global.user_id,
252 		sysdate
253 		);
254 
255 EXCEPTION
256 	WHEN OTHERS THEN
257 		x_error_code := SQLCODE ;
258 		x_error_message := SQLERRM ;
259 
260 END add_timer ;
261 
262 
263 END xnp_timer;