From ed956a1504df36dde95721d9645655e4695335c0 Mon Sep 17 00:00:00 2001 From: Charles KWON OhJun Date: Wed, 27 May 2026 17:36:14 +0900 Subject: [PATCH] revert: drop AP_RPUTS single-arg patch and fn_HGet renames MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both workarounds existed because Five was missing two features that just landed upstream: Five 7629f95 (variadic PValue) makes FUNCTION foo(...) / PValue() actually return the caller's variadic args instead of the caller's first LOCAL slot. AP_RPUTS / AP_ECHO can go back to their `( ... )` signature now. Five f3e0ffe (file-local STATIC FUNCTION) gives each .prg its own namespace for `STATIC FUNCTION name`, so the seven duplicate `STATIC FUNCTION fn_HGet` definitions across labdb's api/*.prg files no longer collide. The sed-renamed unique names can revert to the upstream definitions. Files app/bridge/bridge_request.prg ← cp from fivenode/native/ app/api/{device-status,record-detail,records-list,session-detail, session-stats,sessions-list,session-export}.prg ← cp from fivenode/labdb/api/ fivenode-upstream is now byte-identical to fivenode_go's app/ copy of those files. No more "// fivenode_go patch" comments, no more file-prefix renames. Verified end-to-end against the same live postgres@16 cluster: /api/admin-stats.prg -> {"active_sessions":1,"devices":2,...} /api/sessions-list.prg -> 2 rows w/ full session data /api/admin-devices.prg -> 2 devices w/ api_key, created_at /api/hello.prg -> hello (unchanged) / -> 200 text/html (static) Co-Authored-By: Claude Opus 4.7 (1M context) --- app/api/device-status.prg | 2 +- app/api/record-detail.prg | 2 +- app/api/records-list.prg | 2 +- app/api/session-detail.prg | 2 +- app/api/session-export.prg | 2 +- app/api/session-stats.prg | 2 +- app/api/sessions-list.prg | 2 +- app/bridge/bridge_request.prg | 47 +++++++++++++++++++++-------------- 8 files changed, 36 insertions(+), 25 deletions(-) diff --git a/app/api/device-status.prg b/app/api/device-status.prg index d581a77..d0ebcc7 100644 --- a/app/api/device-status.prg +++ b/app/api/device-status.prg @@ -63,7 +63,7 @@ FUNCTION Main() AP_JSONRESPONSE(hOut) RETURN NIL -FUNCTION device_status_fn_hget(h, k, xDefault) +STATIC FUNCTION fn_HGet(h, k, xDefault) IF xDefault == NIL ; xDefault := "" ; ENDIF IF HB_ISHASH(h) .AND. hb_HHasKey(h, k) .AND. h[k] != NIL RETURN h[k] diff --git a/app/api/record-detail.prg b/app/api/record-detail.prg index 8150630..c6c1396 100644 --- a/app/api/record-detail.prg +++ b/app/api/record-detail.prg @@ -20,6 +20,6 @@ FUNCTION Main() }) RETURN NIL -FUNCTION record_detail_fn_hget(h, k) +STATIC FUNCTION fn_HGet(h, k) IF HB_ISHASH(h) .AND. hb_HHasKey(h, k) ; RETURN h[k] ; ENDIF RETURN "" diff --git a/app/api/records-list.prg b/app/api/records-list.prg index 891cea3..eca32cf 100644 --- a/app/api/records-list.prg +++ b/app/api/records-list.prg @@ -47,6 +47,6 @@ FUNCTION Main() }) RETURN NIL -FUNCTION records_list_fn_hget(h, k) +STATIC FUNCTION fn_HGet(h, k) IF HB_ISHASH(h) .AND. hb_HHasKey(h, k) ; RETURN h[k] ; ENDIF RETURN "" diff --git a/app/api/session-detail.prg b/app/api/session-detail.prg index 05c41d1..6036238 100644 --- a/app/api/session-detail.prg +++ b/app/api/session-detail.prg @@ -26,6 +26,6 @@ FUNCTION Main() }) RETURN NIL -FUNCTION session_detail_fn_hget(h, k) +STATIC FUNCTION fn_HGet(h, k) IF HB_ISHASH(h) .AND. hb_HHasKey(h, k) ; RETURN h[k] ; ENDIF RETURN "" diff --git a/app/api/session-export.prg b/app/api/session-export.prg index b0eaf73..c5f34a1 100644 --- a/app/api/session-export.prg +++ b/app/api/session-export.prg @@ -74,7 +74,7 @@ FUNCTION Main() AP_RPUTS(cBOM + fn_Join(aLines, cCRLF)) RETURN NIL -FUNCTION session_export_fn_hget(h, k) +STATIC FUNCTION fn_HGet(h, k) IF HB_ISHASH(h) .AND. hb_HHasKey(h, k) ; RETURN h[k] ; ENDIF RETURN "" diff --git a/app/api/session-stats.prg b/app/api/session-stats.prg index 91f64e3..fb2cb26 100644 --- a/app/api/session-stats.prg +++ b/app/api/session-stats.prg @@ -129,6 +129,6 @@ FUNCTION Main() RETURN NIL -FUNCTION session_stats_fn_hget(h, k) +STATIC FUNCTION fn_HGet(h, k) IF HB_ISHASH(h) .AND. hb_HHasKey(h, k) ; RETURN h[k] ; ENDIF RETURN NIL diff --git a/app/api/sessions-list.prg b/app/api/sessions-list.prg index 123347e..20b49e2 100644 --- a/app/api/sessions-list.prg +++ b/app/api/sessions-list.prg @@ -41,7 +41,7 @@ FUNCTION Main() RETURN NIL // Safe hash get (returns "" for missing key) -FUNCTION sessions_list_fn_hget(hHash, cKey) +STATIC FUNCTION fn_HGet(hHash, cKey) IF HB_ISHASH(hHash) .AND. hb_HHasKey(hHash, cKey) RETURN hHash[ cKey ] ENDIF diff --git a/app/bridge/bridge_request.prg b/app/bridge/bridge_request.prg index 59c9e37..9ed3f39 100644 --- a/app/bridge/bridge_request.prg +++ b/app/bridge/bridge_request.prg @@ -108,26 +108,37 @@ RETURN AP_HEADERSOUTSET( "Content-Type", cType ) // ── Output ── -// fivenode_go patch: collapsed (...) -> single arg. Five's PValue returns -// the caller's LOCALs rather than the actual variadic args (declared -// params are 0 for `(...)`, so the runtime never copies args into the -// locals slot PValue reads). Every call site in this codebase passes -// exactly one value, so the collapse is behaviour-preserving. -// TODO: revert once Five gains true variadic PValue support. -FUNCTION AP_RPUTS( u ) - IF ValType( u ) == "C" - bridge_output_append( u ) - ELSE - bridge_output_append( fn_ValToChar( u ) ) - ENDIF +FUNCTION AP_RPUTS( ... ) + + LOCAL n, u + + FOR n := 1 TO PCount() + u := PValue( n ) + IF ValType( u ) == "C" + bridge_output_append( u ) + ELSE + bridge_output_append( fn_ValToChar( u ) ) + ENDIF + NEXT + RETURN NIL -FUNCTION AP_ECHO( u ) - IF ValType( u ) == "C" - bridge_output_append( u ) - ELSEIF ValType( u ) != "U" - bridge_output_append( fn_ValToChar( u ) ) - ENDIF +FUNCTION AP_ECHO( ... ) + + LOCAL n, u + + FOR n := 1 TO PCount() + u := PValue( n ) + IF ValType( u ) == "C" + bridge_output_append( u ) + ELSEIF ValType( u ) != "U" + bridge_output_append( fn_ValToChar( u ) ) + ENDIF + IF n < PCount() + bridge_output_append( " " ) + ENDIF + NEXT + RETURN NIL // ── Parameter Parsing ──