Flow diagrams

From Webhuis wiki
Jump to navigation Jump to search

Flow Diagrams[edit]

Project: pgcobol — Prime Numbers Application
Version: 1.0 (reverse-engineered)
Date: 2026-03-17
Notation: Mermaid flowchart / sequence diagrams



1. System-Level Call Graph[edit]

graph TD
    OS([OS / shell]) -->|command-line arg| MAIN[primesmain]
    MAIN -->|CALL primesui start| UI[primesui]
    MAIN -->|CALL primesgen primes-session| GEN[primesgen]
    GEN -->|CALL primes primes-dal| DAL[primes DAL]
    GEN -->|CALL primesui primes-ui| UI
    DAL -->|CALL primesui primes-ui| UI
    DAL <-->|EXEC SQL via GixSQL| DB[(PostgreSQL\nprimes.primes)]
    UI -->|WRITE records| PRT([primes.prt])
    UI -->|DISPLAY| CON([console / scherm])

2. Main Program Flow — primesmain[edit]

flowchart TD
    START([Start]) --> ACCEPT[ACCEPT commandline-args\nfrom COMMAND-LINE]
    ACCEPT --> MOVEMETHODS[MOVE commandline-args TO methods\nMOVE 'primesmain' TO program-name]
    MOVEMETHODS --> STARTSESS[PERFORM r90-start-session\nCALL primesui start]
    STARTSESS --> UIOK{ui-method-ok?}
    UIOK -->|No| EMERGENCY[DISPLAY emergency message\non console\nSTOP RUN]
    UIOK -->|Yes| LOGUI[LOG 'UI initialisation succeeded.'\nLOG commandline-args]
    LOGUI --> EVAL{EVALUATE commandline-args}
    EVAL -->|report| LOGRPT[LOG 'Primes report generation starts.'\nSET methods = 'report']
    LOGRPT --> CALLGEN[PERFORM r92-generate-primes\nCALL primesgen USING primes-session]
    EVAL -->|generate| LOGGEN[LOG 'Primes generation starts.'\nSET methods = 'generate']
    LOGGEN --> COMMENTED["⚠ PERFORM r92-generate-primes\n[commented out in source]"]
    EVAL -->|other| LOGBAD[LOG 'Bad parameter'\nCALL primesui stop]
    LOGBAD --> STOPBAD([STOP RUN])
    CALLGEN --> LOGDONE[LOG 'Primes run complete.']
    COMMENTED --> LOGDONE
    LOGDONE --> STOPSESS[PERFORM r99-stop-session\nCALL primesui stop]
    STOPSESS --> STOP([STOP RUN])

3. Generate Flow — primesgen (generate path)[edit]

flowchart TD
    ENTRY([Entry: methods = 'generate']) --> CONNECT[CALL primes 'connect'\nEXEC SQL CONNECT]
    CONNECT --> CONNOK{dal-method-ok?}
    CONNOK -->|No| SETFAIL1[LOG 'Database init failed.'\nSET session-result = 1]
    SETFAIL1 --> CLOSE
    CONNOK -->|Yes| INIT[test-number = 3\ntest-divider = 2\nold-ident = 1\ntest-number-sqr = SQRT 3]
    INIT --> LOGCONN[LOG 'Database init succeeded.']
    LOGCONN --> LOOP{test-number\n= 999999999?}
    LOOP -->|Yes| CLOSE
    LOOP -->|No| DIVIDE[DIVIDE test-number\nBY test-divider\nGIVING test-quot\nREMAINDER test-rest]
    DIVIDE --> CASE{EVALUATE}
    CASE -->|test-rest = 0\ncomposite| NEXTN[r82-next-test-number:\nADD 2 TO test-number\nSQRT recalc\nold-ident = 1\nFETCH first divider]
    NEXTN --> LOOP
    CASE -->|test-divider > SQRT\nprime confirmed| WRITE[r85-write-prime:\nCALL primes 'write' INSERT\nCALL primesui 'write']
    WRITE --> NEXTN2[r82-next-test-number]
    NEXTN2 --> LOOP
    CASE -->|otherwise\ntry next divisor| NEXTDIV[r89-get-next-divider:\nCALL primes 'next-divider'\nSELECT prime WHERE ident=new-ident]
    NEXTDIV --> LOOP
    CLOSE([PERFORM r99-close-primes\nCALL primes 'disconnect'\nEXIT PROGRAM])

4. Report Flow — primesgen (report path)[edit]

flowchart TD
    ENTRY([Entry: methods = 'report']) --> CONNECT[CALL primes 'connect']
    CONNECT --> CONNOK{dal-method-ok?}
    CONNOK -->|No| FAIL1[LOG 'Database init failed.'\nsession-result = 1\nGO TO CLOSE]
    CONNOK -->|Yes| CURSOR[CALL primes 'cursor'\nSTART TRANSACTION\nOPEN primescursor]
    CURSOR --> CURROK{dal-method-ok?}
    CURROK -->|No| FAIL2[LOG 'Cursor init failed.'\nsession-result = 1\nGO TO CLOSE]
    CURROK -->|Yes| FETCH1[r94-fetch:\nCALL primes 'next-prime'\nFETCH primescursor]
    FETCH1 --> FETCHOK{dal-method-ok?}
    FETCHOK -->|No| LOGFAIL[LOG 'Fetch first row nok.'\ndal-result = 1]
    LOGFAIL --> CLOSE
    FETCHOK -->|Yes| LOGOK[LOG 'Fetch first row ok.'\ndal-result = 0]
    LOGOK --> RPTLOOP{session-method-eof?}
    RPTLOOP -->|Yes| CLOSE
    RPTLOOP -->|No| UIWRITE[r86-report-primes:\nMOVE primes-data TO u-primes\nCALL primesui 'write']
    UIWRITE --> FETCHN[r94-fetch:\nCALL primes 'next-prime']
    FETCHN --> RPTLOOP
    CLOSE([PERFORM r99-close-primes\nCALL primes 'disconnect'\nEXIT PROGRAM])

5. DAL Dispatch — primes.cbl[edit]

flowchart TD
    ENTRY([ENTRY primes-dal]) --> EVAL{dal-methods}
    EVAL -->|connect| S00[s00-connect:\nEXEC SQL CONNECT TO datasrc\nAS primes USER dbusr USING dbpwd]
    EVAL -->|cursor| S01[s01-cursor:\nEXEC SQL START TRANSACTION\nEXEC SQL OPEN primescursor]
    EVAL -->|next-prime| R80[r80-get-next-prime → s02-fetch:\nEXEC SQL FETCH primescursor\nINTO primes-row]
    EVAL -->|next-divider| R81[r81-get-next-divider:\nnew-ident = old-ident + 1\nEXEC SQL SELECT prime\nWHERE ident = new-ident]
    EVAL -->|write| R83[r83-write-prime:\nEXEC SQL INSERT INTO primes\nVALUES prime-number]
    EVAL -->|disconnect| S99[s99-disconnect:\nEXEC SQL CONNECT RESET primes]
    EVAL -->|other| ERR[dal-result = 1]
    S00 --> SQLCK1{SQLCODE = 0?}
    SQLCK1 -->|Yes| OK1[dal-result = 0]
    SQLCK1 -->|No| NOK1[LOG error\ndal-result = 1]
    S01 --> SQLCK2{SQLCODE = 0?}
    SQLCK2 -->|Yes| OPEN[OPEN primescursor]
    SQLCK2 -->|No| NOK2[dal-result = 1]
    R80 --> SQLCK3{SQLCODE = 0?}
    SQLCK3 -->|Yes| MOVROW[primes-sequence = r-ident\nprime-number = r-prime\ndal-result = 0]
    SQLCK3 -->|No| NOK3[LOG error\ndal-result = 1]
    OK1 & MOVROW & NOK1 & NOK2 & NOK3 & OK1 & R81 & R83 & S99 & ERR --> EXIT([EXIT PROGRAM])

6. UI Dispatch — primesui.cbl[edit]

flowchart TD
    ENTRY([ENTRY primes-ui]) --> EVAL{ui-methods}
    EVAL -->|start| R90[r90-start-primesui:\nOPEN OUTPUT fprinter\ncheck file-status]
    EVAL -->|write| R92[r92-write-primesui:\nload t-ident / t-prime into cell\nprimes-idx + 1]
    EVAL -->|log-message| R98[r98-message-ui:\nDISPLAY process-message\nUPON scherm]
    EVAL -->|stop| R99[r99-stop-primesui:\nflush partial line\nCLOSE fprinter]
    EVAL -->|other| ERR[ui-method-result = 1]
    R90 --> STATCK{file-status = '00'?}
    STATCK -->|Yes| OPENOK[ui-method-result = 0\nprimes-idx = 1]
    STATCK -->|No| OPENNOK[ui-method-result = 1\nDISPLAY status on console]
    R92 --> NEWPG{new-page?}
    NEWPG -->|Yes| R93[r93-new-page:\nwrite heading + column header\nprint-new-page = 0]
    NEWPG -->|No| IDX7{primes-idx = 7?}
    R93 --> IDX7
    IDX7 -->|Yes| WRITELN[WRITE print line\nprimes-idx = 1]
    IDX7 -->|No| LINCNT{linage-counter = 53?}
    WRITELN --> LINCNT
    LINCNT -->|Yes| R94[r94-eop:\nwrite footing\npage-number + 1\nprint-new-page = 1]
    LINCNT -->|No| UIEXIT
    R94 --> UIEXIT
    R99 --> FLUSH[PERFORM r92-write-primesui\nUNTIL new-page\nwriting zero rows]
    FLUSH --> CLSFIL[CLOSE fprinter]
    CLSFIL --> UIEXIT
    OPENOK & OPENNOK & R98 & ERR & CLSFIL --> UIEXIT([EXIT PROGRAM])

7. Sequence Diagram — Full Report Run[edit]

sequenceDiagram
    participant Shell
    participant MAIN as primesmain
    participant GEN as primesgen
    participant DAL as primes (DAL)
    participant UI as primesui
    participant DB as PostgreSQL
    participant PRT as primes.prt

    Shell->>MAIN: execute "report"
    MAIN->>UI: ui-methods="start"
    UI->>PRT: OPEN OUTPUT
    PRT-->>UI: file-status "00"
    UI-->>MAIN: ui-method-result=0
    MAIN->>UI: ui-methods="log-message" "UI init OK"
    UI->>Shell: DISPLAY on console

    MAIN->>GEN: CALL primesgen methods="report"
    GEN->>DAL: dal-methods="connect"
    DAL->>DB: EXEC SQL CONNECT
    DB-->>DAL: SQLCODE=0
    DAL-->>GEN: dal-result=0
    GEN->>UI: ui-methods="log-message" "DB init OK"

    GEN->>DAL: dal-methods="cursor"
    DAL->>DB: START TRANSACTION
    DAL->>DB: OPEN primescursor
    DB-->>DAL: SQLCODE=0
    DAL-->>GEN: dal-result=0

    GEN->>DAL: dal-methods="next-prime" (first fetch)
    DAL->>DB: FETCH primescursor
    DB-->>DAL: row (ident, prime)
    DAL-->>GEN: primes-sequence, prime-number

    loop for each row until EOF
        GEN->>UI: ui-methods="write" u-sequence, u-number
        UI->>PRT: accumulate / WRITE line (every 6 entries)
        GEN->>DAL: dal-methods="next-prime"
        DAL->>DB: FETCH primescursor
        DB-->>DAL: row or EOF
        DAL-->>GEN: dal-result (0 or 1)
    end

    GEN->>DAL: dal-methods="disconnect"
    DAL->>DB: CONNECT RESET primes
    DB-->>DAL: SQLCODE=0
    DAL-->>GEN: dal-result=0
    GEN-->>MAIN: EXIT PROGRAM

    MAIN->>UI: ui-methods="log-message" "Run complete"
    MAIN->>UI: ui-methods="stop"
    UI->>PRT: flush + CLOSE
    PRT-->>UI: file-status "00"
    UI-->>MAIN: ui-method-result=0
    MAIN->>Shell: STOP RUN

Terug naar: Primes_programs_specifications | Cobol and PostgreSQL