<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.webhuis.nl:443/index.php?action=history&amp;feed=atom&amp;title=Technical-Specification</id>
	<title>Technical-Specification - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.webhuis.nl:443/index.php?action=history&amp;feed=atom&amp;title=Technical-Specification"/>
	<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Technical-Specification&amp;action=history"/>
	<updated>2026-09-11T03:31:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Technical-Specification&amp;diff=4699&amp;oldid=prev</id>
		<title>Martin: Created page with &quot;&lt;span id=&quot;technical-specification&quot;&gt;&lt;/span&gt; = Technical Specification =  &lt;blockquote&gt;&#039;&#039;&#039;Document ID:&#039;&#039;&#039; PGCBL-TSD-001 · &#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 · &#039;&#039;&#039;Status:&#039;&#039;&#039; Approved · &#039;&#039;&#039;Last updated:&#039;&#039;&#039; 2026-03-17 &lt;/blockquote&gt; &#039;&#039;&#039;← Business Requirements&#039;&#039;&#039; | Data Dictionary →   -----  &lt;span id=&quot;contents&quot;&gt;&lt;/span&gt; == Contents ==  # System Architecture #* Three-Tier Model #* #12-inter-...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Technical-Specification&amp;diff=4699&amp;oldid=prev"/>
		<updated>2026-03-24T21:28:31Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;span id=&amp;quot;technical-specification&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Technical Specification =  &amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Document ID:&amp;#039;&amp;#039;&amp;#039; PGCBL-TSD-001 · &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 1.0 · &amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Approved · &amp;#039;&amp;#039;&amp;#039;Last updated:&amp;#039;&amp;#039;&amp;#039; 2026-03-17 &amp;lt;/blockquote&amp;gt; &amp;#039;&amp;#039;&amp;#039;← &lt;a href=&quot;/index.php?title=Business-Requirements&quot; title=&quot;Business-Requirements&quot;&gt;Business Requirements&lt;/a&gt;&amp;#039;&amp;#039;&amp;#039; | &lt;a href=&quot;/index.php?title=Data-Dictionary&quot; title=&quot;Data-Dictionary&quot;&gt;Data Dictionary →&lt;/a&gt;   -----  &amp;lt;span id=&amp;quot;contents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == Contents ==  # &lt;a href=&quot;#1-system-architecture&quot;&gt;System Architecture&lt;/a&gt; #* &lt;a href=&quot;#11-three-tier-model&quot;&gt;Three-Tier Model&lt;/a&gt; #* #12-inter-...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span id=&amp;quot;technical-specification&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Technical Specification =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Document ID:&amp;#039;&amp;#039;&amp;#039; PGCBL-TSD-001 · &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 1.0 · &amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Approved · &amp;#039;&amp;#039;&amp;#039;Last updated:&amp;#039;&amp;#039;&amp;#039; 2026-03-17&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;← [[Business-Requirements|Business Requirements]]&amp;#039;&amp;#039;&amp;#039; | [[Data-Dictionary|Data Dictionary →]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;contents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Contents ==&lt;br /&gt;
&lt;br /&gt;
# [[#1-system-architecture|System Architecture]]&lt;br /&gt;
#* [[#11-three-tier-model|Three-Tier Model]]&lt;br /&gt;
#* [[#12-inter-tier-communication-pattern|Inter-Tier Communication Pattern]]&lt;br /&gt;
# [[#2-component-inventory|Component Inventory]]&lt;br /&gt;
# [[#3-pseudocode|Pseudocode]]&lt;br /&gt;
#* [[#31-primesmain|primesmain]]&lt;br /&gt;
#* [[#32-primesgen--generate-path|primesgen — Generate Path]]&lt;br /&gt;
#* [[#33-primesgen--report-path|primesgen — Report Path]]&lt;br /&gt;
#* [[#34-primes-dal|primes (DAL)]]&lt;br /&gt;
#* [[#35-primesui|primesui]]&lt;br /&gt;
# [[#4-database-connection-parameters|Database Connection Parameters]]&lt;br /&gt;
# [[#5-sql-statement-inventory|SQL Statement Inventory]]&lt;br /&gt;
# [[#6-file-io-specification|File I/O Specification]]&lt;br /&gt;
# [[#7-known-technical-issues|Known Technical Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-architecture&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. System Architecture ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;three-tier-model&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.1 Three-Tier Model ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;┌──────────────────────────────────────────────────────┐&lt;br /&gt;
│                    primesmain                        │&lt;br /&gt;
│   Orchestrator · session controller · entry point   │&lt;br /&gt;
│   Source: primesmain.cbl                             │&lt;br /&gt;
└───────────────────────┬──────────────────────────────┘&lt;br /&gt;
                        │ CALL &amp;amp;quot;primesgen&amp;amp;quot; USING primes-session&lt;br /&gt;
              ┌─────────▼──────────────┐&lt;br /&gt;
              │       primesgen        │&lt;br /&gt;
              │  Business Logic tier   │&lt;br /&gt;
              │  Sieve algorithm or    │&lt;br /&gt;
              │  cursor read-loop      │&lt;br /&gt;
              │  Source: primesgen.cbl │&lt;br /&gt;
              └──────┬─────────────────┘&lt;br /&gt;
    CALL &amp;amp;quot;primes&amp;amp;quot;    │           │ CALL &amp;amp;quot;primesui&amp;amp;quot;&lt;br /&gt;
    USING primes-dal │           │ USING primes-ui&lt;br /&gt;
           ┌─────────▼──┐   ┌───▼──────────────┐&lt;br /&gt;
           │   primes   │   │    primesui       │&lt;br /&gt;
           │  Data      │   │  Presentation     │&lt;br /&gt;
           │  Access    │   │  Print file       │&lt;br /&gt;
           │  Layer     │   │  Console log      │&lt;br /&gt;
           │  All SQL   │   │  primesui.cbl     │&lt;br /&gt;
           │  primes.cbl│   └───────────────────┘&lt;br /&gt;
           └──────┬─────┘           │&lt;br /&gt;
                  │ EXEC SQL        │ WRITE to&lt;br /&gt;
                  │ via GixSQL      │ primes.prt&lt;br /&gt;
           ┌──────▼─────────────┐   │&lt;br /&gt;
           │   PostgreSQL 11    │   │&lt;br /&gt;
           │  schema: primes    │   ▼&lt;br /&gt;
           │  table:  primes    │  (file system)&lt;br /&gt;
           └────────────────────┘&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Design rule:&amp;#039;&amp;#039;&amp;#039; SQL appears only in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;. File I/O appears only in &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;. All other programs use the method-dispatch pattern to delegate to these two.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;inter-tier-communication-pattern&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.2 Inter-Tier Communication Pattern ===&lt;br /&gt;
&lt;br /&gt;
Every program-to-program call uses the same protocol:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Step 1  Caller MOVEs a verb string into the control block&amp;#039;s methods field&lt;br /&gt;
           MOVE &amp;amp;quot;connect&amp;amp;quot; TO dal-methods&lt;br /&gt;
&lt;br /&gt;
Step 2  Caller invokes the subprogram, passing the control block by reference&lt;br /&gt;
           CALL &amp;amp;quot;primes&amp;amp;quot; USING primes-dal&lt;br /&gt;
&lt;br /&gt;
Step 3  Callee EVALUATEs the verb and performs the matching paragraph&lt;br /&gt;
           EVALUATE TRUE&lt;br /&gt;
             WHEN db-connect  → PERFORM s00-connect&lt;br /&gt;
             ...&lt;br /&gt;
&lt;br /&gt;
Step 4  Callee sets a result code before EXIT PROGRAM&lt;br /&gt;
           MOVE 0 TO dal-result   ← success&lt;br /&gt;
&lt;br /&gt;
Step 5  Caller inspects the result code&lt;br /&gt;
           IF dal-method-ok THEN ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Tier boundary&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Control block&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Verbs&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Result codes&lt;br /&gt;
|-&lt;br /&gt;
| primesmain → primesgen&lt;br /&gt;
| [[Data-Dictionary#11-primes-session|&amp;lt;code&amp;gt;primes-session&amp;lt;/code&amp;gt;]]&lt;br /&gt;
| &amp;lt;code&amp;gt;report&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;generate&amp;lt;/code&amp;gt;&lt;br /&gt;
| 0=ok · 1=nok · 9=eof&lt;br /&gt;
|-&lt;br /&gt;
| primesgen → primes&lt;br /&gt;
| [[Data-Dictionary#12-primes-dal|&amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt;]]&lt;br /&gt;
| &amp;lt;code&amp;gt;connect&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;cursor&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;next-prime&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;next-divider&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;disconnect&amp;lt;/code&amp;gt;&lt;br /&gt;
| 0=ok · 1=nok · 99=eof&lt;br /&gt;
|-&lt;br /&gt;
| any → primesui&lt;br /&gt;
| [[Data-Dictionary#13-primes-ui|&amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt;]]&lt;br /&gt;
| &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;log-message&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;&lt;br /&gt;
| 0=ok · 1=nok&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;component-inventory&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Component Inventory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;programs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Programs ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Program&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Source file&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Tier&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Contains SQL&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Opens files&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;primesmain.cbl&amp;lt;/code&amp;gt;&lt;br /&gt;
| Orchestrator&lt;br /&gt;
| No&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primesgen&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt;&lt;br /&gt;
| Business logic&lt;br /&gt;
| No&lt;br /&gt;
| No (FD declared but unused)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;&lt;br /&gt;
| Data access&lt;br /&gt;
| Yes — via GixSQL&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;&lt;br /&gt;
| Presentation&lt;br /&gt;
| No&lt;br /&gt;
| Yes — &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybooks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Copybooks ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Copybook&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Root record&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Used by&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-session.cpy&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-session&amp;lt;/code&amp;gt;&lt;br /&gt;
| primesmain · primesgen&lt;br /&gt;
| Session-tier control block&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-dal.cpy&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt;&lt;br /&gt;
| primesgen · primes&lt;br /&gt;
| DAL-tier control block&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-ui.cpy&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| all four&lt;br /&gt;
| UI-tier control block&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-table.cpy&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-table&amp;lt;/code&amp;gt;&lt;br /&gt;
| primes&lt;br /&gt;
| SQL host variables — character format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_table.cpy&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_table&amp;lt;/code&amp;gt;&lt;br /&gt;
| primes&lt;br /&gt;
| SQL host variables — COMP-3 format ⚠ duplicate&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLCA.cpy&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLCA&amp;lt;/code&amp;gt;&lt;br /&gt;
| primes&lt;br /&gt;
| GixSQL SQL Communications Area&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Full field definitions: [[Data-Dictionary#1-control-blocks-copybooks|Data Dictionary → Control Blocks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pseudocode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Pseudocode ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesmain&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 primesmain ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROGRAM primesmain&lt;br /&gt;
  ACCEPT commandline-args FROM COMMAND-LINE      ← PIC X(32)&lt;br /&gt;
&lt;br /&gt;
  MOVE commandline-args TO methods               ← load session control block&lt;br /&gt;
  MOVE &amp;amp;quot;primesmain&amp;amp;quot;     TO program-name&lt;br /&gt;
&lt;br /&gt;
  CALL primesui(&amp;amp;quot;start&amp;amp;quot;)                         ← open primes.prt&lt;br /&gt;
  IF ui-method-result ≠ 0 THEN&lt;br /&gt;
    DISPLAY &amp;amp;quot;Emergency: UI failed&amp;amp;quot; ON console&lt;br /&gt;
    STOP RUN                                     ← hard abort, no cleanup&lt;br /&gt;
&lt;br /&gt;
  LOG &amp;amp;quot;UI initialisation succeeded.&amp;amp;quot;&lt;br /&gt;
  LOG commandline-args&lt;br /&gt;
&lt;br /&gt;
  EVALUATE commandline-args&lt;br /&gt;
    WHEN &amp;amp;quot;report&amp;amp;quot;&lt;br /&gt;
      LOG &amp;amp;quot;Primes report generation starts.&amp;amp;quot;&lt;br /&gt;
      MOVE &amp;amp;quot;report&amp;amp;quot;    TO methods&lt;br /&gt;
      CALL primesgen USING primes-session        ← report path&lt;br /&gt;
&lt;br /&gt;
    WHEN &amp;amp;quot;generate&amp;amp;quot;&lt;br /&gt;
      LOG &amp;amp;quot;Primes generation starts.&amp;amp;quot;&lt;br /&gt;
      MOVE &amp;amp;quot;generate&amp;amp;quot;  TO methods&lt;br /&gt;
      ── CALL primesgen commented out ──         ← ⚠ Defect T1&lt;br /&gt;
&lt;br /&gt;
    WHEN OTHER&lt;br /&gt;
      LOG &amp;amp;quot;Bad parameter, program initialisation failed.&amp;amp;quot;&lt;br /&gt;
      CALL primesui(&amp;amp;quot;stop&amp;amp;quot;)&lt;br /&gt;
      STOP RUN&lt;br /&gt;
  END-EVALUATE&lt;br /&gt;
&lt;br /&gt;
  LOG &amp;amp;quot;Primes run complete, program stops.&amp;amp;quot;&lt;br /&gt;
  CALL primesui(&amp;amp;quot;stop&amp;amp;quot;)                          ← flush + close primes.prt&lt;br /&gt;
  STOP RUN&lt;br /&gt;
END PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesgen-generate-path&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 primesgen — Generate Path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROCEDURE r91-start-primes-generation&lt;br /&gt;
  CALL primes(&amp;amp;quot;connect&amp;amp;quot;)&lt;br /&gt;
  IF dal-method-ok THEN&lt;br /&gt;
    test-divider    = 2                          ← first divisor&lt;br /&gt;
    old-ident       = 1&lt;br /&gt;
    test-number     = 3                          ← first candidate (odd)&lt;br /&gt;
    test-number-sqr = SQRT(3)                    ← COMPUTE test-number ** 0.5&lt;br /&gt;
    LOG &amp;amp;quot;Database initialisation succeeded.&amp;amp;quot;&lt;br /&gt;
  ELSE&lt;br /&gt;
    LOG &amp;amp;quot;Database initialisation failed.&amp;amp;quot;&lt;br /&gt;
    session-result = 1&lt;br /&gt;
    RETURN                                       ← falls through to r99-close-primes&lt;br /&gt;
&lt;br /&gt;
MAIN LOOP — PERFORM r80-test-number UNTIL test-number = 999999999&lt;br /&gt;
&lt;br /&gt;
  PROCEDURE r80-test-number&lt;br /&gt;
    DIVIDE test-number BY test-divider&lt;br /&gt;
           GIVING test-quot REMAINDER test-rest&lt;br /&gt;
&lt;br /&gt;
    EVALUATE TRUE&lt;br /&gt;
      WHEN test-rest = 0                         ← divisible → composite&lt;br /&gt;
        PERFORM r82-next-test-number&lt;br /&gt;
&lt;br /&gt;
      WHEN test-divider &amp;amp;gt; test-number-sqr        ← no factor ≤ √N → prime&lt;br /&gt;
        PERFORM r85-write-prime&lt;br /&gt;
        PERFORM r82-next-test-number&lt;br /&gt;
&lt;br /&gt;
      WHEN OTHER                                 ← keep trying&lt;br /&gt;
        PERFORM r89-get-next-divider&lt;br /&gt;
&lt;br /&gt;
  PROCEDURE r82-next-test-number&lt;br /&gt;
    ADD 2 TO test-number                         ← skip even numbers&lt;br /&gt;
    COMPUTE test-number-sqr = test-number ** 0.5&lt;br /&gt;
    MOVE 1 TO old-ident&lt;br /&gt;
    PERFORM r89-get-next-divider                 ← reload first divisor&lt;br /&gt;
&lt;br /&gt;
  PROCEDURE r85-write-prime&lt;br /&gt;
    MOVE &amp;amp;quot;write&amp;amp;quot; TO ui-methods&lt;br /&gt;
    CALL primes   USING primes-dal               ← INSERT INTO primes (prime)&lt;br /&gt;
    CALL primesui USING primes-ui                ← accumulate in print buffer&lt;br /&gt;
&lt;br /&gt;
  PROCEDURE r89-get-next-divider&lt;br /&gt;
    MOVE &amp;amp;quot;get&amp;amp;quot; TO gen-methods                    ← verb for the local primes group&lt;br /&gt;
    CALL primes USING primes                     ← SELECT prime WHERE ident = old-ident+1&lt;br /&gt;
                                                 ← sets test-divider&lt;br /&gt;
&lt;br /&gt;
END LOOP&lt;br /&gt;
CALL primes(&amp;amp;quot;disconnect&amp;amp;quot;)&lt;br /&gt;
EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesgen-report-path&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.3 primesgen — Report Path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROCEDURE r90-start-primes-report&lt;br /&gt;
  CALL primes(&amp;amp;quot;connect&amp;amp;quot;)&lt;br /&gt;
  IF NOT dal-method-ok THEN&lt;br /&gt;
    LOG &amp;amp;quot;Database initialisation failed.&amp;amp;quot;&lt;br /&gt;
    session-result = 1&lt;br /&gt;
    GOTO r99-close-primes&lt;br /&gt;
&lt;br /&gt;
  CALL primes(&amp;amp;quot;cursor&amp;amp;quot;)                          ← START TRANSACTION; OPEN primescursor&lt;br /&gt;
  IF NOT dal-method-ok THEN&lt;br /&gt;
    LOG &amp;amp;quot;Cursor initialisation failed.&amp;amp;quot;&lt;br /&gt;
    session-result = 1&lt;br /&gt;
    GOTO r99-close-primes&lt;br /&gt;
&lt;br /&gt;
  PERFORM r94-fetch                              ← position cursor on first row&lt;br /&gt;
  IF dal-method-ok THEN&lt;br /&gt;
    LOG &amp;amp;quot;Fetch first row ok.&amp;amp;quot;&lt;br /&gt;
    MOVE 0 TO dal-result&lt;br /&gt;
  ELSE&lt;br /&gt;
    LOG &amp;amp;quot;Fetch first row nok.&amp;amp;quot;&lt;br /&gt;
    MOVE 1 TO dal-result&lt;br /&gt;
&lt;br /&gt;
REPORT LOOP — PERFORM r86-report-primes UNTIL session-method-eof&lt;br /&gt;
&lt;br /&gt;
  PROCEDURE r86-report-primes&lt;br /&gt;
    MOVE &amp;amp;quot;write&amp;amp;quot;     TO ui-methods&lt;br /&gt;
    MOVE primes-data TO u-primes                 ← primes-sequence + prime-number → u-sequence + u-number&lt;br /&gt;
    CALL primesui USING primes-ui                ← write to 6-column print buffer&lt;br /&gt;
    PERFORM r94-fetch                            ← advance cursor&lt;br /&gt;
&lt;br /&gt;
  PROCEDURE r94-fetch&lt;br /&gt;
    MOVE &amp;amp;quot;next-prime&amp;amp;quot; TO dal-methods&lt;br /&gt;
    CALL primes USING primes-dal                 ← FETCH primescursor INTO :primes-row&lt;br /&gt;
    IF NOT dal-method-ok THEN&lt;br /&gt;
      LOG &amp;amp;quot;Fetch failed.&amp;amp;quot;&lt;br /&gt;
      session-result = 1                         ← ⚠ sets nok (1), not eof (9) — loop may not terminate&lt;br /&gt;
                                                 ← See Defect T7 in defect register&lt;br /&gt;
&lt;br /&gt;
END LOOP&lt;br /&gt;
CALL primes(&amp;amp;quot;disconnect&amp;amp;quot;)&lt;br /&gt;
EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primes-dal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.4 primes (DAL) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROGRAM primes  USING primes-dal&lt;br /&gt;
&lt;br /&gt;
  EVALUATE TRUE on dal-methods&lt;br /&gt;
    WHEN db-connect      → PERFORM s00-connect&lt;br /&gt;
    WHEN db-cursor       → PERFORM s01-cursor&lt;br /&gt;
    WHEN next-prime      → PERFORM r80-get-next-prime  (→ s02-fetch)&lt;br /&gt;
    WHEN next-divider    → PERFORM r81-get-next-divider&lt;br /&gt;
    WHEN write-prime     → PERFORM r83-write-prime&lt;br /&gt;
    WHEN db-disconnect   → PERFORM s99-disconnect&lt;br /&gt;
    WHEN OTHER           → MOVE 1 TO dal-result&lt;br /&gt;
  END-EVALUATE&lt;br /&gt;
  EXIT PROGRAM&lt;br /&gt;
&lt;br /&gt;
── s00-connect ──────────────────────────────────────────────────────&lt;br /&gt;
  EXEC SQL&lt;br /&gt;
    CONNECT TO :DATASRC AS primes USER :DBUSR USING :DBPWD&lt;br /&gt;
  END-EXEC&lt;br /&gt;
  IF SQLCODE = 0 THEN dal-result = 0&lt;br /&gt;
  ELSE LOG error; dal-result = 1&lt;br /&gt;
&lt;br /&gt;
── s01-cursor ───────────────────────────────────────────────────────&lt;br /&gt;
  EXEC SQL AT primes START TRANSACTION END-EXEC&lt;br /&gt;
  IF SQLCODE = 0 THEN LOG &amp;amp;quot;Start transaction ok.&amp;amp;quot;&lt;br /&gt;
  ELSE dal-result = 1&lt;br /&gt;
&lt;br /&gt;
  IF dal-method-ok THEN&lt;br /&gt;
    EXEC SQL OPEN primescursor END-EXEC&lt;br /&gt;
    IF SQLCODE = 0 THEN LOG &amp;amp;quot;Start primescursor ok.&amp;amp;quot;&lt;br /&gt;
    ELSE dal-result = 1&lt;br /&gt;
&lt;br /&gt;
── s02-fetch (called by r80-get-next-prime) ─────────────────────────&lt;br /&gt;
  EXEC SQL FETCH primescursor INTO :primes-row END-EXEC&lt;br /&gt;
  IF SQLCODE = 0 THEN&lt;br /&gt;
    primes-sequence = r-ident&lt;br /&gt;
    prime-number    = r-prime&lt;br /&gt;
    dal-result = 0&lt;br /&gt;
  ELSE LOG error; dal-result = 1&lt;br /&gt;
&lt;br /&gt;
── r81-get-next-divider ─────────────────────────────────────────────&lt;br /&gt;
  ADD 1 TO old-ident GIVING new-ident&lt;br /&gt;
  EXEC SQL AT primes&lt;br /&gt;
    SELECT prime INTO :test-divider&lt;br /&gt;
    FROM primes WHERE ident = :new-ident&lt;br /&gt;
  END-EXEC&lt;br /&gt;
  IF SQLCODE ≠ 0 THEN DISPLAY SQLCODE; DISPLAY &amp;amp;quot;select new-divider nok&amp;amp;quot;&lt;br /&gt;
  MOVE new-ident TO old-ident&lt;br /&gt;
&lt;br /&gt;
── r83-write-prime ──────────────────────────────────────────────────&lt;br /&gt;
  EXEC SQL AT primes&lt;br /&gt;
    INSERT INTO primes (prime) VALUES (:prime)&lt;br /&gt;
  END-EXEC&lt;br /&gt;
  IF SQLCODE ≠ 0 THEN DISPLAY SQLCODE; DISPLAY &amp;amp;quot;insert nok: &amp;amp;quot; prime-number&lt;br /&gt;
  ── COMMIT is commented out ──                  ← ⚠ Defect T3&lt;br /&gt;
&lt;br /&gt;
── s99-disconnect ───────────────────────────────────────────────────&lt;br /&gt;
  EXEC SQL CONNECT RESET primes END-EXEC         ← ⚠ Defect T2: cbsql.out shows &amp;amp;quot;primesdb&amp;amp;quot;&lt;br /&gt;
  IF SQLCODE = 0 THEN dal-result = 0&lt;br /&gt;
  ELSE dal-result = 1&lt;br /&gt;
  DISPLAY &amp;amp;quot;s99 disconnect from database&amp;amp;quot;&lt;br /&gt;
  DISPLAY SQLCODE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.5 primesui ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROGRAM primesui  USING primes-ui&lt;br /&gt;
&lt;br /&gt;
  EVALUATE TRUE on ui-methods&lt;br /&gt;
    WHEN start-ui    → PERFORM r90-start-primesui&lt;br /&gt;
    WHEN write-ui    → PERFORM r92-write-primesui&lt;br /&gt;
    WHEN message-ui  → PERFORM r98-message-ui&lt;br /&gt;
    WHEN stop-ui     → PERFORM r99-stop-primesui&lt;br /&gt;
    WHEN OTHER       → MOVE 1 TO ui-method-result&lt;br /&gt;
  END-EVALUATE&lt;br /&gt;
  EXIT PROGRAM&lt;br /&gt;
&lt;br /&gt;
── r90-start-primesui ───────────────────────────────────────────────&lt;br /&gt;
  OPEN OUTPUT fprinter  (primes.prt)&lt;br /&gt;
  IF primes-prt-status = &amp;amp;quot;00&amp;amp;quot; THEN&lt;br /&gt;
    SET primes-idx TO 1&lt;br /&gt;
    MOVE 0 TO ui-method-result&lt;br /&gt;
    LOG &amp;amp;quot;Open printer Ok&amp;amp;quot;&lt;br /&gt;
  ELSE&lt;br /&gt;
    MOVE 1 TO ui-method-result&lt;br /&gt;
    DISPLAY primes-prt-status ON console&lt;br /&gt;
&lt;br /&gt;
── r92-write-primesui ───────────────────────────────────────────────&lt;br /&gt;
  t-ident(primes-idx) = u-sequence               ← load into current cell&lt;br /&gt;
  t-prime(primes-idx) = u-number&lt;br /&gt;
  SET primes-idx UP BY 1                         ← advance index&lt;br /&gt;
&lt;br /&gt;
  IF new-page THEN PERFORM r93-new-page          ← heading + column header&lt;br /&gt;
&lt;br /&gt;
  IF primes-idx = 7 THEN                         ← 6 entries filled&lt;br /&gt;
    WRITE file-buffer FROM primes-table          ← 132-char data line&lt;br /&gt;
    SET primes-idx TO 1&lt;br /&gt;
&lt;br /&gt;
  IF linage-counter = 53 THEN                    ← 3 lines from page end&lt;br /&gt;
    PERFORM r94-eop                              ← footing + page increment&lt;br /&gt;
&lt;br /&gt;
── r93-new-page ─────────────────────────────────────────────────────&lt;br /&gt;
  WRITE primes-heading   (=&amp;amp;quot;primes overview&amp;amp;quot;)&lt;br /&gt;
  WRITE table-header     (=&amp;amp;quot;Sequence  Prime  &amp;amp;quot; × 6)&lt;br /&gt;
  MOVE ZERO TO print-new-page                    ← clear flag&lt;br /&gt;
&lt;br /&gt;
── r94-eop ──────────────────────────────────────────────────────────&lt;br /&gt;
  WRITE blank line&lt;br /&gt;
  WRITE primes-footing   (right-aligned &amp;amp;quot;page: ZZZZ9&amp;amp;quot;)&lt;br /&gt;
  ADD 1 TO page-number&lt;br /&gt;
  MOVE 1 TO print-new-page                       ← trigger heading on next write&lt;br /&gt;
&lt;br /&gt;
── r98-message-ui ───────────────────────────────────────────────────&lt;br /&gt;
  DISPLAY process-message UPON scherm            ← program-name + paragraph + message&lt;br /&gt;
&lt;br /&gt;
── r99-stop-primesui ────────────────────────────────────────────────&lt;br /&gt;
  MOVE 0 TO u-sequence&lt;br /&gt;
  MOVE 0 TO u-number&lt;br /&gt;
  PERFORM r92-write-primesui UNTIL new-page      ← flush partial line with zeros&lt;br /&gt;
  LOG &amp;amp;quot;close printer&amp;amp;quot;&lt;br /&gt;
  CLOSE fprinter&lt;br /&gt;
  MOVE primes-prt-status TO ui-method-result&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;database-connection-parameters&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Database Connection Parameters ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Parameter&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Driver&lt;br /&gt;
| &amp;lt;code&amp;gt;pgsql&amp;lt;/code&amp;gt; (GixSQL native PostgreSQL driver)&lt;br /&gt;
|-&lt;br /&gt;
| Host&lt;br /&gt;
| &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Port&lt;br /&gt;
| &amp;lt;code&amp;gt;5432&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Database name&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Schema&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; (set via &amp;lt;code&amp;gt;default_schema=primes&amp;lt;/code&amp;gt; in connection string)&lt;br /&gt;
|-&lt;br /&gt;
| Connection alias&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; (used in all &amp;lt;code&amp;gt;EXEC SQL AT primes&amp;lt;/code&amp;gt; clauses)&lt;br /&gt;
|-&lt;br /&gt;
| User&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_user&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Password&lt;br /&gt;
| &amp;lt;code&amp;gt;pr1mes_user&amp;lt;/code&amp;gt; ⚠ hard-coded — see [[#7-known-technical-issues|Defect T5]]&lt;br /&gt;
|-&lt;br /&gt;
| Full connection string&lt;br /&gt;
| &amp;lt;code&amp;gt;pgsql://localhost:5432/primes&amp;amp;amp;default_schema=primes&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sql-statement-inventory&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. SQL Statement Inventory ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Statement&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Paragraph&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Path&lt;br /&gt;
|-&lt;br /&gt;
| S1&lt;br /&gt;
| &amp;lt;code&amp;gt;CONNECT TO :DATASRC AS primes USER :DBUSR USING :DBPWD&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;s00-connect&amp;lt;/code&amp;gt;&lt;br /&gt;
| Both&lt;br /&gt;
|-&lt;br /&gt;
| S2&lt;br /&gt;
| &amp;lt;code&amp;gt;START TRANSACTION&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;s01-cursor&amp;lt;/code&amp;gt;&lt;br /&gt;
| Report only&lt;br /&gt;
|-&lt;br /&gt;
| S3&lt;br /&gt;
| &amp;lt;code&amp;gt;DECLARE primescursor CURSOR FOR SELECT * FROM primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| Compile-time&lt;br /&gt;
| Report only&lt;br /&gt;
|-&lt;br /&gt;
| S4&lt;br /&gt;
| &amp;lt;code&amp;gt;OPEN primescursor&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;s01-cursor&amp;lt;/code&amp;gt;&lt;br /&gt;
| Report only&lt;br /&gt;
|-&lt;br /&gt;
| S5&lt;br /&gt;
| &amp;lt;code&amp;gt;FETCH primescursor INTO :primes-row&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;s02-fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
| Report only&lt;br /&gt;
|-&lt;br /&gt;
| S6&lt;br /&gt;
| &amp;lt;code&amp;gt;SELECT prime INTO :test-divider FROM primes WHERE ident = :new-ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;r81-get-next-divider&amp;lt;/code&amp;gt;&lt;br /&gt;
| Generate only&lt;br /&gt;
|-&lt;br /&gt;
| S7&lt;br /&gt;
| &amp;lt;code&amp;gt;INSERT INTO primes (prime) VALUES (:prime)&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;r83-write-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| Generate only&lt;br /&gt;
|-&lt;br /&gt;
| S8&lt;br /&gt;
| &amp;lt;code&amp;gt;CONNECT RESET primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;s99-disconnect&amp;lt;/code&amp;gt;&lt;br /&gt;
| Both&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Host variable mappings:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| SQL host variable&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| COBOL field&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| PICTURE&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Source&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;:DATASRC&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;DATASRC&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;PIC X(64)&amp;lt;/code&amp;gt;&lt;br /&gt;
| WS — &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;:DBUSR&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;DBUSR&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;PIC X(64)&amp;lt;/code&amp;gt;&lt;br /&gt;
| WS — &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;:DBPWD&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;DBPWD&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;PIC X(64)&amp;lt;/code&amp;gt;&lt;br /&gt;
| WS — &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;:primes-row&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-row&amp;lt;/code&amp;gt; group&lt;br /&gt;
| r-ident + r-prime &amp;lt;code&amp;gt;COMP-3&amp;lt;/code&amp;gt;&lt;br /&gt;
| WS — &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;:test-divider&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;test-divider&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;PIC 9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| WS — &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; local &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; group&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;:new-ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;new-ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;PIC 9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| WS — &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; local &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; group&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;:prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;prime-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;PIC 9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Linkage — &amp;lt;code&amp;gt;primes-dal.primes-data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;file-io-specification&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. File I/O Specification ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;print-file-primes.prt&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Print file &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Property&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Logical name&lt;br /&gt;
| &amp;lt;code&amp;gt;fprinter&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Physical name&lt;br /&gt;
| &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; (relative to working directory)&lt;br /&gt;
|-&lt;br /&gt;
| Organisation&lt;br /&gt;
| Line-sequential&lt;br /&gt;
|-&lt;br /&gt;
| Record length&lt;br /&gt;
| 132 characters&lt;br /&gt;
|-&lt;br /&gt;
| Linage&lt;br /&gt;
| 56 lines per page&lt;br /&gt;
|-&lt;br /&gt;
| Footing area&lt;br /&gt;
| Lines 55–56 (last 2 of linage)&lt;br /&gt;
|-&lt;br /&gt;
| Bottom margin&lt;br /&gt;
| 2 lines&lt;br /&gt;
|-&lt;br /&gt;
| Top margin&lt;br /&gt;
| 0 (not specified)&lt;br /&gt;
|-&lt;br /&gt;
| Open mode&lt;br /&gt;
| &amp;lt;code&amp;gt;OUTPUT&amp;lt;/code&amp;gt; (write-only; created fresh each run)&lt;br /&gt;
|-&lt;br /&gt;
| File-status field&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-prt-status&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;PIC X(2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EOP trigger&lt;br /&gt;
| &amp;lt;code&amp;gt;linage-counter = 53&amp;lt;/code&amp;gt; (3 lines before page end)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;record-types&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Record types ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Record&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Content&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Width&lt;br /&gt;
|-&lt;br /&gt;
| Page heading&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;quot;primes overview&amp;amp;quot;&amp;lt;/code&amp;gt; left-justified&lt;br /&gt;
| 118 + 14 padding = 132&lt;br /&gt;
|-&lt;br /&gt;
| Column header&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;quot;Sequence  Prime  &amp;amp;quot;&amp;lt;/code&amp;gt; × 6&lt;br /&gt;
| 132&lt;br /&gt;
|-&lt;br /&gt;
| Data line&lt;br /&gt;
| 6 × (&amp;lt;code&amp;gt;Z(9)&amp;lt;/code&amp;gt; seq + &amp;lt;code&amp;gt;X(2)&amp;lt;/code&amp;gt; sp + &amp;lt;code&amp;gt;Z(9)&amp;lt;/code&amp;gt; prime + &amp;lt;code&amp;gt;X(2)&amp;lt;/code&amp;gt; sp)&lt;br /&gt;
| 132&lt;br /&gt;
|-&lt;br /&gt;
| Blank separator&lt;br /&gt;
| Spaces&lt;br /&gt;
| 132&lt;br /&gt;
|-&lt;br /&gt;
| Page footing&lt;br /&gt;
| 118 spaces + &amp;lt;code&amp;gt;&amp;amp;quot;page: &amp;amp;quot;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;Z(3)9&amp;lt;/code&amp;gt;&lt;br /&gt;
| 132&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;known-technical-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Known Technical Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Severity&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Description&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Impact&lt;br /&gt;
|-&lt;br /&gt;
| T1&lt;br /&gt;
| 🔴 High&lt;br /&gt;
| Generate loop (&amp;lt;code&amp;gt;PERFORM r80-test-number&amp;lt;/code&amp;gt;) is commented out in &amp;lt;code&amp;gt;primesmain.cbl&amp;lt;/code&amp;gt; line 51&lt;br /&gt;
| &amp;lt;code&amp;gt;generate&amp;lt;/code&amp;gt; mode does not execute the sieve&lt;br /&gt;
|-&lt;br /&gt;
| T2&lt;br /&gt;
| 🔴 High&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_cbsql.out&amp;lt;/code&amp;gt; shows disconnect targeting alias &amp;lt;code&amp;gt;primesdb&amp;lt;/code&amp;gt;; runtime code uses alias &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| Disconnect call will fail with alias-not-found error at runtime&lt;br /&gt;
|-&lt;br /&gt;
| T3&lt;br /&gt;
| 🟡 Medium&lt;br /&gt;
| COMMIT after INSERT is commented out in &amp;lt;code&amp;gt;r83-write-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| Relies on PostgreSQL auto-commit; INSERTs will not commit if an explicit transaction is open&lt;br /&gt;
|-&lt;br /&gt;
| T4&lt;br /&gt;
| 🟡 Medium&lt;br /&gt;
| Prime 2 is not seeded by the algorithm; sieve starts at 3 with &amp;lt;code&amp;gt;old-ident = 1&amp;lt;/code&amp;gt;, assuming a row exists at &amp;lt;code&amp;gt;ident = 2&amp;lt;/code&amp;gt;&lt;br /&gt;
| Divider lookup will fail or return wrong value on a fresh empty database&lt;br /&gt;
|-&lt;br /&gt;
| T5&lt;br /&gt;
| 🟠 Medium&lt;br /&gt;
| Database credentials hard-coded in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; WORKING-STORAGE&lt;br /&gt;
| Credential rotation requires recompile; credentials visible in binary&lt;br /&gt;
|-&lt;br /&gt;
| T6&lt;br /&gt;
| 🔵 Low&lt;br /&gt;
| Two near-duplicate host-variable copybooks: &amp;lt;code&amp;gt;primes-table.cpy&amp;lt;/code&amp;gt; (char) and &amp;lt;code&amp;gt;primes_table.cpy&amp;lt;/code&amp;gt; (COMP-3, underscore)&lt;br /&gt;
| Ambiguity about which is canonical; risk of one being stale&lt;br /&gt;
|-&lt;br /&gt;
| T7&lt;br /&gt;
| 🟡 Medium&lt;br /&gt;
| On fetch failure, &amp;lt;code&amp;gt;session-result&amp;lt;/code&amp;gt; is set to 1 (nok), not 9 (eof); the report loop condition &amp;lt;code&amp;gt;session-method-eof&amp;lt;/code&amp;gt; (value 9) is never triggered by normal cursor exhaustion&lt;br /&gt;
| Report loop may not terminate cleanly at end of data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;← [[Business-Requirements|Business Requirements]]&amp;#039;&amp;#039;&amp;#039; | [[Data-Dictionary|Data Dictionary →]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
</feed>