qvd2parquet v2.3.0
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-dateleaves 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.jsonunder--out-dirand 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--schemaoverride rather than only its path,
every transition of--timezonerather than its name, and the tool's major
version, which the stability promise makes sufficient. A timezone is
fingerprinted by what it does becausetime.Localis calledLocalon every
machine whoseTZis unset, and--timezone Localwrites 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
andAmerica/Denveragree every January and July from 1970 to 2050 and
differ through most of January 1974, whileAfrica/AbidjanandGMTagree
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-dateis selection and--forceis 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, soqvd2parquet --out-dir out qvds\CE*.qvd
works incmd.exeand PowerShell, neither of which expands for an external
command. It takes.qvdfiles and directories only, and a wildcard in a
directory element is refused rather than half-supported. --include-filesand--exclude-filesnarrow what a directory contributes
to a folder conversion, which--recursiveneeds 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.exetreats%in a pattern, which is what makes
--encoding "%*_PKEY=delta_byte_array"match no column when the same line is
run from a.batfile 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-missingBinaries are pure Go and statically linked, so they need no runtime
dependencies: Linux (amd64, arm64), Windows (amd64, arm64) and macOS (amd64,
arm64).