From ca68d91d35a4647f1e2a011966d1d745a4e08e02 Mon Sep 17 00:00:00 2001 From: Alex Zaw Date: Wed, 25 Feb 2026 23:05:40 +0000 Subject: [PATCH] Update Function GENERATE_DBML --- RESTAPI/Functions/GENERATE_DBML.sql | 173 +++++++++++++++++++++++++++- 1 file changed, 172 insertions(+), 1 deletion(-) diff --git a/RESTAPI/Functions/GENERATE_DBML.sql b/RESTAPI/Functions/GENERATE_DBML.sql index 6e9966f..0c9ccde 100644 --- a/RESTAPI/Functions/GENERATE_DBML.sql +++ b/RESTAPI/Functions/GENERATE_DBML.sql @@ -1 +1,172 @@ -@@\@^@ % %@@@@Km@M@ %@M]@k@ %@M]@]@ %@M]@@@ %@@ %@Km@ %@@ %@@@ %@@@@ %@@@@~@\@k@ %@~@\@k@ %@~@\@k@ %@~@\@k@ %@~@Mk@k@]@k@ %@~@\@k@ %@~@\@k@ %@~@\@k@ %@~@\@@@ %@ %@m@@M@@@]@^@ %@@M@@ %@M@@@k@@M@}a}@OO@@@ %䙉ׁㅔ@k@}K}@@@]@k@@M@ %@M@@@k@@M@@M@ %@K@@k@}ɕ@@}@]@@@k@ %}\}@@@k@@M@ %@K@@k@}}@]@@@k@ %@M@@K@@k@}}@]@@ %@k@@K@@OO@}ɕ}@@ %晁Ʉ@k@@K@@@@k@@K@@OO@ %}م}@@晁Ʉ@k@@M@ %@K@@k@}`}@]@@@k@@M@ %@K@@k@}\a\}@]@@Ö@k@@K@@@ %ȣمԅ@k@@M@ %@K@@k@}a}@]@@י@k@ %@K@@@䙉ׁㅔ@k@}\}@@ %@k@}}@@@k@@M@ %@K@@k@}\}@]@@@k@@M@ %@K@@k@}}@]@@ɕׁ@k@@M@ %@K@@k@}}@]@@ׁ֤@]@k@@M@ %@@k@@M@ %``@䢅@@k@@@@o@ %@K@m@@@]@k@@K@@]@]@@@ %@K@@]@]@@@M@@@]@]@ %@m@ %@ %M@ %@@K@@k@@K@@k@@K@@k@@K@@k@ %@K@@k@@K@@k@@K@@k@ %@K@@k@@K@@k@@K@@k@ %@K@@k@@K@@k@@K@@k@ %``@ŧ@@@@@@@@@ %M@@@K@@ %@m@M@ %@K@@k@ %}[\}@ %@M@ %@@M@@]@@}[K}@ %]@ %]@@@ %@@K@@@@@ %@@@@@]@@@k@ %``@䢅@@@@@@ %@K@@@@k@ %``@Ö@z@@@@o@@ %m@M@@K@@k@}лN}@k@}o}@]@ %@m@k@ %``@¤@@@@@@@k@@M@]k@@M``@]@ %@M@ %``@ׁ@@ %M@ \ No newline at end of file +SET PATH *LIBL ; + +CREATE OR REPLACE FUNCTION RESTAPI.GENERATE_DBML ( + INAPPVER VARCHAR(10) , + INAPPNAME VARCHAR(128) ) + RETURNS CLOB(2147483647) + LANGUAGE SQL + SPECIFIC RESTAPI.GENERATE_DBML + NOT DETERMINISTIC + READS SQL DATA + CALLED ON NULL INPUT + SET OPTION ALWBLK = *ALLREAD , + ALWCPYDTA = *OPTIMIZE , + COMMIT = *NONE , + DBGVIEW = *SOURCE , + DECRESULT = (31, 31, 00) , + DLYPRP = *NO , + DYNDFTCOL = *NO , + DYNUSRPRF = *OWNER , + SRTSEQ = *HEX + BEGIN +DECLARE V_RESULT CLOB ( 2 G ) ; +SELECT XMLSERIALIZE ( CONTENT +XMLELEMENT ( NAME "dbml" , XMLATTRIBUTES ( '/' || INAPPVER AS +"restUriPathTemplate" , '1.0' AS "version" ) , XMLAGG ( +XMLELEMENT ( NAME "program" , XMLATTRIBUTES ( COALESCE ( +Q . ERRORMSG , 'Internal server error' ) AS "errormessage" , +'*NONE' AS "httpheaders" , COALESCE ( +Q . HTTPSTATUSFAILURE , '500' ) AS "httpstatusonfailure" , +COALESCE ( Q . HTTPSTATUSSUCCESS , '200' ) AS +"httpstatusonsuccess" , Q . PROGNAME || 'Input' AS +"inputWrapperIdentifier" , Q . PROGNAME AS "name" , Q . PROGNAME || +'Result' AS "outputWrapperIdentifier" , COALESCE ( +Q . QUERYTYPE , 'media-resource' ) AS "querytype" , COALESCE ( +Q . RESTCONSUMES , '*/*' ) AS "restConsumes" , Q . FUNCMETHOD AS +"restHttpRequestMethod" , COALESCE ( +Q . RESTPRODUCES , 'application/json' ) AS "restProduces" , +Q . RESTURI AS "restUriPathTemplate" , '*ERRORS' AS +"returnsqlstate" , 'true' AS "treatwarningaserror" , COALESCE ( +Q . TRIMMODE , '*TRAILING' ) AS "trimmode" , COALESCE ( +Q . WRAPINPUT , 'false' ) AS "wrapInputParams" , COALESCE ( +Q . WRAPOUTPUT , 'true' ) AS "wrapOutputParam" ) , XMLELEMENT ( +NAME "sql" , XMLATTRIBUTES ( +-- Use SQLSTMT directly, replacing {{param}} with ? +Q . SQLSTMT_CONVERTED AS "statement" ) , Q . DATATAGS ) ) ORDER BY +Q . APPFUNC ) ) AS CLOB ( 2 G ) ) +INTO V_RESULT +FROM +( +SELECT C . APPVER , C . APPNAME , C . APPFUNC , C . FUNCMETHOD , +C . RESTURI , C . QUERYTYPE , C . HTTPSTATUSSUCCESS , +C . HTTPSTATUSFAILURE , C . RESTCONSUMES , C . RESTPRODUCES , +C . TRIMMODE , C . WRAPINPUT , C . WRAPOUTPUT , +-- Extract first 500 error message from FUNCERRORS JSON array +( SELECT E . ERRMSG +FROM JSON_TABLE ( +C . FUNCERRORS , +'$[*]' +COLUMNS ( +ERRMSG VARCHAR ( 256 ) PATH '$."500"' +) +) AS E +WHERE E . ERRMSG IS NOT NULL +FETCH FIRST 1 ROW ONLY ) AS ERRORMSG , +-- Use APPFUNC directly as program name +C . APPFUNC AS PROGNAME , +-- Convert SQLSTMT: replace {{param}} with ? markers +REGEXP_REPLACE ( C . SQLSTMT , '\{\{[^}]+\}\}' , '?' ) +AS SQLSTMT_CONVERTED , +-- Build XML data elements using XMLCONCAT for path, form (no default), form (wi--th default) +XMLCONCAT ( +-- Path params +( +SELECT XMLAGG ( +XMLELEMENT ( NAME "data" , XMLATTRIBUTES ( '37' AS "ccsid" , +PP . PARAMNAME AS "name" , +CASE +WHEN PP . PARAMREQ = 'true' THEN 'false' +ELSE 'true' +END AS "nullable" , CAST ( PP . PARAMLEN AS VARCHAR ( 20 ) ) AS +"precision" , PP . PARAMNAME AS "restInPathParam" , PP . PARAMTYPE +AS "type" , 'input' AS "usage" ) ) ORDER BY PP . PARAMPOS ) +FROM JSON_TABLE ( +C . FUNCPARAMS , +'$[*]' +COLUMNS ( +PARAMPOS INT PATH '$.pos' , +PARAMNAME VARCHAR ( 128 ) PATH '$.name' , +PARAMTYPE VARCHAR ( 20 ) PATH '$.type' , +PARAMLEN INT PATH '$.length' , +PARAMREQ VARCHAR ( 10 ) PATH '$.required' , +PARAMLOC VARCHAR ( 20 ) PATH '$.location' +) +) AS PP +WHERE PP . PARAMLOC = 'path' ) , +-- Body/form params that are REQUIRED (no restInParamDefaultValue) +( +SELECT XMLAGG ( +XMLELEMENT ( NAME "data" , XMLATTRIBUTES ( '37' AS "ccsid" , +PF . PARAMNAME AS "name" , 'false' AS "nullable" , CAST ( +PF . PARAMLEN AS VARCHAR ( 20 ) ) AS "precision" , PF . PARAMNAME +AS "restInFormParam" , PF . PARAMTYPE AS "type" , 'input' AS +"usage" ) ) ORDER BY PF . PARAMPOS ) +FROM JSON_TABLE ( +C . FUNCPARAMS , +'$[*]' +COLUMNS ( +PARAMPOS INT PATH '$.pos' , +PARAMNAME VARCHAR ( 128 ) PATH '$.name' , +PARAMTYPE VARCHAR ( 20 ) PATH '$.type' , +PARAMLEN INT PATH '$.length' , +PARAMREQ VARCHAR ( 10 ) PATH '$.required' , +PARAMLOC VARCHAR ( 20 ) PATH '$.location' +) +) AS PF +WHERE PF . PARAMLOC <> 'path' +AND PF . PARAMREQ = 'true' ) , +-- Body/form params that are OPTIONAL (add restInParamDefaultValue) +( +SELECT XMLAGG ( +XMLELEMENT ( NAME "data" , XMLATTRIBUTES ( '37' AS "ccsid" , +PD . PARAMNAME AS "name" , 'true' AS "nullable" , CAST ( +PD . PARAMLEN AS VARCHAR ( 20 ) ) AS "precision" , PD . PARAMNAME +AS "restInFormParam" , 'null' AS "restInParamDefaultValue" , +PD . PARAMTYPE AS "type" , 'input' AS "usage" ) ) ORDER BY +PD . PARAMPOS ) +FROM JSON_TABLE ( +C . FUNCPARAMS , +'$[*]' +COLUMNS ( +PARAMPOS INT PATH '$.pos' , +PARAMNAME VARCHAR ( 128 ) PATH '$.name' , +PARAMTYPE VARCHAR ( 20 ) PATH '$.type' , +PARAMLEN INT PATH '$.length' , +PARAMREQ VARCHAR ( 10 ) PATH '$.required' , +PARAMLOC VARCHAR ( 20 ) PATH '$.location' , +PARAMDEFAULT VARCHAR ( 256 ) PATH +'$.default' +) +) AS PD +WHERE PD . PARAMLOC <> 'path' +AND PD . PARAMREQ = 'false' ) ) AS DATATAGS +FROM RESTAPI . API_CONFIG C +LEFT JOIN JSON_TABLE ( +C . FUNCPARAMS , +'$[*]' +COLUMNS ( +PARAMPOS INT PATH '$.pos' , +PARAMNAME VARCHAR ( 128 ) PATH '$.name' , +PARAMLOC VARCHAR ( 20 ) PATH '$.location' +) +) AS P +ON 1 = 1 +WHERE ( C . APPVER , C . APPNAME ) = ( INAPPVER , INAPPNAME ) +GROUP BY C . APPVER , C . APPNAME , C . APPFUNC , C . FUNCMETHOD , +C . RESTURI , C . QUERYTYPE , C . HTTPSTATUSSUCCESS , +C . HTTPSTATUSFAILURE , C . RESTCONSUMES , +C . RESTPRODUCES , C . TRIMMODE , C . WRAPINPUT , +C . WRAPOUTPUT , C . FUNCPARAMS , C . FUNCERRORS , +C . SQLSTMT +) AS Q ; +RETURN CISTOOLS . STRIP_SPACES ( V_RESULT ) ; +END ; + +GRANT ALTER , EXECUTE +ON SPECIFIC FUNCTION RESTAPI.GENERATE_DBML +TO AMAPICS WITH GRANT OPTION ; + +GRANT EXECUTE +ON SPECIFIC FUNCTION RESTAPI.GENERATE_DBML +TO PUBLIC ; +