<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.webhuis.nl:443/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Martin</id>
	<title>Webhuis wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.webhuis.nl:443/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Martin"/>
	<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Special:Contributions/Martin"/>
	<updated>2026-10-11T04:28:55Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Bootable_USB&amp;diff=5960</id>
		<title>Bootable USB</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Bootable_USB&amp;diff=5960"/>
		<updated>2026-09-15T19:27:42Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* Debian Bootable USB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Debian Bootable USB=&lt;br /&gt;
Dit is een zogenaamde non-Uefi usb boot stick. Een bootable Debian USB is goud waard in een migratie uit Windows naar Linux of bij het herstel of migreren van een Linux machine.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
Stappen:&lt;br /&gt;
* Partitioneer een USB met gdisk&lt;br /&gt;
* Installeer Debian op een partitie met debootstrap&lt;br /&gt;
* Configureer de install naar een bootable usb&lt;br /&gt;
[https://en.wikipedia.org/wiki/BIOS_boot_partition &amp;quot;Hah!IdontNeedEFI&amp;quot;]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* mount de usb root partition&lt;br /&gt;
* debootstrap stable /mnt/sdb2 http://10.68.171.11:3142/debian&lt;br /&gt;
* mount-chroot&lt;br /&gt;
* chroot /mnt/sdc2 /bin/bash&lt;br /&gt;
==Partitioneren USB==&lt;br /&gt;
Gebruik gdisk voor het partitioneren van de USB en maak vier partities.&lt;br /&gt;
* De BIOS Boot partition, eindigend op sector 2047&lt;br /&gt;
* Twee linux Root partities, van 4G&lt;br /&gt;
* De rest voor een /home partitie&lt;br /&gt;
Maak geen /boot/efi partitie aan!&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
label: gpt&lt;br /&gt;
label-id: 6522A0ED-ED48-4313-B710-169E0E898DC2&lt;br /&gt;
device: /dev/sdb&lt;br /&gt;
unit: sectors&lt;br /&gt;
first-lba: 64&lt;br /&gt;
last-lba: 60538817&lt;br /&gt;
table-length: 248&lt;br /&gt;
sector-size: 512&lt;br /&gt;
&lt;br /&gt;
/dev/sdc1 : start=          64, size=        1984, type=21686148-6449-6E6F-744E-656564454649, uuid=327DD423-85F8-4D23-A978-522BFC43B499, name=&amp;quot;BIOS boot partition&amp;quot;&lt;br /&gt;
/dev/sdc2 : start=        2048, size=     8388608, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=2AE9F26B-3000-43FB-9F66-7352D5C3D4A8, name=&amp;quot;Linux filesystem&amp;quot;&lt;br /&gt;
/dev/sdc3 : start=    16779264, size=     8388608, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=1B64C33C-8F04-407D-AB5B-F3358C6B625D, name=&amp;quot;Linux filesystem&amp;quot;&lt;br /&gt;
/dev/sdc4 : start=    25167872, size=    35370946, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=14251565-DA33-4682-946B-81F091438E4C, name=&amp;quot;Linux filesystem&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==fstab==&lt;br /&gt;
Op de USB zijn meerdere Debian OS installs mogelijk, dus is het zinvol om een apart home partitie te gebruiken, het heeft weinig zin om een swap te definiëren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/fstab: static file system information.&lt;br /&gt;
#&lt;br /&gt;
# Use &#039;blkid&#039; to print the universally unique identifier for a&lt;br /&gt;
# device; this may be used with UUID= as a more robust way to name devices&lt;br /&gt;
# that works even if disks are added and removed. See fstab(5).&lt;br /&gt;
#&lt;br /&gt;
# systemd generates mount units based on this file, see systemd.mount(5).&lt;br /&gt;
# Please run &#039;systemctl daemon-reload&#039; after making changes here.&lt;br /&gt;
#&lt;br /&gt;
# &amp;lt;file system&amp;gt; &amp;lt;mount point&amp;gt;   &amp;lt;type&amp;gt;  &amp;lt;options&amp;gt;       &amp;lt;dump&amp;gt;  &amp;lt;pass&amp;gt;&lt;br /&gt;
# / was on /dev/md0 during installation&lt;br /&gt;
UUID=eb35cee7-df6d-45ad-b2fb-9917b5630443 /               ext4    errors=remount-ro 0       1&lt;br /&gt;
UUID=7440423e-10a4-42a2-a61c-3881981945e2 /home           ext4    errors=remount-ro 0       2&lt;br /&gt;
&lt;br /&gt;
# We don&#039;t use swap partitions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Packages&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ssh&lt;br /&gt;
user &lt;br /&gt;
install kernel image&lt;br /&gt;
sudo&lt;br /&gt;
geen root passwd&lt;br /&gt;
netwerk config&lt;br /&gt;
exit chroot&lt;br /&gt;
mount-chroot&lt;br /&gt;
umount de usb root partition&lt;br /&gt;
resolv.conf&lt;br /&gt;
interfaces&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maak de partitie bootable:&amp;lt;/br&amp;gt;&lt;br /&gt;
grub-install --target=i386-pc path/to/device&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Oude manier:&lt;br /&gt;
    maak met unetbootin een netinstall aan op een partitie op een usb-stick&lt;br /&gt;
    Boot de doel machine met de usb-stick en voer de installatie uit&lt;br /&gt;
    Grub maakt een foutje door de devices te verwisselen, sda &amp;lt;-&amp;gt; sdb&lt;br /&gt;
    Herstel de fout in grub edit en boot&lt;br /&gt;
    Pas na de boot /etc/fstab aan en doe update-grub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
De installatie is nog niet erg minimaal, maar hij werkt.&lt;br /&gt;
  mkfs.ext4 /dev/sdc2&lt;br /&gt;
 1937  mkfs.ext4 /dev/sdc3&lt;br /&gt;
 1938  mkfs.ext4 /dev/sdc4&lt;br /&gt;
&lt;br /&gt;
root@host:~# apt-get clean&lt;br /&gt;
root@host:~# apt-get install localepurge&lt;br /&gt;
root@host:~# localepurge&lt;br /&gt;
root@squeeze-usb-i386:~# ln -s /home/squeeze-usb-i386/var/lib/* /var&lt;br /&gt;
root@squeeze-usb-i386:~# ln -s /home/squeeze-usb-i386/var/cache/* /var&lt;br /&gt;
&lt;br /&gt;
Installeer ook nog tools om met Windows file systems te werken:&lt;br /&gt;
&lt;br /&gt;
apt-get install ntfsprogs scrounge-ntfs dosfstools rsync&lt;br /&gt;
&lt;br /&gt;
Op de host&lt;br /&gt;
&lt;br /&gt;
Maak een file system aan voor het OS op de USB stick.&lt;br /&gt;
&lt;br /&gt;
root@host:~# fdisk /dev/sdb&lt;br /&gt;
root@host:~# mkfs.ext2 /dev/sdb1&lt;br /&gt;
&lt;br /&gt;
Maak een directory aan op de host om daarin de installatie voor de usb-stick voor te bereiden.&lt;br /&gt;
&lt;br /&gt;
root@host:~# mkdir /usbsystem&lt;br /&gt;
root@host:~# debootstrap --arch i386 squeeze /usbsystem http://ftp.nl.debian.org/debian&lt;br /&gt;
root@host:~# ./croot.sh /usbsystem&lt;br /&gt;
&lt;br /&gt;
Doe eerst alle stappen uit chrooted en doe daarna:&lt;br /&gt;
&lt;br /&gt;
root@host:~# umount /usbsystem/dev/ /usbsystem/sys /usbsystem/proc /usbsystem/tmp&lt;br /&gt;
root@host:~# umount /usbsystem-amd64/dev/ /usbsystem-amd64/sys /usbsystem-amd64/proc /usbsystem-amd64/tmp&lt;br /&gt;
&lt;br /&gt;
chrooted&lt;br /&gt;
fstab&lt;br /&gt;
&lt;br /&gt;
# UNCONFIGURED FSTAB FOR BASE SYSTEM&lt;br /&gt;
LABEL=USB_ROOT / ext2 defaults,errors=remount-ro,noatime 0 1&lt;br /&gt;
proc /proc proc defaults 0 0&lt;br /&gt;
tmpfs /tmp tmpfs defaults,noatime 0 0&lt;br /&gt;
tmpfs /var/lock tmpfs defaults,noatime 0 0&lt;br /&gt;
tmpfs /var/log tmpfs defaults,noatime 0 0&lt;br /&gt;
tmpfs /var/run tmpfs defaults,noatime 0 0&lt;br /&gt;
tmpfs /var/tmp tmpfs defaults,noatime 0 0&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Voorpagina&amp;diff=5933</id>
		<title>Voorpagina</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Voorpagina&amp;diff=5933"/>
		<updated>2026-07-27T22:37:02Z</updated>

		<summary type="html">&lt;p&gt;Martin: Undo revision 5920 by 10.68.171.250 (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Algemeen]]&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Webhuis Wiki.&#039;&#039;&#039;&amp;lt;/big&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Welkom op de wiki van Webhuis, deze wiki heeft een [[PostgreSQL]] backend.&amp;lt;br/&amp;gt;&lt;br /&gt;
De wiki is voornamelijk Nederlandstalig, met de bedoeling om een zo breed mogelijk publiek op het gebied van Open Standaarden en Open Source Software laagdrempelig te ondersteunen en te helpen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Webhuis gebruikt en produceert (op bescheiden schaal) Open Source Software (OSS). Webhuis gebruikt en onderhoudt de wiki ter ondersteuning van haar eigen werk op het gebied van configuratie en beheer van Informatie Systemen voor dienstverlening aan haar klanten.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Webhuis stelt de informatie in de wiki, in lijn met het gedachtengoed van de vrije software, kostenloos ter beschikking aan de gemeenschap.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Deze wiki heeft als voornaamste doel te ondersteunen bij het opzetten, configureren en beheren van automatiseringsomgevingen die zijn gebaseerd op OSS. De wiki bevat een groeiend repertoire van configuraties van OSS applicaties, howto&#039;s, voorbeelden en ook studie materiaal. De wiki is voortdurend in bewerking en sommige nieuwere onderdelen bevatten nog slechts de ruwe informatie van een bepaald aandachtsgebied.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Webhuis gebruikt vrijwel uitsluitend Debian GNU Linux en de configuratie voorbeelden zijn daarop gericht.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De bijdragen op deze wiki vallen onder de [http://www.gnu.org/copyleft/gpl.html GNU General Public License].&amp;lt;br/&amp;gt;&lt;br /&gt;
Disclaimer: All information comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Webhuis pagina [[webhuis_info]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4789</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4789"/>
		<updated>2026-03-26T23:00:11Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi1-a4.pdf LPI certification 101 exam prep, Part 1]&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi2-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 3]&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi4-a4.pdf LPI certification 101 exam prep, Part 4]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi5-a4.pdf LPI certification 102 exam prep, Part 1]&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi6-a4.pdf LPI certification 102 exam prep, Part 2]&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi7-a4.pdf LPI certification 102 exam prep, Part 3]&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi8-a4.pdf LPI certification 102 exam prep, Part 4]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4788</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4788"/>
		<updated>2026-03-26T22:56:40Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi1-a4.pdf LPI certification 101 exam prep, Part 1]&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi2-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 3]&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi4-a4.pdf LPI certification 101 exam prep, Part 4]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4787</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4787"/>
		<updated>2026-03-26T22:51:42Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[File:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi1-a4.pdf]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [https://wiki.webhuis.nl/images/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4786</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4786"/>
		<updated>2026-03-26T22:50:42Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[File:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi1-a4.pdf]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [https://webhuis.nl/download/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4785</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4785"/>
		<updated>2026-03-26T22:48:39Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[File:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi1-a4.pdf]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [https://wiki.webhuis.nl/download/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4784</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4784"/>
		<updated>2026-03-26T22:47:40Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[File:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi1-a4.pdf]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [http://wiki.webhuis.nl/download/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4783</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4783"/>
		<updated>2026-03-26T22:30:46Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[File:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi1-a4.pdf]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
--- [http://wiki.webhuis.nl/upload/store/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4782</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4782"/>
		<updated>2026-03-26T22:14:18Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[Media:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi1-a4.pdf]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
--- [http://wiki.webhuis.nl/upload/store/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4781</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4781"/>
		<updated>2026-03-26T22:10:01Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[Media:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
--- [http://wiki.webhuis.nl/upload/store/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4780</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4780"/>
		<updated>2026-03-26T22:08:31Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[:File:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
--- [http://wiki.webhuis.nl/upload/store/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4779</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4779"/>
		<updated>2026-03-26T22:08:03Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[:File:images/l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
--- [http://wiki.webhuis.nl/upload/store/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4778</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4778"/>
		<updated>2026-03-26T22:05:17Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[File:images/l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
--- [http://wiki.webhuis.nl/upload/store/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4777</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4777"/>
		<updated>2026-03-26T22:04:22Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* LPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[File:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
--- [http://wiki.webhuis.nl/upload/store/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4776</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4776"/>
		<updated>2026-03-26T21:58:01Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[Media:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
--- [http://wiki.webhuis.nl/upload/store/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4775</id>
		<title>Documentatie</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Documentatie&amp;diff=4775"/>
		<updated>2026-03-26T21:57:40Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux Gebruikershandleiding ==&lt;br /&gt;
* [[Media:Lgh-1.5.pdf|Linux Gebruikershandleiding Universiteit Utrecht]]&lt;br /&gt;
* [http://steve-parker.org/sh/sh.shtml Bash Scripting Tutorial]&lt;br /&gt;
* [http://www.freeos.com/guides/lsst/ Linux Shell Scripting Tutorial v1.05r3 A Beginner&#039;s handbook]&lt;br /&gt;
* [http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]&lt;br /&gt;
* [http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming]&lt;br /&gt;
&lt;br /&gt;
== NLLGG LPI training ==&lt;br /&gt;
Quick refs en aanvullende informatie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LPI ==&lt;br /&gt;
Lesmateriaal voor het behalen van systeembeheer Linux&lt;br /&gt;
&lt;br /&gt;
LPI certification 101&lt;br /&gt;
* [[Media:l-lpi1-a4.pdf|LPI certification 101 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi2-a4.pdf|LPI certification 101 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi3-a4.pdf|LPI certification 101 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi4-a4.pdf|LPI certification 101 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
LPI certification 102&lt;br /&gt;
* [[Media:l-lpi5-a4.pdf|LPI certification 102 exam prep, Part 1]]&lt;br /&gt;
* [[Media:l-lpi6-a4.pdf|LPI certification 102 exam prep, Part 2]]&lt;br /&gt;
* [[Media:l-lpi7-a4.pdf|LPI certification 102 exam prep, Part 3]]&lt;br /&gt;
* [[Media:l-lpi8-a4.pdf|LPI certification 102 exam prep, Part 4]]&lt;br /&gt;
&lt;br /&gt;
Wat moet je doen?&lt;br /&gt;
* Netjes afdrukken&lt;br /&gt;
* Gaatjes erdoor&lt;br /&gt;
* Per deel in een aparte tab in de map&lt;br /&gt;
* Met de map open en de computer aan elk deel doornemen.&lt;br /&gt;
&lt;br /&gt;
Elk deel duurt tussen de 30 en 60 minuten.&lt;br /&gt;
#* [http://wiki.webhuis.nl/upload/store/l-lpi3-a4.pdf LPI certification 101 exam prep, Part 2]&lt;br /&gt;
&lt;br /&gt;
== bash ==&lt;br /&gt;
* http://www.smachado.com/2009/02/bash-send-a-running-process-to-background/&lt;br /&gt;
== osFinancials Gebruikershandleiding ==&lt;br /&gt;
osFinancials is een nederlands open source product voor het voeren van boekhoudingen. Het pakket is geschreven in het proprietary Delphi, maar er zijn al modules in open source lazarus pascal ontwikkeld.&lt;br /&gt;
&lt;br /&gt;
osFinancials heeft een ingebouwde interfaces met:&lt;br /&gt;
* vtiger, maar niet met Sugarcrm&lt;br /&gt;
* Microsoft Office en niet met Open Office&lt;br /&gt;
&lt;br /&gt;
De uitgebreide nederlandstalige gebruikershandleiding van osFinancials is met copyright beschermd, als je hem wilt lezen dan moet je hem kopen. Het ziet er niet heel erg gelikt uit, maar zo hebben boekhouders het graag. We willen je natuurlijk helpen en kunnen vanuit de handleiding van advies dienen.&lt;br /&gt;
&lt;br /&gt;
== Sugarcrm Gebruikershandleiding ==&lt;br /&gt;
Sugarcrm documentatie in het nederkands.&lt;br /&gt;
* [http://wiki.webhuis.nl/upload/store/handleiding-sugarcrm.pdf Sugarcrm Gebruikershandleiding in het Nederlands]&lt;br /&gt;
== Ubuntu Karmic handleiding ==&lt;br /&gt;
Zeer uitgebreide handleiding van Ubuntu Karmic.&lt;br /&gt;
* http://ubuntuguide.org/wiki/Ubuntu:Karmic&lt;br /&gt;
== MediaWiki ==&lt;br /&gt;
=== Los gestort ===&lt;br /&gt;
* http://www.vanheusden.com/Linux/&lt;br /&gt;
* http://www.handleidinghtml.nl/&lt;br /&gt;
Wijzigen van de navigatie:&lt;br /&gt;
 http://wiki.webhuis.nl/index.php?title=MediaWiki:Sidebar&amp;amp;action=edit&lt;br /&gt;
Maken van een ruler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt; of &amp;lt;hr /&amp;gt;&lt;br /&gt;
of&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== rtfm ====&lt;br /&gt;
De betekenis van de afkorting rtfm is als volgt gedefinieerd: Request Tracker FAQ Manager. Het is een Debian package, kijk maar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package        : rtfm&lt;br /&gt;
Vulnerability  : cross-site scripting&lt;br /&gt;
Problem type   : remote&lt;br /&gt;
Debian-specific: no&lt;br /&gt;
CVE ID         : CVE-2012-2768&lt;br /&gt;
&lt;br /&gt;
It was discovered that rtfm, the Request Tracker FAQ Manager, contains&lt;br /&gt;
multiple cross-site scripting vulnerabilities in the topic&lt;br /&gt;
administration page.&lt;br /&gt;
&lt;br /&gt;
For the stable distribution (squeeze), this problem has been fixed in&lt;br /&gt;
version 2.4.2-4+squeeze1.&lt;br /&gt;
&lt;br /&gt;
For the testing distribution (wheezy) and the unstable distribution&lt;br /&gt;
(sid), this problem has been fixed in version 4.0.6-4 of the&lt;br /&gt;
request-tracker4 package.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Control_flow&amp;diff=4773</id>
		<title>Control flow</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Control_flow&amp;diff=4773"/>
		<updated>2026-03-25T16:50:42Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;control-flow&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Control Flow =  &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;conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. Conventions ==  * &amp;#039;&amp;#039;&amp;#039;PERFORM&amp;#039;&amp;#039;&amp;#039; — synchronous paragraph call; returns to the next statement after the PERFORM. * &amp;#039;&amp;#039;&amp;#039;CALL&amp;#039;&amp;#039;&amp;#039; — dynamic subprogram call; passes a data block by reference; returns via EXIT PROGRAM. * &amp;#039;&amp;#039;&amp;#039;EVALUATE TRUE&amp;#039;&amp;#039;&amp;#039; — multi-way...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;control-flow&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Control Flow =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project:&#039;&#039;&#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#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;conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Conventions ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PERFORM&#039;&#039;&#039; — synchronous paragraph call; returns to the next statement after the PERFORM.&lt;br /&gt;
* &#039;&#039;&#039;CALL&#039;&#039;&#039; — dynamic subprogram call; passes a data block by reference; returns via EXIT PROGRAM.&lt;br /&gt;
* &#039;&#039;&#039;EVALUATE TRUE&#039;&#039;&#039; — multi-way branch on 88-level conditions; equivalent to a CASE statement.&lt;br /&gt;
* &#039;&#039;&#039;PERFORM … UNTIL&#039;&#039;&#039; — loop; condition tested before each iteration (DO-WHILE in reverse — test first).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesmain-paragraph-map&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. primesmain — Paragraph Map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROCEDURE DIVISION&lt;br /&gt;
│&lt;br /&gt;
├── ACCEPT / MOVE setup&lt;br /&gt;
├── PERFORM r90-start-session ──────────────────────────────► r90-start-session&lt;br /&gt;
│                                                               │ CALL primesui &amp;amp;quot;start&amp;amp;quot;&lt;br /&gt;
│                                                               │ IF ok: CALL primesui &amp;amp;quot;log-message&amp;amp;quot; ×2&lt;br /&gt;
│                                                               │ ELSE: DISPLAY + STOP RUN&lt;br /&gt;
│                                                               └── return&lt;br /&gt;
│&lt;br /&gt;
├── EVALUATE TRUE&lt;br /&gt;
│     WHEN report-primes ──────────────────────────────────────► CALL primesui &amp;amp;quot;log-message&amp;amp;quot;&lt;br /&gt;
│     │                                                          PERFORM r92-generate-primes ──► r92-generate-primes&lt;br /&gt;
│     │                                                                                          │ CALL primesgen&lt;br /&gt;
│     │                                                                                          └── return&lt;br /&gt;
│     WHEN generate-primes ────────────────────────────────────► CALL primesui &amp;amp;quot;log-message&amp;amp;quot;&lt;br /&gt;
│     │                                                          *** PERFORM commented out ***&lt;br /&gt;
│     WHEN OTHER ─────────────────────────────────────────────► CALL primesui &amp;amp;quot;log-message&amp;amp;quot;&lt;br /&gt;
│                                                                PERFORM r99-stop-session&lt;br /&gt;
│                                                                STOP RUN&lt;br /&gt;
│&lt;br /&gt;
├── CALL primesui &amp;amp;quot;log-message&amp;amp;quot;&lt;br /&gt;
├── PERFORM r99-stop-session ───────────────────────────────► r99-stop-session&lt;br /&gt;
│                                                               │ CALL primesui &amp;amp;quot;stop&amp;amp;quot;&lt;br /&gt;
│                                                               └── return&lt;br /&gt;
└── STOP RUN&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;CALLs issued by primesmain:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Call&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Using&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Condition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CALL &amp;amp;quot;primesui&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| primes-ui&lt;br /&gt;
| &amp;lt;code&amp;gt;ui-methods = &amp;amp;quot;start&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CALL &amp;amp;quot;primesui&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| primes-ui&lt;br /&gt;
| &amp;lt;code&amp;gt;ui-methods = &amp;amp;quot;log-message&amp;amp;quot;&amp;lt;/code&amp;gt; (multiple)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CALL &amp;amp;quot;primesgen&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| primes-session&lt;br /&gt;
| method = “report” or “generate”&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CALL &amp;amp;quot;primesui&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| primes-ui&lt;br /&gt;
| &amp;lt;code&amp;gt;ui-methods = &amp;amp;quot;stop&amp;amp;quot;&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;primesgen-paragraph-map&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. primesgen — Paragraph Map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROCEDURE DIVISION USING primes-session&lt;br /&gt;
│&lt;br /&gt;
└── EVALUATE TRUE on methods&lt;br /&gt;
      WHEN report-primes&lt;br /&gt;
      │  PERFORM r90-start-primes-report ──────────────────► r90-start-primes-report&lt;br /&gt;
      │  │                                                    │ CALL primes &amp;amp;quot;connect&amp;amp;quot;&lt;br /&gt;
      │  │                                                    │ CALL primes &amp;amp;quot;cursor&amp;amp;quot;&lt;br /&gt;
      │  │                                                    │ PERFORM r94-fetch ──► r94-fetch&lt;br /&gt;
      │  │                                                    │                       │ CALL primes &amp;amp;quot;next-prime&amp;amp;quot;&lt;br /&gt;
      │  │                                                    │                       └── return&lt;br /&gt;
      │  │                                                    └── return&lt;br /&gt;
      │  │&lt;br /&gt;
      │  IF session-method-ok&lt;br /&gt;
      │    PERFORM r86-report-primes UNTIL session-method-eof&lt;br /&gt;
      │    │  ┌──────────────────────────────────────────────► r86-report-primes (loop body)&lt;br /&gt;
      │    │  │ CALL primesui &amp;amp;quot;write&amp;amp;quot;&lt;br /&gt;
      │    │  │ PERFORM r94-fetch ──────────────────────────► r94-fetch&lt;br /&gt;
      │    │  │                                               │ CALL primes &amp;amp;quot;next-prime&amp;amp;quot;&lt;br /&gt;
      │    │  │                                               └── return&lt;br /&gt;
      │    │  └── (loop back)&lt;br /&gt;
      │&lt;br /&gt;
      WHEN generate-primes&lt;br /&gt;
      │  PERFORM r91-start-primes-generation ──────────────► r91-start-primes-generation&lt;br /&gt;
      │  │                                                    │ CALL primes &amp;amp;quot;connect&amp;amp;quot;&lt;br /&gt;
      │  │                                                    └── return&lt;br /&gt;
      │  │&lt;br /&gt;
      │  IF session-method-ok&lt;br /&gt;
      │    PERFORM r80-test-number UNTIL test-number = 999999999&lt;br /&gt;
      │    │  ┌──────────────────────────────────────────────► r80-test-number (loop body)&lt;br /&gt;
      │    │  │ DIVIDE test-number BY test-divider → test-rest&lt;br /&gt;
      │    │  │ EVALUATE TRUE&lt;br /&gt;
      │    │  │   WHEN test-rest = 0&lt;br /&gt;
      │    │  │     PERFORM r82-next-test-number ──────────► r82-next-test-number&lt;br /&gt;
      │    │  │                                               │ ADD 2 TO test-number&lt;br /&gt;
      │    │  │                                               │ COMPUTE sqrt&lt;br /&gt;
      │    │  │                                               │ MOVE 1 TO old-ident&lt;br /&gt;
      │    │  │                                               │ PERFORM r89-get-next-divider ──► r89-get-next-divider&lt;br /&gt;
      │    │  │                                               │                                  │ CALL primes &amp;amp;quot;get&amp;amp;quot;&lt;br /&gt;
      │    │  │                                               │                                  └── return&lt;br /&gt;
      │    │  │                                               └── return&lt;br /&gt;
      │    │  │   WHEN test-divider &amp;amp;gt; test-number-sqr&lt;br /&gt;
      │    │  │     PERFORM r85-write-prime ─────────────► r85-write-prime&lt;br /&gt;
      │    │  │     │                                       │ CALL primes &amp;amp;quot;write&amp;amp;quot;&lt;br /&gt;
      │    │  │     │                                       │ CALL primesui &amp;amp;quot;write&amp;amp;quot;&lt;br /&gt;
      │    │  │     │                                       └── return&lt;br /&gt;
      │    │  │     PERFORM r82-next-test-number (as above)&lt;br /&gt;
      │    │  │   WHEN OTHER&lt;br /&gt;
      │    │  │     PERFORM r89-get-next-divider (as above)&lt;br /&gt;
      │    │  └── (loop back)&lt;br /&gt;
      │&lt;br /&gt;
      WHEN OTHER&lt;br /&gt;
        LOG &amp;amp;quot;Bad method&amp;amp;quot;&lt;br /&gt;
│&lt;br /&gt;
└── PERFORM r99-close-primes ────────────────────────────► r99-close-primes&lt;br /&gt;
    │                                                       │ CALL primes &amp;amp;quot;disconnect&amp;amp;quot;&lt;br /&gt;
    │                                                       └── return&lt;br /&gt;
    EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loop summary — primesgen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Loop&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Type&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Condition&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Paragraph&lt;br /&gt;
|-&lt;br /&gt;
| Report read&lt;br /&gt;
| PERFORM UNTIL&lt;br /&gt;
| &amp;lt;code&amp;gt;session-method-eof&amp;lt;/code&amp;gt; (result = 9)&lt;br /&gt;
| r86-report-primes&lt;br /&gt;
|-&lt;br /&gt;
| Sieve&lt;br /&gt;
| PERFORM UNTIL&lt;br /&gt;
| &amp;lt;code&amp;gt;test-number = 999999999&amp;lt;/code&amp;gt;&lt;br /&gt;
| r80-test-number&lt;br /&gt;
|-&lt;br /&gt;
| Inner (test-number)&lt;br /&gt;
| EVALUATE inside PERFORM&lt;br /&gt;
| drives calls to r82 / r85 / r89&lt;br /&gt;
| r80-test-number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primes-dal-paragraph-map&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. primes (DAL) — Paragraph Map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROCEDURE DIVISION USING primes-dal&lt;br /&gt;
│&lt;br /&gt;
└── EVALUATE TRUE on dal-methods&lt;br /&gt;
      WHEN next-prime    → PERFORM r80-get-next-prime ──────► r80-get-next-prime&lt;br /&gt;
      │                                                        │ PERFORM s02-fetch ──► s02-fetch&lt;br /&gt;
      │                                                        │                       │ EXEC SQL FETCH&lt;br /&gt;
      │                                                        │                       └── return&lt;br /&gt;
      │                                                        └── return&lt;br /&gt;
      WHEN next-divider  → PERFORM r81-get-next-divider ────► r81-get-next-divider&lt;br /&gt;
      │                                                        │ ADD 1 TO old-ident → new-ident&lt;br /&gt;
      │                                                        │ EXEC SQL SELECT prime WHERE ident=new-ident&lt;br /&gt;
      │                                                        │ MOVE new-ident TO old-ident&lt;br /&gt;
      │                                                        └── return&lt;br /&gt;
      WHEN write-prime   → PERFORM r83-write-prime ──────────► r83-write-prime&lt;br /&gt;
      │                                                         │ EXEC SQL INSERT&lt;br /&gt;
      │                                                         └── return&lt;br /&gt;
      WHEN db-connect    → PERFORM s00-connect ──────────────► s00-connect&lt;br /&gt;
      │                                                         │ EXEC SQL CONNECT&lt;br /&gt;
      │                                                         └── return&lt;br /&gt;
      WHEN db-cursor     → PERFORM s01-cursor ───────────────► s01-cursor&lt;br /&gt;
      │                                                         │ EXEC SQL START TRANSACTION&lt;br /&gt;
      │                                                         │ EXEC SQL OPEN primescursor&lt;br /&gt;
      │                                                         └── return&lt;br /&gt;
      WHEN db-disconnect → PERFORM s99-disconnect ───────────► s99-disconnect&lt;br /&gt;
      │                                                         │ EXEC SQL CONNECT RESET&lt;br /&gt;
      │                                                         └── return&lt;br /&gt;
      WHEN OTHER         → dal-result = 1&lt;br /&gt;
│&lt;br /&gt;
└── EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;No loops&#039;&#039;&#039; in primes.cbl. Each invocation handles exactly one SQL operation and returns.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesui-paragraph-map&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. primesui — Paragraph Map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PROCEDURE DIVISION USING primes-ui&lt;br /&gt;
│&lt;br /&gt;
└── EVALUATE TRUE on ui-methods&lt;br /&gt;
      WHEN start-ui    → PERFORM r90-start-primesui ────────► r90-start-primesui&lt;br /&gt;
      │                                                         │ OPEN OUTPUT fprinter&lt;br /&gt;
      │                                                         │ IF ok: result=0, idx=1&lt;br /&gt;
      │                                                         │   PERFORM r98-message-ui ──► r98-message-ui&lt;br /&gt;
      │                                                         │                              │ DISPLAY on scherm&lt;br /&gt;
      │                                                         │                              └── return&lt;br /&gt;
      │                                                         └── return&lt;br /&gt;
      WHEN write-ui    → PERFORM r92-write-primesui ─────────► r92-write-primesui&lt;br /&gt;
      │                   │ load cell(primes-idx)&lt;br /&gt;
      │                   │ idx + 1&lt;br /&gt;
      │                   │ IF new-page → PERFORM r93-new-page ──► r93-new-page&lt;br /&gt;
      │                   │                                         │ WRITE heading&lt;br /&gt;
      │                   │                                         │ WRITE col header&lt;br /&gt;
      │                   │                                         │ new-page = 0&lt;br /&gt;
      │                   │                                         └── return&lt;br /&gt;
      │                   │ IF idx = 7 → WRITE line, idx = 1&lt;br /&gt;
      │                   │ IF linage = 53 → PERFORM r94-eop ──► r94-eop&lt;br /&gt;
      │                   │                                       │ WRITE blank&lt;br /&gt;
      │                   │                                       │ WRITE footing&lt;br /&gt;
      │                   │                                       │ page-number + 1&lt;br /&gt;
      │                   │                                       │ new-page = 1&lt;br /&gt;
      │                   │                                       └── return&lt;br /&gt;
      │                   └── return&lt;br /&gt;
      WHEN message-ui  → PERFORM r98-message-ui (as above)&lt;br /&gt;
      WHEN stop-ui     → PERFORM r99-stop-primesui ──────────► r99-stop-primesui&lt;br /&gt;
      │                   │ u-sequence = 0, u-number = 0&lt;br /&gt;
      │                   │ PERFORM r92-write-primesui UNTIL new-page  ← flush loop&lt;br /&gt;
      │                   │ PERFORM r98-message-ui&lt;br /&gt;
      │                   │ CLOSE fprinter&lt;br /&gt;
      │                   └── return&lt;br /&gt;
      WHEN OTHER       → ui-method-result = 1&lt;br /&gt;
│&lt;br /&gt;
└── EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loop summary — primesui:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Loop&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Type&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Condition&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Location&lt;br /&gt;
|-&lt;br /&gt;
| Flush partial line&lt;br /&gt;
| PERFORM UNTIL&lt;br /&gt;
| &amp;lt;code&amp;gt;new-page&amp;lt;/code&amp;gt; (print-new-page = 1)&lt;br /&gt;
| r99-stop-primesui&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cross-program-control-flow-summary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Cross-Program Control Flow Summary ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;OS&lt;br /&gt;
 └─► primesmain  PROCEDURE DIVISION&lt;br /&gt;
       │&lt;br /&gt;
       ├─► CALL primesui  (start, log×n, stop)&lt;br /&gt;
       │      └── EXIT PROGRAM back to primesmain&lt;br /&gt;
       │&lt;br /&gt;
       └─► CALL primesgen  (once, with primes-session)&lt;br /&gt;
              │&lt;br /&gt;
              ├─► CALL primes  (connect)&lt;br /&gt;
              │      └── EXIT PROGRAM back to primesgen&lt;br /&gt;
              ├─► CALL primes  (cursor / next-prime / next-divider / write / disconnect)&lt;br /&gt;
              │      └── EXIT PROGRAM back to primesgen  [repeated in loop]&lt;br /&gt;
              ├─► CALL primesui  (log-message / write)&lt;br /&gt;
              │      └── EXIT PROGRAM back to primesgen  [repeated in loop]&lt;br /&gt;
              └── EXIT PROGRAM back to primesmain&amp;lt;/pre&amp;gt;&lt;br /&gt;
All inter-program communication is by reference (shared data blocks). There are no GOTO statements in the current source. All branching is via PERFORM, EVALUATE, and IF/ELSE. No COPY-based GOTO or ALTER is used.&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>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=IO_behaviour&amp;diff=4772</id>
		<title>IO behaviour</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=IO_behaviour&amp;diff=4772"/>
		<updated>2026-03-25T16:49:49Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;io-behaviour&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = I/O Behaviour =  &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;file-io-primes.prt&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. File I/O — primes.prt ==  &amp;lt;span id=&amp;quot;file-definition-primesui.cbl&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; === 1.1 File Definition (primesui.cbl) ===  &amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;SELECT fprinter ASSIGN TO &amp;quot;primes.prt&amp;quot;        ORGANIZATION IS SEQUENTIAL        FILE STATUS I...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;io-behaviour&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= I/O Behaviour =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project:&#039;&#039;&#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#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;file-io-primes.prt&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. File I/O — primes.prt ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;file-definition-primesui.cbl&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.1 File Definition (primesui.cbl) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;SELECT fprinter ASSIGN TO &amp;quot;primes.prt&amp;quot;&lt;br /&gt;
       ORGANIZATION IS SEQUENTIAL&lt;br /&gt;
       FILE STATUS IS primes-prt-status.&lt;br /&gt;
&lt;br /&gt;
FD fprinter&lt;br /&gt;
   LABEL RECORDS OMITTED&lt;br /&gt;
   LINAGE 56,&lt;br /&gt;
   FOOTING 2,&lt;br /&gt;
   BOTTOM  2.&lt;br /&gt;
&lt;br /&gt;
01 file-buffer PIC X(132).&amp;lt;/syntaxhighlight&amp;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;
| last 2 lines 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;
| not specified (default 0)&lt;br /&gt;
|-&lt;br /&gt;
| Open mode&lt;br /&gt;
| OUTPUT only&lt;br /&gt;
|-&lt;br /&gt;
| Status field&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-prt-status&amp;lt;/code&amp;gt; PIC X(2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;open&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.2 Open ===&lt;br /&gt;
&lt;br /&gt;
Called by &amp;lt;code&amp;gt;r90-start-primesui&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;ui-methods = &amp;amp;quot;start&amp;amp;quot;&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;OPEN OUTPUT fprinter&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Success: &amp;lt;code&amp;gt;primes-prt-status = &amp;amp;quot;00&amp;amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ui-method-result = 0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primes-idx = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Failure: &amp;lt;code&amp;gt;primes-prt-status ≠ &amp;amp;quot;00&amp;amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ui-method-result = 1&amp;lt;/code&amp;gt;, status displayed on console.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;write-data-lines&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.3 Write — Data Lines ===&lt;br /&gt;
&lt;br /&gt;
Called by &amp;lt;code&amp;gt;r92-write-primesui&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;primes-idx&amp;lt;/code&amp;gt; reaches 7 (after loading 6 entries):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE primes-table TO print-buffer&lt;br /&gt;
WRITE file-buffer FROM print-buffer&amp;lt;/pre&amp;gt;&lt;br /&gt;
One 132-character record is written per six prime entries. The record layout is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[Z(9)][XX][Z(9)][XX][Z(9)][XX][Z(9)][XX][Z(9)][XX][Z(9)][XX]&lt;br /&gt;
 seq1   sp  prime1 sp  seq2  sp  prime2 sp  seq3  sp  prime3 sp ... × 6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Each cell = 9 + 2 + 9 + 2 = 22 characters; 6 cells = 132 characters exactly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;write-page-heading-r93-new-page&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.4 Write — Page Heading (&amp;lt;code&amp;gt;r93-new-page&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;WRITE file-buffer FROM primes-heading    → &amp;amp;quot;primes overview&amp;amp;quot; (PIC X(118))&lt;br /&gt;
WRITE file-buffer FROM table-header      → &amp;amp;quot;Sequence  Prime &amp;amp;quot; × 6&amp;lt;/pre&amp;gt;&lt;br /&gt;
Triggered by &amp;lt;code&amp;gt;new-page&amp;lt;/code&amp;gt; flag = 1. Flag cleared after write.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;write-page-footing-r94-eop&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.5 Write — Page Footing (&amp;lt;code&amp;gt;r94-eop&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
Triggered when &amp;lt;code&amp;gt;linage-counter = 53&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;WRITE file-buffer FROM &#039; &#039;              → blank separator&lt;br /&gt;
WRITE file-buffer FROM primes-footing   → spaces(118) + &amp;amp;quot;page: &amp;amp;quot; + Z(3)9&lt;br /&gt;
ADD 1 TO page-number&lt;br /&gt;
SET print-new-page = 1                  → next write triggers new heading&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;close&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.6 Close ===&lt;br /&gt;
&lt;br /&gt;
Called by &amp;lt;code&amp;gt;r99-stop-primesui&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;ui-methods = &amp;amp;quot;stop&amp;amp;quot;&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CLOSE fprinter&amp;lt;/pre&amp;gt;&lt;br /&gt;
Before close, a flush loop pads remaining cells with zeros until &amp;lt;code&amp;gt;new-page&amp;lt;/code&amp;gt; fires, guaranteeing the last partial data line is written.&lt;br /&gt;
&lt;br /&gt;
Success / failure reflected in &amp;lt;code&amp;gt;ui-method-result&amp;lt;/code&amp;gt; ← &amp;lt;code&amp;gt;primes-prt-status&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;console-output-scherm&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Console Output — scherm ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;definition&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.1 Definition ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;SPECIAL-NAMES. CONSOLE IS scherm.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
All four programs declare &amp;lt;code&amp;gt;scherm&amp;lt;/code&amp;gt; as the console special-name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;structured-log-messages-via-primesui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.2 Structured Log Messages (via primesui) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;r98-message-ui&amp;lt;/code&amp;gt; in primesui:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DISPLAY process-message UPON scherm&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;process-message&amp;lt;/code&amp;gt; is a 132-character group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;program-name      PIC X(20)   e.g. &amp;amp;quot;primesmain          &amp;amp;quot;&lt;br /&gt;
program-paragraph PIC X(20)   e.g. &amp;amp;quot;r90-start-session   &amp;amp;quot;&lt;br /&gt;
program-message   PIC X(92)   e.g. &amp;amp;quot;UI initialisation succeeded.         ...&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Every caller populates &amp;lt;code&amp;gt;program-name&amp;lt;/code&amp;gt;, optionally &amp;lt;code&amp;gt;program-paragraph&amp;lt;/code&amp;gt;, and always &amp;lt;code&amp;gt;program-message&amp;lt;/code&amp;gt; before calling &amp;lt;code&amp;gt;primesui &amp;amp;quot;log-message&amp;amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;direct-display-statements-diagnostic-error&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.3 Direct DISPLAY Statements (diagnostic / error) ===&lt;br /&gt;
&lt;br /&gt;
Several paragraphs bypass primesui and write directly to &amp;lt;code&amp;gt;scherm&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Location&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Statement&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Purpose&lt;br /&gt;
|-&lt;br /&gt;
| primesmain r90&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY &amp;amp;quot;Emergency console message…&amp;amp;quot; UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
| Hard abort if UI fails&lt;br /&gt;
|-&lt;br /&gt;
| primes r81&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY SQLCODE UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
| SQL error on next-divider&lt;br /&gt;
|-&lt;br /&gt;
| primes r81&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY &amp;amp;quot;select new-divider nok&amp;amp;quot; UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| primes r83&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY SQLCODE UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
| SQL error on insert&lt;br /&gt;
|-&lt;br /&gt;
| primes r83&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY &amp;amp;quot;primes.cbl insert next prime nok…&amp;amp;quot; UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| primes s00&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY &amp;amp;quot;connect to database&amp;amp;quot; UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
| Always shown on connect&lt;br /&gt;
|-&lt;br /&gt;
| primes s00&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY SQLCODE UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| primes s99&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY &amp;amp;quot;s99 disconnect from database&amp;amp;quot; UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
| Always shown on disconnect&lt;br /&gt;
|-&lt;br /&gt;
| primes s99&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY SQLCODE UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| primesui r90&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY primes-prt-status UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
| File open failure&lt;br /&gt;
|-&lt;br /&gt;
| primesui r99&lt;br /&gt;
| &amp;lt;code&amp;gt;DISPLAY primes-prt-status UPON scherm&amp;lt;/code&amp;gt;&lt;br /&gt;
| File close failure&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;database-io-primes.cbl-via-gixsql&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Database I/O (primes.cbl via GixSQL) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;connection-management&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Connection Management ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Operation&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| SQL&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Paragraph&lt;br /&gt;
|-&lt;br /&gt;
| Connect&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;
| Disconnect&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;
Connection string: &amp;lt;code&amp;gt;pgsql://localhost:5432/primes&amp;amp;amp;default_schema=primes&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Connection alias: &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; statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cursor-lifecycle-report-path-only&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 Cursor Lifecycle (report path only) ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Operation&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| SQL&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Paragraph&lt;br /&gt;
|-&lt;br /&gt;
| Declare&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;
| Begin transaction&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;
| Open&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;
| Fetch one row&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;
| (Close)&lt;br /&gt;
| not explicitly closed — connection reset closes it&lt;br /&gt;
| —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each &amp;lt;code&amp;gt;FETCH&amp;lt;/code&amp;gt; populates &amp;lt;code&amp;gt;primes-row&amp;lt;/code&amp;gt; (r-ident, r-prime), which is then copied to &amp;lt;code&amp;gt;primes-sequence&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;prime-number&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt; for the caller.&lt;br /&gt;
&lt;br /&gt;
End-of-cursor is signalled by &amp;lt;code&amp;gt;SQLCODE ≠ 0&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;dal-result&amp;lt;/code&amp;gt; is set to 1, which primesgen maps to &amp;lt;code&amp;gt;session-method-eof&amp;lt;/code&amp;gt; implicitly (by checking &amp;lt;code&amp;gt;session-method-eof&amp;lt;/code&amp;gt; condition, value 9 — note: there is a mapping gap; dal-result=1 does not equal session-result=9; the report loop relies on &amp;lt;code&amp;gt;session-method-eof&amp;lt;/code&amp;gt; which is never explicitly set in the current code — see defect D-RPT-01 below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dml-generate-path&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.3 DML (generate path) ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Operation&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| SQL&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Paragraph&lt;br /&gt;
|-&lt;br /&gt;
| Insert prime&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;
&lt;br /&gt;
* Host variable &amp;lt;code&amp;gt;:prime&amp;lt;/code&amp;gt; maps to &amp;lt;code&amp;gt;prime-number&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;primes-dal.primes-data&amp;lt;/code&amp;gt;.&lt;br /&gt;
* No explicit COMMIT in the current code (statement is commented out).&lt;br /&gt;
* PostgreSQL default auto-commit applies per statement unless inside the transaction opened by &amp;lt;code&amp;gt;s01-cursor&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;queries-generate-path-divider-lookup&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.4 Queries (generate path — divider lookup) ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Operation&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| SQL&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Paragraph&lt;br /&gt;
|-&lt;br /&gt;
| Get next divider&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;
&lt;br /&gt;
* &amp;lt;code&amp;gt;:new-ident&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;old-ident + 1&amp;lt;/code&amp;gt; (computed inline before the SELECT).&lt;br /&gt;
* &amp;lt;code&amp;gt;:test-divider&amp;lt;/code&amp;gt; is in the local &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; working-storage group in primesgen, not in &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;error-handling-pattern&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.5 Error Handling Pattern ===&lt;br /&gt;
&lt;br /&gt;
Every SQL statement uses the same pattern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EXEC SQL ... END-EXEC&lt;br /&gt;
IF SQLCODE = 0 THEN&lt;br /&gt;
  [success actions]&lt;br /&gt;
ELSE&lt;br /&gt;
  [log error / set result code]&amp;lt;/pre&amp;gt;&lt;br /&gt;
No &amp;lt;code&amp;gt;WHENEVER&amp;lt;/code&amp;gt; directives are used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;command-line-input&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Command-Line Input ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Program&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Statement&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Variable&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Length&lt;br /&gt;
|-&lt;br /&gt;
| primesmain&lt;br /&gt;
| &amp;lt;code&amp;gt;ACCEPT commandline-args FROM COMMAND-LINE&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;commandline-args&amp;lt;/code&amp;gt; PIC X(32)&lt;br /&gt;
| 32 chars&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only the first 32 characters of the command-line argument are stored. The value is copied to &amp;lt;code&amp;gt;methods&amp;lt;/code&amp;gt; in the session control block and also logged to the console via primesui after session start.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;known-io-defects&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Known I/O Defects ==&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;| Description&lt;br /&gt;
|-&lt;br /&gt;
| D-RPT-01&lt;br /&gt;
| The report loop condition &amp;lt;code&amp;gt;session-method-eof&amp;lt;/code&amp;gt; (value 9) is never set in the code path; when a fetch fails, &amp;lt;code&amp;gt;session-result&amp;lt;/code&amp;gt; is set to 1 (nok), not 9, causing the loop to terminate on error rather than on true EOF.&lt;br /&gt;
|-&lt;br /&gt;
| D-IO-01&lt;br /&gt;
| &amp;lt;code&amp;gt;primesgen&amp;lt;/code&amp;gt; declares a &amp;lt;code&amp;gt;SELECT fprinter&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FD fprinter&amp;lt;/code&amp;gt; but never opens or uses the file; print output is delegated entirely to primesui.&lt;br /&gt;
|-&lt;br /&gt;
| D-IO-02&lt;br /&gt;
| Connection reset in &amp;lt;code&amp;gt;s99-disconnect&amp;lt;/code&amp;gt; targets alias &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;; the pre-compiler listing (&amp;lt;code&amp;gt;primes_cbsql.out&amp;lt;/code&amp;gt;) shows &amp;lt;code&amp;gt;primesdb&amp;lt;/code&amp;gt; used in earlier iterations, which would cause a runtime alias-not-found error.&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>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Business_rules&amp;diff=4771</id>
		<title>Business rules</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Business_rules&amp;diff=4771"/>
		<updated>2026-03-25T16:48:56Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;business-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Business Rules =  &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;primality-algorithm&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. Primality Algorithm ==  &amp;lt;span id=&amp;quot;br-algo-01-input-domain&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; === BR-ALGO-01 — Input domain ===  Only odd integers are tested for primality. The sieve begins at &amp;lt;code&amp;gt;test-number = 3&amp;lt;/code&amp;gt; and advances in steps of 2 (&amp;lt;code&amp;gt;ADD 2 TO...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;business-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Business Rules =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project:&#039;&#039;&#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#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;primality-algorithm&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Primality Algorithm ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-01-input-domain&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-01 — Input domain ===&lt;br /&gt;
&lt;br /&gt;
Only odd integers are tested for primality. The sieve begins at &amp;lt;code&amp;gt;test-number = 3&amp;lt;/code&amp;gt; and advances in steps of 2 (&amp;lt;code&amp;gt;ADD 2 TO test-number&amp;lt;/code&amp;gt;), implicitly excluding all even numbers. The even prime 2 is intended as a seed but is not currently inserted in the active code path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-02-upper-bound&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-02 — Upper bound ===&lt;br /&gt;
&lt;br /&gt;
Generation terminates when &amp;lt;code&amp;gt;test-number = 999,999,999&amp;lt;/code&amp;gt;. This value is the terminal condition of the PERFORM loop in primesgen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;PERFORM r80-test-number UNTIL test-number = 999999999&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-03-divisibility-test&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-03 — Divisibility test ===&lt;br /&gt;
&lt;br /&gt;
A candidate is composite if the remainder of dividing it by the current trial divisor is zero:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DIVIDE test-number BY test-divider&lt;br /&gt;
       GIVING test-quot REMAINDER test-rest&lt;br /&gt;
&lt;br /&gt;
WHEN test-rest = 0  →  composite; skip to next candidate&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-04-square-root-bound-trial-division-cutoff&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-04 — Square-root bound (trial-division cutoff) ===&lt;br /&gt;
&lt;br /&gt;
If the current trial divisor exceeds the square root of the candidate, no factor can exist and the candidate is prime. The square root is computed using COBOL exponentiation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;COMPUTE test-number-sqr = test-number ** 0.5&lt;br /&gt;
&lt;br /&gt;
WHEN test-divider &amp;amp;gt; test-number-sqr  →  prime confirmed&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;test-number-sqr&amp;lt;/code&amp;gt; is re-computed every time &amp;lt;code&amp;gt;test-number&amp;lt;/code&amp;gt; advances (in &amp;lt;code&amp;gt;r82-next-test-number&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-05-trial-divisors-sourced-from-the-database&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-05 — Trial divisors sourced from the database ===&lt;br /&gt;
&lt;br /&gt;
Trial divisors are not held in memory; they are fetched from the &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; table by &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; sequence:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT prime FROM primes WHERE ident = :new-ident&amp;lt;/pre&amp;gt;&lt;br /&gt;
The index &amp;lt;code&amp;gt;old-ident&amp;lt;/code&amp;gt; is initialised to 1 for each new candidate and incremented by 1 on each &amp;lt;code&amp;gt;next-divider&amp;lt;/code&amp;gt; call. This means the algorithm uses previously stored primes as divisors — a characteristic of a sieve-of-Eratosthenes variant rather than pure trial division.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-algo-06-candidate-advance-rule&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ALGO-06 — Candidate advance rule ===&lt;br /&gt;
&lt;br /&gt;
After a composite or prime determination, the candidate advances to the next odd integer and the divisor index resets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ADD 2 TO test-number&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   ← loads test-divider = first prime (ident 1)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-validation-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Data Validation Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-val-01-command-line-argument&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-VAL-01 — Command-line argument ===&lt;br /&gt;
&lt;br /&gt;
The application accepts exactly one of two valid argument values:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Value&lt;br /&gt;
! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;quot;report&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Execute reporting path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;quot;generate&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Execute generation path&lt;br /&gt;
|-&lt;br /&gt;
| anything else&lt;br /&gt;
| Log error; &amp;lt;code&amp;gt;STOP RUN&amp;lt;/code&amp;gt; immediately&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rule is implemented by 88-level conditions and an &amp;lt;code&amp;gt;EVALUATE TRUE&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;WHEN OTHER&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;88 report-primes   VALUE &amp;amp;quot;report&amp;amp;quot;.&lt;br /&gt;
88 generate-primes VALUE &amp;amp;quot;generate&amp;amp;quot;.&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;
  STOP RUN&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-val-02-ui-initialisation-must-succeed-before-processing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-VAL-02 — UI initialisation must succeed before processing ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;ui-method-result ≠ 0&amp;lt;/code&amp;gt; on a &amp;lt;code&amp;gt;&amp;amp;quot;start&amp;amp;quot;&amp;lt;/code&amp;gt; call, the program issues an emergency console message and halts unconditionally. No database activity is attempted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF ui-method-ok THEN ...&lt;br /&gt;
ELSE&lt;br /&gt;
  DISPLAY &amp;amp;quot;Emergency console message program stops.&amp;amp;quot; UPON scherm&lt;br /&gt;
  STOP RUN&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-val-03-database-connection-must-succeed-before-processing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-VAL-03 — Database connection must succeed before processing ===&lt;br /&gt;
&lt;br /&gt;
In both &amp;lt;code&amp;gt;r90-start-primes-report&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;r91-start-primes-generation&amp;lt;/code&amp;gt;, a failed &amp;lt;code&amp;gt;&amp;amp;quot;connect&amp;amp;quot;&amp;lt;/code&amp;gt; call sets &amp;lt;code&amp;gt;session-result = 1&amp;lt;/code&amp;gt; and processing does not continue. The condition is checked via:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF dal-method-ok THEN ...&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;
  (falls through to r99-close-primes)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-val-04-cursor-must-open-successfully-before-fetching&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-VAL-04 — Cursor must open successfully before fetching ===&lt;br /&gt;
&lt;br /&gt;
In the report path, cursor failure sets &amp;lt;code&amp;gt;session-result = 1&amp;lt;/code&amp;gt; and no fetch loop is entered. The guard is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF dal-method-ok THEN&lt;br /&gt;
  PERFORM r86-report-primes UNTIL session-method-eof&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-val-05-sqlcode-0-is-the-sole-sql-success-criterion&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-VAL-05 — SQLCODE = 0 is the sole SQL success criterion ===&lt;br /&gt;
&lt;br /&gt;
All SQL error handling uses &amp;lt;code&amp;gt;IF SQLCODE = 0 THEN ... ELSE ...&amp;lt;/code&amp;gt;. No other status codes (e.g., +100 NOT FOUND) are explicitly handled with named conditions; they fall into the &amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt; branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;calculations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Calculations ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-calc-01-square-root-computation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-CALC-01 — Square root computation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;COMPUTE test-number-sqr = test-number ** 0.5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;test-number-sqr&amp;lt;/code&amp;gt; is declared as &amp;lt;code&amp;gt;PIC 9(9)V9(9)&amp;lt;/code&amp;gt; — an 18-digit decimal with 9 integer and 9 fractional digits. The comparison &amp;lt;code&amp;gt;test-divider &amp;amp;gt; test-number-sqr&amp;lt;/code&amp;gt; relies on COBOL’s decimal comparison across the two fields.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-calc-02-remainder-computation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-CALC-02 — Remainder computation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DIVIDE test-number BY test-divider&lt;br /&gt;
       GIVING test-quot REMAINDER test-rest&amp;lt;/pre&amp;gt;&lt;br /&gt;
Both &amp;lt;code&amp;gt;test-quot&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;test-rest&amp;lt;/code&amp;gt; are declared &amp;lt;code&amp;gt;PIC 9(9)V9(9)&amp;lt;/code&amp;gt;. The condition &amp;lt;code&amp;gt;test-rest = 0&amp;lt;/code&amp;gt; detects exact divisibility.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;output-formatting-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Output Formatting Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-fmt-01-six-primes-per-print-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-FMT-01 — Six primes per print line ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;primes-table&amp;lt;/code&amp;gt; working-storage in primesui holds 6 cells. A line is written to the print file only when all 6 are filled (&amp;lt;code&amp;gt;primes-idx = 7&amp;lt;/code&amp;gt; after increment):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF primes-idx = 7 THEN&lt;br /&gt;
  WRITE print line&lt;br /&gt;
  SET primes-idx TO 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-fmt-02-zero-suppression&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-FMT-02 — Zero suppression ===&lt;br /&gt;
&lt;br /&gt;
Sequence numbers and prime values are formatted with &amp;lt;code&amp;gt;PIC Z(9)&amp;lt;/code&amp;gt; (leading-zero suppression) in the print cells &amp;lt;code&amp;gt;t-ident&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;t-prime&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-fmt-03-page-trigger-at-line-53&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-FMT-03 — Page trigger at line 53 ===&lt;br /&gt;
&lt;br /&gt;
End-of-page processing fires when &amp;lt;code&amp;gt;linage-counter = 53&amp;lt;/code&amp;gt; (3 lines before the 56-line page boundary), leaving room for the footing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF linage-counter = 53 THEN PERFORM r94-eop&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-fmt-04-new-page-flag-controls-heading-output&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-FMT-04 — New-page flag controls heading output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;print-new-page&amp;lt;/code&amp;gt; (88 condition &amp;lt;code&amp;gt;new-page&amp;lt;/code&amp;gt;, VALUE 1) is the gate for writing the heading. It is set to 1 at initialisation and after each page footing; cleared to 0 after the heading is written:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IF new-page THEN PERFORM r93-new-page&lt;br /&gt;
...&lt;br /&gt;
r93-new-page:&lt;br /&gt;
  MOVE ZERO TO print-new-page&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-fmt-05-partial-line-flush-at-stop&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-FMT-05 — Partial line flush at stop ===&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt; receives &amp;lt;code&amp;gt;&amp;amp;quot;stop&amp;amp;quot;&amp;lt;/code&amp;gt;, it pads the remaining cells with zeros and keeps calling &amp;lt;code&amp;gt;r92-write-primesui&amp;lt;/code&amp;gt; until &amp;lt;code&amp;gt;new-page&amp;lt;/code&amp;gt; triggers (i.e., until the partial line fills, writes, and a new page would be needed), ensuring the last data line is always written:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE 0 TO u-sequence&lt;br /&gt;
MOVE 0 TO u-number&lt;br /&gt;
PERFORM r92-write-primesui UNTIL new-page&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;session-and-error-handling-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Session and Error-Handling Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-err-01-result-code-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ERR-01 — Result-code convention ===&lt;br /&gt;
&lt;br /&gt;
All three tier interfaces use the same pattern:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Code&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Success&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Failure / error&lt;br /&gt;
|-&lt;br /&gt;
| 9 or 99&lt;br /&gt;
| End-of-data / EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-err-02-no-retry-on-failure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ERR-02 — No retry on failure ===&lt;br /&gt;
&lt;br /&gt;
Errors at any tier cause a log message and a result code of 1. The calling tier checks the result and either skips subsequent steps or falls through to cleanup. There is no retry logic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-err-03-cleanup-always-attempted&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-ERR-03 — Cleanup always attempted ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;r99-close-primes&amp;lt;/code&amp;gt; in primesgen and &amp;lt;code&amp;gt;r99-stop-session&amp;lt;/code&amp;gt; in primesmain are always performed before &amp;lt;code&amp;gt;EXIT PROGRAM&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;STOP RUN&amp;lt;/code&amp;gt;, regardless of whether prior steps succeeded. This ensures the database connection and print file are always closed.&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>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Program_Logic&amp;diff=4770</id>
		<title>Program Logic</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Program_Logic&amp;diff=4770"/>
		<updated>2026-03-25T16:47:57Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;program-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Program Logic =  &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;primesmain-step-by-step-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. primesmain — Step-by-Step Logic ==  &amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;primesmain.cbl&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Role:&amp;#039;&amp;#039;&amp;#039; Entry point. Parses command-line argument, initialises UI, dispatches to processing, shuts down.  &amp;lt;span id=&amp;quot;procedure-division-main-i...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;program-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Program Logic =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project:&#039;&#039;&#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#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;primesmain-step-by-step-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. primesmain — Step-by-Step Logic ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; &amp;lt;code&amp;gt;primesmain.cbl&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Role:&#039;&#039;&#039; Entry point. Parses command-line argument, initialises UI, dispatches to processing, shuts down.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division-main-inline-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PROCEDURE DIVISION (main inline logic) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Step 1  ACCEPT commandline-args FROM COMMAND-LINE&lt;br /&gt;
        → reads first token of the OS command line into commandline-args (PIC X(32))&lt;br /&gt;
&lt;br /&gt;
Step 2  MOVE commandline-args TO methods&lt;br /&gt;
        MOVE &#039;primesmain&#039;    TO program-name&lt;br /&gt;
        → loads session control block ready for dispatch&lt;br /&gt;
        → sets log identity for subsequent messages&lt;br /&gt;
&lt;br /&gt;
Step 3  PERFORM r90-start-session&lt;br /&gt;
        → opens primes.prt and verifies UI layer is ready (see §1.1)&lt;br /&gt;
&lt;br /&gt;
Step 4  EVALUATE TRUE&lt;br /&gt;
          WHEN report-primes   (commandline-args = &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;
            PERFORM r92-generate-primes   → CALL primesgen&lt;br /&gt;
&lt;br /&gt;
          WHEN generate-primes (commandline-args = &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;
            *** PERFORM r92-generate-primes is COMMENTED OUT ***&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;
            PERFORM r99-stop-session&lt;br /&gt;
            STOP RUN&lt;br /&gt;
&lt;br /&gt;
Step 5  LOG &amp;amp;quot;Primes run complete, program stops.&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
Step 6  PERFORM r99-stop-session&lt;br /&gt;
&lt;br /&gt;
Step 7  STOP RUN&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r90-start-session&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.1 Paragraph: r90-start-session ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &#039;start-session&#039; TO program-paragraph&lt;br /&gt;
MOVE &#039;start&#039;         TO ui-methods&lt;br /&gt;
CALL &amp;amp;quot;primesui&amp;amp;quot; USING primes-ui&lt;br /&gt;
&lt;br /&gt;
IF ui-method-ok (result = 0) THEN&lt;br /&gt;
  LOG &amp;amp;quot;UI initialisation succeeded.&amp;amp;quot;&lt;br /&gt;
  LOG commandline-args value&lt;br /&gt;
ELSE&lt;br /&gt;
  DISPLAY &amp;amp;quot;Emergency console message program stops.&amp;amp;quot; UPON scherm&lt;br /&gt;
  STOP RUN                ← hard abort; no graceful close&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r92-generate-primes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.2 Paragraph: r92-generate-primes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CALL &amp;amp;quot;primesgen&amp;amp;quot; USING primes-session&lt;br /&gt;
← passes entire session control block by reference&lt;br /&gt;
← primesgen reads methods to determine its path&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r99-stop-session&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.3 Paragraph: r99-stop-session ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &#039;stop&#039; TO ui-methods&lt;br /&gt;
CALL &amp;amp;quot;primesui&amp;amp;quot; USING primes-ui&lt;br /&gt;
← primesui flushes print buffer and closes primes.prt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesgen-step-by-step-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. primesgen — Step-by-Step Logic ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Role:&#039;&#039;&#039; Implements both the sieve algorithm (generate) and the cursor read-loop (report). Receives control via &amp;lt;code&amp;gt;primes-session&amp;lt;/code&amp;gt; linkage; uses &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt; locally.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division-main-inline-logic-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PROCEDURE DIVISION (main inline logic) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Step 1  EVALUATE TRUE on methods (from primes-session)&lt;br /&gt;
&lt;br /&gt;
          WHEN report-primes&lt;br /&gt;
            PERFORM r90-start-primes-report&lt;br /&gt;
            IF session-method-ok THEN&lt;br /&gt;
              PERFORM r86-report-primes UNTIL session-method-eof&lt;br /&gt;
&lt;br /&gt;
          WHEN generate-primes&lt;br /&gt;
            PERFORM r91-start-primes-generation&lt;br /&gt;
            IF session-method-ok THEN&lt;br /&gt;
              PERFORM r80-test-number UNTIL test-number = 999999999&lt;br /&gt;
&lt;br /&gt;
          WHEN OTHER&lt;br /&gt;
            SET program-name = &amp;amp;quot;primesgen&amp;amp;quot;, program-paragraph = &amp;amp;quot;main&amp;amp;quot;&lt;br /&gt;
            LOG &amp;amp;quot;Bad method, primes process failed.&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
Step 2  PERFORM r99-close-primes&lt;br /&gt;
&lt;br /&gt;
Step 3  EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r90-start-primes-report&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.1 Paragraph: r90-start-primes-report ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CALL primes &amp;amp;quot;connect&amp;amp;quot;&lt;br /&gt;
IF dal-method-ok THEN LOG &amp;amp;quot;DB init succeeded.&amp;amp;quot; ELSE LOG &amp;amp;quot;DB init failed.&amp;amp;quot; + session-result=1&lt;br /&gt;
&lt;br /&gt;
CALL primes &amp;amp;quot;cursor&amp;amp;quot;&lt;br /&gt;
  → START TRANSACTION&lt;br /&gt;
  → OPEN primescursor (SELECT * FROM primes)&lt;br /&gt;
IF dal-method-ok THEN LOG &amp;amp;quot;Cursor init succeeded.&amp;amp;quot; ELSE LOG &amp;amp;quot;Cursor init failed.&amp;amp;quot; + session-result=1&lt;br /&gt;
&lt;br /&gt;
IF dal-method-ok THEN PERFORM r94-fetch (fetch first row)&lt;br /&gt;
&lt;br /&gt;
IF dal-method-ok THEN&lt;br /&gt;
  LOG &amp;amp;quot;Fetch first row ok.&amp;amp;quot; + dal-result=0&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Fetch first row nok.&amp;amp;quot; + dal-result=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r91-start-primes-generation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.2 Paragraph: r91-start-primes-generation ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CALL primes &amp;amp;quot;connect&amp;amp;quot;&lt;br /&gt;
IF dal-method-ok THEN&lt;br /&gt;
  test-divider   = 2&lt;br /&gt;
  old-ident      = 1&lt;br /&gt;
  test-number    = 3&lt;br /&gt;
  test-number-sqr = COMPUTE test-number ** 0.5   (= SQRT(3) ≈ 1.732)&lt;br /&gt;
  LOG &amp;amp;quot;DB init succeeded.&amp;amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;DB init failed.&amp;amp;quot;&lt;br /&gt;
  session-result = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r80-test-number-sieve-main-loop-body&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.3 Paragraph: r80-test-number &#039;&#039;(sieve main loop body)&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;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&lt;br /&gt;
    → test-number is divisible; it is composite&lt;br /&gt;
    PERFORM r82-next-test-number&lt;br /&gt;
&lt;br /&gt;
  WHEN test-divider &amp;amp;gt; test-number-sqr&lt;br /&gt;
    → no factor ≤ √test-number found; test-number IS PRIME&lt;br /&gt;
    PERFORM r85-write-prime&lt;br /&gt;
    PERFORM r82-next-test-number&lt;br /&gt;
&lt;br /&gt;
  WHEN OTHER&lt;br /&gt;
    → keep trying; get next trial divisor from DB&lt;br /&gt;
    PERFORM r89-get-next-divider&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r82-next-test-number&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.4 Paragraph: r82-next-test-number ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ADD 2 TO test-number                          ← advance to next odd integer&lt;br /&gt;
COMPUTE test-number-sqr = test-number ** 0.5  ← recompute √&lt;br /&gt;
MOVE 1 TO old-ident                           ← reset divider index to first prime&lt;br /&gt;
PERFORM r89-get-next-divider                  ← load test-divider = prime[2]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r85-write-prime&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.5 Paragraph: r85-write-prime ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &#039;write&#039; TO ui-methods&lt;br /&gt;
CALL &amp;amp;quot;primes&amp;amp;quot;   USING primes-dal    ← INSERT INTO primes (prime) VALUES (prime-number)&lt;br /&gt;
CALL &amp;amp;quot;primesui&amp;amp;quot; USING primes-ui     ← add to print buffer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r86-report-primes-report-loop-body&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.6 Paragraph: r86-report-primes &#039;&#039;(report loop body)&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &#039;write&#039;     TO ui-methods&lt;br /&gt;
MOVE primes-data TO u-primes        ← copy sequence + value into UI block&lt;br /&gt;
CALL &amp;amp;quot;primesui&amp;amp;quot; USING primes-ui     ← accumulate into 6-column print buffer&lt;br /&gt;
PERFORM r94-fetch                   ← advance cursor&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r89-get-next-divider&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.7 Paragraph: r89-get-next-divider ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &#039;get&#039; TO gen-methods           ← note: uses local &amp;amp;quot;primes&amp;amp;quot; group, not primes-dal&lt;br /&gt;
CALL &amp;amp;quot;primes&amp;amp;quot; USING primes          ← DAL selects prime WHERE ident = old-ident+1&lt;br /&gt;
                                      sets test-divider&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r94-fetch&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.8 Paragraph: r94-fetch ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &#039;next-prime&#039; TO dal-methods&lt;br /&gt;
CALL &amp;amp;quot;primes&amp;amp;quot; USING primes-dal      ← FETCH primescursor INTO primes-row&lt;br /&gt;
IF dal-method-ok THEN&lt;br /&gt;
  next sentence&lt;br /&gt;
ELSE&lt;br /&gt;
  LOG &amp;amp;quot;Fetch failed.&amp;amp;quot;&lt;br /&gt;
  session-result = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r99-close-primes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.9 Paragraph: r99-close-primes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &#039;disconnect&#039; TO dal-methods&lt;br /&gt;
CALL &amp;amp;quot;primes&amp;amp;quot; USING primes          ← note: passes local &amp;amp;quot;primes&amp;amp;quot; group, not primes-dal&lt;br /&gt;
IF dal-method-ok THEN LOG &amp;amp;quot;DB close succeeded.&amp;amp;quot;&lt;br /&gt;
ELSE LOG &amp;amp;quot;DB close failed.&amp;amp;quot; + session-result=1&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-step-by-step-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. primes (DAL) — Step-by-Step Logic ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Role:&#039;&#039;&#039; Data access layer. All SQL is here. Receives control via &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt; linkage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PROCEDURE DIVISION ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EVALUATE TRUE on dal-methods&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           → dal-result = 1&lt;br /&gt;
EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-s00-connect&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Paragraph: s00-connect ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &#039;CONNECT&#039; TO CUR-STEP&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&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 program.&amp;amp;quot;&lt;br /&gt;
  dal-result = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-s01-cursor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 Paragraph: s01-cursor ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;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 LOG &amp;amp;quot;Start transaction nok.&amp;amp;quot; + 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 LOG &amp;amp;quot;Start primescursor nok.&amp;amp;quot; + dal-result = 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-s02-fetch-called-by-r80-get-next-prime&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.3 Paragraph: s02-fetch &#039;&#039;(called by r80-get-next-prime)&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;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&lt;br /&gt;
  LOG &amp;amp;quot;Fetch row nok.&amp;amp;quot;&lt;br /&gt;
  dal-result = 1&lt;br /&gt;
  LOG from program-name / program-paragraph context&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r81-get-next-divider&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.4 Paragraph: r81-get-next-divider ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;new-ident = old-ident + 1&lt;br /&gt;
&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;
&lt;br /&gt;
IF SQLCODE = 0 THEN next sentence&lt;br /&gt;
ELSE DISPLAY SQLCODE + &amp;amp;quot;select new-divider nok&amp;amp;quot; on console&lt;br /&gt;
&lt;br /&gt;
MOVE new-ident TO old-ident&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r83-write-prime&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.5 Paragraph: r83-write-prime ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EXEC SQL AT primes&lt;br /&gt;
  INSERT INTO primes (prime) VALUES (:prime)&lt;br /&gt;
END-EXEC&lt;br /&gt;
&lt;br /&gt;
IF SQLCODE = 0 THEN next sentence&lt;br /&gt;
ELSE&lt;br /&gt;
  DISPLAY SQLCODE on console&lt;br /&gt;
  DISPLAY &amp;amp;quot;primes.cbl insert next prime nok: &amp;amp;quot; prime-number on console&lt;br /&gt;
&lt;br /&gt;
*** EXEC SQL AT primes COMMIT END-EXEC   ← COMMENTED OUT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-s99-disconnect&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.6 Paragraph: s99-disconnect ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &#039;DISCONNECT&#039; TO CUR-STEP&lt;br /&gt;
EXEC SQL CONNECT RESET primes END-EXEC&lt;br /&gt;
IF SQLCODE = 0 THEN&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 program.&amp;amp;quot;&lt;br /&gt;
  dal-result = 1&lt;br /&gt;
DISPLAY &amp;amp;quot;s99 disconnect from database&amp;amp;quot; on console&lt;br /&gt;
DISPLAY SQLCODE on console&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;primesui-step-by-step-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. primesui — Step-by-Step Logic ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Role:&#039;&#039;&#039; All output. Manages the &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; print file and writes to the system console.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PROCEDURE DIVISION ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;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 stop-ui     → PERFORM r99-stop-primesui&lt;br /&gt;
  WHEN message-ui  → PERFORM r98-message-ui&lt;br /&gt;
  WHEN OTHER       → ui-method-result = 1&lt;br /&gt;
EXIT PROGRAM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r90-start-primesui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.1 Paragraph: r90-start-primesui ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE &#039;start-primesui&#039; TO program-paragraph&lt;br /&gt;
MOVE &#039;start-printer&#039;  TO program-message&lt;br /&gt;
&lt;br /&gt;
OPEN OUTPUT fprinter   (primes.prt)&lt;br /&gt;
&lt;br /&gt;
IF primes-prt-status = &#039;00&#039; THEN&lt;br /&gt;
  ui-method-result = 0&lt;br /&gt;
  SET primes-idx TO 1       ← initialise table column index&lt;br /&gt;
  LOG &amp;amp;quot;Open printer Ok&amp;amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  ui-method-result = 1&lt;br /&gt;
  DISPLAY primes-prt-status on console&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r92-write-primesui-called-for-every-prime-row&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.2 Paragraph: r92-write-primesui &#039;&#039;(called for every prime row)&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;t-ident(primes-idx) = u-sequence   ← load sequence into current cell&lt;br /&gt;
t-prime(primes-idx) = u-number     ← load prime value into current cell&lt;br /&gt;
SET primes-idx UP BY 1             ← advance to next cell&lt;br /&gt;
&lt;br /&gt;
IF new-page (print-new-page = 1) THEN&lt;br /&gt;
  PERFORM r93-new-page             ← write heading + column header&lt;br /&gt;
&lt;br /&gt;
IF primes-idx = 7 THEN             ← 6 entries filled (index is post-increment)&lt;br /&gt;
  MOVE primes-table TO print-buffer&lt;br /&gt;
  WRITE file-buffer FROM print-buffer   ← write the 132-char data line&lt;br /&gt;
  SET primes-idx TO 1&lt;br /&gt;
&lt;br /&gt;
IF linage-counter = 53 THEN        ← within 3 lines of page end&lt;br /&gt;
  PERFORM r94-eop&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r93-new-page&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.3 Paragraph: r93-new-page ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE primes-heading TO print-buffer&lt;br /&gt;
WRITE file-buffer FROM print-buffer   ← &amp;amp;quot;primes overview&amp;amp;quot;&lt;br /&gt;
MOVE table-header  TO print-buffer&lt;br /&gt;
WRITE file-buffer FROM print-buffer   ← &amp;amp;quot;Sequence  Prime &amp;amp;quot; × 6&lt;br /&gt;
MOVE ZERO TO print-new-page           ← clear new-page flag&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r94-eop-end-of-page&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.4 Paragraph: r94-eop &#039;&#039;(end-of-page)&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE page-number    TO f-page-number&lt;br /&gt;
MOVE &#039; &#039;            TO print-buffer&lt;br /&gt;
WRITE file-buffer FROM print-buffer   ← blank separator line&lt;br /&gt;
MOVE primes-footing TO print-buffer&lt;br /&gt;
WRITE file-buffer FROM print-buffer   ← &amp;amp;quot;                    page: NNN&amp;amp;quot;&lt;br /&gt;
ADD 1 TO page-number&lt;br /&gt;
MOVE 1 TO print-new-page              ← trigger new heading on next write&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r98-message-ui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.5 Paragraph: r98-message-ui ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DISPLAY process-message UPON scherm   ← writes program-name + paragraph + message to console&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-r99-stop-primesui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.6 Paragraph: r99-stop-primesui ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MOVE 0 TO u-sequence&lt;br /&gt;
MOVE 0 TO u-number&lt;br /&gt;
PERFORM r92-write-primesui UNTIL new-page   ← pad remaining cells to trigger line flush&lt;br /&gt;
&lt;br /&gt;
MOVE &#039;stop-primesui&#039; TO program-paragraph&lt;br /&gt;
MOVE &#039;close printer&#039; TO program-message&lt;br /&gt;
PERFORM r98-message-ui&lt;br /&gt;
&lt;br /&gt;
CLOSE fprinter&lt;br /&gt;
&lt;br /&gt;
MOVE primes-prt-status TO ui-method-result&lt;br /&gt;
IF primes-prt-status = &#039;00&#039; THEN next sentence&lt;br /&gt;
ELSE DISPLAY primes-prt-status on console&amp;lt;/pre&amp;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>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Flow_diagrams&amp;diff=4769</id>
		<title>Flow diagrams</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Flow_diagrams&amp;diff=4769"/>
		<updated>2026-03-25T16:46:51Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;flow-diagrams&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Flow Diagrams =  &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;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Notation:&amp;#039;&amp;#039;&amp;#039; Mermaid flowchart / sequence diagrams   -----  &amp;lt;span id=&amp;quot;system-level-call-graph&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. System-Level Call Graph ==  &amp;lt;pre class=&amp;quot;mermaid&amp;quot;&amp;gt;graph TD     OS([OS / shell]) --&amp;amp;gt;|command-line arg| MAIN[primesmain]     MAIN --&amp;amp;gt;|CALL primesui start| UI[primesui]     MA...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;flow-diagrams&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Flow Diagrams =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project:&#039;&#039;&#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#039; 2026-03-17&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Notation:&#039;&#039;&#039; Mermaid flowchart / sequence diagrams&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-level-call-graph&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. System-Level Call Graph ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mermaid&amp;quot;&amp;gt;graph TD&lt;br /&gt;
    OS([OS / shell]) --&amp;amp;gt;|command-line arg| MAIN[primesmain]&lt;br /&gt;
    MAIN --&amp;amp;gt;|CALL primesui start| UI[primesui]&lt;br /&gt;
    MAIN --&amp;amp;gt;|CALL primesgen primes-session| GEN[primesgen]&lt;br /&gt;
    GEN --&amp;amp;gt;|CALL primes primes-dal| DAL[primes DAL]&lt;br /&gt;
    GEN --&amp;amp;gt;|CALL primesui primes-ui| UI&lt;br /&gt;
    DAL --&amp;amp;gt;|CALL primesui primes-ui| UI&lt;br /&gt;
    DAL &amp;amp;lt;--&amp;amp;gt;|EXEC SQL via GixSQL| DB[(PostgreSQL\nprimes.primes)]&lt;br /&gt;
    UI --&amp;amp;gt;|WRITE records| PRT([primes.prt])&lt;br /&gt;
    UI --&amp;amp;gt;|DISPLAY| CON([console / scherm])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;main-program-flow-primesmain&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Main Program Flow — primesmain ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mermaid&amp;quot;&amp;gt;flowchart TD&lt;br /&gt;
    START([Start]) --&amp;amp;gt; ACCEPT[ACCEPT commandline-args\nfrom COMMAND-LINE]&lt;br /&gt;
    ACCEPT --&amp;amp;gt; MOVEMETHODS[MOVE commandline-args TO methods\nMOVE &#039;primesmain&#039; TO program-name]&lt;br /&gt;
    MOVEMETHODS --&amp;amp;gt; STARTSESS[PERFORM r90-start-session\nCALL primesui start]&lt;br /&gt;
    STARTSESS --&amp;amp;gt; UIOK{ui-method-ok?}&lt;br /&gt;
    UIOK --&amp;amp;gt;|No| EMERGENCY[DISPLAY emergency message\non console\nSTOP RUN]&lt;br /&gt;
    UIOK --&amp;amp;gt;|Yes| LOGUI[LOG &#039;UI initialisation succeeded.&#039;\nLOG commandline-args]&lt;br /&gt;
    LOGUI --&amp;amp;gt; EVAL{EVALUATE commandline-args}&lt;br /&gt;
    EVAL --&amp;amp;gt;|report| LOGRPT[LOG &#039;Primes report generation starts.&#039;\nSET methods = &#039;report&#039;]&lt;br /&gt;
    LOGRPT --&amp;amp;gt; CALLGEN[PERFORM r92-generate-primes\nCALL primesgen USING primes-session]&lt;br /&gt;
    EVAL --&amp;amp;gt;|generate| LOGGEN[LOG &#039;Primes generation starts.&#039;\nSET methods = &#039;generate&#039;]&lt;br /&gt;
    LOGGEN --&amp;amp;gt; COMMENTED[&amp;amp;quot;⚠ PERFORM r92-generate-primes\n[commented out in source]&amp;amp;quot;]&lt;br /&gt;
    EVAL --&amp;amp;gt;|other| LOGBAD[LOG &#039;Bad parameter&#039;\nCALL primesui stop]&lt;br /&gt;
    LOGBAD --&amp;amp;gt; STOPBAD([STOP RUN])&lt;br /&gt;
    CALLGEN --&amp;amp;gt; LOGDONE[LOG &#039;Primes run complete.&#039;]&lt;br /&gt;
    COMMENTED --&amp;amp;gt; LOGDONE&lt;br /&gt;
    LOGDONE --&amp;amp;gt; STOPSESS[PERFORM r99-stop-session\nCALL primesui stop]&lt;br /&gt;
    STOPSESS --&amp;amp;gt; STOP([STOP RUN])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;generate-flow-primesgen-generate-path&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Generate Flow — primesgen (generate path) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mermaid&amp;quot;&amp;gt;flowchart TD&lt;br /&gt;
    ENTRY([Entry: methods = &#039;generate&#039;]) --&amp;amp;gt; CONNECT[CALL primes &#039;connect&#039;\nEXEC SQL CONNECT]&lt;br /&gt;
    CONNECT --&amp;amp;gt; CONNOK{dal-method-ok?}&lt;br /&gt;
    CONNOK --&amp;amp;gt;|No| SETFAIL1[LOG &#039;Database init failed.&#039;\nSET session-result = 1]&lt;br /&gt;
    SETFAIL1 --&amp;amp;gt; CLOSE&lt;br /&gt;
    CONNOK --&amp;amp;gt;|Yes| INIT[test-number = 3\ntest-divider = 2\nold-ident = 1\ntest-number-sqr = SQRT 3]&lt;br /&gt;
    INIT --&amp;amp;gt; LOGCONN[LOG &#039;Database init succeeded.&#039;]&lt;br /&gt;
    LOGCONN --&amp;amp;gt; LOOP{test-number\n= 999999999?}&lt;br /&gt;
    LOOP --&amp;amp;gt;|Yes| CLOSE&lt;br /&gt;
    LOOP --&amp;amp;gt;|No| DIVIDE[DIVIDE test-number\nBY test-divider\nGIVING test-quot\nREMAINDER test-rest]&lt;br /&gt;
    DIVIDE --&amp;amp;gt; CASE{EVALUATE}&lt;br /&gt;
    CASE --&amp;amp;gt;|test-rest = 0\ncomposite| NEXTN[r82-next-test-number:\nADD 2 TO test-number\nSQRT recalc\nold-ident = 1\nFETCH first divider]&lt;br /&gt;
    NEXTN --&amp;amp;gt; LOOP&lt;br /&gt;
    CASE --&amp;amp;gt;|test-divider &amp;amp;gt; SQRT\nprime confirmed| WRITE[r85-write-prime:\nCALL primes &#039;write&#039; INSERT\nCALL primesui &#039;write&#039;]&lt;br /&gt;
    WRITE --&amp;amp;gt; NEXTN2[r82-next-test-number]&lt;br /&gt;
    NEXTN2 --&amp;amp;gt; LOOP&lt;br /&gt;
    CASE --&amp;amp;gt;|otherwise\ntry next divisor| NEXTDIV[r89-get-next-divider:\nCALL primes &#039;next-divider&#039;\nSELECT prime WHERE ident=new-ident]&lt;br /&gt;
    NEXTDIV --&amp;amp;gt; LOOP&lt;br /&gt;
    CLOSE([PERFORM r99-close-primes\nCALL primes &#039;disconnect&#039;\nEXIT PROGRAM])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;report-flow-primesgen-report-path&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Report Flow — primesgen (report path) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mermaid&amp;quot;&amp;gt;flowchart TD&lt;br /&gt;
    ENTRY([Entry: methods = &#039;report&#039;]) --&amp;amp;gt; CONNECT[CALL primes &#039;connect&#039;]&lt;br /&gt;
    CONNECT --&amp;amp;gt; CONNOK{dal-method-ok?}&lt;br /&gt;
    CONNOK --&amp;amp;gt;|No| FAIL1[LOG &#039;Database init failed.&#039;\nsession-result = 1\nGO TO CLOSE]&lt;br /&gt;
    CONNOK --&amp;amp;gt;|Yes| CURSOR[CALL primes &#039;cursor&#039;\nSTART TRANSACTION\nOPEN primescursor]&lt;br /&gt;
    CURSOR --&amp;amp;gt; CURROK{dal-method-ok?}&lt;br /&gt;
    CURROK --&amp;amp;gt;|No| FAIL2[LOG &#039;Cursor init failed.&#039;\nsession-result = 1\nGO TO CLOSE]&lt;br /&gt;
    CURROK --&amp;amp;gt;|Yes| FETCH1[r94-fetch:\nCALL primes &#039;next-prime&#039;\nFETCH primescursor]&lt;br /&gt;
    FETCH1 --&amp;amp;gt; FETCHOK{dal-method-ok?}&lt;br /&gt;
    FETCHOK --&amp;amp;gt;|No| LOGFAIL[LOG &#039;Fetch first row nok.&#039;\ndal-result = 1]&lt;br /&gt;
    LOGFAIL --&amp;amp;gt; CLOSE&lt;br /&gt;
    FETCHOK --&amp;amp;gt;|Yes| LOGOK[LOG &#039;Fetch first row ok.&#039;\ndal-result = 0]&lt;br /&gt;
    LOGOK --&amp;amp;gt; RPTLOOP{session-method-eof?}&lt;br /&gt;
    RPTLOOP --&amp;amp;gt;|Yes| CLOSE&lt;br /&gt;
    RPTLOOP --&amp;amp;gt;|No| UIWRITE[r86-report-primes:\nMOVE primes-data TO u-primes\nCALL primesui &#039;write&#039;]&lt;br /&gt;
    UIWRITE --&amp;amp;gt; FETCHN[r94-fetch:\nCALL primes &#039;next-prime&#039;]&lt;br /&gt;
    FETCHN --&amp;amp;gt; RPTLOOP&lt;br /&gt;
    CLOSE([PERFORM r99-close-primes\nCALL primes &#039;disconnect&#039;\nEXIT PROGRAM])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dal-dispatch-primes.cbl&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. DAL Dispatch — primes.cbl ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mermaid&amp;quot;&amp;gt;flowchart TD&lt;br /&gt;
    ENTRY([ENTRY primes-dal]) --&amp;amp;gt; EVAL{dal-methods}&lt;br /&gt;
    EVAL --&amp;amp;gt;|connect| S00[s00-connect:\nEXEC SQL CONNECT TO datasrc\nAS primes USER dbusr USING dbpwd]&lt;br /&gt;
    EVAL --&amp;amp;gt;|cursor| S01[s01-cursor:\nEXEC SQL START TRANSACTION\nEXEC SQL OPEN primescursor]&lt;br /&gt;
    EVAL --&amp;amp;gt;|next-prime| R80[r80-get-next-prime → s02-fetch:\nEXEC SQL FETCH primescursor\nINTO primes-row]&lt;br /&gt;
    EVAL --&amp;amp;gt;|next-divider| R81[r81-get-next-divider:\nnew-ident = old-ident + 1\nEXEC SQL SELECT prime\nWHERE ident = new-ident]&lt;br /&gt;
    EVAL --&amp;amp;gt;|write| R83[r83-write-prime:\nEXEC SQL INSERT INTO primes\nVALUES prime-number]&lt;br /&gt;
    EVAL --&amp;amp;gt;|disconnect| S99[s99-disconnect:\nEXEC SQL CONNECT RESET primes]&lt;br /&gt;
    EVAL --&amp;amp;gt;|other| ERR[dal-result = 1]&lt;br /&gt;
    S00 --&amp;amp;gt; SQLCK1{SQLCODE = 0?}&lt;br /&gt;
    SQLCK1 --&amp;amp;gt;|Yes| OK1[dal-result = 0]&lt;br /&gt;
    SQLCK1 --&amp;amp;gt;|No| NOK1[LOG error\ndal-result = 1]&lt;br /&gt;
    S01 --&amp;amp;gt; SQLCK2{SQLCODE = 0?}&lt;br /&gt;
    SQLCK2 --&amp;amp;gt;|Yes| OPEN[OPEN primescursor]&lt;br /&gt;
    SQLCK2 --&amp;amp;gt;|No| NOK2[dal-result = 1]&lt;br /&gt;
    R80 --&amp;amp;gt; SQLCK3{SQLCODE = 0?}&lt;br /&gt;
    SQLCK3 --&amp;amp;gt;|Yes| MOVROW[primes-sequence = r-ident\nprime-number = r-prime\ndal-result = 0]&lt;br /&gt;
    SQLCK3 --&amp;amp;gt;|No| NOK3[LOG error\ndal-result = 1]&lt;br /&gt;
    OK1 &amp;amp;amp; MOVROW &amp;amp;amp; NOK1 &amp;amp;amp; NOK2 &amp;amp;amp; NOK3 &amp;amp;amp; OK1 &amp;amp;amp; R81 &amp;amp;amp; R83 &amp;amp;amp; S99 &amp;amp;amp; ERR --&amp;amp;gt; EXIT([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;ui-dispatch-primesui.cbl&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. UI Dispatch — primesui.cbl ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mermaid&amp;quot;&amp;gt;flowchart TD&lt;br /&gt;
    ENTRY([ENTRY primes-ui]) --&amp;amp;gt; EVAL{ui-methods}&lt;br /&gt;
    EVAL --&amp;amp;gt;|start| R90[r90-start-primesui:\nOPEN OUTPUT fprinter\ncheck file-status]&lt;br /&gt;
    EVAL --&amp;amp;gt;|write| R92[r92-write-primesui:\nload t-ident / t-prime into cell\nprimes-idx + 1]&lt;br /&gt;
    EVAL --&amp;amp;gt;|log-message| R98[r98-message-ui:\nDISPLAY process-message\nUPON scherm]&lt;br /&gt;
    EVAL --&amp;amp;gt;|stop| R99[r99-stop-primesui:\nflush partial line\nCLOSE fprinter]&lt;br /&gt;
    EVAL --&amp;amp;gt;|other| ERR[ui-method-result = 1]&lt;br /&gt;
    R90 --&amp;amp;gt; STATCK{file-status = &#039;00&#039;?}&lt;br /&gt;
    STATCK --&amp;amp;gt;|Yes| OPENOK[ui-method-result = 0\nprimes-idx = 1]&lt;br /&gt;
    STATCK --&amp;amp;gt;|No| OPENNOK[ui-method-result = 1\nDISPLAY status on console]&lt;br /&gt;
    R92 --&amp;amp;gt; NEWPG{new-page?}&lt;br /&gt;
    NEWPG --&amp;amp;gt;|Yes| R93[r93-new-page:\nwrite heading + column header\nprint-new-page = 0]&lt;br /&gt;
    NEWPG --&amp;amp;gt;|No| IDX7{primes-idx = 7?}&lt;br /&gt;
    R93 --&amp;amp;gt; IDX7&lt;br /&gt;
    IDX7 --&amp;amp;gt;|Yes| WRITELN[WRITE print line\nprimes-idx = 1]&lt;br /&gt;
    IDX7 --&amp;amp;gt;|No| LINCNT{linage-counter = 53?}&lt;br /&gt;
    WRITELN --&amp;amp;gt; LINCNT&lt;br /&gt;
    LINCNT --&amp;amp;gt;|Yes| R94[r94-eop:\nwrite footing\npage-number + 1\nprint-new-page = 1]&lt;br /&gt;
    LINCNT --&amp;amp;gt;|No| UIEXIT&lt;br /&gt;
    R94 --&amp;amp;gt; UIEXIT&lt;br /&gt;
    R99 --&amp;amp;gt; FLUSH[PERFORM r92-write-primesui\nUNTIL new-page\nwriting zero rows]&lt;br /&gt;
    FLUSH --&amp;amp;gt; CLSFIL[CLOSE fprinter]&lt;br /&gt;
    CLSFIL --&amp;amp;gt; UIEXIT&lt;br /&gt;
    OPENOK &amp;amp;amp; OPENNOK &amp;amp;amp; R98 &amp;amp;amp; ERR &amp;amp;amp; CLSFIL --&amp;amp;gt; UIEXIT([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;sequence-diagram-full-report-run&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Sequence Diagram — Full Report Run ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;mermaid&amp;quot;&amp;gt;sequenceDiagram&lt;br /&gt;
    participant Shell&lt;br /&gt;
    participant MAIN as primesmain&lt;br /&gt;
    participant GEN as primesgen&lt;br /&gt;
    participant DAL as primes (DAL)&lt;br /&gt;
    participant UI as primesui&lt;br /&gt;
    participant DB as PostgreSQL&lt;br /&gt;
    participant PRT as primes.prt&lt;br /&gt;
&lt;br /&gt;
    Shell-&amp;amp;gt;&amp;amp;gt;MAIN: execute &amp;amp;quot;report&amp;amp;quot;&lt;br /&gt;
    MAIN-&amp;amp;gt;&amp;amp;gt;UI: ui-methods=&amp;amp;quot;start&amp;amp;quot;&lt;br /&gt;
    UI-&amp;amp;gt;&amp;amp;gt;PRT: OPEN OUTPUT&lt;br /&gt;
    PRT--&amp;amp;gt;&amp;amp;gt;UI: file-status &amp;amp;quot;00&amp;amp;quot;&lt;br /&gt;
    UI--&amp;amp;gt;&amp;amp;gt;MAIN: ui-method-result=0&lt;br /&gt;
    MAIN-&amp;amp;gt;&amp;amp;gt;UI: ui-methods=&amp;amp;quot;log-message&amp;amp;quot; &amp;amp;quot;UI init OK&amp;amp;quot;&lt;br /&gt;
    UI-&amp;amp;gt;&amp;amp;gt;Shell: DISPLAY on console&lt;br /&gt;
&lt;br /&gt;
    MAIN-&amp;amp;gt;&amp;amp;gt;GEN: CALL primesgen methods=&amp;amp;quot;report&amp;amp;quot;&lt;br /&gt;
    GEN-&amp;amp;gt;&amp;amp;gt;DAL: dal-methods=&amp;amp;quot;connect&amp;amp;quot;&lt;br /&gt;
    DAL-&amp;amp;gt;&amp;amp;gt;DB: EXEC SQL CONNECT&lt;br /&gt;
    DB--&amp;amp;gt;&amp;amp;gt;DAL: SQLCODE=0&lt;br /&gt;
    DAL--&amp;amp;gt;&amp;amp;gt;GEN: dal-result=0&lt;br /&gt;
    GEN-&amp;amp;gt;&amp;amp;gt;UI: ui-methods=&amp;amp;quot;log-message&amp;amp;quot; &amp;amp;quot;DB init OK&amp;amp;quot;&lt;br /&gt;
&lt;br /&gt;
    GEN-&amp;amp;gt;&amp;amp;gt;DAL: dal-methods=&amp;amp;quot;cursor&amp;amp;quot;&lt;br /&gt;
    DAL-&amp;amp;gt;&amp;amp;gt;DB: START TRANSACTION&lt;br /&gt;
    DAL-&amp;amp;gt;&amp;amp;gt;DB: OPEN primescursor&lt;br /&gt;
    DB--&amp;amp;gt;&amp;amp;gt;DAL: SQLCODE=0&lt;br /&gt;
    DAL--&amp;amp;gt;&amp;amp;gt;GEN: dal-result=0&lt;br /&gt;
&lt;br /&gt;
    GEN-&amp;amp;gt;&amp;amp;gt;DAL: dal-methods=&amp;amp;quot;next-prime&amp;amp;quot; (first fetch)&lt;br /&gt;
    DAL-&amp;amp;gt;&amp;amp;gt;DB: FETCH primescursor&lt;br /&gt;
    DB--&amp;amp;gt;&amp;amp;gt;DAL: row (ident, prime)&lt;br /&gt;
    DAL--&amp;amp;gt;&amp;amp;gt;GEN: primes-sequence, prime-number&lt;br /&gt;
&lt;br /&gt;
    loop for each row until EOF&lt;br /&gt;
        GEN-&amp;amp;gt;&amp;amp;gt;UI: ui-methods=&amp;amp;quot;write&amp;amp;quot; u-sequence, u-number&lt;br /&gt;
        UI-&amp;amp;gt;&amp;amp;gt;PRT: accumulate / WRITE line (every 6 entries)&lt;br /&gt;
        GEN-&amp;amp;gt;&amp;amp;gt;DAL: dal-methods=&amp;amp;quot;next-prime&amp;amp;quot;&lt;br /&gt;
        DAL-&amp;amp;gt;&amp;amp;gt;DB: FETCH primescursor&lt;br /&gt;
        DB--&amp;amp;gt;&amp;amp;gt;DAL: row or EOF&lt;br /&gt;
        DAL--&amp;amp;gt;&amp;amp;gt;GEN: dal-result (0 or 1)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    GEN-&amp;amp;gt;&amp;amp;gt;DAL: dal-methods=&amp;amp;quot;disconnect&amp;amp;quot;&lt;br /&gt;
    DAL-&amp;amp;gt;&amp;amp;gt;DB: CONNECT RESET primes&lt;br /&gt;
    DB--&amp;amp;gt;&amp;amp;gt;DAL: SQLCODE=0&lt;br /&gt;
    DAL--&amp;amp;gt;&amp;amp;gt;GEN: dal-result=0&lt;br /&gt;
    GEN--&amp;amp;gt;&amp;amp;gt;MAIN: EXIT PROGRAM&lt;br /&gt;
&lt;br /&gt;
    MAIN-&amp;amp;gt;&amp;amp;gt;UI: ui-methods=&amp;amp;quot;log-message&amp;amp;quot; &amp;amp;quot;Run complete&amp;amp;quot;&lt;br /&gt;
    MAIN-&amp;amp;gt;&amp;amp;gt;UI: ui-methods=&amp;amp;quot;stop&amp;amp;quot;&lt;br /&gt;
    UI-&amp;amp;gt;&amp;amp;gt;PRT: flush + CLOSE&lt;br /&gt;
    PRT--&amp;amp;gt;&amp;amp;gt;UI: file-status &amp;amp;quot;00&amp;amp;quot;&lt;br /&gt;
    UI--&amp;amp;gt;&amp;amp;gt;MAIN: ui-method-result=0&lt;br /&gt;
    MAIN-&amp;amp;gt;&amp;amp;gt;Shell: STOP RUN&amp;lt;/pre&amp;gt;&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>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Data_dictionary&amp;diff=4768</id>
		<title>Data dictionary</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Data_dictionary&amp;diff=4768"/>
		<updated>2026-03-25T16:46:04Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;data-dictionary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Data Dictionary =  &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;conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. Conventions ==  {| ! Column ! Meaning |- | Name | COBOL data-name as written in source |- | Level | 01 / 03 / 05 / 07 hierarchy level |- | Picture | COBOL PICTURE clause |- | Usage | DISPLAY (default) / COMP-3 / COMP-5 |- | Source | Copybook or...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;data-dictionary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Data Dictionary =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project:&#039;&#039;&#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#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;conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Conventions ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Column&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| Name&lt;br /&gt;
| COBOL data-name as written in source&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| 01 / 03 / 05 / 07 hierarchy level&lt;br /&gt;
|-&lt;br /&gt;
| Picture&lt;br /&gt;
| COBOL PICTURE clause&lt;br /&gt;
|-&lt;br /&gt;
| Usage&lt;br /&gt;
| DISPLAY (default) / COMP-3 / COMP-5&lt;br /&gt;
|-&lt;br /&gt;
| Source&lt;br /&gt;
| Copybook or program where defined&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Semantic meaning and valid values&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Condition-names (88-level) are listed under the field they qualify.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-primes-session.cpy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Copybook: primes-session.cpy ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Control block for the session (main → business-logic) tier.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Name&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Picture&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Usage&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-session&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Root of session control block; passed as linkage to primesgen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;methods&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| X(32)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Operation verb set by primesmain before calling primesgen&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;report-primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “report” — run the report path&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;generate-primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “generate” — run the sieve path&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;start-primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “start” — (reserved, not used in current flow)&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;stop-primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “stop” — (reserved, not used in current flow)&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;invalid-method&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “bad” — sentinel for bad dispatch&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session-result&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(2)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Result code written back by primesgen; initial value ZERO&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;session-method-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 0 — operation succeeded&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;session-method-nok&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 1 — operation failed&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;session-method-eof&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 9 — cursor exhausted (end of data)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-primes-dal.cpy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Copybook: primes-dal.cpy ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Control block for the DAL (business-logic → data-access) tier.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Name&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Picture&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Usage&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Root of DAL control block; passed as linkage to primes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dal-methods&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| X(32)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Operation verb set by caller&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;next-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “next-prime” — fetch next row from cursor&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;next-divider&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “next-divider” — select divider by ident&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;write-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “write” — insert prime into table&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;db-cursor&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “cursor” — start transaction and open cursor&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;db-connect&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “connect” — connect to PostgreSQL&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;db-disconnect&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “disconnect” — disconnect from PostgreSQL&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;invalid-method&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “bad” — sentinel for bad dispatch&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-data&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| One-row data payload&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-sequence&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Sequence / ident of the current prime row&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;prime-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Value of the current prime&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dal-result&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(2)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Result code written back by primes; initial value ZERO&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;dal-method-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 0 — operation succeeded&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;dal-method-nok&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 1 — operation failed&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;dal-method-eof&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 99 — cursor exhausted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-primes-ui.cpy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Copybook: primes-ui.cpy ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Control block for the UI tier; included by all four programs.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Name&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Picture&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Usage&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Root of UI control block; passed as linkage to primesui&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ui-methods&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| X(32)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Operation verb set by caller&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;write-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “write” — add one prime row to print buffer&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;message-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “log-message” — display console message&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;start-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “start” — open print file&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;stop-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “stop” — flush and close print file&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;process-message&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Structured console log record&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;program-name&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| X(20)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Name of the calling program (for log messages)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;program-line&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Group: paragraph name + message text&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;program-paragraph&amp;lt;/code&amp;gt;&lt;br /&gt;
| 07&lt;br /&gt;
| X(20)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Name of the calling paragraph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;program-message&amp;lt;/code&amp;gt;&lt;br /&gt;
| 07&lt;br /&gt;
| X(92)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Human-readable status or error message&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;u-primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| One prime row for the print writer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;u-sequence&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Prime sequence number (ident) to print&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;u-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Prime value to print&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ui-method-result&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(2)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Result code from primesui; initial value ZERO&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;ui-method-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 0 — operation succeeded&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;ui-method-nok&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 1 — operation failed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-primes-table.cpy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Copybook: primes-table.cpy ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SQL host variable — character (DISPLAY) format.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Name&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Picture&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Usage&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-table&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Host variable group for SQL bind/into&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| S9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Row identity (sequence number), signed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| S9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Prime value, signed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-primes_table.cpy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Copybook: primes_table.cpy ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SQL host variable — packed-decimal (COMP-3) format. Alternate version of primes-table.cpy.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Name&lt;br /&gt;
! Level&lt;br /&gt;
! Picture&lt;br /&gt;
! Usage&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_table&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Host variable group for SQL bind/into&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| S9(9)&lt;br /&gt;
| COMP-3&lt;br /&gt;
| Row identity, packed decimal&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| S9(9)&lt;br /&gt;
| COMP-3&lt;br /&gt;
| Prime value, packed decimal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-sqlca.cpy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Copybook: SQLCA.cpy ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GixSQL SQL Communications Area — standard across all embedded-SQL programs.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Name&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Picture&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Usage&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLCA&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| SQL communications area&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLCAID&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| X(8)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| SQLCA identifier string&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLCABC&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| S9(9)&lt;br /&gt;
| COMP-5&lt;br /&gt;
| Byte length of SQLCA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLCODE&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| S9(9)&lt;br /&gt;
| COMP-5&lt;br /&gt;
| SQL return code: 0 = success, negative = error, +100 = not found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLERRM&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Error message group&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLERRML&amp;lt;/code&amp;gt;&lt;br /&gt;
| 49&lt;br /&gt;
| S9(4)&lt;br /&gt;
| COMP-5&lt;br /&gt;
| Length of error message text&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLERRMC&amp;lt;/code&amp;gt;&lt;br /&gt;
| 49&lt;br /&gt;
| X(70)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Error message text&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLERRP&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| X(8)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Error program (not used)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLERRD&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| S9(9) OCCURS 6&lt;br /&gt;
| COMP-5&lt;br /&gt;
| Diagnostic codes; SQLERRD(3) = rows processed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLWARN&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Warning flags group (not used)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLWARN0&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;SQLWARN7&amp;lt;/code&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| X(1)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Individual warning flags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLSTATE&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| X(5)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| ANSI SQL state code&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;program-primesmain-working-storage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 8. Program: primesmain — Working Storage ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Name&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Picture&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Usage&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Source&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;filler&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(32) VALUE “Start WS primesmain”&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| primesmain.cbl&lt;br /&gt;
| Debug marker to locate WS in memory dump&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;commandline-args&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(32)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| primesmain.cbl&lt;br /&gt;
| Command-line argument accepted from OS&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;execute-generate&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| primesmain.cbl&lt;br /&gt;
| VALUE “generate”&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;execute-report&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| primesmain.cbl&lt;br /&gt;
| VALUE “report”&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-session&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| (group)&lt;br /&gt;
| —&lt;br /&gt;
| COPY&lt;br /&gt;
| See §2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| (group)&lt;br /&gt;
| —&lt;br /&gt;
| COPY&lt;br /&gt;
| See §4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;program-primesgen-working-storage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 9. Program: primesgen — Working Storage ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Name&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Picture&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Usage&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;filler&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(32) VALUE “Start WS primesgen”&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Debug WS marker&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;file-buffer&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(132)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| FD record area for fprinter (declared but file not opened in primesgen)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;printer&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Print control group (unused in primesgen; print handled by primesui)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;print-buffer&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| X(132)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Line buffer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;line-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 99 VALUE 99&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Current line counter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;page-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(4) VALUE ZERO&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Current page counter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;test-quot&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Quotient from DIVIDE in sieve loop&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Local sieve control group (mirrors primes-dal structure)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;gen-methods&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| X(32)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Method verb for internal DAL calls&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;query-process&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “query”&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;start-process&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “start”&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;next-divider&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “get”&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;write-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “put”&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;stop-process&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE “stop”&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-result&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(2) VALUE ZERO&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Result of sieve DAL call&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;init-primes-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 1&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;first-divider-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 2&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;next-divider-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;test-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Current candidate being tested for primality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;test-number-sqr&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(9)V9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Square root of test-number (decimal)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;test-divider&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Current trial divisor fetched from DB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;test-rest&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(9)V9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Remainder from DIVIDE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;old-test-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Previous test-number (diagnostic / unused)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;old-ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| ident of the last divider fetched; incremented before next fetch&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;new-ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| old-ident + 1; used as key in SELECT to get next divider&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| (group)&lt;br /&gt;
| —&lt;br /&gt;
| COPY — see §4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| (group)&lt;br /&gt;
| —&lt;br /&gt;
| COPY — see §3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linkage section:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Name&lt;br /&gt;
! Source&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-session&amp;lt;/code&amp;gt;&lt;br /&gt;
| COPY primes-session&lt;br /&gt;
| Passed in by primesmain&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;program-primes-dal-working-storage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 10. Program: primes (DAL) — Working Storage ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Name&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Picture&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Usage&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;filler&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(32) VALUE “Start WS primes”&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Debug WS marker&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATASRC&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(64) VALUE “pgsql://localhost:5432/primes&amp;amp;amp;default_schema=primes”&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| GixSQL connection string&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DBUSR&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(64) VALUE “primes_user”&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Database user name&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DBPWD&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(64) VALUE “pr1mes_user”&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Database password (plain-text)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CUR-STEP&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(16)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Diagnostic: current SQL step (“CONNECT” / “DISCONNECT”)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-row&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| FETCH target for cursor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r-ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(9)&lt;br /&gt;
| COMP-3&lt;br /&gt;
| Fetched ident value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(9)&lt;br /&gt;
| COMP-3&lt;br /&gt;
| Fetched prime value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;prime-count&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| (Unused in current flow)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;prime_seq&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| (Unused in current flow)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;divider&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| 9(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| (Unused in current flow)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Local copy of sieve control (mirrors primes-dal; used for internal paragraphs)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SQLCA&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| COPY SQLCA — see §7&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-table&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| EXEC SQL INCLUDE primes-table — see §5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| COPY primes-ui — see §4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linkage section:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Name&lt;br /&gt;
! Source&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-dal&amp;lt;/code&amp;gt;&lt;br /&gt;
| COPY primes-dal&lt;br /&gt;
| Passed in by primesgen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;program-primesui-working-storage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 11. Program: primesui — Working Storage ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Name&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Picture&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Usage&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;filler&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(32) VALUE “start ws primesui”&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Debug WS marker&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-table&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| 6-column print accumulator (OCCURS 6)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-cel&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| OCCURS 6 INDEXED primes-idx&lt;br /&gt;
| —&lt;br /&gt;
| One cell per prime entry on a print line&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;t-ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| Z(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Sequence number, zero-suppressed&lt;br /&gt;
|-&lt;br /&gt;
| filler&lt;br /&gt;
| 05&lt;br /&gt;
| X(2)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Column separator spaces&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;t-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| 05&lt;br /&gt;
| Z(9)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Prime value, zero-suppressed&lt;br /&gt;
|-&lt;br /&gt;
| filler&lt;br /&gt;
| 05&lt;br /&gt;
| X(2)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Column separator spaces&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;table-header&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Heading row (OCCURS 6) — “Sequence Prime” × 6&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;printer&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Print control group&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;print-buffer&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| X(132)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Current line being built&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-prt-status&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| X(2)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| File-status code for fprinter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;page-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(4) VALUE 1&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Current page number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;print-new-page&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9 VALUE 1&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Flag: 1 = new page needed&lt;br /&gt;
|-&lt;br /&gt;
| — &amp;lt;code&amp;gt;new-page&amp;lt;/code&amp;gt;&lt;br /&gt;
| 88&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| VALUE 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-heading&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| X(118) VALUE “primes overview”&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Page heading text&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-footing&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| Page footing group&lt;br /&gt;
|-&lt;br /&gt;
| filler&lt;br /&gt;
| 03&lt;br /&gt;
| X(118) VALUE SPACE&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Left padding&lt;br /&gt;
|-&lt;br /&gt;
| filler&lt;br /&gt;
| 03&lt;br /&gt;
| X(6) VALUE “page:”&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Label&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;f-page-number&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| Z(3)9 VALUE 1&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| Formatted page number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-line&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| (Declared but not used in current flow)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-total&amp;lt;/code&amp;gt;&lt;br /&gt;
| 01&lt;br /&gt;
| —&lt;br /&gt;
| —&lt;br /&gt;
| (Declared but not used in current flow)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-count&amp;lt;/code&amp;gt;&lt;br /&gt;
| 03&lt;br /&gt;
| 9(8)&lt;br /&gt;
| DISPLAY&lt;br /&gt;
| (Declared but not used in current flow)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linkage section:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Name&lt;br /&gt;
! Source&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes-ui&amp;lt;/code&amp;gt;&lt;br /&gt;
| COPY primes-ui&lt;br /&gt;
| Passed in by all callers&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;database-objects&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 12. Database Objects ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Object&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Type&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Schema&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Definition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| Schema&lt;br /&gt;
| —&lt;br /&gt;
| primes_user&lt;br /&gt;
| Container schema&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;asc_ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| Sequence&lt;br /&gt;
| primes&lt;br /&gt;
| primes_user&lt;br /&gt;
| INTEGER, START 1, INCREMENT 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| Table&lt;br /&gt;
| primes&lt;br /&gt;
| primes_user&lt;br /&gt;
| See below&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;primescursor&amp;lt;/code&amp;gt;&lt;br /&gt;
| Cursor&lt;br /&gt;
| runtime&lt;br /&gt;
| —&lt;br /&gt;
| DECLARE … CURSOR FOR SELECT * FROM primes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;table-primes.primes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Table: primes.primes ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Column&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Type&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Nullable&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Default&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| INTEGER&lt;br /&gt;
| YES&lt;br /&gt;
| nextval(‘primes.asc_ident’)&lt;br /&gt;
| Auto-assigned insertion sequence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;prime&amp;lt;/code&amp;gt;&lt;br /&gt;
| INTEGER&lt;br /&gt;
| YES&lt;br /&gt;
| —&lt;br /&gt;
| Prime number value&lt;br /&gt;
|}&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>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Technical_specifications&amp;diff=4767</id>
		<title>Technical specifications</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Technical_specifications&amp;diff=4767"/>
		<updated>2026-03-25T16:44:47Z</updated>

		<summary type="html">&lt;p&gt;Martin: 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;hr /&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;
&#039;&#039;&#039;Project:&#039;&#039;&#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#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>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Business_requirements&amp;diff=4766</id>
		<title>Business requirements</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Business_requirements&amp;diff=4766"/>
		<updated>2026-03-25T16:43:26Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;business-requirements-document&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Business Requirements Document =  &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;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Baseline   -----  &amp;lt;span id=&amp;quot;purpose&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. Purpose ==  The system generates prime numbers and stores them in a relational database, and provides a printed report of all stored primes. It demonstrates a three-tier COBOL application ar...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;business-requirements-document&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Business Requirements Document =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project:&#039;&#039;&#039; pgcobol — Prime Numbers Application&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 (reverse-engineered)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#039; 2026-03-17&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Baseline&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&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. Purpose ==&lt;br /&gt;
&lt;br /&gt;
The system generates prime numbers and stores them in a relational database, and provides a printed report of all stored primes. It demonstrates a three-tier COBOL application architecture running on Linux against a PostgreSQL database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;stakeholders&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Stakeholders ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Role&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Concern&lt;br /&gt;
|-&lt;br /&gt;
| Developer / operator&lt;br /&gt;
| Runs generation and reporting jobs from the command line&lt;br /&gt;
|-&lt;br /&gt;
| Database administrator&lt;br /&gt;
| Manages schema, credentials, and data retention&lt;br /&gt;
|-&lt;br /&gt;
| End user&lt;br /&gt;
| Receives the printed prime-number report&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;business-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Business Requirements ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-01-prime-number-generation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-01 — Prime Number Generation ===&lt;br /&gt;
&lt;br /&gt;
The system shall compute all prime numbers from 3 up to 999,999,999 using a trial-division algorithm and store each confirmed prime in the database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Acceptance criteria:&#039;&#039;&#039; - Every integer stored in the primes table is a prime number. - No prime in the range 3–999,999,999 is omitted. - The sequence column records insertion order via an auto-incrementing identity.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-02-prime-number-reporting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-02 — Prime Number Reporting ===&lt;br /&gt;
&lt;br /&gt;
The system shall produce a formatted printed report listing all primes currently stored in the database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Acceptance criteria:&#039;&#039;&#039; - Every row in the primes table appears in the report. - Rows are presented in database-cursor order (insertion order by ident). - The report is paginated with headings, column headers, and page numbers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-03-operational-modes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-03 — Operational Modes ===&lt;br /&gt;
&lt;br /&gt;
The system shall support two mutually exclusive operational modes selectable at invocation:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Mode&lt;br /&gt;
! Argument&lt;br /&gt;
! Effect&lt;br /&gt;
|-&lt;br /&gt;
| Generate&lt;br /&gt;
| &amp;lt;code&amp;gt;generate&amp;lt;/code&amp;gt;&lt;br /&gt;
| Compute primes and persist to DB&lt;br /&gt;
|-&lt;br /&gt;
| Report&lt;br /&gt;
| &amp;lt;code&amp;gt;report&amp;lt;/code&amp;gt;&lt;br /&gt;
| Read DB and produce print file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Any argument other than &amp;lt;code&amp;gt;generate&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;report&amp;lt;/code&amp;gt; shall cause the program to log an error and terminate without processing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-04-audit-trail-console-logging&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-04 — Audit Trail / Console Logging ===&lt;br /&gt;
&lt;br /&gt;
All significant processing events (session start/stop, database connection, cursor open, fetch errors, write confirmation) shall be written to the system console in real time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-05-data-persistence&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-05 — Data Persistence ===&lt;br /&gt;
&lt;br /&gt;
Prime numbers shall be stored persistently in a PostgreSQL database so that the report can be produced independently of and after the generation run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;br-06-report-format&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BR-06 — Report Format ===&lt;br /&gt;
&lt;br /&gt;
The printed report shall: - Carry a page heading (“primes overview”) and a column header row on every page. - Present six prime entries per print line (sequence number + prime value). - Carry a page-number footing at the bottom of each page. - Be written to a line-sequential file (&amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;) with 132-character records.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;constraints&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Constraints ==&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;| Constraint&lt;br /&gt;
|-&lt;br /&gt;
| C-01&lt;br /&gt;
| Target runtime is GnuCOBOL 4.0 on Linux.&lt;br /&gt;
|-&lt;br /&gt;
| C-02&lt;br /&gt;
| Database is PostgreSQL 11; connection is localhost only.&lt;br /&gt;
|-&lt;br /&gt;
| C-03&lt;br /&gt;
| Database credentials are currently hard-coded in the DAL program.&lt;br /&gt;
|-&lt;br /&gt;
| C-04&lt;br /&gt;
| The upper bound of generation is fixed at 999,999,999.&lt;br /&gt;
|-&lt;br /&gt;
| C-05&lt;br /&gt;
| The print file is fixed at 132 columns, 56 lines per page.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;out-of-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Out of Scope ==&lt;br /&gt;
&lt;br /&gt;
* Interactive (screen) input or output.&lt;br /&gt;
* Concurrent multi-user access.&lt;br /&gt;
* Prime generation restart / checkpoint recovery.&lt;br /&gt;
* Authentication or credential management.&lt;br /&gt;
* Scheduling or job-control integration.&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>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=COBOL_Std_1_Purpose_and_Scope&amp;diff=4765</id>
		<title>COBOL Std 1 Purpose and Scope</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=COBOL_Std_1_Purpose_and_Scope&amp;diff=4765"/>
		<updated>2026-03-25T16:42:14Z</updated>

		<summary type="html">&lt;p&gt;Martin: Undo revision 4764 by Martin (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1. Purpose and Scope ==&lt;br /&gt;
&lt;br /&gt;
This document defines the baseline coding standard for COBOL programs targeting GnuCOBOL 4.x on Linux, with optional GixSQL pre-processing for embedded PostgreSQL access. It applies to all newly written programs, to programs undergoing significant modification, and to reverse-engineering or migration work.&lt;br /&gt;
&lt;br /&gt;
The standard covers four concerns:&lt;br /&gt;
&lt;br /&gt;
* Source-code layout and formatting&lt;br /&gt;
* Naming conventions for data items, paragraphs, copybooks, and files&lt;br /&gt;
* Structural and architectural patterns (divisions, tiers, method-dispatch)&lt;br /&gt;
* Error handling, embedded SQL, and output formatting rules&lt;br /&gt;
&lt;br /&gt;
{{Ambox&lt;br /&gt;
name  = COBOL Std 1 Purpose and Scope{{subst:void|Don&#039;t change anything on this line. It will change itself when you save.}}&lt;br /&gt;
subst = &amp;lt;includeonly&amp;gt;{{subst:substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
type  = notice&lt;br /&gt;
text  = &#039;&#039;&#039;Compliance note&#039;&#039;&#039; — Existing programs may deviate from this standard. Any modification touching more than 20 % of a program&#039;s statements must bring the changed portions into conformance.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
[[Cobol programming standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=COBOL_Std_1_Purpose_and_Scope&amp;diff=4764</id>
		<title>COBOL Std 1 Purpose and Scope</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=COBOL_Std_1_Purpose_and_Scope&amp;diff=4764"/>
		<updated>2026-03-25T16:41:41Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1. Purpose and Scope ==&lt;br /&gt;
&lt;br /&gt;
This document defines the baseline coding standard for COBOL programs targeting GnuCOBOL 4.x on Linux, with optional GixSQL pre-processing for embedded PostgreSQL access. It applies to all newly written programs, to programs undergoing significant modification, and to reverse-engineering or migration work.&lt;br /&gt;
&lt;br /&gt;
The standard covers four concerns:&lt;br /&gt;
&lt;br /&gt;
* Source-code layout and formatting&lt;br /&gt;
* Naming conventions for data items, paragraphs, copybooks, and files&lt;br /&gt;
* Structural and architectural patterns (divisions, tiers, method-dispatch)&lt;br /&gt;
* Error handling, embedded SQL, and output formatting rules&lt;br /&gt;
&lt;br /&gt;
{{Ambox&lt;br /&gt;
name  = COBOL Std 1 Purpose and Scope{{subst:void|Don&#039;t change anything on this line. It will change itself when you save.}}&lt;br /&gt;
subst = &amp;lt;includeonly&amp;gt;{{subst:substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
type  = notice&lt;br /&gt;
text  = &#039;&#039;&#039;Compliance note&#039;&#039;&#039; — Existing programs may deviate from this standard. Any modification touching more than 20 % of a program&#039;s statements must bring the changed portions into conformance.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
[[Primes programs specifications]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Primes_programs_specifications&amp;diff=4763</id>
		<title>Primes programs specifications</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Primes_programs_specifications&amp;diff=4763"/>
		<updated>2026-03-25T16:38:35Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The Cobol Primes program =&lt;br /&gt;
This is a reverse generated program specification.&lt;br /&gt;
# [[Business requirements]]&lt;br /&gt;
# [[Technical specifications]]&lt;br /&gt;
# [[Data dictionary]]&lt;br /&gt;
# [[Flow diagrams]]&lt;br /&gt;
# [[Program Logic]]&lt;br /&gt;
# [[Business rules]]&lt;br /&gt;
# [[IO behaviour]]&lt;br /&gt;
# [[Control flow]]&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Cobol_and_PostgreSQL&amp;diff=4762</id>
		<title>Cobol and PostgreSQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Cobol_and_PostgreSQL&amp;diff=4762"/>
		<updated>2026-03-25T16:31:45Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This chapter contains&lt;br /&gt;
* The description of a complete working example of a &#039;&#039;&#039;Cobol&#039;&#039;&#039; &#039;&#039;&#039;PostgreSQL&#039;&#039;&#039; program of the sample employee database, that comes with GixSQL&lt;br /&gt;
* The three tier object oriented &amp;lt;b&amp;gt;primes&amp;lt;/b&amp;gt; program, using a PostgreSQL database.&lt;br /&gt;
GixSQL is the Open Source way in which Cobol programs are able to use modern database management systems in a Linux environment.&lt;br /&gt;
= Primes program =&lt;br /&gt;
A prime number is defined by the fact that it can only be divided by 1 and itself. The [[primes]] program is a simple program to demonstrate the implementation of a three tier object oriented Cobol program. It consists of:&lt;br /&gt;
* A main program to invoke the process&lt;br /&gt;
* A UI layer&lt;br /&gt;
* A business logic layer, that is responsible for the logic involving prime numbers&lt;br /&gt;
* Database layer, for data storage.&lt;br /&gt;
The subprograms are al invoked by means of methods, in such a way that the PostgreSQL database could easily be replaced by MariaDB.&lt;br /&gt;
== Making sense of IT ==&lt;br /&gt;
The Primes program is just a one off, written for demonstration purposes and on top of my head without design apart from a few notes on the edge of a news paper. Budget constraints put pressure on projects, time to market of features comes first, testing comes second and documentation in this day and age of program focused delivery at best comes last,&lt;br /&gt;
=== The forgotten design ===&lt;br /&gt;
Standards are lacking, because of political issues, time constraints and a too rapid pace of developments. Of course, there should have been a design, lacking standards, accidents or laziness are another cause of missing, insufficient or outdated documentation. It can go as bad as programs running in production of which nobody has a clue of what they are doing exactly, the only certainty is that things go wrong whenever the program goes wrong.&amp;lt;/br&amp;gt;&lt;br /&gt;
I wrote the non nonsensical primes programs set on top of my head as an example three tier oriented system system, just to demonstrate the working of such a system. The challenge was to have some documentation at least, which is in line with the running joke in so many organisations: &#039;The program source is the best and most reliable source of information&#039;. This is true under the condition that the program source is available, which is not always the case. There are loads of programs running in production today of which no one has a clue of what the program is doing, but everybody knows the program has to run to avoid problems. I did not go to the extend of re-engineering cobol source from the running executable (yet).&lt;br /&gt;
Thanks to [https://claude.ai Claude.ai]there is at least some documentation now.&lt;br /&gt;
* The primes system design [[Primes system Design]].&lt;br /&gt;
* Design standards [[Design standards]].&lt;br /&gt;
=== The forgotten documentation ===&lt;br /&gt;
On top of of the design and program specifications documents we require design standards and programming standards. The [[Cobol programming standards]] below have been generated in my hown grown ailab.&lt;br /&gt;
* The primes program specification [[Primes programs specifications]].&lt;br /&gt;
* One page [[Primes Software Specification]]&lt;br /&gt;
* Cobol programming standards [[Cobol programming standards]].&lt;br /&gt;
= Employee program =&lt;br /&gt;
The setup of the lab environment, source code and a simple compilation workflow are below.&lt;br /&gt;
* Program name: pgcobol&lt;br /&gt;
* Source code: pgcobol.cbl&lt;br /&gt;
* Intermediate preprocessed source code file: pgcobol.cbsql&lt;br /&gt;
* Cobol compiler output: pgcobol.out&lt;br /&gt;
* Database: Employee, with table emptable&lt;br /&gt;
* pgcobol print output file: pgcobol.prt&lt;br /&gt;
== Cobol ==&lt;br /&gt;
Cobol has been around for more than 60 years and will stay around for the foreseeable future, estimates are that there are about 800 billion lines of Business Cobol code around. The programs are heavily used, servicing about 80% of all financial and business transactions world wide.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
The reason behind this endurance lies in the fact that Cobol is a standardised language, a program written in 1974 can be compiled today with a modern compiler. The resulting executable program still runs today, without the need of adaptation. This very fact is of high value to enterprises, their investments are safe and well protected on the long term.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Traditionally Cobol programs have their application in big business mainframe environments. These large enterprises, however, are shifting more and more of their applications to the Linux platform. The broad adoption of Linux in the enterprise environment started around 2010. So, it is no wonder that Cobol gradually is being made available for the Linux platform, enter [https://gnucobol.sourceforge.io/ GNUCobol].&lt;br /&gt;
=== GNUCobol ===&lt;br /&gt;
Is an Open Source Cobol compiler, the project originally started in 2002 [https://en.wikipedia.org/wiki/GnuCOBOL GNUCobol] as OpenCobol. GNUCobol now is a full blown Cobol compiler.&lt;br /&gt;
&lt;br /&gt;
== GixSQL links PostgreSQL and Cobol ==&lt;br /&gt;
PostgreSQL is getting more and more traction around the world, also in the big enterprises. Big enterprises have ample reason to stick to their Cobol program stack, in which they invested huge amounts of money. So if PostgreSQL is to make it to the business applications of the big enterprises, it has to find a way to interact in a reliable manner with Cobol. Enter the [https://github.com/mridoni/gixsql GixSQL] SQL preprocessor for Cobol.&lt;br /&gt;
=== An SQL statement in Cobol ===&lt;br /&gt;
This is the way the SQL code is embedded in the Cobol program:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
           EXEC SQL&lt;br /&gt;
              CONNECT TO :DATASRC AS cobol_sql USER :DBUSR USING :DBPWD&lt;br /&gt;
           END-EXEC.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The example shows the program making a connection to the database with the variables DATASRC, DBUSR and DBPWD.&lt;br /&gt;
&lt;br /&gt;
= Practical introduction to GixSQL =&lt;br /&gt;
This chapter provides guidance to set up a working GixSQL for GNUCobol with PostgreSQL development environment.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* Debian 12&lt;br /&gt;
* GnuCobol4&lt;br /&gt;
* libmariadb-dev libmariadb-dev-compat libpq5 unixodbc libfmt9&lt;br /&gt;
* GixSQL, find the link below&lt;br /&gt;
* optionally the PostgreSQL database server on the same machine.&lt;br /&gt;
GixSQL is available here: [https://github.com/mridoni/gixsql/releases/download/v1.0.21dev/gixsql-debian-12-x64-1.0.21dev-1.deb GixSQL].&lt;br /&gt;
Just install the software in the sequence as described above and the system is ready to go.&amp;lt;br /&amp;gt;&lt;br /&gt;
For reasons of convenience add the follow lines to /etx/profile:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LD_DIRECTORY_PATH=&amp;quot;/usr/local/src/gix/gixisql/runtime/libgixsql:/usr/local/src/gix/gixsql/common:/usr/local/src/gix/gixsql/common&amp;quot;&lt;br /&gt;
export LD_DIRECTORY_PATH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
Once the editing of the program is finished, the program has to be compiled. This is done in various steps, but this can also be done by using the Python script below. &amp;lt;br /&amp;gt;&lt;br /&gt;
The steps are:&lt;br /&gt;
# The precompile process&lt;br /&gt;
# Inspect (but do not edit the output)&lt;br /&gt;
# The compilation process&lt;br /&gt;
# Inspect the compilation listing&lt;br /&gt;
# Run the program&lt;br /&gt;
== Simple Workflow script ==&lt;br /&gt;
The python script [[gixc.py]] implements the GixSQL Cobol compilation workflow. It is invoked with a single parameter, being the program_name suffixed by either &#039;cbl or &#039;cob&#039;. People that like to get their hands dirty follow the two steps below.&lt;br /&gt;
=== gixsql precompilation ===&lt;br /&gt;
The command invoking the precompile process is as follows:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/bin/gixsql pgcobol.cbl pgcobol.cbsql -S -I . -e &amp;quot;.,*.cpy,*.CPY&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The input file is pgcobol.cbl, the preprocessing output file is [[pgcobol.cbsql]]. It is very important to leave the cbsql file as is, because meddling with the file easily leads to errors in the next step of the workflow.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
The result of the precompile step of the SQL stement above looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GIXSQL*    EXEC SQL&lt;br /&gt;
GIXSQL*       CONNECT TO :DATASRC AS cobol_sql USER :DBUSR USING :DBPWD&lt;br /&gt;
GIXSQL*    END-EXEC.&lt;br /&gt;
GIXSQL     CALL STATIC &amp;quot;GIXSQLConnect&amp;quot; USING&lt;br /&gt;
GIXSQL         BY REFERENCE SQLCA&lt;br /&gt;
GIXSQL         BY REFERENCE DATASRC&lt;br /&gt;
GIXSQL         BY VALUE 64&lt;br /&gt;
GIXSQL         BY REFERENCE &amp;quot;cobol_sql&amp;quot; &amp;amp; x&amp;quot;00&amp;quot;&lt;br /&gt;
GIXSQL         BY VALUE 0&lt;br /&gt;
GIXSQL         BY REFERENCE x&amp;quot;00&amp;quot;&lt;br /&gt;
GIXSQL         BY VALUE 0&lt;br /&gt;
GIXSQL         BY REFERENCE DBUSR&lt;br /&gt;
GIXSQL         BY VALUE 64&lt;br /&gt;
GIXSQL         BY REFERENCE DBPWD&lt;br /&gt;
GIXSQL         BY VALUE 64&lt;br /&gt;
GIXSQL     END-CALL.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The precompile program translated the SQL statement in to a standardised Cobol call.&lt;br /&gt;
&lt;br /&gt;
=== The cobc GNUCobol compilation ===&lt;br /&gt;
The command invoking the precompile process is as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/bin/cobc -x pgcobol.cbsql -l:libgixsql.so -T pgcobol.out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This results in the executable program file &#039;&#039;&#039;pgcobol&#039;&#039;&#039; and the compilation listing [[pgcobol.out]].&lt;br /&gt;
&lt;br /&gt;
== Sample Program ==&lt;br /&gt;
The sample program [[pgcobol.cbl]] makes use of the sample database: employee. When executed pgcobol puts out the file [[pgcobol.prt]].&amp;lt;br /&amp;gt;&lt;br /&gt;
The pgcobol program file is available for download here: [https://wiki.webhuis.nl/images/pgcobol.cbl pgcobol.cbl ].&lt;br /&gt;
&lt;br /&gt;
== Sample database ==&lt;br /&gt;
The [[employee database]] is a very simple database, with one table containing three lines. The pg_dump file is in the link.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Back to: [[voorpagina]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Primes_programs_specifications&amp;diff=4761</id>
		<title>Primes programs specifications</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Primes_programs_specifications&amp;diff=4761"/>
		<updated>2026-03-25T16:18:58Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot; ```mediawiki = pgcobol Prime Numbers Application Documentation =  This documentation provides a comprehensive overview of the prime numbers application developed using GnuCOBOL on Linux with PostgreSQL as the database backend. Below you will find links to various sections of the documentation.  == Quick Links == * Technology Stack * Component Architecture * Business Requirements (BR) * Database Objects * [[Output File Specification]...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
```mediawiki&lt;br /&gt;
= pgcobol Prime Numbers Application Documentation =&lt;br /&gt;
&lt;br /&gt;
This documentation provides a comprehensive overview of the prime numbers application developed using GnuCOBOL on Linux with PostgreSQL as the database backend. Below you will find links to various sections of the documentation.&lt;br /&gt;
&lt;br /&gt;
== Quick Links ==&lt;br /&gt;
* [[Technology Stack]]&lt;br /&gt;
* [[Component Architecture]]&lt;br /&gt;
* [[Business Requirements|Business Requirements (BR)]]&lt;br /&gt;
* [[Database Objects]]&lt;br /&gt;
* [[Output File Specification]]&lt;br /&gt;
&lt;br /&gt;
== Technology Stack ==&lt;br /&gt;
The application utilizes the following technologies:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Component !! Technology&lt;br /&gt;
|-&lt;br /&gt;
| Runtime !! GnuCOBOL 4.0, Linux&lt;br /&gt;
|-&lt;br /&gt;
| SQL pre-processor !! GixSQL (translates EXEC SQL … END-EXEC to GIXSQLExec calls)&lt;br /&gt;
|-&lt;br /&gt;
| Database server !! PostgreSQL 11.22, localhost:5432&lt;br /&gt;
|-&lt;br /&gt;
| Database schema !! primes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Technology Stack|More details]]&lt;br /&gt;
&lt;br /&gt;
== Component Architecture ==&lt;br /&gt;
The application consists of the following components:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;┌─────────────────────────────────────────────────────┐&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Component Architecture|More details]]&lt;br /&gt;
&lt;br /&gt;
== Business Requirements ==&lt;br /&gt;
The system is designed to meet the following business requirements:&lt;br /&gt;
&lt;br /&gt;
=== BR-01: Prime Number Generation ===&lt;br /&gt;
The system shall compute all prime numbers from 3 up to 999,999,999 using a trial-division algorithm and store each confirmed prime in the database.&lt;br /&gt;
&lt;br /&gt;
=== BR-02: Prime Number Reporting ===&lt;br /&gt;
The system shall produce a formatted printed report listing all primes currently stored in the database.&lt;br /&gt;
&lt;br /&gt;
[[Business Requirements|More details]]&lt;br /&gt;
&lt;br /&gt;
== Database Objects ==&lt;br /&gt;
The application interacts with the following database objects:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Object !! Type !! Schema !! Owner !! Definition&lt;br /&gt;
|-&lt;br /&gt;
| primes !! Schema !! — !! primes_user !! Container schema&lt;br /&gt;
|-&lt;br /&gt;
| asc_ident !! Sequence !! primes !! primes_user !! INTEGER, START 1, INCREMENT 1&lt;br /&gt;
|-&lt;br /&gt;
| primes !! Table !! primes !! primes_user !! See below&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Database Objects|More details]]&lt;br /&gt;
&lt;br /&gt;
== Output File Specification ==&lt;br /&gt;
The output report is generated in the following format:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Property !! Value&lt;br /&gt;
|-&lt;br /&gt;
| Filename !! primes.prt&lt;br /&gt;
|-&lt;br /&gt;
| Organisation !! Line-sequential&lt;br /&gt;
|-&lt;br /&gt;
| Record length !! 132 characters&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Output File Specification|More details]]&lt;br /&gt;
&lt;br /&gt;
== Constraints ==&lt;br /&gt;
The application operates under the following constraints:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Cobol_and_PostgreSQL&amp;diff=4760</id>
		<title>Cobol and PostgreSQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Cobol_and_PostgreSQL&amp;diff=4760"/>
		<updated>2026-03-25T16:15:05Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* Primes program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This chapter contains&lt;br /&gt;
* The description of a complete working example of a &#039;&#039;&#039;Cobol&#039;&#039;&#039; &#039;&#039;&#039;PostgreSQL&#039;&#039;&#039; program of the sample employee database, that comes with GixSQL&lt;br /&gt;
* The three tier object oriented &amp;lt;b&amp;gt;primes&amp;lt;/b&amp;gt; program, using a PostgreSQL database.&lt;br /&gt;
GixSQL is the Open Source way in which Cobol programs are able to use modern database management systems in a Linux environment.&lt;br /&gt;
= Primes program =&lt;br /&gt;
A prime number is defined by the fact that it can only be divided by 1 and itself. The [[primes]] program is a simple program to demonstrate the implementation of a three tier object oriented Cobol program. It consists of:&lt;br /&gt;
* A main program to invoke the process&lt;br /&gt;
* A UI layer&lt;br /&gt;
* A business logic layer, that is responsible for the logic involving prime numbers&lt;br /&gt;
* Database layer, for data storage.&lt;br /&gt;
The subprograms are al invoked by means of methods, in such a way that the PostgreSQL database could easily be replaced by MariaDB.&lt;br /&gt;
== Making sense of IT ==&lt;br /&gt;
The Primes program is just a one off, written for demonstration purposes and on top of my head without design apart from a few notes on the edge of a news paper. Budget constraints put pressure on projects, time to market of features comes first, testing comes second and documentation in this day and age of program focused delivery at best comes last,&lt;br /&gt;
=== The forgotten design ===&lt;br /&gt;
Standards are lacking, because of political issues, time constraints and a too rapid pace of developments. Of course, there should have been a design, lacking standards, accidents or laziness are another cause of missing, insufficient or outdated documentation. It can go as bad as programs running in production of which nobody has a clue of what they are doing exactly, the only certainty is that things go wrong whenever the program goes wrong.&amp;lt;/br&amp;gt;&lt;br /&gt;
I wrote the non nonsensical primes programs set on top of my head as an example three tier oriented system system, just to demonstrate the working of such a system. The challenge was to have some documentation at least, which is in line with the running joke in so many organisations: &#039;The program source is the best and most reliable source of information&#039;. This is true under the condition that the program source is available, which is not always the case. There are loads of programs running in production today of which no one has a clue of what the program is doing, but everybody knows the program has to run to avoid problems. I did not go to the extend of re-engineering cobol source from the running executable (yet).&lt;br /&gt;
Thanks to [https://claude.ai Claude.ai]there is at least some documentation now.&lt;br /&gt;
* The primes system design [[Primes system Design]].&lt;br /&gt;
* Design standards [[Design standards]].&lt;br /&gt;
=== The forgotten documentation ===&lt;br /&gt;
On top of of the design and program specifications documents we require design standards and programming standards. The [[Cobol programming standards]] below have been generated in my hown grown ailab.&lt;br /&gt;
* The primes program specification [[Primes programs specifications]].&lt;br /&gt;
* Cobol programming standards [[Cobol programming standards]].&lt;br /&gt;
&lt;br /&gt;
[[Primes Software Specification]]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Employee program =&lt;br /&gt;
The setup of the lab environment, source code and a simple compilation workflow are below.&lt;br /&gt;
* Program name: pgcobol&lt;br /&gt;
* Source code: pgcobol.cbl&lt;br /&gt;
* Intermediate preprocessed source code file: pgcobol.cbsql&lt;br /&gt;
* Cobol compiler output: pgcobol.out&lt;br /&gt;
* Database: Employee, with table emptable&lt;br /&gt;
* pgcobol print output file: pgcobol.prt&lt;br /&gt;
== Cobol ==&lt;br /&gt;
Cobol has been around for more than 60 years and will stay around for the foreseeable future, estimates are that there are about 800 billion lines of Business Cobol code around. The programs are heavily used, servicing about 80% of all financial and business transactions world wide.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
The reason behind this endurance lies in the fact that Cobol is a standardised language, a program written in 1974 can be compiled today with a modern compiler. The resulting executable program still runs today, without the need of adaptation. This very fact is of high value to enterprises, their investments are safe and well protected on the long term.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Traditionally Cobol programs have their application in big business mainframe environments. These large enterprises, however, are shifting more and more of their applications to the Linux platform. The broad adoption of Linux in the enterprise environment started around 2010. So, it is no wonder that Cobol gradually is being made available for the Linux platform, enter [https://gnucobol.sourceforge.io/ GNUCobol].&lt;br /&gt;
=== GNUCobol ===&lt;br /&gt;
Is an Open Source Cobol compiler, the project originally started in 2002 [https://en.wikipedia.org/wiki/GnuCOBOL GNUCobol] as OpenCobol. GNUCobol now is a full blown Cobol compiler.&lt;br /&gt;
&lt;br /&gt;
== GixSQL links PostgreSQL and Cobol ==&lt;br /&gt;
PostgreSQL is getting more and more traction around the world, also in the big enterprises. Big enterprises have ample reason to stick to their Cobol program stack, in which they invested huge amounts of money. So if PostgreSQL is to make it to the business applications of the big enterprises, it has to find a way to interact in a reliable manner with Cobol. Enter the [https://github.com/mridoni/gixsql GixSQL] SQL preprocessor for Cobol.&lt;br /&gt;
=== An SQL statement in Cobol ===&lt;br /&gt;
This is the way the SQL code is embedded in the Cobol program:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
           EXEC SQL&lt;br /&gt;
              CONNECT TO :DATASRC AS cobol_sql USER :DBUSR USING :DBPWD&lt;br /&gt;
           END-EXEC.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The example shows the program making a connection to the database with the variables DATASRC, DBUSR and DBPWD.&lt;br /&gt;
&lt;br /&gt;
= Practical introduction to GixSQL =&lt;br /&gt;
This chapter provides guidance to set up a working GixSQL for GNUCobol with PostgreSQL development environment.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* Debian 12&lt;br /&gt;
* GnuCobol4&lt;br /&gt;
* libmariadb-dev libmariadb-dev-compat libpq5 unixodbc libfmt9&lt;br /&gt;
* GixSQL, find the link below&lt;br /&gt;
* optionally the PostgreSQL database server on the same machine.&lt;br /&gt;
GixSQL is available here: [https://github.com/mridoni/gixsql/releases/download/v1.0.21dev/gixsql-debian-12-x64-1.0.21dev-1.deb GixSQL].&lt;br /&gt;
Just install the software in the sequence as described above and the system is ready to go.&amp;lt;br /&amp;gt;&lt;br /&gt;
For reasons of convenience add the follow lines to /etx/profile:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LD_DIRECTORY_PATH=&amp;quot;/usr/local/src/gix/gixisql/runtime/libgixsql:/usr/local/src/gix/gixsql/common:/usr/local/src/gix/gixsql/common&amp;quot;&lt;br /&gt;
export LD_DIRECTORY_PATH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
Once the editing of the program is finished, the program has to be compiled. This is done in various steps, but this can also be done by using the Python script below. &amp;lt;br /&amp;gt;&lt;br /&gt;
The steps are:&lt;br /&gt;
# The precompile process&lt;br /&gt;
# Inspect (but do not edit the output)&lt;br /&gt;
# The compilation process&lt;br /&gt;
# Inspect the compilation listing&lt;br /&gt;
# Run the program&lt;br /&gt;
== Simple Workflow script ==&lt;br /&gt;
The python script [[gixc.py]] implements the GixSQL Cobol compilation workflow. It is invoked with a single parameter, being the program_name suffixed by either &#039;cbl or &#039;cob&#039;. People that like to get their hands dirty follow the two steps below.&lt;br /&gt;
=== gixsql precompilation ===&lt;br /&gt;
The command invoking the precompile process is as follows:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/bin/gixsql pgcobol.cbl pgcobol.cbsql -S -I . -e &amp;quot;.,*.cpy,*.CPY&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The input file is pgcobol.cbl, the preprocessing output file is [[pgcobol.cbsql]]. It is very important to leave the cbsql file as is, because meddling with the file easily leads to errors in the next step of the workflow.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
The result of the precompile step of the SQL stement above looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GIXSQL*    EXEC SQL&lt;br /&gt;
GIXSQL*       CONNECT TO :DATASRC AS cobol_sql USER :DBUSR USING :DBPWD&lt;br /&gt;
GIXSQL*    END-EXEC.&lt;br /&gt;
GIXSQL     CALL STATIC &amp;quot;GIXSQLConnect&amp;quot; USING&lt;br /&gt;
GIXSQL         BY REFERENCE SQLCA&lt;br /&gt;
GIXSQL         BY REFERENCE DATASRC&lt;br /&gt;
GIXSQL         BY VALUE 64&lt;br /&gt;
GIXSQL         BY REFERENCE &amp;quot;cobol_sql&amp;quot; &amp;amp; x&amp;quot;00&amp;quot;&lt;br /&gt;
GIXSQL         BY VALUE 0&lt;br /&gt;
GIXSQL         BY REFERENCE x&amp;quot;00&amp;quot;&lt;br /&gt;
GIXSQL         BY VALUE 0&lt;br /&gt;
GIXSQL         BY REFERENCE DBUSR&lt;br /&gt;
GIXSQL         BY VALUE 64&lt;br /&gt;
GIXSQL         BY REFERENCE DBPWD&lt;br /&gt;
GIXSQL         BY VALUE 64&lt;br /&gt;
GIXSQL     END-CALL.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The precompile program translated the SQL statement in to a standardised Cobol call.&lt;br /&gt;
&lt;br /&gt;
=== The cobc GNUCobol compilation ===&lt;br /&gt;
The command invoking the precompile process is as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/bin/cobc -x pgcobol.cbsql -l:libgixsql.so -T pgcobol.out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This results in the executable program file &#039;&#039;&#039;pgcobol&#039;&#039;&#039; and the compilation listing [[pgcobol.out]].&lt;br /&gt;
&lt;br /&gt;
== Sample Program ==&lt;br /&gt;
The sample program [[pgcobol.cbl]] makes use of the sample database: employee. When executed pgcobol puts out the file [[pgcobol.prt]].&amp;lt;br /&amp;gt;&lt;br /&gt;
The pgcobol program file is available for download here: [https://wiki.webhuis.nl/images/pgcobol.cbl pgcobol.cbl ].&lt;br /&gt;
&lt;br /&gt;
== Sample database ==&lt;br /&gt;
The [[employee database]] is a very simple database, with one table containing three lines. The pg_dump file is in the link.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Back to: [[voorpagina]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Cobol_and_PostgreSQL&amp;diff=4759</id>
		<title>Cobol and PostgreSQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Cobol_and_PostgreSQL&amp;diff=4759"/>
		<updated>2026-03-25T16:14:38Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* The forgotten design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This chapter contains&lt;br /&gt;
* The description of a complete working example of a &#039;&#039;&#039;Cobol&#039;&#039;&#039; &#039;&#039;&#039;PostgreSQL&#039;&#039;&#039; program of the sample employee database, that comes with GixSQL&lt;br /&gt;
* The three tier object oriented &amp;lt;b&amp;gt;primes&amp;lt;/b&amp;gt; program, using a PostgreSQL database.&lt;br /&gt;
GixSQL is the Open Source way in which Cobol programs are able to use modern database management systems in a Linux environment.&lt;br /&gt;
= Primes program =&lt;br /&gt;
A prime number is defined by the fact that it can only be divided by 1 and itself. The [[primes]] program is a simple program to demonstrate the implementation of a three tier object oriented Cobol program. It consists of:&lt;br /&gt;
* A main program to invoke the process&lt;br /&gt;
* A UI layer&lt;br /&gt;
* A business logic layer, that is responsible for the logic involving prime numbers&lt;br /&gt;
* Database layer, for data storage.&lt;br /&gt;
The subprograms are al invoked by means of methods, in such a way that the PostgreSQL database could easily be replaced by MariaDB.&lt;br /&gt;
== Making sense of IT ==&lt;br /&gt;
The Primes program is just a one off, written for demonstration purposes and on top of my head without design apart from a few notes on the edge of a news paper. Budget constraints put pressure on projects, time to market of features comes first, testing comes second and documentation in this day and age of program focused delivery at best comes last,&lt;br /&gt;
=== The forgotten design ===&lt;br /&gt;
Standards are lacking, because of political issues, time constraints and a too rapid pace of developments. Of course, there should have been a design, lacking standards, accidents or laziness are another cause of missing, insufficient or outdated documentation. It can go as bad as programs running in production of which nobody has a clue of what they are doing exactly, the only certainty is that things go wrong whenever the program goes wrong.&amp;lt;/br&amp;gt;&lt;br /&gt;
I wrote the non nonsensical primes programs set on top of my head as an example three tier oriented system system, just to demonstrate the working of such a system. The challenge was to have some documentation at least, which is in line with the running joke in so many organisations: &#039;The program source is the best and most reliable source of information&#039;. This is true under the condition that the program source is available, which is not always the case. There are loads of programs running in production today of which no one has a clue of what the program is doing, but everybody knows the program has to run to avoid problems. I did not go to the extend of re-engineering cobol source from the running executable (yet).&lt;br /&gt;
Thanks to [https://claude.ai Claude.ai]there is at least some documentation now.&lt;br /&gt;
* The primes system design [[Primes system Design]].&lt;br /&gt;
* Design standards [[Design standards]].&lt;br /&gt;
&lt;br /&gt;
On top of of the design and program specifications documents we require design standards and programming standards. The [[Cobol programming standards]] below have been generated in my hown grown ailab.&lt;br /&gt;
* The primes program specification [[Primes programs specifications]].&lt;br /&gt;
* Cobol programming standards [[Cobol programming standards]].&lt;br /&gt;
&lt;br /&gt;
[[Primes Software Specification]]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The forgotten documentation ===&lt;br /&gt;
&lt;br /&gt;
= Employee program =&lt;br /&gt;
The setup of the lab environment, source code and a simple compilation workflow are below.&lt;br /&gt;
* Program name: pgcobol&lt;br /&gt;
* Source code: pgcobol.cbl&lt;br /&gt;
* Intermediate preprocessed source code file: pgcobol.cbsql&lt;br /&gt;
* Cobol compiler output: pgcobol.out&lt;br /&gt;
* Database: Employee, with table emptable&lt;br /&gt;
* pgcobol print output file: pgcobol.prt&lt;br /&gt;
== Cobol ==&lt;br /&gt;
Cobol has been around for more than 60 years and will stay around for the foreseeable future, estimates are that there are about 800 billion lines of Business Cobol code around. The programs are heavily used, servicing about 80% of all financial and business transactions world wide.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
The reason behind this endurance lies in the fact that Cobol is a standardised language, a program written in 1974 can be compiled today with a modern compiler. The resulting executable program still runs today, without the need of adaptation. This very fact is of high value to enterprises, their investments are safe and well protected on the long term.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Traditionally Cobol programs have their application in big business mainframe environments. These large enterprises, however, are shifting more and more of their applications to the Linux platform. The broad adoption of Linux in the enterprise environment started around 2010. So, it is no wonder that Cobol gradually is being made available for the Linux platform, enter [https://gnucobol.sourceforge.io/ GNUCobol].&lt;br /&gt;
=== GNUCobol ===&lt;br /&gt;
Is an Open Source Cobol compiler, the project originally started in 2002 [https://en.wikipedia.org/wiki/GnuCOBOL GNUCobol] as OpenCobol. GNUCobol now is a full blown Cobol compiler.&lt;br /&gt;
&lt;br /&gt;
== GixSQL links PostgreSQL and Cobol ==&lt;br /&gt;
PostgreSQL is getting more and more traction around the world, also in the big enterprises. Big enterprises have ample reason to stick to their Cobol program stack, in which they invested huge amounts of money. So if PostgreSQL is to make it to the business applications of the big enterprises, it has to find a way to interact in a reliable manner with Cobol. Enter the [https://github.com/mridoni/gixsql GixSQL] SQL preprocessor for Cobol.&lt;br /&gt;
=== An SQL statement in Cobol ===&lt;br /&gt;
This is the way the SQL code is embedded in the Cobol program:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
           EXEC SQL&lt;br /&gt;
              CONNECT TO :DATASRC AS cobol_sql USER :DBUSR USING :DBPWD&lt;br /&gt;
           END-EXEC.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The example shows the program making a connection to the database with the variables DATASRC, DBUSR and DBPWD.&lt;br /&gt;
&lt;br /&gt;
= Practical introduction to GixSQL =&lt;br /&gt;
This chapter provides guidance to set up a working GixSQL for GNUCobol with PostgreSQL development environment.&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* Debian 12&lt;br /&gt;
* GnuCobol4&lt;br /&gt;
* libmariadb-dev libmariadb-dev-compat libpq5 unixodbc libfmt9&lt;br /&gt;
* GixSQL, find the link below&lt;br /&gt;
* optionally the PostgreSQL database server on the same machine.&lt;br /&gt;
GixSQL is available here: [https://github.com/mridoni/gixsql/releases/download/v1.0.21dev/gixsql-debian-12-x64-1.0.21dev-1.deb GixSQL].&lt;br /&gt;
Just install the software in the sequence as described above and the system is ready to go.&amp;lt;br /&amp;gt;&lt;br /&gt;
For reasons of convenience add the follow lines to /etx/profile:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LD_DIRECTORY_PATH=&amp;quot;/usr/local/src/gix/gixisql/runtime/libgixsql:/usr/local/src/gix/gixsql/common:/usr/local/src/gix/gixsql/common&amp;quot;&lt;br /&gt;
export LD_DIRECTORY_PATH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Workflow ==&lt;br /&gt;
Once the editing of the program is finished, the program has to be compiled. This is done in various steps, but this can also be done by using the Python script below. &amp;lt;br /&amp;gt;&lt;br /&gt;
The steps are:&lt;br /&gt;
# The precompile process&lt;br /&gt;
# Inspect (but do not edit the output)&lt;br /&gt;
# The compilation process&lt;br /&gt;
# Inspect the compilation listing&lt;br /&gt;
# Run the program&lt;br /&gt;
== Simple Workflow script ==&lt;br /&gt;
The python script [[gixc.py]] implements the GixSQL Cobol compilation workflow. It is invoked with a single parameter, being the program_name suffixed by either &#039;cbl or &#039;cob&#039;. People that like to get their hands dirty follow the two steps below.&lt;br /&gt;
=== gixsql precompilation ===&lt;br /&gt;
The command invoking the precompile process is as follows:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/bin/gixsql pgcobol.cbl pgcobol.cbsql -S -I . -e &amp;quot;.,*.cpy,*.CPY&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The input file is pgcobol.cbl, the preprocessing output file is [[pgcobol.cbsql]]. It is very important to leave the cbsql file as is, because meddling with the file easily leads to errors in the next step of the workflow.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
The result of the precompile step of the SQL stement above looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GIXSQL*    EXEC SQL&lt;br /&gt;
GIXSQL*       CONNECT TO :DATASRC AS cobol_sql USER :DBUSR USING :DBPWD&lt;br /&gt;
GIXSQL*    END-EXEC.&lt;br /&gt;
GIXSQL     CALL STATIC &amp;quot;GIXSQLConnect&amp;quot; USING&lt;br /&gt;
GIXSQL         BY REFERENCE SQLCA&lt;br /&gt;
GIXSQL         BY REFERENCE DATASRC&lt;br /&gt;
GIXSQL         BY VALUE 64&lt;br /&gt;
GIXSQL         BY REFERENCE &amp;quot;cobol_sql&amp;quot; &amp;amp; x&amp;quot;00&amp;quot;&lt;br /&gt;
GIXSQL         BY VALUE 0&lt;br /&gt;
GIXSQL         BY REFERENCE x&amp;quot;00&amp;quot;&lt;br /&gt;
GIXSQL         BY VALUE 0&lt;br /&gt;
GIXSQL         BY REFERENCE DBUSR&lt;br /&gt;
GIXSQL         BY VALUE 64&lt;br /&gt;
GIXSQL         BY REFERENCE DBPWD&lt;br /&gt;
GIXSQL         BY VALUE 64&lt;br /&gt;
GIXSQL     END-CALL.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The precompile program translated the SQL statement in to a standardised Cobol call.&lt;br /&gt;
&lt;br /&gt;
=== The cobc GNUCobol compilation ===&lt;br /&gt;
The command invoking the precompile process is as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/bin/cobc -x pgcobol.cbsql -l:libgixsql.so -T pgcobol.out&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This results in the executable program file &#039;&#039;&#039;pgcobol&#039;&#039;&#039; and the compilation listing [[pgcobol.out]].&lt;br /&gt;
&lt;br /&gt;
== Sample Program ==&lt;br /&gt;
The sample program [[pgcobol.cbl]] makes use of the sample database: employee. When executed pgcobol puts out the file [[pgcobol.prt]].&amp;lt;br /&amp;gt;&lt;br /&gt;
The pgcobol program file is available for download here: [https://wiki.webhuis.nl/images/pgcobol.cbl pgcobol.cbl ].&lt;br /&gt;
&lt;br /&gt;
== Sample database ==&lt;br /&gt;
The [[employee database]] is a very simple database, with one table containing three lines. The pg_dump file is in the link.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Back to: [[voorpagina]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Business_Requirement_Document&amp;diff=4758</id>
		<title>Business Requirement Document</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Business_Requirement_Document&amp;diff=4758"/>
		<updated>2026-03-25T15:37:41Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;business-requirements-document&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Business Requirements Document =  {| !width=&amp;quot;23%&amp;quot;| Field !width=&amp;quot;76%&amp;quot;| Value |- | Document ID | PGCBL-BRD-001 |- | Document Type | Business Requirements Document |- | System | pgcobol — Prime Numbers Application v1.0 |- | Version | 1.0 |- | Status | Approved |- | Owner | Lead Developer |- | Author | [reverse-engineered from source artifacts] |- | Reviewers | — (pending) |- | Approved by | — (pending) |- | Created...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;business-requirements-document&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Business Requirements Document =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;76%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Document ID&lt;br /&gt;
| PGCBL-BRD-001&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Business Requirements Document&lt;br /&gt;
|-&lt;br /&gt;
| System&lt;br /&gt;
| pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
|-&lt;br /&gt;
| Version&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Approved&lt;br /&gt;
|-&lt;br /&gt;
| Owner&lt;br /&gt;
| Lead Developer&lt;br /&gt;
|-&lt;br /&gt;
| Author&lt;br /&gt;
| [reverse-engineered from source artifacts]&lt;br /&gt;
|-&lt;br /&gt;
| Reviewers&lt;br /&gt;
| — (pending)&lt;br /&gt;
|-&lt;br /&gt;
| Approved by&lt;br /&gt;
| — (pending)&lt;br /&gt;
|-&lt;br /&gt;
| Created&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Last modified&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Classification&lt;br /&gt;
| Internal&lt;br /&gt;
|-&lt;br /&gt;
| Parent document&lt;br /&gt;
| PGCBL-SAD-001 (Scope and Applicability)&lt;br /&gt;
|-&lt;br /&gt;
| Supersedes&lt;br /&gt;
| —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;version-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;11%&amp;quot;| Version&lt;br /&gt;
!width=&amp;quot;14%&amp;quot;| Date&lt;br /&gt;
!width=&amp;quot;9%&amp;quot;| Author&lt;br /&gt;
!width=&amp;quot;12%&amp;quot;| Status&lt;br /&gt;
!width=&amp;quot;51%&amp;quot;| Change Summary&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Draft&lt;br /&gt;
| Initial reverse-engineering baseline&lt;br /&gt;
|-&lt;br /&gt;
| 1.0&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Approved&lt;br /&gt;
| Baselined&lt;br /&gt;
|}&lt;br /&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-purpose-and-scope|Purpose and Scope]]&lt;br /&gt;
# [[#2-assumptions-and-dependencies|Assumptions and Dependencies]]&lt;br /&gt;
# [[#3-stakeholders|Stakeholders]]&lt;br /&gt;
# [[#4-functional-requirements|Functional Requirements]]&lt;br /&gt;
# [[#5-non-functional-requirements|Non-Functional Requirements]]&lt;br /&gt;
# [[#6-constraints|Constraints]]&lt;br /&gt;
# [[#7-out-of-scope|Out of Scope]]&lt;br /&gt;
# [[#8-related-documents|Related Documents]]&lt;br /&gt;
# [[#9-open-issues|Open Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;purpose-and-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Purpose and Scope ==&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;
This document defines what the pgcobol system must do from a business perspective. It is the primary input to all technical and design documents in the specification set. Any feature not described here is out of scope.&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;
This document covers all externally observable behaviour of pgcobol v1.0: prime-number generation, database persistence, and printed report production.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;out-of-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.3 Out of Scope ===&lt;br /&gt;
&lt;br /&gt;
* How the system achieves its requirements (that is PGCBL-TSD-001).&lt;br /&gt;
* Internal program structure and algorithm details (PGCBL-PLG-001).&lt;br /&gt;
* Non-functional quality attributes in detail (PGCBL-NFR-001).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;audience&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.4 Audience ===&lt;br /&gt;
&lt;br /&gt;
Business analysts, QA engineers, and stakeholders who need to understand what the system does without needing to read COBOL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;related-documents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1.5 Related Documents ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;27%&amp;quot;| Document ID&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Title&lt;br /&gt;
!width=&amp;quot;22%&amp;quot;| Relationship&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-SAD-001&lt;br /&gt;
| Scope and Applicability&lt;br /&gt;
| Navigation; defines document set&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-NFR-001&lt;br /&gt;
| Non-Functional Requirements&lt;br /&gt;
| Complements this BRD with quality attributes&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-TSD-001&lt;br /&gt;
| Technical Specification&lt;br /&gt;
| Implements requirements in this document&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-TTM-001&lt;br /&gt;
| Test Traceability Matrix&lt;br /&gt;
| Maps each requirement here to a test case&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-ADD-001&lt;br /&gt;
| Architecture Decision Records&lt;br /&gt;
| Documents why the design is as it is&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;assumptions-and-dependencies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Assumptions and Dependencies ==&lt;br /&gt;
&lt;br /&gt;
See PGCBL-SAD-002 for the full register. Key items:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;36%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;31%&amp;quot;| Item&lt;br /&gt;
!width=&amp;quot;31%&amp;quot;| Type&lt;br /&gt;
|-&lt;br /&gt;
| A-01&lt;br /&gt;
| Prime 2 is manually seeded in the DB before generation&lt;br /&gt;
| Assumption&lt;br /&gt;
|-&lt;br /&gt;
| A-02&lt;br /&gt;
| DB is empty at the start of a generation run&lt;br /&gt;
| Assumption&lt;br /&gt;
|-&lt;br /&gt;
| DEP-03&lt;br /&gt;
| PostgreSQL running on localhost:5432&lt;br /&gt;
| Dependency&lt;br /&gt;
|-&lt;br /&gt;
| DEP-08&lt;br /&gt;
| Prime 2 seeded before first generation&lt;br /&gt;
| Dependency&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;stakeholders&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Stakeholders ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Role&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Interest&lt;br /&gt;
|-&lt;br /&gt;
| System operator&lt;br /&gt;
| Runs generation and reporting jobs from the command line&lt;br /&gt;
|-&lt;br /&gt;
| Database administrator&lt;br /&gt;
| Owns the PostgreSQL schema; manages credentials and data&lt;br /&gt;
|-&lt;br /&gt;
| Report consumer&lt;br /&gt;
| Reads the formatted print file &amp;lt;code&amp;gt;primes.prt&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;functional-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-01-prime-generation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-01 — Prime Generation ===&lt;br /&gt;
&lt;br /&gt;
* The system shall accept a &amp;lt;code&amp;gt;generate&amp;lt;/code&amp;gt; command-line argument to trigger prime-number generation.&lt;br /&gt;
* The system shall test every odd integer from 3 upward for primality using trial division.&lt;br /&gt;
* The system shall store each confirmed prime in the database in ascending order of discovery.&lt;br /&gt;
* Generation shall continue until the candidate number reaches 999,999,999.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-02-trial-division-algorithm-correctness&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-02 — Trial-Division Algorithm Correctness ===&lt;br /&gt;
&lt;br /&gt;
* For each candidate number N, the system shall divide N by each known prime p where p ≤ √N.&lt;br /&gt;
* If any p divides N exactly (remainder = 0), N is composite and shall not be stored.&lt;br /&gt;
* If no p ≤ √N divides N, N is prime and shall be persisted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-03-prime-reporting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-03 — Prime Reporting ===&lt;br /&gt;
&lt;br /&gt;
* The system shall accept a &amp;lt;code&amp;gt;report&amp;lt;/code&amp;gt; command-line argument to trigger report generation.&lt;br /&gt;
* The system shall read all stored primes from the database in sequence order.&lt;br /&gt;
* The system shall write a paginated, formatted print file containing all primes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-04-print-report-format&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-04 — Print Report Format ===&lt;br /&gt;
&lt;br /&gt;
* The report shall contain a page heading (“primes overview”) and column headers on each page.&lt;br /&gt;
* Each data line shall display six prime entries side by side: sequence number and prime value.&lt;br /&gt;
* Each page shall carry a page-number footing.&lt;br /&gt;
* The print record width shall be 132 characters.&lt;br /&gt;
* The report shall be written to a file named &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-05-operational-logging&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-05 — Operational Logging ===&lt;br /&gt;
&lt;br /&gt;
* The system shall write progress and status messages to the system console throughout execution.&lt;br /&gt;
* Each message shall identify the issuing program name and paragraph.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-06-error-handling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-06 — Error Handling ===&lt;br /&gt;
&lt;br /&gt;
* The system shall log an error message and stop cleanly if an unrecognised command-line argument is provided.&lt;br /&gt;
* The system shall log an error message and stop cleanly if the print file cannot be opened.&lt;br /&gt;
* The system shall log database connection or cursor failures and set an error indicator before exiting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;non-functional-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Non-Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Summary only — see PGCBL-NFR-001 for full specification.&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;| Category&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Requirement&lt;br /&gt;
|-&lt;br /&gt;
| NFR-PERF-01&lt;br /&gt;
| Performance&lt;br /&gt;
| ≥ 1,000 primes generated per second&lt;br /&gt;
|-&lt;br /&gt;
| NFR-REL-01&lt;br /&gt;
| Reliability&lt;br /&gt;
| Batch runs to completion without manual intervention&lt;br /&gt;
|-&lt;br /&gt;
| NFR-SEC-01&lt;br /&gt;
| Security&lt;br /&gt;
| No credentials in compiled binary&lt;br /&gt;
|-&lt;br /&gt;
| NFR-MAIN-01&lt;br /&gt;
| Maintainability&lt;br /&gt;
| SQL only in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;; file I/O only in &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NFR-OPER-02&lt;br /&gt;
| Operability&lt;br /&gt;
| Non-zero process return code on failure&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;constraints&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Constraints ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! ID&lt;br /&gt;
! Constraint&lt;br /&gt;
|-&lt;br /&gt;
| C-01&lt;br /&gt;
| Must run on Linux with GnuCOBOL 4.0&lt;br /&gt;
|-&lt;br /&gt;
| C-02&lt;br /&gt;
| Must use PostgreSQL as the database&lt;br /&gt;
|-&lt;br /&gt;
| C-03&lt;br /&gt;
| Upper generation limit: 999,999,999 (hard-coded)&lt;br /&gt;
|-&lt;br /&gt;
| C-04&lt;br /&gt;
| Single-user batch execution only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;out-of-scope-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Out of Scope ==&lt;br /&gt;
&lt;br /&gt;
* Interactive or web-based user interfaces.&lt;br /&gt;
* Concurrent or distributed execution.&lt;br /&gt;
* Generation of prime numbers by any algorithm other than trial division.&lt;br /&gt;
* Any prime number below 2 or above 999,999,999.&lt;br /&gt;
* Checkpoint/restart capability for interrupted generation runs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;related-documents-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 8. Related Documents ==&lt;br /&gt;
&lt;br /&gt;
As listed in §1.5.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 9. Open Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Issue&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Target&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| OI-01&lt;br /&gt;
| FR-01: generate loop is commented out in current source — this is defect D-01. FR-01 is not fully met by the current code.&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-02&lt;br /&gt;
| FR-06: the process does not return a non-zero exit code on error (NFR-OPER-02 gap).&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Design standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Naming_and_Coding_Standards&amp;diff=4757</id>
		<title>Naming and Coding Standards</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Naming_and_Coding_Standards&amp;diff=4757"/>
		<updated>2026-03-25T15:36:46Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;naming-and-coding-standard-cobol&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Naming and Coding Standard — COBOL =  {| !width=&amp;quot;23%&amp;quot;| Field !width=&amp;quot;76%&amp;quot;| Value |- | Document ID | PGCBL-NCS-001 |- | Document Type | Naming and Coding Standard |- | System | pgcobol — Prime Numbers Application v1.0 |- | Applies to | All GnuCOBOL source files (&amp;lt;code&amp;gt;.cbl&amp;lt;/code&amp;gt;) and copybooks (&amp;lt;code&amp;gt;.cpy&amp;lt;/code&amp;gt;) |- | Version | 1.0 |- | Status | Approved |- | Owner | Lead Developer |- | Author | Derived from: IBM...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;naming-and-coding-standard-cobol&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Naming and Coding Standard — COBOL =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;76%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Document ID&lt;br /&gt;
| PGCBL-NCS-001&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Naming and Coding Standard&lt;br /&gt;
|-&lt;br /&gt;
| System&lt;br /&gt;
| pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
|-&lt;br /&gt;
| Applies to&lt;br /&gt;
| All GnuCOBOL source files (&amp;lt;code&amp;gt;.cbl&amp;lt;/code&amp;gt;) and copybooks (&amp;lt;code&amp;gt;.cpy&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| Version&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Approved&lt;br /&gt;
|-&lt;br /&gt;
| Owner&lt;br /&gt;
| Lead Developer&lt;br /&gt;
|-&lt;br /&gt;
| Author&lt;br /&gt;
| Derived from: IBM Enterprise COBOL Coding Guidelines, GnuCOBOL Best Practices, Micro Focus COBOL Standards, and observation of existing pgcobol source&lt;br /&gt;
|-&lt;br /&gt;
| Created&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Last modified&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Classification&lt;br /&gt;
| Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;version-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Version&lt;br /&gt;
!width=&amp;quot;22%&amp;quot;| Date&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Author&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Status&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;| Change Summary&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Draft&lt;br /&gt;
| Initial standard from source analysis&lt;br /&gt;
|-&lt;br /&gt;
| 1.0&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Approved&lt;br /&gt;
| Baselined&lt;br /&gt;
|}&lt;br /&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-standards-basis|Standards Basis]]&lt;br /&gt;
# [[#2-source-file-conventions|Source File Conventions]]&lt;br /&gt;
# [[#3-division-and-section-structure|Division and Section Structure]]&lt;br /&gt;
# [[#4-data-naming-conventions|Data Naming Conventions]]&lt;br /&gt;
# [[#5-paragraph-naming-conventions|Paragraph Naming Conventions]]&lt;br /&gt;
# [[#6-procedure-division-coding-rules|Procedure Division Coding Rules]]&lt;br /&gt;
# [[#7-sql-embedding-conventions|SQL Embedding Conventions]]&lt;br /&gt;
# [[#8-commentary-standards|Commentary Standards]]&lt;br /&gt;
# [[#9-copybook-standards|Copybook Standards]]&lt;br /&gt;
# [[#10-method-dispatch-pattern-standard|Method-Dispatch Pattern Standard]]&lt;br /&gt;
# [[#11-error-handling-standard|Error Handling Standard]]&lt;br /&gt;
# [[#12-compliance-checklist|Compliance Checklist]]&lt;br /&gt;
# [[#13-open-issues|Open Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;standards-basis&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Standards Basis ==&lt;br /&gt;
&lt;br /&gt;
This standard synthesises rules from the following well-known and published sources:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Source&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| What it contributes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ISO/IEC 1989:2014&#039;&#039;&#039; (COBOL 2014 standard)&lt;br /&gt;
| Syntax compliance baseline&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IBM Enterprise COBOL Programming Guide (SC27-1460)&#039;&#039;&#039;&lt;br /&gt;
| Naming conventions, data division layout, structured programming&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Micro Focus COBOL Coding Standards&#039;&#039;&#039;&lt;br /&gt;
| Paragraph prefixing, copybook discipline, comment headers&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;GnuCOBOL Programmer’s Guide&#039;&#039;&#039;&lt;br /&gt;
| GnuCOBOL-specific extensions and limitations&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NIST COBOL Test Suite conventions&#039;&#039;&#039;&lt;br /&gt;
| Identifier uniqueness and column discipline&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Yourdon / Constantine structured design&#039;&#039;&#039;&lt;br /&gt;
| Module cohesion, coupling reduction — applied to COBOL tiers&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pgcobol source&#039;&#039;&#039;&lt;br /&gt;
| Existing conventions extracted and formalised&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;source-file-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Source File Conventions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;file-names&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.1 File names ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;program-id&amp;amp;gt;.cbl          Main program source&lt;br /&gt;
&amp;amp;lt;copybook-name&amp;amp;gt;.cpy       Copybook source&lt;br /&gt;
&amp;amp;lt;program-id&amp;amp;gt;.cbsql        GixSQL pre-processor input (if SQL present)&lt;br /&gt;
&amp;amp;lt;program-id&amp;amp;gt;_cbsql.out    GixSQL pre-processor listing (generated; do not edit)&amp;lt;/pre&amp;gt;&lt;br /&gt;
* All lowercase.&lt;br /&gt;
* Hyphens as word separators (not underscores) for new files. Underscores are a legacy convention in this codebase (&amp;lt;code&amp;gt;primes_table.cpy&amp;lt;/code&amp;gt;); new files use hyphens.&lt;br /&gt;
* The &amp;lt;code&amp;gt;PROGRAM-ID&amp;lt;/code&amp;gt; in the source must match the filename exactly (case-insensitive).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;column-discipline&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.2 Column discipline ===&lt;br /&gt;
&lt;br /&gt;
GnuCOBOL supports both fixed-format (traditional) and free-format source. This codebase uses &#039;&#039;&#039;fixed format&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Columns 1–6    Sequence number area (blank in new code; used by legacy tools)&lt;br /&gt;
Column  7      Indicator area: space = code, * = comment, / = page eject, - = continuation&lt;br /&gt;
Columns 8–11   Area A: DIVISION, SECTION, paragraph names, 01/77-level data&lt;br /&gt;
Columns 12–72  Area B: all other code&lt;br /&gt;
Columns 73–80  Identification area (optional; ignored by compiler)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rule:&#039;&#039;&#039; All paragraph names and top-level items begin in column 8 (Area A). All subordinate code begins at column 12 or beyond (Area B).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;division-and-section-structure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Division and Section Structure ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mandatory-division-order&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Mandatory division order ===&lt;br /&gt;
&lt;br /&gt;
Every program must contain these divisions in this order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;IDENTIFICATION DIVISION.&lt;br /&gt;
  PROGRAM-ID.&lt;br /&gt;
  (AUTHOR. — optional)&lt;br /&gt;
  (DATE-WRITTEN. — optional)&lt;br /&gt;
&lt;br /&gt;
ENVIRONMENT DIVISION.&lt;br /&gt;
  CONFIGURATION SECTION.&lt;br /&gt;
    SOURCE-COMPUTER.&lt;br /&gt;
    OBJECT-COMPUTER.&lt;br /&gt;
    SPECIAL-NAMES.&lt;br /&gt;
  INPUT-OUTPUT SECTION.      (only if files are used)&lt;br /&gt;
    FILE-CONTROL.&lt;br /&gt;
&lt;br /&gt;
DATA DIVISION.&lt;br /&gt;
  FILE SECTION.              (only if files are used)&lt;br /&gt;
  WORKING-STORAGE SECTION.&lt;br /&gt;
  LINKAGE SECTION.           (only for called programs)&lt;br /&gt;
&lt;br /&gt;
PROCEDURE DIVISION [USING ...].&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;working-storage-section-order&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 Working-Storage section order ===&lt;br /&gt;
&lt;br /&gt;
Items in WORKING-STORAGE must appear in this order:&lt;br /&gt;
&lt;br /&gt;
# Debug marker filler (01 FILLER PIC X(32) VALUE “Start WS &amp;lt;program&amp;gt;”) — for memory-dump readability.&lt;br /&gt;
# File status fields (if any files).&lt;br /&gt;
# Constants (01 level, VALUE clause, no modification at runtime).&lt;br /&gt;
# Work fields grouped by function.&lt;br /&gt;
# COPY statements for local copybooks (primes-ui, primes-dal, etc.).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linkage-section&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.3 Linkage section ===&lt;br /&gt;
&lt;br /&gt;
The linkage section must contain only COPY statements referencing the published inter-tier copybooks. No fields should be defined directly in the LINKAGE SECTION of a standard program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-naming-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Data Naming Conventions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;general-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.1 General rules ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Rule&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Rationale&lt;br /&gt;
|-&lt;br /&gt;
| Use hyphens as word separators: &amp;lt;code&amp;gt;test-number&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;testNumber&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;test_number&amp;lt;/code&amp;gt;&lt;br /&gt;
| COBOL convention; underscores are non-standard in some compilers&lt;br /&gt;
|-&lt;br /&gt;
| Maximum name length: 30 characters (COBOL 85 limit)&lt;br /&gt;
| Portability&lt;br /&gt;
|-&lt;br /&gt;
| Names must be meaningful: no single-letter names except loop indexes&lt;br /&gt;
| Readability&lt;br /&gt;
|-&lt;br /&gt;
| Avoid COBOL reserved words and common abbreviations that conflict (e.g. &amp;lt;code&amp;gt;LENGTH&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SPACE&amp;lt;/code&amp;gt;)&lt;br /&gt;
| Prevents ambiguity&lt;br /&gt;
|-&lt;br /&gt;
| Prefix 88-level condition names with the purpose they test, not the field name&lt;br /&gt;
| &amp;lt;code&amp;gt;dal-method-ok&amp;lt;/code&amp;gt; not &amp;lt;code&amp;gt;dal-result-zero&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;level-number-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.2 Level number conventions ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Level&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Use&lt;br /&gt;
|-&lt;br /&gt;
| 01&lt;br /&gt;
| Group items, independent items, copybook roots&lt;br /&gt;
|-&lt;br /&gt;
| 03, 05, 07&lt;br /&gt;
| Subordinate group and elementary items (use odd numbers: 01, 03, 05, 07 …)&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| RENAMES clause (use sparingly)&lt;br /&gt;
|-&lt;br /&gt;
| 77&lt;br /&gt;
| Independent elementary items (prefer 01 unless 77 is clearly appropriate)&lt;br /&gt;
|-&lt;br /&gt;
| 88&lt;br /&gt;
| Condition names; always immediately under the field they qualify&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rule:&#039;&#039;&#039; Use odd-numbered levels (01, 03, 05, 07, 09) to allow insertion of intermediate levels without renumbering. Never use even levels in new code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;naming-prefixes-for-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.3 Naming prefixes for scope ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Prefix&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Meaning&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r-&amp;lt;/code&amp;gt;&lt;br /&gt;
| Record / row field (fetched from DB)&lt;br /&gt;
| &amp;lt;code&amp;gt;r-ident&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;u-&amp;lt;/code&amp;gt;&lt;br /&gt;
| UI-layer field (in primes-ui block)&lt;br /&gt;
| &amp;lt;code&amp;gt;u-sequence&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;u-number&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;t-&amp;lt;/code&amp;gt;&lt;br /&gt;
| Table cell / temporary print field&lt;br /&gt;
| &amp;lt;code&amp;gt;t-ident&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t-prime&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;f-&amp;lt;/code&amp;gt;&lt;br /&gt;
| Formatted / print-ready field&lt;br /&gt;
| &amp;lt;code&amp;gt;f-page-number&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;w-&amp;lt;/code&amp;gt;&lt;br /&gt;
| Work field (local computation)&lt;br /&gt;
| &amp;lt;code&amp;gt;w-remainder&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;picture-clause-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.4 Picture clause conventions ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Type&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Preferred PICTURE&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Notes&lt;br /&gt;
|-&lt;br /&gt;
| Positive integer, display&lt;br /&gt;
| &amp;lt;code&amp;gt;9(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
| n ≤ 9 for standard arithmetic&lt;br /&gt;
|-&lt;br /&gt;
| Signed integer, display&lt;br /&gt;
| &amp;lt;code&amp;gt;S9(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Use S prefix for fields that can go negative or are SQL host variables&lt;br /&gt;
|-&lt;br /&gt;
| Packed decimal&lt;br /&gt;
| &amp;lt;code&amp;gt;S9(n) COMP-3&amp;lt;/code&amp;gt;&lt;br /&gt;
| For high-volume arithmetic and SQL host variables&lt;br /&gt;
|-&lt;br /&gt;
| Binary integer&lt;br /&gt;
| &amp;lt;code&amp;gt;S9(n) COMP-5&amp;lt;/code&amp;gt;&lt;br /&gt;
| For SQLCA fields and counters needing maximum performance&lt;br /&gt;
|-&lt;br /&gt;
| Fixed decimal&lt;br /&gt;
| &amp;lt;code&amp;gt;9(n)V9(m)&amp;lt;/code&amp;gt;&lt;br /&gt;
| V = implied decimal point; no actual decimal character stored&lt;br /&gt;
|-&lt;br /&gt;
| Alphanumeric&lt;br /&gt;
| &amp;lt;code&amp;gt;X(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
| For text, method verbs, messages&lt;br /&gt;
|-&lt;br /&gt;
| Edited numeric (print)&lt;br /&gt;
| &amp;lt;code&amp;gt;Z(n)9&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Z(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
| For zero-suppressed print output only; never used in arithmetic&lt;br /&gt;
|-&lt;br /&gt;
| Boolean flag&lt;br /&gt;
| &amp;lt;code&amp;gt;9(1)&amp;lt;/code&amp;gt; with 88-levels&lt;br /&gt;
| e.g. &amp;lt;code&amp;gt;PIC 9 VALUE 1. 88 new-page VALUE 1.&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;level-condition-names&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.5 88-level condition names ===&lt;br /&gt;
&lt;br /&gt;
* Must be named for what is &#039;&#039;&#039;true&#039;&#039;&#039; when the condition fires, not for the value: &amp;lt;code&amp;gt;session-method-ok&amp;lt;/code&amp;gt; not &amp;lt;code&amp;gt;result-is-zero&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Result-code 88-levels must cover all meaningful values; add a &amp;lt;code&amp;gt;88 invalid-method VALUE &amp;amp;quot;bad&amp;amp;quot;&amp;lt;/code&amp;gt; sentinel.&lt;br /&gt;
* Multiple conditions for the same field must have non-overlapping VALUES.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-field-naming&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.6 Copybook field naming ===&lt;br /&gt;
&lt;br /&gt;
* Fields in a copybook must be globally unique across all copybooks in the project (COBOL does not namespace copybooks).&lt;br /&gt;
* Prefix copybook fields with the copybook’s logical name: &amp;lt;code&amp;gt;dal-methods&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ui-method-result&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session-result&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-naming-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Paragraph Naming Conventions ==&lt;br /&gt;
&lt;br /&gt;
This project uses a &#039;&#039;&#039;prefix-number naming scheme&#039;&#039;&#039; derived from IBM COBOL shop practice:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;prefix-codes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.1 Prefix codes ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Prefix&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Meaning&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;&lt;br /&gt;
| Regular processing paragraph (business logic, I/O)&lt;br /&gt;
| &amp;lt;code&amp;gt;r80-test-number&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;&lt;br /&gt;
| System / infrastructure paragraph (DB connect, file open)&lt;br /&gt;
| &amp;lt;code&amp;gt;s00-connect&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;&lt;br /&gt;
| Error-handling paragraph&lt;br /&gt;
| &amp;lt;code&amp;gt;e10-handle-db-error&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;&lt;br /&gt;
| Exit / cleanup paragraph (always PERFORM last)&lt;br /&gt;
| &amp;lt;code&amp;gt;x99-shutdown&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Observation from existing source:&#039;&#039;&#039; The project uses &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; prefixes already. The &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; prefixes are introduced here as an extension. The &amp;lt;code&amp;gt;r99&amp;lt;/code&amp;gt; convention for shutdown paragraphs is retained.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;numbering&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.2 Numbering ===&lt;br /&gt;
&lt;br /&gt;
* Two-digit sequence: &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;90&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;99&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Low numbers (00–29): initialisation / setup.&lt;br /&gt;
* Mid numbers (30–79): main processing.&lt;br /&gt;
* High numbers (80–89): sub-processing / helpers.&lt;br /&gt;
* 90–98: cleanup and close.&lt;br /&gt;
* 99: final exit / stop.&lt;br /&gt;
* Leave gaps of 10 between paragraphs to allow insertion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;name-format&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.3 Name format ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;prefix&amp;amp;gt;&amp;amp;lt;NN&amp;amp;gt;-&amp;amp;lt;short-hyphenated-description&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
  r80-test-number&lt;br /&gt;
  r82-next-test-number&lt;br /&gt;
  r85-write-prime&lt;br /&gt;
  r89-get-next-divider&lt;br /&gt;
  r90-start-primes-report&lt;br /&gt;
  r99-close-primes&lt;br /&gt;
  s00-connect&lt;br /&gt;
  s01-cursor&lt;br /&gt;
  s02-fetch&lt;br /&gt;
  s99-disconnect&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5.4 Rules ===&lt;br /&gt;
&lt;br /&gt;
* Paragraph names must be unique within the program.&lt;br /&gt;
* A paragraph must do one thing. If it needs a comment explaining “also does X”, split it.&lt;br /&gt;
* Paragraphs called only from one place may be inlined (PERFORM vs inline code) — choose consistency over micro-optimisation.&lt;br /&gt;
* Never use &amp;lt;code&amp;gt;GO TO&amp;lt;/code&amp;gt; except for the structured &amp;lt;code&amp;gt;GO TO &amp;amp;lt;paragraph&amp;amp;gt;&amp;lt;/code&amp;gt; used as a skip (an accepted COBOL idiom). Do not use &amp;lt;code&amp;gt;ALTER&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division-coding-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Procedure Division Coding Rules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;structured-programming&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6.1 Structured programming ===&lt;br /&gt;
&lt;br /&gt;
All control flow must use structured constructs:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Construct&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Use for&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PERFORM &amp;amp;lt;paragraph&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Single call to a named paragraph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PERFORM &amp;amp;lt;paragraph&amp;amp;gt; UNTIL &amp;amp;lt;condition&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Loops with pre-test condition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EVALUATE TRUE … WHEN … END-EVALUATE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Multi-way branch (preferred over nested IF)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;IF … ELSE … END-IF&amp;lt;/code&amp;gt;&lt;br /&gt;
| Two-way branch&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NEXT SENTENCE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Skip remainder of sentence (used sparingly; prefer END-IF)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Never use:&#039;&#039;&#039; - &amp;lt;code&amp;gt;GO TO&amp;lt;/code&amp;gt; (except structured skip idiom in legacy contexts) - &amp;lt;code&amp;gt;ALTER&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;PERFORM … THRU&amp;lt;/code&amp;gt; (couples paragraphs; prefer explicit PERFORM chains)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evaluate-true-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6.2 EVALUATE TRUE convention ===&lt;br /&gt;
&lt;br /&gt;
The method-dispatch EVALUATE always takes this form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;EVALUATE TRUE&lt;br /&gt;
  WHEN &amp;lt;condition-name-1&amp;gt;&lt;br /&gt;
    PERFORM &amp;lt;paragraph&amp;gt;&lt;br /&gt;
  WHEN &amp;lt;condition-name-2&amp;gt;&lt;br /&gt;
    PERFORM &amp;lt;paragraph&amp;gt;&lt;br /&gt;
  WHEN OTHER&lt;br /&gt;
    MOVE 1 TO &amp;lt;result-field&amp;gt;&lt;br /&gt;
END-EVALUATE.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Every EVALUATE must have a &amp;lt;code&amp;gt;WHEN OTHER&amp;lt;/code&amp;gt; clause.&lt;br /&gt;
* The &amp;lt;code&amp;gt;WHEN OTHER&amp;lt;/code&amp;gt; must set a meaningful error indicator; it must never be a no-op.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;perform-until&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6.3 PERFORM … UNTIL ===&lt;br /&gt;
&lt;br /&gt;
* The loop condition is checked &#039;&#039;&#039;before&#039;&#039;&#039; the first iteration (test-before / DO-WHILE reversed).&lt;br /&gt;
* Infinite loops are not permitted. Every PERFORM UNTIL must have a reachable exit condition.&lt;br /&gt;
* Loop termination must be tested and documented in the program logic guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;call-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6.4 CALL conventions ===&lt;br /&gt;
&lt;br /&gt;
* All inter-program calls use &amp;lt;code&amp;gt;CALL &amp;amp;quot;literal&amp;amp;quot; USING &amp;amp;lt;data-block&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The called program name must be a string literal, not a data name (for static linkage and security).&lt;br /&gt;
* Always check the result field of the called program’s control block immediately after the CALL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;arithmetic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6.5 Arithmetic ===&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;code&amp;gt;COMPUTE&amp;lt;/code&amp;gt; for complex expressions: &amp;lt;code&amp;gt;COMPUTE x = a ** 0.5&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Use &amp;lt;code&amp;gt;ADD … TO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUBTRACT … FROM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MULTIPLY … BY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DIVIDE … BY … GIVING … REMAINDER&amp;lt;/code&amp;gt; for simple operations.&lt;br /&gt;
* Always use &amp;lt;code&amp;gt;GIVING&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;REMAINDER&amp;lt;/code&amp;gt; clauses to avoid in-place modification of source operands.&lt;br /&gt;
* Always check for zero divisor before DIVIDE.&lt;br /&gt;
* Declare intermediate results with sufficient precision to avoid truncation: &amp;lt;code&amp;gt;PIC 9(9)V9(9)&amp;lt;/code&amp;gt; for square-root results.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sql-embedding-conventions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. SQL Embedding Conventions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;exec-sql-block-layout&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7.1 EXEC SQL block layout ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;           EXEC SQL [AT &amp;lt;connection-alias&amp;gt;]&lt;br /&gt;
             &amp;lt;sql statement&amp;gt;&lt;br /&gt;
           END-EXEC.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;EXEC SQL&amp;lt;/code&amp;gt; on its own line, indented to Area B.&lt;br /&gt;
* SQL keywords in uppercase.&lt;br /&gt;
* Host variable prefix &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; immediately before the variable name, no space.&lt;br /&gt;
* &amp;lt;code&amp;gt;END-EXEC.&amp;lt;/code&amp;gt; on its own line, followed by a period.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;host-variable-declaration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7.2 Host variable declaration ===&lt;br /&gt;
&lt;br /&gt;
* All SQL host variables must be declared via &amp;lt;code&amp;gt;EXEC SQL INCLUDE &amp;amp;lt;copybook&amp;amp;gt; END-EXEC&amp;lt;/code&amp;gt; or directly in WORKING-STORAGE.&lt;br /&gt;
* Host variables for row-level data must be grouped under a 01-level record that mirrors the table structure.&lt;br /&gt;
* Use &amp;lt;code&amp;gt;COMP-3&amp;lt;/code&amp;gt; for numeric host variables for performance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sqlcode-checking&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7.3 SQLCODE checking ===&lt;br /&gt;
&lt;br /&gt;
Every EXEC SQL block must be followed immediately by a SQLCODE check:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;           EXEC SQL ... END-EXEC.&lt;br /&gt;
&lt;br /&gt;
           IF SQLCODE = 0 THEN&lt;br /&gt;
             &amp;lt;success path&amp;gt;&lt;br /&gt;
           ELSE&lt;br /&gt;
             MOVE SQLERRMC TO program-message&lt;br /&gt;
             PERFORM e10-handle-sql-error&lt;br /&gt;
           END-IF.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Never fall through after an unchecked SQL statement.&lt;br /&gt;
* Log &amp;lt;code&amp;gt;SQLCODE&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SQLERRMC&amp;lt;/code&amp;gt; on every error path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cursor-naming&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7.4 Cursor naming ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;table-name&amp;amp;gt;cursor&lt;br /&gt;
&lt;br /&gt;
Example: primescursor (cursor on the primes table)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;connection-alias-naming&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7.5 Connection alias naming ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;database-name&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: primes (alias for the primes database connection)&amp;lt;/pre&amp;gt;&lt;br /&gt;
The alias must be consistent across all &amp;lt;code&amp;gt;AT &amp;amp;lt;alias&amp;amp;gt;&amp;lt;/code&amp;gt; clauses and the CONNECT/RESET statements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;commentary-standards&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 8. Commentary Standards ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;program-header-block&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8.1 Program header block ===&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;.cbl&amp;lt;/code&amp;gt; file must open with a standardised comment block in columns 7–72:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;      *=================================================================&lt;br /&gt;
      * Program:    &amp;lt;PROGRAM-ID&amp;gt;&lt;br /&gt;
      * Document:   &amp;lt;PGCBL-PLG-NNN&amp;gt;&lt;br /&gt;
      * Purpose:    &amp;lt;one sentence&amp;gt;&lt;br /&gt;
      * Tier:       Orchestrator | Business Logic | Data Access | UI&lt;br /&gt;
      * Calls:      &amp;lt;list of programs this program calls&amp;gt;&lt;br /&gt;
      * Called by:  &amp;lt;list of programs that call this program&amp;gt;&lt;br /&gt;
      * Copybooks:  &amp;lt;list of copybooks copied&amp;gt;&lt;br /&gt;
      * Author:     &amp;lt;name&amp;gt;&lt;br /&gt;
      * Created:    YYYY-MM-DD&lt;br /&gt;
      * Modified:   YYYY-MM-DD &amp;lt;name&amp;gt; &amp;lt;change summary&amp;gt;&lt;br /&gt;
      *=================================================================&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;paragraph-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8.2 Paragraph headers ===&lt;br /&gt;
&lt;br /&gt;
Every paragraph must have a comment immediately before it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;      *-----------------------------------------------------------------&lt;br /&gt;
      * r80-test-number&lt;br /&gt;
      *   Tests whether test-number is prime by trial division.&lt;br /&gt;
      *   Called by: PERFORM UNTIL test-number = 999999999&lt;br /&gt;
      *   Uses: test-number, test-divider, test-number-sqr, test-rest&lt;br /&gt;
      *-----------------------------------------------------------------&lt;br /&gt;
       r80-test-number.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;inline-comments&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8.3 Inline comments ===&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;code&amp;gt;*&amp;amp;gt;&amp;lt;/code&amp;gt; (GnuCOBOL free-format inline comment) or a &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; in column 7 for a full-line comment.&lt;br /&gt;
* Comment the &#039;&#039;&#039;why&#039;&#039;&#039;, not the &#039;&#039;&#039;what&#039;&#039;&#039;: the code shows what; the comment explains why.&lt;br /&gt;
* Every EXEC SQL block must have a comment above it stating what it does and under what conditions it is called.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;      * Fetch the next prime from the cursor.&lt;br /&gt;
      * Called after every successful report loop iteration.&lt;br /&gt;
           EXEC SQL FETCH primescursor INTO :primes-row END-EXEC.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;prohibited-comment-patterns&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8.4 Prohibited comment patterns ===&lt;br /&gt;
&lt;br /&gt;
* Do not comment out code and leave it in the source permanently. Use version control instead.&lt;br /&gt;
* Do not write comments that merely restate the code: &amp;lt;code&amp;gt;* MOVE 1 TO X (moves 1 to X)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-standards&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 9. Copybook Standards ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;file-name-and-content-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 9.1 File name and content rules ===&lt;br /&gt;
&lt;br /&gt;
* Each copybook defines exactly one logical structure (one 01-level group).&lt;br /&gt;
* The copybook file name matches the 01-level name: &amp;lt;code&amp;gt;primes-dal.cpy&amp;lt;/code&amp;gt; defines &amp;lt;code&amp;gt;01 primes-dal&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Copybooks must not contain PROCEDURE DIVISION code.&lt;br /&gt;
* Copybooks must not contain COPY statements (no nested copies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;copybook-header&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 9.2 Copybook header ===&lt;br /&gt;
&lt;br /&gt;
Every copybook must open with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;      *=================================================================&lt;br /&gt;
      * Copybook: &amp;lt;name&amp;gt;.cpy&lt;br /&gt;
      * Purpose:  &amp;lt;one sentence&amp;gt;&lt;br /&gt;
      * Used by:  &amp;lt;list of programs&amp;gt;&lt;br /&gt;
      * Document: &amp;lt;PGCBL-DDD-001&amp;gt; §&amp;lt;section&amp;gt;&lt;br /&gt;
      *=================================================================&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;change-control&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 9.3 Change control ===&lt;br /&gt;
&lt;br /&gt;
* Any change to a copybook is a &#039;&#039;&#039;breaking change&#039;&#039;&#039; for all programs that include it.&lt;br /&gt;
* Changes must be accompanied by a recompilation of all affected programs.&lt;br /&gt;
* The copybook version history must be updated in the header comment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;canonical-copybook-rule&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 9.4 Canonical copybook rule ===&lt;br /&gt;
&lt;br /&gt;
Where two copybooks define the same structure (e.g. &amp;lt;code&amp;gt;primes-table.cpy&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;primes_table.cpy&amp;lt;/code&amp;gt;), one must be designated canonical and the other deprecated and removed. The canonical version is documented in the Data Dictionary.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;method-dispatch-pattern-standard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 10. Method-Dispatch Pattern Standard ==&lt;br /&gt;
&lt;br /&gt;
This pattern is the core inter-tier communication mechanism. These rules ensure it is applied consistently.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;control-block-layout&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 10.1 Control block layout ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;       01 &amp;lt;tier&amp;gt;-&amp;lt;control-block&amp;gt;.&lt;br /&gt;
        03 &amp;lt;tier&amp;gt;-methods         PIC X(32).&lt;br /&gt;
         88 &amp;lt;verb-1&amp;gt;              VALUE &amp;quot;&amp;lt;verb-1-string&amp;gt;&amp;quot;.&lt;br /&gt;
         88 &amp;lt;verb-2&amp;gt;              VALUE &amp;quot;&amp;lt;verb-2-string&amp;gt;&amp;quot;.&lt;br /&gt;
         88 invalid-method        VALUE &amp;quot;bad&amp;quot;.&lt;br /&gt;
        03 &amp;lt;data-payload-group&amp;gt;.&lt;br /&gt;
         05 &amp;lt;field-1&amp;gt;             PIC ...&lt;br /&gt;
        03 &amp;lt;tier&amp;gt;-result          PIC 9(2)  VALUE ZERO.&lt;br /&gt;
         88 &amp;lt;tier&amp;gt;-method-ok      VALUE 0.&lt;br /&gt;
         88 &amp;lt;tier&amp;gt;-method-nok     VALUE 1.&lt;br /&gt;
         88 &amp;lt;tier&amp;gt;-method-eof     VALUE 9.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;result-code-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 10.2 Result code convention ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Value&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| 88-level name&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;tier&amp;amp;gt;-method-ok&amp;lt;/code&amp;gt;&lt;br /&gt;
| Operation succeeded&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;tier&amp;amp;gt;-method-nok&amp;lt;/code&amp;gt;&lt;br /&gt;
| Operation failed (error)&lt;br /&gt;
|-&lt;br /&gt;
| 9 or 99&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;tier&amp;amp;gt;-method-eof&amp;lt;/code&amp;gt;&lt;br /&gt;
| End of data (cursor exhausted, no more rows)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* All tiers must use these values consistently.&lt;br /&gt;
* No other result codes may be introduced without updating this standard and the Data Dictionary.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;caller-obligations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 10.3 Caller obligations ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;           MOVE &amp;quot;&amp;lt;verb&amp;gt;&amp;quot; TO &amp;lt;tier&amp;gt;-methods.&lt;br /&gt;
           CALL &amp;quot;&amp;lt;program&amp;gt;&amp;quot; USING &amp;lt;control-block&amp;gt;.&lt;br /&gt;
           IF &amp;lt;tier&amp;gt;-method-ok THEN&lt;br /&gt;
             &amp;lt;success path&amp;gt;&lt;br /&gt;
           ELSE&lt;br /&gt;
             &amp;lt;error path — must not be empty&amp;gt;&lt;br /&gt;
           END-IF.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* The caller must always check the result immediately after the CALL.&lt;br /&gt;
* An unchecked result is a coding error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;callee-obligations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 10.4 Callee obligations ===&lt;br /&gt;
&lt;br /&gt;
* The callee must set the result field before EXIT PROGRAM on every code path.&lt;br /&gt;
* The callee must handle &amp;lt;code&amp;gt;WHEN OTHER&amp;lt;/code&amp;gt; in the EVALUATE and set result to 1 (nok).&lt;br /&gt;
* The callee must not STOP RUN (only EXIT PROGRAM); the caller decides whether to stop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;error-handling-standard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 11. Error Handling Standard ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sql-errors&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 11.1 SQL errors ===&lt;br /&gt;
&lt;br /&gt;
Every EXEC SQL block must check SQLCODE as specified in §7.3. On error:&lt;br /&gt;
&lt;br /&gt;
# Move &amp;lt;code&amp;gt;SQLERRMC&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;program-message&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Set the tier’s result field to 1 (nok).&lt;br /&gt;
# Call primesui with &amp;lt;code&amp;gt;ui-methods = &amp;amp;quot;log-message&amp;amp;quot;&amp;lt;/code&amp;gt; to log the error.&lt;br /&gt;
# EXIT PROGRAM — do not STOP RUN from within a subprogram.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;file-io-errors&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 11.2 File I/O errors ===&lt;br /&gt;
&lt;br /&gt;
Every file OPEN, READ, WRITE, CLOSE must check the file-status field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;           IF &amp;lt;file&amp;gt;-status = &amp;quot;00&amp;quot; THEN&lt;br /&gt;
             &amp;lt;success&amp;gt;&lt;br /&gt;
           ELSE&lt;br /&gt;
             MOVE &amp;lt;file&amp;gt;-status TO program-message&lt;br /&gt;
             PERFORM r98-message-ui&lt;br /&gt;
             MOVE 1 TO ui-method-result&lt;br /&gt;
           END-IF.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;return-code&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 11.3 Return code ===&lt;br /&gt;
&lt;br /&gt;
At the end of &amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt; (the only &amp;lt;code&amp;gt;STOP RUN&amp;lt;/code&amp;gt; in the system), set the process return code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;           IF &amp;lt;any-error-indicator&amp;gt; THEN&lt;br /&gt;
             MOVE 1 TO RETURN-CODE&lt;br /&gt;
           ELSE&lt;br /&gt;
             MOVE 0 TO RETURN-CODE&lt;br /&gt;
           END-IF.&lt;br /&gt;
           STOP RUN.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-checklist&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 12. Compliance Checklist ==&lt;br /&gt;
&lt;br /&gt;
Use this checklist during code review:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;structure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
* ☐ Program header block present and complete.&lt;br /&gt;
* ☐ All divisions in correct order.&lt;br /&gt;
* ☐ WORKING-STORAGE follows the prescribed section order.&lt;br /&gt;
* ☐ LINKAGE SECTION contains only COPY statements.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;naming&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Naming ===&lt;br /&gt;
&lt;br /&gt;
* ☐ All paragraph names follow &amp;lt;code&amp;gt;&amp;amp;lt;prefix&amp;amp;gt;&amp;amp;lt;NN&amp;amp;gt;-&amp;amp;lt;description&amp;amp;gt;&amp;lt;/code&amp;gt; scheme.&lt;br /&gt;
* ☐ All data names use hyphens, not underscores (except legacy names).&lt;br /&gt;
* ☐ 88-level names describe the true condition, not the value.&lt;br /&gt;
* ☐ Copybook fields are globally unique and prefixed with the copybook’s logical name.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;procedure-division&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Procedure Division ===&lt;br /&gt;
&lt;br /&gt;
* ☐ No GO TO (except structured skip).&lt;br /&gt;
* ☐ No PERFORM … THRU.&lt;br /&gt;
* ☐ Every EVALUATE has WHEN OTHER.&lt;br /&gt;
* ☐ Every CALL is followed by a result check.&lt;br /&gt;
* ☐ Every EXEC SQL is followed by a SQLCODE check.&lt;br /&gt;
* ☐ Every file operation is followed by a file-status check.&lt;br /&gt;
* ☐ RETURN-CODE is set before STOP RUN in primesmain.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;comments&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
* ☐ Every paragraph has a comment header.&lt;br /&gt;
* ☐ Every EXEC SQL block has a purpose comment.&lt;br /&gt;
* ☐ No commented-out code left in permanent source.&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;
* ☐ Each copybook defines exactly one 01-level structure.&lt;br /&gt;
* ☐ Copybook file name matches the 01-level name.&lt;br /&gt;
* ☐ No nested COPY statements.&lt;br /&gt;
* ☐ Copybook header present.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 13. Open Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Issue&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Target&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| OI-01&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_table.cpy&amp;lt;/code&amp;gt; (underscore) needs to be designated as deprecated in favour of &amp;lt;code&amp;gt;primes-table.cpy&amp;lt;/code&amp;gt; (hyphen)&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-02&lt;br /&gt;
| No program header blocks present in current source — all four programs need retrofitting&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-03&lt;br /&gt;
| No paragraph comment headers present in current source — all paragraphs need retrofitting&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-04&lt;br /&gt;
| Direct DISPLAY statements in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; bypass the structured log format; should be replaced with calls to primesui&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-05&lt;br /&gt;
| &amp;lt;code&amp;gt;RETURN-CODE&amp;lt;/code&amp;gt; not set in &amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt;; needs adding before STOP RUN&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Design standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Architecture_decision_records&amp;diff=4756</id>
		<title>Architecture decision records</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Architecture_decision_records&amp;diff=4756"/>
		<updated>2026-03-25T15:34:59Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;architecture-decision-records&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Architecture Decision Records =  {| !width=&amp;quot;23%&amp;quot;| Field !width=&amp;quot;76%&amp;quot;| Value |- | Document ID | PGCBL-ADD-001 |- | Document Type | Architecture Decision Document |- | System | pgcobol — Prime Numbers Application v1.0 |- | Version | 1.0 |- | Status | Draft — decisions marked [INFERRED] need developer confirmation |- | Owner | Lead Developer / Architect |- | Author | [reverse-engineered from source artifacts] |- | Creat...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;architecture-decision-records&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Architecture Decision Records =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;76%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Document ID&lt;br /&gt;
| PGCBL-ADD-001&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Architecture Decision Document&lt;br /&gt;
|-&lt;br /&gt;
| System&lt;br /&gt;
| pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
|-&lt;br /&gt;
| Version&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Draft — decisions marked [INFERRED] need developer confirmation&lt;br /&gt;
|-&lt;br /&gt;
| Owner&lt;br /&gt;
| Lead Developer / Architect&lt;br /&gt;
|-&lt;br /&gt;
| Author&lt;br /&gt;
| [reverse-engineered from source artifacts]&lt;br /&gt;
|-&lt;br /&gt;
| Created&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Last modified&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Classification&lt;br /&gt;
| Internal&lt;br /&gt;
|-&lt;br /&gt;
| Parent document&lt;br /&gt;
| PGCBL-TSD-001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;version-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Version&lt;br /&gt;
!width=&amp;quot;22%&amp;quot;| Date&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Author&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Status&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;| Change Summary&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Draft&lt;br /&gt;
| All ADRs inferred from source&lt;br /&gt;
|}&lt;br /&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-purpose-and-format|Purpose and Format]]&lt;br /&gt;
# [[#2-adr-001--three-tier-architecture|ADR-001 — Three-Tier Architecture]]&lt;br /&gt;
# [[#3-adr-002--method-dispatch-pattern|ADR-002 — Method-Dispatch Pattern]]&lt;br /&gt;
# [[#4-adr-003--divisors-stored-in-database|ADR-003 — Divisors Stored in Database]]&lt;br /&gt;
# [[#5-adr-004--gixsql-as-sql-pre-processor|ADR-004 — GixSQL as SQL Pre-Processor]]&lt;br /&gt;
# [[#6-adr-005--copybooks-as-interface-contracts|ADR-005 — Copybooks as Interface Contracts]]&lt;br /&gt;
# [[#7-adr-006--hard-coded-database-credentials|ADR-006 — Hard-Coded Database Credentials]]&lt;br /&gt;
# [[#8-adr-007--no-explicit-commit-on-insert|ADR-007 — No Explicit COMMIT on INSERT]]&lt;br /&gt;
# [[#9-adr-008--odd-only-sieve-starting-at-3|ADR-008 — Odd-Only Sieve Starting at 3]]&lt;br /&gt;
# [[#10-open-issues|Open Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;purpose-and-format&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Purpose and Format ==&lt;br /&gt;
&lt;br /&gt;
An Architecture Decision Record (ADR) captures a single significant design decision: the context that prompted it, the options that were considered, the choice that was made, and the consequences. ADRs are written once and never deleted — if a decision is reversed, a new ADR documents the reversal and links to the original.&lt;br /&gt;
&lt;br /&gt;
This document follows the &#039;&#039;&#039;MADR (Markdown Architectural Decision Records)&#039;&#039;&#039; format, a widely adopted lightweight standard (see &amp;lt;code&amp;gt;https://adr.github.io/madr/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-template&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ADR template ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;markdown&amp;quot;&amp;gt;## N. ADR-NNN — &amp;amp;lt;Short title of the decision&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
**Date:** YYYY-MM-DD  &lt;br /&gt;
**Status:** Proposed | Accepted | Deprecated | Superseded by ADR-NNN  &lt;br /&gt;
**Deciders:** &amp;amp;lt;names or roles&amp;amp;gt;  &lt;br /&gt;
**Source:** [CONFIRMED] | [INFERRED from source] | [ASSUMED]&lt;br /&gt;
&lt;br /&gt;
### Context&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;What situation or problem prompted this decision? What forces are at play?&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Decision Drivers&lt;br /&gt;
&lt;br /&gt;
- &amp;amp;lt;driver 1&amp;amp;gt;&lt;br /&gt;
- &amp;amp;lt;driver 2&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Options Considered&lt;br /&gt;
&lt;br /&gt;
| Option | Description | Pros | Cons |&lt;br /&gt;
|--------|-------------|------|------|&lt;br /&gt;
| A | ... | ... | ... |&lt;br /&gt;
| B | ... | ... | ... |&lt;br /&gt;
&lt;br /&gt;
### Decision&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;The option chosen and a one-line justification.&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Consequences&lt;br /&gt;
&lt;br /&gt;
**Positive:**&lt;br /&gt;
- &amp;amp;lt;benefit 1&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
**Negative / trade-offs:**&lt;br /&gt;
- &amp;amp;lt;drawback 1&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
**Risks:**&lt;br /&gt;
- &amp;amp;lt;risk 1&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Compliance check&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;How to verify this decision is being followed in the codebase.&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-001-three-tier-architecture&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. ADR-001 — Three-Tier Architecture ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Deciders:&#039;&#039;&#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; [INFERRED from source structure]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
A batch COBOL program could be written as a single monolithic program with all logic, SQL, and output in one place. This project chose to separate concerns into distinct compiled units.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-drivers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision Drivers ===&lt;br /&gt;
&lt;br /&gt;
* Demonstrate a maintainable, layered COBOL design pattern.&lt;br /&gt;
* Allow each tier to be tested, replaced, or modified independently.&lt;br /&gt;
* Keep SQL in one place so that database changes affect only one program.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;options-considered&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Options Considered ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;24%&amp;quot;| Option&lt;br /&gt;
!width=&amp;quot;39%&amp;quot;| Description&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Pros&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Cons&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| Single monolithic program&lt;br /&gt;
| Simple; one file to manage&lt;br /&gt;
| Hard to test; all concerns coupled&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| Three-tier (chosen)&lt;br /&gt;
| Separation of concerns; independently testable tiers&lt;br /&gt;
| More files; inter-program calling overhead&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| Two-tier (no UI layer)&lt;br /&gt;
| Simpler than three&lt;br /&gt;
| Print formatting coupled to business logic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Option B — three-tier (presentation / business logic / data access), each as a separate compiled COBOL program. A fourth orchestrating program (&amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt;) manages the session lifecycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Positive:&#039;&#039;&#039; - SQL is isolated in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;; database changes do not affect other programs. - Print formatting is isolated in &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;; output format changes do not affect logic. - Each program can be called from a test harness independently.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Negative / trade-offs:&#039;&#039;&#039; - Four programs must be compiled and linked instead of one. - Inter-program calls carry a small runtime overhead. - A shared copybook change requires recompiling all programs that use it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;grep -l &amp;amp;quot;EXEC SQL&amp;amp;quot; *.cbl&amp;lt;/code&amp;gt; should return only &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;grep -l &amp;amp;quot;OPEN.*fprinter\|WRITE.*file-buffer&amp;amp;quot; *.cbl&amp;lt;/code&amp;gt; should return only &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-002-method-dispatch-pattern&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. ADR-002 — Method-Dispatch Pattern ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Deciders:&#039;&#039;&#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; [INFERRED from copybook design]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
COBOL does not have objects, interfaces, or function pointers in the traditional sense. When a caller invokes a subprogram, it can either call different entry points (ENTRY paragraphs) or pass a discriminator value and let the callee dispatch internally. The design must allow each subprogram to expose multiple operations without multiple entry points.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-drivers-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision Drivers ===&lt;br /&gt;
&lt;br /&gt;
* Keep the inter-tier interface to a single &amp;lt;code&amp;gt;CALL&amp;lt;/code&amp;gt; statement per tier.&lt;br /&gt;
* Allow new operations to be added to a tier without changing the caller’s CALL syntax.&lt;br /&gt;
* Use a pattern that is idiomatic in COBOL and familiar to COBOL programmers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;options-considered-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Options Considered ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;24%&amp;quot;| Option&lt;br /&gt;
!width=&amp;quot;39%&amp;quot;| Description&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Pros&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Cons&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| Separate CALL per operation (&amp;lt;code&amp;gt;CALL &amp;amp;quot;primes-connect&amp;amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CALL &amp;amp;quot;primes-fetch&amp;amp;quot;&amp;lt;/code&amp;gt; …)&lt;br /&gt;
| Explicit; no dispatch overhead&lt;br /&gt;
| Many CALL statements; callers must know all entry names&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| ENTRY paragraph per operation (single program, multiple named entries)&lt;br /&gt;
| Standard COBOL; compiler-enforced&lt;br /&gt;
| Callers must still reference entry names; no single interface point&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| Method-dispatch over a control block (chosen)&lt;br /&gt;
| Single CALL; extensible; copybook is the interface contract&lt;br /&gt;
| Verb strings must be kept in sync between copybooks and EVALUATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Option C — a string verb in a copybook field (&amp;lt;code&amp;gt;dal-methods&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ui-methods&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;methods&amp;lt;/code&amp;gt;) drives an &amp;lt;code&amp;gt;EVALUATE TRUE&amp;lt;/code&amp;gt; inside the called program. The copybook is the published interface; the 88-level conditions make the valid verbs self-documenting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Positive:&#039;&#039;&#039; - Adding a new operation requires only: a new 88-level condition in the copybook and a new &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; clause in the callee. - The caller’s CALL statement never changes. - The copybook 88-levels serve as the API documentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Negative / trade-offs:&#039;&#039;&#039; - Verb strings are not type-checked at compile time; a misspelled verb silently falls through to the &amp;lt;code&amp;gt;WHEN OTHER&amp;lt;/code&amp;gt; error branch. - Result codes (0/1/9/99) are numeric constants, not named conditions at the caller site — callers must remember the convention.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Risks:&#039;&#039;&#039; - Verb string drift: if a verb is renamed in the copybook but not in the callee’s EVALUATE, the operation silently does nothing and returns result 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
Every verb listed in a &amp;lt;code&amp;gt;dal-methods&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ui-methods&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;methods&amp;lt;/code&amp;gt; 88-level must have a corresponding &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; clause in the callee’s EVALUATE. Verify with a diff of copybook 88-values against callee WHEN values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-003-divisors-stored-in-database&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. ADR-003 — Divisors Stored in Database ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Deciders:&#039;&#039;&#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; [INFERRED from algorithm and SQL design]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
The trial-division sieve needs a list of previously found primes to use as divisors. These could be held in a COBOL working-storage table (an array), in a flat file, or in the database.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-drivers-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision Drivers ===&lt;br /&gt;
&lt;br /&gt;
* Demonstrate database interaction as part of the algorithm (pedagogical goal).&lt;br /&gt;
* Keep the COBOL working-storage footprint small — avoid a large in-memory prime array.&lt;br /&gt;
* Persist divisors so the report can run independently of the generation run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;options-considered-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Options Considered ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;24%&amp;quot;| Option&lt;br /&gt;
!width=&amp;quot;39%&amp;quot;| Description&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Pros&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Cons&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| In-memory COBOL table&lt;br /&gt;
| Fastest; no I/O&lt;br /&gt;
| Fixed size; lost between runs; defeats the DB demonstration goal&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| Flat file&lt;br /&gt;
| Persistent; simple&lt;br /&gt;
| Requires file I/O; not the DB demonstration goal&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| Database (chosen)&lt;br /&gt;
| Persistent; demonstrates DB use; divisors and output in same store&lt;br /&gt;
| One SQL query per trial division step — potentially very slow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Option C — each divisor is fetched from the &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; table by ident using a point SELECT. Generated primes accumulate in the same table as the divisors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Positive:&#039;&#039;&#039; - Demonstrates the full three-tier pattern end-to-end. - All state is in the database; generation can be interrupted and (in principle) resumed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Negative / trade-offs:&#039;&#039;&#039; - Performance is heavily dependent on the &amp;lt;code&amp;gt;SELECT prime WHERE ident = :n&amp;lt;/code&amp;gt; query. Without an index on &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt;, this becomes a sequential scan that gets slower as the table grows. - The design requires prime 2 to be pre-seeded in the table before the algorithm starts, since the first divider fetch assumes ident=2 exists.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Risks:&#039;&#039;&#039; - No index on &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; is defined in &amp;lt;code&amp;gt;primes_schema.sql&amp;lt;/code&amp;gt; (see NFR-PERF-03). This is the most significant performance risk in the system.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;\d primes.primes&amp;lt;/code&amp;gt; in psql; verify an index on &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; is present. If absent, add: &amp;lt;code&amp;gt;CREATE INDEX idx_primes_ident ON primes.primes (ident);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-004-gixsql-as-sql-pre-processor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. ADR-004 — GixSQL as SQL Pre-Processor ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Deciders:&#039;&#039;&#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; [CONFIRMED — explicit in compiler listing header and DATASRC prefix &amp;lt;code&amp;gt;pgsql://&amp;lt;/code&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
GnuCOBOL does not natively support embedded SQL. An external pre-processor is needed to translate &amp;lt;code&amp;gt;EXEC SQL … END-EXEC&amp;lt;/code&amp;gt; blocks into COBOL CALL statements to a SQL runtime library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-drivers-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision Drivers ===&lt;br /&gt;
&lt;br /&gt;
* Open-source toolchain (no licensing cost).&lt;br /&gt;
* PostgreSQL support.&lt;br /&gt;
* Compatible with GnuCOBOL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;options-considered-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Options Considered ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;38%&amp;quot;| Option&lt;br /&gt;
!width=&amp;quot;61%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| ESQL/C bridge&lt;br /&gt;
| Write SQL in C, call from COBOL — complex&lt;br /&gt;
|-&lt;br /&gt;
| OCESQL&lt;br /&gt;
| Another open-source COBOL SQL pre-processor — less PostgreSQL-specific&lt;br /&gt;
|-&lt;br /&gt;
| GixSQL (chosen)&lt;br /&gt;
| Open-source; PostgreSQL-optimised; active development&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
GixSQL — translates EXEC SQL to &amp;lt;code&amp;gt;GIXSQLExec&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GIXSQLConnect&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GIXSQLConnectReset&amp;lt;/code&amp;gt; calls. Connection string prefix &amp;lt;code&amp;gt;pgsql://&amp;lt;/code&amp;gt; is GixSQL-specific.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Positive:&#039;&#039;&#039; - Standard embedded SQL syntax in COBOL source. - PostgreSQL-native driver.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Negative / trade-offs:&#039;&#039;&#039; - GixSQL-specific connection string prefix (&amp;lt;code&amp;gt;pgsql://&amp;lt;/code&amp;gt;) and runtime library are not portable to other COBOL SQL pre-processors. - GixSQL is not part of the GnuCOBOL distribution; must be installed separately.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
All SQL pre-processing must be done through GixSQL. Verify no raw &amp;lt;code&amp;gt;CALL &amp;amp;quot;GIXSQLExec&amp;amp;quot;&amp;lt;/code&amp;gt; statements appear in handwritten source (only in generated &amp;lt;code&amp;gt;.out&amp;lt;/code&amp;gt; files).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-005-copybooks-as-interface-contracts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. ADR-005 — Copybooks as Interface Contracts ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Deciders:&#039;&#039;&#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; [INFERRED from copybook design]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
In a multi-program COBOL system, data shared between programs can be defined redundantly in each program’s WORKING-STORAGE, or defined once in a copybook included by all parties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Define each tier’s control block once in a copybook (&amp;lt;code&amp;gt;primes-session.cpy&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primes-dal.cpy&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primes-ui.cpy&amp;lt;/code&amp;gt;) and COPY it into both the caller’s WORKING-STORAGE and the callee’s LINKAGE SECTION. The copybook is the published interface; changing it is a breaking change affecting all users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Positive:&#039;&#039;&#039; - Single source of truth for each interface. - Field layout guaranteed to match between caller and callee.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Negative / trade-offs:&#039;&#039;&#039; - Any field size change in a copybook requires recompiling every program that includes it. - Two nearly-identical host-variable copybooks exist (&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;) — the canonical version must be designated and the other retired.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;grep -r &amp;amp;quot;COPY primes-dal&amp;amp;quot; *.cbl&amp;lt;/code&amp;gt; — should list only &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt; (caller) and &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; (callee).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-006-hard-coded-database-credentials&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. ADR-006 — Hard-Coded Database Credentials ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Accepted (as technical debt — see note)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Deciders:&#039;&#039;&#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; [CONFIRMED — visible in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; lines 14–17]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
Database credentials must be provided to the GixSQL CONNECT call. Options include hard-coding, environment variables, a configuration file, or a secrets manager.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Credentials are hard-coded in WORKING-STORAGE of &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; as a pragmatic choice for a demonstration application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;⚠ &#039;&#039;&#039;Technical debt note:&#039;&#039;&#039; This decision is explicitly acknowledged as a security defect (NFR-SEC-01). It is documented here so that the decision is visible and the remediation can be tracked. It must not be carried forward to a production deployment.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;recommended-remediation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Recommended remediation ===&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;DBUSR&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DBPWD&amp;lt;/code&amp;gt; VALUE clauses with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;ACCEPT DBUSR FROM ENVIRONMENT &amp;quot;PRIMES_DB_USER&amp;quot;&lt;br /&gt;
ACCEPT DBPWD FROM ENVIRONMENT &amp;quot;PRIMES_DB_PASS&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or read from a protected configuration file at startup.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Negative:&#039;&#039;&#039; - Credential rotation requires recompilation and redeployment. - Credentials are visible in the binary and in any version-control history. - Violates NFR-SEC-01 and OWASP Secure Coding Practice #3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-007-no-explicit-commit-on-insert&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 8. ADR-007 — No Explicit COMMIT on INSERT ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Accepted (status uncertain — see note)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Deciders:&#039;&#039;&#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; [INFERRED — COMMIT statement is commented out in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; r83-write-prime]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-6&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
The INSERT in &amp;lt;code&amp;gt;r83-write-prime&amp;lt;/code&amp;gt; does not issue an explicit COMMIT. The commented-out COMMIT suggests this was a deliberate choice or a deferred decision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-6&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Rely on PostgreSQL’s default auto-commit behaviour for individual INSERT statements outside an explicit transaction. The COMMIT is not needed because each INSERT auto-commits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;⚠ &#039;&#039;&#039;Note:&#039;&#039;&#039; The report path opens an explicit transaction (&amp;lt;code&amp;gt;START TRANSACTION&amp;lt;/code&amp;gt;) via &amp;lt;code&amp;gt;s01-cursor&amp;lt;/code&amp;gt;. If the generate path is ever run while a transaction is open (e.g. if the session management is changed), the INSERTs will not auto-commit. This is a latent risk.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-6&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Positive:&#039;&#039;&#039; - Simpler code; no COMMIT overhead per row.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Risks:&#039;&#039;&#039; - If a transaction is ever opened on the &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; connection before &amp;lt;code&amp;gt;r83-write-prime&amp;lt;/code&amp;gt;, the INSERTs will not be committed until an explicit COMMIT or ROLLBACK, and data will be lost on failure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-008-odd-only-sieve-starting-at-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 9. ADR-008 — Odd-Only Sieve Starting at 3 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Date:&#039;&#039;&#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Deciders:&#039;&#039;&#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; [CONFIRMED — ADD 2 TO test-number in r82-next-test-number; initial value 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
The sieve must test whether each integer is prime. Testing every integer (2, 3, 4, 5 …) is correct but wasteful: all even numbers greater than 2 are composite and need not be tested.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Start the candidate at 3 and advance by 2 (ADD 2 TO test-number), testing only odd integers. Prime 2 is handled as a manual seed rather than by the algorithm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Positive:&#039;&#039;&#039; - Roughly halves the number of candidates that must be tested, improving performance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Negative / trade-offs:&#039;&#039;&#039; - Prime 2 must be manually seeded in the database before the algorithm runs (see Assumption A-01). This is an external dependency on an operational step, not a code-enforced constraint.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check-5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
Verify &amp;lt;code&amp;gt;test-number&amp;lt;/code&amp;gt; is initialised to 3 (odd) and that only &amp;lt;code&amp;gt;ADD 2 TO test-number&amp;lt;/code&amp;gt; (never ADD 1) advances the candidate in &amp;lt;code&amp;gt;r82-next-test-number&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 10. Open Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Issue&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Target&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| OI-01&lt;br /&gt;
| All ADRs marked [INFERRED] need confirmation from original developer&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-02&lt;br /&gt;
| ADR-006 remediation (credentials) has no target date&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-03&lt;br /&gt;
| ADR-007 (no COMMIT) — confirm the intent is auto-commit, not an oversight&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-04&lt;br /&gt;
| Duplicate copybooks (ADR-005) — designate canonical version and retire the other&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Design standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4755</id>
		<title>Design standards</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4755"/>
		<updated>2026-03-25T15:33:49Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Index of Document Engineering and System Requirements =&lt;br /&gt;
&lt;br /&gt;
# [[Document Engineering]]&lt;br /&gt;
# [[Scope and applicability]]&lt;br /&gt;
# [[Assumptions and Dependencies]]&lt;br /&gt;
# [[Architecture decision records]]&lt;br /&gt;
# [[Non-Functional Requirements]]&lt;br /&gt;
# [[Test Traceability Matrix]]&lt;br /&gt;
# [[Naming and Coding Standards]]&lt;br /&gt;
# [[Business Requirement Document]]&lt;br /&gt;
== Cross-Document References]]&lt;br /&gt;
; Document ID | Title | Relationship&lt;br /&gt;
|---|---|---&lt;br /&gt;
| PGCBL-SAD-001 | Scope and Applicability | Navigation Guide&lt;br /&gt;
| PGCBL-NFR-001 | Non-Functional Requirements | Quality Attributes Complement&lt;br /&gt;
| PGCBL-TSD-001 | Technical Specification | Implementation Details&lt;br /&gt;
| PGCBL-TTM-001 | Test Traceability Matrix | Test Case Mapping&lt;br /&gt;
| PGCBL-ADD-001 | Architecture Decision Records | Design Documentation&lt;br /&gt;
&lt;br /&gt;
This index provides a structured overview of the document set, facilitating easy navigation and understanding of the interrelated components.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Test_Traceability_Matrix&amp;diff=4754</id>
		<title>Test Traceability Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Test_Traceability_Matrix&amp;diff=4754"/>
		<updated>2026-03-25T15:31:54Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;test-traceability-matrix&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Test Traceability Matrix =  {| !width=&amp;quot;23%&amp;quot;| Field !width=&amp;quot;76%&amp;quot;| Value |- | Document ID | PGCBL-TTM-001 |- | Document Type | Test Traceability Matrix |- | System | pgcobol — Prime Numbers Application v1.0 |- | Version | 1.0 |- | Status | Draft — test cases not yet written; matrix is a planning skeleton |- | Owner | QA Lead / Lead Developer |- | Author | [derived from PGCBL-BRD-001 and PGCBL-NFR-001] |- | Created | 2026-03...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;test-traceability-matrix&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Test Traceability Matrix =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;76%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Document ID&lt;br /&gt;
| PGCBL-TTM-001&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Test Traceability Matrix&lt;br /&gt;
|-&lt;br /&gt;
| System&lt;br /&gt;
| pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
|-&lt;br /&gt;
| Version&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Draft — test cases not yet written; matrix is a planning skeleton&lt;br /&gt;
|-&lt;br /&gt;
| Owner&lt;br /&gt;
| QA Lead / Lead Developer&lt;br /&gt;
|-&lt;br /&gt;
| Author&lt;br /&gt;
| [derived from PGCBL-BRD-001 and PGCBL-NFR-001]&lt;br /&gt;
|-&lt;br /&gt;
| Created&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Last modified&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Classification&lt;br /&gt;
| Internal&lt;br /&gt;
|-&lt;br /&gt;
| Parent document&lt;br /&gt;
| PGCBL-BRD-001, PGCBL-NFR-001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;version-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Version&lt;br /&gt;
! Date&lt;br /&gt;
! Author&lt;br /&gt;
! Status&lt;br /&gt;
! Change Summary&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Draft&lt;br /&gt;
| Planning skeleton&lt;br /&gt;
|}&lt;br /&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-purpose-and-how-to-use-this-matrix|Purpose and How to Use This Matrix]]&lt;br /&gt;
# [[#2-test-levels-and-types|Test Levels and Types]]&lt;br /&gt;
# [[#3-requirements-coverage-matrix|Requirements Coverage Matrix]]&lt;br /&gt;
# [[#4-test-case-catalogue|Test Case Catalogue]]&lt;br /&gt;
# [[#5-defect-traceability|Defect Traceability]]&lt;br /&gt;
# [[#6-coverage-summary|Coverage Summary]]&lt;br /&gt;
# [[#7-open-issues|Open Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;purpose-and-how-to-use-this-matrix&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Purpose and How to Use This Matrix ==&lt;br /&gt;
&lt;br /&gt;
A Test Traceability Matrix (TTM) provides bidirectional traceability between:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Business Requirement  ←→  Design Element  ←→  Test Case  ←→  Test Result&amp;lt;/pre&amp;gt;&lt;br /&gt;
It answers two critical questions:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Completeness:&#039;&#039;&#039; Is every requirement covered by at least one test? (forward trace)&lt;br /&gt;
# &#039;&#039;&#039;Necessity:&#039;&#039;&#039; Does every test correspond to a requirement? (backward trace — prevents test bloat)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;status-values-used-in-this-document&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Status values used in this document ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Status&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Planned&amp;lt;/code&amp;gt;&lt;br /&gt;
| Test case defined; not yet implemented&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Implemented&amp;lt;/code&amp;gt;&lt;br /&gt;
| Test case exists in the test suite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Passed&amp;lt;/code&amp;gt;&lt;br /&gt;
| Test executed and passed in the latest run&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Failed&amp;lt;/code&amp;gt;&lt;br /&gt;
| Test executed and failed in the latest run&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Blocked&amp;lt;/code&amp;gt;&lt;br /&gt;
| Cannot be run due to an open defect or missing dependency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N/A&amp;lt;/code&amp;gt;&lt;br /&gt;
| Not applicable to this version&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;test-case-id-scheme&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Test case ID scheme ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;TC-&amp;amp;lt;LEVEL&amp;amp;gt;-&amp;amp;lt;NNN&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
LEVEL:&lt;br /&gt;
  UT   Unit test  (single program in isolation)&lt;br /&gt;
  IT   Integration test (two or more programs together)&lt;br /&gt;
  ST   System test (full end-to-end)&lt;br /&gt;
  NFT  Non-functional test (performance, security, etc.)&lt;br /&gt;
&lt;br /&gt;
NNN: zero-padded sequence&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
  TC-UT-001   Unit test #1&lt;br /&gt;
  TC-ST-001   System test #1&lt;br /&gt;
  TC-NFT-001  Non-functional test #1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;test-levels-and-types&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Test Levels and Types ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;unit-tests-ut&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.1 Unit tests (UT) ===&lt;br /&gt;
&lt;br /&gt;
Test a single COBOL program in isolation using a synthetic control block. No real database or print file is required; stubs or mocks may be used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Target programs:&#039;&#039;&#039; primesgen (sieve logic), primes (SQL operations), primesui (print formatting)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;integration-tests-it&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.2 Integration tests (IT) ===&lt;br /&gt;
&lt;br /&gt;
Test two or more programs working together. Typically: primesgen + primes (with a real database), or primesgen + primesui (with a real print file).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-tests-st&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.3 System tests (ST) ===&lt;br /&gt;
&lt;br /&gt;
Test the complete stack end-to-end: compile all programs, set up the database, run primesmain with a command-line argument, inspect all outputs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;non-functional-tests-nft&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.4 Non-functional tests (NFT) ===&lt;br /&gt;
&lt;br /&gt;
Test quality attributes: performance, security (credential exposure), operability (return code, log completeness).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;requirements-coverage-matrix&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Requirements Coverage Matrix ==&lt;br /&gt;
&lt;br /&gt;
Each row is a requirement. Each column is a test case. A cell contains &amp;lt;code&amp;gt;✓&amp;lt;/code&amp;gt; if the test covers that requirement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;functional-requirements-from-pgcbl-brd-001&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Functional Requirements (from PGCBL-BRD-001) ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;5%&amp;quot;| Req ID&lt;br /&gt;
!width=&amp;quot;14%&amp;quot;| Requirement summary&lt;br /&gt;
!width=&amp;quot;7%&amp;quot;| TC-UT-001&lt;br /&gt;
!width=&amp;quot;7%&amp;quot;| TC-UT-002&lt;br /&gt;
!width=&amp;quot;7%&amp;quot;| TC-UT-003&lt;br /&gt;
!width=&amp;quot;7%&amp;quot;| TC-UT-004&lt;br /&gt;
!width=&amp;quot;7%&amp;quot;| TC-UT-005&lt;br /&gt;
!width=&amp;quot;7%&amp;quot;| TC-IT-001&lt;br /&gt;
!width=&amp;quot;7%&amp;quot;| TC-IT-002&lt;br /&gt;
!width=&amp;quot;7%&amp;quot;| TC-ST-001&lt;br /&gt;
!width=&amp;quot;7%&amp;quot;| TC-ST-002&lt;br /&gt;
!width=&amp;quot;7%&amp;quot;| TC-ST-003&lt;br /&gt;
!width=&amp;quot;6%&amp;quot;| Coverage&lt;br /&gt;
|-&lt;br /&gt;
| FR-01&lt;br /&gt;
| Prime generation (generate arg)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| FR-02&lt;br /&gt;
| Trial-division algorithm correctness&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| FR-03&lt;br /&gt;
| Prime reporting (report arg)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| FR-04&lt;br /&gt;
| Print report format (6/line, heading, footing)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| FR-05&lt;br /&gt;
| Console logging&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| FR-06&lt;br /&gt;
| Error handling — bad arg&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| FR-06&lt;br /&gt;
| Error handling — DB connect failure&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| FR-06&lt;br /&gt;
| Error handling — print file cannot open&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;non-functional-requirements-from-pgcbl-nfr-001&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 Non-Functional Requirements (from PGCBL-NFR-001) ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;8%&amp;quot;| Req ID&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Requirement summary&lt;br /&gt;
!width=&amp;quot;12%&amp;quot;| TC-NFT-001&lt;br /&gt;
!width=&amp;quot;12%&amp;quot;| TC-NFT-002&lt;br /&gt;
!width=&amp;quot;12%&amp;quot;| TC-NFT-003&lt;br /&gt;
!width=&amp;quot;12%&amp;quot;| TC-NFT-004&lt;br /&gt;
!width=&amp;quot;12%&amp;quot;| TC-NFT-005&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Coverage&lt;br /&gt;
|-&lt;br /&gt;
| NFR-PERF-01&lt;br /&gt;
| Generation throughput ≥ 1,000/sec&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| NFR-PERF-03&lt;br /&gt;
| Divider lookup &amp;amp;lt; 50 ms&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| NFR-REL-01&lt;br /&gt;
| Batch completes without intervention&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| TC-ST-001/002 cover this&lt;br /&gt;
|-&lt;br /&gt;
| NFR-REL-02&lt;br /&gt;
| Graceful DB failure&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| NFR-SEC-01&lt;br /&gt;
| No hard-coded credentials&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
|&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| NFR-OPER-02&lt;br /&gt;
| Non-zero return code on failure&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ✓&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;test-case-catalogue&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Test Case Catalogue ==&lt;br /&gt;
&lt;br /&gt;
Each test case below is a planning entry. Fields marked &amp;lt;code&amp;gt;[TBD]&amp;lt;/code&amp;gt; must be completed when the test is implemented.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tc-ut-001-sieve-known-prime-confirmation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-UT-001 — Sieve: known prime confirmation ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-UT-001&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Unit&lt;br /&gt;
|-&lt;br /&gt;
| Program under test&lt;br /&gt;
| primesgen (r80-test-number logic)&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| FR-02&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Verify that known prime numbers are correctly identified.&lt;br /&gt;
|-&lt;br /&gt;
| Pre-conditions&lt;br /&gt;
| A test harness that can call primesgen with a synthetic primes-session and a stub primes DAL returning pre-set dividers. Prime 2 pre-seeded in stub.&lt;br /&gt;
|-&lt;br /&gt;
| Test data&lt;br /&gt;
| Candidates: 3, 5, 7, 11, 13, 17, 19 (all prime). Stub DAL returns pre-calculated divisors.&lt;br /&gt;
|-&lt;br /&gt;
| Expected result&lt;br /&gt;
| Each candidate is written (r85-write-prime called) exactly once for each prime. No composite candidate is written.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| Defects linked&lt;br /&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;tc-ut-002-sieve-known-composite-rejection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-UT-002 — Sieve: known composite rejection ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-UT-002&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Unit&lt;br /&gt;
|-&lt;br /&gt;
| Program under test&lt;br /&gt;
| primesgen&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| FR-02&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Verify that known composite numbers are not written as primes.&lt;br /&gt;
|-&lt;br /&gt;
| Pre-conditions&lt;br /&gt;
| Same harness as TC-UT-001.&lt;br /&gt;
|-&lt;br /&gt;
| Test data&lt;br /&gt;
| Candidates: 4, 6, 8, 9, 10, 15, 21, 25, 49.&lt;br /&gt;
|-&lt;br /&gt;
| Expected result&lt;br /&gt;
| r85-write-prime is never called for any of these candidates.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| Defects linked&lt;br /&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;tc-ut-003-ui-six-per-line-accumulation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-UT-003 — UI: six-per-line accumulation ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-UT-003&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Unit&lt;br /&gt;
|-&lt;br /&gt;
| Program under test&lt;br /&gt;
| primesui&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| FR-04&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Verify that exactly 6 prime entries are accumulated before a line is written to the print file.&lt;br /&gt;
|-&lt;br /&gt;
| Pre-conditions&lt;br /&gt;
| Call primesui with ui-methods=“start”; then call with ui-methods=“write” seven times. Inspect file after calls 6 and 7.&lt;br /&gt;
|-&lt;br /&gt;
| Test data&lt;br /&gt;
| u-sequence = 1–7; u-number = 2, 3, 5, 7, 11, 13, 17.&lt;br /&gt;
|-&lt;br /&gt;
| Expected result&lt;br /&gt;
| One line written after 6th entry. File buffer reset. 7th entry starts a new accumulation cycle.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| Defects linked&lt;br /&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;tc-ut-004-ui-print-file-cannot-be-opened&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-UT-004 — UI: print file cannot be opened ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-UT-004&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Unit&lt;br /&gt;
|-&lt;br /&gt;
| Program under test&lt;br /&gt;
| primesui&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| FR-06&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Verify that primesui returns ui-method-result = 1 when the print file cannot be created (e.g. directory is read-only).&lt;br /&gt;
|-&lt;br /&gt;
| Pre-conditions&lt;br /&gt;
| Set up a read-only target directory so &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; cannot be created.&lt;br /&gt;
|-&lt;br /&gt;
| Test data&lt;br /&gt;
| Call primesui with ui-methods=“start”.&lt;br /&gt;
|-&lt;br /&gt;
| Expected result&lt;br /&gt;
| ui-method-result = 1; error status displayed on console; no abort/crash.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| Defects linked&lt;br /&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;tc-ut-005-dal-database-connection-failure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-UT-005 — DAL: database connection failure ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-UT-005&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Unit&lt;br /&gt;
|-&lt;br /&gt;
| Program under test&lt;br /&gt;
| primes (DAL)&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| FR-06&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Verify that primes returns dal-result = 1 and logs a message when the database is unreachable.&lt;br /&gt;
|-&lt;br /&gt;
| Pre-conditions&lt;br /&gt;
| PostgreSQL not running, or DATASRC points to an invalid host.&lt;br /&gt;
|-&lt;br /&gt;
| Test data&lt;br /&gt;
| CALL primes USING primes-dal with dal-methods=“connect”.&lt;br /&gt;
|-&lt;br /&gt;
| Expected result&lt;br /&gt;
| dal-result = 1; SQLCODE ≠ 0; error message on console; no crash.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| Defects linked&lt;br /&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;tc-it-001-generation-integration-first-100-primes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-IT-001 — Generation integration: first 100 primes ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-IT-001&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Integration&lt;br /&gt;
|-&lt;br /&gt;
| Programs under test&lt;br /&gt;
| primesgen + primes (DAL)&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| FR-01, FR-02&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Run the full generate path for the first 100 primes (up to 541). Verify correctness of results in the database.&lt;br /&gt;
|-&lt;br /&gt;
| Pre-conditions&lt;br /&gt;
| Database reset (&amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt;). Prime 2 manually inserted. PostgreSQL running. primesui replaced with a stub that accepts “write” calls silently.&lt;br /&gt;
|-&lt;br /&gt;
| Test data&lt;br /&gt;
| Generate until test-number &amp;amp;gt; 541.&lt;br /&gt;
|-&lt;br /&gt;
| Expected result&lt;br /&gt;
| &amp;lt;code&amp;gt;SELECT prime FROM primes.primes ORDER BY ident&amp;lt;/code&amp;gt; returns exactly the first 100 primes: 2, 3, 5, 7, 11, … 541.&lt;br /&gt;
|-&lt;br /&gt;
| Pass criteria&lt;br /&gt;
| 100 rows; each row is a known prime; no duplicates; sequence matches insertion order.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| Defects linked&lt;br /&gt;
| D-01 (generate loop commented out in primesmain — this test bypasses primesmain and calls primesgen directly)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tc-it-002-report-integration-all-primes-from-database&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-IT-002 — Report integration: all primes from database ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-IT-002&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Integration&lt;br /&gt;
|-&lt;br /&gt;
| Programs under test&lt;br /&gt;
| primesgen + primes (DAL) + primesui&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| FR-03, FR-04&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Seed 12 known primes in the database; run the report path; inspect &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Pre-conditions&lt;br /&gt;
| Database reset. Insert the first 12 primes (2 through 37) manually.&lt;br /&gt;
|-&lt;br /&gt;
| Test data&lt;br /&gt;
| 12 primes → 2 data lines (6 per line); should produce one page with heading, 2 data lines, footing.&lt;br /&gt;
|-&lt;br /&gt;
| Expected result&lt;br /&gt;
| &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; contains: heading line, column header line, data line 1 (primes 2–13), data line 2 (primes 17–37), footing line with page 1.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| Defects linked&lt;br /&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;tc-st-001-system-test-full-generate-run-first-1000-primes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-ST-001 — System test: full generate run (first 1,000 primes) ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-ST-001&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| System&lt;br /&gt;
|-&lt;br /&gt;
| Programs under test&lt;br /&gt;
| All (primesmain → primesgen → primes + primesui)&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| FR-01, FR-02, FR-05&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Full end-to-end generate run via &amp;lt;code&amp;gt;primesmain generate&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Pre-conditions&lt;br /&gt;
| All programs compiled and linked. Database reset. Prime 2 seeded. Fix for D-01 (generate loop) applied or tested separately.&lt;br /&gt;
|-&lt;br /&gt;
| Expected result&lt;br /&gt;
| Database contains the first 1,000 primes (2 through 7,919). Console log shows all lifecycle messages. Process exits without crash.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Blocked — D-01 (generate loop commented out)&lt;br /&gt;
|-&lt;br /&gt;
| Defects linked&lt;br /&gt;
| D-01&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tc-st-002-system-test-full-report-run&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-ST-002 — System test: full report run ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-ST-002&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| System&lt;br /&gt;
|-&lt;br /&gt;
| Programs under test&lt;br /&gt;
| All (primesmain → primesgen → primes + primesui)&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| FR-03, FR-04, FR-05&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Full end-to-end report run via &amp;lt;code&amp;gt;primesmain report&amp;lt;/code&amp;gt; after TC-ST-001 has populated the database.&lt;br /&gt;
|-&lt;br /&gt;
| Pre-conditions&lt;br /&gt;
| TC-ST-001 has run successfully; database contains at least 1,000 primes.&lt;br /&gt;
|-&lt;br /&gt;
| Expected result&lt;br /&gt;
| &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; contains all primes in order; correct page headings and footings; last page flushed correctly.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| Defects linked&lt;br /&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;tc-st-003-system-test-bad-command-line-argument&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-ST-003 — System test: bad command-line argument ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-ST-003&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| System&lt;br /&gt;
|-&lt;br /&gt;
| Programs under test&lt;br /&gt;
| primesmain&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| FR-06&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Run &amp;lt;code&amp;gt;primesmain badarg&amp;lt;/code&amp;gt;; verify graceful exit.&lt;br /&gt;
|-&lt;br /&gt;
| Pre-conditions&lt;br /&gt;
| All programs compiled.&lt;br /&gt;
|-&lt;br /&gt;
| Expected result&lt;br /&gt;
| Console message “Bad parameter, program initialisation failed.” Process exits. No database connection attempted.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned&lt;br /&gt;
|-&lt;br /&gt;
| Defects linked&lt;br /&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;tc-nft-001-performance-generation-throughput&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-NFT-001 — Performance: generation throughput ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-NFT-001&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Non-functional&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| NFR-PERF-01&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Time the generation of the first 10,000 primes; calculate primes-per-second.&lt;br /&gt;
|-&lt;br /&gt;
| Pass criteria&lt;br /&gt;
| ≥ 1,000 primes/second.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned — requires D-01 fix and index on &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; (NFR-PERF-03)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tc-nft-002-performance-divider-lookup-query-plan&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-NFT-002 — Performance: divider lookup query plan ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-NFT-002&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Non-functional&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| NFR-PERF-03&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Run EXPLAIN ANALYZE on &amp;lt;code&amp;gt;SELECT prime FROM primes.primes WHERE ident = 500&amp;lt;/code&amp;gt; with 1,000 rows in the table.&lt;br /&gt;
|-&lt;br /&gt;
| Pass criteria&lt;br /&gt;
| Query plan shows Index Scan; execution time &amp;amp;lt; 50 ms.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned — likely to fail until index on &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; is added&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tc-nft-003-reliability-graceful-db-failure-mid-run&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-NFT-003 — Reliability: graceful DB failure mid-run ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-NFT-003&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Non-functional&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| NFR-REL-02&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Kill the PostgreSQL process during a report run; verify clean exit and no zombie connections.&lt;br /&gt;
|-&lt;br /&gt;
| Pass criteria&lt;br /&gt;
| Program logs an error and exits; &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; is closed; no orphan DB connections.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tc-nft-004-security-no-credentials-in-binary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-NFT-004 — Security: no credentials in binary ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-NFT-004&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Non-functional&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| NFR-SEC-01&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Run &amp;lt;code&amp;gt;strings primes&amp;lt;/code&amp;gt; (the compiled binary) and grep for the password string &amp;lt;code&amp;gt;pr1mes_user&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Pass criteria&lt;br /&gt;
| String not found in binary.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned — expected to FAIL until ADR-006 remediation is applied&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tc-nft-005-operability-non-zero-return-code-on-error&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== TC-NFT-005 — Operability: non-zero return code on error ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| ID&lt;br /&gt;
| TC-NFT-005&lt;br /&gt;
|-&lt;br /&gt;
| Level&lt;br /&gt;
| Non-functional&lt;br /&gt;
|-&lt;br /&gt;
| Requirements covered&lt;br /&gt;
| NFR-OPER-02&lt;br /&gt;
|-&lt;br /&gt;
| Description&lt;br /&gt;
| Run &amp;lt;code&amp;gt;primesmain badarg&amp;lt;/code&amp;gt;; check &amp;lt;code&amp;gt;echo $?&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Pass criteria&lt;br /&gt;
| Exit code ≠ 0.&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Planned — expected to FAIL until &amp;lt;code&amp;gt;MOVE 1 TO RETURN-CODE&amp;lt;/code&amp;gt; is added&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;defect-traceability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Defect Traceability ==&lt;br /&gt;
&lt;br /&gt;
Known defects identified during reverse engineering, linked to the test cases that expose them:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Defect ID&lt;br /&gt;
!width=&amp;quot;24%&amp;quot;| Description&lt;br /&gt;
!width=&amp;quot;39%&amp;quot;| Test cases affected&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| D-01&lt;br /&gt;
| Generate loop commented out in primesmain&lt;br /&gt;
| TC-ST-001, TC-NFT-001&lt;br /&gt;
| Open — blocks system-level generation tests&lt;br /&gt;
|-&lt;br /&gt;
| D-02&lt;br /&gt;
| Prime 2 not seeded by algorithm&lt;br /&gt;
| TC-IT-001, TC-ST-001&lt;br /&gt;
| Open — manual pre-step required&lt;br /&gt;
|-&lt;br /&gt;
| D-03&lt;br /&gt;
| Connection alias mismatch (&amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;primesdb&amp;lt;/code&amp;gt;)&lt;br /&gt;
| TC-ST-001, TC-ST-002&lt;br /&gt;
| Open — may cause runtime failure&lt;br /&gt;
|-&lt;br /&gt;
| D-04&lt;br /&gt;
| Hard-coded credentials&lt;br /&gt;
| TC-NFT-004&lt;br /&gt;
| Open — expected test failure&lt;br /&gt;
|-&lt;br /&gt;
| D-05&lt;br /&gt;
| No index on &amp;lt;code&amp;gt;primes.ident&amp;lt;/code&amp;gt;&lt;br /&gt;
| TC-NFT-001, TC-NFT-002&lt;br /&gt;
| Open — performance defect&lt;br /&gt;
|-&lt;br /&gt;
| D-06&lt;br /&gt;
| No process return code on error&lt;br /&gt;
| TC-NFT-005&lt;br /&gt;
| Open — expected test failure&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;coverage-summary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Coverage Summary ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Category&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Total requirements&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Tests planned&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Tests passing&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Coverage %&lt;br /&gt;
|-&lt;br /&gt;
| Functional (FR)&lt;br /&gt;
| 8&lt;br /&gt;
| 8&lt;br /&gt;
| 0&lt;br /&gt;
| 0% (tests not yet run)&lt;br /&gt;
|-&lt;br /&gt;
| Non-functional (NFR)&lt;br /&gt;
| 10&lt;br /&gt;
| 6&lt;br /&gt;
| 0&lt;br /&gt;
| 0%&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Total&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;18&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;14&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
| —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Target before release: 100% functional coverage; 80% non-functional coverage.&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;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Open Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Issue&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Target&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| OI-01&lt;br /&gt;
| D-01 (generate loop) blocks TC-ST-001, TC-NFT-001 — must be fixed before system testing&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-02&lt;br /&gt;
| No test harness / stub exists for any program; unit tests cannot run until stubs are written&lt;br /&gt;
| QA / Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-03&lt;br /&gt;
| TTM coverage for NFR-MAIN (maintainability) NFRs is not yet defined&lt;br /&gt;
| QA&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Design standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Non-Functional_Requirements&amp;diff=4753</id>
		<title>Non-Functional Requirements</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Non-Functional_Requirements&amp;diff=4753"/>
		<updated>2026-03-25T15:30:24Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;non-functional-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Non-Functional Requirements =  {| !width=&amp;quot;23%&amp;quot;| Field !width=&amp;quot;76%&amp;quot;| Value |- | Document ID | PGCBL-NFR-001 |- | Document Type | Non-Functional Requirements |- | System | pgcobol — Prime Numbers Application v1.0 |- | Version | 1.0 |- | Status | Draft — performance and security targets require stakeholder input |- | Owner | Lead Developer / Architect |- | Author | [reverse-engineered; targets are best-practice defaults w...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;non-functional-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Non-Functional Requirements =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;76%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Document ID&lt;br /&gt;
| PGCBL-NFR-001&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Non-Functional Requirements&lt;br /&gt;
|-&lt;br /&gt;
| System&lt;br /&gt;
| pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
|-&lt;br /&gt;
| Version&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Draft — performance and security targets require stakeholder input&lt;br /&gt;
|-&lt;br /&gt;
| Owner&lt;br /&gt;
| Lead Developer / Architect&lt;br /&gt;
|-&lt;br /&gt;
| Author&lt;br /&gt;
| [reverse-engineered; targets are best-practice defaults where not specified in source]&lt;br /&gt;
|-&lt;br /&gt;
| Created&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Last modified&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Classification&lt;br /&gt;
| Internal&lt;br /&gt;
|-&lt;br /&gt;
| Parent document&lt;br /&gt;
| PGCBL-BRD-001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;version-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Version&lt;br /&gt;
!width=&amp;quot;22%&amp;quot;| Date&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Author&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Status&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;| Change Summary&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Draft&lt;br /&gt;
| Initial draft from source analysis and best-practice defaults&lt;br /&gt;
|}&lt;br /&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-purpose-and-taxonomy|Purpose and Taxonomy]]&lt;br /&gt;
# [[#2-performance|Performance]]&lt;br /&gt;
# [[#3-reliability-and-availability|Reliability and Availability]]&lt;br /&gt;
# [[#4-security|Security]]&lt;br /&gt;
# [[#5-maintainability|Maintainability]]&lt;br /&gt;
# [[#6-portability-and-compatibility|Portability and Compatibility]]&lt;br /&gt;
# [[#7-operability|Operability]]&lt;br /&gt;
# [[#8-auditability-and-compliance|Auditability and Compliance]]&lt;br /&gt;
# [[#9-recoverability|Recoverability]]&lt;br /&gt;
# [[#10-open-issues|Open Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;purpose-and-taxonomy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Purpose and Taxonomy ==&lt;br /&gt;
&lt;br /&gt;
Non-functional requirements (NFRs) specify &#039;&#039;&#039;how well&#039;&#039;&#039; the system must do things, as opposed to &#039;&#039;&#039;what&#039;&#039;&#039; it must do (functional requirements). They are the quality attributes of the system.&lt;br /&gt;
&lt;br /&gt;
This document uses the &#039;&#039;&#039;ISO/IEC 25010:2011 (SQuaRE)&#039;&#039;&#039; quality model as its taxonomy. Each NFR is assigned a category from that model:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| ISO 25010 Category&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Subcategories&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Performance efficiency&#039;&#039;&#039;&lt;br /&gt;
| Time behaviour, resource utilisation, capacity&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Reliability&#039;&#039;&#039;&lt;br /&gt;
| Maturity, availability, fault tolerance, recoverability&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Security&#039;&#039;&#039;&lt;br /&gt;
| Confidentiality, integrity, non-repudiation, accountability, authenticity&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Maintainability&#039;&#039;&#039;&lt;br /&gt;
| Modularity, reusability, analysability, modifiability, testability&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Portability&#039;&#039;&#039;&lt;br /&gt;
| Adaptability, installability, replaceability&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Operability&#039;&#039;&#039;&lt;br /&gt;
| Appropriateness recognisability, learnability, user error protection&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Compatibility&#039;&#039;&#039;&lt;br /&gt;
| Co-existence, interoperability&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each NFR entry follows this format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;NFR-&amp;amp;lt;category&amp;amp;gt;-&amp;amp;lt;NN&amp;amp;gt;&lt;br /&gt;
  Requirement:   &amp;amp;lt;measurable statement of what is required&amp;amp;gt;&lt;br /&gt;
  Rationale:     &amp;amp;lt;why this matters&amp;amp;gt;&lt;br /&gt;
  Test approach: &amp;amp;lt;how it will be verified&amp;amp;gt;&lt;br /&gt;
  Priority:      Must Have | Should Have | Nice to Have&lt;br /&gt;
  Source:        &amp;amp;lt;observed in code / stakeholder input / best-practice default&amp;amp;gt;&lt;br /&gt;
  Status:        [CONFIRMED] | [UNCONFIRMED — needs stakeholder sign-off]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;performance&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Performance ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-perf-01-generation-throughput&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-PERF-01 — Generation throughput ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; The system should generate and insert at least 1,000 primes per second under normal operating conditions (single-user, unloaded PostgreSQL on localhost).&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; There are approximately 50 million primes below 10^9. Without a throughput target the system may be functionally correct but practically unusable.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Time a generation run of the first 10,000 primes; divide by elapsed seconds.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Best-practice default [UNCONFIRMED — no target specified in source]&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Open — target must be agreed with the system owner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-perf-02-report-generation-time&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-PERF-02 — Report generation time ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; A report covering up to 1 million stored primes should complete within 5 minutes.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; A batch report that runs overnight is operationally acceptable; one that runs for days is not.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Seed 1,000,000 rows; time a full report run.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Best-practice default [UNCONFIRMED]&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Open.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-perf-03-database-query-response&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-PERF-03 — Database query response ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; The &amp;lt;code&amp;gt;SELECT prime WHERE ident = :n&amp;lt;/code&amp;gt; divider lookup should return in under 50 ms at any point in the generation run.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; This query is called once per trial division step; if it is slow, the entire sieve is slow.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Run EXPLAIN ANALYZE on the query with a populated table; check absence of sequential scan on &amp;lt;code&amp;gt;primes.primes&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Algorithm design analysis&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Open — no index on &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; is defined in &amp;lt;code&amp;gt;primes_schema.sql&amp;lt;/code&amp;gt;; a sequential scan is likely. This is a defect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;reliability-and-availability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Reliability and Availability ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-rel-01-batch-completion&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-REL-01 — Batch completion ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; A generation or report run, once started on a healthy system, should complete without manual intervention.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Batch jobs that require operator interaction to proceed are unreliable.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Run end-to-end generation and report on a healthy environment; observe for any interactive prompts or hangs.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Standard batch computing requirement&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [CONFIRMED by design — no interactive prompts in the code]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-rel-02-graceful-failure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-REL-02 — Graceful failure ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; On any database error, the system shall log a descriptive message, set an error code, and exit cleanly (closing the database connection and print file) rather than abending.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; An abend may leave the database connection open or the print file in an inconsistent state.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Simulate a database failure mid-run (e.g. kill the PostgreSQL process); verify clean exit and closed resources.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Observed in source; partial — cleanup paragraphs exist but error propagation is incomplete (see PGCBL-IOB-001 D-RPT-01).&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Partially met; D-RPT-01 is an open defect.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-rel-03-idempotent-reset&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-REL-03 — Idempotent reset ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; Running &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; shall always produce a clean, empty, ready-to-use database state regardless of the prior state of the database.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Developers and operators must be able to reset state reliably between test runs.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Run the reset script three times consecutively; verify the same clean state each time.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; uses &amp;lt;code&amp;gt;DROP … CASCADE&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;CREATE&amp;lt;/code&amp;gt;; this is correct.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [CONFIRMED by SQL analysis]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Security ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-sec-01-credential-storage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-SEC-01 — Credential storage ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; Database credentials shall not be stored in plain text within compiled program source code.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Credentials in source code are exposed to anyone who can read the binary, the source, or the version-control history.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Inspect all &amp;lt;code&amp;gt;.cbl&amp;lt;/code&amp;gt; files for hard-coded user names and passwords; verify none are present.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; OWASP Secure Coding Practice #3 — Credential Management&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; &#039;&#039;&#039;NOT MET&#039;&#039;&#039; — &amp;lt;code&amp;gt;DBUSR&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DBPWD&amp;lt;/code&amp;gt; are hard-coded in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; WORKING-STORAGE. Remediation: use environment variables or a secrets manager.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-sec-02-principle-of-least-privilege&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-SEC-02 — Principle of least privilege ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; The database user &amp;lt;code&amp;gt;primes_user&amp;lt;/code&amp;gt; shall have only the minimum privileges required: INSERT and SELECT on &amp;lt;code&amp;gt;primes.primes&amp;lt;/code&amp;gt;, USAGE on &amp;lt;code&amp;gt;primes.asc_ident&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; If the application account is compromised, the attacker cannot drop tables, access other schemas, or escalate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Review PostgreSQL privilege grants; attempt a DROP TABLE as &amp;lt;code&amp;gt;primes_user&amp;lt;/code&amp;gt; and verify it is denied.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; CIS PostgreSQL Benchmark, control 6.1&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [UNCONFIRMED — not specified in &amp;lt;code&amp;gt;primes_schema.sql&amp;lt;/code&amp;gt;; only ownership is set]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-sec-03-output-file-permissions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-SEC-03 — Output file permissions ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; shall be readable only by the operator user and the intended report consumer; it shall not be world-readable.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Prime numbers are not sensitive, but the file permissions standard is a good habit and should be enforced as a baseline.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Check umask of the running process; verify &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; permissions after creation.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Nice to Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Best-practice default&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [UNCONFIRMED]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;maintainability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Maintainability ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-main-01-three-tier-separation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-MAIN-01 — Three-tier separation ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; No SQL shall appear outside &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;. No file I/O (other than console DISPLAY) shall appear outside &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Tier separation is the principal architectural rule of this system; violating it makes changes to one tier affect others.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Grep all &amp;lt;code&amp;gt;.cbl&amp;lt;/code&amp;gt; files for EXEC SQL and for SELECT/WRITE file statements; verify only the expected programs contain them.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Architecture design principle; observed and partially met (primesgen has an unused FD declaration — minor violation).&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Partially met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-main-02-copybook-as-interface-contract&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-MAIN-02 — Copybook as interface contract ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; Changes to any copybook must be reviewed for impact on all programs that COPY it before the change is applied.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Copybooks are shared; a field-size change in a copybook breaks every program that uses it without any compile-time warning in all cases.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Impact analysis process; verified by recompiling all programs after any copybook change.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Standard COBOL maintenance practice&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [CONFIRMED as a process requirement — no tooling enforcement in place]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-main-03-code-commentary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-MAIN-03 — Code commentary ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; Every paragraph shall carry a comment line stating its purpose. Every EXEC SQL block shall carry a comment stating what it does and why.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Current source has minimal commentary; future maintainers depend on the specification documents, which is insufficient.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Code review checklist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; COBOL coding best practice&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; &#039;&#039;&#039;NOT MET&#039;&#039;&#039; in current source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-main-04-testability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-MAIN-04 — Testability ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; Each tier (primesgen, primes, primesui) shall be callable in isolation with a synthetic control block, without requiring the full three-tier stack.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Unit testing individual tiers is only possible if they can be called with a test harness.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Write a minimal test driver for each program; verify it compiles and runs independently.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Testability principle; the method-dispatch pattern makes this achievable by design.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [UNCONFIRMED — no test harnesses exist]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;portability-and-compatibility&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Portability and Compatibility ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-port-01-cobol-standard-compliance&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-PORT-01 — COBOL standard compliance ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; Source code shall conform to COBOL 2002 (ISO 1989:2002) where GnuCOBOL extensions are not required, so that migration to a standard-compliant compiler is possible.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; GnuCOBOL 4.0-early-dev is a pre-release; the team should not depend on behaviours not in the standard.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Compile with &amp;lt;code&amp;gt;-std=cobol2002&amp;lt;/code&amp;gt; flag; resolve any warnings.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Best-practice default&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [UNCONFIRMED — not tested]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-port-02-postgresql-version-range&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-PORT-02 — PostgreSQL version range ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; The system shall operate correctly against PostgreSQL 11 through 16.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; PostgreSQL 11 is the minimum observed in the schema dump; operators may use a more recent version.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Run integration tests against PostgreSQL 11, 14, and 16.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Best-practice default&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [UNCONFIRMED]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;operability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Operability ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-oper-01-console-log-completeness&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-OPER-01 — Console log completeness ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; Every significant state transition (session start/stop, DB connect/disconnect, first fetch, last fetch, error) shall produce a console log entry identifying the program name, paragraph, and a human-readable message.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Operators diagnosing failures need to reconstruct what happened from the console log alone.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Run both modes; verify all defined state transitions produce a log line.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Observed in source; partially met — direct DISPLAY statements in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; bypass the structured log format.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Partially met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-oper-02-return-code&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-OPER-02 — Return code ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; The process shall exit with return code 0 on success and non-zero on failure.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Job schedulers and shell scripts depend on process exit codes to detect failures.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Run with a bad argument; check &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt; in the shell.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; POSIX convention&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; &#039;&#039;&#039;NOT MET&#039;&#039;&#039; — &amp;lt;code&amp;gt;STOP RUN&amp;lt;/code&amp;gt; in GnuCOBOL returns 0 regardless of the path taken unless &amp;lt;code&amp;gt;MOVE n TO RETURN-CODE&amp;lt;/code&amp;gt; is used; not present in current source.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;auditability-and-compliance&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 8. Auditability and Compliance ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-aud-01-run-log-retention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-AUD-01 — Run log retention ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; Console output from each run should be captured and retained for at least 30 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Enables post-hoc investigation of incorrect results or failures.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Verify a shell wrapper redirects stdout/stderr to a dated log file.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Best-practice default&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [UNCONFIRMED — no wrapper script exists]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-aud-02-schema-change-control&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-AUD-02 — Schema change control ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; Changes to &amp;lt;code&amp;gt;primes_schema.sql&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; must be version-controlled and reviewed before deployment.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Schema changes can destroy data or break the application silently.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Verify files are under git; verify a change-review process exists.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Standard DBA practice&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [UNCONFIRMED]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;recoverability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 9. Recoverability ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-rec-01-clean-restart-after-failure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-REC-01 — Clean restart after failure ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; After any failure, it shall be possible to restore the system to a known clean state by running &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; and re-running the generation job.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; Without a clean-restart procedure, a failed run leaves the database in an unknown state.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Simulate a mid-run failure; run &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt;; run a full generation; verify correctness.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; provides this; it must be documented as the recovery procedure.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Script exists; recovery procedure not yet documented.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-rec-02-no-partial-page-print-output&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-REC-02 — No partial-page print output ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirement:&#039;&#039;&#039; The report print file shall always end with a complete, flushed page — no partial lines or missing footings.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Rationale:&#039;&#039;&#039; A partial last page is confusing to report consumers.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Test approach:&#039;&#039;&#039; Run a report with a number of primes that does not divide evenly by 6; inspect the last page of &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Priority:&#039;&#039;&#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; &amp;lt;code&amp;gt;r99-stop-primesui&amp;lt;/code&amp;gt; flush loop — implemented.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; [CONFIRMED by code analysis]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 10. Open Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Issue&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Target&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| OI-01&lt;br /&gt;
| NFR-PERF-01, 02, 03 targets not confirmed by stakeholder&lt;br /&gt;
| System owner&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-02&lt;br /&gt;
| NFR-SEC-01 (hard-coded credentials) is a defect; remediation plan needed&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-03&lt;br /&gt;
| NFR-OPER-02 (return code) not implemented; affects job scheduler integration&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-04&lt;br /&gt;
| NFR-PERF-03: no index on &amp;lt;code&amp;gt;primes.ident&amp;lt;/code&amp;gt;; likely sequential scan — performance defect&lt;br /&gt;
| DBA&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Design standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Assumptions_and_Dependencies&amp;diff=4752</id>
		<title>Assumptions and Dependencies</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Assumptions_and_Dependencies&amp;diff=4752"/>
		<updated>2026-03-25T15:29:33Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;assumptions-dependencies-and-constraints&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Assumptions, Dependencies, and Constraints =  {| !width=&amp;quot;23%&amp;quot;| Field !width=&amp;quot;76%&amp;quot;| Value |- | Document ID | PGCBL-SAD-002 |- | Document Type | Assumptions, Dependencies, and Constraints Register |- | System | pgcobol — Prime Numbers Application v1.0 |- | Version | 1.0 |- | Status | Draft — requires stakeholder confirmation |- | Owner | Lead Developer |- | Author | [reverse-engineered from source artifacts]...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;assumptions-dependencies-and-constraints&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Assumptions, Dependencies, and Constraints =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;76%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Document ID&lt;br /&gt;
| PGCBL-SAD-002&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Assumptions, Dependencies, and Constraints Register&lt;br /&gt;
|-&lt;br /&gt;
| System&lt;br /&gt;
| pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
|-&lt;br /&gt;
| Version&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Draft — requires stakeholder confirmation&lt;br /&gt;
|-&lt;br /&gt;
| Owner&lt;br /&gt;
| Lead Developer&lt;br /&gt;
|-&lt;br /&gt;
| Author&lt;br /&gt;
| [reverse-engineered from source artifacts]&lt;br /&gt;
|-&lt;br /&gt;
| Created&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Last modified&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Classification&lt;br /&gt;
| Internal&lt;br /&gt;
|-&lt;br /&gt;
| Parent document&lt;br /&gt;
| PGCBL-BRD-001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;version-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;13%&amp;quot;| Version&lt;br /&gt;
!width=&amp;quot;17%&amp;quot;| Date&lt;br /&gt;
!width=&amp;quot;11%&amp;quot;| Author&lt;br /&gt;
!width=&amp;quot;11%&amp;quot;| Status&lt;br /&gt;
!width=&amp;quot;44%&amp;quot;| Change Summary&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Draft&lt;br /&gt;
| Derived from source analysis&lt;br /&gt;
|}&lt;br /&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-purpose|Purpose]]&lt;br /&gt;
# [[#2-how-to-use-this-register|How to Use This Register]]&lt;br /&gt;
# [[#3-assumptions|Assumptions]]&lt;br /&gt;
# [[#4-dependencies|Dependencies]]&lt;br /&gt;
# [[#5-constraints|Constraints]]&lt;br /&gt;
# [[#6-risk-summary|Risk Summary]]&lt;br /&gt;
# [[#7-open-issues|Open Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&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. Purpose ==&lt;br /&gt;
&lt;br /&gt;
This register captures every assumption made during the design, every dependency the system relies on, and every constraint that limits the design space. It exists so that:&lt;br /&gt;
&lt;br /&gt;
* If an assumption turns out to be wrong, the impact on the design can be assessed quickly.&lt;br /&gt;
* If a dependency is unavailable, the team knows what is blocked.&lt;br /&gt;
* Constraints are documented with their source, so they can be challenged if the source changes.&lt;br /&gt;
&lt;br /&gt;
Items marked &#039;&#039;&#039;[UNCONFIRMED]&#039;&#039;&#039; were inferred from source code analysis and have not been verified with a stakeholder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;how-to-use-this-register&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. How to Use This Register ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;best-practice-generic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Best practice — generic ===&lt;br /&gt;
&lt;br /&gt;
An assumption is something the team &#039;&#039;&#039;believes to be true&#039;&#039;&#039; but has not verified. Every assumption carries a risk: if the assumption is wrong, some part of the design or implementation will fail. Good practice is to:&lt;br /&gt;
&lt;br /&gt;
# State the assumption precisely (not vaguely).&lt;br /&gt;
# Identify who should confirm or refute it.&lt;br /&gt;
# Assign a risk severity if the assumption is wrong.&lt;br /&gt;
# Track confirmation explicitly — an unconfirmed assumption is a risk item.&lt;br /&gt;
&lt;br /&gt;
A dependency is something &#039;&#039;&#039;external to the system&#039;&#039;&#039; that must exist or be in a known state for the system to function. Dependencies are not assumptions — they are facts that must be managed.&lt;br /&gt;
&lt;br /&gt;
A constraint is a &#039;&#039;&#039;limit imposed from outside&#039;&#039;&#039; the design team (a regulation, a platform choice, a budget) that restricts what solutions are possible.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;severity-scale&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Severity scale ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Severity&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Meaning&lt;br /&gt;
|-&lt;br /&gt;
| High&lt;br /&gt;
| If wrong/unmet, the system cannot run or produces incorrect results&lt;br /&gt;
|-&lt;br /&gt;
| Medium&lt;br /&gt;
| If wrong/unmet, a feature is degraded or a workaround is needed&lt;br /&gt;
|-&lt;br /&gt;
| Low&lt;br /&gt;
| If wrong/unmet, a minor inconvenience; easily remediated&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;assumptions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Assumptions ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;9%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Assumption&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Confirmed by&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Confirmed date&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;| Severity if wrong&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| A-01&lt;br /&gt;
| Prime 2 is manually inserted into the database before the first generation run. The algorithm starts at candidate 3 and immediately calls &amp;lt;code&amp;gt;next-divider&amp;lt;/code&amp;gt; (ident=2), which requires a row with ident=2 to exist.&lt;br /&gt;
| [UNCONFIRMED]&lt;br /&gt;
| —&lt;br /&gt;
| High&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| A-02&lt;br /&gt;
| The &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; table is empty at the start of a fresh generation run. No de-duplication logic exists in the INSERT path; re-running generation will insert duplicate primes.&lt;br /&gt;
| [UNCONFIRMED]&lt;br /&gt;
| —&lt;br /&gt;
| High&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| A-03&lt;br /&gt;
| The &amp;lt;code&amp;gt;asc_ident&amp;lt;/code&amp;gt; sequence is reset to 1 before each generation run (achieved by running &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt;). If the sequence is not reset, the ident values used by the divider lookup will be wrong.&lt;br /&gt;
| [UNCONFIRMED]&lt;br /&gt;
| —&lt;br /&gt;
| High&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| A-04&lt;br /&gt;
| The working directory at runtime is writable by the process owner, so &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; can be created.&lt;br /&gt;
| [UNCONFIRMED]&lt;br /&gt;
| —&lt;br /&gt;
| High&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| A-05&lt;br /&gt;
| GnuCOBOL 4.0 and the GixSQL pre-processor are installed and on PATH before compilation.&lt;br /&gt;
| [UNCONFIRMED]&lt;br /&gt;
| —&lt;br /&gt;
| High&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| A-06&lt;br /&gt;
| PostgreSQL is running on &amp;lt;code&amp;gt;localhost:5432&amp;lt;/code&amp;gt; when any program that calls &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; is executed.&lt;br /&gt;
| [UNCONFIRMED]&lt;br /&gt;
| —&lt;br /&gt;
| High&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| A-07&lt;br /&gt;
| The PostgreSQL schema &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; and the user &amp;lt;code&amp;gt;primes_user&amp;lt;/code&amp;gt; exist and have been granted the necessary privileges before first run.&lt;br /&gt;
| [UNCONFIRMED]&lt;br /&gt;
| —&lt;br /&gt;
| High&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| A-08&lt;br /&gt;
| The system is run by a single operator at a time; no concurrent execution is expected.&lt;br /&gt;
| [UNCONFIRMED]&lt;br /&gt;
| —&lt;br /&gt;
| Medium&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| A-09&lt;br /&gt;
| The 132-character print record width matches the target printer or viewer.&lt;br /&gt;
| [UNCONFIRMED]&lt;br /&gt;
| —&lt;br /&gt;
| Low&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| A-10&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_cbsql.out&amp;lt;/code&amp;gt; (the pre-compiler listing) is a historical artefact of an earlier version of &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;primesdb&amp;lt;/code&amp;gt; connection alias it references is no longer active.&lt;br /&gt;
| [UNCONFIRMED]&lt;br /&gt;
| —&lt;br /&gt;
| Medium&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dependencies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Dependencies ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;12%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Dependency&lt;br /&gt;
!width=&amp;quot;10%&amp;quot;| Type&lt;br /&gt;
!width=&amp;quot;29%&amp;quot;| Version required&lt;br /&gt;
!width=&amp;quot;12%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;14%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| DEP-01&lt;br /&gt;
| GnuCOBOL compiler&lt;br /&gt;
| Build-time&lt;br /&gt;
| 4.0 or later&lt;br /&gt;
| Developer environment&lt;br /&gt;
| Must be installed&lt;br /&gt;
|-&lt;br /&gt;
| DEP-02&lt;br /&gt;
| GixSQL pre-processor&lt;br /&gt;
| Build-time&lt;br /&gt;
| Compatible with GnuCOBOL 4.0&lt;br /&gt;
| Developer environment&lt;br /&gt;
| Must be installed&lt;br /&gt;
|-&lt;br /&gt;
| DEP-03&lt;br /&gt;
| PostgreSQL server&lt;br /&gt;
| Runtime&lt;br /&gt;
| 11 or later&lt;br /&gt;
| DBA&lt;br /&gt;
| Must be running on localhost:5432&lt;br /&gt;
|-&lt;br /&gt;
| DEP-04&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; database and schema&lt;br /&gt;
| Runtime&lt;br /&gt;
| —&lt;br /&gt;
| DBA&lt;br /&gt;
| Must exist; created by &amp;lt;code&amp;gt;primes_schema.sql&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DEP-05&lt;br /&gt;
| &amp;lt;code&amp;gt;primes_user&amp;lt;/code&amp;gt; account&lt;br /&gt;
| Runtime&lt;br /&gt;
| —&lt;br /&gt;
| DBA&lt;br /&gt;
| Must exist with INSERT, SELECT privileges on &amp;lt;code&amp;gt;primes.primes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DEP-06&lt;br /&gt;
| Writable working directory&lt;br /&gt;
| Runtime&lt;br /&gt;
| —&lt;br /&gt;
| OS / operator&lt;br /&gt;
| Needed for &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DEP-07&lt;br /&gt;
| &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; executed before each generation run&lt;br /&gt;
| Operational&lt;br /&gt;
| —&lt;br /&gt;
| Operator&lt;br /&gt;
| Required for idempotent generation&lt;br /&gt;
|-&lt;br /&gt;
| DEP-08&lt;br /&gt;
| Prime 2 seeded in &amp;lt;code&amp;gt;primes.primes&amp;lt;/code&amp;gt; before first generation&lt;br /&gt;
| Operational&lt;br /&gt;
| —&lt;br /&gt;
| Operator&lt;br /&gt;
| Required for divider lookup to work from candidate 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;constraints&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Constraints ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;34%&amp;quot;| Constraint&lt;br /&gt;
!width=&amp;quot;22%&amp;quot;| Source&lt;br /&gt;
!width=&amp;quot;22%&amp;quot;| Impact&lt;br /&gt;
|-&lt;br /&gt;
| C-01&lt;br /&gt;
| Target runtime is Linux only. &amp;lt;code&amp;gt;SPECIAL-NAMES. CONSOLE IS scherm&amp;lt;/code&amp;gt; is platform-specific.&lt;br /&gt;
| GnuCOBOL platform support&lt;br /&gt;
| Cannot run on Windows or mainframe without porting&lt;br /&gt;
|-&lt;br /&gt;
| C-02&lt;br /&gt;
| Database must be PostgreSQL. The connection string prefix &amp;lt;code&amp;gt;pgsql://&amp;lt;/code&amp;gt; and GixSQL dialect are PostgreSQL-specific.&lt;br /&gt;
| GixSQL driver&lt;br /&gt;
| Not portable to DB2, Oracle, or SQL Server without code changes&lt;br /&gt;
|-&lt;br /&gt;
| C-03&lt;br /&gt;
| Upper generation limit is hard-coded at 999,999,999.&lt;br /&gt;
| Source code &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt; line 91&lt;br /&gt;
| Cannot be changed without recompilation&lt;br /&gt;
|-&lt;br /&gt;
| C-04&lt;br /&gt;
| Database credentials are hard-coded in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; WORKING-STORAGE.&lt;br /&gt;
| Source code; technical debt&lt;br /&gt;
| Credential rotation requires recompilation and redeployment&lt;br /&gt;
|-&lt;br /&gt;
| C-05&lt;br /&gt;
| Print record width is fixed at 132 characters.&lt;br /&gt;
| &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt; FD and table layout&lt;br /&gt;
| Report format cannot be changed without recompiling &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| C-06&lt;br /&gt;
| The two operational modes (generate / report) are mutually exclusive per invocation.&lt;br /&gt;
| &amp;lt;code&amp;gt;primesmain.cbl&amp;lt;/code&amp;gt; EVALUATE structure&lt;br /&gt;
| Cannot generate and report in the same run&lt;br /&gt;
|-&lt;br /&gt;
| C-07&lt;br /&gt;
| GnuCOBOL 4.0-early-dev was used; behaviour may differ from stable GnuCOBOL 3.x.&lt;br /&gt;
| Compiler listing header&lt;br /&gt;
| Compatibility with stable GnuCOBOL releases unverified&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;risk-summary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Risk Summary ==&lt;br /&gt;
&lt;br /&gt;
Items with High severity that are still unconfirmed represent the greatest project risk:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Risk&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Assumptions involved&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Recommended action&lt;br /&gt;
|-&lt;br /&gt;
| Generation produces wrong results or crashes on fresh DB&lt;br /&gt;
| A-01, A-02, A-03&lt;br /&gt;
| Write a pre-run setup script and document it as a mandatory step&lt;br /&gt;
|-&lt;br /&gt;
| Program fails silently at runtime due to missing infrastructure&lt;br /&gt;
| A-04, A-05, A-06, A-07&lt;br /&gt;
| Add pre-flight checks to &amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt; (file/DB accessibility tests)&lt;br /&gt;
|-&lt;br /&gt;
| Pre-compiler listing alias mismatch causes disconnect failure&lt;br /&gt;
| A-10&lt;br /&gt;
| Inspect current &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; disconnect path and confirm alias is &amp;lt;code&amp;gt;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;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Open Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Issue&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Target&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| OI-01&lt;br /&gt;
| All assumptions are unconfirmed. A stakeholder/developer review session is needed to confirm or correct each one.&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-02&lt;br /&gt;
| No pre-run setup script exists. DEP-07 and DEP-08 are manual steps with no enforcement.&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Design standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4751</id>
		<title>Design standards</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4751"/>
		<updated>2026-03-25T15:28:44Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Index of Document Engineering and System Requirements =&lt;br /&gt;
&lt;br /&gt;
# [[Document Engineering]]&lt;br /&gt;
# [[Scope and applicability]]&lt;br /&gt;
# [[Assumptions and Dependencies]]&lt;br /&gt;
# [[Non-Functional Requirements]]&lt;br /&gt;
# [[Test Traceability Matrix]]&lt;br /&gt;
# [[Naming and Coding Standards]]&lt;br /&gt;
# [[Business Requirement Document]]&lt;br /&gt;
== Cross-Document References]]&lt;br /&gt;
; Document ID | Title | Relationship&lt;br /&gt;
|---|---|---&lt;br /&gt;
| PGCBL-SAD-001 | Scope and Applicability | Navigation Guide&lt;br /&gt;
| PGCBL-NFR-001 | Non-Functional Requirements | Quality Attributes Complement&lt;br /&gt;
| PGCBL-TSD-001 | Technical Specification | Implementation Details&lt;br /&gt;
| PGCBL-TTM-001 | Test Traceability Matrix | Test Case Mapping&lt;br /&gt;
| PGCBL-ADD-001 | Architecture Decision Records | Design Documentation&lt;br /&gt;
&lt;br /&gt;
This index provides a structured overview of the document set, facilitating easy navigation and understanding of the interrelated components.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Document_Engineering&amp;diff=4750</id>
		<title>Document Engineering</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Document_Engineering&amp;diff=4750"/>
		<updated>2026-03-25T15:21:52Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;document-engineering-standard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Document Engineering Standard =  &amp;#039;&amp;#039;&amp;#039;Document ID:&amp;#039;&amp;#039;&amp;#039; STD-DOC-001&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Applies to:&amp;#039;&amp;#039;&amp;#039; All design-level and program-level specification documents in the pgcobol set&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 1.0&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Approved&amp;lt;br /&amp;gt; &amp;#039;&amp;#039;&amp;#039;Owner:&amp;#039;&amp;#039;&amp;#039; Lead Developer / Architect   -----  &amp;lt;span id=&amp;quot;purpose&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 1. Purpose ==  This standard defines the mandatory scaffolding, metadata blocks, and governance structure that every do...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;document-engineering-standard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Document Engineering Standard =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Document ID:&#039;&#039;&#039; STD-DOC-001&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Applies to:&#039;&#039;&#039; All design-level and program-level specification documents in the pgcobol set&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Status:&#039;&#039;&#039; Approved&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Owner:&#039;&#039;&#039; Lead Developer / Architect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&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. Purpose ==&lt;br /&gt;
&lt;br /&gt;
This standard defines the mandatory scaffolding, metadata blocks, and governance structure that every document in this specification set must carry. It exists so that:&lt;br /&gt;
&lt;br /&gt;
* Documents can be located, versioned, and audited independently of their content.&lt;br /&gt;
* Reviewers know immediately who owns the document, what it covers, and whether it is current.&lt;br /&gt;
* The set as a whole is traceable — each document can be linked to requirements, decisions, and tests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mandatory-document-header&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Mandatory Document Header ==&lt;br /&gt;
&lt;br /&gt;
Every document &#039;&#039;&#039;must&#039;&#039;&#039; open with the following block before any content section. Fields marked &#039;&#039;&#039;[R]&#039;&#039;&#039; are required; fields marked &#039;&#039;&#039;[O]&#039;&#039;&#039; are optional but strongly recommended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;markdown&amp;quot;&amp;gt;# &amp;amp;lt;Document Title&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
| Field              | Value                                      |&lt;br /&gt;
|--------------------|--------------------------------------------|&lt;br /&gt;
| Document ID        | &amp;amp;lt;PROJ&amp;amp;gt;-&amp;amp;lt;TYPE&amp;amp;gt;-&amp;amp;lt;NNN&amp;amp;gt;          [R]           |&lt;br /&gt;
| Document Type      | &amp;amp;lt;full type name&amp;amp;gt;             [R]           |&lt;br /&gt;
| System / Project   | &amp;amp;lt;system name and version&amp;amp;gt;    [R]           |&lt;br /&gt;
| Version            | &amp;amp;lt;major.minor&amp;amp;gt;                [R]           |&lt;br /&gt;
| Status             | Draft | Review | Approved | Superseded [R] |&lt;br /&gt;
| Owner              | &amp;amp;lt;name, role&amp;amp;gt;                 [R]           |&lt;br /&gt;
| Author(s)          | &amp;amp;lt;name(s)&amp;amp;gt;                    [R]           |&lt;br /&gt;
| Reviewers          | &amp;amp;lt;name, role — one per row&amp;amp;gt;   [O]           |&lt;br /&gt;
| Approved by        | &amp;amp;lt;name, role, date&amp;amp;gt;           [O]           |&lt;br /&gt;
| Created            | YYYY-MM-DD                   [R]           |&lt;br /&gt;
| Last modified      | YYYY-MM-DD                   [R]           |&lt;br /&gt;
| Classification     | Internal | Confidential | Public [R]  |&lt;br /&gt;
| Parent document    | &amp;amp;lt;Document ID of parent, if any&amp;amp;gt; [O]        |&lt;br /&gt;
| Supersedes         | &amp;amp;lt;Document ID this replaces, if any&amp;amp;gt; [O]    |&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;document-id-scheme&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.1 Document ID Scheme ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;PROJ&amp;amp;gt; - &amp;amp;lt;TYPE&amp;amp;gt; - &amp;amp;lt;NNN&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
PROJ   Two-to-six letter project code          e.g. PGCBL&lt;br /&gt;
TYPE   Document type code (see §2.2)           e.g. BRD&lt;br /&gt;
NNN    Zero-padded sequence within type        e.g. 001&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
  PGCBL-BRD-001   Business Requirements Document #1&lt;br /&gt;
  PGCBL-TSD-001   Technical Specification #1&lt;br /&gt;
  PGCBL-ADD-001   Architecture Decision Document #1&lt;br /&gt;
  PGCBL-TTM-001   Test Traceability Matrix #1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;document-type-codes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.2 Document Type Codes ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Code&lt;br /&gt;
! Full Name&lt;br /&gt;
! Abbrev used in filenames&lt;br /&gt;
|-&lt;br /&gt;
| BRD&lt;br /&gt;
| Business Requirements Document&lt;br /&gt;
| brd&lt;br /&gt;
|-&lt;br /&gt;
| TSD&lt;br /&gt;
| Technical Specification Document&lt;br /&gt;
| tsd&lt;br /&gt;
|-&lt;br /&gt;
| DDD&lt;br /&gt;
| Data Dictionary Document&lt;br /&gt;
| ddd&lt;br /&gt;
|-&lt;br /&gt;
| FLD&lt;br /&gt;
| Flow Diagram Document&lt;br /&gt;
| fld&lt;br /&gt;
|-&lt;br /&gt;
| PLG&lt;br /&gt;
| Program Logic Guide&lt;br /&gt;
| plg&lt;br /&gt;
|-&lt;br /&gt;
| BRG&lt;br /&gt;
| Business Rules Guide&lt;br /&gt;
| brg&lt;br /&gt;
|-&lt;br /&gt;
| IOB&lt;br /&gt;
| I/O Behaviour Document&lt;br /&gt;
| iob&lt;br /&gt;
|-&lt;br /&gt;
| CFD&lt;br /&gt;
| Control Flow Document&lt;br /&gt;
| cfd&lt;br /&gt;
|-&lt;br /&gt;
| ADD&lt;br /&gt;
| Architecture Decision Document&lt;br /&gt;
| add&lt;br /&gt;
|-&lt;br /&gt;
| NFR&lt;br /&gt;
| Non-Functional Requirements&lt;br /&gt;
| nfr&lt;br /&gt;
|-&lt;br /&gt;
| SAD&lt;br /&gt;
| Scope and Applicability Document&lt;br /&gt;
| sad&lt;br /&gt;
|-&lt;br /&gt;
| TTM&lt;br /&gt;
| Test Traceability Matrix&lt;br /&gt;
| ttm&lt;br /&gt;
|-&lt;br /&gt;
| NCS&lt;br /&gt;
| Naming and Coding Standard&lt;br /&gt;
| ncs&lt;br /&gt;
|-&lt;br /&gt;
| DEP&lt;br /&gt;
| Deployment Guide&lt;br /&gt;
| dep&lt;br /&gt;
|-&lt;br /&gt;
| GLO&lt;br /&gt;
| Glossary&lt;br /&gt;
| glo&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mandatory-version-history-table&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Mandatory Version History Table ==&lt;br /&gt;
&lt;br /&gt;
Every document &#039;&#039;&#039;must&#039;&#039;&#039; carry a version history table immediately after the header block.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;markdown&amp;quot;&amp;gt;## Version History&lt;br /&gt;
&lt;br /&gt;
| Version | Date       | Author       | Status   | Change Summary                    |&lt;br /&gt;
|---------|------------|--------------|----------|-----------------------------------|&lt;br /&gt;
| 0.1     | YYYY-MM-DD | &amp;amp;lt;name&amp;amp;gt;       | Draft    | Initial draft                     |&lt;br /&gt;
| 0.2     | YYYY-MM-DD | &amp;amp;lt;name&amp;amp;gt;       | Review   | Incorporated review comments      |&lt;br /&gt;
| 1.0     | YYYY-MM-DD | &amp;amp;lt;name&amp;amp;gt;       | Approved | Approved by &amp;amp;lt;approver&amp;amp;gt;            |&lt;br /&gt;
| 1.1     | YYYY-MM-DD | &amp;amp;lt;name&amp;amp;gt;       | Approved | &amp;amp;lt;brief description of change&amp;amp;gt;     |&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Versioning rules:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0.x&amp;lt;/code&amp;gt; — draft iterations before first approval.&lt;br /&gt;
* &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; — first approved baseline.&lt;br /&gt;
* &amp;lt;code&amp;gt;1.x&amp;lt;/code&amp;gt; — minor corrections or additions that do not change approved scope.&lt;br /&gt;
* &amp;lt;code&amp;gt;x.0&amp;lt;/code&amp;gt; (x &amp;amp;gt; 1) — major revision requiring re-approval.&lt;br /&gt;
* A superseded document retains its history; the new document references it in the header.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mandatory-sections-all-document-types&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Mandatory Sections (all document types) ==&lt;br /&gt;
&lt;br /&gt;
After the header and version history, every document must contain these sections in order:&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;
=== 4.1 Table of Contents ===&lt;br /&gt;
&lt;br /&gt;
For documents longer than three sections, include a Markdown ToC:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;markdown&amp;quot;&amp;gt;## Table of Contents&lt;br /&gt;
&lt;br /&gt;
1. [Purpose and Scope](#1-purpose-and-scope)&lt;br /&gt;
2. [Assumptions and Dependencies](#2-assumptions-and-dependencies)&lt;br /&gt;
3. [&amp;amp;lt;content sections&amp;amp;gt;](#...)&lt;br /&gt;
N. [Open Issues](#n-open-issues)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;purpose-and-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.2 Purpose and Scope ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;markdown&amp;quot;&amp;gt;## 1. Purpose and Scope&lt;br /&gt;
&lt;br /&gt;
### 1.1 Purpose&lt;br /&gt;
&amp;amp;lt;One paragraph: what this document is and why it exists.&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### 1.2 Scope&lt;br /&gt;
&amp;amp;lt;What system version, components, and time period this document covers.&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### 1.3 Out of Scope&lt;br /&gt;
&amp;amp;lt;Explicit list of what this document does NOT cover, to prevent misuse.&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### 1.4 Audience&lt;br /&gt;
&amp;amp;lt;Who should read this document and what prior knowledge is assumed.&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### 1.5 Related Documents&lt;br /&gt;
&lt;br /&gt;
| Document ID     | Title                        | Relationship         |&lt;br /&gt;
|-----------------|------------------------------|----------------------|&lt;br /&gt;
| PGCBL-BRD-001   | Business Requirements        | Parent requirements  |&lt;br /&gt;
| PGCBL-ADD-001   | Architecture Decisions       | Design rationale     |&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;assumptions-and-dependencies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.3 Assumptions and Dependencies ===&lt;br /&gt;
&lt;br /&gt;
See document &amp;lt;code&amp;gt;PGCBL-SAD-001&amp;lt;/code&amp;gt; for the full template. Minimum required inline:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;markdown&amp;quot;&amp;gt;## 2. Assumptions and Dependencies&lt;br /&gt;
&lt;br /&gt;
### Assumptions&lt;br /&gt;
| ID    | Assumption                                           | Risk if wrong          |&lt;br /&gt;
|-------|------------------------------------------------------|------------------------|&lt;br /&gt;
| A-01  | &amp;amp;lt;statement believed to be true, unverified&amp;amp;gt;          | &amp;amp;lt;consequence&amp;amp;gt;          |&lt;br /&gt;
&lt;br /&gt;
### Dependencies  &lt;br /&gt;
| ID    | Dependency                                           | Owner                  |&lt;br /&gt;
|-------|------------------------------------------------------|------------------------|&lt;br /&gt;
| D-01  | &amp;amp;lt;something that must be in place before this works&amp;amp;gt;  | &amp;amp;lt;who provides it&amp;amp;gt;      |&lt;br /&gt;
&lt;br /&gt;
### Constraints&lt;br /&gt;
| ID    | Constraint                                           | Source                 |&lt;br /&gt;
|-------|------------------------------------------------------|------------------------|&lt;br /&gt;
| C-01  | &amp;amp;lt;limit on the design space&amp;amp;gt;                          | &amp;amp;lt;requirement / policy&amp;amp;gt; |&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4.4 Open Issues ===&lt;br /&gt;
&lt;br /&gt;
Every document must carry an open-issues section at the end, even if empty:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;markdown&amp;quot;&amp;gt;## N. Open Issues&lt;br /&gt;
&lt;br /&gt;
| ID     | Issue                                | Owner    | Target date | Status |&lt;br /&gt;
|--------|--------------------------------------|----------|-------------|--------|&lt;br /&gt;
| OI-01  | &amp;amp;lt;description&amp;amp;gt;                        | &amp;amp;lt;name&amp;amp;gt;   | YYYY-MM-DD  | Open   |&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;section-numbering-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Section Numbering Convention ==&lt;br /&gt;
&lt;br /&gt;
* Top-level sections: &amp;lt;code&amp;gt;## 1.&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;## 2.&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
* Subsections: &amp;lt;code&amp;gt;### 1.1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;### 1.2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#### 1.1.1&amp;lt;/code&amp;gt; (max three levels).&lt;br /&gt;
* Appendices: &amp;lt;code&amp;gt;## Appendix A —&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;## Appendix B —&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Do not use letters for main sections; numbers only.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;table-formatting-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Table Formatting Convention ==&lt;br /&gt;
&lt;br /&gt;
All tables use GFM (GitHub Flavoured Markdown) pipe syntax. Column alignment:&lt;br /&gt;
&lt;br /&gt;
* Left-align text columns.&lt;br /&gt;
* Right-align numeric columns.&lt;br /&gt;
* Use a header separator row with at least three dashes.&lt;br /&gt;
&lt;br /&gt;
IDs in tables follow the pattern &amp;lt;code&amp;gt;&amp;amp;lt;TYPE&amp;amp;gt;-&amp;amp;lt;NN&amp;amp;gt;&amp;lt;/code&amp;gt; where TYPE is a two-to-four letter mnemonic and NN is a zero-padded sequence (e.g. &amp;lt;code&amp;gt;FR-01&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BR-ALGO-03&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A-01&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;code-and-pseudocode-blocks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Code and Pseudocode Blocks ==&lt;br /&gt;
&lt;br /&gt;
* COBOL source extracts: use fenced code blocks with language hint &amp;lt;code&amp;gt;cobol&amp;lt;/code&amp;gt;.&lt;br /&gt;
* SQL: &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pseudocode (language-neutral): no language hint, or &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shell commands: &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Mermaid diagrams: &amp;lt;code&amp;gt;mermaid&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cross-reference-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 8. Cross-Reference Convention ==&lt;br /&gt;
&lt;br /&gt;
When one document references content in another, use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[&amp;amp;lt;title&amp;amp;gt;](&amp;amp;lt;Document ID&amp;amp;gt;) §&amp;amp;lt;section&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Example: &amp;lt;code&amp;gt;[Technical Specification](PGCBL-TSD-001) §3.2&amp;lt;/code&amp;gt; means section 3.2 of the TSD.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;review-and-approval-process&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 9. Review and Approval Process ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Author creates draft (v0.1)&lt;br /&gt;
        │&lt;br /&gt;
        ▼&lt;br /&gt;
Peer review — reviewer comments added as inline notes or GitHub/Jira issues&lt;br /&gt;
        │&lt;br /&gt;
        ▼&lt;br /&gt;
Author resolves comments, increments to v0.2 … v0.n&lt;br /&gt;
        │&lt;br /&gt;
        ▼&lt;br /&gt;
Owner sign-off → status changes to &amp;amp;quot;Approved&amp;amp;quot;, version becomes 1.0&lt;br /&gt;
        │&lt;br /&gt;
        ▼&lt;br /&gt;
Document baselined in version control (git tag or DMS record)&lt;br /&gt;
        │&lt;br /&gt;
        ▼&lt;br /&gt;
Any change raises a new draft (v1.1-draft), repeat cycle&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;file-naming-convention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 10. File Naming Convention ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;proj&amp;amp;gt;-&amp;amp;lt;type&amp;amp;gt;-&amp;amp;lt;nnn&amp;amp;gt;-&amp;amp;lt;short-title&amp;amp;gt;.md&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
  pgcbl-brd-001-business-requirements.md&lt;br /&gt;
  pgcbl-tsd-001-technical-specification.md&lt;br /&gt;
  pgcbl-add-001-method-dispatch-pattern.md&lt;br /&gt;
  pgcbl-ncs-001-cobol-naming-standard.md&amp;lt;/pre&amp;gt;&lt;br /&gt;
All lowercase, hyphens as separators, no spaces, &amp;lt;code&amp;gt;.md&amp;lt;/code&amp;gt; extension.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Design standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Scope_and_applicability&amp;diff=4749</id>
		<title>Scope and applicability</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Scope_and_applicability&amp;diff=4749"/>
		<updated>2026-03-25T15:20:36Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;scope-and-applicability-document&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Scope and Applicability Document =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;76%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Document ID&lt;br /&gt;
| PGCBL-SAD-001&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Scope and Applicability Document&lt;br /&gt;
|-&lt;br /&gt;
| System&lt;br /&gt;
| pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
|-&lt;br /&gt;
| Version&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Approved&lt;br /&gt;
|-&lt;br /&gt;
| Owner&lt;br /&gt;
| Lead Developer&lt;br /&gt;
|-&lt;br /&gt;
| Author&lt;br /&gt;
| [reverse-engineered from source artifacts]&lt;br /&gt;
|-&lt;br /&gt;
| Created&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Last modified&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Classification&lt;br /&gt;
| Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;version-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;13%&amp;quot;| Version&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Date&lt;br /&gt;
!width=&amp;quot;13%&amp;quot;| Author&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Status&lt;br /&gt;
!width=&amp;quot;38%&amp;quot;| Change Summary&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Draft&lt;br /&gt;
| Initial reverse-eng draft&lt;br /&gt;
|-&lt;br /&gt;
| 1.0&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Approved&lt;br /&gt;
| Baselined&lt;br /&gt;
|}&lt;br /&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-purpose|Purpose]]&lt;br /&gt;
# [[#2-system-scope|System Scope]]&lt;br /&gt;
# [[#3-document-set-scope|Document Set Scope]]&lt;br /&gt;
# [[#4-audience|Audience]]&lt;br /&gt;
# [[#5-related-documents|Related Documents]]&lt;br /&gt;
# [[#6-open-issues|Open Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&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. Purpose ==&lt;br /&gt;
&lt;br /&gt;
This document defines what is and is not covered by the pgcobol specification set. It exists to prevent readers from applying any single document outside its intended context, and to provide a navigational entry point to the full document set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. System Scope ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;what-the-system-is&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.1 What the system is ===&lt;br /&gt;
&lt;br /&gt;
pgcobol is a three-tier batch COBOL application that:&lt;br /&gt;
&lt;br /&gt;
* Generates prime numbers by trial division and stores them in a PostgreSQL database.&lt;br /&gt;
* Reads stored primes from the database and produces a formatted line-printer report.&lt;br /&gt;
&lt;br /&gt;
It runs as a command-line batch job on Linux. There is no interactive interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-boundary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.2 System boundary ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inside scope:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The four COBOL programs: &amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primesgen&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The five copybooks that define the inter-tier interfaces.&lt;br /&gt;
* The PostgreSQL schema &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; and its objects.&lt;br /&gt;
* The output file &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The console log output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outside scope:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The GnuCOBOL compiler and GixSQL pre-processor (third-party tools, not modified).&lt;br /&gt;
* The PostgreSQL server installation and administration.&lt;br /&gt;
* The operating system, file system, and network infrastructure.&lt;br /&gt;
* Any job scheduler or wrapper scripts.&lt;br /&gt;
* Any downstream processing of &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-version-covered&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.3 System version covered ===&lt;br /&gt;
&lt;br /&gt;
This document set describes pgcobol as found in source artifacts dated November–December 2025, compiled under GnuCOBOL 4.0-early-dev.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;what-is-explicitly-not-covered&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.4 What is explicitly not covered ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Excluded topic&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Reason&lt;br /&gt;
|-&lt;br /&gt;
| Prime numbers beyond 999,999,999&lt;br /&gt;
| Hard-coded upper bound in the source&lt;br /&gt;
|-&lt;br /&gt;
| Even primes (2)&lt;br /&gt;
| The algorithm tests odd candidates only; prime 2 is a known seeding gap&lt;br /&gt;
|-&lt;br /&gt;
| Interactive or web interfaces&lt;br /&gt;
| Not implemented&lt;br /&gt;
|-&lt;br /&gt;
| Concurrent execution&lt;br /&gt;
| Single-process batch design; no concurrency controls present&lt;br /&gt;
|-&lt;br /&gt;
| Encryption or secure credential storage&lt;br /&gt;
| Not implemented in this version&lt;br /&gt;
|-&lt;br /&gt;
| High-availability or disaster recovery&lt;br /&gt;
| Not in scope for this version&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;document-set-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Document Set Scope ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;documents-in-this-set&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Documents in this set ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;26%&amp;quot;| Document ID&lt;br /&gt;
!width=&amp;quot;9%&amp;quot;| Type&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Title&lt;br /&gt;
!width=&amp;quot;12%&amp;quot;| Covers&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-SAD-001&lt;br /&gt;
| SAD&lt;br /&gt;
| Scope and Applicability&lt;br /&gt;
| Navigation and scope&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-BRD-001&lt;br /&gt;
| BRD&lt;br /&gt;
| Business Requirements&lt;br /&gt;
| What the system must do&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-NFR-001&lt;br /&gt;
| NFR&lt;br /&gt;
| Non-Functional Requirements&lt;br /&gt;
| Quality attributes&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-TSD-001&lt;br /&gt;
| TSD&lt;br /&gt;
| Technical Specification&lt;br /&gt;
| Architecture and pseudocode&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-DDD-001&lt;br /&gt;
| DDD&lt;br /&gt;
| Data Dictionary&lt;br /&gt;
| All fields and structures&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-FLD-001&lt;br /&gt;
| FLD&lt;br /&gt;
| Flow Diagrams&lt;br /&gt;
| Mermaid process diagrams&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-PLG-001&lt;br /&gt;
| PLG&lt;br /&gt;
| Program Logic Guide&lt;br /&gt;
| Step-by-step paragraph logic&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-BRG-001&lt;br /&gt;
| BRG&lt;br /&gt;
| Business Rules Guide&lt;br /&gt;
| Rules, calculations, validations&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-IOB-001&lt;br /&gt;
| IOB&lt;br /&gt;
| I/O Behaviour&lt;br /&gt;
| File, console, DB I/O&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-CFD-001&lt;br /&gt;
| CFD&lt;br /&gt;
| Control Flow Document&lt;br /&gt;
| PERFORM/CALL trees&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-ADD-001&lt;br /&gt;
| ADD&lt;br /&gt;
| Architecture Decision Records&lt;br /&gt;
| Design decisions and rationale&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-TTM-001&lt;br /&gt;
| TTM&lt;br /&gt;
| Test Traceability Matrix&lt;br /&gt;
| Requirements → design → tests&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-NCS-001&lt;br /&gt;
| NCS&lt;br /&gt;
| Naming and Coding Standard&lt;br /&gt;
| COBOL conventions&lt;br /&gt;
|-&lt;br /&gt;
| STD-DOC-001&lt;br /&gt;
| STD&lt;br /&gt;
| Document Engineering Standard&lt;br /&gt;
| This document set’s scaffolding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;how-to-use-this-set&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 How to use this set ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! I want to…&lt;br /&gt;
! Start with…&lt;br /&gt;
|-&lt;br /&gt;
| Understand what the system must do&lt;br /&gt;
| PGCBL-BRD-001&lt;br /&gt;
|-&lt;br /&gt;
| Understand the overall architecture&lt;br /&gt;
| PGCBL-TSD-001 §1–2&lt;br /&gt;
|-&lt;br /&gt;
| Look up a specific data field&lt;br /&gt;
| PGCBL-DDD-001&lt;br /&gt;
|-&lt;br /&gt;
| Understand how a program works step-by-step&lt;br /&gt;
| PGCBL-PLG-001&lt;br /&gt;
|-&lt;br /&gt;
| Understand why a design decision was made&lt;br /&gt;
| PGCBL-ADD-001&lt;br /&gt;
|-&lt;br /&gt;
| Check what tests cover a requirement&lt;br /&gt;
| PGCBL-TTM-001&lt;br /&gt;
|-&lt;br /&gt;
| Write new COBOL code to the same standards&lt;br /&gt;
| PGCBL-NCS-001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;audience&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Audience ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Audience&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Assumed knowledge&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Documents most relevant&lt;br /&gt;
|-&lt;br /&gt;
| COBOL developer&lt;br /&gt;
| COBOL syntax, batch processing&lt;br /&gt;
| TSD, PLG, CFD, NCS&lt;br /&gt;
|-&lt;br /&gt;
| Database developer&lt;br /&gt;
| SQL, PostgreSQL&lt;br /&gt;
| TSD §5, DDD §12, IOB §3&lt;br /&gt;
|-&lt;br /&gt;
| Business analyst&lt;br /&gt;
| None technical required&lt;br /&gt;
| BRD, BRG&lt;br /&gt;
|-&lt;br /&gt;
| QA engineer&lt;br /&gt;
| Testing concepts&lt;br /&gt;
| TTM, BRD, BRG&lt;br /&gt;
|-&lt;br /&gt;
| Architect / reviewer&lt;br /&gt;
| Systems design&lt;br /&gt;
| TSD, ADD, NFR&lt;br /&gt;
|-&lt;br /&gt;
| New team member&lt;br /&gt;
| None&lt;br /&gt;
| SAD (start here), then BRD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;related-documents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Related Documents ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;27%&amp;quot;| Document ID&lt;br /&gt;
!width=&amp;quot;49%&amp;quot;| Title&lt;br /&gt;
!width=&amp;quot;22%&amp;quot;| Relationship&lt;br /&gt;
|-&lt;br /&gt;
| STD-DOC-001&lt;br /&gt;
| Document Engineering Standard&lt;br /&gt;
| Governs the format of all documents in this set&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Open Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;8%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;60%&amp;quot;| Issue&lt;br /&gt;
!width=&amp;quot;8%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;13%&amp;quot;| Target&lt;br /&gt;
!width=&amp;quot;9%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| OI-01&lt;br /&gt;
| System version identifier not present in source; version inferred from compiler listing date&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Design standards]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4748</id>
		<title>Design standards</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4748"/>
		<updated>2026-03-25T15:11:19Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Index of Document Engineering and System Requirements =&lt;br /&gt;
&lt;br /&gt;
# [[Document Engineering]]&lt;br /&gt;
# [[Scope and applicability]]&lt;br /&gt;
# Assumptions and Dependencies ==&lt;br /&gt;
# Non-Functional Requirements ==&lt;br /&gt;
# Test Traceability Matrix ==&lt;br /&gt;
# Naming and Coding Standards ==&lt;br /&gt;
# Business Requirement Document (BRD) ==&lt;br /&gt;
== Cross-Document References ==&lt;br /&gt;
; Document ID | Title | Relationship&lt;br /&gt;
|---|---|---&lt;br /&gt;
| PGCBL-SAD-001 | Scope and Applicability | Navigation Guide&lt;br /&gt;
| PGCBL-NFR-001 | Non-Functional Requirements | Quality Attributes Complement&lt;br /&gt;
| PGCBL-TSD-001 | Technical Specification | Implementation Details&lt;br /&gt;
| PGCBL-TTM-001 | Test Traceability Matrix | Test Case Mapping&lt;br /&gt;
| PGCBL-ADD-001 | Architecture Decision Records | Design Documentation&lt;br /&gt;
&lt;br /&gt;
This index provides a structured overview of the document set, facilitating easy navigation and understanding of the interrelated components.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4747</id>
		<title>Design standards</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4747"/>
		<updated>2026-03-25T15:09:46Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Index of Document Engineering and System Requirements =&lt;br /&gt;
&lt;br /&gt;
# [[Document Engineering]]&lt;br /&gt;
# [[Scope and Applicability]]&lt;br /&gt;
# Assumptions and Dependencies ==&lt;br /&gt;
# Non-Functional Requirements ==&lt;br /&gt;
# Test Traceability Matrix ==&lt;br /&gt;
# Naming and Coding Standards ==&lt;br /&gt;
# Business Requirement Document (BRD) ==&lt;br /&gt;
== Cross-Document References ==&lt;br /&gt;
; Document ID | Title | Relationship&lt;br /&gt;
|---|---|---&lt;br /&gt;
| PGCBL-SAD-001 | Scope and Applicability | Navigation Guide&lt;br /&gt;
| PGCBL-NFR-001 | Non-Functional Requirements | Quality Attributes Complement&lt;br /&gt;
| PGCBL-TSD-001 | Technical Specification | Implementation Details&lt;br /&gt;
| PGCBL-TTM-001 | Test Traceability Matrix | Test Case Mapping&lt;br /&gt;
| PGCBL-ADD-001 | Architecture Decision Records | Design Documentation&lt;br /&gt;
&lt;br /&gt;
This index provides a structured overview of the document set, facilitating easy navigation and understanding of the interrelated components.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Scope_and_applicability&amp;diff=4746</id>
		<title>Scope and applicability</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Scope_and_applicability&amp;diff=4746"/>
		<updated>2026-03-25T15:00:33Z</updated>

		<summary type="html">&lt;p&gt;Martin: Created page with &amp;quot;&amp;lt;span id=&amp;quot;scope-and-applicability-document&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Scope and Applicability Document =  {| !width=&amp;quot;23%&amp;quot;| Field !width=&amp;quot;76%&amp;quot;| Value |- | Document ID | PGCBL-SAD-001 |- | Document Type | Scope and Applicability Document |- | System | pgcobol — Prime Numbers Application v1.0 |- | Version | 1.0 |- | Status | Approved |- | Owner | Lead Developer |- | Author | [reverse-engineered from source artifacts] |- | Created | 2026-03-17 |- | Last modified | 2026-03-17 |- | Classifi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;scope-and-applicability-document&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Scope and Applicability Document =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;76%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Document ID&lt;br /&gt;
| PGCBL-SAD-001&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Scope and Applicability Document&lt;br /&gt;
|-&lt;br /&gt;
| System&lt;br /&gt;
| pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
|-&lt;br /&gt;
| Version&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Approved&lt;br /&gt;
|-&lt;br /&gt;
| Owner&lt;br /&gt;
| Lead Developer&lt;br /&gt;
|-&lt;br /&gt;
| Author&lt;br /&gt;
| [reverse-engineered from source artifacts]&lt;br /&gt;
|-&lt;br /&gt;
| Created&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Last modified&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Classification&lt;br /&gt;
| Internal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;version-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;13%&amp;quot;| Version&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Date&lt;br /&gt;
!width=&amp;quot;13%&amp;quot;| Author&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Status&lt;br /&gt;
!width=&amp;quot;38%&amp;quot;| Change Summary&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Draft&lt;br /&gt;
| Initial reverse-eng draft&lt;br /&gt;
|-&lt;br /&gt;
| 1.0&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Approved&lt;br /&gt;
| Baselined&lt;br /&gt;
|}&lt;br /&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-purpose|Purpose]]&lt;br /&gt;
# [[#2-system-scope|System Scope]]&lt;br /&gt;
# [[#3-document-set-scope|Document Set Scope]]&lt;br /&gt;
# [[#4-audience|Audience]]&lt;br /&gt;
# [[#5-related-documents|Related Documents]]&lt;br /&gt;
# [[#6-open-issues|Open Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&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. Purpose ==&lt;br /&gt;
&lt;br /&gt;
This document defines what is and is not covered by the pgcobol specification set. It exists to prevent readers from applying any single document outside its intended context, and to provide a navigational entry point to the full document set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. System Scope ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;what-the-system-is&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.1 What the system is ===&lt;br /&gt;
&lt;br /&gt;
pgcobol is a three-tier batch COBOL application that:&lt;br /&gt;
&lt;br /&gt;
* Generates prime numbers by trial division and stores them in a PostgreSQL database.&lt;br /&gt;
* Reads stored primes from the database and produces a formatted line-printer report.&lt;br /&gt;
&lt;br /&gt;
It runs as a command-line batch job on Linux. There is no interactive interface.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-boundary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.2 System boundary ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inside scope:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The four COBOL programs: &amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primesgen&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The five copybooks that define the inter-tier interfaces.&lt;br /&gt;
* The PostgreSQL schema &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; and its objects.&lt;br /&gt;
* The output file &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The console log output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outside scope:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The GnuCOBOL compiler and GixSQL pre-processor (third-party tools, not modified).&lt;br /&gt;
* The PostgreSQL server installation and administration.&lt;br /&gt;
* The operating system, file system, and network infrastructure.&lt;br /&gt;
* Any job scheduler or wrapper scripts.&lt;br /&gt;
* Any downstream processing of &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-version-covered&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.3 System version covered ===&lt;br /&gt;
&lt;br /&gt;
This document set describes pgcobol as found in source artifacts dated November–December 2025, compiled under GnuCOBOL 4.0-early-dev.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;what-is-explicitly-not-covered&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2.4 What is explicitly not covered ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Excluded topic&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Reason&lt;br /&gt;
|-&lt;br /&gt;
| Prime numbers beyond 999,999,999&lt;br /&gt;
| Hard-coded upper bound in the source&lt;br /&gt;
|-&lt;br /&gt;
| Even primes (2)&lt;br /&gt;
| The algorithm tests odd candidates only; prime 2 is a known seeding gap&lt;br /&gt;
|-&lt;br /&gt;
| Interactive or web interfaces&lt;br /&gt;
| Not implemented&lt;br /&gt;
|-&lt;br /&gt;
| Concurrent execution&lt;br /&gt;
| Single-process batch design; no concurrency controls present&lt;br /&gt;
|-&lt;br /&gt;
| Encryption or secure credential storage&lt;br /&gt;
| Not implemented in this version&lt;br /&gt;
|-&lt;br /&gt;
| High-availability or disaster recovery&lt;br /&gt;
| Not in scope for this version&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;document-set-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Document Set Scope ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;documents-in-this-set&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.1 Documents in this set ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;26%&amp;quot;| Document ID&lt;br /&gt;
!width=&amp;quot;9%&amp;quot;| Type&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Title&lt;br /&gt;
!width=&amp;quot;12%&amp;quot;| Covers&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-SAD-001&lt;br /&gt;
| SAD&lt;br /&gt;
| Scope and Applicability&lt;br /&gt;
| Navigation and scope&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-BRD-001&lt;br /&gt;
| BRD&lt;br /&gt;
| Business Requirements&lt;br /&gt;
| What the system must do&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-NFR-001&lt;br /&gt;
| NFR&lt;br /&gt;
| Non-Functional Requirements&lt;br /&gt;
| Quality attributes&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-TSD-001&lt;br /&gt;
| TSD&lt;br /&gt;
| Technical Specification&lt;br /&gt;
| Architecture and pseudocode&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-DDD-001&lt;br /&gt;
| DDD&lt;br /&gt;
| Data Dictionary&lt;br /&gt;
| All fields and structures&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-FLD-001&lt;br /&gt;
| FLD&lt;br /&gt;
| Flow Diagrams&lt;br /&gt;
| Mermaid process diagrams&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-PLG-001&lt;br /&gt;
| PLG&lt;br /&gt;
| Program Logic Guide&lt;br /&gt;
| Step-by-step paragraph logic&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-BRG-001&lt;br /&gt;
| BRG&lt;br /&gt;
| Business Rules Guide&lt;br /&gt;
| Rules, calculations, validations&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-IOB-001&lt;br /&gt;
| IOB&lt;br /&gt;
| I/O Behaviour&lt;br /&gt;
| File, console, DB I/O&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-CFD-001&lt;br /&gt;
| CFD&lt;br /&gt;
| Control Flow Document&lt;br /&gt;
| PERFORM/CALL trees&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-ADD-001&lt;br /&gt;
| ADD&lt;br /&gt;
| Architecture Decision Records&lt;br /&gt;
| Design decisions and rationale&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-TTM-001&lt;br /&gt;
| TTM&lt;br /&gt;
| Test Traceability Matrix&lt;br /&gt;
| Requirements → design → tests&lt;br /&gt;
|-&lt;br /&gt;
| PGCBL-NCS-001&lt;br /&gt;
| NCS&lt;br /&gt;
| Naming and Coding Standard&lt;br /&gt;
| COBOL conventions&lt;br /&gt;
|-&lt;br /&gt;
| STD-DOC-001&lt;br /&gt;
| STD&lt;br /&gt;
| Document Engineering Standard&lt;br /&gt;
| This document set’s scaffolding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;how-to-use-this-set&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3.2 How to use this set ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! I want to…&lt;br /&gt;
! Start with…&lt;br /&gt;
|-&lt;br /&gt;
| Understand what the system must do&lt;br /&gt;
| PGCBL-BRD-001&lt;br /&gt;
|-&lt;br /&gt;
| Understand the overall architecture&lt;br /&gt;
| PGCBL-TSD-001 §1–2&lt;br /&gt;
|-&lt;br /&gt;
| Look up a specific data field&lt;br /&gt;
| PGCBL-DDD-001&lt;br /&gt;
|-&lt;br /&gt;
| Understand how a program works step-by-step&lt;br /&gt;
| PGCBL-PLG-001&lt;br /&gt;
|-&lt;br /&gt;
| Understand why a design decision was made&lt;br /&gt;
| PGCBL-ADD-001&lt;br /&gt;
|-&lt;br /&gt;
| Check what tests cover a requirement&lt;br /&gt;
| PGCBL-TTM-001&lt;br /&gt;
|-&lt;br /&gt;
| Write new COBOL code to the same standards&lt;br /&gt;
| PGCBL-NCS-001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;audience&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Audience ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Audience&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Assumed knowledge&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Documents most relevant&lt;br /&gt;
|-&lt;br /&gt;
| COBOL developer&lt;br /&gt;
| COBOL syntax, batch processing&lt;br /&gt;
| TSD, PLG, CFD, NCS&lt;br /&gt;
|-&lt;br /&gt;
| Database developer&lt;br /&gt;
| SQL, PostgreSQL&lt;br /&gt;
| TSD §5, DDD §12, IOB §3&lt;br /&gt;
|-&lt;br /&gt;
| Business analyst&lt;br /&gt;
| None technical required&lt;br /&gt;
| BRD, BRG&lt;br /&gt;
|-&lt;br /&gt;
| QA engineer&lt;br /&gt;
| Testing concepts&lt;br /&gt;
| TTM, BRD, BRG&lt;br /&gt;
|-&lt;br /&gt;
| Architect / reviewer&lt;br /&gt;
| Systems design&lt;br /&gt;
| TSD, ADD, NFR&lt;br /&gt;
|-&lt;br /&gt;
| New team member&lt;br /&gt;
| None&lt;br /&gt;
| SAD (start here), then BRD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;related-documents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Related Documents ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;27%&amp;quot;| Document ID&lt;br /&gt;
!width=&amp;quot;49%&amp;quot;| Title&lt;br /&gt;
!width=&amp;quot;22%&amp;quot;| Relationship&lt;br /&gt;
|-&lt;br /&gt;
| STD-DOC-001&lt;br /&gt;
| Document Engineering Standard&lt;br /&gt;
| Governs the format of all documents in this set&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Open Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;8%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;60%&amp;quot;| Issue&lt;br /&gt;
!width=&amp;quot;8%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;13%&amp;quot;| Target&lt;br /&gt;
!width=&amp;quot;9%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| OI-01&lt;br /&gt;
| System version identifier not present in source; version inferred from compiler listing date&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4745</id>
		<title>Design standards</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4745"/>
		<updated>2026-03-25T14:59:25Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* 2. Scope and Applicability */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Index of Document Engineering and System Requirements =&lt;br /&gt;
&lt;br /&gt;
== 1. Document Engineering ==&lt;br /&gt;
- [[Document Versioning|Versioning Rules]]&lt;br /&gt;
   - Major version increments (e.g., 1.0)&lt;br /&gt;
   - Minor version updates (e.g., 1.1, 1.2)&lt;br /&gt;
- [[Mandatory Sections in Documents|Mandatory Sections]]&lt;br /&gt;
   - Scope and Applicability&lt;br /&gt;
   - Audience Identification&lt;br /&gt;
   - Related Documents Reference&lt;br /&gt;
- [[Document Format Standards|Format Standards]]&lt;br /&gt;
   - Mediawiki Syntax Usage&lt;br /&gt;
   - Template Application&lt;br /&gt;
&lt;br /&gt;
== 2. Scope and Applicability ==&lt;br /&gt;
[[Scope and applicability]]&lt;br /&gt;
- [[System Version Identifier|System Version Identifier]]&lt;br /&gt;
   - pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
- [[Document Hierarchy|Document Hierarchy]]&lt;br /&gt;
   - Navigation Links Between Documents&lt;br /&gt;
- [[Component Coverage|Component Coverage]]&lt;br /&gt;
   - Covered Components: dal-methods, ui-methods, methods&lt;br /&gt;
&lt;br /&gt;
== 3. Assumptions and Dependencies ==&lt;br /&gt;
- [[Assumption Register|Assumption Register (PGCBL-SAD-002)]]&lt;br /&gt;
   - Key Items and Their Types&lt;br /&gt;
- [[Dependency Management|Dependency Handling]]&lt;br /&gt;
   - External Systems and Interfaces&lt;br /&gt;
- [[Constraint Handling|Constraints Overview]]&lt;br /&gt;
&lt;br /&gt;
== 4. Non-Functional Requirements ==&lt;br /&gt;
- [[Quality Attributes|Using ISO/IEC 25010 Taxonomy]]&lt;br /&gt;
   - Categories: Auditability, Compliance, Operability&lt;br /&gt;
- [[Requirement Taxonomy|Taxonomy Details]]&lt;br /&gt;
   - Hierarchical breakdown of requirements&lt;br /&gt;
&lt;br /&gt;
== 5. Architecture Decision Records ==&lt;br /&gt;
- [[Design Decisions|Architecture Decisions (ADR-005)]]&lt;br /&gt;
   - Option C Implementation Details&lt;br /&gt;
- [[Consequences of Choices|Positive and Negative Outcomes]]&lt;br /&gt;
   - Impact Analysis of Design Choices&lt;br /&gt;
- [[Known Issues|Current Issues]]&lt;br /&gt;
   - Duplicate copybooks, Versioning Conflicts&lt;br /&gt;
&lt;br /&gt;
== 6. Test Traceability Matrix ==&lt;br /&gt;
- [[Test Planning|Matrix Structure]]&lt;br /&gt;
   - PGCBL-TTM-001 Template&lt;br /&gt;
- [[Requirements Mapping|Mapping Requirements to Tests]]&lt;br /&gt;
   - BRD and NFR Integration&lt;br /&gt;
- [[Status Tracking|Test Case Status]]&lt;br /&gt;
   - Draft, In Progress, Completed&lt;br /&gt;
&lt;br /&gt;
== 7. Naming and Coding Standards ==&lt;br /&gt;
- [[Source File Conventions|File Naming Rules]]&lt;br /&gt;
   - Verb Usage in Copybooks&lt;br /&gt;
- [[Division Structure|Code Division Hierarchy]]&lt;br /&gt;
   - Module Organization&lt;br /&gt;
- [[Compliance with Standards|Standards Adherence]]&lt;br /&gt;
   - Coding Best Practices&lt;br /&gt;
&lt;br /&gt;
== 8. Business Requirement Document (BRD) ==&lt;br /&gt;
- [[Audience and Distribution|Intended Readers]]&lt;br /&gt;
   - Business Analysts, QA Engineers&lt;br /&gt;
- [[Related Documents Linkage|Document Relationships]]&lt;br /&gt;
   - SAD, NFR, TSD, TTM, ADD&lt;br /&gt;
- [[Assumptions and Dependencies Overview|Key Dependencies]]&lt;br /&gt;
   - System Integration Points&lt;br /&gt;
&lt;br /&gt;
== Cross-Document References ==&lt;br /&gt;
; Document ID | Title | Relationship&lt;br /&gt;
|---|---|---&lt;br /&gt;
| PGCBL-SAD-001 | Scope and Applicability | Navigation Guide&lt;br /&gt;
| PGCBL-NFR-001 | Non-Functional Requirements | Quality Attributes Complement&lt;br /&gt;
| PGCBL-TSD-001 | Technical Specification | Implementation Details&lt;br /&gt;
| PGCBL-TTM-001 | Test Traceability Matrix | Test Case Mapping&lt;br /&gt;
| PGCBL-ADD-001 | Architecture Decision Records | Design Documentation&lt;br /&gt;
&lt;br /&gt;
This index provides a structured overview of the document set, facilitating easy navigation and understanding of the interrelated components.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4744</id>
		<title>Design standards</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4744"/>
		<updated>2026-03-25T14:57:49Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Index of Document Engineering and System Requirements =&lt;br /&gt;
&lt;br /&gt;
== 1. Document Engineering ==&lt;br /&gt;
- [[Document Versioning|Versioning Rules]]&lt;br /&gt;
   - Major version increments (e.g., 1.0)&lt;br /&gt;
   - Minor version updates (e.g., 1.1, 1.2)&lt;br /&gt;
- [[Mandatory Sections in Documents|Mandatory Sections]]&lt;br /&gt;
   - Scope and Applicability&lt;br /&gt;
   - Audience Identification&lt;br /&gt;
   - Related Documents Reference&lt;br /&gt;
- [[Document Format Standards|Format Standards]]&lt;br /&gt;
   - Mediawiki Syntax Usage&lt;br /&gt;
   - Template Application&lt;br /&gt;
&lt;br /&gt;
== 2. Scope and Applicability ==&lt;br /&gt;
- [[System Version Identifier|System Version Identifier]]&lt;br /&gt;
   - pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
- [[Document Hierarchy|Document Hierarchy]]&lt;br /&gt;
   - Navigation Links Between Documents&lt;br /&gt;
- [[Component Coverage|Component Coverage]]&lt;br /&gt;
   - Covered Components: dal-methods, ui-methods, methods&lt;br /&gt;
&lt;br /&gt;
== 3. Assumptions and Dependencies ==&lt;br /&gt;
- [[Assumption Register|Assumption Register (PGCBL-SAD-002)]]&lt;br /&gt;
   - Key Items and Their Types&lt;br /&gt;
- [[Dependency Management|Dependency Handling]]&lt;br /&gt;
   - External Systems and Interfaces&lt;br /&gt;
- [[Constraint Handling|Constraints Overview]]&lt;br /&gt;
&lt;br /&gt;
== 4. Non-Functional Requirements ==&lt;br /&gt;
- [[Quality Attributes|Using ISO/IEC 25010 Taxonomy]]&lt;br /&gt;
   - Categories: Auditability, Compliance, Operability&lt;br /&gt;
- [[Requirement Taxonomy|Taxonomy Details]]&lt;br /&gt;
   - Hierarchical breakdown of requirements&lt;br /&gt;
&lt;br /&gt;
== 5. Architecture Decision Records ==&lt;br /&gt;
- [[Design Decisions|Architecture Decisions (ADR-005)]]&lt;br /&gt;
   - Option C Implementation Details&lt;br /&gt;
- [[Consequences of Choices|Positive and Negative Outcomes]]&lt;br /&gt;
   - Impact Analysis of Design Choices&lt;br /&gt;
- [[Known Issues|Current Issues]]&lt;br /&gt;
   - Duplicate copybooks, Versioning Conflicts&lt;br /&gt;
&lt;br /&gt;
== 6. Test Traceability Matrix ==&lt;br /&gt;
- [[Test Planning|Matrix Structure]]&lt;br /&gt;
   - PGCBL-TTM-001 Template&lt;br /&gt;
- [[Requirements Mapping|Mapping Requirements to Tests]]&lt;br /&gt;
   - BRD and NFR Integration&lt;br /&gt;
- [[Status Tracking|Test Case Status]]&lt;br /&gt;
   - Draft, In Progress, Completed&lt;br /&gt;
&lt;br /&gt;
== 7. Naming and Coding Standards ==&lt;br /&gt;
- [[Source File Conventions|File Naming Rules]]&lt;br /&gt;
   - Verb Usage in Copybooks&lt;br /&gt;
- [[Division Structure|Code Division Hierarchy]]&lt;br /&gt;
   - Module Organization&lt;br /&gt;
- [[Compliance with Standards|Standards Adherence]]&lt;br /&gt;
   - Coding Best Practices&lt;br /&gt;
&lt;br /&gt;
== 8. Business Requirement Document (BRD) ==&lt;br /&gt;
- [[Audience and Distribution|Intended Readers]]&lt;br /&gt;
   - Business Analysts, QA Engineers&lt;br /&gt;
- [[Related Documents Linkage|Document Relationships]]&lt;br /&gt;
   - SAD, NFR, TSD, TTM, ADD&lt;br /&gt;
- [[Assumptions and Dependencies Overview|Key Dependencies]]&lt;br /&gt;
   - System Integration Points&lt;br /&gt;
&lt;br /&gt;
== Cross-Document References ==&lt;br /&gt;
; Document ID | Title | Relationship&lt;br /&gt;
|---|---|---&lt;br /&gt;
| PGCBL-SAD-001 | Scope and Applicability | Navigation Guide&lt;br /&gt;
| PGCBL-NFR-001 | Non-Functional Requirements | Quality Attributes Complement&lt;br /&gt;
| PGCBL-TSD-001 | Technical Specification | Implementation Details&lt;br /&gt;
| PGCBL-TTM-001 | Test Traceability Matrix | Test Case Mapping&lt;br /&gt;
| PGCBL-ADD-001 | Architecture Decision Records | Design Documentation&lt;br /&gt;
&lt;br /&gt;
This index provides a structured overview of the document set, facilitating easy navigation and understanding of the interrelated components.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4743</id>
		<title>Design standards</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4743"/>
		<updated>2026-03-25T14:55:38Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
```mediawiki&lt;br /&gt;
= Index of Document Engineering and System Requirements =&lt;br /&gt;
&lt;br /&gt;
== 1. Document Engineering ==&lt;br /&gt;
- [[Document Versioning|Versioning Rules]]&lt;br /&gt;
   - Major version increments (e.g., 1.0)&lt;br /&gt;
   - Minor version updates (e.g., 1.1, 1.2)&lt;br /&gt;
- [[Mandatory Sections in Documents|Mandatory Sections]]&lt;br /&gt;
   - Scope and Applicability&lt;br /&gt;
   - Audience Identification&lt;br /&gt;
   - Related Documents Reference&lt;br /&gt;
- [[Document Format Standards|Format Standards]]&lt;br /&gt;
   - Mediawiki Syntax Usage&lt;br /&gt;
   - Template Application&lt;br /&gt;
&lt;br /&gt;
== 2. Scope and Applicability ==&lt;br /&gt;
- [[System Version Identifier|System Version Identifier]]&lt;br /&gt;
   - pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
- [[Document Hierarchy|Document Hierarchy]]&lt;br /&gt;
   - Navigation Links Between Documents&lt;br /&gt;
- [[Component Coverage|Component Coverage]]&lt;br /&gt;
   - Covered Components: dal-methods, ui-methods, methods&lt;br /&gt;
&lt;br /&gt;
== 3. Assumptions and Dependencies ==&lt;br /&gt;
- [[Assumption Register|Assumption Register (PGCBL-SAD-002)]]&lt;br /&gt;
   - Key Items and Their Types&lt;br /&gt;
- [[Dependency Management|Dependency Handling]]&lt;br /&gt;
   - External Systems and Interfaces&lt;br /&gt;
- [[Constraint Handling|Constraints Overview]]&lt;br /&gt;
&lt;br /&gt;
== 4. Non-Functional Requirements ==&lt;br /&gt;
- [[Quality Attributes|Using ISO/IEC 25010 Taxonomy]]&lt;br /&gt;
   - Categories: Auditability, Compliance, Operability&lt;br /&gt;
- [[Requirement Taxonomy|Taxonomy Details]]&lt;br /&gt;
   - Hierarchical breakdown of requirements&lt;br /&gt;
&lt;br /&gt;
== 5. Architecture Decision Records ==&lt;br /&gt;
- [[Design Decisions|Architecture Decisions (ADR-005)]]&lt;br /&gt;
   - Option C Implementation Details&lt;br /&gt;
- [[Consequences of Choices|Positive and Negative Outcomes]]&lt;br /&gt;
   - Impact Analysis of Design Choices&lt;br /&gt;
- [[Known Issues|Current Issues]]&lt;br /&gt;
   - Duplicate copybooks, Versioning Conflicts&lt;br /&gt;
&lt;br /&gt;
== 6. Test Traceability Matrix ==&lt;br /&gt;
- [[Test Planning|Matrix Structure]]&lt;br /&gt;
   - PGCBL-TTM-001 Template&lt;br /&gt;
- [[Requirements Mapping|Mapping Requirements to Tests]]&lt;br /&gt;
   - BRD and NFR Integration&lt;br /&gt;
- [[Status Tracking|Test Case Status]]&lt;br /&gt;
   - Draft, In Progress, Completed&lt;br /&gt;
&lt;br /&gt;
== 7. Naming and Coding Standards ==&lt;br /&gt;
- [[Source File Conventions|File Naming Rules]]&lt;br /&gt;
   - Verb Usage in Copybooks&lt;br /&gt;
- [[Division Structure|Code Division Hierarchy]]&lt;br /&gt;
   - Module Organization&lt;br /&gt;
- [[Compliance with Standards|Standards Adherence]]&lt;br /&gt;
   - Coding Best Practices&lt;br /&gt;
&lt;br /&gt;
== 8. Business Requirement Document (BRD) ==&lt;br /&gt;
- [[Audience and Distribution|Intended Readers]]&lt;br /&gt;
   - Business Analysts, QA Engineers&lt;br /&gt;
- [[Related Documents Linkage|Document Relationships]]&lt;br /&gt;
   - SAD, NFR, TSD, TTM, ADD&lt;br /&gt;
- [[Assumptions and Dependencies Overview|Key Dependencies]]&lt;br /&gt;
   - System Integration Points&lt;br /&gt;
&lt;br /&gt;
== Cross-Document References ==&lt;br /&gt;
; Document ID | Title | Relationship&lt;br /&gt;
|---|---|---&lt;br /&gt;
| PGCBL-SAD-001 | Scope and Applicability | Navigation Guide&lt;br /&gt;
| PGCBL-NFR-001 | Non-Functional Requirements | Quality Attributes Complement&lt;br /&gt;
| PGCBL-TSD-001 | Technical Specification | Implementation Details&lt;br /&gt;
| PGCBL-TTM-001 | Test Traceability Matrix | Test Case Mapping&lt;br /&gt;
| PGCBL-ADD-001 | Architecture Decision Records | Design Documentation&lt;br /&gt;
&lt;br /&gt;
This index provides a structured overview of the document set, facilitating easy navigation and understanding of the interrelated components.&lt;br /&gt;
```&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4742</id>
		<title>Design standards</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Design_standards&amp;diff=4742"/>
		<updated>2026-03-25T13:55:38Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# Document Index&lt;br /&gt;
&lt;br /&gt;
## Architecture Decision Records (ADR)&lt;br /&gt;
### File: `04_architecture_decision_records.mediawiki`&lt;br /&gt;
- **Purpose**: Captures significant design decisions and their consequences.&lt;br /&gt;
- **Format**: Follows the MADR format, a lightweight standard for documenting architectural decisions.&lt;br /&gt;
- **Contents**:&lt;br /&gt;
  - ADR template&lt;br /&gt;
  - Specific decisions (e.g., Three-Tier Architecture)&lt;br /&gt;
&lt;br /&gt;
## Test Traceability Matrix (TTM)&lt;br /&gt;
### File: `05_test_traceability_matrix.mediawiki`&lt;br /&gt;
- **Purpose**: Tracks the relationship between requirements and test cases.&lt;br /&gt;
- **Contents**:&lt;br /&gt;
  - TC-NFT-002 — Performance: divider lookup query plan&lt;br /&gt;
  - TC-NFT-003 — Reliability: graceful DB failure mid-run&lt;br /&gt;
&lt;br /&gt;
## Non-Functional Requirements (NFR)&lt;br /&gt;
### File: `03_non_functional_requirements.mediawiki`&lt;br /&gt;
- **Purpose**: Specifies quality attributes of the system.&lt;br /&gt;
- **Taxonomy**: Uses ISO/IEC 25010:2011 (SQuaRE) model.&lt;br /&gt;
- **Contents**:&lt;br /&gt;
  - Categories: Performance, Reliability, Security, etc.&lt;br /&gt;
&lt;br /&gt;
## Business Requirements Document (BRD)&lt;br /&gt;
### File: `07_brd_pgcbl-brd-001.mediawiki`&lt;br /&gt;
- **Purpose**: Defines business requirements and scope.&lt;br /&gt;
- **Audience**: Business analysts, QA engineers, stakeholders.&lt;br /&gt;
- **Contents**:&lt;br /&gt;
  - Assumptions and dependencies&lt;br /&gt;
  - Out of Scope items&lt;br /&gt;
  - Open issues (e.g., FR-01: generate loop commented out)&lt;br /&gt;
&lt;br /&gt;
## Naming Coding Standard&lt;br /&gt;
### File: `06_naming_coding_standard.mediawiki`&lt;br /&gt;
- **Purpose**: Standards for source file conventions.&lt;br /&gt;
- **Status**:&lt;br /&gt;
  - Version: 1.0&lt;br /&gt;
  - Approved and baselined.&lt;br /&gt;
&lt;br /&gt;
## Scope and Applicability (SAD)&lt;br /&gt;
### File: `02_scope_and_applicability.mediawiki`&lt;br /&gt;
- **Purpose**: Defines the document set and its navigation.&lt;br /&gt;
- **Related Documents**:&lt;br /&gt;
  - Links to other documents in the set.&lt;br /&gt;
&lt;br /&gt;
## Technical Specification Document (TSD)&lt;br /&gt;
### File: `01_technical_specification.mediawiki`&lt;br /&gt;
- **Purpose**: Implements system requirements.&lt;br /&gt;
- **Assumptions**: See PGCBL-SAD-002 for full register.&lt;br /&gt;
&lt;br /&gt;
## Assumptions and Dependencies Register&lt;br /&gt;
### File: `08_assumptions_and_dependencies_register.mediawiki`&lt;br /&gt;
- **Contents**:&lt;br /&gt;
  - Key assumptions and dependencies (e.g., A-01, C-01)&lt;br /&gt;
&lt;br /&gt;
## Test Case Catalogue&lt;br /&gt;
### File: `05_test_traceability_matrix.mediawiki`&lt;br /&gt;
- **Purpose**: Catalogues test cases linked to requirements.&lt;br /&gt;
- **Status**: Includes planned tests requiring fixes.&lt;br /&gt;
&lt;br /&gt;
## Out of Scope Items&lt;br /&gt;
### File: `07_brd_pgcbl-brd-001.mediawiki`&lt;br /&gt;
- **Contents**:&lt;br /&gt;
  - Exclusions from the system&#039;s functionality.&lt;br /&gt;
&lt;br /&gt;
## Open Issues and Defects&lt;br /&gt;
### File: `09_open_issues_and_defects.mediawiki`&lt;br /&gt;
- **Contents**:&lt;br /&gt;
  - Known issues (e.g., OI-01, D-01)&lt;br /&gt;
  - Targets and owners&lt;br /&gt;
&lt;br /&gt;
## Cross-References&lt;br /&gt;
- **Related Documents**: Each document references others in the set, such as SAD, NFR, TSD, ADR, and TTM.&lt;br /&gt;
&lt;br /&gt;
## Revision History&lt;br /&gt;
- **Version Control**: Not explicitly detailed in provided context.&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=COBOL_Std_1_Purpose_and_Scope&amp;diff=4741</id>
		<title>COBOL Std 1 Purpose and Scope</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=COBOL_Std_1_Purpose_and_Scope&amp;diff=4741"/>
		<updated>2026-03-25T13:48:30Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1. Purpose and Scope ==&lt;br /&gt;
&lt;br /&gt;
This document defines the baseline coding standard for COBOL programs targeting GnuCOBOL 4.x on Linux, with optional GixSQL pre-processing for embedded PostgreSQL access. It applies to all newly written programs, to programs undergoing significant modification, and to reverse-engineering or migration work.&lt;br /&gt;
&lt;br /&gt;
The standard covers four concerns:&lt;br /&gt;
&lt;br /&gt;
* Source-code layout and formatting&lt;br /&gt;
* Naming conventions for data items, paragraphs, copybooks, and files&lt;br /&gt;
* Structural and architectural patterns (divisions, tiers, method-dispatch)&lt;br /&gt;
* Error handling, embedded SQL, and output formatting rules&lt;br /&gt;
&lt;br /&gt;
{{Ambox&lt;br /&gt;
name  = COBOL Std 1 Purpose and Scope{{subst:void|Don&#039;t change anything on this line. It will change itself when you save.}}&lt;br /&gt;
subst = &amp;lt;includeonly&amp;gt;{{subst:substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
type  = notice&lt;br /&gt;
text  = &#039;&#039;&#039;Compliance note&#039;&#039;&#039; — Existing programs may deviate from this standard. Any modification touching more than 20 % of a program&#039;s statements must bring the changed portions into conformance.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
[[Cobol programming standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
</feed>