Get_setting moved + removed hardcoding from view

This commit is contained in:
Jan Kvetina 2022-02-04 17:17:46 +01:00
parent 272eff371f
commit cb3389109c
6 changed files with 112 additions and 66 deletions

View File

@ -73,6 +73,10 @@ CREATE OR REPLACE PACKAGE app AS
logs_table_name CONSTANT VARCHAR2(30) := 'LOGS'; -- used in purge_old logs_table_name CONSTANT VARCHAR2(30) := 'LOGS'; -- used in purge_old
logs_max_age CONSTANT PLS_INTEGER := 7; -- max logs age in days 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 -- owner of DML error tables
dml_tables_owner CONSTANT VARCHAR2(30) := NULL; -- NULL = same as current owner dml_tables_owner CONSTANT VARCHAR2(30) := NULL; -- NULL = same as current owner
dml_tables_prefix CONSTANT VARCHAR2(30) := ''; -- ERR$ 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;

View File

@ -369,6 +369,69 @@ CREATE OR REPLACE PACKAGE BODY app AS
AS AS
BEGIN BEGIN
APEX_APPLICATION.G_DEBUG := in_status; 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; END;

View File

@ -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 -- for sending emails
smtp_from CONSTANT VARCHAR2(200) := ''; smtp_from CONSTANT VARCHAR2(200) := '';
smtp_username CONSTANT VARCHAR2(50) := NULL; smtp_username CONSTANT VARCHAR2(50) := NULL;
@ -196,17 +193,6 @@ CREATE OR REPLACE PACKAGE app_actions AS
-- ### Settings page -- ### 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 -- Store/update settings
-- --

View File

@ -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 ( PROCEDURE set_setting (
in_action CHAR, in_action CHAR,
in_setting_name_old settings.setting_name%TYPE, in_setting_name_old settings.setting_name%TYPE,
@ -692,10 +651,14 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
BEGIN BEGIN
app.log_module(); app.log_module();
-- --
IF app.get_settings_package() IS NULL THEN
RETURN;
END IF;
--
app.refresh_user_source_views(); app.refresh_user_source_views();
-- --
q := 'CREATE OR REPLACE PACKAGE ' || 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(settings_package) || ' AS' || CHR(10); b := 'CREATE OR REPLACE PACKAGE BODY ' || LOWER(app.get_settings_package()) || ' AS' || CHR(10);
-- --
FOR c IN ( FOR c IN (
SELECT DISTINCT SELECT DISTINCT
@ -703,12 +666,13 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
s.is_numeric, s.is_numeric,
s.is_date s.is_date
FROM settings s 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 ORDER BY s.setting_name
) LOOP ) LOOP
-- create specification -- create specification
q := q || CHR(10); 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 || ' in_context settings.setting_context%TYPE := NULL' || CHR(10);
q := q || ' )' || CHR(10); q := q || ' )' || CHR(10);
q := q || ' RETURN ' || CASE q := q || ' RETURN ' || CASE
@ -719,7 +683,7 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
-- create package body -- create package body
b := b || CHR(10); 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 || ' in_context settings.setting_context%TYPE := NULL' || CHR(10);
b := b || ' )' || CHR(10); b := b || ' )' || CHR(10);
b := b || ' RETURN ' || CASE b := b || ' RETURN ' || CASE
@ -731,7 +695,7 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
b := b || ' RETURN ' || CASE b := b || ' RETURN ' || CASE
WHEN c.is_numeric = 'Y' THEN 'TO_NUMBER(' WHEN c.is_numeric = 'Y' THEN 'TO_NUMBER('
WHEN c.is_date = 'Y' THEN 'app.get_date(' 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_name => ''' || c.setting_name || ''',' || CHR(10);
b := b || ' in_context => in_context' || CHR(10); b := b || ' in_context => in_context' || CHR(10);
b := b || ' ' || CASE b := b || ' ' || CASE
@ -750,7 +714,7 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
EXECUTE IMMEDIATE b; EXECUTE IMMEDIATE b;
-- --
recompile ( recompile (
in_name => 'SETT', in_name => app.get_settings_package(),
in_force => TRUE in_force => TRUE
); );
-- --
@ -764,6 +728,9 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
WHEN app.app_exception THEN WHEN app.app_exception THEN
RAISE; RAISE;
WHEN OTHERS THEN WHEN OTHERS THEN
app.log_debug(q); -- trimmed
app.log_debug(b); -- trimmed
--
app.raise_error(); app.raise_error();
END; END;
@ -785,7 +752,6 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
v_query := v_query || 'SELECT' || CHR(10); v_query := v_query || 'SELECT' || CHR(10);
v_query := v_query || ' s.setting_name,' || 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(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); v_query := v_query || ' MAX(CASE WHEN s.setting_context IS NULL THEN s.setting_value END) AS null__,' || CHR(10);
-- --
FOR c IN ( FOR c IN (

View File

@ -38,7 +38,7 @@ COMPOUND TRIGGER
:NEW.updated_at := curr_updated_at; :NEW.updated_at := curr_updated_at;
-- check name -- 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); app.raise_error('WRONG_NAME', :NEW.setting_name);
END IF; END IF;

View File

@ -1,8 +1,8 @@
CREATE OR REPLACE VIEW settings_overview AS CREATE OR REPLACE VIEW settings_overview AS
WITH x AS ( WITH x AS (
SELECT /*+ MATERIALIZE */ SELECT /*+ MATERIALIZE */
UPPER('SETT') AS package_name, -- @TODO: app_actions spec app.get_settings_package() AS package_name,
UPPER('GET_') AS prefix, app.get_settings_prefix() AS prefix,
app.get_item('$SETTING_NAME') AS setting_name, app.get_item('$SETTING_NAME') AS setting_name,
app.get_app_id() AS app_id app.get_app_id() AS app_id
FROM DUAL FROM DUAL