1 package body FND_FILE as
2 /* $Header: AFCPPIOB.pls 120.4 2006/05/24 05:34:03 anittala ship $ */
3
4
5 F_LOG utl_file.file_type;
6 F_OUT utl_file.file_type;
7
8 LOG_FNAME varchar2(255);
9 OUT_FNAME varchar2(255);
10 TEMP_DIR varchar2(255);
11
12 LOG_OPEN boolean := FALSE;
13 OUT_OPEN boolean := FALSE;
14
15 -- Making this function as AUTONOMOUS transaction.
16 -- Now we can call GET_BASE at any stage(begining/middle/end)
17 -- of the concurrent program execution. Otherwise we will be commiting the
18 -- concurrent program transaction.
19 function GET_BASE return varchar2 is
20 base_orig varchar2(12);
21 BASE varchar2(12);
22 PRAGMA AUTONOMOUS_TRANSACTION;
23 begin
24 /* Bug 2446909: Delete corrupted filenames from fnd_temp_files */
25 select filename, lpad(filename, 7, '0')
26 into base_orig, BASE
27 from fnd_temp_files
28 where type = 'P' and rownum = 1
29 for update of filename;
30
31 delete from fnd_temp_files
32 where filename = base_orig;
33
34 delete from fnd_temp_files
35 where filename = BASE;
36
37 commit;
38
39 return BASE;
40
41 exception
42 when OTHERS then
43 if (Sql%NotFound) then
44 select lpad(to_char(fnd_temp_files_s.nextval), 7, '0')
45 into BASE
46 from sys.dual;
47 end if;
48
49 commit;
50 return BASE;
51
52 end GET_BASE;
53
54 function GET_TEMP_NAME(WHICH in varchar2) return varchar2 is
55 FNAME varchar2(255);
56 begin
57 if WHICH = 'LOG' then
58 if LOG_FNAME is not null then
59 return LOG_FNAME;
60 else
61 return 'l' || GET_BASE || '.tmp';
62 end if;
63 else
64 if OUT_FNAME is not null then
65 return OUT_FNAME;
66 else
67 return 'o' || GET_BASE || '.tmp';
68 end if;
69 end if;
70
71 end GET_TEMP_NAME;
72
73
74 /*
75 ** OPEN_FILES - open or create temporary log and output files
76 **
77 ** EXCEPTIONS
78 ** utl_file.invalid_path - file location or name was invalid
79 ** utl_file.invalid_mode - the open_mode string was invalid
80 ** utl_file.invalid_operation - file could not be opened as requested
81 ** utl_file.invalid_maxlinesize - specified max line size is too large or
82 ** too small
83 */
84
85 procedure OPEN_FILES is
86 MAX_LINESIZE binary_integer := 32767;
87 temp_file varchar2(255); -- used for messages
88 user_error varchar2(255); -- to store translated file_error
89 begin
90
91 if OUT_OPEN = FALSE then
92 /* commit;
93 */
94 OUT_FNAME := GET_TEMP_NAME('OUT');
95 temp_file := OUT_FNAME;
96
97 -- Open and close file to use the workaround for bug
98 F_OUT := utl_file.fopen(TEMP_DIR, OUT_FNAME, 'w');
99
100 BEGIN
101 utl_file.fclose(F_OUT);
102 EXCEPTION
103 when others then
104 NULL;
105 END;
106
107 F_OUT := utl_file.fopen(TEMP_DIR, OUT_FNAME, 'w', MAX_LINESIZE);
108 OUT_OPEN := TRUE;
109 end if;
110
111 if LOG_OPEN = FALSE then
112 /* commit;
113 */
114 LOG_FNAME := GET_TEMP_NAME('LOG');
115 temp_file := LOG_FNAME;
116 -- Open and close file to use the workaround for bug
117 F_LOG := utl_file.fopen(TEMP_DIR, LOG_FNAME, 'w');
118
119 BEGIN
120 utl_file.fclose(F_LOG);
121 EXCEPTION
122 when others then
123 NULL;
124 END;
125
126 F_LOG := utl_file.fopen(TEMP_DIR, LOG_FNAME, 'w', MAX_LINESIZE);
127 LOG_OPEN := TRUE;
128 end if;
129
130 exception
131 when UTL_FILE.INVALID_PATH then
132 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
133 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
134 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
135 user_error := substrb(fnd_message.get, 1, 255);
136
137 fnd_message.set_name('FND','CONC-TEMPFILE_INVALID_PATH');
138 fnd_message.set_token('FILE_DIR', TEMP_DIR, FALSE);
139 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
140 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.open_files.invalid_path', FALSE);
141 end if;
142 raise_application_error(-20100, user_error);
143 when UTL_FILE.INVALID_MODE then
144 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
145 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
146 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
147 user_error := substrb(fnd_message.get, 1, 255);
148
149 fnd_message.set_name('FND','CONC-TEMPFILE_INVALID_MODE');
150 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
151 fnd_message.set_token('FILE_MODE', 'w', FALSE);
152 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
153 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.open_files.invalid_mode', FALSE);
154 end if;
155 raise_application_error(-20100, user_error);
156 when UTL_FILE.INVALID_OPERATION then
157 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
158 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
159 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
160 user_error := substrb(fnd_message.get, 1, 255);
161
162 fnd_message.set_name('FND','CONC-TEMPFILE_INVALID_OPERATN');
163 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
164 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
165 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
166 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.open_files.invalid_operatn', FALSE);
167 end if;
168 raise_application_error(-20100, user_error);
169 when UTL_FILE.INVALID_MAXLINESIZE then
170 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
171 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
172 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
173 user_error := substrb(fnd_message.get, 1, 255);
174
175 fnd_message.set_name('FND', 'CONC-TEMPFILE_INVALID_MAXLINE');
176 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
177 fnd_message.set_token('MAXLINE', MAX_LINESIZE, FALSE);
178 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
179 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.open_files.invalid_maxline', FALSE);
180 end if;
181 raise_application_error(-20100, user_error);
182 when others then
183 raise;
184
185 end;
186 /*
187 ** CLOSE - Close open files.
188 ** Should not be called from a concurrent program.
189 */
190 procedure CLOSE is
191 BEGIN
192
193 BEGIN
194 utl_file.fclose(F_LOG);
195 EXCEPTION
196 when others then
197 NULL;
198 END;
199
200 BEGIN
201 utl_file.fclose(F_OUT);
202 EXCEPTION
203 when others then
204 NULL;
205 END;
206
207 LOG_OPEN := FALSE;
208 OUT_OPEN := FALSE;
209 end;
210
211 /*
212 ** PUT_NAMES - Set the temp file names and directories
213 ** Has no effect when called from a concurrent program.
214 ** IN
215 ** P_LOG - Temporary logfile name
216 ** P_OUT - Temporary outfile name
217 ** P_DIR - Temporary directory name
218 **
219 */
220 procedure PUT_NAMES(P_LOG in varchar2, P_OUT in varchar2, P_DIR in varchar2)
221 is
222 begin
223
224 if LOG_FNAME is null AND
225 OUT_FNAME is null AND
226 TEMP_DIR is null then
227
228 LOG_FNAME := P_LOG;
229 OUT_FNAME := P_OUT;
230 TEMP_DIR := P_DIR;
231 -- OPEN_FILES;
232 end if;
233
234 end PUT_NAMES;
235
236 procedure RELEASE_NAMES(P_LOG in varchar2, P_OUT in varchar2) is
237 BASE varchar2(12);
238 begin
239 BASE := substr(P_LOG, 2, 7);
240 insert into fnd_temp_files (filename, type)
241 values (BASE, 'P');
242
243 end RELEASE_NAMES;
244
245
246 procedure GET_NAMES(P_LOG in out nocopy varchar2,
247 P_OUT in out nocopy varchar2) is
248 BASE varchar2(12);
249 begin
250
251 BASE := GET_BASE;
252 P_LOG := 'l' || BASE || '.tmp';
253 P_OUT := 'o' || BASE || '.tmp';
254
255 end GET_NAMES;
256
257
258 /*
259 ** PUT_NAMES_OS
260 ** - Set the temp file names and directory. This will be called in
261 ** cases where conc prog is running from OS level.
262 ** This is a private routine.
263 **
264 */
265 function PUT_NAMES_OS return boolean is
266 BASE varchar2(12);
267 TEMP_UTL varchar2(512);
268 begin
269
270 if LOG_FNAME is null AND
271 OUT_FNAME is null AND
272 TEMP_DIR is null then
273 -- use first entry of utl_file_dir as the TEMP_DIR
274 -- if there is no entry then do not even construct file names
275 select translate(ltrim(value),',',' ')
276 into TEMP_UTL
277 from v$parameter
278 where name = 'utl_file_dir';
279
280 if (instr(TEMP_UTL,' ') > 0 and TEMP_UTL is not null) then
281 select substrb(TEMP_UTL, 1, instr(TEMP_UTL,' ') - 1)
282 into TEMP_DIR
283 from dual ;
284 elsif (TEMP_UTL is not null) then
285 TEMP_DIR := TEMP_UTL;
286 end if;
287
288 if (TEMP_UTL is null or TEMP_DIR is null ) then
289 raise no_data_found;
290 end if;
291
292 -- We are now safe to call GET_BASE after making that as AUTONOMOUS
293 -- transaction.
294 -- Get the next sequence # from the db or reuse old one.
295
296 BASE := GET_BASE;
297
298 LOG_FNAME := 'l' || BASE || '.tmp';
299 OUT_FNAME := 'o' || BASE || '.tmp';
300
301 -- call fnd_file_private.put_names with these values
302 fnd_file_private.put_names(LOG_FNAME, OUT_FNAME, TEMP_DIR );
303
304 -- CAUTION: for NT, we can ignore this area for NT
305 -- log the temp file info in fnd_temp_files table
306 fnd_conc_private_utils.record_temp_file_use(
307 TEMP_DIR || '/' || LOG_FNAME,
308 NULL);
309 fnd_conc_private_utils.record_temp_file_use(
310 TEMP_DIR || '/' || OUT_FNAME,
311 NULL);
312
313 end if;
314
315 return TRUE;
316
317 exception
318 when no_data_found then
319 return FALSE;
320 when others then
321 return FALSE;
322 end PUT_NAMES_OS;
323
324
325 /*
326 ** WRITE_BUFF - Open the file and writes buffer into file.
327 ** IN
328 ** WHICH - Log or output file? Either FND_FILE.LOG or FND_FILE.OUTPUT
329 ** WTYPE - TYPE is 'PUT'/'PUT_LINE'/'NEW_LINE'
330 ** BUFF - Text to write
331 ** EXCEPTIONS
332 **
333 */
334 procedure WRITE_BUFF(WHICH in number, WTYPE in varchar2, BUFF in varchar2) is
335 temp_file varchar2(255); -- used for messages
336 user_error varchar2(255); -- to store translated file_error
337 begin
338 -- if PUT_NAMES_OS is successfull then call OPEN_FILES
339 -- and wirte the buffer into temp file
340 if ( PUT_NAMES_OS ) then
341 OPEN_FILES;
342
343 if WHICH = FND_FILE.LOG then
344 temp_file := LOG_FNAME;
345 if ( WTYPE = 'PUT' ) then
346 utl_file.put(F_LOG, BUFF);
347 if (FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
348 fnd_log.string(FND_LOG.LEVEL_EVENT,
349 'fnd.plsql.FND_FILE.WRITE_BUFF.put', BUFF);
350 end if;
351 elsif (WTYPE = 'PUT_LINE' ) then
352 utl_file.put_line(F_LOG, BUFF);
353 if (FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
354 fnd_log.string(FND_LOG.LEVEL_EVENT,
355 'fnd.plsql.FND_FILE.WRITE_BUFF.put_line', BUFF);
356 end if;
357 elsif (WTYPE = 'NEW_LINE') then
358 utl_file.new_line(F_LOG, to_number(BUFF) );
359 end if;
360 utl_file.fflush(F_LOG);
361 elsif WHICH = FND_FILE.OUTPUT then
362 temp_file := OUT_FNAME;
363 if ( WTYPE = 'PUT' ) then
364 utl_file.put(F_OUT, BUFF);
365 elsif (WTYPE = 'PUT_LINE' ) then
366 utl_file.put_line(F_OUT, BUFF);
367 elsif (WTYPE = 'NEW_LINE') then
368 utl_file.new_line(F_OUT, to_number(BUFF) );
369 end if;
370 utl_file.fflush(F_OUT);
371 end if;
372 end if;
373
374 exception
375 when UTL_FILE.INVALID_FILEHANDLE then
376 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
377 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
378 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
379 user_error := substrb(fnd_message.get, 1, 255);
380
381 fnd_message.set_name('FND','CONC-TEMPFILE_INVALID_HANDLE');
382 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
383 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
384 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.write_buff.invalid_handle', FALSE);
385 end if;
386 raise_application_error(-20100, user_error);
387
388 when UTL_FILE.INVALID_OPERATION then
389 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
390 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
391 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
392 user_error := substrb(fnd_message.get, 1, 255);
393
394 fnd_message.set_name('FND','CONC-TEMPFILE_INVALID_OPERATN');
395 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
396 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
397 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
398 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.write_buff.invalid_operatn', FALSE);
399 end if;
400 raise_application_error(-20100, user_error);
401
402 when UTL_FILE.WRITE_ERROR then
403 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
404 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
405 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
406 user_error := substrb(fnd_message.get, 1, 255);
407
408 fnd_message.set_name('FND', 'CONC-TEMPFILE_WRITE_ERROR');
409 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
410 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
411 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
412 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.write_buff.write_error', FALSE);
413 end if;
414 raise_application_error(-20100, user_error);
415
416 when others then
417 raise;
418
419 end WRITE_BUFF;
420
421 /*
422 ** PUT - Put (write) text to file
423 **
424 ** IN
425 ** WHICH - Log or output file? Either FND_FILE.LOG or FND_FILE.OUTPUT
426 ** BUFF - Text to write
427 ** EXCEPTIONS
428 ** utl_file.invalid_path (*) - file location or name was invalid
429 ** utl_file.invalid_mode (*) - the open_mode string was invalid
430 ** utl_file.invalid_filehandle - file handle is invalid
431 ** utl_file.invalid_operation - file is not open for writing/appending
432 ** utl_file.write_error - OS error occured during write operation
433 */
437 begin
434 procedure PUT(WHICH in number, BUFF in varchar2) is
435 temp_file varchar2(255); -- used for messages
436 user_error varchar2(255); -- to store translated file_error
438 if WHICH = FND_FILE.LOG then
439 temp_file := LOG_FNAME;
440 utl_file.put(F_LOG, BUFF);
441 utl_file.fflush(F_LOG);
442 if (FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
443 fnd_log.string(FND_LOG.LEVEL_EVENT,
444 'fnd.plsql.FND_FILE.WRITE_BUFF.put', BUFF);
445 end if;
446 elsif WHICH = FND_FILE.OUTPUT then
447 temp_file := OUT_FNAME;
448 utl_file.put(F_OUT, BUFF);
449 utl_file.fflush(F_OUT);
450 end if;
451
452 exception
453 when UTL_FILE.INVALID_FILEHANDLE then
454 -- first time this could be file not open case
455 -- try opening temp files and write
456 WRITE_BUFF(WHICH, 'PUT', BUFF);
457
458 when UTL_FILE.INVALID_OPERATION then
459 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
460 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
461 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
462 user_error := substrb(fnd_message.get, 1, 255);
463
464 fnd_message.set_name('FND','CONC-TEMPFILE_INVALID_OPERATN');
465 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
466 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
467 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
468 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.put.invalid_operatn', FALSE);
469 end if;
470 raise_application_error(-20100, user_error);
471
472 when UTL_FILE.WRITE_ERROR then
473 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
474 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
475 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
476 user_error := substrb(fnd_message.get, 1, 255);
477
478 fnd_message.set_name('FND', 'CONC-TEMPFILE_WRITE_ERROR');
479 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
480 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
481 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
482 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.put.write_error', FALSE);
483 end if;
484 raise_application_error(-20100, user_error);
485
486 when others then
487 raise;
488 end PUT;
489
490
491 /*
492 ** PUT_LINE - Put (write) a line of text to file
493 **
494 ** IN
495 ** WHICH - Log or output file? Either FND_FILE.LOG or FND_FILE.OUTPUT
496 ** BUFF - Text to write
497 ** EXCEPTIONS
498 ** utl_file.invalid_path - file location or name was invalid
499 ** utl_file.invalid_mode - the open_mode string was invalid
500 ** utl_file.invalid_filehandle - file handle is invalid
501 ** utl_file.invalid_operation - file is not open for writing/appending
502 ** utl_file.write_error - OS error occured during write operation
503 */
504 procedure PUT_LINE(WHICH in number, BUFF in varchar2) is
505 temp_file varchar2(255); -- used for messages
506 user_error varchar2(255); -- to store translated file_error
507 begin
508 if WHICH = FND_FILE.LOG then
509 temp_file := LOG_FNAME;
510 utl_file.put_line(F_LOG, BUFF);
511 utl_file.fflush(F_LOG);
512 if (FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
513 fnd_log.string(FND_LOG.LEVEL_EVENT,
514 'fnd.plsql.FND_FILE.PUT_LINE', BUFF);
515 end if;
516 elsif WHICH = FND_FILE.OUTPUT then
517 temp_file := OUT_FNAME;
518 utl_file.put_line(F_OUT, BUFF);
519 utl_file.fflush(F_OUT);
520 end if;
521
522 exception
523 when UTL_FILE.INVALID_FILEHANDLE then
524 -- first time this could be file not open case
525 -- try opening temp files and write
526 WRITE_BUFF(WHICH, 'PUT_LINE', BUFF);
527
528 when UTL_FILE.INVALID_OPERATION then
529 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
530 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
531 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
532 user_error := substrb(fnd_message.get, 1, 255);
533
534 fnd_message.set_name('FND','CONC-TEMPFILE_INVALID_OPERATN');
535 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
536 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
537 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
538 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.put_line.invalid_operatn', FALSE);
539 end if;
540 raise_application_error(-20100, user_error);
541
542 when UTL_FILE.WRITE_ERROR then
543 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
544 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
545 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
546 user_error := substrb(fnd_message.get, 1, 255);
547
548 fnd_message.set_name('FND', 'CONC-TEMPFILE_WRITE_ERROR');
549 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
550 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
551 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
552 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.put_line.write_error', FALSE);
553 end if;
554 raise_application_error(-20100, user_error);
555
556 when others then
557 raise;
558 end PUT_LINE;
559
560
561 /*
562 ** NEW_LINE - Put (write) line terminators to file
563 **
564 ** IN
565 ** WHICH - Log or output file? Either FND_FILE.LOG or FND_FILE.OUTPUT
566 ** LINES - Number of line terminators to write
567 ** EXCEPTIONS
568 ** utl_file.invalid_path - file location or name was invalid
569 ** utl_file.invalid_mode - the open_mode string was invalid
570 ** utl_file.invalid_filehandle - file handle is invalid
571 ** utl_file.invalid_operation - file is not open for writing/appending
572 ** utl_file.write_error - OS error occured during write operation
573 */
574 procedure NEW_LINE(WHICH in number, LINES in natural := 1) is
575 temp_file varchar2(255); -- used for messages
576 user_error varchar2(255); -- to store translated file_error
577 begin
578 if WHICH = FND_FILE.LOG then
579 temp_file := LOG_FNAME;
580 utl_file.new_line(F_LOG, LINES);
581 utl_file.fflush(F_LOG);
582 elsif WHICH = FND_FILE.OUTPUT then
583 temp_file := OUT_FNAME;
584 utl_file.new_line(F_OUT, LINES);
585 utl_file.fflush(F_OUT);
586 end if;
587
588 exception
589 when UTL_FILE.INVALID_FILEHANDLE then
590 -- first time this could be file not open case
591 -- try opening temp files and write
592 WRITE_BUFF(WHICH, 'NEW_LINE', to_char(LINES));
593
594 when UTL_FILE.INVALID_OPERATION then
595 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
596 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
597 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
598
599 user_error := substrb(fnd_message.get, 1, 255);
600
601 fnd_message.set_name('FND','CONC-TEMPFILE_INVALID_OPERATN');
602 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
603 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
604 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
605 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.newLine.invalid_operatn', FALSE);
606 end if;
607 raise_application_error(-20100, user_error);
608
609 when UTL_FILE.WRITE_ERROR then
610 fnd_message.set_name('FND', 'CONC-FILE_ERROR');
611 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
612 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
613 user_error := substrb(fnd_message.get, 1, 255);
614
615 fnd_message.set_name('FND', 'CONC-TEMPFILE_WRITE_ERROR');
616 fnd_message.set_token('TEMP_FILE', temp_file, FALSE);
617 fnd_message.set_token('TEMP_DIR', TEMP_DIR, FALSE);
618 if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
619 fnd_log.message(FND_LOG.LEVEL_ERROR, 'fnd.plsql.fnd_file.new_line.write_error', FALSE);
620 end if;
621 raise_application_error(-20100, user_error);
622
623 when others then
624 raise;
625 end NEW_LINE;
626
627
628 end fnd_file;