[Home] [Help]
PACKAGE BODY: APPS.IBC_DEBUG_PVT
Source
1 PACKAGE BODY IBC_DEBUG_PVT AS
2 /* $Header: ibcdbugb.pls 115.3 2003/08/14 18:35:38 enunez ship $ */
3
4 TYPE t_table_vc100 IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
5
6 g_stack_level NUMBER := 0;
7 g_stack_processes t_table_vc100;
8 g_debug_type VARCHAR2(30);
9 g_debug_output_dir VARCHAR2(80);
10 g_output_file_ptr utl_file.file_type;
11
12 PROCEDURE put_message(p_message IN VARCHAR2)
13 IS
14 BEGIN
15 IF g_debug_type = 'PIPE' THEN
16 DBMS_PIPE.pack_message(p_message);
17 ELSIF g_debug_type = 'FILE' THEN
18 utl_file.put_line(g_output_file_ptr, p_message);
19 END IF;
20 END put_message;
21
22 -- --------------------------------------------------------------------
23 -- PROCEDURE: Init_Debug
24 -- DESCRIPTION: Initialize debugging mode depending upon profile
25 -- settings.
26 -- --------------------------------------------------------------------
27 PROCEDURE Init_Debug IS
28 BEGIN
29 g_stack_level := 0;
30 g_stack_processes.delete;
31 FND_PROFILE.get('IBC_DEBUG_TYPE',g_debug_type);
32 FND_PROFILE.get('IBC_DEBUG_OUTPUT_DIR',g_debug_output_dir);
33 IF g_debug_type = 'FILE' THEN
34 g_output_file_ptr := utl_file.fopen(g_debug_output_dir, 'IBC_' || FND_GLOBAL.USER_NAME || '.log', 'a');
35 put_message('');
36 put_message('<DEBUG TIMESTAMP="' || TO_CHAR(SYSDATE, 'YYYYMMDD HH:MI:SS') || '">');
37 END IF;
38 END Init_Debug;
39
40 -- --------------------------------------------------------------------
41 -- FUNCTION: Debug_Enabled
42 -- DESCRIPTION: Returns TRUE if debug is enabled for current user
43 -- based upon profile values, FALSE otherwise.
44 -- --------------------------------------------------------------------
45 FUNCTION Debug_Enabled
46 RETURN BOOLEAN
47 IS
48 l_debug_option VARCHAR2(10);
49 BEGIN
50 FND_PROFILE.get('IBC_DEBUG', l_debug_option);
51 RETURN l_debug_option = 'Y';
52 END Debug_Enabled;
53
54 PROCEDURE debug_flush IS
55 l_pipe_result NUMBER;
56 BEGIN
57 IF g_debug_type = 'PIPE' THEN
58 l_pipe_result := DBMS_PIPE.send_message(pipename => 'IBC_DEBUG:' || FND_GLOBAL.user_name,
59 maxpipesize => 8192);
60 ELSIF g_debug_type = 'FILE' THEN
61 utl_file.fflush(g_output_file_ptr);
62 END IF;
63 END debug_flush;
64
65 PROCEDURE debug_close IS
66 BEGIN
67 IF g_debug_type = 'FILE' THEN
68 put_message('</DEBUG>');
69 put_message('');
70 utl_file.fclose(g_output_file_ptr);
71 END IF;
72 END debug_close;
73
74 -- --------------------------------------------------------------------
75 -- PROCEDURE: Start_Process
76 -- DESCRIPTION: Marks the begin point of a procedure/function,
77 -- This is used to keep a stack of calls.
78 -- This procedure should be called at the begining of a
79 -- procedure or function.
80 -- --------------------------------------------------------------------
81 PROCEDURE Start_Process(p_proc_type IN VARCHAR2,
82 p_proc_name IN VARCHAR2,
83 p_parms IN VARCHAR2)
84 IS
85 l_pipe_result NUMBER;
86 l_parms VARCHAR2(32767);
87 l_pos_lf NUMBER;
88 l_count NUMBER;
89 BEGIN
90
91 IF Debug_Enabled THEN
92 IF g_stack_level = 0 THEN
93 Init_Debug;
94 END IF;
95 g_stack_level := g_stack_level + 1;
96 g_stack_processes(g_stack_level) := p_proc_name;
97
98 put_message(LPAD(' ', g_stack_level * 3, ' ') ||
99 '<CALL TYPE="' || p_proc_type || '" NAME="' || p_proc_name ||
100 '" TIMESTAMP="' ||
101 TO_CHAR(SYSDATE, 'YYYYMMDD HH:MI:SS') ||
102 '">' );
103 IF p_parms IS NOT NULL THEN
104 l_parms := p_parms;
105 l_count := 0;
106 LOOP
107 l_pos_lf := INSTR(l_parms, FND_GLOBAL.local_chr(13));
108 IF l_pos_lf > 0 THEN
109 IF l_count = 0 THEN
110 put_message(LPAD(' ', (g_stack_level + 1) * 3, ' ') ||
111 SUBSTR(l_parms, 1, l_pos_lf - 1));
112 ELSE
113 put_message(LPAD(' ', (g_stack_level + 2) * 3, ' ') ||
114 SUBSTR(l_parms, 1, l_pos_lf - 1));
115 END IF;
116 l_parms := SUBSTR(l_parms, l_pos_lf + 1);
117 ELSE
118 put_message(LPAD(' ', (g_stack_level + 1) * 3, ' ') || l_parms);
119 END IF;
120 EXIT WHEN l_pos_lf = 0;
121 l_count := l_count + 1;
122 END LOOP;
123 END IF;
124 debug_flush;
125 END IF;
126
127 END;
128
129 -- --------------------------------------------------------------------
130 -- PROCEDURE: Debug_Message
131 -- DESCRIPTION: Outputs p_message in case debug is enabled.
132 -- --------------------------------------------------------------------
133 PROCEDURE Debug_Message(p_message IN VARCHAR2) IS
134 l_pipe_result NUMBER;
135 BEGIN
136 IF Debug_Enabled THEN
137 put_message(LPAD(' ', (g_stack_level + 1) * 3, ' ') ||
138 p_message);
139 debug_flush;
140 END IF;
141 END Debug_Message;
142
143 -- --------------------------------------------------------------------
144 -- FUNCTION: Make_List
145 -- DESCRIPTION: Makes a list of values (enclosed in [] and separated
146 -- commas) from a JTF table being passed.
147 -- Useful when debugging the content of JTF tables being
148 -- passed as parameters.
149 -- Returns the list.
150 -- --------------------------------------------------------------------
151 FUNCTION Make_List(p_values IN JTF_NUMBER_TABLE)
152 RETURN VARCHAR2
153 IS
154 l_result VARCHAR2(32767);
155 BEGIN
156 l_result := NULL;
157 IF p_values IS NOT NULL THEN
158 FOR I IN 1..p_values.COUNT LOOP
159 IF l_result IS NULL THEN
160 l_result := '[' || p_values(I) || ']';
161 ELSE
162 l_result := l_result || ',[' || p_values(I) || ']';
163 END IF;
164 END LOOP;
165 END IF;
166 RETURN l_result;
167 END Make_List;
168
169 -- Overloaded
170 FUNCTION Make_List(p_values IN JTF_VARCHAR2_TABLE_100)
171 RETURN VARCHAR2
172 IS
173 l_result VARCHAR2(32767);
174 BEGIN
175 l_result := NULL;
176 IF p_values IS NOT NULL THEN
177 FOR I IN 1..p_values.COUNT LOOP
178 IF l_result IS NULL THEN
179 l_result := '[' || p_values(I) || ']';
180 ELSE
181 l_result := l_result || ',[' || p_values(I) || ']';
182 END IF;
183 END LOOP;
184 END IF;
185 RETURN l_result;
186 END Make_List;
187
188 -- Overloaded
189 FUNCTION Make_List(p_values IN JTF_VARCHAR2_TABLE_300)
190 RETURN VARCHAR2
191 IS
192 l_result VARCHAR2(32767);
193 BEGIN
194 l_result := NULL;
195 IF p_values IS NOT NULL THEN
196 FOR I IN 1..p_values.COUNT LOOP
197 IF l_result IS NULL THEN
198 l_result := '[' || p_values(I) || ']';
199 ELSE
200 l_result := l_result || ',[' || p_values(I) || ']';
201 END IF;
202 END LOOP;
203 END IF;
204 RETURN l_result;
205 END Make_List;
206
207 -- Overloaded
208 FUNCTION Make_List(p_values IN JTF_VARCHAR2_TABLE_4000)
209 RETURN VARCHAR2
210 IS
211 l_result VARCHAR2(32767);
212 BEGIN
213 l_result := NULL;
214 IF p_values IS NOT NULL THEN
215 FOR I IN 1..p_values.COUNT LOOP
216 IF l_result IS NULL THEN
217 l_result := '[' || p_values(I) || ']';
218 ELSE
219 l_result := l_result || ',[' || p_values(I) || ']';
220 END IF;
221 END LOOP;
222 END IF;
223 RETURN l_result;
224 END Make_List;
225
226 -- for JTF_VARCHAR2_TABLE_32767
227 FUNCTION Make_List_VC32767(p_values IN JTF_VARCHAR2_TABLE_32767)
228 RETURN VARCHAR2
229 IS
230 l_result VARCHAR2(32767);
231 BEGIN
232 l_result := NULL;
233 IF p_values IS NOT NULL THEN
234 FOR I IN 1..p_values.COUNT LOOP
235 IF LENGTH(p_values(I)) > 4000 THEN
236 IF l_result IS NULL THEN
237 l_result := '[' || SUBSTR(p_values(I), 1, 25) || '...' || ']';
238 ELSE
239 l_result := l_result || ',[' || SUBSTR(p_values(I), 1, 25) || '...' || ']';
240 END IF;
241 ELSE
242 IF l_result IS NULL THEN
243 l_result := '[' || p_values(I) || ']';
244 ELSE
245 l_result := l_result || ',[' || p_values(I) || ']';
246 END IF;
247 END IF;
248
249 END LOOP;
250 END IF;
251 RETURN l_result;
252 END Make_List_VC32767;
253
254 -- --------------------------------------------------------------------
255 -- FUNCTION: Make_Parameter_List
256 -- DESCRIPTION: Creates a parameter list (with tags for each parameter)
257 -- Useful when calling Start_PRocess for "parms" parameter
258 -- --------------------------------------------------------------------
259 FUNCTION Make_Parameter_List(p_tag IN VARCHAR2,
260 p_parms IN JTF_VARCHAR2_TABLE_4000)
261 RETURN VARCHAR2
262 IS
263 l_result VARCHAR2(32000);
264 BEGIN
265 IF Debug_Enabled THEN
266 IF p_parms IS NOT NULL THEN
267 l_result := '<' || p_tag || '>';
268 FOR I IN 1..p_parms.COUNT LOOP
269 IF I MOD 2 <> 0 THEN
270 l_result := l_result || FND_GLOBAL.local_chr(13) ||
271 '<' || p_parms(I) || '>';
272 ELSE
273 l_result := l_result || p_parms(I) ||
274 '</' || p_parms(I-1) || '>';
275 END IF;
276 END LOOP;
277 l_result := l_result || FND_GLOBAL.local_chr(13) || '</' || p_tag || '>';
278 END IF;
279 END IF;
280 RETURN l_result;
281 END;
282
283 FUNCTION Make_Parameter_List(p_tag IN VARCHAR2,
284 p_parms IN JTF_VARCHAR2_TABLE_32767)
285 RETURN VARCHAR2
286 IS
287 l_result VARCHAR2(32767);
288 BEGIN
289 IF Debug_Enabled THEN
290 IF p_parms IS NOT NULL THEN
291 l_result := '<' || p_tag || '>';
292 FOR I IN 1..p_parms.COUNT LOOP
293 IF I MOD 2 <> 0 THEN
294 l_result := l_result || FND_GLOBAL.local_chr(13) ||
295 '<' || p_parms(I) || '>';
296 ELSE
297 l_result := l_result || p_parms(I) ||
298 '</' || p_parms(I-1) || '>';
299 END IF;
300 END LOOP;
301 l_result := l_result || FND_GLOBAL.local_chr(13) || '</' || p_tag || '>';
302 END IF;
303 END IF;
304 RETURN l_result;
305 END;
306
307 -- --------------------------------------------------------------------
308 -- PROCEDURE: End_Process
309 -- DESCRIPTION: Signals the end of a process (PROCEDURE or FUNCTION)
310 -- This procedure should be called at the end of a
311 -- procedure or function.
312 -- --------------------------------------------------------------------
313 PROCEDURE End_Process(p_output_list IN VARCHAR2 := NULL)
314 IS
315 l_current_level NUMBER;
316 l_output_list VARCHAR2(20000);
317 l_pos_lf NUMBER;
318 l_count NUMBER;
319 BEGIN
320 IF Debug_Enabled AND g_stack_level > 0 THEN
321 l_current_level := g_stack_processes.COUNT;
322
323 IF p_output_list IS NOT NULL THEN
324 l_output_list := p_output_list;
325 l_count := 0;
326 LOOP
327 l_pos_lf := INSTR(l_output_list, FND_GLOBAL.local_chr(13));
328 IF l_pos_lf > 0 THEN
329 IF l_count = 0 THEN
330 put_message(LPAD(' ', (g_stack_level + 1) * 3, ' ') ||
331 SUBSTR(l_output_list, 1, l_pos_lf - 1));
332 ELSE
333 put_message(LPAD(' ', (g_stack_level + 2) * 3, ' ') ||
334 SUBSTR(l_output_list, 1, l_pos_lf - 1));
335 END IF;
336 l_output_list := SUBSTR(l_output_list, l_pos_lf + 1);
337 ELSE
338 put_message(LPAD(' ', (g_stack_level + 1) * 3, ' ') ||l_output_list);
339 END IF;
340 EXIT WHEN l_pos_lf = 0;
341 l_count := l_count + 1;
342 END LOOP;
343 END IF;
344
345 put_message(LPAD(' ', (g_stack_level + 1) * 3, ' ') ||
346 '<END TIMESTAMP="' ||
347 TO_CHAR(SYSDATE, 'YYYYMMDD HH:MI:SS') ||
348 '"/>');
349 put_message(LPAD(' ', g_stack_level * 3, ' ') ||
350 '</CALL>');
351 debug_flush;
352 g_stack_processes.delete(l_current_level);
353 g_stack_level := g_stack_level - 1;
354 IF g_stack_level = 0 THEN
355 debug_close;
356 END IF;
357 END IF;
358 END;
359
360 -- --------------------------------------------------------------------
361 -- PROCEDURE: Terminate_Stack
362 -- DESCRIPTION: Flushes all Processes in the stack
363 -- Useful when catching exceptions, and finishing the
364 -- debugging.
365 -- --------------------------------------------------------------------
366 PROCEDURE Terminate_Stack
367 IS
368 l_current_level NUMBER;
369 BEGIN
370 IF Debug_Enabled THEN
371 l_current_level := g_stack_processes.COUNT;
372 FOR I IN REVERSE l_current_level..1 LOOP
373 put_message('<STATUS>TERMINATED</STATUS>');
374 put_message('</' || g_stack_processes(I) || '>');
375 g_stack_processes.delete(I);
376 g_stack_level := g_stack_level - 1;
377 END LOOP;
378 debug_flush;
379 debug_close;
380 END IF;
381 END Terminate_Stack;
382
383 END IBC_DEBUG_PVT;