Skip to content

qvd2parquet v2.3.0

Choose a tag to compare

@github-actions github-actions released this 28 Aug 21:24
· 4 commits to main since this release
14b77a0

A folder conversion learns which files to convert, and which not to convert
again. Both come from the same place: a nightly SAP extract is a directory, not
a file, and the two things you want to say about it are "only these" and "only
what changed".

--include-files and --exclude-files answer the first, and a wildcard in an
input path now expands even where the shell will not do it, which is every
Windows shell: cmd.exe expands nothing and PowerShell does not expand for an
external command, so qvds\CE*.qvd used to arrive verbatim and be reported as
a missing file.

--skip-up-to-date answers the second, and deliberately not by comparing
timestamps. Whether the Parquet is newer than the QVD cannot see that a flag
changed since, is fooled by an extract copied with its timestamps preserved,
and trusts two clocks on a network share to agree. All three end in a stale
output nobody is told about, which is worse than the conversion it saved. So a
run records what it produced and skips only what it produced, and the record
includes a fingerprint of everything that can change the bytes written.

No flag changed meaning and no conversion produces different data, so this is
minor rather than major: nothing is skipped or filtered without being asked
for, and the compatibility promise from 2.0.0 holds.

Added

  • --skip-up-to-date leaves a file alone when the run already produced its
    output, for a folder re-extracted nightly where most inputs have not changed.
    It is not a timestamp comparison: the run keeps a record in
    .qvd2parquet-manifest.json under --out-dir and skips only when the
    manifest names the output, the entry names this input, the input's size and
    timestamp still match, the output has not been replaced since, and the
    conversion options fingerprint the same. Mtime alone cannot see a changed flag, is fooled by an extract
    copied with its timestamps preserved, and trusts two clocks on a network
    share to agree.
  • The fingerprint covers every option that can change what is written,
    including the contents of a --schema override rather than only its path,
    every transition of --timezone rather than its name, and the tool's major
    version, which the stability promise makes sufficient. A timezone is
    fingerprinted by what it does because time.Local is called Local on every
    machine whose TZ is unset, and --timezone Local writes timestamps against
    the converting machine's zone. Every transition over the whole range a
    conversion accepts, rather than sampled dates in recent years: America/Boise
    and America/Denver agree every January and July from 1970 to 2050 and
    differ through most of January 1974, while Africa/Abidjan and GMT agree
    from 1970 onwards and differ in 1900, which a QVD reaches easily with its
    serial epoch at 1899-12-30.
    Options that cannot change the output are excluded by name, so a new option
    counts by default: the mistake it can make is an unnecessary conversion
    rather than a wrong skip.
  • --skip-up-to-date is selection and --force is write permission, so a
    nightly job passes both and a full rerun drops the one flag. Nothing is
    skipped by default, the manifest is written only when the flag is passed, and
    a file that failed is not recorded.
  • A wildcard in the last element of an input path is expanded by qvd2parquet
    when the shell has not done it, so qvd2parquet --out-dir out qvds\CE*.qvd
    works in cmd.exe and PowerShell, neither of which expands for an external
    command. It takes .qvd files and directories only, and a wildcard in a
    directory element is refused rather than half-supported.
  • --include-files and --exclude-files narrow what a directory contributes
    to a folder conversion, which --recursive needs since no path expansion
    reaches into a tree. Patterns are the usual case-insensitive * and ?,
    matched against the file name with and without its extension, and exclude
    wins over include. They filter a directory's contents only: a file named on
    the command line was meant.
  • Files a pattern dropped, and a pattern that reached no file, are both
    reported. A selection that leaves nothing is a usage error naming the
    patterns rather than the message for an empty folder.

Documentation

  • How cmd.exe treats % in a pattern, which is what makes
    --encoding "%*_PKEY=delta_byte_array" match no column when the same line is
    run from a .bat file rather than typed at the prompt. --exclude '%*' is
    affected the same way.

Install

Download the archive for your platform below, unpack it, and put qvd2parquet
on your PATH. Verify the download against SHA256SUMS:

shasum -a 256 -c SHA256SUMS --ignore-missing

Binaries are pure Go and statically linked, so they need no runtime
dependencies: Linux (amd64, arm64), Windows (amd64, arm64) and macOS (amd64,
arm64).