228 lines
7.2 KiB
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 ;
|
|
|