Release Notes

v1.3.0
Changelog 16 releases
v1.3.0 Deaths by Unit chart
2026-05-16
  • Added chartUnit.php — horizontal bar chart of top 60 units by death count, with full ranked table showing count and percentage of records with a known unit
  • Added "By Unit" link to the Personnel submenu in the Statistics navigation
  • Rebuilt chartUnit.php from scratch replacing an old incompatible version that referenced removed helpers (UnitID filter, CountNoUnit(), chartGeneric.php)
v1.2.8 Data quality migrations 5-11
2026-05-16
  • Migration 5 (Rank cleanup): NULLs out "Rank Unknown" / "Unknown Rank" variants, strips trailing full stop, normalises Serjeant/Serjeant Major/Lance Serjeant/Staff Serjeant to modern Sergeant spellings
  • Migration 6 (CauseDeath): strips trailing full stops from raw CauseDeath field
  • Migration 7 (Initials): replaces full stops with spaces in Initials field, collapses double spaces, NULLs out blank results
  • Migration 8 (Age): converts Age = 0 to NULL (placeholder values)
  • Migration 9 (DateDeath): converts DateDeath values starting with "-0001" to NULL (SQLite date placeholder)
  • Migration 10 (ServiceNo): trims leading/trailing whitespace from ServiceNo
  • Migration 11 (Rank/Regiment/Unit title-case): converts all-caps Rank, Regiment, and Unit fields to title case; handles Mc/Mac prefixes; processed in batches of 5,000 per page load
v1.2.9 Remove spare record placeholders
2026-05-16
  • Added migration 12 to fixDatabase.php: deletes all PersonInfoRaw rows where LastName = 'Spare Record' — these are structural placeholder entries with no real person data
v1.2.7 Title-case name fields
2026-05-16
  • Added migration 4 to fixDatabase.php: converts all-caps LastName and FirstName values to title case (e.g. ABBOTT to Abbott, MCDONALD to McDonald)
  • Handles hyphens, apostrophes, and Mc/Mac prefixes
  • Affects ~41,000 LastName and ~39,000 FirstName records; processed in batches of 5,000 per page load
v1.2.6 Name field split migration
2026-05-16
  • Added migration 3 to fixDatabase.php: for records where FirstName is empty and LastName contains a space, splits the combined field at the first space into correct LastName and FirstName values
  • Excludes 151 records with Afrikaans/Dutch/French compound surname prefixes (DE, DU, DA, VAN, VON, TEN, DEN, TER, LE, LA) which must not be split
  • Where Initials is also blank, derives initials from the extracted first name by taking the first letter of each word
  • Affects ~421 records
v1.2.5 Page title fixes
2026-05-16
  • Added missing entries to roh_page_display_title() for releases.php, about.php, and chart_views.php so pageviews.php shows friendly titles instead of raw filenames
v1.2.4 Minor text fix
2026-05-16
  • Changed about.php browser tab title from "Roll of Honour — About" to "Roll of Honour — About this site"
v1.2.3 ActualCause field — normalised cause of death
2026-05-16
  • Added ActualCause column to PersonInfoRaw — parsed from the raw CauseDeath field by stripping location/narrative suffixes after the first comma, stripping parenthetical asides, and normalising ~40 variant spellings to canonical categories (e.g. "Died of pulmonary tuberculosis" → "Died of tuberculosis", MVA variants → "Died in motor vehicle accident")
  • Updated chartCauseOfDeath.php and chartCauseOfDeathYear.php to group by ActualCause instead of raw CauseDeath — reduces ~13,330 distinct values to ~200 meaningful categories
  • Updated CountNoCause() and roh_batch_person_stats() to use ActualCause
  • Updated Data Completeness chart to check ActualCause for meaningful cause data
v1.2.2 Line graph on On This Day
2026-05-16
  • Converted the yearly trend chart on listOnThisDay.php from a bar chart to a line graph with filled area, curve tension, dot markers, and dark-theme axis styling
v1.2.1 Estimated birth year
2026-05-16
  • Added EstBirthYear column to PersonInfoRaw — calculated as death year minus age at death (accurate to ±1 year), covering 30,382 records
  • Added "Estimated Births by Decade" bar chart and table to chartAge.php
  • Added estimated birth year range column (min–max) to rank detail table in chartAgeRank.php
  • Added stacked "Births by Decade by Rank Group" chart to chartAgeRank.php
  • Split "Date of Birth" in chartCompleteness.php into two rows: recorded date of birth (6 records) and estimated birth year (30,382 records)
v1.2.0 Version bump
2026-05-16
  • Minor version bump to 1.2.0
v1.1.0 Seven new statistics pages
2026-05-16
  • Added chartMap.php — interactive Leaflet.js cemetery map, circle markers sized by burial count, top-20 sites table
  • Added chartConflict.php — deaths grouped by named conflict era (Anglo-Boer War, WW1, WW2, Korean War, Rhodesian Bush War, SA Border War, post-1990), plus per-year timeline coloured by conflict
  • Added chartMonth.php — deaths by calendar month with top-3 months highlighted
  • Added chartCompleteness.php — data quality dashboard: progress bars and radar chart for 16 fields across Identity, Military, Death Record, Location, and Other categories
  • Added chartAgeRank.php — average age at death by rank group (General/Flag Officer down to Other Rank), plus full age-distribution histogram
  • Added chartSurname.php — top-40 surname frequency horizontal bar chart with ranked table
  • Added chartCalendar.php — 365-day CSS heat map grid showing deaths per calendar day across all years, with top-20 days table
  • Reorganised Statistics nav dropdown into four headed sections: Deaths, Personnel, Geography, Data
v1.0.3 Fixed duplicate release notes
2026-05-16
  • Added UNIQUE constraint on roh_releases.version — INSERT OR IGNORE had nothing to conflict on so inserted a new row every page load
  • Added deduplication DELETE before index creation to clean up existing duplicates on the server
  • Added CREATE UNIQUE INDEX IF NOT EXISTS for pre-existing installs
v1.0.2 Removed duplicate page views page
2026-05-16
  • Deleted chart_views.php — pageviews.php is the superset (includes everything chart_views had plus Top 40 table and daily 3-month chart)
  • Updated footer Quick Links to point to pageviews.php
  • Removed chart_views.php entry from roh_page_display_title()
v1.0.1 Bug fix
2026-05-16
  • Fixed Personnel with Images count on home page — was counting locally downloaded files only (returned 1); now counts distinct PersonNumber values with a real image URL, excluding the no_image.jpg placeholder (correct count: 30,183)
v1.0.0 Initial versioned release
2026-05-16
  • Initial versioned release of the Roll of Honour website
  • Removed deprecated gethostbynamel() call — now uses dns_get_record() exclusively (PHP 8.3+ compatible)
  • Replaced INSERT/catch/UPDATE race condition in page-view counter with atomic INSERT … ON CONFLICT DO UPDATE
  • Removed dead dirList() function
  • Added roh_batch_person_stats() — replaces 9 separate COUNT queries with a single SQL statement
  • Fixed broken HTML document on person-not-found (footer and menu now always render)
  • Consolidated image-download logic in person.php to use SaveRemoteImage() and GetImgSrc()
  • Added versioning system: roh_settings and roh_releases tables, version badge in footer
  • Added About page (about.php)
  • Added Release Notes page (releases.php)

New releases are added with each update session. Source code: github.com/JohnDovey/CreateROH