tps/functions/srce_set.sql

108 lines
2.7 KiB
MySQL
Raw Normal View History

2018-02-08 17:40:23 -05:00
CREATE OR REPLACE FUNCTION tps.srce_set(_defn jsonb) RETURNS jsonb
2018-02-08 17:40:23 -05:00
AS $f$
2018-02-15 22:20:24 -05:00
DECLARE
_cnt int;
_conflict BOOLEAN;
_message jsonb;
_sql text;
_cur_sch jsonb;
2018-02-15 22:20:24 -05:00
2018-02-08 17:40:23 -05:00
BEGIN
/*
1. determine if insert or update
2. if update, determine if conflicts exists
3. do merge
*/
-------extract current source schema for compare--------------------------
SELECT
defn->'schema'
INTO
_cur_sch
FROM
tps.srce
WHERE
srce = _defn->>'name';
2018-02-15 22:20:24 -05:00
-------check for transctions already existing under this source-----------
SELECT
COUNT(*)
INTO
_cnt
FROM
tps.trans
WHERE
srce = _defn->>'name';
2018-02-15 22:20:24 -05:00
--if there are transaction already and the schema is different stop--------
2018-02-15 22:20:24 -05:00
IF _cnt > 0 THEN
IF _cur_sch <> _defn->'schema' THEN
_conflict = TRUE;
--get out of the function somehow
_message =
$$
{
"message":"transactions already exist under source profile and there is a pending schema change"
,"status":"error"
}
$$::jsonb;
return _message;
END IF;
2018-02-15 22:20:24 -05:00
END IF;
/*-------------------------------------------------------
do schema validation fo _defn object?
2018-02-15 22:20:24 -05:00
---------------------------------------------------------*/
-------------------insert definition----------------------------------------
2018-02-15 22:20:24 -05:00
INSERT INTO
tps.srce
SELECT
_defn->>'name', _defn
2018-02-23 15:11:04 -05:00
ON CONFLICT ON CONSTRAINT srce_pkey DO UPDATE
2018-02-15 22:20:24 -05:00
SET
defn = _defn;
------------------drop existing type-----------------------------------------
EXECUTE format('DROP TYPE IF EXISTS tps.%I',_defn->>'name');
------------------create new type--------------------------------------------
SELECT
string_agg(quote_ident(prs.key)||' '||prs.type,',')
INTO
_sql
FROM
tps.srce
--unwrap the schema definition array
LEFT JOIN LATERAL jsonb_populate_recordset(null::tps.srce_defn_schema, defn->'schema') prs ON TRUE
WHERE
srce = _defn->>'name'
GROUP BY
srce;
RAISE NOTICE 'CREATE TYPE tps.% AS (%)',_defn->>'name',_sql;
EXECUTE format('CREATE TYPE tps.%I AS (%s)',_defn->>'name',_sql);
EXECUTE format('COMMENT ON TYPE tps.%I IS %L',_defn->>'name',(_defn->>'description'));
----------------set message-----------------------------------------------------
2018-02-23 15:11:04 -05:00
_message =
$$
{
"message":"definition set"
,"status":"success"
}
$$::jsonb;
return _message;
2018-02-08 17:40:23 -05:00
END;
$f$
LANGUAGE plpgsql