Files
src-1.2/game/server/database/shared_packages/db_error_logger.plsql
T
2014-01-17 07:03:16 -07:00

204 lines
4.5 KiB
Plaintext

create or replace package body db_error_logger
as
procedure dblogerror( p_ora_errno number, p_notes varchar2 default NULL)
as
PRAGMA AUTONOMOUS_TRANSACTION;
v_ora_errmsg varchar2(255);
v_schema varchar2(30);
v_module varchar2(80);
v_notes varchar2(4000);
begin
v_ora_errmsg := SQLERRM(p_ora_errno);
stack_search(2, v_schema, v_module);
if length(p_notes) > 4000 then
v_notes := substr(p_notes,1,4000);
else
v_notes := p_notes;
end if;
insert into errorlog
( error_id,
ora_errno,
ora_errmsg,
schema_name,
module_name,
notes )
values
( seq_errorlog.nextval,
p_ora_errno,
v_ora_errmsg,
v_schema,
v_module,
v_notes );
COMMIT;
exception
when others then
NULL;
end;
procedure dblogerror_values( p_owner varchar2, p_name varchar2, p_type varchar2, p_value varchar2)
as
PRAGMA AUTONOMOUS_TRANSACTION;
v_value varchar2(4000);
begin
if length(p_value) > 4000 then
v_value := substr(p_value,1,4000);
else
v_value := p_value;
end if;
insert into errorlog_values
( error_id,
element_owner,
element_name,
element_type,
element_value )
values
( seq_errorlog.currval,
p_owner,
p_name,
p_type,
v_value );
COMMIT;
exception
when others then
NULL;
end;
procedure stack_search ( i_search in integer, o_schema out varchar2, o_module out varchar2 )
-----
-- Returns the schema and module of the specified stack level
-- (specified by i_search). Stack level 0 is this proc.
-- Stack level 1 is this proc's caller. Level 2 is THEIR
-- caller. And so on.
-----
as
call_stack varchar2(4096) default dbms_utility.format_call_stack;
n number;
m_found_stack boolean default false;
m_line varchar2(255);
m_count number := 0;
m_start integer := 1;
m_end integer := -1;
begin
o_schema := 'Not found';
o_module := 'Not found';
loop
m_end := instr( call_stack, chr(10), m_start );
exit when ( m_count > i_search or m_end is NULL or m_end = 0 );
m_line := ltrim(substr( call_stack, m_start + 20, m_end - (m_start + 20 )));
m_start := m_end + 1;
-- Remove formatted stack header
if ( NOT m_found_stack ) then
if ( m_line like 'name%' ) then
m_found_stack := TRUE;
end if;
else
if ( m_count = i_search ) then
if ( m_line like 'pr%' ) then
n := length( 'procedure ' );
elsif ( m_line like 'fun%' ) then
n := length( 'function ' );
elsif ( m_line like 'package body%' ) then
n := length( 'package body ' );
elsif ( m_line like 'pack%' ) then
n := length( 'package ' );
else
n := length( 'anonymous block ' );
end if;
m_line := substr( m_line, n );
n := instr( m_line, '.' );
o_schema := ltrim(rtrim(substr( m_line, 1, n-1 )));
o_module := ltrim(rtrim(substr( m_line, n+1 )));
end if;
m_count := m_count + 1;
end if;
end loop;
end stack_search;
function getloglevel
RETURN INTEGER
as
m_level INTEGER;
begin
select levelid
into m_level
from errorlog_level;
return m_level;
exception
when others then
return 0;
end getloglevel;
function reraisecheck ( p_package varchar2 default NULL, p_procedure varchar2 default NULL)
return INTEGER
as
PRAGMA AUTONOMOUS_TRANSACTION;
m_unlimited_errors INTEGER;
m_errorlimit INTEGER;
m_errorcount INTEGER;
begin
if (p_package IS NULL or p_procedure IS NULL) then
return 1;
else
update errorlog_reraise_limits
set errorcount = errorcount + 1
where package = p_package and
procedure = p_procedure;
commit;
if (sql%rowcount = 0) then
return 1;
else
select unlimited_flag, errorlimit, errorcount
into m_unlimited_errors, m_errorlimit, m_errorcount
from errorlog_reraise_limits
where package = p_package and
procedure = p_procedure;
if (m_unlimited_errors = 1) then
return 0;
else
if (m_errorcount <= m_errorlimit) then
return 0;
end if;
end if;
end if;
end if;
return 1;
exception
when others then
return 1;
end reraisecheck;
end;
/