From daad7560f8dab8e9d62488100f873bceda3575a1 Mon Sep 17 00:00:00 2001 From: Alex Zaw Date: Wed, 25 Feb 2026 23:05:43 +0000 Subject: [PATCH] Update Function GENERATE_DBML_V2 --- RESTAPI/Functions/GENERATE_DBML_V2.sql | 228 ++++++++++++++++++++++++- 1 file changed, 227 insertions(+), 1 deletion(-) diff --git a/RESTAPI/Functions/GENERATE_DBML_V2.sql b/RESTAPI/Functions/GENERATE_DBML_V2.sql index 39a9637..b811b93 100644 --- a/RESTAPI/Functions/GENERATE_DBML_V2.sql +++ b/RESTAPI/Functions/GENERATE_DBML_V2.sql @@ -1 +1,227 @@ -@@\@^@ % %@@@@Kmm@M@ %@M]@k@ %@M]@]@ %@M]@@@ %@@ %@Kmm@ %@@ %@@@ %@@@@ %@@@@~@\@k@ %@~@\@k@ %@~@\@k@ %@~@\@k@ %@~@Mk@k@]@k@ %@~@\@k@ %@~@\@k@ %@~@\@@@ %@ %@m@@M@@@]@^@ %@@@M@ %@\@ %@@K@m@ %@@~@@ %@@~@@ %@@~@}}@ %]@k@ %@@M@@``@@@@@@@ %@@K@@k@@K@@k@@K@@k@@K@@k@@K@@ %@@M@ %@K@mm@M@ %@k@@k@@]@ %]@@ %]@k@ %``@@@@@@M@]@ %m@@M@ %@@K@@k@@K@@k@@K@@k@@K@@k@ %M@ %@@K@@ %@@K@mm@@ %@M@@K@@@@ %@@M@@K@@]@~@@M@@K@@]@]@ %@M@@K@@@@ %@@M@@K@@]@~@@M@@K@@]@]@ %@m@M@@K@@k@@K@@k@ %}}@]@ %@@@K@@ %@@@@@]@@m@k@ %M@ %@@K@@ %@@K@mm@@ %@M@@K@@@@ %@@M@@K@@]@~@@M@@K@@]@]@ %@M@@K@@@@ %@@M@@K@@]@~@@M@@K@@]@]@ %@m@M@@K@@k@@K@@k@ %}}@]@ %@@@K@@ %@@@@@]@@m@k@ %M@ %@@K@m@ %@@K@mm@@ %@M@@K@@@@ %@@M@@K@@]@~@@M@@K@@]@]@ %@M@@K@@@@ %@@M@@K@@]@~@@M@@K@@]@]@ %@m@M@@K@@k@@K@@k@ %}}@]@ %@@@K@@ %@@@@@]@@m@k@ %M@ %@@K@@ %@@K@mm@@ %@M@@K@@@@ %@@M@@K@@]@~@@M@@K@@]@]@ %@M@@K@@@@ %@@M@@K@@]@~@@M@@K@@]@]@ %@m@M@@K@@k@@K@@k@ %}}@]@ %@@@K@@ %@@@@@]@@m@k@ %M@ %@@K@@ %@@K@mm@@ %@M@@K@@@@ %@@M@@K@@]@~@@M@@K@@]@]@ %@M@@K@@@@ %@@M@@K@@]@~@@M@@K@@]@]@ %@m@M@@K@@k@@K@@k@ %}}@]@ %@@@K@@ %@@@@ \ No newline at end of file +SET PATH *LIBL ; + +CREATE OR REPLACE FUNCTION RESTAPI.GENERATE_DBML_V2 ( + INAPPVER VARCHAR(10) , + INAPPNAME VARCHAR(128) ) + RETURNS CLOB(2147483647) + LANGUAGE SQL + SPECIFIC RESTAPI.GENERATE_DBML_V2 + NOT DETERMINISTIC + READS SQL DATA + CALLED ON NULL INPUT + SET OPTION ALWBLK = *ALLREAD , + ALWCPYDTA = *OPTIMIZE , + COMMIT = *NONE , + DBGVIEW = *SOURCE , + DECRESULT = (31, 31, 00) , + DYNDFTCOL = *NO , + DYNUSRPRF = *OWNER , + SRTSEQ = *HEX + BEGIN +DECLARE V_RESULT CLOB ( 2 G ) ; +WITH EP AS ( +SELECT * +FROM RESTAPI . API_ENDPOINTS +WHERE APPVER = INAPPVER +AND APPNAME = INAPPNAME +AND ENABLED = 'Y' +) , +P AS ( -- discovered placeholders from your SQL text +SELECT P . APPVER , P . APPNAME , P . APPFUNC , P . APPPARAM , P . PARAMPOS +FROM TABLE ( +RESTAPI . GET_PARAM_PLACEHOLDERS ( +INAPPVER , INAPPNAME , NULL ) +) P +) , +-- single best rule per param (by priority) +RULE_PICK AS ( +SELECT P . APPVER , P . APPNAME , P . APPFUNC , P . APPPARAM , +( +SELECT R . RESTNAME +FROM RESTAPI . API_PARAM_RULES R +WHERE ( R . APPNAME IS NULL +OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) ) +AND ( R . APPFUNC IS NULL +OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) ) +AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN , +'i' ) +ORDER BY R . PRIORITY +FETCH FIRST 1 ROW ONLY ) AS R_RESTNAME , +( +SELECT R . LOCATION +FROM RESTAPI . API_PARAM_RULES R +WHERE ( R . APPNAME IS NULL +OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) ) +AND ( R . APPFUNC IS NULL +OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) ) +AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN , +'i' ) +ORDER BY R . PRIORITY +FETCH FIRST 1 ROW ONLY ) AS R_LOCATION , +( +SELECT R . TYPE_NAME +FROM RESTAPI . API_PARAM_RULES R +WHERE ( R . APPNAME IS NULL +OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) ) +AND ( R . APPFUNC IS NULL +OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) ) +AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN , +'i' ) +ORDER BY R . PRIORITY +FETCH FIRST 1 ROW ONLY ) AS R_TYPE , +( +SELECT R . NULLABLE +FROM RESTAPI . API_PARAM_RULES R +WHERE ( R . APPNAME IS NULL +OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) ) +AND ( R . APPFUNC IS NULL +OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) ) +AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN , +'i' ) +ORDER BY R . PRIORITY +FETCH FIRST 1 ROW ONLY ) AS R_NULLABLE , +( +SELECT R . PRECISION +FROM RESTAPI . API_PARAM_RULES R +WHERE ( R . APPNAME IS NULL +OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) ) +AND ( R . APPFUNC IS NULL +OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) ) +AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN , +'i' ) +ORDER BY R . PRIORITY +FETCH FIRST 1 ROW ONLY ) AS R_PREC , +( +SELECT R . CCSID +FROM RESTAPI . API_PARAM_RULES R +WHERE ( R . APPNAME IS NULL +OR UPPER ( R . APPNAME ) = UPPER ( P . APPNAME ) ) +AND ( R . APPFUNC IS NULL +OR UPPER ( R . APPFUNC ) = UPPER ( P . APPFUNC ) ) +AND REGEXP_LIKE ( P . APPPARAM , R . PATTERN , +'i' ) +ORDER BY R . PRIORITY +FETCH FIRST 1 ROW ONLY ) AS R_CCSID +FROM P P +) , +-- resolve final mapping (override > rule > path auto-detect > defaults) +PL AS ( +SELECT P . APPVER , P . APPNAME , P . APPFUNC , P . PARAMPOS , P . APPPARAM , +COALESCE ( O . RESTNAME , RP . R_RESTNAME , P . APPPARAM ) +AS RESTNAME , +/* location precedence: +1) explicit override +2) rule +3) path auto-detect if {RESTNAME} appears in template +4) query for known cases (inEnvList) or default FORM +*/ +COALESCE ( +O . LOCATION , RP . R_LOCATION , +CASE +WHEN +LOCATE ( +'{' || +UPPER ( +COALESCE ( +O . RESTNAME , RP . R_RESTNAME , +P . APPPARAM ) ) || '}' , UPPER ( +E . PATH_TEMPLATE ) ) > 0 THEN 'PATH' +END , +CASE +WHEN UPPER ( P . APPPARAM ) = 'INENVLIST' THEN 'QUERY' +END , 'FORM' ) AS LOCATION , +COALESCE ( O . TYPE_NAME , RP . R_TYPE , 'CLOB' ) AS TYPE_NAME , +COALESCE ( O . NULLABLE , RP . R_NULLABLE , 'Y' ) AS NULLABLE , +COALESCE ( O . PRECISION , RP . R_PREC , 2147483647 ) +AS PRECISION , +COALESCE ( O . CCSID , RP . R_CCSID , 1208 ) AS CCSID +FROM P P +JOIN EP E +ON E . APPVER = P . APPVER +AND E . APPNAME = P . APPNAME +AND E . APPFUNC = P . APPFUNC +LEFT JOIN RESTAPI . API_PARAM_OVERRIDES O +ON O . APPVER = P . APPVER +AND O . APPNAME = P . APPNAME +AND O . APPFUNC = P . APPFUNC +AND UPPER ( O . APPPARAM ) = UPPER ( P . APPPARAM ) +LEFT JOIN RULE_PICK RP +ON RP . APPVER = P . APPVER +AND RP . APPNAME = P . APPNAME +AND RP . APPFUNC = P . APPFUNC +AND RP . APPPARAM = P . APPPARAM +) , +PARAM_STR AS ( +SELECT P . APPVER , P . APPNAME , P . APPFUNC , +LISTAGG ( +'''' || P . APPPARAM || ''':' || '?' , ', ' ) +WITHIN GROUP ( ORDER BY P . PARAMPOS ) AS PARAMS_TXT +FROM P P +GROUP BY P . APPVER , P . APPNAME , P . APPFUNC +) , +DATA_XML AS ( +SELECT PL . APPVER , PL . APPNAME , PL . APPFUNC , +XMLAGG ( XMLELEMENT ( NAME "data" , XMLATTRIBUTES ( CHAR ( +PL . CCSID ) AS "ccsid" , PL . APPPARAM AS "name" , +CASE +WHEN PL . NULLABLE = 'Y' THEN 'true' +ELSE 'false' +END AS "nullable" , CHAR ( PL . PRECISION ) AS "precision" , +CASE +WHEN PL . LOCATION = 'PATH' THEN PL . RESTNAME +END AS "restInPathParam" , +CASE +WHEN PL . LOCATION = 'QUERY' THEN PL . RESTNAME +END AS "restInQueryParam" , +CASE +WHEN PL . LOCATION = 'FORM' THEN PL . RESTNAME +END AS "restInFormParam" , PL . TYPE_NAME AS "type" , +'input' AS "usage" ) ) ORDER BY PL . PARAMPOS ) +AS DATA_FRAGMENT +FROM PL PL +GROUP BY PL . APPVER , PL . APPNAME , PL . APPFUNC +) +SELECT XMLSERIALIZE ( CONTENT XMLELEMENT ( NAME "dbml" , XMLATTRIBUTES ( +'/v1' AS "restUriPathTemplate" , '1.0' AS "version" ) , XMLAGG ( +XMLELEMENT ( NAME "program" , XMLATTRIBUTES ( '' AS "errormessage" , +'*NONE' AS "httpheaders" , '500' AS "httpstatusonfailure" , +E . SUCCESS_CODE AS "httpstatusonsuccess" , 'get' || +UPPER ( SUBSTR ( E . APPFUNC , 1 , 1 ) ) || SUBSTR ( E . APPFUNC , 2 ) || +'Input' AS "inputWrapperIdentifier" , 'get' || +UPPER ( SUBSTR ( E . APPFUNC , 1 , 1 ) ) || SUBSTR ( E . APPFUNC , 2 ) AS +"name" , 'get' || UPPER ( SUBSTR ( E . APPFUNC , 1 , 1 ) ) || +SUBSTR ( E . APPFUNC , 2 ) || 'Result' AS +"outputWrapperIdentifier" , 'media-resource' AS "querytype" , +E . CONSUMES AS "restConsumes" , E . HTTP_METHOD AS +"restHttpRequestMethod" , E . PRODUCES AS "restProduces" , +E . PATH_TEMPLATE AS "restUriPathTemplate" , '*ERRORS' AS +"returnsqlstate" , 'true' AS "treatwarningaserror" , '*TRAILING' +AS "trimmode" , 'false' AS "wrapInputParams" , 'true' AS +"wrapOutputParam" ) +, XMLELEMENT ( NAME "sql" , XMLATTRIBUTES ( +'Values Restapi.Execute_Sql(''' || E . APPVER || ''',''' || +E . APPNAME || ''',''' || E . APPFUNC || +''', Cast(Json_Object(' || COALESCE ( PS . PARAMS_TXT , '' ) || +' ) As Varchar(10240) CCSID 37))' AS "statement" ) +, DX . DATA_FRAGMENT ) ) ORDER BY E . APPFUNC ) ) AS CLOB ( 2 G ) ) +INTO V_RESULT +FROM EP E +LEFT JOIN PARAM_STR PS +ON PS . APPVER = E . APPVER +AND PS . APPNAME = E . APPNAME +AND PS . APPFUNC = E . APPFUNC +LEFT JOIN DATA_XML DX +ON DX . APPVER = E . APPVER +AND DX . APPNAME = E . APPNAME +AND DX . APPFUNC = E . APPFUNC ; +RETURN V_RESULT ; +END ; + +GRANT ALTER , EXECUTE +ON SPECIFIC FUNCTION RESTAPI.GENERATE_DBML_V2 +TO AMAPICS WITH GRANT OPTION ; + +GRANT EXECUTE +ON SPECIFIC FUNCTION RESTAPI.GENERATE_DBML_V2 +TO PUBLIC ; +