MINI MINI MANI MO

Path : /opt/oracle/product/18c/dbhomeXE/ctx/migrate/
File Upload :
Current File : //opt/oracle/product/18c/dbhomeXE/ctx/migrate/drmig.pkb

rem 
rem Copyright (c) Oracle Corporation 1998, 1999.  All Rights Reserved.
rem
rem  NAME
rem    drmig.pkb - MIGration logic
rem
rem  DESCRIPTION
rem    This package contains the migration logic
rem
rem  MODIFIED    (MM/DD/YY)
rem    gkaminag 02/11/99 -  obsolete keyword dstore
rem    gkaminag 01/20/99 -  bug 801446
rem    ehuang   09/04/98 -  default preference name changes
rem    gkaminag 07/28/98 -  bug 706739/706688
rem    gkaminag 07/23/98 -  bug 705281
rem    gkaminag 07/23/98 -  bugs
rem    gkaminag 06/10/98 -  handle NEWLINE
rem    gkaminag 06/10/98 -  sentence/paragraph
rem    ehuang   06/04/98 -  DEFAULT_ENGINE to DEFAULT_STORAGE
rem    gkaminag 06/03/98 -  migrate blaster filter to inso filter
rem    gkaminag 06/02/98 -  Creation 

create or replace package body dr_migrate as

  lineno      number;
  pv_new_name varchar2(30);

/*-------------------------------------------------------------------------*/

procedure writeln(linetxt in varchar2 default null)
is
begin
   lineno := lineno + 1;
   insert into dr$msql values (lineno, linetxt);
   commit;
end writeln;

/*-------------------------------------------------------------------------*/

procedure comment(comtxt in varchar2)
is
begin
   writeln('REM '||comtxt);
end comment;

/*-------------------------------------------------------------------------*/

procedure warn(warntxt in varchar2)
is
begin
   writeln('REM WARNING: '||warntxt);
end warn;

/*-------------------------------------------------------------------------*/

procedure plsql(
  call in varchar2,
  arg1 in varchar2,
  arg2 in varchar2 default null,
  arg3 in varchar2 default null
) 
is
  temp  varchar2(500);
  line  varchar2(200);
begin
  line := call||'('''||replace(arg1,'''','''''')||'''';
  if (arg2 is not null) then

    if (length(arg2) > 70) then

      line := line||',';
      writeln(line);

      temp := arg2;
      while (length(temp) > 70) 
      loop
        writeln('    '''||replace(substr(temp,1,70),'''','''''')||'''||');
        temp := substr(temp, 71);
      end loop;

      line := '     '''||replace(temp,'''','''''')||'''';

    else
      line := line||','''||replace(arg2,'''','''''')||'''';
    end if;


    if (arg3 is not null)then
      line := line||',';
      writeln(line);

      temp := arg3;
      while (length(temp) > 70) 
      loop
        writeln('    '''||replace(substr(temp,1,70),'''','''''')||'''||');
        temp := substr(temp, 71);
      end loop;

      line := '     '''||replace(temp,'''','''''')||'''';
    end if;
  end if;

  line := line||');';
  writeln(line);
end plsql;

/*-------------------------------------------------------------------------*/

function prename(
  p_pre_owner in varchar2
, p_pre_name  in varchar2
) return varchar2 is
begin
  return '"'||p_pre_owner||'"."'||p_pre_name||'"';
end;


/*-------------------------------------------------------------------------*/

procedure writepref (
  p_pre_id    in number,
  p_pre_owner in varchar2,
  p_pre_name  in varchar2,
  p_pre_obj   in varchar2,
  p_attr_ig1  in varchar2 default null,
  p_attr_ig2  in varchar2 default null,
  p_attr_ig3  in varchar2 default null,
  p_attr_ig4  in varchar2 default null
) is
begin
  writeln('begin');
  plsql('ctx_ddl.create_preference',
        prename(p_pre_owner, p_pre_name),
        p_pre_obj);

  for c1 in (select pat_name, pat_value
               from dr$preference_attribute
              where pat_pre_id = p_pre_id)
  loop
    -- if there are attributes to ignore then ignore them!
    if (p_attr_ig1 is null or 
        c1.pat_name not in (p_attr_ig1, 
                            nvl(p_attr_ig2,'ZZ'),
                            nvl(p_attr_ig3,'ZZ'), 
                            nvl(p_attr_ig4,'ZZ'))) 
    then
      if (c1.pat_value is not null) then
        plsql('ctx_ddl.set_attribute',
              prename(p_pre_owner, p_pre_name),
              c1.pat_name, 
              c1.pat_value);
      end if;
    end if;
  end loop;

  writeln('end;');
  writeln('/');

  pv_new_name := p_pre_name;

end writepref;

/*-------------------------------------------------------------------------*/

procedure obspref(
  p_pre_owner in varchar2,
  p_pre_name in varchar2,
  p_reason in varchar2
)
is
begin
  if (p_pre_owner != 'CTXSYS' or
      p_pre_name not in ('MD_BINARY', 'MD_TEXT', 'DEFAULT_NULL_COMPRESSOR',
                         'AUTOB', 'WW6B', 'HTML_FILTER', 'BASIC_HTML_FILTER',
                         'DEFAULT_LOADER', 'DEFAULT_TRANSLATOR', 
			 'DEFAULT_READER'))
  then
    warn('preference '||p_pre_owner||'.'||p_pre_name||' not migrated');
    warn(p_reason);
  end if;
  pv_new_name := null;
end obspref;

/*-------------------------------------------------------------------------*/

procedure migrate_datastore(
  p_pre_id    in number,
  p_obj_id    in number,
  p_pre_owner in varchar2,
  p_pre_name  in varchar2
) is
begin
  if (p_obj_id = 1) then
    if (p_pre_owner != 'CTXSYS' or
        p_pre_name != 'DEFAULT_DIRECT_DATASTORE')
    then
      writepref(p_pre_id, p_pre_owner, p_pre_name, 'DIRECT_DATASTORE');
    else
      pv_new_name := 'DEFAULT_DATASTORE';      
    end if;

  elsif (p_obj_id = 2) then
    obspref(p_pre_owner, p_pre_name, 
            'MASTER DETAIL is obsolete -- use DETAIL_DATASTORE');

  elsif (p_obj_id = 3) then
    if (p_pre_owner != 'CTXSYS' or
        p_pre_name != 'DEFAULT_OSFILE')
    then
      writepref(p_pre_id, p_pre_owner, p_pre_name, 'FILE_DATASTORE');
    else
      pv_new_name := 'FILE_DATASTORE';
    end if;

  elsif (p_obj_id = 4) then
    if (p_pre_owner != 'CTXSYS' or
        p_pre_name != 'DEFAULT_URL')
    then
      writepref(p_pre_id, p_pre_owner, p_pre_name, 'URL_DATASTORE');
    else
      pv_new_name := 'URL_DATASTORE';
    end if;

  elsif (p_obj_id = 5) then
    writepref(p_pre_id, p_pre_owner, p_pre_name, 'DETAIL_DATASTORE',
              'DETAIL_TEXT_SIZE');
  end if;

end migrate_datastore;

/*-------------------------------------------------------------------------*/

procedure migrate_filter(
  p_pre_id    in number,
  p_obj_id    in number,
  p_pre_owner in varchar2,
  p_pre_name  in varchar2
) is
  dummy number;
begin
  if (p_obj_id = 1) then
    if (p_pre_owner != 'CTXSYS' or
        p_pre_name != 'DEFAULT_NULL_FILTER')
    then
      writepref(p_pre_id, p_pre_owner, p_pre_name, 'NULL_FILTER');
    else
      pv_new_name := 'NULL_FILTER';
    end if;

  elsif (p_obj_id = 2) then
    if (p_pre_owner != 'CTXSYS' or
        p_pre_name not in ('WW6B', 'AUTOB'))
    then
      -- check if they use EXECUTABLE
      select count(*)
        into dummy 
        from dr$preference_attribute
       where pat_pre_id = p_pre_id
         and pat_name = 'EXECUTABLE';

      if (dummy > 0) then
        obspref(p_pre_owner, p_pre_name, 
               'BLASTER FILTER with EXECUTABLE is obsolete');
      else
        writepref(p_pre_id, p_pre_owner, p_pre_name, 'INSO_FILTER', 'FORMAT');
      end if;
    else
      pv_new_name := 'INSO_FILTER';
    end if;
      
  elsif (p_obj_id = 3) then
    obspref(p_pre_owner, p_pre_name, 
            'HTML FILTER is obsolete -- use HTML_SECTION_GROUP');

  elsif (p_obj_id = 4) then
    writepref(p_pre_id, p_pre_owner, p_pre_name, 'USER_FILTER');

  end if;

end migrate_filter;

/*-------------------------------------------------------------------------*/

procedure migrate_lexer(
  p_pre_id    in number,
  p_obj_id    in number,
  p_pre_owner in varchar2,
  p_pre_name  in varchar2
) is
begin
  if (p_obj_id = 1) then
    if (p_pre_owner != 'CTXSYS' or
        p_pre_name != 'DEFAULT_LEXER')
    then
   
      -- check if SENT_PARA is set

      for c1 in (select null from dr$preference_attribute
                  where pat_pre_id = p_pre_id
                    and pat_name = 'SENT_PARA') 
      loop
        warn('sent_para cannot be migrated');
        warn('use a section group with special sections');
      end loop;

      writepref(p_pre_id, p_pre_owner, p_pre_name, 'BASIC_LEXER', 
                'SENT_PARA', 'NEWLINE');

      -- handle NEWLINE migration

      for c1 in (select pat_value from dr$preference_attribute
                  where pat_pre_id = p_pre_id
                    and pat_name = 'NEWLINE') 
      loop
        writeln('begin');

        if (c1.pat_value = '\n') then
          plsql('ctx_ddl.set_attribute',
                prename(p_pre_owner, p_pre_name),
                'NEWLINE', '1');
        else
          plsql('ctx_ddl.set_attribute',
                prename(p_pre_owner, p_pre_name),
                'NEWLINE', '2');
        end if;

        writeln('end;');
        writeln('/');
      end loop;

    else
      pv_new_name := 'DEFAULT_LEXER';
    end if;

  elsif (p_obj_id = 2) then
    if (p_pre_owner != 'CTXSYS' or
        p_pre_name not in ('VGRAM_JAPANESE',
                           'VGRAM_JAPANESE_1','VGRAM_JAPANESE_2'))
    then
      writepref(p_pre_id, p_pre_owner, p_pre_name, 'JAPANESE_VGRAM_LEXER');
    else
      pv_new_name := 'JAPANESE_LEXER';
    end if;
      
  elsif (p_obj_id = 3) then
    if (p_pre_owner != 'CTXSYS' or
        p_pre_name != 'KOREAN') 
    then
      writepref(p_pre_id, p_pre_owner, p_pre_name, 'KOREAN_LEXER');
    else
      pv_new_name := 'KOREAN_LEXER';
    end if;

  elsif (p_obj_id = 4) then
    writeln('begin');
    plsql('ctx_ddl.create_preference',
          prename(p_pre_owner, p_pre_name),
          'BASIC_LEXER');
    plsql('ctx_ddl.set_attribute',
          prename(p_pre_owner, p_pre_name),
          'INDEX_TEXT', '0');
    plsql('ctx_ddl.set_attribute',
          prename(p_pre_owner, p_pre_name),
          'INDEX_THEMES', '1');
    writeln('end;');
    writeln('/');
    pv_new_name := p_pre_name;
   
  elsif (p_obj_id = 5) then
    if (p_pre_owner != 'CTXSYS' or
        p_pre_name not in ('VGRAM_CHINESE',
                           'VGRAM_CHINESE_1','VGRAM_CHINESE_2'))
    then
      writepref(p_pre_id, p_pre_owner, p_pre_name, 'CHINESE_VGRAM_LEXER');
    else
      pv_new_name := 'CHINESE_LEXER';
    end if;

  elsif (p_obj_id = 7) then
    obspref(p_pre_owner, p_pre_name, 'NLS LEXER is obsolete');

  end if;

end migrate_lexer;

/*-------------------------------------------------------------------------*/

procedure migrate_wordlist(
  p_pre_id    in number,
  p_pre_owner in varchar2,
  p_pre_name  in varchar2
) is
begin
  if (p_pre_owner != 'CTXSYS' or
      p_pre_name not in ('VGRAM_JAPANESE_WORDLIST',
                         'KOREAN_WORDLIST',
                         'VGRAM_CHINESE_WORDLIST'))
  then
    writepref(p_pre_id, p_pre_owner, p_pre_name, 'BASIC_WORDLIST',
	      'STCLAUSE', 'INSTCLAUSE', 'SOUNDEX_AT_INDEX', 'SECTION_GROUP');
  else
    if (instr(p_pre_name, 'VGRAM_') != 0) then
      pv_new_name := substr(p_pre_name, 7);
    else
      pv_new_name := p_pre_name;
    end if;
  end if;
end migrate_wordlist;

/*-------------------------------------------------------------------------*/

procedure migrate_stoplist(
  p_pre_id    in number,
  p_pre_owner in varchar2,
  p_pre_name  in varchar2
) is
begin
  if (p_pre_owner != 'CTXSYS' or
      p_pre_name not in ('DEFAULT_STOPLIST',
                         'NO_STOPLIST'))
  then
    writeln('begin');
    plsql('ctx_ddl.create_stoplist',
          prename(p_pre_owner, p_pre_name));

    for c1 in (select pat_name, pat_value
                 from dr$preference_attribute
                where pat_pre_id = p_pre_id)
    loop
      plsql('ctx_ddl.add_stopword', 
            prename(p_pre_owner, p_pre_name),
            c1.pat_value);
    end loop;

    writeln('end;');
    writeln('/');
    pv_new_name := p_pre_name;
    
  else
    if (p_pre_name = 'DEFAULT_STOPLIST') then
      pv_new_name := 'DEFAULT_STOPLIST';
    else
      pv_new_name := 'EMPTY_STOPLIST';
    end if;
  end if;

end migrate_stoplist;

/*-------------------------------------------------------------------------*/

procedure migrate_engine(
  p_pre_id    in number,
  p_obj_id    in number,
  p_pre_owner in varchar2,
  p_pre_name  in varchar2
) is

  i_tablespace varchar2(500);
  i_storage    varchar2(500);
  i_other      varchar2(500);
  i_clause     varchar2(500);

  k_tablespace varchar2(500);
  k_storage    varchar2(500);
  k_other      varchar2(500);
  k_clause     varchar2(500);

  x_tablespace varchar2(500);
  x_storage    varchar2(500);
  x_other      varchar2(500);
  x_clause     varchar2(500);

  n_tablespace varchar2(500);
  n_storage    varchar2(500);
  n_other      varchar2(500);
  n_clause     varchar2(500);

begin
  if (p_obj_id = 2) then
    obspref(p_pre_owner, p_pre_name, 'ENGINE NOP is obsolete');
    return;
  end if;

  if (p_pre_owner != 'CTXSYS' or
      p_pre_name  != 'DEFAULT_INDEX')
  then
    for c1 in (select pat_name, pat_value
                 from dr$preference_attribute
                where pat_pre_id = p_pre_id)
    loop
      if (c1.pat_name = 'I1I_TABLESPACE') then
        x_tablespace := 'tablespace ' || c1.pat_value;
      elsif (c1.pat_name = 'I1I_STORAGE') then
        x_storage := ' storage (' || c1.pat_value||')';
      elsif (c1.pat_name = 'I1I_OTHER_PARMS') then
        x_other := c1.pat_value;
      elsif (c1.pat_name = 'I1T_TABLESPACE') then
        i_tablespace := ' tablespace ' || c1.pat_value;
      elsif (c1.pat_name = 'I1T_STORAGE') then
        i_storage := ' storage (' || c1.pat_value||')';
      elsif (c1.pat_name = 'I1T_OTHER_PARMS') then
        i_other := c1.pat_value;
      elsif (c1.pat_name = 'KTB_TABLESPACE') then
        k_tablespace := ' tablespace ' || c1.pat_value;
      elsif (c1.pat_name = 'KTB_STORAGE') then
        k_storage := ' storage (' || c1.pat_value||')';
      elsif (c1.pat_name = 'KTB_OTHER_PARMS') then
        k_other := c1.pat_value;
      elsif (c1.pat_name = 'LST_TABLESPACE') then
        n_tablespace := ' tablespace ' || c1.pat_value;
      elsif (c1.pat_name = 'LST_STORAGE') then
        n_storage := ' storage (' || c1.pat_value ||')';
      elsif (c1.pat_name = 'LST_OTHER_PARMS') then
        n_other := c1.pat_value;
      end if;
    end loop;

    x_clause := x_tablespace || x_storage || x_other;
    i_clause := i_tablespace || i_storage || i_other;
    n_clause := n_tablespace || n_storage || n_other;
    k_clause := k_tablespace || k_storage || k_other;

    writeln('begin');

    plsql('ctx_ddl.create_preference',
          prename(p_pre_owner, p_pre_name), 'BASIC_STORAGE');

    if (i_clause is not null) then
      plsql('ctx_ddl.set_attribute',
            'I_TABLE_CLAUSE',
            prename(p_pre_owner, p_pre_name),
	    i_clause);
    end if;

    if (k_clause is not null) then
      plsql('ctx_ddl.set_attribute',
            'K_TABLE_CLAUSE',
            prename(p_pre_owner, p_pre_name),
            k_clause);
    end if;

    if (n_clause is not null) then
      plsql('ctx_ddl.set_attribute',
            'N_TABLE_CLAUSE',
            prename(p_pre_owner, p_pre_name),
            n_clause);
    end if;

    if (x_clause is not null) then
      plsql('ctx_ddl.set_attribute',
            'I_INDEX_CLAUSE',
            prename(p_pre_owner, p_pre_name),
            x_clause);
    end if;
            
    writeln('end;');
    writeln('/');
    pv_new_name := p_pre_name;
    
  else
    pv_new_name := 'DEFAULT_STORAGE';
  end if;
end migrate_engine;


/*-------------------------------------------------------------------------*/

procedure migrate_system_prefs is
  jl boolean := false;
  cl boolean := false;
begin
  writeln('begin');
  writeln('null;');
  
  for c1 in (select unique(pre_name) pre_name
               from dr$preference_usage, dr$preference, dr$policy
              where pol_tablename != 'TEMPLATE_POLICY'
                and pus_pol_id = pol_id
                and pus_pre_id = pre_id
                and pre_name in ('VGRAM_JAPANESE',
                                 'VGRAM_JAPANESE_1',
                                 'VGRAM_JAPANESE_2',
                                 'VGRAM_CHINESE',
                                 'VGRAM_CHINESE_1',
                                 'VGRAM_CHINESE_2',
                                 'KOREAN',
                                 'KOREAN_WORDLIST')
                and pre_owner = 'CTXSYS')
  loop
    if (c1.pre_name like 'VGRAM_J%') then
      if (c1.pre_name like '%WORDLIST') then
        -- vgram_japanese_wordlist -> japanese_wordlist
        plsql('ctx_ddl.create_preference',
              'CTXSYS.JAPANESE_WORDLIST',
              'BASIC_WORDLIST');
        plsql('ctx_ddl.set_attribute',
              'CTXSYS.JAPANESE_WORDLIST',
              'STEMMER', 'NULL');
        plsql('ctx_ddl.set_attribute',
              'CTXSYS.JAPANESE_WORDLIST',
              'FUZZY_MATCH', 'JAPANESE_VGRAM');
      else
        if (not jl) then
          -- vgram_japanese, 1, 2 -> japanese_lexer
          plsql('ctx_ddl.create_preference',
                'CTXSYS.JAPANESE_LEXER',
                'JAPANESE_VGRAM_LEXER');
          jl := true;
        end if;
      end if;
    elsif (c1.pre_name like 'VGRAM_C%') then
      if (c1.pre_name like '%WORDLIST') then
        -- vgram_chinese_wordlist -> chinese_wordlist
        plsql('ctx_ddl.create_preference',
              'CTXSYS.CHINESE_WORDLIST',
              'BASIC_WORDLIST');
        plsql('ctx_ddl.set_attribute',
              'CTXSYS.CHINESE_WORDLIST',
              'STEMMER', 'NULL');
        plsql('ctx_ddl.set_attribute',
              'CTXSYS.CHINESE_WORDLIST',
              'FUZZY_MATCH', 'CHINESE_VGRAM');
      else
        if (not cl) then
          -- vgram_chinese, vgram_chinese_1, vgram_chinese_2 -> chinese_lexer
          plsql('ctx_ddl.create_preference',
                'CTXSYS.CHINESE_LEXER',
                'CHINESE_VGRAM_LEXER');
          cl := true;
        end if;
      end if;
    elsif (c1.pre_name = 'KOREAN') then
      -- korean -> korean_lexer
      plsql('ctx_ddl.create_preference',
            'CTXSYS.KOREAN_LEXER',
            'KOREAN_LEXER');
    else
      -- korean_wordlist -> korean_wordlist
        plsql('ctx_ddl.create_preference',
              'CTXSYS.KOREAN_WORDLIST',
              'BASIC_WORDLIST');
        plsql('ctx_ddl.set_attribute',
              'CTXSYS.KOREAN_WORDLIST',
              'STEMMER', 'NULL');
        plsql('ctx_ddl.set_attribute',
              'CTXSYS.KOREAN_WORDLIST',
              'FUZZY_MATCH', 'KOREAN');
    end if;
  end loop;

  writeln('end;');
  writeln('/');

end migrate_system_prefs;

/*-------------------------------------------------------------------------*/

procedure migrate_prefs is
begin

  -- bug 801446: migrate certain system-defined preferences 
  -- if used in non-template policies

  migrate_system_prefs;

  for c1 in (select pre_id, pre_owner, pre_name,
                    pre_cla_id, pre_obj_id
               from dr$preference
              order by pre_owner, pre_cla_id, pre_obj_id)
  loop
    pv_new_name := null;

    if (c1.pre_cla_id = 1) then
      migrate_datastore(c1.pre_id, c1.pre_obj_id, c1.pre_owner, c1.pre_name);
    elsif (c1.pre_cla_id = 2)  then
      obspref(c1.pre_owner, c1.pre_name, 'COMPRESSOR class is obsolete');
    elsif (c1.pre_cla_id = 3)  then
      migrate_filter(c1.pre_id, c1.pre_obj_id, c1.pre_owner, c1.pre_name);
    elsif (c1.pre_cla_id = 4)  then
      migrate_lexer(c1.pre_id, c1.pre_obj_id, c1.pre_owner, c1.pre_name);
    elsif (c1.pre_cla_id = 5)  then
      migrate_wordlist(c1.pre_id, c1.pre_owner, c1.pre_name);
    elsif (c1.pre_cla_id = 6)  then 
      migrate_stoplist(c1.pre_id, c1.pre_owner, c1.pre_name);
    elsif (c1.pre_cla_id = 7)  then 
      migrate_engine(c1.pre_id, c1.pre_obj_id, c1.pre_owner, c1.pre_name);
    elsif (c1.pre_cla_id = 8)  then 
      obspref(c1.pre_owner, c1.pre_name, 'LOAD ENGINE class is obsolete');
    elsif (c1.pre_cla_id = 9)  then
      obspref(c1.pre_owner, c1.pre_name, 'TRANSLATOR class is obsolete');
    elsif (c1.pre_cla_id = 10) then 
      obspref(c1.pre_owner, c1.pre_name, 'READER class is obsolete');
    end if;

    writeln;

    update dr$mpref set mp_new = pv_new_name
     where mp_pre_owner = c1.pre_owner
       and mp_pre_name = c1.pre_name;

    commit;

  end loop;

end migrate_prefs;

/*-------------------------------------------------------------------------*/

procedure migrate_thes is
begin
  for c1 in (select ths_name from dr$ths order by ths_name) loop
    warn('use ctxload -thesdump to migrate thesaurus '||c1.ths_name);
    writeln;
  end loop;
end migrate_thes;

/*-------------------------------------------------------------------------*/

procedure migrate_section_groups is
  error boolean := FALSE;
  l_start varchar2(60);
  l_end varchar2(60);
begin

  delete from dr$msec;
  commit;
  insert into dr$msec 
    select sgrp_owner, sgrp_name, null
      from dr$section_groups;
  commit;

  for c1 in (select sgrp_id, sgrp_owner, sgrp_name
               from dr$section_groups
              order by sgrp_owner, sgrp_name)
  loop

    -- analyze sections to make sure they are ML-like

    for c2 in (select sec_start_tag, sec_end_tag
                 from dr$sections
                where sec_sgrp_id = c1.sgrp_id)
    loop

      if (c2.sec_start_tag like '<%>') then
        l_start := rtrim(ltrim(c2.sec_start_tag, '<'),'>');
      else
        error := true;
        goto elbl;
      end if;

      if (c2.sec_end_tag is not null) then
        if (c2.sec_end_tag like '<%>') then
          l_end := rtrim(ltrim(c2.sec_end_tag, '<'),'>');
          if (upper(l_end) != '/'||upper(l_start)) then
            error := true;
            goto elbl;
          end if;
        else
          error := true;
          goto elbl;
        end if;
      end if;

      <<elbl>>
      if (error) then
        warn('section group '||c1.sgrp_owner||'.'||c1.sgrp_name||
             ' not migrated');
        warn('section tags are not in ML-format');
        exit;
      end if;

    end loop;

    if (error) then 
      goto next; 
    end if;

    -- okay, section group is in ML format

    if (c1.sgrp_owner = 'CTXSYS' and c1.sgrp_name = 'BASIC_HTML_SECTION') then

      writeln('begin');

      plsql('ctx_ddl.create_section_group',
            prename(c1.sgrp_owner, c1.sgrp_name),
            'HTML_SECTION_GROUP');

    else

      comment('Change to HTML_SECTION_GROUP if indexing HTML documents');  

      writeln;
      writeln('begin');

      plsql('ctx_ddl.create_section_group',
            prename(c1.sgrp_owner, c1.sgrp_name),
            'BASIC_SECTION_GROUP');

    end if;

    for c2 in (select sec_name, sec_start_tag, sec_end_tag
                 from dr$sections
                where sec_sgrp_id = c1.sgrp_id)
    loop
      l_start := upper(rtrim(ltrim(c2.sec_start_tag, '<'),'>'));
      plsql('ctx_ddl.add_zone_section',
            prename(c1.sgrp_owner, c1.sgrp_name),
            c2.sec_name,
            l_start);
    end loop;

    writeln('end;');
    writeln('/');

    update dr$msec set ms_new = ms_sg_name
     where ms_sg_owner = c1.sgrp_owner
       and ms_sg_name = c1.sgrp_name;

    <<next>>
    null;

    writeln('');

  end loop;

end migrate_section_groups;

/*-------------------------------------------------------------------------*/

procedure migrate_sqes is
begin
  for c1 in (select pol_owner, query_name, query_text
               from dr$sqe sqe, dr$policy pol
              where sqe.pol_id = pol.pol_id
                and session_id = 'SYSTEM'
              order by pol_owner, query_name)
  loop
    warn('SQEs are no longer associated with policies');
    warn('ensure that this name does not conflict with other SQEs');

    writeln('begin');
    plsql('ctx_query.store_sqe',prename(c1.pol_owner, c1.query_name),
          c1.query_text);
    writeln('end;');
    writeln('/');

  end loop;
end migrate_sqes;

/*-------------------------------------------------------------------------*/

procedure migrate_policies is
  l_status varchar2(11);
  l_dummy  number;
  warning  boolean;
  l_dstore   varchar2(70);
  l_filter   varchar2(70);
  l_lexer    varchar2(70);
  l_wordlist varchar2(70);
  l_stoplist varchar2(70);
  l_storage  varchar2(70);
  l_secgrp   varchar2(70);
  l_newname  varchar2(70);
  l_prename  varchar2(70);
begin 
  for c1 in (select pol_id, pol_owner, pol_name, pol_tablename,
                    pol_text_expr
               from dr$policy
              order by pol_owner, pol_name)
  loop

    warning := FALSE;
    l_dstore   := null;
    l_filter   := null;
    l_lexer    := null;
    l_wordlist := null;
    l_stoplist := null;
    l_storage  := null;
    l_secgrp   := null;

    -- check for template policies

    if (c1.pol_tablename = 'TEMPLATE_POLICY') then
      if (c1.pol_owner != 'CTXSYS' or
          c1.pol_name not in ('DEFAULT_POLICY', 'TEMPLATE_WW6B', 
                              'TEMPLATE_DIRECT', 'TEMPLATE_MD',
                              'TEMPLATE_MD_BIN', 'TEMPLATE_AUTOB',
                              'TEMPLATE_LONGTEXT_STOPLIST_OFF',
                              'TEMPLATE_LONGTEXT_STOPLIST_ON',
                              'TEMPLATE_BASIC_WEB'))
      then
        warn('policy '||c1.pol_owner||'.'||c1.pol_name||' not migrated');
        warn('template policies are no longer supported');
        warning := TRUE;
      else
        goto next;
      end if;
      goto more_checks;
    end if;
    
    -- check for non-indexed policies

    begin
      select txi_status 
        into l_status 
        from dr$text_index
       where txi_pol_id = c1.pol_id;
    exception
      when no_data_found then
        l_status := 'NO_INDEX';
    end;

    if (l_status = 'NO_INDEX') then
        if (not warning) then
          warn('policy '||c1.pol_owner||'.'||c1.pol_name||' not migrated');
        end if;
        warn('non-indexed policies are no longer supported');
        warning := TRUE;
    end if;

    -- check for policy on view

    select count(*) 
      into l_dummy
      from dba_tables 
     where owner = c1.pol_owner
       and table_name = c1.pol_tablename;

    if (l_dummy < 1) then
      if (not warning) then
        warn('policy '||c1.pol_owner||'.'||c1.pol_name||' not migrated');
      end if;
      warn('indexes on views are no longer supported');
      warning := TRUE;
    end if;      

<<more_checks>>
      
    -- check for multiple policy on same column

    select count(*)
      into l_dummy
      from dr$policy
     where pol_owner = c1.pol_owner
       and pol_tablename = c1.pol_tablename
       and pol_text_expr = c1.pol_text_expr
       and pol_name != c1.pol_name;

    if (l_dummy > 0) then
      if (not warning) then
        warn('policy '||c1.pol_owner||'.'||c1.pol_name||' not migrated');
      end if;
      warn('multiple policies on a single column no longer supported');
      warning := TRUE;
    end if;    

    -- now check preferences of the policy

    for c2 in (select pre_id, pre_cla_id, pre_owner, pre_name
                 from dr$preference, dr$preference_usage
                where pus_pre_id = pre_id
                  and pus_pol_id = c1.pol_id
                  and pre_cla_id != 2)
    loop
      select mp_new
        into l_newname
        from dr$mpref
       where mp_pre_owner = c2.pre_owner
         and mp_pre_name = c2.pre_name;

      if (l_newname) is null then
        if (not warning) then
          warn('policy '||c1.pol_owner||'.'||c1.pol_name||' not migrated');
        end if;
        warn('depends on non-migrated preference '||
             c2.pre_owner||'.'||c2.pre_name);
        warning := TRUE;
        l_newname := c2.pre_name;
      end if;

      if (c2.pre_cla_id = 1) then
        l_dstore := prename(c2.pre_owner,l_newname);
      elsif (c2.pre_cla_id = 3)  then
        l_filter := prename(c2.pre_owner,l_newname);
      elsif (c2.pre_cla_id = 4)  then
        l_lexer := prename(c2.pre_owner,l_newname);
      elsif (c2.pre_cla_id = 5)  then
        l_wordlist := prename(c2.pre_owner,l_newname);

        begin
          select pat_value into l_secgrp
            from dr$preference_attribute
           where pat_pre_id = c2.pre_id
             and pat_name = 'SECTION_GROUP';
          
          for c3 in (select ms_sg_owner, ms_sg_name, ms_new
                       from dr$msec
                      where ms_sg_owner||'.'||ms_sg_name = l_secgrp)
          loop
            if (c3.ms_new is null) then
              if (not warning) then
              warn('policy '||c1.pol_owner||'.'||c1.pol_name||' not migrated');
              end if;
              warn('depends on non-migrated section group '||
                    c2.pre_owner||'.'||c2.pre_name);
              warning := TRUE;
            else
              l_secgrp := prename(c3.ms_sg_owner, c3.ms_new);
            end if;
            exit;
          end loop;

        exception
          when no_data_found then null;
        end;

      elsif (c2.pre_cla_id = 6)  then 
        l_stoplist := prename(c2.pre_owner,l_newname);
      elsif (c2.pre_cla_id = 7)  then 
        l_storage := prename(c2.pre_owner,l_newname);
      end if;

    end loop;

    -- now dump policy

    writeln;

    if (warning) then
      comment('create index "'||c1.pol_owner||'"."'||c1.pol_name||'"');
      comment('on "'||c1.pol_owner||'"."'||c1.pol_tablename||'"("'||
              c1.pol_text_expr||'")');
      comment('indextype is context');
      comment('parameters (''datastore '||l_dstore);
      comment('filter '||l_filter);
      comment('lexer '||l_lexer);
      comment('wordlist '||l_wordlist);
      comment('stoplist '||l_stoplist);
      if (l_secgrp is not null) then
        comment('section group '||l_secgrp);
      end if;
      comment('storage '||l_storage||''');'); 
    else
      writeln('create index "'||c1.pol_owner||'"."'||c1.pol_name||'"');
      writeln('on "'||c1.pol_owner||'"."'||c1.pol_tablename||'"("'||
              c1.pol_text_expr||'")');
      writeln('indextype is context');
      writeln('parameters (''datastore '||l_dstore);
      writeln('filter '||l_filter);
      writeln('lexer '||l_lexer);
      writeln('wordlist '||l_wordlist);
      writeln('stoplist '||l_stoplist);
      if (l_secgrp is not null) then
        writeln('section group '||l_secgrp);
      end if;
      writeln('storage '||l_storage||''');'); 
    end if;
  
    writeln;

    <<next>>
    null;

  end loop;

end migrate_policies;

/*-------------------------------------------------------------------------*/

procedure migrate is
begin

  -- start with clean preference migration table

  delete from dr$mpref;
  commit;
  insert into dr$mpref 
    select pre_owner, pre_name, null
      from dr$preference;
  commit;
 
  migrate_thes;
  migrate_prefs;
  migrate_section_groups;
  migrate_sqes;
  migrate_policies;

end migrate;

/*-------------------------------------------------------------------------*/

begin
  lineno := 0;
end dr_migrate;
/

OHA YOOOO