Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Releases: FiveTechSoft/OpenADS

v1.0.0-rc30

07 Jun 08:33
@github-actions github-actions

Choose a tag to compare

Assets 6
Loading

v1.0.0-rc29

26 May 05:55
@github-actions github-actions

Choose a tag to compare

Loading

OpenADS v1.0.0-rc27 — AdsGetField CHAR padding

16 May 22:40
@FiveTechSoft FiveTechSoft

Choose a tag to compare

AdsGetField pads CHARACTER fields to the declared width — plus a rddads-compat.patch fix and PHP-binding additions.

AdsGetField CHARACTER padding

Reported by Pritpal Bedi: a Harbour mini_xbrowse /ads (ADSCDX → OpenADS) showed every text column truncated — Charlie as Charl, Barcelona as Barcel — where the native DBFCDX run rendered them full.

Root cause: AdsGetField returned CHARACTER values with trailing spaces stripped (make_string in dbf_common.cpp rtrims; decode_field used it for the Character branch). DBF/xbase CHAR fields are fixed-width space-padded — FieldGet of a C(20) field must return 20 characters. With the trimmed value, xbrowse auto-sized each column to the current row's value length and clipped every other row.

AdsGetField now re-pads CHARACTER values to the field's declared width on the way out — both the local and the remote (wire) read paths. The engine's internal decode is left trimming, so SQL comparisons, index keys and AOF filters are untouched.

Verified: tests/smoke/harbour/fieldlenprobe.prg — ADSCDX now matches the DBFCDX baseline (len=20/len=25); idxprobe.prg — index walk still SORTED=YES, all seeks hit; full unit suite 397/397.

tools/harbour_patch/rddads-compat.patch applies again

Reported by Pritpal Bedi: git apply rejected the patch with patch failed: contrib/rddads/rddads.h:67. A prior edit had dropped the blank context line after #include "ace.h", so the hunk carried five context lines while its header still declared six. The missing line is restored; verified git apply applies cleanly to a pristine Harbour contrib/rddads tree.

PHP binding

bindings/php gains Cursor::fetchAssoc() / fetchNum() (single-row fetch, null past the last row) and Table::seek() (index key seek via AdsGetIndexHandle + AdsSeek). 37 PHPUnit tests.

CI

The release workflow gains a macOS Intel (x64) build leg — releases now ship a macos-x64 archive alongside macos-arm64.

Full Changelog: v1.0.0-rc26...v1.0.0-rc27

Loading

OpenADS v1.0.0-rc26 — PHP binding

16 May 21:19
@FiveTechSoft FiveTechSoft

Choose a tag to compare

PHP binding — bindings/php — and a SQL string-escape fix.

PHP binding (openads/openads-php)

Asked by Reinaldo Crespo: the proprietary Advantage PHP extension stopped working around PHP 5.2 and was never modernised. OpenADS now ships its own.

  • Pure-PHP Composer package — no compiled C. Loads ace64.dll / ace32.dll / libace*.so through PHP's ext-ffi and wraps it in a modern namespaced OOP API: Connection, Statement, Cursor (a \Iterator over result sets), Table, Record. Requires PHP 8.1+.
  • Local and remote in one path — a Connection takes a local data-directory path or a tcp:// / tls:// URI; AdsConnect60 dispatches on the URI, so the binding has no mode branching.
  • Parameterised SQLStatement::query() accepts ? positional or :name named parameters. OpenADS ACE has no host-variable binding, so ParameterBinder substitutes values client-side with per-type quoting in a single pass (a value containing a :token substring cannot corrupt the statement) — the anti-injection boundary, with its own unit tests.
  • Pinned by 31 PHPUnit tests (21 unit + 10 integration against a live engine) plus a CI leg that builds the ACE library and runs the suite.
  • Design / plan: docs/superpowers/{specs,plans}/2026-05-16-php-bindings*.

Not yet implemented (follow-up): Cursor::fetchAssoc/fetchNum, Table::seek().

SQL '' string-escape fix

The SQL parser's read_string_literal scanned to the next ' with no escape handling, so the ANSI-standard doubled-quote escape ('O''Brien') parsed as the string O followed by a stray token — error 7200. Any SQL client inserting a string containing an apostrophe failed. The parser now decodes '' to a single '; the unterminated-literal error path is unchanged. Pinned by a new sql_parser_test case (396/396 engine tests pass).

Full Changelog: v1.0.0-rc25...v1.0.0-rc26

Loading

OpenADS v1.0.0-rc25 — index correctness sweep

16 May 16:41
@FiveTechSoft FiveTechSoft

Choose a tag to compare

Index correctness sweep — three bugs that broke CDX/NTX ordered access from Harbour rddads and X#'s ADSRDD.

AdsCreateIndex61 decoded the wrong option bit

ace.h sets ADS_UNIQUE 0x01, ADS_DESCENDING 0x02, ADS_CUSTOM 0x04, ADS_COMPOUND 0x08. The descending flag was read as ulOptions & 0x08 — that bit is ADS_COMPOUND, which both rddads and ADSRDD set for every CDX/NTX tag. Every order built descending: AdsGotoTop landed on the last key and SKIP walked backward. A stale comment and the abi_create_index61 test had the bit values swapped the same way, so the bug was self-consistent and hidden. Now decoded with the named ace.h constants; AdsCreateIndex90 delegates to 61 and is covered too.

ALIAS->FIELD qualifiers in index expressions

Harbour INDEX ON CUST->NAME passes the literal text "CUST->NAME" to the RDD. evaluate_index_expr could not parse it — the tokenizer dropped - and >, so the alias parsed as an unknown identifier and every key evaluated blank, degenerating the index to record order. strip_alias_qualifiers() now removes any <ident>-> qualifier (bare and nested, e.g. UPPER(CUST->NAME)) before evaluation.

AE_NO_CURRENT_RECORD (5026) for not-positioned reads

Reported by Pritpal Bedi: a Harbour TBrowse over an ADSCDX table failed mid-paint with ADSCDX/5000 table not positioned on a record. Table::read_field returned the generic 5000 (AE_INTERNAL_ERROR) for not-positioned reads; rddads special-cases 5026 as the graceful read-past-EOF path and raises every other code as a hard error. table.cpp now returns the SAP-canonical 5026.

Verified: idxprobe.prg index walk matches the DBFCDX baseline, posprobe.prg goes from 6 ADSCDX/5000 raises to 0, full suite 395/395.

Full Changelog: v1.0.0-rc24...v1.0.0-rc25

Loading

OpenADS v1.0.0-rc24 — AdsMg* server telemetry

16 May 09:13
@FiveTechSoft FiveTechSoft

Choose a tag to compare

AdsMg* server-telemetry subsystem

The ~17 AdsMg* management functions — previously zero-fill stubs that
made Harbour's manage.prg print all zeros — now report real telemetry.

  • MgCollector formats the SAP-canonical ADS_MGMT_* structs from a
    MgSnapshot: live counts (connections / work areas / tables / users
    / worker threads), per-entity lists, process RSS, listener port, and
    cumulative MgStats (uptime, comm packet totals, high-water marks).
  • New MgConnect / MgRequest wire opcodes (0xA0..0xA3). Remote
    AdsMg* ships a MgRequest to openads_serverd; local mode
    enumerates the in-process ABI handle registry. AdsMgConnect
    validates a remote server up front and treats a drive path like
    rddads' "C:" as local.
  • Verified end-to-end against a live remote openads_serverd:
    manage.prg reports real uptime, packet counts, worker threads,
    ports and server RSS instead of the all-zero stub output.

New: tools/mgprobe (openads_mgprobe host:port CLI) and
tests/smoke/harbour/manage_probe.prg (non-interactive manage.prg).

Reported by Pritpal Bedi. Full detail in CHANGELOG.md.

🤖 Generated with Claude Code

Full Changelog: v1.0.0-rc23...v1.0.0-rc24

Loading

v1.0.0-rc23

15 May 05:35
@github-actions github-actions

Choose a tag to compare

Loading

v1.0.0-rc22

13 May 03:14
@github-actions github-actions

Choose a tag to compare

Loading

v1.0.0-rc21

12 May 16:00
@github-actions github-actions

Choose a tag to compare

Loading

v1.0.0-rc20

12 May 06:45
@github-actions github-actions

Choose a tag to compare

Loading
Previous 1 3
Previous

AltStyle によって変換されたページ (->オリジナル) /