Revision history for Trog-SQLite

0.005 2026-10-26 TEODESIAN
    - dbh sets AutoInactiveDestroy, so a forked child that calls forget,
      or exits, no longer closes the handle of its parent.  DBI rolled back
      the parent's open transaction from the child, and the parent then
      committed it without the pages that the transaction had already
      written to the WAL, and with a damaged database.
    - dbh takes an optional hash of options.  With integrity_check, it runs
      PRAGMA integrity_check before the schema and dies if the check fails.
      integrity_check, the function, runs the check on any handle.
    - dbh notices that it runs in a forked child, and opens a new handle
      for it.  A child that called dbh without calling forget first got
      its parent's handle, and two processes then used one connection.

0.004 2026-10-23 TEODESIAN
    - transaction runs a sub in one transaction, and rolls it back if the
      sub dies.  Inside a transaction that the caller began, it runs the
      sub in that one, and leaves the commit to the caller.

0.003 2026-10-22 TEODESIAN
    - The test of an error other than a lock opens a file that is not a
      database, not a read-only file.  Root writes a read-only file, so the
      test failed when root installed the distribution.

0.002 2026-10-22 TEODESIAN
    - dbh waits for a write lock before it sets the journal mode to WAL.
      SQLite fails that change at once with SQLITE_BUSY, and does not wait
      for busy_timeout, so a process that opened a new database while
      another one wrote to it died with "database is locked".  wal tries
      again for as long as busy_timeout, with Sub::Retry.

0.001 2026-10-18 TEODESIAN
    - Initial release, from the copies in tCMS and trog-provisioner.
    - Versioned schema updates: NAME.vN.update.sql beside NAME.sql, each run
      once, in order, in its own transaction, and recorded in
      trog_sqlite_schema_version.
    - Handles have RaiseError on, and busy_timeout is set before the schema,
      so that a second process waits for the updates of the first.
    - bulk_insert quotes the table and the columns as identifiers, fills each
      batch up to the parameter limit, and returns 1.
