/****************************************************************************
  module      : vkb66
  author      : JuergenA
  responsible : UweH
  special area: Logging
  see also    :
  description : KB_change_key
 
    ========== licence begin  GPL
    Copyright (c) 2001-2004 SAP AG
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end
 
*****************************************************************************/
 
.tt 1 $SAP$LiveCache$VKB66$
.tt 3 $UweH$KB_change_key$2000-11-28$
 
Module  : KB_change_key
 
Define  :
 
        PROCEDURE
              k66modify_table (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k66move_and_map (
                    map_info       : integer;
                    VAR source_buf : tsp00_Buf;
                    src_col_pos    : integer;
                    src_col_len    : integer;
                    VAR target_buf : tsp00_Buf;
                    tar_col_pos    : integer;
                    VAR moved_len  : tsp00_Int4;
                    VAR e          : tgg00_BasisError);
 
        PROCEDURE
              k66pre_fetch (
                    VAR t         : tgg00_TransContext;
                    VAR tree_id   : tgg00_FileId;
                    pno           : tsp00_PageNo);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              KB_transaction : VKB53;
 
        PROCEDURE
              k53eot_excl_lock (
                    VAR t             : tgg00_TransContext;
                    VAR tree_id       : tgg00_FileId;
                    VAR k             : tgg00_Lkey;
                    wanted_mode       : tgg00_LockReqMode;
                    VAR granted_mode  : tgg00_LockReqMode);
 
      ------------------------------ 
 
        FROM
              KB_file_table_handling : VKB64;
 
        PROCEDURE
              k64drop_tree (
                    VAR t         : tgg00_TransContext;
                    VAR file_id   : tgg00_FileId;
                    with_str_cols : boolean);
 
        PROCEDURE
              k64rename_bd_file (
                    VAR t         : tgg00_TransContext;
                    VAR source_id : tgg00_FileId;
                    VAR target_id : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              KB_ModifyTable_interface : VKB661;
 
        PROCEDURE
              kb661ModifyTable (
                    VAR TransContext     : tgg00_TransContext;
                    VAR SourceFileId     : tgg00_FileId;
                    VAR IndexFileId      : tgg00_FileId;
                    VAR DestinFileId     : tgg00_FileId;
                    StackListEntries     : tsp00_Int4;
                    SourceStackList      : tgg00_StackListPtr;
                    DestinStackList      : tgg00_StackListPtr;
                    IsSorted             : boolean;
                    TruncCheckPos        : tsp00_Int4;
                    TruncCheckCnt        : tsp00_Int4;
                    VAR ResultSampleInfo : tgg00_SampleInfo);
 
      ------------------------------ 
 
        FROM
              KB_sender_receiver : vkb90;
 
        PROCEDURE
              k90send (
                    VAR mblock       : tgg00_MessBlock;
                    VAR remote_trans : tgg00_TransChild);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_1 : VBD01;
 
        PROCEDURE
              b01filestate (
                    VAR t         : tgg00_TransContext;
                    VAR file_id   : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        PROCEDURE
              g01mblock_init (
                    VAR source_trans : tgg00_TransContext;
                    mess_type  : tgg00_MessType;
                    mess2_type : tgg00_MessType2;
                    VAR mblock : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              Codetransformation_and_Coding : VGG02;
 
        VAR
              g02codetables : tgg04_CodeTables;
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG101;
 
        PROCEDURE
              SAPDB_PascalMove (
                    mod_id     : tsp00_C6;
                    mod_num    : tsp00_Int4;
                    source_upb : tsp00_Int4;
                    destin_upb : tsp00_Int4;
                    source     : tsp00_MoveObjPtr;
                    source_pos : tsp00_Int4;
                    destin     : tsp00_MoveObjPtr;
                    destin_pos : tsp00_Int4;
                    length     : tsp00_Int4;
                    VAR err    : tgg00_BasisError);
 
        PROCEDURE
              g10mv (
                    mod_id      : tsp00_C6;            
                    mod_num     : tsp00_Int4;
                    source_upb  : tsp00_Int4;          
                    dest_upb    : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;       
                    src_pos     : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;       
                    dest_pos    : tsp00_Int4;
                    length      : tsp00_Int4;
                    VAR e       : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-30 : VSP30;
 
        PROCEDURE
              s30map (
                    VAR code_t   : tsp00_Ctable;
                    VAR source   : tsp00_Buf;
                    spos         : tsp00_Int4;
                    VAR dest     : tsp00_Buf;
                    dpos         : tsp00_Int4;
                    length       : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-80 : VSP80;
 
        PROCEDURE
              s80uni_trans
                    (src_ptr        : tsp00_MoveObjPtr;
                    src_len         : tsp00_Int4;
                    src_codeset     : tsp00_Int2;
                    dest_ptr        : tsp00_MoveObjPtr;
                    VAR dest_len    : tsp00_Int4;
                    dest_codeset    : tsp00_Int2;
                    trans_options   : tsp8_uni_opt_set;
                    VAR rc          : tsp8_uni_error;
                    VAR err_char_no : tsp00_Int4);
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01treeid (
                    debug      : tgg00_Debug;
                    nam        : tsp00_Sname;
                    VAR treeid : tgg00_FileId);
&       endif
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        FUNCTION
              s30map;
 
              tsp00_MoveObj tsp00_Buf
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : JuergenP / ThomasA
.sp
.cp 3
Created : 1993-06-01
.sp
.cp 3
.sp
.cp 3
Release :      Date : 2000-11-28
.sp
***********************************************************
.sp
.cp 8
.fo
.oc _/1
Specification:
 
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
 
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 8
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 15
.nf
.oc _/1
.CM -lll-
Code    :
 
 
CONST
      c_with_str_cols = true;
      c_uni_to_ascii  = 128;
      c_ascii_to_uni  = 129;
      c_uni_to_ebcdic = 130;
      c_ebcdic_to_uni = 131;
 
 
(*------------------------------*) 
 
PROCEDURE
      k66modify_table (VAR m : tgg00_MessBlock);
 
VAR
      dummy_granted  : tgg00_LockReqMode;
      data_pos       : tsp00_Int4;
      old_stack_off  : tsp00_Int4;
      source_st_addr : tgg00_StackListPtr;
      source_id      : tgg00_FileId;
      index_id       : tgg00_FileId;
      dummy_key      : tgg00_Lkey;
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
source_st_addr          := NIL;
k53eot_excl_lock (m.mb_trns^, m.mb_qual^.mtree, dummy_key,
      lckSysExcl_egg00, dummy_granted);
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    g10mv ('VKB66 ',   1,
          m.mb_data_size, sizeof (source_id),
          @m.mb_data^.mbp_4kbuf, 1, @source_id, 1, sizeof (source_id),
          m.mb_trns^.trError_gg00);
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    k53eot_excl_lock (m.mb_trns^, source_id, dummy_key,
          lckSysExcl_egg00, dummy_granted);
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    data_pos := sizeof (source_id) + 3;
    source_st_addr := @m.mb_st^ [m.mb_qual^.mresqual_pos];
    old_stack_off  := (m.mb_qual^.mresqual_pos - 1) *
          sizeof (tgg00_StackEntry);
    g10mv ('VKB66 ',   2,
          m.mb_data_size, sizeof (index_id),
          @m.mb_data^.mbp_4kbuf, data_pos, @index_id,
          1, sizeof(index_id), m.mb_trns^.trError_gg00)
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
&   ifdef trace
    t01treeid (bi, 'index_id    ', index_id);
&   endif
    m.mb_data_len := m.mb_data_len  - FILE_ID_MXGG00;
    kb66rename_short_scol_id (m, source_id)
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    kb66rename_indexes (m, source_id, m.mb_qual^.mtree);
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    kb661ModifyTable (
          m.mb_trns^,
          source_id,              (* SourceFileId     *)
          index_id,               (* IndexFileId      *)
          m.mb_qual^.mtree,       (* DestinFileId     *)
          m.mb_qual^.mcol_cnt,    (* StackListEntries *)
          source_st_addr,         (* SourceStackList  *)
          m.mb_st,                (* DestinStackList  *)
          m.mb_type2 <> mm_key,   (* IsSorted         *)
          m.mb_qual^.mqual_pos,   (* TruncCheckPos    *)
          m.mb_qual^.mqual_cnt,   (* TruncCheckCnt    *)
          m.mb_data^.mbp_sample); (* ResultSampleInfo *)
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    k64drop_tree (m.mb_trns^, source_id, NOT c_with_str_cols);
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    m.mb_type     := m_return_result;
    m.mb_type2    := mm_nil;
    m.mb_struct   := mbs_stat_info;
    m.mb_qual_len := 0;
    m.mb_data_len := sizeof (tsp00_Buf)
    END
ELSE
    BEGIN
    m.mb_type  := m_return_error;
    m.mb_type2 := mm_nil;
    IF  m.mb_trns^.trError_gg00 <> e_wait_for_lock_release
    THEN
        BEGIN
        m.mb_qual_len := 0;
        m.mb_data_len := 0
        END
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k66pre_fetch (
            VAR t         : tgg00_TransContext;
            VAR tree_id   : tgg00_FileId;
            pno           : tsp00_PageNo);
 
TYPE
 
      tprefetch_qual = RECORD
            treeid : tgg00_FileId;
            pno    : tsp00_PageNo;
      END;
 
 
VAR
      mblock        : tgg00_MessBlock;
      TransPtr      : tgg00_UnivTransPtr;
      child_trans   : tgg00_TransChild;
      prefetch_qual : tprefetch_qual;
 
BEGIN
IF  pno <> NIL_PAGE_NO_GG00
THEN
    BEGIN
    TransPtr    := @t;
    child_trans := TransPtr^.utrChild;
    g01mblock_init (t, m_get, mm_read, mblock);
    mblock.mb_struct     := mbs_buf;
    prefetch_qual.treeid := tree_id;
    prefetch_qual.pno    := pno;
    mblock.mb_qual       := @prefetch_qual;
    mblock.mb_qual_size  := sizeof (prefetch_qual);
    mblock.mb_qual_len   := sizeof (prefetch_qual);
    mblock.mb_reply      := false;
    k90send (mblock, child_trans);
    IF  t.trError_gg00 = e_too_many_net_requests
    THEN
        t.trError_gg00 := e_ok
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k66move_and_map (
            map_info       : integer;
            VAR source_buf : tsp00_Buf;
            src_col_pos    : integer;
            src_col_len    : integer;
            VAR target_buf : tsp00_Buf;
            tar_col_pos    : integer;
            VAR moved_len  : tsp00_Int4;
            VAR e          : tgg00_BasisError);
 
VAR
      rc          : tsp8_uni_error;
      err_char_no : tsp00_Int4;
      aux_buf     : tsp00_Buf;
 
BEGIN
IF  src_col_len = 0
THEN
    BEGIN
    target_buf[tar_col_pos] := csp_undef_byte;
    moved_len               := 1
    END
ELSE
    IF  (map_info = 0) OR (source_buf[src_col_pos] = csp_undef_byte)
    THEN
        BEGIN
        IF  tar_col_pos + src_col_len - 1 > MAX_RECLEN_GG00
        THEN
            e := e_too_long_record
        ELSE
            BEGIN
            g10mv ('VKB66 ',   3,
                  sizeof (source_buf), sizeof  (target_buf),
                  @source_buf, src_col_pos, @target_buf, tar_col_pos,
                  src_col_len, e);
            moved_len := src_col_len
            END
        (*ENDIF*) 
        END
    ELSE
        IF  map_info in [cgg04_to_ascii, cgg04_to_ebcdic]
        THEN
            IF  tar_col_pos + src_col_len - 1 > MAX_RECLEN_GG00
            THEN
                e := e_too_long_record
            ELSE
                BEGIN
                s30map (g02codetables.tables[map_info],
                      source_buf, src_col_pos,
                      target_buf, tar_col_pos, src_col_len);
                moved_len := src_col_len
                END
            (*ENDIF*) 
        ELSE
            IF  ((map_info in [ c_uni_to_ascii, c_uni_to_ebcdic ]) AND
                ( tar_col_pos + (src_col_len-1) DIV 2 > MAX_RECLEN_GG00))
                OR
                ((map_info in [ c_ascii_to_uni, c_ebcdic_to_uni ]) AND
                ( tar_col_pos + (src_col_len-1) * 2 > MAX_RECLEN_GG00))
            THEN
                e := e_too_long_record
            ELSE
                BEGIN
                rc        := uni_ok;
                moved_len := sizeof (target_buf) - tar_col_pos;
                target_buf[tar_col_pos] := csp_unicode_def_byte;
                CASE map_info OF
                    c_uni_to_ascii :
                        BEGIN
                        target_buf[tar_col_pos] := csp_ascii_blank;
                        s80uni_trans (@source_buf[src_col_pos + 1], src_col_len - 1,
                              csp_unicode,
                              @target_buf[tar_col_pos+1], moved_len, csp_ascii,
                              [], rc, err_char_no);
                        END;
                    c_uni_to_ebcdic :
                        BEGIN
                        target_buf[tar_col_pos] := csp_ebcdic_blank;
                        s80uni_trans (@source_buf[src_col_pos + 1], src_col_len - 1,
                              csp_unicode,
                              @target_buf[tar_col_pos+1], moved_len, csp_ascii,
                              [], rc, err_char_no);
                        target_buf[tar_col_pos] := csp_ebcdic_blank;
                        s30map (g02codetables.tables[cgg04_to_ebcdic],
                              target_buf, tar_col_pos + 1,
                              target_buf, tar_col_pos + 1, moved_len)
                        END;
                    c_ascii_to_uni :
                        s80uni_trans (@source_buf[src_col_pos + 1], src_col_len - 1,
                              csp_ascii,
                              @target_buf[tar_col_pos+1], moved_len,
                              csp_unicode, [], rc, err_char_no);
                    c_ebcdic_to_uni :
                        BEGIN
                        s30map (g02codetables.tables[cgg04_to_ascii],
                              source_buf, src_col_pos + 1,
                              aux_buf, 1, src_col_len - 1);
                        s80uni_trans (@aux_buf[1], src_col_len - 1, csp_ascii,
                              @target_buf[tar_col_pos+1], moved_len,
                              csp_unicode, [], rc, err_char_no)
                        END;
                    END;
                (*ENDCASE*) 
                IF  rc <> uni_ok
                THEN
                    e := e_const_incompatible_with_typ
                ELSE
                    moved_len := moved_len + 1
                (*ENDIF*) 
                END
            (*ENDIF*) 
        (*ENDIF*) 
    (*ENDIF*) 
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb66rename_indexes (
            VAR m               : tgg00_MessBlock;
            VAR source_id       : tgg00_FileId;
            VAR target_id       : tgg00_FileId);
 
VAR
      col            : integer;
      old_index_id   : tgg00_FileId;
      new_index_id   : tgg00_FileId;
 
BEGIN
old_index_id                := source_id;
old_index_id.fileTfn_gg00   := tfnMulti_egg00;
old_index_id.fileVersion_gg00.ci2_gg00 := cgg_dummy_file_version;
old_index_id.fileRoot_gg00  := NIL_PAGE_NO_GG00;
old_index_id.fileBdUse_gg00 := [];
new_index_id                := old_index_id;
new_index_id.fileTabId_gg00 := target_id.fileTabId_gg00;
col := m.mb_qual^.mmult_pos;
WHILE (col < m.mb_qual^.mmult_pos + m.mb_qual^.mmult_cnt) AND
      (m.mb_trns^.trError_gg00 = e_ok) DO
    BEGIN
    old_index_id.fileTfnNo_gg00 [1] := m.mb_st^[col].ecol_tab [1];
    new_index_id.fileTfnNo_gg00 [1] := old_index_id.fileTfnNo_gg00 [1];
    k64rename_bd_file (m.mb_trns^, old_index_id, new_index_id);
    col := col + 1
    END;
(*ENDWHILE*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb66rename_short_scol_id (
            VAR m         : tgg00_MessBlock;
            VAR source_id : tgg00_FileId);
 
VAR
      src_short_scol_id : tgg00_FileId;
      tar_short_scol_id : tgg00_FileId;
 
BEGIN
m.mb_trns^.trError_gg00          := e_ok;
src_short_scol_id                := source_id;
tar_short_scol_id                := m.mb_qual^.mtree;
src_short_scol_id.fileRoot_gg00  := NIL_PAGE_NO_GG00;
tar_short_scol_id.fileRoot_gg00  := NIL_PAGE_NO_GG00;
src_short_scol_id.fileVersion_gg00.ci2_gg00 := cgg_dummy_file_version;
tar_short_scol_id.fileVersion_gg00.ci2_gg00 := cgg_dummy_file_version;
src_short_scol_id.fileTfn_gg00   := tfnShortScol_egg00;
tar_short_scol_id.fileTfn_gg00   := tfnShortScol_egg00;
src_short_scol_id.fileBdUse_gg00 := [ ];
tar_short_scol_id.fileBdUse_gg00 := [ ];
b01filestate (m.mb_trns^, src_short_scol_id);
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    k64rename_bd_file (m.mb_trns^, src_short_scol_id, tar_short_scol_id)
ELSE
    IF  m.mb_trns^.trError_gg00 = e_file_not_found
    THEN
        m.mb_trns^.trError_gg00 := e_ok
    (*ENDIF*) 
(*ENDIF*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
