Move constants to dedicated package

This commit is contained in:
Jan Kvetina 2022-07-22 17:12:33 +02:00
parent e247d4c735
commit b7958614c0
4 changed files with 652 additions and 130 deletions

View File

@ -29,64 +29,12 @@ CREATE OR REPLACE PACKAGE app AS
*
*/
-- CORE application alias
core_alias CONSTANT VARCHAR2(30) := 'CORE'; -- better than hardcode app number
core_owner CONSTANT VARCHAR2(30) := 'CORE';
-- code for app exception
app_exception_code CONSTANT PLS_INTEGER := -20000;
app_exception EXCEPTION;
--
PRAGMA EXCEPTION_INIT(app_exception, app_exception_code); -- as a side effect this will disable listing constants in tree on the left
-- internal date formats
format_date CONSTANT VARCHAR2(30) := 'YYYY-MM-DD';
format_date_time CONSTANT VARCHAR2(30) := 'YYYY-MM-DD HH24:MI:SS';
format_date_short CONSTANT VARCHAR2(30) := 'YYYY-MM-DD HH24:MI';
-- flags
flag_request CONSTANT logs.flag%TYPE := 'P'; -- APEX request (page rendering, form processing)
flag_module CONSTANT logs.flag%TYPE := 'M'; -- start of any module (procedure/function)
flag_action CONSTANT logs.flag%TYPE := 'A'; -- start of any APEX action
flag_debug CONSTANT logs.flag%TYPE := 'D'; -- debug
flag_result CONSTANT logs.flag%TYPE := 'R'; -- result of procedure for debugging purposes
flag_warning CONSTANT logs.flag%TYPE := 'W'; -- warning
flag_error CONSTANT logs.flag%TYPE := 'E'; -- error
flag_longops CONSTANT logs.flag%TYPE := 'L'; -- longops operation
flag_scheduler CONSTANT logs.flag%TYPE := 'S'; -- scheduler planned
flag_trigger CONSTANT logs.flag%TYPE := 'G'; -- called from trigger
-- specify maximum length for trim
length_user CONSTANT PLS_INTEGER := 30; -- logs.user_id%TYPE
length_action CONSTANT PLS_INTEGER := 64; -- logs.action_name%TYPE, v_$session.action
length_module CONSTANT PLS_INTEGER := 64; -- logs.module_name%TYPE
length_arguments CONSTANT PLS_INTEGER := 2000; -- logs.arguments%TYPE
length_payload CONSTANT PLS_INTEGER := 4000; -- logs.payload%TYPE
-- append callstack for these flags
track_callstack CONSTANT VARCHAR2(30) := flag_error || flag_warning || flag_module || flag_request || flag_trigger;
-- transform $NAME to P500_NAME if current page_id = 500
page_item_wild CONSTANT VARCHAR2(4) := '$';
page_item_prefix CONSTANT VARCHAR2(4) := 'P';
-- error log table name and max age fo records
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$
dml_tables_postfix CONSTANT VARCHAR2(30) := '_E$';
-- translations
transl_page_name CONSTANT VARCHAR2(30) := 'PAGE_NAME';
transl_page_title CONSTANT VARCHAR2(30) := 'PAGE_TITLE';
-- list/array of log_id
TYPE arr_logs_log_id IS
TABLE OF logs.log_id%TYPE
@ -97,12 +45,6 @@ CREATE OR REPLACE PACKAGE app AS
TABLE OF logs.log_id%TYPE
INDEX BY VARCHAR2(40);
-- proxy and wallet setup
app_proxy CONSTANT VARCHAR2(256) := '';
app_wallet CONSTANT VARCHAR2(256) := '';

View File

@ -51,7 +51,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
BEGIN
SELECT a.application_id INTO out_id
FROM apex_applications a
WHERE a.alias = app.core_alias;
WHERE a.alias = constants.get_core_alias();
--
RETURN out_id;
EXCEPTION
@ -65,7 +65,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
RETURN apex_applications.owner%TYPE
AS
BEGIN
RETURN app.core_owner;
RETURN constants.get_core_owner();
END;
@ -493,7 +493,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
BEGIN
RETURN CASE
WHEN app.get_app_id() > 0
THEN UPPER(app.settings_package) || app.get_app_id()
THEN UPPER(constants.get_settings_package()) || app.get_app_id()
END;
END;
@ -503,7 +503,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
RETURN VARCHAR2
AS
BEGIN
RETURN UPPER(app.settings_prefix);
RETURN UPPER(constants.get_settings_prefix());
END;
@ -870,7 +870,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
) AS
v_action_name logs.action_name%TYPE;
BEGIN
v_action_name := SUBSTR(TO_CHAR(NVL(recent_request_id, 0)) || '|' || TO_CHAR(in_log_id) || '|' || in_action_name, 1, app.length_action);
v_action_name := SUBSTR(TO_CHAR(NVL(recent_request_id, 0)) || '|' || TO_CHAR(in_log_id) || '|' || in_action_name, 1, constants.get_length_action());
--
IF in_module_name IS NOT NULL THEN
DBMS_APPLICATION_INFO.SET_MODULE(in_module_name, v_action_name); -- USERENV.MODULE, USERENV.ACTION
@ -1053,10 +1053,10 @@ CREATE OR REPLACE PACKAGE BODY app AS
-- translations
out_name := REPLACE (
out_name,
'&' || app.transl_page_name || '.',
'&' || constants.get_transl_page_name() || '.',
COALESCE (
app.get_translated_item(app.transl_page_name, in_page_id, in_app_id),
app.get_translated_item(app.transl_page_title, in_page_id, in_app_id)
app.get_translated_item(constants.get_transl_page_name(), in_page_id, in_app_id),
app.get_translated_item(constants.get_transl_page_title(), in_page_id, in_app_id)
)
);
--
@ -1085,8 +1085,8 @@ CREATE OR REPLACE PACKAGE BODY app AS
END IF;
-- translations
out_title := REPLACE(out_title, '&' || app.transl_page_title || '.', app.get_translated_item(app.transl_page_title, in_page_id, in_app_id));
out_title := REPLACE(out_title, '&' || app.transl_page_name || '.', app.get_translated_item(app.transl_page_name, in_page_id, in_app_id));
out_title := REPLACE(out_title, '&' || constants.get_transl_page_title() || '.', app.get_translated_item(constants.get_transl_page_title(), in_page_id, in_app_id));
out_title := REPLACE(out_title, '&' || constants.get_transl_page_name() || '.', app.get_translated_item(constants.get_transl_page_name(), in_page_id, in_app_id));
--
RETURN out_title;
EXCEPTION
@ -1358,7 +1358,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
BEGIN
v_app_id := NVL(in_app_id, app.get_real_app_id());
v_page_id := NVL(in_page_id, app.get_page_id());
v_item_name := REPLACE(in_name, app.page_item_wild, app.page_item_prefix || v_page_id || '_');
v_item_name := REPLACE(in_name, constants.get_page_item_wild(), constants.get_page_item_prefix() || v_page_id || '_');
-- check if item exists
BEGIN
@ -1457,15 +1457,15 @@ CREATE OR REPLACE PACKAGE BODY app AS
-- try different formats
BEGIN
RETURN TO_DATE(l_value, app.format_date_time); -- YYYY-MM-DD HH24:MI:SS
RETURN TO_DATE(l_value, constants.get_format_date_time()); -- YYYY-MM-DD HH24:MI:SS
EXCEPTION
WHEN OTHERS THEN
BEGIN
RETURN TO_DATE(l_value, app.format_date_short); -- YYYY-MM-DD HH24:MI
RETURN TO_DATE(l_value, constants.get_format_date_short()); -- YYYY-MM-DD HH24:MI
EXCEPTION
WHEN OTHERS THEN
BEGIN
RETURN TO_DATE(SUBSTR(l_value, 1, 10), app.format_date); -- YYYY-MM-DD
RETURN TO_DATE(SUBSTR(l_value, 1, 10), constants.get_format_date()); -- YYYY-MM-DD
EXCEPTION
WHEN OTHERS THEN
BEGIN
@ -1488,7 +1488,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
RETURN VARCHAR2
AS
BEGIN
RETURN TO_CHAR(COALESCE(in_date, SYSDATE), NVL(in_format, app.format_date));
RETURN TO_CHAR(COALESCE(in_date, SYSDATE), NVL(in_format, constants.get_format_date()));
END;
@ -1500,7 +1500,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
RETURN VARCHAR2
AS
BEGIN
RETURN TO_CHAR(COALESCE(in_date, SYSDATE), NVL(in_format, app.format_date_time));
RETURN TO_CHAR(COALESCE(in_date, SYSDATE), NVL(in_format, constants.get_format_date_time()));
END;
@ -1589,7 +1589,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
BEGIN
app.set_item (
in_name => in_name,
in_value => TO_CHAR(in_value, app.format_date_time),
in_value => TO_CHAR(in_value, constants.get_format_date_time()),
in_raise => in_raise
);
END;
@ -1840,7 +1840,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
-- create log
RETURN app.log__ (
in_flag => app.flag_request,
in_flag => constants.get_flag_request(),
in_action_name => app.get_request(),
in_arguments => v_args,
in_payload => NULL
@ -1866,7 +1866,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
AS
BEGIN
RETURN app.log__ (
in_flag => app.flag_module,
in_flag => constants.get_flag_module(),
in_arguments => app.get_json_list (
in_arg1, in_arg2,
in_arg3, in_arg4,
@ -1897,7 +1897,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
curr_id logs.log_id%TYPE;
BEGIN
curr_id := app.log__ (
in_flag => app.flag_module,
in_flag => constants.get_flag_module(),
in_arguments => app.get_json_list (
in_arg1, in_arg2,
in_arg3, in_arg4,
@ -1940,7 +1940,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
AS
BEGIN
RETURN app.log__ (
in_flag => app.flag_module,
in_flag => constants.get_flag_module(),
in_arguments => app.get_json_object (
in_name01, in_value01,
in_name02, in_value02,
@ -1999,7 +1999,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
curr_id logs.log_id%TYPE;
BEGIN
curr_id := app.log__ (
in_flag => app.flag_module,
in_flag => constants.get_flag_module(),
in_arguments => app.get_json_object (
in_name01, in_value01,
in_name02, in_value02,
@ -2048,7 +2048,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
AS
BEGIN
RETURN app.log__ (
in_flag => app.flag_action,
in_flag => constants.get_flag_action(),
in_action_name => in_action_name,
in_arguments => app.get_json_list (
in_arg1, in_arg2,
@ -2082,7 +2082,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
curr_id logs.log_id%TYPE;
BEGIN
curr_id := app.log__ (
in_flag => app.flag_action,
in_flag => constants.get_flag_action(),
in_action_name => in_action_name,
in_arguments => app.get_json_list (
in_arg1, in_arg2,
@ -2114,7 +2114,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
curr_id logs.log_id%TYPE;
BEGIN
curr_id := app.log__ (
in_flag => app.flag_debug,
in_flag => constants.get_flag_debug(),
in_arguments => app.get_json_list (
in_arg1, in_arg2,
in_arg3, in_arg4,
@ -2145,7 +2145,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
curr_id logs.log_id%TYPE;
BEGIN
curr_id := app.log__ (
in_flag => app.flag_result,
in_flag => constants.get_flag_result(),
in_arguments => app.get_json_list (
in_arg1, in_arg2,
in_arg3, in_arg4,
@ -2178,7 +2178,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
curr_id logs.log_id%TYPE;
BEGIN
curr_id := app.log__ (
in_flag => app.flag_warning,
in_flag => constants.get_flag_warning(),
in_action_name => in_action_name,
in_arguments => app.get_json_list (
in_arg1, in_arg2,
@ -2212,7 +2212,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
AS
BEGIN
RETURN app.log__ (
in_flag => app.flag_error,
in_flag => constants.get_flag_error(),
in_action_name => in_action_name,
in_arguments => app.get_json_list (
in_arg1, in_arg2,
@ -2246,7 +2246,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
curr_id logs.log_id%TYPE;
BEGIN
curr_id := app.log__ (
in_flag => app.flag_error,
in_flag => constants.get_flag_error(),
in_action_name => in_action_name,
in_arguments => app.get_json_list (
in_arg1, in_arg2,
@ -2338,7 +2338,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
AS
BEGIN
RETURN app.log__ (
in_flag => app.flag_trigger,
in_flag => constants.get_flag_trigger,
in_action_name => in_action_name,
in_arguments => app.get_json_list (
in_arg1, in_arg2,
@ -2395,7 +2395,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
FROM logs l
WHERE l.log_id > rec.log_parent
AND l.log_parent = rec.log_parent
AND l.flag = app.flag_longops;
AND l.flag = constants.get_flag_longops();
--
v_rindex := REPLACE(REGEXP_SUBSTR(rec.arguments, '\|[^\|]*$'), '|', '');
@ -2410,7 +2410,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
-- create new longops record
rec.log_id := app.log__ (
in_flag => app.flag_longops,
in_flag => constants.get_flag_longops(),
in_action_name => in_action_name,
in_arguments => ROUND(NVL(in_progress, 0) * 100, 2) || '%|' || in_note || '|' || v_rindex,
in_parent_id => rec.log_parent
@ -2521,7 +2521,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
curr_id logs.log_id%TYPE;
BEGIN
curr_id := app.log__ (
in_flag => app.flag_scheduler,
in_flag => constants.get_flag_scheduler(),
in_arguments => REPLACE(in_job_name, '"', ''),
in_parent_id => in_log_id
);
@ -2636,7 +2636,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
AND j.log_date >= SYSDATE - NVL(in_interval, 1/24)
JOIN logs l
ON l.created_at >= SYSDATE - NVL(in_interval, 1/24)
AND l.flag = app.flag_scheduler
AND l.flag = constants.get_flag_scheduler()
AND l.action_name IS NULL
AND l.arguments = d.job_name
WHERE d.owner = app.get_owner()
@ -2695,34 +2695,34 @@ CREATE OR REPLACE PACKAGE BODY app AS
rec.session_id := COALESCE(in_session_id, app.get_session_id());
rec.flag := COALESCE(in_flag, '?');
--
rec.module_name := SUBSTR(COALESCE(in_module_name, app.get_caller_name(callstack_depth)), 1, app.length_module);
rec.module_name := SUBSTR(COALESCE(in_module_name, app.get_caller_name(callstack_depth)), 1, constants.get_length_module());
rec.module_line := COALESCE(in_module_line, app.get_caller_line(callstack_depth));
--
IF rec.flag = app.flag_error AND rec.module_name = raise_error_procedure THEN
IF rec.flag = constants.get_flag_error() AND rec.module_name = raise_error_procedure THEN
-- make it more usefull for raised errors, shift by one more
rec.module_name := SUBSTR(COALESCE(in_module_name, app.get_caller_name(callstack_depth + 1)), 1, app.length_module);
rec.module_name := SUBSTR(COALESCE(in_module_name, app.get_caller_name(callstack_depth + 1)), 1, constants.get_length_module());
rec.module_line := COALESCE(in_module_line, app.get_caller_line(callstack_depth + 1));
END IF;
--
rec.action_name := SUBSTR(in_action_name, 1, app.length_action);
rec.arguments := SUBSTR(in_arguments, 1, app.length_arguments);
rec.payload := SUBSTR(in_payload, 1, app.length_payload);
rec.action_name := SUBSTR(in_action_name, 1, constants.get_length_action());
rec.arguments := SUBSTR(in_arguments, 1, constants.get_length_arguments());
rec.payload := SUBSTR(in_payload, 1, constants.get_length_payload());
rec.created_at := SYSTIMESTAMP;
-- dont log blacklisted records
IF SQLCODE = 0 AND NOT app.is_debug_on() AND app.is_blacklisted(rec.flag, rec.module_name, rec.action_name) AND rec.flag NOT IN (app.flag_error, app.flag_warning) THEN
IF SQLCODE = 0 AND NOT app.is_debug_on() AND app.is_blacklisted(rec.flag, rec.module_name, rec.action_name) AND rec.flag NOT IN (constants.get_flag_error(), constants.get_flag_warning()) THEN
RETURN NULL; -- skip blacklisted record only if there is no error and debug mode off
END IF;
-- dont log some things
IF rec.flag = app.flag_error AND in_payload LIKE 'Your session has ended%' THEN
IF rec.flag = constants.get_flag_error() AND in_payload LIKE 'Your session has ended%' THEN
RETURN NULL;
END IF;
-- retrieve parent log from map
IF in_parent_id IS NULL AND rec.flag != app.flag_request THEN
IF in_parent_id IS NULL AND rec.flag != constants.get_flag_request() THEN
callstack_hash := app.get_hash(app.get_call_stack (
in_offset => callstack_depth + CASE WHEN rec.flag = app.flag_module THEN 1 ELSE 0 END, -- magic
in_offset => callstack_depth + CASE WHEN rec.flag = constants.get_flag_module() THEN 1 ELSE 0 END, -- magic
in_skip_others => TRUE,
in_line_numbers => FALSE,
in_splitter => '|'
@ -2734,7 +2734,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
END IF;
-- save new map record for log hierarchy
IF rec.flag IN (app.flag_module, app.flag_trigger) THEN
IF rec.flag IN (constants.get_flag_module(), constants.get_flag_trigger()) THEN
callstack_hash := app.get_hash(app.get_call_stack (
in_offset => callstack_depth,
in_skip_others => TRUE,
@ -2746,24 +2746,24 @@ CREATE OR REPLACE PACKAGE BODY app AS
END IF;
-- set session things
IF rec.flag IN (app.flag_request, app.flag_module) THEN
IF rec.flag IN (constants.get_flag_request(), constants.get_flag_module()) THEN
recent_log_id := rec.log_id;
--
app.set_session (
in_module_name => CASE WHEN rec.flag = app.flag_request THEN 'APEX|' || TO_CHAR(rec.app_id) || '|' || TO_CHAR(rec.page_id) ELSE rec.module_name END,
in_module_name => CASE WHEN rec.flag = constants.get_flag_request() THEN 'APEX|' || TO_CHAR(rec.app_id) || '|' || TO_CHAR(rec.page_id) ELSE rec.module_name END,
in_action_name => rec.action_name,
in_log_id => rec.log_id
);
END IF;
-- add call stack
IF (SQLCODE != 0 OR INSTR(app.track_callstack, rec.flag) > 0) THEN
rec.payload := SUBSTR(rec.payload || CHR(10) || '--' || CHR(10) || app.get_shorter_stack(app.get_call_stack()), 1, app.length_payload);
IF (SQLCODE != 0 OR INSTR(constants.get_track_callstack(), rec.flag) > 0) THEN
rec.payload := SUBSTR(rec.payload || CHR(10) || '--' || CHR(10) || app.get_shorter_stack(app.get_call_stack()), 1, constants.get_length_payload());
END IF;
-- add error stack
IF SQLCODE != 0 THEN
rec.payload := SUBSTR(rec.payload || CHR(10) || '--' || CHR(10) || app.get_shorter_stack(app.get_error_stack()), 1, app.length_payload);
rec.payload := SUBSTR(rec.payload || CHR(10) || '--' || CHR(10) || app.get_shorter_stack(app.get_error_stack()), 1, constants.get_length_payload());
END IF;
-- print message to console
@ -2787,7 +2787,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
COMMIT;
--
BEGIN
rec.flag := app.flag_error;
rec.flag := constants.get_flag_error();
rec.action_name := 'FATAL_ERROR';
rec.payload := DBMS_UTILITY.FORMAT_ERROR_STACK || CHR(10) || DBMS_UTILITY.FORMAT_CALL_STACK;
--
@ -2976,7 +2976,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
v_action_name := SUBSTR(APEX_ERROR.EXTRACT_CONSTRAINT_NAME (
p_error => p_error,
p_include_schema => FALSE
), 1, app.length_action);
), 1, constants.get_length_action());
--
out_result.message := 'CONSTRAINT_ERROR|' || v_action_name;
out_result.display_location := APEX_ERROR.C_INLINE_IN_NOTIFICATION;
@ -3002,7 +3002,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
app.get_shorter_stack(p_error.ora_sqlerrm) || CHR(10) || '--' || CHR(10) ||
app.get_shorter_stack(p_error.error_statement) || CHR(10) || '--' || CHR(10),
--app.get_shorter_stack(p_error.error_backtrace) || CHR(10) || '--' || CHR(10)
1, app.length_payload
1, constants.get_length_payload()
);
--
v_log_id := app.log_error (
@ -3073,12 +3073,12 @@ CREATE OR REPLACE PACKAGE BODY app AS
-- purge all
IF in_age < 0 THEN
EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || app.logs_table_name || ' CASCADE';
EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || constants.get_logs_table_name() || ' CASCADE';
END IF;
-- remove old sessions
DELETE FROM sessions t
WHERE t.created_at < TRUNC(SYSDATE) - NVL(in_age, app.logs_max_age);
WHERE t.created_at < TRUNC(SYSDATE) - NVL(in_age, constants.get_logs_max_age());
-- remove old messages
DELETE FROM user_messages t
@ -3100,8 +3100,8 @@ CREATE OR REPLACE PACKAGE BODY app AS
COLUMNS high_value VARCHAR2(4000) PATH 'HIGH_VALUE'
) h
WHERE p.table_owner = app.get_owner()
AND p.table_name = app.logs_table_name
AND TO_DATE(REGEXP_SUBSTR(h.high_value, '(\d{4}-\d{2}-\d{2})'), 'YYYY-MM-DD') <= TRUNC(SYSDATE) - COALESCE(in_age, app.logs_max_age)
AND p.table_name = constants.get_logs_table_name()
AND TO_DATE(REGEXP_SUBSTR(h.high_value, '(\d{4}-\d{2}-\d{2})'), 'YYYY-MM-DD') <= TRUNC(SYSDATE) - COALESCE(in_age, constants.get_logs_max_age())
) LOOP
-- delete old data in batches
FOR i IN 1 .. 100 LOOP
@ -3212,7 +3212,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
RETURN logs.module_name%TYPE
AS
BEGIN
RETURN SUBSTR(UTL_CALL_STACK.CONCATENATE_SUBPROGRAM(UTL_CALL_STACK.SUBPROGRAM(NVL(in_offset, 2))), 1, app.length_module);
RETURN SUBSTR(UTL_CALL_STACK.CONCATENATE_SUBPROGRAM(UTL_CALL_STACK.SUBPROGRAM(NVL(in_offset, 2))), 1, constants.get_length_module());
EXCEPTION
WHEN BAD_DEPTH THEN
RETURN NULL;
@ -3266,7 +3266,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
FOR i IN REVERSE NVL(in_offset, 2) .. UTL_CALL_STACK.DYNAMIC_DEPTH LOOP -- 2 = ignore this function, 3 = ignore caller
CONTINUE WHEN in_skip_others AND NVL(UTL_CALL_STACK.OWNER(i), '-') NOT IN (app.get_owner(), app.get_core_owner());
--
out_module := SUBSTR(UTL_CALL_STACK.CONCATENATE_SUBPROGRAM(UTL_CALL_STACK.SUBPROGRAM(i)), 1, app.length_module);
out_module := SUBSTR(UTL_CALL_STACK.CONCATENATE_SUBPROGRAM(UTL_CALL_STACK.SUBPROGRAM(i)), 1, constants.get_length_module());
out_stack := out_stack || out_module || CASE WHEN in_line_numbers THEN ' [' || TO_CHAR(UTL_CALL_STACK.UNIT_LINE(i)) || ']' END || in_splitter;
END LOOP;
--
@ -3626,12 +3626,12 @@ CREATE OR REPLACE PACKAGE BODY app AS
out_content VARCHAR2(32767); -- could be CLOB
v_buffer VARCHAR2(32767);
BEGIN
IF app.app_proxy IS NOT NULL THEN
UTL_HTTP.SET_PROXY(app.app_proxy);
IF constants.get_app_proxy() IS NOT NULL THEN
UTL_HTTP.SET_PROXY(constants.get_app_proxy());
END IF;
--
IF app.app_wallet IS NOT NULL THEN
UTL_HTTP.SET_WALLET(app.app_wallet);
IF constants.get_app_wallet() IS NOT NULL THEN
UTL_HTTP.SET_WALLET(constants.get_app_wallet());
END IF;
-- send headers
@ -3794,7 +3794,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
skip_unsupported => TRUE
);
--
IF app.get_owner() != app.dml_tables_owner THEN
IF app.get_owner() != constants.get_dml_tables_owner() THEN
EXECUTE IMMEDIATE
'GRANT ALL ON ' || app.get_dml_table(in_table_name) ||
' TO ' || app.get_owner();
@ -3841,7 +3841,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
LISTAGG(c.column_name, ', ') WITHIN GROUP (ORDER BY c.column_id) AS list_columns
FROM user_tables t
JOIN all_tables a
ON a.owner = COALESCE(app.dml_tables_owner, app.get_owner(), USER)
ON a.owner = COALESCE(constants.get_dml_tables_owner(), app.get_owner(), USER)
AND a.table_name = app.get_dml_table(t.table_name)
AND a.table_name != t.table_name
JOIN all_tab_cols c
@ -3929,11 +3929,11 @@ CREATE OR REPLACE PACKAGE BODY app AS
v_table_name all_tables.table_name%TYPE;
v_valid CHAR;
BEGIN
v_table_name := app.dml_tables_prefix ||
v_table_name := constants.get_dml_tables_prefix() ||
REGEXP_REPLACE(REGEXP_REPLACE(in_table_name,
'(' || REPLACE(app.dml_tables_postfix, '$', '\$') || ')$', ''),
'^(' || REPLACE(app.dml_tables_prefix, '$', '\$') || ')', '') ||
app.dml_tables_postfix;
'(' || REPLACE(constants.get_dml_tables_postfix(), '$', '\$') || ')$', ''),
'^(' || REPLACE(constants.get_dml_tables_prefix(), '$', '\$') || ')', '') ||
constants.get_dml_tables_postfix();
--
IF in_existing_only THEN
SELECT 'Y' INTO v_valid
@ -3954,7 +3954,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
RETURN VARCHAR2
AS
BEGIN
RETURN COALESCE(app.dml_tables_owner, app.get_owner());
RETURN COALESCE(constants.get_dml_tables_owner(), app.get_owner());
END;
@ -4189,7 +4189,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
) LOOP
-- create specification
q := q || CHR(10);
q := q || ' FUNCTION ' || LOWER(app.settings_prefix) || LOWER(c.setting_name) || ' (' || CHR(10);
q := q || ' FUNCTION ' || LOWER(constants.get_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
@ -4200,7 +4200,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
-- create package body
b := b || CHR(10);
b := b || ' FUNCTION ' || LOWER(app.settings_prefix) || LOWER(c.setting_name) || ' (' || CHR(10);
b := b || ' FUNCTION ' || LOWER(constants.get_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

View File

@ -0,0 +1,203 @@
CREATE OR REPLACE PACKAGE constants AS
-- CORE application alias
core_alias CONSTANT VARCHAR2(30) := 'CORE'; -- better than hardcode app number
core_owner CONSTANT VARCHAR2(30) := 'CORE';
-- internal date formats
format_date CONSTANT VARCHAR2(30) := 'YYYY-MM-DD';
format_date_time CONSTANT VARCHAR2(30) := 'YYYY-MM-DD HH24:MI:SS';
format_date_short CONSTANT VARCHAR2(30) := 'YYYY-MM-DD HH24:MI';
-- flags
flag_request CONSTANT logs.flag%TYPE := 'P'; -- APEX request (page rendering, form processing)
flag_module CONSTANT logs.flag%TYPE := 'M'; -- start of any module (procedure/function)
flag_action CONSTANT logs.flag%TYPE := 'A'; -- start of any APEX action
flag_debug CONSTANT logs.flag%TYPE := 'D'; -- debug
flag_result CONSTANT logs.flag%TYPE := 'R'; -- result of procedure for debugging purposes
flag_warning CONSTANT logs.flag%TYPE := 'W'; -- warning
flag_error CONSTANT logs.flag%TYPE := 'E'; -- error
flag_longops CONSTANT logs.flag%TYPE := 'L'; -- longops operation
flag_scheduler CONSTANT logs.flag%TYPE := 'S'; -- scheduler planned
flag_trigger CONSTANT logs.flag%TYPE := 'G'; -- called from trigger
-- specify maximum length for trim
length_user CONSTANT PLS_INTEGER := 30; -- logs.user_id%TYPE
length_action CONSTANT PLS_INTEGER := 64; -- logs.action_name%TYPE, v_$session.action
length_module CONSTANT PLS_INTEGER := 64; -- logs.module_name%TYPE
length_arguments CONSTANT PLS_INTEGER := 2000; -- logs.arguments%TYPE
length_payload CONSTANT PLS_INTEGER := 4000; -- logs.payload%TYPE
-- append callstack for these flags
track_callstack CONSTANT VARCHAR2(30) := flag_error || flag_warning || flag_module || flag_request || flag_trigger;
-- transform $NAME to P500_NAME if current page_id = 500
page_item_wild CONSTANT VARCHAR2(4) := '$';
page_item_prefix CONSTANT VARCHAR2(4) := 'P';
-- error log table name and max age fo records
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$
dml_tables_postfix CONSTANT VARCHAR2(30) := '_E$';
-- translations
transl_page_name CONSTANT VARCHAR2(30) := 'PAGE_NAME';
transl_page_title CONSTANT VARCHAR2(30) := 'PAGE_TITLE';
-- proxy and wallet setup
app_proxy CONSTANT VARCHAR2(256) := '';
app_wallet CONSTANT VARCHAR2(256) := '';
--
-- GENERATED FUNCTIONS
--
FUNCTION get_core_alias
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_core_owner
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_format_date
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_format_date_time
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_format_date_short
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_flag_request
RETURN logs.flag%TYPE
DETERMINISTIC;
FUNCTION get_flag_module
RETURN logs.flag%TYPE
DETERMINISTIC;
FUNCTION get_flag_action
RETURN logs.flag%TYPE
DETERMINISTIC;
FUNCTION get_flag_debug
RETURN logs.flag%TYPE
DETERMINISTIC;
FUNCTION get_flag_result
RETURN logs.flag%TYPE
DETERMINISTIC;
FUNCTION get_flag_warning
RETURN logs.flag%TYPE
DETERMINISTIC;
FUNCTION get_flag_error
RETURN logs.flag%TYPE
DETERMINISTIC;
FUNCTION get_flag_longops
RETURN logs.flag%TYPE
DETERMINISTIC;
FUNCTION get_flag_scheduler
RETURN logs.flag%TYPE
DETERMINISTIC;
FUNCTION get_flag_trigger
RETURN logs.flag%TYPE
DETERMINISTIC;
FUNCTION get_length_user
RETURN PLS_INTEGER
DETERMINISTIC;
FUNCTION get_length_action
RETURN PLS_INTEGER
DETERMINISTIC;
FUNCTION get_length_module
RETURN PLS_INTEGER
DETERMINISTIC;
FUNCTION get_length_arguments
RETURN PLS_INTEGER
DETERMINISTIC;
FUNCTION get_length_payload
RETURN PLS_INTEGER
DETERMINISTIC;
FUNCTION get_track_callstack
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_page_item_wild
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_page_item_prefix
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_logs_table_name
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_logs_max_age
RETURN PLS_INTEGER
DETERMINISTIC;
FUNCTION get_settings_package
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_settings_prefix
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_dml_tables_owner
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_dml_tables_prefix
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_dml_tables_postfix
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_transl_page_name
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_transl_page_title
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_app_proxy
RETURN VARCHAR2
DETERMINISTIC;
FUNCTION get_app_wallet
RETURN VARCHAR2
DETERMINISTIC;
END;
/

View File

@ -0,0 +1,377 @@
CREATE OR REPLACE PACKAGE BODY constants AS
FUNCTION get_core_alias
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.core_alias;
END;
FUNCTION get_core_owner
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.core_owner;
END;
FUNCTION get_format_date
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.format_date;
END;
FUNCTION get_format_date_time
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.format_date_time;
END;
FUNCTION get_format_date_short
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.format_date_short;
END;
FUNCTION get_flag_request
RETURN logs.flag%TYPE
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.flag_request;
END;
FUNCTION get_flag_module
RETURN logs.flag%TYPE
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.flag_module;
END;
FUNCTION get_flag_action
RETURN logs.flag%TYPE
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.flag_action;
END;
FUNCTION get_flag_debug
RETURN logs.flag%TYPE
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.flag_debug;
END;
FUNCTION get_flag_result
RETURN logs.flag%TYPE
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.flag_result;
END;
FUNCTION get_flag_warning
RETURN logs.flag%TYPE
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.flag_warning;
END;
FUNCTION get_flag_error
RETURN logs.flag%TYPE
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.flag_error;
END;
FUNCTION get_flag_longops
RETURN logs.flag%TYPE
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.flag_longops;
END;
FUNCTION get_flag_scheduler
RETURN logs.flag%TYPE
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.flag_scheduler;
END;
FUNCTION get_flag_trigger
RETURN logs.flag%TYPE
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.flag_trigger;
END;
FUNCTION get_length_user
RETURN PLS_INTEGER
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.length_user;
END;
FUNCTION get_length_action
RETURN PLS_INTEGER
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.length_action;
END;
FUNCTION get_length_module
RETURN PLS_INTEGER
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.length_module;
END;
FUNCTION get_length_arguments
RETURN PLS_INTEGER
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.length_arguments;
END;
FUNCTION get_length_payload
RETURN PLS_INTEGER
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.length_payload;
END;
FUNCTION get_track_callstack
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.track_callstack;
END;
FUNCTION get_page_item_wild
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.page_item_wild;
END;
FUNCTION get_page_item_prefix
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.page_item_prefix;
END;
FUNCTION get_logs_table_name
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.logs_table_name;
END;
FUNCTION get_logs_max_age
RETURN PLS_INTEGER
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.logs_max_age;
END;
FUNCTION get_settings_package
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.settings_package;
END;
FUNCTION get_settings_prefix
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.settings_prefix;
END;
FUNCTION get_dml_tables_owner
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.dml_tables_owner;
END;
FUNCTION get_dml_tables_prefix
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.dml_tables_prefix;
END;
FUNCTION get_dml_tables_postfix
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.dml_tables_postfix;
END;
FUNCTION get_transl_page_name
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.transl_page_name;
END;
FUNCTION get_transl_page_title
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.transl_page_title;
END;
FUNCTION get_app_proxy
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.app_proxy;
END;
FUNCTION get_app_wallet
RETURN VARCHAR2
DETERMINISTIC
AS
PRAGMA UDF;
BEGIN
RETURN constants.app_wallet;
END;
END;
/