Files
SQL/RESTAPI/Functions/GENERATE_DBML_V2.sql

228 lines
7.2 KiB
SQL

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 ;