From cb3389109ce32d6c7f76101c2b14931c37485253 Mon Sep 17 00:00:00 2001 From: Jan Kvetina Date: Fri, 4 Feb 2022 17:17:46 +0100 Subject: [PATCH] Get_setting moved + removed hardcoding from view --- packages/app.spec.sql | 31 +++++++++++++++++ packages/app.sql | 63 ++++++++++++++++++++++++++++++++++ packages/app_actions.spec.sql | 14 -------- packages/app_actions.sql | 64 ++++++++--------------------------- triggers/settings__.sql | 2 +- views/settings_overview.sql | 4 +-- 6 files changed, 112 insertions(+), 66 deletions(-) diff --git a/packages/app.spec.sql b/packages/app.spec.sql index 95536c2..b6f7ab9 100644 --- a/packages/app.spec.sql +++ b/packages/app.spec.sql @@ -73,6 +73,10 @@ CREATE OR REPLACE PACKAGE app AS logs_table_name CONSTANT VARCHAR2(30) := 'LOGS'; -- used in purge_old logs_max_age CONSTANT PLS_INTEGER := 7; -- max logs age in days + -- settings + settings_package CONSTANT VARCHAR2(30) := 'S'; -- S### (app_id) + settings_prefix CONSTANT VARCHAR2(30) := 'GET_'; + -- owner of DML error tables dml_tables_owner CONSTANT VARCHAR2(30) := NULL; -- NULL = same as current owner dml_tables_prefix CONSTANT VARCHAR2(30) := ''; -- ERR$ @@ -276,6 +280,33 @@ CREATE OR REPLACE PACKAGE app AS + -- + -- Get value from Settings table + -- + FUNCTION get_setting ( + in_name settings.setting_name%TYPE, + in_context settings.setting_context%TYPE := NULL + ) + RETURN settings.setting_value%TYPE; + + + + -- + -- Get settings package name + -- + FUNCTION get_settings_package + RETURN VARCHAR2; + + + + -- + -- Get settings function prefix + -- + FUNCTION get_settings_prefix + RETURN VARCHAR2; + + + diff --git a/packages/app.sql b/packages/app.sql index 459a42d..1d63845 100644 --- a/packages/app.sql +++ b/packages/app.sql @@ -369,6 +369,69 @@ CREATE OR REPLACE PACKAGE BODY app AS AS BEGIN APEX_APPLICATION.G_DEBUG := in_status; + DBMS_OUTPUT.PUT_LINE('DEBUG: ' || CASE WHEN app.is_debug_on() THEN 'ON' ELSE 'OFF' END); + END; + + + + FUNCTION get_setting ( + in_name settings.setting_name%TYPE, + in_context settings.setting_context%TYPE := NULL + ) + RETURN settings.setting_value%TYPE + AS + out_value settings.setting_value%TYPE; + BEGIN + SELECT s.setting_value INTO out_value + FROM settings s + WHERE s.app_id = app.get_app_id() + AND s.setting_name = in_name + AND (s.setting_context = in_context + OR ( + s.setting_context IS NULL + AND in_context IS NULL + ) + ); + -- + RETURN out_value; + EXCEPTION + WHEN NO_DATA_FOUND THEN + BEGIN + SELECT s.setting_value INTO out_value + FROM settings s + JOIN setting_contexts c + ON c.app_id = s.app_id + AND c.context_id = in_context + WHERE s.app_id = app.get_app_id() + AND s.setting_name = in_name + AND s.setting_context IS NULL; + -- + RETURN out_value; + EXCEPTION + WHEN NO_DATA_FOUND THEN + RETURN NULL; + END; + END; + + + + FUNCTION get_settings_package + RETURN VARCHAR2 + AS + BEGIN + RETURN CASE + WHEN app.get_app_id() > 0 + THEN UPPER(app.settings_package) || app.get_app_id() + END; + END; + + + + FUNCTION get_settings_prefix + RETURN VARCHAR2 + AS + BEGIN + RETURN UPPER(app.settings_prefix); END; diff --git a/packages/app_actions.spec.sql b/packages/app_actions.spec.sql index a22f3d1..d6af66c 100644 --- a/packages/app_actions.spec.sql +++ b/packages/app_actions.spec.sql @@ -29,9 +29,6 @@ CREATE OR REPLACE PACKAGE app_actions AS * */ - settings_package CONSTANT VARCHAR2(30) := 'SETT'; - settings_prefix CONSTANT VARCHAR2(30) := 'get_'; - -- for sending emails smtp_from CONSTANT VARCHAR2(200) := ''; smtp_username CONSTANT VARCHAR2(50) := NULL; @@ -196,17 +193,6 @@ CREATE OR REPLACE PACKAGE app_actions AS -- ### Settings page -- - -- - -- Get value from Settings table - -- - FUNCTION get_setting ( - in_name settings.setting_name%TYPE, - in_context settings.setting_context%TYPE := NULL - ) - RETURN settings.setting_value%TYPE; - - - -- -- Store/update settings -- diff --git a/packages/app_actions.sql b/packages/app_actions.sql index 7cecf91..f175fae 100644 --- a/packages/app_actions.sql +++ b/packages/app_actions.sql @@ -412,47 +412,6 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS - FUNCTION get_setting ( - in_name settings.setting_name%TYPE, - in_context settings.setting_context%TYPE := NULL - ) - RETURN settings.setting_value%TYPE - AS - out_value settings.setting_value%TYPE; - BEGIN - SELECT s.setting_value INTO out_value - FROM settings s - WHERE s.app_id = app.get_app_id() - AND s.setting_name = in_name - AND (s.setting_context = in_context - OR ( - s.setting_context IS NULL - AND in_context IS NULL - ) - ); - -- - RETURN out_value; - EXCEPTION - WHEN NO_DATA_FOUND THEN - BEGIN - SELECT s.setting_value INTO out_value - FROM settings s - JOIN setting_contexts c - ON c.app_id = s.app_id - AND c.context_id = in_context - WHERE s.app_id = app.get_app_id() - AND s.setting_name = in_name - AND s.setting_context IS NULL; - -- - RETURN out_value; - EXCEPTION - WHEN NO_DATA_FOUND THEN - RETURN NULL; - END; - END; - - - PROCEDURE set_setting ( in_action CHAR, in_setting_name_old settings.setting_name%TYPE, @@ -692,10 +651,14 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS BEGIN app.log_module(); -- + IF app.get_settings_package() IS NULL THEN + RETURN; + END IF; + -- app.refresh_user_source_views(); -- - q := 'CREATE OR REPLACE PACKAGE ' || LOWER(settings_package) || ' AS' || CHR(10); - b := 'CREATE OR REPLACE PACKAGE BODY ' || LOWER(settings_package) || ' AS' || CHR(10); + q := 'CREATE OR REPLACE PACKAGE ' || LOWER(app.get_settings_package()) || ' AS' || CHR(10); + b := 'CREATE OR REPLACE PACKAGE BODY ' || LOWER(app.get_settings_package()) || ' AS' || CHR(10); -- FOR c IN ( SELECT DISTINCT @@ -703,12 +666,13 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS s.is_numeric, s.is_date FROM settings s - WHERE s.setting_context IS NULL + WHERE s.app_id = app.get_app_id() + AND s.setting_context IS NULL ORDER BY s.setting_name ) LOOP -- create specification q := q || CHR(10); - q := q || ' FUNCTION ' || LOWER(settings_prefix) || LOWER(c.setting_name) || ' (' || CHR(10); + q := q || ' FUNCTION ' || LOWER(app.settings_prefix) || LOWER(c.setting_name) || ' (' || CHR(10); q := q || ' in_context settings.setting_context%TYPE := NULL' || CHR(10); q := q || ' )' || CHR(10); q := q || ' RETURN ' || CASE @@ -719,7 +683,7 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS -- create package body b := b || CHR(10); - b := b || ' FUNCTION ' || LOWER(settings_prefix) || LOWER(c.setting_name) || ' (' || CHR(10); + b := b || ' FUNCTION ' || LOWER(app.settings_prefix) || LOWER(c.setting_name) || ' (' || CHR(10); b := b || ' in_context settings.setting_context%TYPE := NULL' || CHR(10); b := b || ' )' || CHR(10); b := b || ' RETURN ' || CASE @@ -731,7 +695,7 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS b := b || ' RETURN ' || CASE WHEN c.is_numeric = 'Y' THEN 'TO_NUMBER(' WHEN c.is_date = 'Y' THEN 'app.get_date(' - END || 'app_actions.get_setting (' || CHR(10); + END || 'app.get_setting (' || CHR(10); b := b || ' in_name => ''' || c.setting_name || ''',' || CHR(10); b := b || ' in_context => in_context' || CHR(10); b := b || ' ' || CASE @@ -750,7 +714,7 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS EXECUTE IMMEDIATE b; -- recompile ( - in_name => 'SETT', + in_name => app.get_settings_package(), in_force => TRUE ); -- @@ -764,6 +728,9 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS WHEN app.app_exception THEN RAISE; WHEN OTHERS THEN + app.log_debug(q); -- trimmed + app.log_debug(b); -- trimmed + -- app.raise_error(); END; @@ -785,7 +752,6 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS v_query := v_query || 'SELECT' || CHR(10); v_query := v_query || ' s.setting_name,' || CHR(10); v_query := v_query || ' MAX(s.setting_group) AS setting_group,' || CHR(10); - -- v_query := v_query || ' MAX(CASE WHEN s.setting_context IS NULL THEN s.setting_value END) AS null__,' || CHR(10); -- FOR c IN ( diff --git a/triggers/settings__.sql b/triggers/settings__.sql index 1c3be42..c4c427e 100644 --- a/triggers/settings__.sql +++ b/triggers/settings__.sql @@ -38,7 +38,7 @@ COMPOUND TRIGGER :NEW.updated_at := curr_updated_at; -- check name - IF NOT REGEXP_LIKE(:NEW.setting_name, '^[A-Z0-9_]{1,' || TO_CHAR(30 - NVL(LENGTH(app_actions.settings_prefix), 0)) || '}$') THEN + IF NOT REGEXP_LIKE(:NEW.setting_name, '^[A-Z0-9_]{1,' || TO_CHAR(30 - NVL(LENGTH(app.settings_prefix), 0)) || '}$') THEN app.raise_error('WRONG_NAME', :NEW.setting_name); END IF; diff --git a/views/settings_overview.sql b/views/settings_overview.sql index 0edd6ac..f6cac7a 100644 --- a/views/settings_overview.sql +++ b/views/settings_overview.sql @@ -1,8 +1,8 @@ CREATE OR REPLACE VIEW settings_overview AS WITH x AS ( SELECT /*+ MATERIALIZE */ - UPPER('SETT') AS package_name, -- @TODO: app_actions spec - UPPER('GET_') AS prefix, + app.get_settings_package() AS package_name, + app.get_settings_prefix() AS prefix, app.get_item('$SETTING_NAME') AS setting_name, app.get_app_id() AS app_id FROM DUAL