DBA Data[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;