• v7.17.0 Stable

    gitea-actions released this 2026-10-15 20:22:03 +00:00 | 23 commits to main since this release

    Data Controller for SAS - v7.17.0

    Released 15 October 2026.

    This release makes Data Controller work on more data, and faster. The viewer shows four times as many rows as before, the editor bounds a selection by cells as well as rows so a wide table cannot be opened by accident, and the grid library is upgraded for a large performance gain on sorting, editing and scrolling. A new admin action exports the Data Controller library itself as database DDL.

    There is no security content in this release. One optional migration raises the new limits on an existing install - see If you are upgrading.

    For installation / upgrade instructions, visit https://docs.datacontroller.io/


    Highlights

    Export the Data Controller library as DDL

    The System information screen gains a fourth admin action - Export DC Library DDL - that downloads the whole Data Controller library as database-specific DDL.

    Clicking EXPORT opens a secondary chooser for the flavour of the export:

    • SAS (default)
    • PGSQL
    • TSQL

    Choosing PGSQL or TSQL reveals an optional Schema box. The selection is passed to the existing services/admin/exportdb service, opened in a new window, as URL parameters - the same pattern the Download Configuration action already uses:

    • .../services/admin/exportdb&flavour=SAS
    • .../services/admin/exportdb&flavour=PGSQL&schema=DC

    Inserts are generated for the SAS and PGSQL flavours; the TSQL export is DDL only.

    The new admin action on the System information screen:

    System information screen with the Export DC Library DDL admin action

    The flavour chooser, defaulting to SAS, with no schema box:

    Export DC Library DDL modal with the SAS flavour selected

    PGSQL reveals the optional schema box:

    Export DC Library DDL modal with PGSQL selected and the schema set to DC

    TSQL, with the schema left blank:

    Export DC Library DDL modal with TSQL selected and the schema empty

    Higher VIEW and EDIT limits, and a new cell limit

    The row limits that bound what the grid will open are raised, and the editor gains a second limit that counts cells rather than rows:

    option was now
    DC_MAXOBS_WEBVIEW (VIEW) 500 2000
    DC_MAXOBS_WEBEDIT (EDIT) 100 250
    DC_MAXCELLS_WEBEDIT (EDIT) - 200000

    The EDIT screen now refuses a selection that is too big on either count - rows or cells (rows x columns) - whichever is reached first. A row cap alone cannot bound a wide table: 100 rows of a 1,001-column table already took about 17 seconds to open, and 1,000 rows took over two minutes. 250 rows and 200,000 cells keeps both ends in proportion, so a narrow table is bounded by rows and a very wide one by cells.

    A bigger, faster grid

    The grid library - handsontable and @handsontable/angular-wrapper - moves from 18.0.0 to 18.1.1. Besides three upstream bug fixes, the upgrade brings large performance gains on the operations that were slowest. Measured in the library, on one page, 50,000 rows x 12 columns, best of three:

    operation (50k rows) 18.0.0 18.1.1 change
    sort, one column 490 ms 21 ms -96%
    load data with a filter active 1,699 ms 1,265 ms -26%
    update settings 1,042 ms 588 ms -44%
    200 scattered cell edits 108,519 ms 7,842 ms -93%
    scroll to the last row 540 ms 38 ms -93%

    The upgrade also fixes three upstream bugs, two of which this repo's own test suite had pinned as "demonstrate the failure mode" cases - those tests now pin the fixed behaviour instead:

    • a sheet size limit error, where a licensing cap below an existing table's row count made the formula engine reject the whole table;
    • formula corruption when settings were updated while a sort was active, which turned formula cells into #REF!;
    • a crash in the filters plugin when editing a cell in a filtered column, or replacing the data with a filter active.

    Also in this release

    • The debug toggle survives a page refresh. The debug switch, which writes the session diagnostics to the job log, was reset on every reload; its state is now remembered.
    • The boot screen calls out a missing SASjs tag, and dumps the tag it does find. If the SASjs tag is absent or its version is not what the frontend expects, the startup checks say so explicitly instead of failing quietly; when the tag is present, its contents are written to the boot-screen log so a support ticket can quote them.

    The boot screen with no SASjs tag:

    The startup boot screen reporting a missing SASjs tag

    The same check with the tag present, dumping its contents:

    The startup boot screen dumping the SASjs tag contents

    • Row-level security is applied to selectbox source values. A dropdown whose list came from a table now honours that table's row-level security, so a user no longer sees values they are not entitled to (closes #340).
    • The requests modal is wider, so log lines need less horizontal scrolling.

    Before and after, on the requests modal:

    The requests modal before the width change

    The requests modal after the width change

    • Deploy screen fixes. The manual deploy actions are disabled while the admin groups are still loading, and disabled entirely when no admin group is configured, so an empty admin group can no longer be baked into the deploy script; the Viya identity calls are guarded the same way.

    The manual deploy actions disabled, because no admin group is configured:

    The deploy screen with the manual deploy actions disabled

    • The filter picker falls back to the public column metadata. When the underlying table is not returned, the picker's variables are now sourced from public/getcols, which also keeps the column format, label and the SAS C/N type vocabulary.

    If you are upgrading

    An existing install keeps the old 500 / 100 row limits until the migration 20261003_row_and_cell_limits.sas runs - the new defaults only apply to options that are absent. The migration is optional, but it is what moves a site onto the new limits. It skips any option a site has switched off (a current row with var_active=0), logging a note, rather than switching it back on.

    Nothing else in this release changes how existing tables, rules, hooks or screens behave, and no other configuration change is required.

    Verifying the download

    Every asset on this release is covered by the SHA256SUMS file. To verify a download, fetch SHA256SUMS from the release assets alongside the files you downloaded, then run:

    sha256sum --check SHA256SUMS --ignore-missing
    

    The command reports OK for each asset that matches. --ignore-missing lets you check just the files you downloaded rather than all of them.

    What this protects: a matching checksum confirms the asset is byte-for-byte the file this pipeline uploaded, guarding against corrupted or tampered downloads (mirrors, proxies, interrupted transfers). It is not a signature: the hashes travel in the same release as the files, so a compromise of the forge itself could alter both. Treat it as an integrity check, not a trust anchor.

    Downloads