Primes.cbsql

From PostgreSQL_wiki
Revision as of 22:26, 9 December 2025 by Martin (talk | contribs) (Created page with "This is the compplete source code of the primes Cobol program, which contains the preprocessed high level SQL statements. <pre> identification division. program-...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

This is the compplete source code of the primes Cobol program, which contains the preprocessed high level SQL statements.

       identification division.
       program-id. primes.

       environment division.
       configuration section.
       source-computer. linux-laptop.
       object-computer. linux-laptop.
       special-names.
           console is scherm.

       data division.
       working-storage section.
       01  filler               pic x(32) value "Start WS primes".
       01 DATASRC PIC X(64) value
          "pgsql://localhost:5432/primes&default_schema=primes".
       01 DBUSR     PIC X(64)  value "primes_user".
       01 DBPWD     PIC X(64)  value "pr1mes_user".
       01 CUR-STEP    PIC X(16).
       01 primes-row.
        03 r-ident          pic 9(9) comp-3.
        03 r-prime          pic 9(9) comp-3.
       01 prime-count       pic 9(9).
       01 prime_seq         pic 9(9).
       01 divider           pic 9(9).

       01 primes.
        03 primes-result    pic 9(2)  value zero.
         88 init-primes-ok   value 1.
         88 first-divider-ok value 2.
         88 next-divider-ok  value 3.
        03 test-number      pic 9(9).
        03 test-number-sqr  pic 9(9)v9(9).
        03 test-divider     pic 9(9).
        03 test-rest        pic 9(9)v9(9).
        03 old-test-number  pic 9(9).
        03 old-ident        pic 9(9).
        03 new-ident        pic 9(9).

GIXSQL*EXEC SQL
GIXSQL*    INCLUDE primes-table
GIXSQL*END-EXEC.
           COPY primes-table.

GIXSQL*EXEC SQL
GIXSQL*    INCLUDE SQLCA
GIXSQL*END-EXEC.
           COPY SQLCA.

GIXSQL*EXEC SQL AT primes
GIXSQL*    DECLARE primescursor CURSOR FOR
GIXSQL*      SELECT * FROM primes
GIXSQL*END-EXEC.

           copy primes-ui.

GIXSQL 01  SQ0001.
GIXSQL     02  FILLER PIC X(0020) VALUE "SELECT * FROM primes".
GIXSQL     02  FILLER PIC X(1) VALUE X"00".
GIXSQL 01  SQ0002.
GIXSQL     02  FILLER PIC X(0041) VALUE "SELECT prime FROM primes WHER"
GIXSQL  &  "E ident = $1".
GIXSQL     02  FILLER PIC X(1) VALUE X"00".
GIXSQL 01  SQ0003.
GIXSQL     02  FILLER PIC X(0042) VALUE "INSERT INTO primes ( prime ) "
GIXSQL  &  "VALUES ( $1 )".
GIXSQL     02  FILLER PIC X(1) VALUE X"00".
GIXSQL 01  SQ0004.
GIXSQL     02  FILLER PIC X(0041) VALUE "insert into primes ( prime ) "
GIXSQL  &  "values ( 2 )".
GIXSQL     02  FILLER PIC X(1) VALUE X"00".
GIXSQL 01  SQ0005.
GIXSQL     02  FILLER PIC X(0017) VALUE "START TRANSACTION".
GIXSQL     02  FILLER PIC X(1) VALUE X"00".
GIXSQL*   ESQL CURSOR INIT FLAGS (START)
GIXSQL 01  GIXSQL-CI-F-primes-primescursor PIC X.
GIXSQL*   ESQL CURSOR INIT FLAGS (END)
       linkage section.

           copy primes-dal.

           procedure division using primes-dal.

           evaluate true
             when next-prime
               perform r80-get-next-prime
             when next-divider
               perform r81-get-next-divider
             when write-prime
               perform r83-write-prime
             when db-connect
               perform s00-connect
             when db-cursor
               perform s01-cursor
             when db-disconnect
               perform s99-disconnect
             when other
               move 1 to dal-result
           end-evaluate.
  
           exit program.

       r80-get-next-prime.

           perform s02-fetch.

       r81-get-next-divider.

           add 1 to old-ident giving new-ident.
      *    display "gen-methods: " gen-methods.
      *    display "primes.cbl ident: " old-ident " " new-ident.

GIXSQL*    EXEC SQL at primes
GIXSQL*      SELECT prime INTO :test-divider FROM primes
GIXSQL*             WHERE ident = :new-ident
GIXSQL*    END-EXEC.
GIXSQL     CALL STATIC "GIXSQLStartSQL"
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLSetResultParams" USING
GIXSQL         BY VALUE 1
GIXSQL         BY VALUE 9
GIXSQL         BY VALUE 0
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE test-divider
GIXSQL         BY REFERENCE 0
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLSetSQLParams" USING
GIXSQL         BY VALUE 1
GIXSQL         BY VALUE 9
GIXSQL         BY VALUE 0
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE new-ident
GIXSQL         BY REFERENCE 0
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLExecSelectIntoOne" USING
GIXSQL         BY REFERENCE SQLCA
GIXSQL         BY REFERENCE "primes" & x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE SQ0002
GIXSQL         BY VALUE 1
GIXSQL         BY VALUE 1
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLEndSQL"
GIXSQL     END-CALL.

           if SQLCODE = 0   then
             next sentence
      *      display "select new-divider ok: " test-divider upon scherm
           else
             display SQLCODE upon scherm
             display "select new-divider nok" upon scherm.

      *    display "primes.cbl test-divider: " test-divider.

           move new-ident to old-ident.

       r83-write-prime.

GIXSQL*    EXEC SQL at primes
GIXSQL*      INSERT INTO primes ( prime ) VALUES ( :prime )
GIXSQL*    END-EXEC.
GIXSQL     CALL STATIC "GIXSQLStartSQL"
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLSetSQLParams" USING
GIXSQL         BY VALUE 1
GIXSQL         BY VALUE 9
GIXSQL         BY VALUE 0
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE prime
GIXSQL         BY REFERENCE 0
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLExecParams" USING
GIXSQL         BY REFERENCE SQLCA
GIXSQL         BY REFERENCE "primes" & x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE SQ0003
GIXSQL         BY VALUE 1
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLEndSQL"
GIXSQL     END-CALL.

           if SQLCODE = 0   then
             next sentence
      *      display SQLCODE upon scherm
      *      display "primes.cbl insert next prime and new-ident ok: "
      *               prime-number upon scherm
           else
             display SQLCODE upon scherm
             display "primes.cbl insert next prime nok: "
                      prime-number upon scherm.


      *    EXEC SQL at primes
      *      COMMIT
      *    END-EXEC.

           if SQLCODE = 0   then
             next sentence
      *      display SQLCODE upon scherm
      *      display "commit ok: " upon scherm
           else
             display SQLCODE upon scherm
             display "commit nok: " upon scherm.

       r90-generate-primes.

           perform s00-connect.

           if dal-method-ok                      then

             move 'log-message' to process-message

GIXSQL*      EXEC SQL at primes
GIXSQL*        insert into primes ( prime ) values ( 2 )
GIXSQL*      END-EXEC.
GIXSQL     CALL STATIC "GIXSQLExec" USING
GIXSQL         BY REFERENCE SQLCA
GIXSQL         BY REFERENCE "primes" & x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE SQ0004
GIXSQL     END-CALL.

             if SQLCODE = 0   then
               move 0 to dal-result
               move 1 to primes-sequence
               move 2 to prime-number
               move 'Initial insert ok.'
                 to process-message
             else
               move
                'Initial insert failed, terminating program.'
                 to process-message
               move 1 to dal-result.
 
           move 'log-message' to program-message.
           call "primesui" using primes-ui.



       r99-stop-primes.

           perform s99-disconnect.

       s00-connect.
           MOVE 'CONNECT' TO CUR-STEP.
GIXSQL*    EXEC SQL
GIXSQL*       connect TO :DATASRC AS primes USER :DBUSR USING :DBPWD
GIXSQL*    END-EXEC.
GIXSQL     CALL STATIC "GIXSQLConnect" USING
GIXSQL         BY REFERENCE SQLCA
GIXSQL         BY REFERENCE DATASRC
GIXSQL         BY VALUE 64
GIXSQL         BY REFERENCE "primes" & x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE DBUSR
GIXSQL         BY VALUE 64
GIXSQL         BY REFERENCE DBPWD
GIXSQL         BY VALUE 64
GIXSQL     END-CALL.
           move 'log-message' to process-message.
           if SQLCODE = 0   then
              move 0 to dal-result
              move 'Database initialisation ok.'
              to program-message
               call "primesui" using primes-ui
           else
              move
               'Database initialisation failed, terminating program.'
               to program-message
               call "primesui" using primes-ui
               move 1 to dal-result.

       s01-cursor.

           move 'primes'            to program-name.

GIXSQL*    EXEC SQL at primes START TRANSACTION END-EXEC.
GIXSQL     CALL STATIC "GIXSQLStartSQL"
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLExec" USING
GIXSQL         BY REFERENCE SQLCA
GIXSQL         BY REFERENCE "primes" & x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE SQ0005
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLEndSQL"
GIXSQL     END-CALL.

           if SQLCODE = 0   then
              move 'Start transaction ok.'
                to program-message
           else
              move 'Start transaction nok.'
                to program-message
              move 1 to dal-result.

           move 'log-message' to program-message.
           call "primesui" using primes-ui.

      *      display "start transaction nok" upon scherm.

           if dal-method-ok                      then

GIXSQL*      EXEC SQL OPEN primescursor END-EXEC.
GIXSQL     IF GIXSQL-CI-F-primes-primescursor = ' ' THEN
GIXSQL         PERFORM GIXSQL-CI-P-primes-primescursor
GIXSQL         IF SQLCODE = 0
GIXSQL           MOVE 'X' TO GIXSQL-CI-F-primes-primescursor
GIXSQL         END-IF
GIXSQL     END-IF
GIXSQL     IF GIXSQL-CI-F-primes-primescursor = 'X' THEN
GIXSQL         CALL STATIC "GIXSQLCursorOpen" USING
GIXSQL             BY REFERENCE SQLCA
GIXSQL             BY REFERENCE "primes_primescursor" & x"00"
GIXSQL         END-CALL
GIXSQL     END-IF.

              if SQLCODE = 0   then
                 move 'Start primescursur ok.'
                   to program-message
              else
                 move 'Start primescursor nok.'
                   to program-message
                 move 1 to dal-result.


           move 'primes'            to program-name.
           move 'log-message' to program-message.
           call "primesui" using primes-ui.

      *    if dal-method-ok                      then
      *       perform s02-fetch.

      *    if SQLCODE = 0   then
      *       move 'Fetch first row ok.' to program-message
      *       move 0 to dal-result
      *       move r-ident     to    primes-sequence
      *       move r-prime     to    prime-number
      *    else
      *       move 'Fetch first row nok.' to program-message
      *          move 1 to dal-result.

      *    move 'primes'            to program-name.
      *    move 'log-message' to program-message.
      *    call "primesui" using primes-ui.

       s02-fetch.

GIXSQL*    EXEC SQL FETCH primescursor INTO :primes-row END-EXEC.
GIXSQL     CALL STATIC "GIXSQLStartSQL"
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLSetResultParams" USING
GIXSQL         BY VALUE 8
GIXSQL         BY VALUE 9
GIXSQL         BY VALUE 0
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE r-ident
GIXSQL         BY REFERENCE 0
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLSetResultParams" USING
GIXSQL         BY VALUE 8
GIXSQL         BY VALUE 9
GIXSQL         BY VALUE 0
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE r-prime
GIXSQL         BY REFERENCE 0
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLCursorFetchOne" USING
GIXSQL         BY REFERENCE SQLCA
GIXSQL         BY REFERENCE "primes_primescursor" & x"00"
GIXSQL     END-CALL
GIXSQL     CALL STATIC "GIXSQLEndSQL"
GIXSQL     END-CALL.

           if SQLCODE = 0   then
              move r-ident     to    primes-sequence
              move r-prime     to    prime-number
              move 0 to dal-result
           else
              move 'Fetch row nok.' to program-message
              move 1 to dal-result
              move 'primes'            to program-name
              move 's02-fetch'         to program-paragraph
              move 'log-message' to ui-methods
              call "primesui" using primes-ui.

       s99-disconnect.

           MOVE 'DISCONNECT' TO CUR-STEP.
GIXSQL*    EXEC SQL connect RESET primes END-EXEC.
GIXSQL     CALL STATIC "GIXSQLConnectReset" USING
GIXSQL         BY REFERENCE SQLCA
GIXSQL         BY REFERENCE "primes" & x"00"
GIXSQL         BY VALUE 0
GIXSQL     END-CALL.

           move 'log-message' to process-message.

           if SQLCODE = 0   then
              move 0 to dal-result
              move 'Close database ok.'
              to process-message
               call "primesui" using primes-ui
           else
               move 'Database initialisation failed, ending program.'
               to process-message
               call "primesui" using primes-ui
               move 1 to dal-result.
           display "s99 disconnect from database" upon scherm.
           display SQLCODE upon scherm.
GIXSQL*
GIXSQL*   ESQL CURSOR DECLARATIONS (START)
GIXSQL     GO TO GIX-SKIP-CRSR-INIT.
GIXSQL GIXSQL-CI-P-primes-primescursor.
GIXSQL     CALL STATIC "GIXSQLCursorDeclare" USING
GIXSQL         BY REFERENCE SQLCA
GIXSQL         BY REFERENCE "primes" & x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE "primes_primescursor" & x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE SQ0001
GIXSQL         BY VALUE 0
GIXSQL     END-CALL.
GIXSQL GIX-SKIP-CRSR-INIT.
GIXSQL*
GIXSQL*   ESQL CURSOR DECLARATIONS (END)


Terug naar: primes