Revision history for App-Access2CSV

0.001.1	Fri Oct  2 09:17:41 PM EDT 2026
        [ Bug fixes ]
        - --log with a name containing "..", "$", "!" or ";" (such as
          --log ../logs/run.log) created an empty log and lost every
          message, with only a "Cannot write to the log" warning
        - The log is now opened once, refusing symbolic links, and kept
          open for the run.  Before, it was reopened for every message, so
          a symbolic link planted after the check could still be written
          through
        - A directory given as standard input ("access2csv - < dir") is
          refused with "Cannot read standard input: Is a directory" on
          every system.  On NetBSD (and FreeBSD before 13) reading a
          directory returns its raw entries, which were exported as if they
          were a database:
          https://www.cpantesters.org/cpan/report/e9759fca-bda8-11f1-b0a1-a794297aa253
        - Table names longer than Access allows (64 characters) are
          shortened to 64 characters and at most 240 bytes, keeping whole
          characters, instead of failing with "File name too long".  Only
          a damaged or hostile database has such names.
        - Bytes in a table name that are not valid UTF-8 are replaced by
          "_" in the file name.  macOS refuses such file names, so those
          tables failed there with "Illegal byte sequence".

0.001.0	Mon Sep 28 02:13:38 PM EDT 2026
        First release.
        - access2csv: export every user table of an Access (.mdb/.accdb)
          database to one CSV file each, using mdbtools
        - Encodings: utf8, utf8-bom (for Excel) and cp1252; cp1252 refuses
          characters it cannot hold, with the line number
        - Safe file names: unsafe and invisible control characters
          replaced, Windows device names avoided, collisions numbered
          (ignoring case)
        - Each table written to a temporary file and renamed into place: a
          failure or interruption never leaves a half-written CSV, and an
          old file is replaced only by a complete new one
        - --table, --dry-run, --show-counts, --overwrite, --output-dir,
          --log/--no-log, --no-progress, --verbose, --version
        - "-" reads the database from standard input
        - Ctrl-C/SIGTERM stop the run cleanly
        - Security: no shell, "--" before names, relative PATH entries
          ignored, terminal output escaped, log symbolic links refused,
          taint mode (-T) supported
        - Messages through a translatable catalog (English included)
