APPENDIX B Sample 4GL Routine to read ASCII files


                                                          kerry@kcbbs.gen.nz
DATABASE [insert-your-database-here]
DEFINE   m_temp_exists    SMALLINT

main
define x char(80)

if open_flat("cat flat.4gl") then
   let x = read_flat()
   while x != "!EOF!"
      display x clipped
      let x = read_flat()
   end while
end if

end main
  

FUNCTION open_flat(l_unix_cmd)
DEFINE   l_unix_cmd       CHAR(200)

DEFINE   l_text           CHAR(300),
         l_tempfile       CHAR(30),
         l_delimiters     CHAR(6),
         l_delim          CHAR(1),
         i                SMALLINT

   WHENEVER ANY ERROR CONTINUE

   IF NOT m_temp_exists THEN
      CREATE TEMP TABLE picklist
         (ptext   char(300),
          pline   serial) WITH NO LOG
      LET m_temp_exists = TRUE
   ELSE
      DELETE FROM picklist
   END IF

   LET l_tempfile = "/tmp/",get_program(), TIME,".tmp"

   LET l_delimiters = ASCII(94),ASCII(92),ASCII(96),ASCII(124),ASCII(126),
                      ASCII(95)
   FOR i = 1 TO 6
      LET l_delim = l_delimiters[i]
      LET l_text = l_unix_cmd CLIPPED,
                 " | sed -e 's/$/",l_delim,"0",l_delim,"/' > ", l_tempfile
      RUN l_text
      LOAD FROM l_tempfile DELIMITER l_delim
      INSERT INTO picklist 
      IF status =0 THEN
         LET i = 999
         EXIT FOR
      END IF
   END FOR

   IF i != 999 THEN
      LET l_unix_cmd = "ERROR: open_flat() is unable to process an ASCII file ",
                       "which contains all of the following characters: ",
                        l_delimiters CLIPPED,". Please advise your support ",
                        "company of this error and suggest they look in the ",
                        "file ",l_tempfile CLIPPED,"."
#     CALL message_prompt(l_unix_cmd, "")
      RETURN FALSE
   END IF

   DECLARE flat_curs CURSOR FOR
    SELECT ptext, pline FROM picklist
     ORDER BY pline
   OPEN flat_curs
   IF status !=0 THEN
      RETURN FALSE
   END IF
   LET l_text = "rm -f ", l_tempfile
   RUN l_text WITHOUT WAITING
   RETURN TRUE

END FUNCTION


FUNCTION read_flat()
DEFINE   l_text           CHAR(300)

   FETCH flat_curs INTO l_text
   IF status !=0 THEN
      LET l_text = "!EOF!"
   END IF
   IF l_text IS NULL THEN LET l_text = " " END IF

   RETURN l_text
END FUNCTION