Update Function GENERATE_DBML_INLINE
This commit is contained in:
@@ -1 +1,177 @@
|
||||
牄禗袬蒨@\蚕謨@^@
|
||||
SET PATH *LIBL ;
|
||||
|
||||
CREATE OR REPLACE FUNCTION RESTAPI.GENERATE_DBML_INLINE (
|
||||
INAPPVER VARCHAR(10) ,
|
||||
INAPPNAME VARCHAR(128) )
|
||||
RETURNS CLOB(2147483647)
|
||||
LANGUAGE SQL
|
||||
SPECIFIC RESTAPI.GENERATE_DBML_INLINE
|
||||
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
|
||||
-- 1) endpoints you want (one-time maintenance here)
|
||||
ENDPOINTS ( APPVER , APPNAME , APPFUNC , PATH_TEMPLATE , HTTP_METHOD ,
|
||||
CONSUMES , PRODUCES , SUCCESS_CODE ) AS (
|
||||
VALUES ( INAPPVER , INAPPNAME , 'assignUserRoles' ,
|
||||
'/sailPoint/users/mapics/{envId}/{userName}/roles/assign' ,
|
||||
'POST' , '*/*' , 'application/json' , '200' ) , ( INAPPVER ,
|
||||
INAPPNAME , 'changeIbmIUser' ,
|
||||
'/sailPoint/users/ibmi/{authorizationName}/change' ,
|
||||
'POST' , '*/*' , 'application/json' , '200' ) , ( INAPPVER ,
|
||||
INAPPNAME , 'createIbmIUser' ,
|
||||
'/sailPoint/users/ibmi/create' , 'POST' , '*/*' ,
|
||||
'application/json' , '201' ) , ( INAPPVER , INAPPNAME ,
|
||||
'createMapicsUser' ,
|
||||
'/sailPoint/users/mapics/{envId}/create' , 'POST' ,
|
||||
'*/*' , 'application/json' , '201' ) , ( INAPPVER ,
|
||||
INAPPNAME , 'disableIbmIUser' ,
|
||||
'/sailPoint/users/ibmi/{authorizationName}/disable' ,
|
||||
'POST' , '*/*' , 'application/json' , '200' ) , ( INAPPVER ,
|
||||
INAPPNAME , 'enableIbmIUser' ,
|
||||
'/sailPoint/users/ibmi/{authorizationName}/enable' ,
|
||||
'POST' , '*/*' , 'application/json' , '200' ) , ( INAPPVER ,
|
||||
INAPPNAME , 'getAllAppUsers' ,
|
||||
'/sailPoint/users/mapics/{envId}' , 'POST' , '*/*' ,
|
||||
'application/json' , '200' ) , ( INAPPVER , INAPPNAME ,
|
||||
'getAllMapicsRoles' ,
|
||||
'/sailPoint/roles/mapics/{envId}' , 'POST' , '*/*' ,
|
||||
'application/json' , '200' ) , ( INAPPVER , INAPPNAME ,
|
||||
'getAllUsers' , '/sailPoint/users/all' , 'POST' , '*/*' ,
|
||||
'application/json' , '200' ) , ( INAPPVER , INAPPNAME ,
|
||||
'getAppUserInfo' ,
|
||||
'/sailPoint/users/mapics/{envId}/{userName}' , 'POST' ,
|
||||
'*/*' , 'application/json' , '200' ) , ( INAPPVER ,
|
||||
INAPPNAME , 'getIbmIUserInfo' ,
|
||||
'/sailPoint/users/ibmi/{userName}' , 'POST' , '*/*' ,
|
||||
'application/json' , '200' ) , ( INAPPVER , INAPPNAME ,
|
||||
'removeUserRoles' ,
|
||||
'/sailPoint/users/mapics/{envId}/{userName}/roles/remove' ,
|
||||
'POST' , '*/*' , 'application/json' , '200' )
|
||||
) ,
|
||||
-- 2) placeholders discovered in your SQL
|
||||
PARAMS AS (
|
||||
SELECT P . APPVER , P . APPNAME , P . APPFUNC , P . APPPARAM , P . PARAMPOS
|
||||
FROM TABLE (
|
||||
RESTAPI . GET_PARAM_PLACEHOLDERS (
|
||||
INAPPVER , INAPPNAME , NULL )
|
||||
) AS P
|
||||
) ,
|
||||
-- 3) nice path label renames (optional, one-time)
|
||||
PARAM_RENAME ( APPFUNC , APPPARAM , RESTNAME ) AS (
|
||||
VALUES ( 'assignUserRoles' , 'envid' , 'envId' ) ,
|
||||
( 'assignUserRoles' , 'userName' , 'userName' ) ,
|
||||
( 'removeUserRoles' , 'envid' , 'envId' ) ,
|
||||
( 'removeUserRoles' , 'userName' , 'userName' ) ,
|
||||
( 'createMapicsUser' , 'envid' , 'envId' ) ,
|
||||
( 'getAllAppUsers' , 'environment' , 'envId' ) ,
|
||||
( 'getAllMapicsRoles' , 'envid' , 'envId' ) ,
|
||||
( 'getAppUserInfo' , 'environment' , 'envId' ) ,
|
||||
( 'getAppUserInfo' , 'nameOrId' , 'userName' ) ,
|
||||
( 'getIbmIUserInfo' , 'nameOrId' , 'userName' )
|
||||
) ,
|
||||
-- 4) param location + final REST name (no aggregates here)
|
||||
PL AS (
|
||||
SELECT P . APPVER , P . APPNAME , P . APPFUNC , P . APPPARAM , P . PARAMPOS ,
|
||||
COALESCE ( R . RESTNAME , P . APPPARAM ) AS RESTNAME ,
|
||||
CASE
|
||||
WHEN
|
||||
LOCATE (
|
||||
'{' || UPPER ( COALESCE ( R . RESTNAME , P . APPPARAM ) )
|
||||
|| '}' , UPPER ( E . PATH_TEMPLATE ) ) > 0
|
||||
THEN 'PATH'
|
||||
WHEN UPPER ( P . APPPARAM ) = 'INENVLIST' THEN 'QUERY'
|
||||
ELSE 'FORM'
|
||||
END AS LOCATION
|
||||
FROM PARAMS P
|
||||
JOIN ENDPOINTS E
|
||||
ON E . APPVER = P . APPVER
|
||||
AND E . APPNAME = P . APPNAME
|
||||
AND E . APPFUNC = P . APPFUNC
|
||||
LEFT JOIN PARAM_RENAME R
|
||||
ON R . APPFUNC = P . APPFUNC
|
||||
AND UPPER ( R . APPPARAM ) = UPPER ( P . APPPARAM )
|
||||
) ,
|
||||
-- 5) pre-aggregate the Json_Object parameter list (avoids nested aggregates)
|
||||
PARAM_STR AS (
|
||||
SELECT P . APPVER , P . APPNAME , P . APPFUNC ,
|
||||
LISTAGG (
|
||||
'''' || P . APPPARAM || ''':' || '?' , ', ' )
|
||||
WITHIN GROUP ( ORDER BY P . PARAMPOS ) AS PARAMS_TXT
|
||||
FROM PARAMS P
|
||||
GROUP BY P . APPVER , P . APPNAME , P . APPFUNC
|
||||
) ,
|
||||
-- 6) pre-aggregate the <data .../> XML per program (avoids nested aggregates)
|
||||
DATA_XML AS (
|
||||
SELECT PL . APPVER , PL . APPNAME , PL . APPFUNC ,
|
||||
XMLAGG ( XMLELEMENT ( NAME "data" ,
|
||||
XMLATTRIBUTES ( '1208' AS "ccsid" , PL . APPPARAM AS "name" ,
|
||||
'true' AS "nullable" , '2147483647' 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" , 'CLOB' 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 ENDPOINTS 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_INLINE
|
||||
TO AMAPICS WITH GRANT OPTION ;
|
||||
|
||||
GRANT EXECUTE
|
||||
ON SPECIFIC FUNCTION RESTAPI.GENERATE_DBML_INLINE
|
||||
TO PUBLIC ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user