Skip to content

rddads/DBFCDX: numeric dbSeek returns not-found; OEM collation NTXPL852 not honored on seek/reindex #127

Description

@rkedzioralmaalpinex

Two independent, reproducible defects in the CDX seek/collation path when using OpenADS as a drop-in ace64.dll for a Harbour contrib/rddads app (local server, DBFCDX, AdsSetCharType(ADS_OEM), OEM_CHAR_SET=NTXPL852 in adslocal.cfg). Same program/data works against SAP ace64.dll 11.10.

Environment: OpenADS main @ a5ad6e5 (MSVC x64, Release). Harbour 3.2dev, rddads, RDD ADSCDX. AdsSetServerType(ADS_LOCAL_SERVER), AdsSetCharType(ADS_OEM,.T.), AdsSetFileType(2). Exports remapped to SAP ordinals via custom .def (consumer imports by ordinal); all 140 needed ordinals resolve, app loads.

Defect 1 — numeric-key dbSeek returns not-found

Build a normal DBFCDX table {COD N(6,0), NAME C(20,0)}, INDEX ON COD TAG codtag, then open VIA ADSCDX and dbSeek(<num>):

dbSeek SAP ADS 11.10 OpenADS
dbSeek(300) found=T recno=3 found=F (EOF)
dbSeek(250) found=T recno=7 found=F
dbSeek(100) found=T recno=2 found=F

Index ordering is correct on both (100 150 ... 500). Fails even on a DBFCDX-built index (before any ADS reindex), so it is a numeric seek-probe mismatch, not an index-build issue. Character-key dbSeek works.

Defect 2 — OEM national collation NTXPL852 not honored

Real 13,926-row table, tag on Upper(<charfield>), OEM_CHAR_SET=NTXPL852:

Operation SAP ADS 11.10 OpenADS
walk index order LAC... LAC... (identical, reads existing order fine)
soft dbSeek("L") LAC... LAC... ok
soft dbSeek(Chr(157) "Ł") ŁAB... ŁAB... ok
soft dbSeek("M") MAD... ŁAB... WRONG
soft dbSeek("Z") ZBY... ŁAB... WRONG

Genuine NTXPL852 (not binary): on SAP a soft seek of byte 141/189 → EOF while soft seek of Ł (157) finds Ł... — impossible under binary order, so positioning is by collation weight (Ł sorts between L and M). OpenADS mis-positions dbSeek("M")/dbSeek("Z") onto the Ł region → "search by name" lands on wrong record. Also, reindexing with OpenADS reorders by raw byte (Ł after Z) instead of the Polish collation.

Expected

  • Numeric dbSeek(<num>) locates the record (parity with SAP / DBFCDX).
  • With OEM_CHAR_SET=NTXPL852, both index build and collation-aware dbSeek use NTXPL852 (Clipper Polish 852), matching SAP ADS.

This blocks Central/Eastern-European Clipper/Harbour apps relying on an OEM national collation (NTX*852, Mazovia, ...) and on numeric-key seeks. Full repro program, real-index reader, run logs and the ordinal .def procedure available on request.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions