drop function if exists update_title; drop function if exists get_title_update_template; drop function if exists get_title; drop function if exists get_title_schema; create function get_title_schema() returns jsonb as $$ declare begin return '{"value": {"opetional": false, "readonly": false}}'::jsonb; end; $$ language plpgsql; create function get_title() returns jsonb as $$ declare v_value text; begin select value into v_value from title; return format('{"value": "%s"}', v_value)::jsonb; end; $$ language plpgsql; create function get_title_update_template() returns jsonb as $$ declare begin return '{"operation": "update", "type": "title", "value": ""}'::jsonb; end; $$ language plpgsql; create function update_title(new jsonb) returns jsonb as $$ declare old jsonb; redo_sql text; undo_sql text; redo_cs jsonb; undo_cs jsonb; begin assert new->>'operation' = 'update'; assert new->>'type' = 'title'; assert new ? 'value'; old := get_title(); if old->>'value' = new->>'value' then return '{}'::jsonb; end if; redo_sql := format('update title set value = ''%s''', new->>'value'); undo_sql := format('update title set value = ''%s''', old->>'value'); redo_cs := format('{"operation": "update", "type": "title", "value": "%s" }', new->>'value')::jsonb; undo_cs := format('{"operation": "update", "type": "title", "value": "%s" }', old->>'value')::jsonb; execute redo_sql; execute add_operation(redo_sql, undo_sql, redo_cs, undo_cs); return redo_cs; end; $$ language plpgsql;