Rem  Copyright (c) 2004, Oracle. All rights reserved.
Rem    NAME
Rem      privmat.sql - package of various OWA utility procedures
Rem    DESCRIPTION
Rem      This file contains one package:
Rem         owa_match   - Utitility procedures/functions for use
Rem                       with the Oracle Web Agent
Rem
Rem    NOTES
Rem      The Oracle Web Agent is needed to use these facilities.
Rem      The package owa_match is needed to use these facilities.
Rem
Rem    MODIFIED   (MM/DD/YY)
Rem     dnonkin    08/12/04 -  Creation

create or replace package body owa_match

as

    --- Special characters list, note 1 space in the beginning and 
    --- a single quote escaped at the end. 
    SPECIAL_CHARS constant varchar2(27) := ' @*()+-/=\<>;:"|&?{}[]''' 
        || chr(9)   -- tab 
        || chr(10)  -- new line 
        || chr(12)  -- form feed 
        || chr(13); -- cr

    TRANS_CHARS   constant varchar2(27) := '***************************';

    function match_pattern
    (
        p_string            in varchar2,
        p_simple_pattern    in owa_util.vc_arr default empty_vc_arr,
        p_complex_pattern   in owa_util.vc_arr default empty_vc_arr,
        p_use_special_chars in boolean         default true
    )
    return boolean is
        l_string        varchar2(512) := upper(p_string);
        l_count         integer := p_simple_pattern.count;
    begin

        if (p_use_special_chars) then
            --- First, check the string for any special characters,
            --- use translate function to replace any special character
            --- in the list with a '*'.
            --- Look for any '*' in the string, this means a special character
            --- has been found and the check failed.
            if (instr(translate(l_string, SPECIAL_CHARS, TRANS_CHARS),'*') > 0) then
                return true;
            end if;
        end if;

        --- Second, check the incoming string against default
        --- exclusions list
        for i in 1..l_count loop
            if (l_string like upper(p_simple_pattern(i)) escape '\') then
                return true;
            end if;
        end loop;

        --- Finally, check if we have any dynamic exclusions passed to us.
        --- If so, check the string against those exclusions as well.
        --- This is very slow, so should be used as the last resort, when
        --- cannot be covered by other checks.
        l_count := p_complex_pattern.count;
        if (l_count > 0) then
            for i in 1..l_count loop
                --- Use owa_pattern to do case-insensitive search
                if (owa_pattern.match(
                       line  => l_string,
                       pat   => upper(p_complex_pattern(i)),
                       flags => 'i'))
                then
                    return true; 
                end if;
            end loop;
        end if;

        return false; 

    end match_pattern;

end owa_match;

/

show errors package body owa_match