.db/.mb files are memory-mapped and read directly
(px_fread/px_fseek/px_ftell operate on the mapping), and
px_read() bypasses the block-cache layer for mapped unencrypted
files. Encrypted files keep the decryption path. Streams are
unmapped and released through the new px_stream_free(), and a
seek beyond the mapping falls back to stdio for files that grow.px_get_record_pos_with_index), replacing the linear
scan; also fixes a latent deleted = 0 vs *deleted = 0 assignment
bug and validates the TDataBlock read against the exact size.PX_retrieve_records(), PX_retrieve_records_ex(),
PX_free_record(), PX_free_records() (single row-major allocation
per batch). PX_retrieve_record() is now a wrapper around the shared
internal implementation; behaviour of existing calls is unchanged.PX_close_blob() now frees mb_name/mb_head even when the blob
stream was opened without the close flag (leak fix), and failed opens
release the stream (with unmap) before closing the FILE*, so the
unmap never seeks on a closed file.px_fileblocks. The workflow is Valgrind-clean.gregor.c includes paradox.h and carries PXLIB_API/PXLIB_CALL
qualifiers; the bundled pxlib version constant is bumped to 0.6.11.get_long_be(): negative Long field values
(stored with the high bit set) were decoded as value + 2^32
(e.g. -1 was returned as 4294967295). The function now explicitly
sign-extends the 32-bit big-endian word, matching the original pxlib
semantics that PX_get_data_long() relies on.uint32_t intermediate, which also removes the
undefined behaviour of left-shifting into the sign bit of a 32-bit
long. Mirrors the corresponding upstream pxlib fix. Validated
against the previous implementation: identical results for all 16-bit
inputs and 2,000,000 random 32-bit inputs.test-long-fields.R: regression tests for Long value decoding
(boundary values ±2147483647, ±1, 0, NULL/NA handling, metadata).
Uses a minimal Paradox 3.0 table generated at test time
(helper-long-fixture.R), since the bundled corpora contain only one
negative Long value (-40 in TypSammlung.DB).PX_create_file, PX_put_record, PX_update_record,
PX_delete_record, PX_pack, and all encoding write functions.paradox-gsf.h, paradox-mp.h, px_encode.c/h,
px_memprof.c.get_px_head() that caused a
segfault with -O2 + LTO when opening encrypted files.#include "paradox.h" in 5 .c files (paradox.c,
px_io.c, px_head.c, px_misc.c, px_memory.c).px_passwd_checksum() for passwords > 255 chars.find_blob_file() now normalises paths with forward slashes to ensure
consistent expect_equal() comparisons on Windows UCRT.get_px_head() and
_px_get_data_blob(): replaced ret < 0 checks with exact-size
comparisons (ret != sizeof(...)) after read() calls to detect
short/truncated reads from corrupted files.test-encryption.R: Full encryption workflow tests.test-find_blob_file.R: BLOB file auto-detection tests.test-recode_if_needed.R: Encoding conversion tests.test-px_close_file.R: Error handling for file close operations.test-corrupted_file.R: Handling of non-Paradox files.test-missing_blob.R: Behavior when BLOB file is missing.test-password_edge_cases.R: Password validation edge cases.test-encoding_edge_cases.R: Invalid encoding handling.test-path_edge_cases.R: Path validation edge cases.password argument to read_paradox(). Users can now read password-protected Paradox files (.db) and associated BLOB/Memo files (.MB).pxlib_metadata() now returns human-readable field types (e.g., "Alpha", "Date", "Memo") instead of raw integer codes.pxlib engine to ensure stability on 64-bit systems.
long int with int32_t in data reading functions to ensure correct data width on 64-bit systems (Windows/Linux).src/px_head.c to prevent undefined behavior and header corruption.writeproc signature to ssize_t for POSIX compliance.read_paradox() function for a simple, one-step workflow to read Paradox files. This is now the recommended function for most users.pxlib_metadata() function to retrieve database metadata (number of records, field details, encoding) without reading the entire dataset.stringi package(ICU) instead of Riconv.
This fixes test failures on CRAN and improves robustness for files on various operating systems.stringi to package imports.read_paradox() and pxlib_metadata() functions.rb+ → rb).
This ensures full compliance with CRAN Policy (no writes outside of
temporary directories).PX_get_data_alpha (discovered with
AddressSanitizer). Now the function safely respects field length and
prevents out-of-bounds reads for fixed-length strings without \0..gitignore entries for cran-comments.md and
CRAN-SUBMISSION.Fixed CRAN feedback:
\dontrun{} in examples.biolife.db, of_cp866.db in inst/extdata).Fixed vignette build issue on CRAN check servers:
rmarkdown in VignetteBuilder--no-suggests.Memory management improvements:
Verified that all examples run in < 5 sec and vignettes build
successfully across test environments.