DBA Data[Home] [Help]

PACKAGE BODY: APPS.FND_FILE

Source


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;