1 package body FND_FILE_PRIVATE as
2 /* $Header: AFCPPPRB.pls 120.2.12020000.2 2012/07/13 20:37:39 pferguso ship $ */
3
4
5 LOG utl_file.file_type;
6 OUT utl_file.file_type;
7
8 BUFFER_SIZE constant number := 32500;
9
10 LOG_FNAME varchar2(255);
11 OUT_FNAME varchar2(255);
12 TEMP_DIR varchar2(255);
13
14 NEXT_LOG_LINE varchar2(32767);
15 NEXT_OUT_LINE varchar2(32767);
16
17 procedure log_simple_msg (level in number, fn in varchar2, msg in varchar2) is
18 BEGIN
19 if (level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
20 FND_LOG.STRING(level,'fnd.plsql.fnd_file_private.'||fn, 'sid:'||userenv('SESSIONID')||': '||msg);
21 end if;
22 end;
23
24
25 procedure PUT_NAMES(P_LOG in varchar2, P_OUT in varchar2, P_DIR in varchar2)
26 is
27 begin
28 LOG_FNAME := P_LOG;
29 OUT_FNAME := P_OUT;
30 TEMP_DIR := P_DIR;
31 end;
32
33
34 function OPEN_FILE(TYPE in varchar2) return boolean is
35 MAX_LINESIZE binary_integer := 32767;
36 UTL_FILE_REOPEN_DELAY number := 0;
37 begin
38
39 /* bug12954046 */
40 /* implement a delay before open operation takes place */
41 /* */
42 if FND_PROFILE.defined('CONC_UTL_FILE_REOPEN_DELAY') then
43 fnd_profile.get('CONC_UTL_FILE_REOPEN_DELAY', UTL_FILE_REOPEN_DELAY);
44 log_simple_msg(fnd_log.level_statement, 'init', 'UTL_FILE_REOPEN_DELAY ='|| UTL_FILE_REOPEN_DELAY);
45 end if;
46
47 if ((UTL_FILE_REOPEN_DELAY IS NOT NULL) and (UTL_FILE_REOPEN_DELAY > 0)) then
48 dbms_lock.sleep(UTL_FILE_REOPEN_DELAY);
49 end if;
50
51 if TYPE = 'OUT' and
52 OUT_FNAME is not null and
53 TEMP_DIR is not null then
54 OUT := utl_file.fopen(TEMP_DIR, OUT_FNAME, 'r', MAX_LINESIZE);
55 return TRUE;
56 elsif TYPE = 'LOG' and
57 LOG_FNAME is not null and
58 TEMP_DIR is not null then
59 LOG := utl_file.fopen(TEMP_DIR, LOG_FNAME, 'r', MAX_LINESIZE);
60 return TRUE;
61 else
62 return FALSE;
63 end if;
64
65 exception
66
67 when OTHERS then
68 return FALSE;
69
70 end OPEN_FILE;
71
72 procedure OPEN(LOGFILE in out NOCOPY varchar2,
73 OUTFILE in out NOCOPY varchar2) is
74 begin
75
76 OUTFILE := 'F';
77 LOGFILE := 'F';
78
79 NEXT_OUT_LINE := '';
80 NEXT_LOG_LINE := '';
81
82 if OPEN_FILE('LOG') = TRUE then
83 LOGFILE := 'T';
84 end if;
85
86 if OPEN_FILE('OUT') = TRUE then
87 OUTFILE := 'T';
88 end if;
89
90 end OPEN;
91
92 procedure LOGFILE_GET(STATUS in out NOCOPY varchar2,
93 TEXT in out NOCOPY varchar2) is
94 CR varchar2(2);
95 begin
96
97 CR := '
98 ';
99 TEXT := '';
100 while nvl(lengthb(TEXT), 0) + nvl(lengthb(NEXT_LOG_LINE), 0) < BUFFER_SIZE loop
101 TEXT := concat(TEXT, NEXT_LOG_LINE);
102 NEXT_LOG_LINE := '';
103 utl_file.get_line(LOG, NEXT_LOG_LINE);
104 NEXT_LOG_LINE := concat(NEXT_LOG_LINE, CR);
105 end loop;
106
107 STATUS := 'OK';
108
109 exception
110 when NO_DATA_FOUND then
111 if nvl(length(TEXT), 0) > 0 then
112 STATUS := 'OK';
113 return;
114 else
115 STATUS := 'EOF';
116 return;
117 end if;
118
119 when UTL_FILE.INVALID_FILEHANDLE then
120 fnd_message.set_name('FND', 'CONC-TEMPFILE_INVALID_HANDLE');
121 fnd_message.set_token('TEMP_FILE', LOG_FNAME, FALSE);
122 raise_application_error(-20104, fnd_message.get);
123
124 when UTL_FILE.INVALID_OPERATION then
125 fnd_message.set_name('FND', 'CONC-TEMPFILE_INVALID_OPERATN');
126 fnd_message.set_token('TEMP_FILE', LOG_FNAME, FALSE);
127 raise_application_error(-20105, fnd_message.get);
128
129 when UTL_FILE.READ_ERROR then
130 fnd_message.set_name('FND', 'CONC-TEMPFILE_READ_ERROR');
131 fnd_message.set_token('TEMP_FILE', LOG_FNAME, FALSE);
132 raise_application_error(-20106, fnd_message.get);
133
134
135 when OTHERS then
136 raise;
137
138 end LOGFILE_GET;
139
140 procedure OUTFILE_GET(STATUS in out NOCOPY varchar2,
141 TEXT in out NOCOPY varchar2) is
142 CR varchar2(2);
143 begin
144 CR := '
145 ';
146 TEXT := '';
147 while nvl(lengthb(TEXT), 0) + nvl(lengthb(NEXT_OUT_LINE), 0) < BUFFER_SIZE loop
148 TEXT := concat(TEXT, NEXT_OUT_LINE);
149 NEXT_OUT_LINE := '';
150 utl_file.get_line(OUT, NEXT_OUT_LINE);
151 NEXT_OUT_LINE := concat(NEXT_OUT_LINE, CR);
152 end loop;
153
154 STATUS := 'OK';
155 exception
156 when NO_DATA_FOUND then
157 if nvl(length(TEXT), 0) > 0 then
158 STATUS := 'OK';
159 return;
160 else
161 STATUS := 'EOF';
162 return;
163 end if;
164
165 when UTL_FILE.INVALID_FILEHANDLE then
166 fnd_message.set_name('FND', 'CONC-TEMPFILE_INVALID_HANDLE');
167 fnd_message.set_token('TEMP_FILE', OUT_FNAME, FALSE);
168 raise_application_error(-20104, fnd_message.get);
169
170 when UTL_FILE.INVALID_OPERATION then
171 fnd_message.set_name('FND', 'CONC-TEMPFILE_INVALID_OPERATN');
172 fnd_message.set_token('TEMP_FILE', OUT_FNAME, FALSE);
173 raise_application_error(-20105, fnd_message.get);
174
175 when UTL_FILE.READ_ERROR then
176 fnd_message.set_name('FND', 'CONC-TEMPFILE_READ_ERROR');
177 fnd_message.set_token('TEMP_FILE', OUT_FNAME, FALSE);
178 raise_application_error(-20106, fnd_message.get);
179
180 when OTHERS then
181 raise;
182
183 end OUTFILE_GET;
184
185 /*
186 ** CLOSE_FILE - close an open file and make it 0-length
187 ** unfortunately, we can't delete files on the server
188 ** deleting will have to be done with a cron job or something
189 **
190 ** IN
191 ** filetype - file to close log/out
192 ** RETURN
193 ** BOOLEAN - was file closed successfully ?
194 ** EXCEPTIONS
195 ** invalid_filehandle - not a valid file handle
196 ** write_error - OS error occured during write operation
197 */
198
199 function CLOSE_FILE(filetype in varchar2) return boolean is
200
201 begin
202
203 if (filetype = 'LOG') then
204 if (utl_file.is_open(LOG)) then
205 utl_file.fclose(LOG);
206 LOG := utl_file.fopen(TEMP_DIR, LOG_FNAME, 'w');
207 utl_file.fclose(LOG);
208 end if;
209 end if;
210
211 if (filetype = 'OUT') then
212 if (utl_file.is_open(OUT)) then
213 utl_file.fclose(OUT);
214 OUT := utl_file.fopen(TEMP_DIR, OUT_FNAME, 'w');
215 utl_file.fclose(OUT);
216 end if;
217 end if;
218
219 return TRUE;
220
221 exception
222 when UTL_FILE.INVALID_PATH then
223 fnd_message.set_name('FND', 'CONC-TEMPFILE_INVALID_PATH');
224 fnd_message.set_token('FILE_DIR', TEMP_DIR, FALSE);
225 raise_application_error(-20101, fnd_message.get);
226
227 when OTHERS then
228 raise;
229
230 return FALSE;
231
232 end CLOSE_FILE;
233
234 procedure CLOSE is
235 success boolean;
236 begin
237 begin
238 success := CLOSE_FILE('LOG');
239 exception
240 when OTHERS then
241 null;
242 end;
243 begin
244 success := CLOSE_FILE('OUT');
245 exception
246 when OTHERS then
247 null;
248 end;
249
250 end CLOSE;
251
252 end FND_FILE_PRIVATE;