1 package body FND_LOG_ATTACHMENT as
2 /* $Header: AFUTLGTB.pls 115.3 2004/05/05 02:06:53 kkapur noship $ */
3
4 TYPE AttachmentsCache IS TABLE of LONG RAW
5 INDEX BY BINARY_INTEGER;
6 mCache AttachmentsCache;
7
8 /**
9 ** Flushes the buffered messages
10 */
11 PROCEDURE FLUSH(PATTACHMENT_ID IN NUMBER) is
12 pragma AUTONOMOUS_TRANSACTION;
13 myvar LONG RAW := NULL;
14 mylen number;
15 myblob BLOB;
16 begin
17 if (mCache.exists(PATTACHMENT_ID)) then
18 FND_LOG_REPOSITORY.GET_BLOB_INTERNAL(PATTACHMENT_ID, myblob);
19 myvar := mCache(PATTACHMENT_ID);
20 mylen := UTL_RAW.length(myvar);
21 if ( mylen > 0 ) then
22 if( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
23 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, 'fnd.plsql.fnd_log_attachment.flush',
24 'log_sequence=' || PATTACHMENT_ID || '; Message len=' || mylen);
25 end if;
26 DBMS_LOB.WRITEAPPEND(myblob, mylen, myvar);
27 commit;
28 end if;
29 end if;
30 end FLUSH;
31
32 /**
33 ** Adds the message to the buffer
34 */
35 PROCEDURE PUT_BUFFER(PATTACHMENT_ID IN NUMBER, PMESSAGE IN VARCHAR2) is
36 myvar LONG RAW;
37 myinmsg LONG RAW;
38 mylen NUMBER;
39 begin
40 if (mCache.exists(PATTACHMENT_ID)) then
41 myvar := mCache(PATTACHMENT_ID);
42 myinmsg := UTL_RAW.CAST_TO_RAW(CONVERT(PMESSAGE, 'US7ASCII'));
43 mylen := UTL_RAW.length(myvar) + UTL_RAW.length(myinmsg);
44 if ( mylen >= 10000 ) then
45 flush(PATTACHMENT_ID);
46 mCache(PATTACHMENT_ID) := myinmsg;
47 else
48 mCache(PATTACHMENT_ID) := UTL_RAW.CONCAT(myvar, myinmsg);
49 end if;
50 elsif (PATTACHMENT_ID > 0) then
51 mCache(PATTACHMENT_ID) := UTL_RAW.CAST_TO_RAW(CONVERT(PMESSAGE, 'US7ASCII'));
52 end if;
53 end PUT_BUFFER;
54
55 /**
56 ** Adds the message to the buffer
57 */
58 PROCEDURE PUT_BUFFER_RAW(PATTACHMENT_ID IN NUMBER, PMESSAGE IN LONG RAW) is
59 myvar LONG RAW;
60 mylen NUMBER;
61 begin
62 if (mCache.exists(PATTACHMENT_ID)) then
63 myvar := mCache(PATTACHMENT_ID);
64 mylen := UTL_RAW.length(myvar) + UTL_RAW.length(PMESSAGE);
65 if ( mylen >= 10000 ) then
66 flush(PATTACHMENT_ID);
67 mCache(PATTACHMENT_ID) := PMESSAGE;
68 else
69 mCache(PATTACHMENT_ID) := UTL_RAW.CONCAT(myvar, PMESSAGE);
70 end if;
71 elsif (PATTACHMENT_ID > 0) then
72 mCache(PATTACHMENT_ID) := PMESSAGE;
73 end if;
74 end PUT_BUFFER_RAW;
75
76 /**
77 ** Writes PMESSAGE to the Attachment
78 ** For performance, messages are buffered in memory
79 ** until the buffer limit (default 10000) is reached or
80 ** CLOSE(..) is called.
81 */
82 PROCEDURE WRITE(PATTACHMENT_ID IN NUMBER, PMESSAGE IN VARCHAR2) is
83 begin
84 PUT_BUFFER(PATTACHMENT_ID, PMESSAGE);
85 end WRITE;
86
87 /**
88 ** Writes PMESSAGE (appended with newline) to the Attachment
89 ** For performance, messages are buffered in memory
90 ** until the buffer limit (default 10000) is reached or
91 ** CLOSE(..) is called.
92 */
93 PROCEDURE WRITELN(PATTACHMENT_ID IN NUMBER, PMESSAGE IN VARCHAR2) is
94 begin
95 WRITE(PATTACHMENT_ID, PMESSAGE || fnd_global.newline);
96 end WRITELN;
97
98 /**
99 ** Writes RAW PMESSAGE to the Attachment
100 ** For performance, data is buffered in memory
101 ** until the buffer limit (default 10000) is reached or
102 ** CLOSE(..) is called.
103 */
104 PROCEDURE WRITE_RAW(PATTACHMENT_ID IN NUMBER, PMESSAGE IN LONG RAW) is
105 begin
106 PUT_BUFFER_RAW(PATTACHMENT_ID, PMESSAGE);
107 end WRITE_RAW;
108
109 /**
110 ** Writes PMESSAGE to the Attachment.
111 ** For AOL/J Internal use Only!
112 ** (Called from AppsLog.java)
113 */
114 PROCEDURE WRITE_INTERNAL(PATTACHMENT_ID IN NUMBER, PMESSAGE IN FND_TABLE_OF_RAW_2000,
115 PCHARSET IN VARCHAR2, PMIMETYPE IN VARCHAR2,
116 PENCODING IN VARCHAR2, PLANG IN VARCHAR2,
117 PFILE_EXTN IN VARCHAR2, PDESC IN VARCHAR2) is
118 pragma AUTONOMOUS_TRANSACTION;
119 myblob BLOB;
120 table_len number;
121 msg_len number;
122 i number;
123 begin
124 if ( PATTACHMENT_ID > 0 ) then
125 flush(PATTACHMENT_ID);
126 table_len := PMESSAGE.COUNT;
127 FND_LOG_REPOSITORY.GET_BLOB_INTERNAL(PATTACHMENT_ID, myblob, PCHARSET,
128 PMIMETYPE, PENCODING, PLANG, PFILE_EXTN, PDESC);
129 if ( myblob is not NULL ) then
130 FOR i IN 1..table_len LOOP
131 msg_len := UTL_RAW.LENGTH(PMESSAGE(i));
132 if( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
133 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, 'fnd.plsql.fnd_log_attachment.write',
134 'log_sequence=' || PATTACHMENT_ID || '; LoopCtr=' || i ||
135 '; Message len=' || msg_len);
136 end if;
137 if ( msg_len > 0 ) then
138 DBMS_LOB.WRITEAPPEND(myblob, msg_len, PMESSAGE(i));
139 end if;
140 END LOOP;
141 commit;
142 end if;
143 end if;
144 end WRITE_INTERNAL;
145
146 /**
147 ** Flushes the Attachment buffer and closes the Attachment
148 */
149 PROCEDURE CLOSE(PATTACHMENT_ID IN NUMBER) is
150 begin
151 flush(PATTACHMENT_ID);
152 mCache.delete(PATTACHMENT_ID);
153 end CLOSE;
154
155 end FND_LOG_ATTACHMENT;