<?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=Primes_Software_Specification</id>
	<title>Primes Software 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=Primes_Software_Specification"/>
	<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Primes_Software_Specification&amp;action=history"/>
	<updated>2026-09-11T04:19:03Z</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=Primes_Software_Specification&amp;diff=4692&amp;oldid=prev</id>
		<title>Martin: Created page with &quot;&lt;span id=&quot;software-specification-primes.cbsql&quot;&gt;&lt;/span&gt; = Software Specification — &lt;code&gt;Primes.cbsql&lt;/code&gt; =  &lt;blockquote&gt;&#039;&#039;&#039;Standard:&#039;&#039;&#039; IEEE 830 / ISO/IEC 29148 (Requirements) · IEEE 1016 (Design) · ISO/IEC 11179 (Data Dictionary) · UML 2.x Activity Diagrams&lt;br /&gt; &#039;&#039;&#039;Source:&#039;&#039;&#039; &lt;code&gt;Primes.cbsql&lt;/code&gt; — GnuCOBOL + GixSQL preprocessed source&lt;br /&gt; &#039;&#039;&#039;Date:&#039;&#039;&#039; 2026-03-17&lt;br /&gt; &#039;&#039;&#039;Status:&#039;&#039;&#039; Reverse-engineered &lt;/blockquote&gt;  -----  &lt;span id=&quot;table-of-contents&quot;&gt;&lt;...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Primes_Software_Specification&amp;diff=4692&amp;oldid=prev"/>
		<updated>2026-03-24T16:53:28Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;span id=&amp;quot;software-specification-primes.cbsql&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Software Specification — &amp;lt;code&amp;gt;Primes.cbsql&amp;lt;/code&amp;gt; =  &amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Standard:&amp;#039;&amp;#039;&amp;#039; IEEE 830 / ISO/IEC 29148 (Requirements) · IEEE 1016 (Design) · ISO/IEC 11179 (Data Dictionary) · UML 2.x Activity Diagrams&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;Primes.cbsql&amp;lt;/code&amp;gt; — GnuCOBOL + GixSQL preprocessed source&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2026-03-17&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Reverse-engineered &amp;lt;/blockquote&amp;gt;  -----  &amp;lt;span id=&amp;quot;table-of-contents&amp;quot;&amp;gt;&amp;lt;...&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;software-specification-primes.cbsql&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Software Specification — &amp;lt;code&amp;gt;Primes.cbsql&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Standard:&amp;#039;&amp;#039;&amp;#039; IEEE 830 / ISO/IEC 29148 (Requirements) · IEEE 1016 (Design) · ISO/IEC 11179 (Data Dictionary) · UML 2.x Activity Diagrams&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;Primes.cbsql&amp;lt;/code&amp;gt; — GnuCOBOL + GixSQL preprocessed source&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2026-03-17&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Reverse-engineered&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;table-of-contents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Table of Contents ==&lt;br /&gt;
&lt;br /&gt;
# [[#1-business-requirements-document|Business Requirements Document]]&lt;br /&gt;
# [[#2-technical-specification--pseudocode|Technical Specification / Pseudocode]]&lt;br /&gt;
# [[#3-data-dictionary|Data Dictionary]]&lt;br /&gt;
# [[#4-flow-diagrams|Flow Diagrams]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;business-requirements-document&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Business Requirements Document ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;purpose&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.1 Purpose ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Primes.cbsql&amp;lt;/code&amp;gt; is a COBOL Data Access Layer (DAL) module that manages persistent storage of prime numbers in a PostgreSQL database. It is not a standalone program; it is invoked by a calling driver program that selects the desired operation via a shared linkage interface (&amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.2 Scope ===&lt;br /&gt;
&lt;br /&gt;
The module handles all database interactions for the prime number generation system, including connection lifecycle management, cursor-based sequential reads, row-by-row prime retrieval for trial division, and insertion of newly discovered primes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-context&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.3 System Context ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Item&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Platform&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Linux (GnuCOBOL + GixSQL)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Database&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| PostgreSQL 5432 @ localhost&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Schema&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Database name&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;DB user&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_user&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;UI module&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt; (called for all status messages)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Linkage interface&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt; (copybook)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;business-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.4 Business Functions ===&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;| Method Flag&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| BF-01&lt;br /&gt;
| &amp;lt;code&amp;gt;db-connect&amp;lt;/code&amp;gt;&lt;br /&gt;
| Establish a connection to the PostgreSQL database&lt;br /&gt;
|-&lt;br /&gt;
| BF-02&lt;br /&gt;
| &amp;lt;code&amp;gt;db-cursor&amp;lt;/code&amp;gt;&lt;br /&gt;
| Begin a transaction and open a cursor for reading all primes&lt;br /&gt;
|-&lt;br /&gt;
| BF-03&lt;br /&gt;
| &amp;lt;code&amp;gt;next-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| Fetch the next prime row from the open cursor&lt;br /&gt;
|-&lt;br /&gt;
| BF-04&lt;br /&gt;
| &amp;lt;code&amp;gt;next-divider&amp;lt;/code&amp;gt;&lt;br /&gt;
| Retrieve a specific prime by identity index to use as a trial divisor&lt;br /&gt;
|-&lt;br /&gt;
| BF-05&lt;br /&gt;
| &amp;lt;code&amp;gt;write-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| Insert a newly proven prime into the database&lt;br /&gt;
|-&lt;br /&gt;
| BF-06&lt;br /&gt;
| &amp;lt;code&amp;gt;db-disconnect&amp;lt;/code&amp;gt;&lt;br /&gt;
| Close the database connection and release resources&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;business-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.5 Business Rules ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Rule&lt;br /&gt;
|-&lt;br /&gt;
| BR-01&lt;br /&gt;
| The initial prime value &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; is inserted as a seed record during first-run initialisation (&amp;lt;code&amp;gt;r90-generate-primes&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| BR-02&lt;br /&gt;
| All operations must set &amp;lt;code&amp;gt;dal-result&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on success or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; on failure&lt;br /&gt;
|-&lt;br /&gt;
| BR-03&lt;br /&gt;
| All status messages (success and error) must be routed through the &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt; subprogram&lt;br /&gt;
|-&lt;br /&gt;
| BR-04&lt;br /&gt;
| Raw SQL error codes (&amp;lt;code&amp;gt;SQLCODE&amp;lt;/code&amp;gt;) must be displayed to the console on failure&lt;br /&gt;
|-&lt;br /&gt;
| BR-05&lt;br /&gt;
| Trial division uses stored primes up to the square root of the candidate number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;assumptions-and-constraints&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.6 Assumptions and Constraints ===&lt;br /&gt;
&lt;br /&gt;
* The database schema and table (&amp;lt;code&amp;gt;primes.primes&amp;lt;/code&amp;gt;) must exist prior to program execution.&lt;br /&gt;
* The calling program is responsible for managing the sequence of DAL method calls.&lt;br /&gt;
* &amp;lt;code&amp;gt;r90-generate-primes&amp;lt;/code&amp;gt; (seed insertion) is not reachable via the DAL dispatch and must be called directly during initial setup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;technical-specification-pseudocode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Technical Specification / Pseudocode ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;program-entry-and-dispatch&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.1 Program Entry and Dispatch ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROGRAM primes&lt;br /&gt;
  CALLED BY: external driver via LINKAGE SECTION (primes-dal)&lt;br /&gt;
&lt;br /&gt;
  ON ENTRY:&lt;br /&gt;
    EVALUATE TRUE on dal-method flag:&lt;br /&gt;
      WHEN next-prime    → PERFORM r80-get-next-prime&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-connect    → PERFORM s00-connect&lt;br /&gt;
      WHEN db-cursor     → PERFORM s01-cursor&lt;br /&gt;
      WHEN db-disconnect → PERFORM s99-disconnect&lt;br /&gt;
      WHEN OTHER         → SET dal-result = 1&lt;br /&gt;
    END-EVALUATE&lt;br /&gt;
  EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-specifications&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.2 Paragraph Specifications ===&lt;br /&gt;
&lt;br /&gt;
==== r80-get-next-prime ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PERFORM s02-fetch&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== r81-get-next-divider ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;new-ident = old-ident + 1&lt;br /&gt;
SQL: SELECT prime FROM primes WHERE ident = :new-ident&lt;br /&gt;
     INTO :test-divider&lt;br /&gt;
IF SQLCODE = 0&lt;br /&gt;
  (test-divider now holds the next divisor prime)&lt;br /&gt;
ELSE&lt;br /&gt;
  DISPLAY SQLCODE to console&lt;br /&gt;
  DISPLAY &amp;amp;quot;select new-divider nok&amp;amp;quot; to console&lt;br /&gt;
old-ident = new-ident&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== r83-write-prime ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SQL: INSERT INTO primes (prime) VALUES (:prime)&lt;br /&gt;
IF SQLCODE != 0&lt;br /&gt;
  DISPLAY SQLCODE to console&lt;br /&gt;
  DISPLAY &amp;amp;quot;insert next prime nok&amp;amp;quot; + prime-number to console&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;r90-generate-primes-first-run-initialisation-not-via-dal-dispatch&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== r90-generate-primes &amp;#039;&amp;#039;(first-run initialisation, not via DAL dispatch)&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PERFORM s00-connect&lt;br /&gt;
IF dal-method-ok&lt;br /&gt;
  SQL: INSERT INTO primes (prime) VALUES (2)   -- seed record&lt;br /&gt;
  IF SQLCODE = 0&lt;br /&gt;
    primes-sequence = 1&lt;br /&gt;
    prime-number    = 2&lt;br /&gt;
    dal-result      = 0&lt;br /&gt;
    LOG &amp;amp;quot;Initial insert ok.&amp;amp;quot;&lt;br /&gt;
  ELSE&lt;br /&gt;
    LOG &amp;amp;quot;Initial insert failed, terminating.&amp;amp;quot;&lt;br /&gt;
    dal-result = 1&lt;br /&gt;
CALL primesui (log-message)&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== s00-connect ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SQL: CONNECT TO :DATASRC AS primes USER :DBUSR USING :DBPWD&lt;br /&gt;
IF SQLCODE = 0&lt;br /&gt;
  dal-result = 0&lt;br /&gt;
  LOG &amp;amp;quot;Database initialisation ok.&amp;amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Database initialisation failed, terminating.&amp;amp;quot;&lt;br /&gt;
  dal-result = 1&lt;br /&gt;
CALL primesui&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== s01-cursor ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SQL: START TRANSACTION&lt;br /&gt;
IF SQLCODE = 0&lt;br /&gt;
  LOG &amp;amp;quot;Start transaction ok.&amp;amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Start transaction nok.&amp;amp;quot;&lt;br /&gt;
  dal-result = 1&lt;br /&gt;
CALL primesui&lt;br /&gt;
&lt;br /&gt;
IF dal-method-ok&lt;br /&gt;
  OPEN CURSOR primescursor  (SELECT * FROM primes)&lt;br /&gt;
  IF SQLCODE = 0&lt;br /&gt;
    LOG &amp;amp;quot;Start primescursor ok.&amp;amp;quot;&lt;br /&gt;
  ELSE&lt;br /&gt;
    LOG &amp;amp;quot;Start primescursor nok.&amp;amp;quot;&lt;br /&gt;
    dal-result = 1&lt;br /&gt;
CALL primesui&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== s02-fetch ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SQL: FETCH primescursor INTO :r-ident, :r-prime&lt;br /&gt;
IF SQLCODE = 0&lt;br /&gt;
  primes-sequence = r-ident&lt;br /&gt;
  prime-number    = r-prime&lt;br /&gt;
  dal-result      = 0&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Fetch row nok.&amp;amp;quot;&lt;br /&gt;
  dal-result = 1&lt;br /&gt;
  CALL primesui&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== s99-disconnect ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SQL: CONNECT RESET primes&lt;br /&gt;
IF SQLCODE = 0&lt;br /&gt;
  dal-result = 0&lt;br /&gt;
  LOG &amp;amp;quot;Close database ok.&amp;amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Database initialisation failed, ending.&amp;amp;quot;&lt;br /&gt;
  dal-result = 1&lt;br /&gt;
CALL primesui&lt;br /&gt;
DISPLAY &amp;amp;quot;s99 disconnect from database&amp;amp;quot; to console&lt;br /&gt;
DISPLAY SQLCODE to console&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-dictionary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Data Dictionary ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;working-storage-fields&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Working Storage Fields ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| PIC&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| COBOL Type&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Description&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;X(64)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alphanumeric&lt;br /&gt;
| PostgreSQL connection string&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;X(64)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alphanumeric&lt;br /&gt;
| Database login username&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;X(64)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alphanumeric&lt;br /&gt;
| Database login password&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CUR-STEP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;X(16)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alphanumeric&lt;br /&gt;
| Current processing step label&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;prime-count&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Numeric&lt;br /&gt;
| Count of primes (declared; populated by driver)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;prime_seq&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Numeric&lt;br /&gt;
| Prime sequence number (declared; populated by driver)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;divider&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Numeric&lt;br /&gt;
| Trial divider working field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;group-primes-row-database-fetch-buffer&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 Group: &amp;lt;code&amp;gt;primes-row&amp;lt;/code&amp;gt; — Database Fetch Buffer ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| PIC&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| COBOL Type&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r-ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(9) COMP-3&amp;lt;/code&amp;gt;&lt;br /&gt;
| Packed decimal&lt;br /&gt;
| Row identity key fetched from cursor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(9) COMP-3&amp;lt;/code&amp;gt;&lt;br /&gt;
| Packed decimal&lt;br /&gt;
| Prime value fetched from cursor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;group-primes-primality-test-working-storage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.3 Group: &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; — Primality Test Working Storage ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| PIC / Value&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-result&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(2)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Status code: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;=init ok · &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;=first divider ok · &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;=next divider ok&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;88 init-primes-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| value &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Condition name: initialisation succeeded&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;88 first-divider-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| value &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
| Condition name: first trial divisor retrieved&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;88 next-divider-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| value &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
| Condition name: subsequent trial divisor retrieved&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;test-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Candidate number under primality test&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;test-number-sqr&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(9)v9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Square root of &amp;lt;code&amp;gt;test-number&amp;lt;/code&amp;gt; — upper bound for divisor loop&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;9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Current prime divisor retrieved from DB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;test-rest&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(9)v9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Remainder of &amp;lt;code&amp;gt;test-number ÷ test-divider&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;old-test-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Previous candidate number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;old-ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Row identity of the last retrieved divisor&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;9(9)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Row identity of the next divisor (&amp;lt;code&amp;gt;old-ident + 1&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-references&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.4 Copybook References ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Copybook&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Contents&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-table&amp;lt;/code&amp;gt;&lt;br /&gt;
| COBOL record layout mirroring the &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; DB table&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLCA&amp;lt;/code&amp;gt;&lt;br /&gt;
| Standard SQL Communication Area (&amp;lt;code&amp;gt;SQLCODE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SQLERRM&amp;lt;/code&amp;gt;, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| Data structure for &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt; subprogram (messages, program name, methods)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt;&lt;br /&gt;
| DAL linkage interface — method flags and &amp;lt;code&amp;gt;dal-result&amp;lt;/code&amp;gt; return code&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;prepared-sql-statements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.5 Prepared SQL Statements ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Ref&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| SQL Text&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Used in&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQ0001&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;SELECT * FROM primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| Cursor declaration (s01-cursor)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQ0002&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;SELECT prime FROM primes WHERE ident = $1&amp;lt;/code&amp;gt;&lt;br /&gt;
| r81-get-next-divider&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQ0003&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;INSERT INTO primes (prime) VALUES ($1)&amp;lt;/code&amp;gt;&lt;br /&gt;
| r83-write-prime&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQ0004&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;INSERT INTO primes (prime) VALUES (2)&amp;lt;/code&amp;gt;&lt;br /&gt;
| r90-generate-primes (seed)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQ0005&amp;lt;/code&amp;gt;&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;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;database-table-primes.primes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.6 Database Table: &amp;lt;code&amp;gt;primes.primes&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Column&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Type&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| INTEGER (serial / sequence)&lt;br /&gt;
| Auto-generated row identity / primary key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| INTEGER&lt;br /&gt;
| The prime number value stored in this row&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;flow-diagrams&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Flow Diagrams ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;program-entry-dal-dispatch&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.1 Program Entry — DAL Dispatch ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;                    ┌──────────────────────────┐&lt;br /&gt;
                    │  ENTRY — primes program  │&lt;br /&gt;
                    │  (called with primes-dal) │&lt;br /&gt;
                    └────────────┬─────────────┘&lt;br /&gt;
                                 │&lt;br /&gt;
                      ┌──────────▼──────────┐&lt;br /&gt;
                      │  EVALUATE dal-method │&lt;br /&gt;
                      └──────────┬──────────┘&lt;br /&gt;
         ┌──────────┬────────────┼───────────┬────────────┬──────────┐&lt;br /&gt;
         ▼          ▼            ▼           ▼            ▼          ▼&lt;br /&gt;
    next-prime  next-divider  write-prime db-connect  db-cursor  db-disconnect&lt;br /&gt;
         │          │            │           │            │          │&lt;br /&gt;
         ▼          ▼            ▼           ▼            ▼          ▼&lt;br /&gt;
     r80-get-   r81-get-    r83-write-  s00-connect  s01-cursor s99-disconnect&lt;br /&gt;
     next-prime next-divider  prime&lt;br /&gt;
         │          │            │           │            │          │&lt;br /&gt;
         └──────────┴────────────┴───────────┴────────────┴──────────┘&lt;br /&gt;
                                 │&lt;br /&gt;
                    ┌────────────▼────────────┐&lt;br /&gt;
                    │  SET dal-result          │&lt;br /&gt;
                    │  0 = success             │&lt;br /&gt;
                    │  1 = failure             │&lt;br /&gt;
                    └────────────┬────────────┘&lt;br /&gt;
                                 │&lt;br /&gt;
                    ┌────────────▼────────────┐&lt;br /&gt;
                    │      EXIT PROGRAM        │&lt;br /&gt;
                    └─────────────────────────┘&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;database-connection-lifecycle&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.2 Database Connection Lifecycle ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;  Driver calls db-connect          Driver calls db-cursor&lt;br /&gt;
         │                                  │&lt;br /&gt;
         ▼                                  ▼&lt;br /&gt;
   s00-connect                        s01-cursor&lt;br /&gt;
   SQL CONNECT                        SQL START TRANSACTION&lt;br /&gt;
         │                                  │&lt;br /&gt;
    SQLCODE=0?                         SQLCODE=0?&lt;br /&gt;
    ├─ yes → dal-result=0              ├─ yes → OPEN primescursor&lt;br /&gt;
    └─ no  → dal-result=1             └─ no  → dal-result=1&lt;br /&gt;
         │                                  │&lt;br /&gt;
   CALL primesui                      CALL primesui&lt;br /&gt;
                                           │&lt;br /&gt;
                              ┌────────────▼──────────────┐&lt;br /&gt;
                              │  Loop: Driver calls        │&lt;br /&gt;
                              │  next-prime repeatedly     │&lt;br /&gt;
                              │          │                 │&lt;br /&gt;
                              │    r80 → s02-fetch         │&lt;br /&gt;
                              │    FETCH primescursor      │&lt;br /&gt;
                              │    → primes-sequence       │&lt;br /&gt;
                              │    → prime-number          │&lt;br /&gt;
                              │    SQLCODE=0? loop / stop  │&lt;br /&gt;
                              └────────────┬──────────────┘&lt;br /&gt;
                                           │&lt;br /&gt;
                              Driver calls db-disconnect&lt;br /&gt;
                                           │&lt;br /&gt;
                                    s99-disconnect&lt;br /&gt;
                                    SQL CONNECT RESET&lt;br /&gt;
                                           │&lt;br /&gt;
                                      CALL primesui&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;prime-discovery-flow-cross-module-context&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.3 Prime Discovery Flow (cross-module context) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;  Driver: candidate number N to test&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
  Set old-ident = 0&lt;br /&gt;
          │&lt;br /&gt;
  ┌───────▼────────────────────────────────┐&lt;br /&gt;
  │  LOOP: call next-divider               │&lt;br /&gt;
  │    → r81: new-ident = old-ident + 1    │&lt;br /&gt;
  │    → SQL SELECT prime WHERE ident=new  │&lt;br /&gt;
  │    → test-divider returned             │&lt;br /&gt;
  │                                        │&lt;br /&gt;
  │  IF test-divider &amp;amp;gt; SQRT(N) → PRIME!    │&lt;br /&gt;
  │  IF N MOD test-divider = 0 → NOT prime │&lt;br /&gt;
  │  ELSE continue loop                    │&lt;br /&gt;
  └───────────────────────────────────────┘&lt;br /&gt;
          │&lt;br /&gt;
     N is prime?&lt;br /&gt;
     ├─ yes → call write-prime&lt;br /&gt;
     │          → r83: INSERT INTO primes VALUES (N)&lt;br /&gt;
     └─ no  → discard, try N+1 (even numbers typically skipped)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;cursor-fetch-detail&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.4 Cursor Fetch Detail ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;  s02-fetch&lt;br /&gt;
      │&lt;br /&gt;
  GIXSQLStartSQL&lt;br /&gt;
      │&lt;br /&gt;
  GIXSQLSetResultParams (:r-ident)&lt;br /&gt;
  GIXSQLSetResultParams (:r-prime)&lt;br /&gt;
      │&lt;br /&gt;
  GIXSQLCursorFetchOne (primes_primescursor)&lt;br /&gt;
      │&lt;br /&gt;
  GIXSQLEndSQL&lt;br /&gt;
      │&lt;br /&gt;
  SQLCODE = 0?&lt;br /&gt;
  ├─ yes → primes-sequence = r-ident&lt;br /&gt;
  │         prime-number   = r-prime&lt;br /&gt;
  │         dal-result     = 0&lt;br /&gt;
  └─ no  → LOG &amp;amp;quot;Fetch row nok.&amp;amp;quot;&lt;br /&gt;
            dal-result = 1&lt;br /&gt;
            CALL primesui&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;End of specification.&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
</feed>