Flow diagrams
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