<?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_specifications</id>
	<title>Technical specifications - 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_specifications"/>
	<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Technical_specifications&amp;action=history"/>
	<updated>2026-09-11T05:42:49Z</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_specifications&amp;diff=4767&amp;oldid=prev</id>
		<title>Martin: Created page with &quot;&lt;span id=&quot;technical-specification&quot;&gt;&lt;/span&gt; = Technical Specification =  &#039;&#039;&#039;Project:&#039;&#039;&#039; pgcobol — Prime Numbers Application&lt;br /&gt; &#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 (reverse-engineered)&lt;br /&gt; &#039;&#039;&#039;Date:&#039;&#039;&#039; 2026-03-17   -----  &lt;span id=&quot;technology-stack&quot;&gt;&lt;/span&gt; == 1. Technology Stack ==  {| !width=&quot;50%&quot;| Component !width=&quot;50%&quot;| Technology |- | Runtime | GnuCOBOL 4.0, Linux |- | SQL pre-processor | GixSQL (translates EXEC SQL … END-EXEC to GIXSQLExec calls) |- | Database server | Postgr...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Technical_specifications&amp;diff=4767&amp;oldid=prev"/>
		<updated>2026-03-25T16:44:47Z</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;#039;&amp;#039;&amp;#039;Project:&amp;#039;&amp;#039;&amp;#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2026-03-17   -----  &amp;lt;span id=&amp;quot;technology-stack&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. Technology Stack ==  {| !width=&amp;quot;50%&amp;quot;| Component !width=&amp;quot;50%&amp;quot;| Technology |- | Runtime | GnuCOBOL 4.0, Linux |- | SQL pre-processor | GixSQL (translates EXEC SQL … END-EXEC to GIXSQLExec calls) |- | Database server | Postgr...&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;#039;&amp;#039;&amp;#039;Project:&amp;#039;&amp;#039;&amp;#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2026-03-17&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;technology-stack&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Technology Stack ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Component&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Technology&lt;br /&gt;
|-&lt;br /&gt;
| Runtime&lt;br /&gt;
| GnuCOBOL 4.0, Linux&lt;br /&gt;
|-&lt;br /&gt;
| SQL pre-processor&lt;br /&gt;
| GixSQL (translates EXEC SQL … END-EXEC to GIXSQLExec calls)&lt;br /&gt;
|-&lt;br /&gt;
| Database server&lt;br /&gt;
| PostgreSQL 11.22, localhost:5432&lt;br /&gt;
|-&lt;br /&gt;
| Database schema&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Credentials&lt;br /&gt;
| user &amp;lt;code&amp;gt;primes_user&amp;lt;/code&amp;gt;, password &amp;lt;code&amp;gt;pr1mes_user&amp;lt;/code&amp;gt; (hard-coded)&lt;br /&gt;
|-&lt;br /&gt;
| Output file&lt;br /&gt;
| &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; — line-sequential, 132 chars/record, linage 56&lt;br /&gt;
|-&lt;br /&gt;
| Console&lt;br /&gt;
| GnuCOBOL special-name &amp;lt;code&amp;gt;scherm&amp;lt;/code&amp;gt; mapped to system console&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-architecture&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Component Architecture ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;┌─────────────────────────────────────────────────────┐&lt;br /&gt;
│                   primesmain                        │  ← Entry point / orchestrator&lt;br /&gt;
│  WORKING-STORAGE: commandline-args                  │&lt;br /&gt;
│  COPY: primes-session, primes-ui                    │&lt;br /&gt;
└────────────┬────────────────────────────────────────┘&lt;br /&gt;
             │ CALL &amp;amp;quot;primesgen&amp;amp;quot; USING primes-session&lt;br /&gt;
             ▼&lt;br /&gt;
┌─────────────────────────────────────────────────────┐&lt;br /&gt;
│                   primesgen                         │  ← Business logic / sieve engine&lt;br /&gt;
│  WORKING-STORAGE: primes (local), printer           │&lt;br /&gt;
│  COPY (linkage): primes-session                     │&lt;br /&gt;
│  COPY (local):   primes-ui, primes-dal              │&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;
┌──────────────────┐   ┌──────────────────────────────┐&lt;br /&gt;
│     primes       │   │          primesui             │  ← Presentation / output&lt;br /&gt;
│  (DAL + SQL)     │   │  FILE: fprinter → primes.prt  │&lt;br /&gt;
│  EXEC SQL via    │   │  WORKING-STORAGE: primes-table│&lt;br /&gt;
│  GixSQL          │   │  COPY (linkage): primes-ui    │&lt;br /&gt;
└──────────────────┘   └──────────────────────────────┘&lt;br /&gt;
         │&lt;br /&gt;
         ▼&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│   PostgreSQL     │&lt;br /&gt;
│  schema: primes  │&lt;br /&gt;
│  table:  primes  │&lt;br /&gt;
└──────────────────┘&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;inter-tier-interface-contracts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Inter-Tier Interface Contracts ==&lt;br /&gt;
&lt;br /&gt;
All communication between tiers uses method-dispatch over shared copybook control blocks. A caller sets a verb string in the &amp;lt;code&amp;gt;methods&amp;lt;/code&amp;gt; field, invokes the subprogram, and reads the result code on return.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;session-tier-primes-session&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Session tier — &amp;lt;code&amp;gt;primes-session&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;primes-session&lt;br /&gt;
  methods          PIC X(32)          verb sent by caller&lt;br /&gt;
    88 report-primes   &amp;amp;quot;report&amp;amp;quot;&lt;br /&gt;
    88 generate-primes &amp;amp;quot;generate&amp;amp;quot;&lt;br /&gt;
    88 start-primes    &amp;amp;quot;start&amp;amp;quot;&lt;br /&gt;
    88 stop-primes     &amp;amp;quot;stop&amp;amp;quot;&lt;br /&gt;
    88 invalid-method  &amp;amp;quot;bad&amp;amp;quot;&lt;br /&gt;
  session-result   PIC 9(2)           set by callee&lt;br /&gt;
    88 session-method-ok   0&lt;br /&gt;
    88 session-method-nok  1&lt;br /&gt;
    88 session-method-eof  9&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;dal-tier-primes-dal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 DAL tier — &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;primes-dal&lt;br /&gt;
  dal-methods      PIC X(32)          verb sent by caller&lt;br /&gt;
    88 next-prime      &amp;amp;quot;next-prime&amp;amp;quot;&lt;br /&gt;
    88 next-divider    &amp;amp;quot;next-divider&amp;amp;quot;&lt;br /&gt;
    88 write-prime     &amp;amp;quot;write&amp;amp;quot;&lt;br /&gt;
    88 db-cursor       &amp;amp;quot;cursor&amp;amp;quot;&lt;br /&gt;
    88 db-connect      &amp;amp;quot;connect&amp;amp;quot;&lt;br /&gt;
    88 db-disconnect   &amp;amp;quot;disconnect&amp;amp;quot;&lt;br /&gt;
  primes-data                         data payload (one row)&lt;br /&gt;
    primes-sequence  PIC 9(9)         ident from DB&lt;br /&gt;
    prime-number     PIC 9(9)         prime value from DB&lt;br /&gt;
  dal-result       PIC 9(2)           set by callee&lt;br /&gt;
    88 dal-method-ok   0&lt;br /&gt;
    88 dal-method-nok  1&lt;br /&gt;
    88 dal-method-eof  99&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;ui-tier-primes-ui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.3 UI tier — &amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;primes-ui&lt;br /&gt;
  ui-methods       PIC X(32)          verb sent by caller&lt;br /&gt;
    88 start-ui        &amp;amp;quot;start&amp;amp;quot;&lt;br /&gt;
    88 write-ui        &amp;amp;quot;write&amp;amp;quot;&lt;br /&gt;
    88 message-ui      &amp;amp;quot;log-message&amp;amp;quot;&lt;br /&gt;
    88 stop-ui         &amp;amp;quot;stop&amp;amp;quot;&lt;br /&gt;
  process-message                     structured console message&lt;br /&gt;
    program-name     PIC X(20)&lt;br /&gt;
    program-paragraph PIC X(20)&lt;br /&gt;
    program-message  PIC X(92)&lt;br /&gt;
  u-primes                            one prime row for print output&lt;br /&gt;
    u-sequence       PIC 9(9)&lt;br /&gt;
    u-number         PIC 9(9)&lt;br /&gt;
  ui-method-result PIC 9(2)           set by callee&lt;br /&gt;
    88 ui-method-ok    0&lt;br /&gt;
    88 ui-method-nok   1&amp;lt;/pre&amp;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;
== 4. 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;
=== 4.1 primesmain ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROGRAM primesmain&lt;br /&gt;
  INPUT: command-line argument → commandline-args&lt;br /&gt;
&lt;br /&gt;
  CALL primesui(&amp;amp;quot;start&amp;amp;quot;)&lt;br /&gt;
  IF ui-method-ok THEN&lt;br /&gt;
    LOG &amp;amp;quot;UI initialisation succeeded.&amp;amp;quot;&lt;br /&gt;
    LOG commandline-args&lt;br /&gt;
  ELSE&lt;br /&gt;
    DISPLAY emergency message on console&lt;br /&gt;
    STOP&lt;br /&gt;
&lt;br /&gt;
  CASE commandline-args OF&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;quot;report&amp;amp;quot;:&lt;br /&gt;
      LOG &amp;amp;quot;Primes report generation starts.&amp;amp;quot;&lt;br /&gt;
      SET methods = &amp;amp;quot;report&amp;amp;quot;&lt;br /&gt;
      CALL primesgen(primes-session)       -- report flow&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;quot;generate&amp;amp;quot;:&lt;br /&gt;
      LOG &amp;amp;quot;Primes generation starts.&amp;amp;quot;&lt;br /&gt;
      SET methods = &amp;amp;quot;generate&amp;amp;quot;&lt;br /&gt;
      -- NOTE: CALL primesgen commented out in current source&lt;br /&gt;
&lt;br /&gt;
    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&lt;br /&gt;
&lt;br /&gt;
  END CASE&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;)&lt;br /&gt;
  STOP&lt;br /&gt;
END PROGRAM&amp;lt;/pre&amp;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;
=== 4.2 primesgen — report path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROCEDURE report-path&lt;br /&gt;
  CALL primes-dal(&amp;amp;quot;connect&amp;amp;quot;)&lt;br /&gt;
  IF dal-method-ok THEN&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;
    SET session-result = 1&lt;br /&gt;
    RETURN&lt;br /&gt;
&lt;br /&gt;
  CALL primes-dal(&amp;amp;quot;cursor&amp;amp;quot;)           -- START TRANSACTION + OPEN primescursor&lt;br /&gt;
  IF dal-method-ok THEN&lt;br /&gt;
    LOG &amp;amp;quot;Cursor initialisation succeeded.&amp;amp;quot;&lt;br /&gt;
  ELSE&lt;br /&gt;
    LOG &amp;amp;quot;Cursor initialisation failed.&amp;amp;quot;&lt;br /&gt;
    SET session-result = 1&lt;br /&gt;
    RETURN&lt;br /&gt;
&lt;br /&gt;
  FETCH first row via primes-dal(&amp;amp;quot;next-prime&amp;amp;quot;)&lt;br /&gt;
  IF fetch fails THEN&lt;br /&gt;
    LOG &amp;amp;quot;Fetch first row nok.&amp;amp;quot;&lt;br /&gt;
    SET dal-result = 1&lt;br /&gt;
&lt;br /&gt;
  LOOP UNTIL session-method-eof&lt;br /&gt;
    SET u-sequence = primes-sequence&lt;br /&gt;
    SET u-number   = prime-number&lt;br /&gt;
    CALL primesui(&amp;amp;quot;write&amp;amp;quot;)            -- accumulate into print buffer&lt;br /&gt;
    CALL primes-dal(&amp;amp;quot;next-prime&amp;amp;quot;)     -- advance cursor&lt;br /&gt;
  END LOOP&lt;br /&gt;
END PROCEDURE&amp;lt;/pre&amp;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;
=== 4.3 primesgen — generate path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROCEDURE generate-path&lt;br /&gt;
  CALL primes-dal(&amp;amp;quot;connect&amp;amp;quot;)&lt;br /&gt;
  IF dal-method-ok THEN&lt;br /&gt;
    SET test-divider   = 2&lt;br /&gt;
    SET old-ident      = 1&lt;br /&gt;
    SET test-number    = 3&lt;br /&gt;
    SET test-number-sqr = SQRT(3)&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;
    SET session-result = 1&lt;br /&gt;
    RETURN&lt;br /&gt;
&lt;br /&gt;
  LOOP UNTIL test-number = 999,999,999&lt;br /&gt;
&lt;br /&gt;
    DIVIDE test-number BY test-divider → test-quot REMAINDER test-rest&lt;br /&gt;
&lt;br /&gt;
    CASE OF&lt;br /&gt;
      test-rest = 0:&lt;br /&gt;
        -- test-number is composite; move to next candidate&lt;br /&gt;
        ADD 2 TO test-number&lt;br /&gt;
        SET test-number-sqr = SQRT(test-number)&lt;br /&gt;
        SET old-ident = 1&lt;br /&gt;
        FETCH divider[old-ident+1] via primes-dal(&amp;amp;quot;next-divider&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      test-divider &amp;amp;gt; test-number-sqr:&lt;br /&gt;
        -- no factor found up to sqrt; test-number is prime&lt;br /&gt;
        CALL primes-dal(&amp;amp;quot;write&amp;amp;quot;)      -- INSERT INTO primes&lt;br /&gt;
        CALL primesui(&amp;amp;quot;write&amp;amp;quot;)        -- add to print buffer&lt;br /&gt;
        ADD 2 TO test-number&lt;br /&gt;
        SET test-number-sqr = SQRT(test-number)&lt;br /&gt;
        SET old-ident = 1&lt;br /&gt;
        FETCH divider[old-ident+1] via primes-dal(&amp;amp;quot;next-divider&amp;amp;quot;)&lt;br /&gt;
&lt;br /&gt;
      OTHERWISE:&lt;br /&gt;
        -- try next divider from DB&lt;br /&gt;
        FETCH divider[old-ident+1] via primes-dal(&amp;amp;quot;next-divider&amp;amp;quot;)&lt;br /&gt;
    END CASE&lt;br /&gt;
&lt;br /&gt;
  END LOOP&lt;br /&gt;
END PROCEDURE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;primes-dal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.4 primes (DAL) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROGRAM primes&lt;br /&gt;
  LINKAGE: primes-dal&lt;br /&gt;
&lt;br /&gt;
  CASE dal-methods OF&lt;br /&gt;
    &amp;amp;quot;connect&amp;amp;quot;:&lt;br /&gt;
      EXEC SQL CONNECT TO datasrc AS primes USER dbusr USING dbpwd&lt;br /&gt;
      IF SQLCODE = 0 THEN dal-result = 0 ELSE dal-result = 1&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;quot;cursor&amp;amp;quot;:&lt;br /&gt;
      EXEC SQL AT primes START TRANSACTION&lt;br /&gt;
      IF SQLCODE = 0 THEN&lt;br /&gt;
        EXEC SQL OPEN primescursor&lt;br /&gt;
        IF SQLCODE = 0 THEN dal-result = 0 ELSE dal-result = 1&lt;br /&gt;
      ELSE dal-result = 1&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;quot;next-prime&amp;amp;quot;:&lt;br /&gt;
      EXEC SQL FETCH primescursor INTO :primes-row&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 dal-result = 1&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;quot;next-divider&amp;amp;quot;:&lt;br /&gt;
      new-ident = old-ident + 1&lt;br /&gt;
      EXEC SQL SELECT prime INTO :test-divider&lt;br /&gt;
               FROM primes WHERE ident = :new-ident&lt;br /&gt;
      old-ident = new-ident&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;quot;write&amp;amp;quot;:&lt;br /&gt;
      EXEC SQL INSERT INTO primes (prime) VALUES (:prime)&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;quot;disconnect&amp;amp;quot;:&lt;br /&gt;
      EXEC SQL CONNECT RESET primes&lt;br /&gt;
      IF SQLCODE = 0 THEN dal-result = 0 ELSE dal-result = 1&lt;br /&gt;
&lt;br /&gt;
    OTHER:&lt;br /&gt;
      dal-result = 1&lt;br /&gt;
  END CASE&lt;br /&gt;
  EXIT PROGRAM&lt;br /&gt;
END PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.5 primesui ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROGRAM primesui&lt;br /&gt;
  LINKAGE: primes-ui&lt;br /&gt;
&lt;br /&gt;
  CASE ui-methods OF&lt;br /&gt;
    &amp;amp;quot;start&amp;amp;quot;:&lt;br /&gt;
      OPEN OUTPUT fprinter (primes.prt)&lt;br /&gt;
      IF file-status = &amp;amp;quot;00&amp;amp;quot; THEN&lt;br /&gt;
        ui-method-result = 0&lt;br /&gt;
        primes-idx = 1&lt;br /&gt;
      ELSE&lt;br /&gt;
        ui-method-result = 1&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;quot;write&amp;amp;quot;:&lt;br /&gt;
      t-ident(primes-idx) = u-sequence&lt;br /&gt;
      t-prime(primes-idx) = u-number&lt;br /&gt;
      primes-idx = primes-idx + 1&lt;br /&gt;
      IF new-page THEN write heading + column header&lt;br /&gt;
      IF primes-idx = 7 THEN&lt;br /&gt;
        WRITE primes-table line to fprinter&lt;br /&gt;
        primes-idx = 1&lt;br /&gt;
      IF linage-counter = 53 THEN write footing, increment page&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;quot;log-message&amp;amp;quot;:&lt;br /&gt;
      DISPLAY process-message ON CONSOLE&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;quot;stop&amp;amp;quot;:&lt;br /&gt;
      LOOP writing zero rows UNTIL new-page   -- flush partial line&lt;br /&gt;
      CLOSE fprinter&lt;br /&gt;
&lt;br /&gt;
  END CASE&lt;br /&gt;
  EXIT PROGRAM&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;database-interface-specification&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Database Interface Specification ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;connection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.1 Connection ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Parameter&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Driver&lt;br /&gt;
| GixSQL pgsql&lt;br /&gt;
|-&lt;br /&gt;
| Host&lt;br /&gt;
| localhost&lt;br /&gt;
|-&lt;br /&gt;
| Port&lt;br /&gt;
| 5432&lt;br /&gt;
|-&lt;br /&gt;
| Database&lt;br /&gt;
| primes&lt;br /&gt;
|-&lt;br /&gt;
| Schema search path&lt;br /&gt;
| primes&lt;br /&gt;
|-&lt;br /&gt;
| Connection alias&lt;br /&gt;
| primes&lt;br /&gt;
|-&lt;br /&gt;
| User&lt;br /&gt;
| primes_user&lt;br /&gt;
|-&lt;br /&gt;
| Password&lt;br /&gt;
| pr1mes_user&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sql-statements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.2 SQL Statements ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Statement&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Called from&lt;br /&gt;
|-&lt;br /&gt;
| S-01&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;
| s00-connect&lt;br /&gt;
|-&lt;br /&gt;
| S-02&lt;br /&gt;
| &amp;lt;code&amp;gt;START TRANSACTION&amp;lt;/code&amp;gt;&lt;br /&gt;
| s01-cursor&lt;br /&gt;
|-&lt;br /&gt;
| S-03&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;
|-&lt;br /&gt;
| S-04&lt;br /&gt;
| &amp;lt;code&amp;gt;OPEN primescursor&amp;lt;/code&amp;gt;&lt;br /&gt;
| s01-cursor&lt;br /&gt;
|-&lt;br /&gt;
| S-05&lt;br /&gt;
| &amp;lt;code&amp;gt;FETCH primescursor INTO :primes-row&amp;lt;/code&amp;gt;&lt;br /&gt;
| s02-fetch&lt;br /&gt;
|-&lt;br /&gt;
| S-06&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;
| r81-get-next-divider&lt;br /&gt;
|-&lt;br /&gt;
| S-07&lt;br /&gt;
| &amp;lt;code&amp;gt;INSERT INTO primes (prime) VALUES (:prime)&amp;lt;/code&amp;gt;&lt;br /&gt;
| r83-write-prime&lt;br /&gt;
|-&lt;br /&gt;
| S-08&lt;br /&gt;
| &amp;lt;code&amp;gt;CONNECT RESET primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| s99-disconnect&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;error-handling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.3 Error Handling ===&lt;br /&gt;
&lt;br /&gt;
* All SQL paths test &amp;lt;code&amp;gt;SQLCODE = 0&amp;lt;/code&amp;gt; for success.&lt;br /&gt;
* On failure, a diagnostic string is moved to &amp;lt;code&amp;gt;program-message&amp;lt;/code&amp;gt; and logged via primesui.&lt;br /&gt;
* &amp;lt;code&amp;gt;dal-result&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (nok) on SQL errors; callers check &amp;lt;code&amp;gt;dal-method-ok&amp;lt;/code&amp;gt; before continuing.&lt;br /&gt;
* No retry logic is implemented; errors cause the current operation to be skipped or the session to terminate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;output-file-specification&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Output File Specification ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Property&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| Filename&lt;br /&gt;
| &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;&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;
| 2 lines from bottom&lt;br /&gt;
|-&lt;br /&gt;
| Bottom margin&lt;br /&gt;
| 2 lines&lt;br /&gt;
|-&lt;br /&gt;
| Records per data line&lt;br /&gt;
| 6 primes (sequence + value pairs)&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; (col 1)&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 across&lt;br /&gt;
|-&lt;br /&gt;
| Page footing&lt;br /&gt;
| Spaces + &amp;lt;code&amp;gt;&amp;amp;quot;page: ZZZZ9&amp;amp;quot;&amp;lt;/code&amp;gt; (right side)&lt;br /&gt;
|-&lt;br /&gt;
| EOP trigger&lt;br /&gt;
| linage-counter = 53&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-defects-and-limitations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Known Defects and Limitations ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Severity&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| D-01&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 primesmain; generation mode does not execute the sieve.&lt;br /&gt;
|-&lt;br /&gt;
| D-02&lt;br /&gt;
| Medium&lt;br /&gt;
| Prime 2 is never seeded; generation starts at 3 with first divider = 2 retrieved from DB, but DB is empty at start of a fresh run.&lt;br /&gt;
|-&lt;br /&gt;
| D-03&lt;br /&gt;
| Medium&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_cbsql.out&amp;lt;/code&amp;gt; shows disconnect using alias &amp;lt;code&amp;gt;primesdb&amp;lt;/code&amp;gt;; primes.cbl uses alias &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; — alias mismatch will cause runtime SQL error.&lt;br /&gt;
|-&lt;br /&gt;
| D-04&lt;br /&gt;
| Low&lt;br /&gt;
| Database credentials are hard-coded in WORKING-STORAGE of primes.cbl.&lt;br /&gt;
|-&lt;br /&gt;
| D-05&lt;br /&gt;
| Low&lt;br /&gt;
| No COMMIT after INSERT in r83-write-prime (statement is commented out); relies on PostgreSQL auto-commit or session-level transaction semantics.&lt;br /&gt;
|-&lt;br /&gt;
| D-06&lt;br /&gt;
| Low&lt;br /&gt;
| Two almost-identical host-variable copybooks (&amp;lt;code&amp;gt;primes-table.cpy&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;primes_table.cpy&amp;lt;/code&amp;gt;) suggest unresolved refactoring.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Primes_programs_specifications]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
</feed>