/****************************************************************************
  module      : vkb66
  author      : JuergenA
  responsible : UweH
  special area: Logging
  see also    :
  description : KB_change_key
 .nf
 
    ========== licence begin  GPL
    Copyright (c) 2001-2005 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
.fo
 
 
*****************************************************************************/
 
.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);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              KB_transaction : VKB53;
 
        PROCEDURE
              k53eot_excl_lock (
                    VAR t             : tgg00_TransContext;
                    VAR TreeId        : tgg00_FileId;
                    VAR k             : tgg00_Lkey;
                    forInsert         : boolean;
                    WantedMode        : tgg00_LockReqMode;
                    VAR GrantedMode   : tgg00_LockReqMode);
 
      ------------------------------ 
 
        FROM
              KB_file_table_handling : VKB64;
 
        PROCEDURE
              k64drop_tree (
                    VAR t         : tgg00_TransContext;
                    VAR file_id   : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              KB_CreateDropFile_interface : VKB641;
 
        PROCEDURE
              kb641SuccFileVersion (
                    VAR TransContext   : tgg00_TransContext;
                    VAR FileId         : tgg00_FileId;
                    VAR NewFileVersion : tgg91_FileVersion;
                    OldLongCnt         : tsp00_Int4;
                    NewLongCnt         : tsp00_Int4);
 
      ------------------------------ 
 
        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);
 
        PROCEDURE
              kb661ReassignSecondaryFile (
                    VAR transContext             : tgg00_TransContext;
                    VAR secondaryFileSurrogate   : tgg00_Surrogate;
                    VAR fromPrimaryFileSurrogate : tgg00_Surrogate;
                    VAR toPrimaryFileSurrogate   : tgg00_Surrogate);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_1 : VBD01;
 
        PROCEDURE
              b01filestate (
                    VAR t         : tgg00_TransContext;
                    VAR file_id   : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              FileDir_Wrapper : vbd998;
 
        PROCEDURE
              bd998GetTableBlobColCount (
                    VAR transContext   : tgg00_TransContext;
                    VAR tableSurrogate : tgg00_Surrogate;
                    VAR blobColCount   : tsp00_Int4;
                    VAR bErr           : tgg00_BasisError);
 
        PROCEDURE
              bd998DropTableIndexes (
                    VAR trans          : tgg00_TransContext;
                    VAR tableSurrogate : tgg00_Surrogate);
 
      ------------------------------ 
 
        FROM
              Select_Help_Procedures : VGG04;
 
        PROCEDURE
              g04index_tree_build (
                    VAR file_id    : tgg00_FileId (*ptocConst*);
                    VAR index_tree : tgg00_FileId;
                    index_no       : tsp00_Int2);
 
        PROCEDURE
              g04short_col_tree_build (
                    VAR table_surrogate : tgg00_Surrogate (*ptocConst*);
                    VAR short_col_tree  : tgg00_FileId;
                    VAR b_err           : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG101;
 
        PROCEDURE
              SAPDB_PascalOverlappingMove (
                    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
              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);
 
      ------------------------------ 
 
        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_uni_to_ascii  = 128;
      c_ascii_to_uni  = 129;
 
 
(*------------------------------*) 
 
PROCEDURE
      k66modify_table (VAR m : tgg00_MessBlock);
 
CONST
      c_sharedFile = TRUE;
 
VAR
      dummy_granted  : tgg00_LockReqMode;
      data_pos       : tsp00_Int4;
      old_stack_off  : tsp00_Int4;
      blob_col_count : tsp00_Int4;
      b_err          : tgg00_BasisError;
      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,
      false, lckSysExcl_egg00, dummy_granted);
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    SAPDB_PascalMove ('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,
          false, 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);
    SAPDB_PascalMove ('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;
    kb66reassign_short_scol_id (m, source_id)
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    kb66reassign_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
    bd998DropTableIndexes (m.mb_trns^, source_id.fileTabId_gg00);
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN (* PTS 1133274 M.Ki. *)
    bd998GetTableBlobColCount (m.mb_trns^, source_id.fileTabId_gg00,
          blob_col_count, b_err);
    IF  b_err = e_ok
    THEN
        BEGIN
        IF  blob_col_count > 0
        THEN
            (* change long column count to 0 to avoid dropping all existing *)
            (* longs during drop (file version is kept at same number as    *)
            (* it doesn't matter any more)                                  *)
            kb641SuccFileVersion (
                  m.mb_trns^,
                  source_id,
                  source_id.fileVersion_gg00,
                  blob_col_count,
                  0);
        (*ENDIF*) 
        IF  m.mb_trns^.trError_gg00 = e_ok
        THEN
            k64drop_tree (m.mb_trns^, source_id);
        (*ENDIF*) 
        END
    ELSE
        m.mb_trns^.trError_gg00 := b_err;
    (*ENDIF*) 
    END;
(*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
      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;
 
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
            SAPDB_PascalOverlappingMove ('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 [ c_uni_to_ascii]) AND
            ( tar_col_pos + (src_col_len-1) DIV 2 > MAX_RECLEN_GG00))
            OR
            ((map_info in [ c_ascii_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_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);
                END;
            (*ENDCASE*) 
            IF  rc <> uni_ok
            THEN
                e := e_const_incompatible_with_typ
            ELSE
                moved_len := moved_len + 1
            (*ENDIF*) 
            END
        (*ENDIF*) 
    (*ENDIF*) 
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb66reassign_indexes (
            VAR m               : tgg00_MessBlock;
            VAR source_id       : tgg00_FileId;
            VAR target_id       : tgg00_FileId);
 
VAR
      col            : integer;
      indexNo        : integer;
      old_index_id   : tgg00_FileId;
 
BEGIN
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
    indexNo := ord(m.mb_st^[col].ecol_tab [1]);
    g04index_tree_build (source_id, old_index_id, indexNo);
    kb661ReassignSecondaryFile (
          m.mb_trns^,
          old_index_id.fileTabId_gg00,
          source_id.fileTabId_gg00,
          target_id.fileTabId_gg00);
    col := col + 1
    END;
(*ENDWHILE*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb66reassign_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;
g04short_col_tree_build (source_id.fileTabId_gg00, src_short_scol_id,
      m.mb_trns^.trError_gg00);
src_short_scol_id.fileBdUse_gg00 := [ ];
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    tar_short_scol_id                := m.mb_qual^.mtree;
    tar_short_scol_id.fileRoot_gg00  := NIL_PAGE_NO_GG00;
    tar_short_scol_id.fileVersion_gg00.ci2_gg00 := cgg_dummy_file_version;
    tar_short_scol_id.fileTfn_gg00   := tfnShortScol_egg00;
    tar_short_scol_id.fileBdUse_gg00 := [ ];
    b01filestate (m.mb_trns^, src_short_scol_id);
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    kb661ReassignSecondaryFile (
          m.mb_trns^,
          src_short_scol_id.fileTabId_gg00,
          source_id.fileTabId_gg00,
          m.mb_qual^.mtree.fileTabId_gg00)
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 
