.nf
 
 
    ========== licence begin  GPL
    Copyright (C) 2000 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
*****************************************************
Copyright by SAP AG, 1999
SAP Database Technology
 
Release :      Date : 2000-01-25
*****************************************************
modname : VAK542
changed : 2000-01-25
module  : DML_Help_Procedures
 
Author  : ElkeZ
Created : 1985-02-06
Pretty  : 2002-12-13
*****************************************************
 
Purpose : Module for help procedures that cannot be assigned to
          any of the DML commands
 
Define  :
 
        PROCEDURE
              a542add_intern_file (
                    VAR acv         : tak_all_command_glob;
                    VAR tableid     : tgg_surrogate;
                    VAR owner       : tgg_surrogate;
                    correlated_view : boolean;
                    sqlmode         : tsp_sqlmode;
                    ptr             : tak_sysbufferaddress);
 
        PROCEDURE
              a542char_to_packet (
                    VAR acv : tak_all_command_glob;
                    c       : char);
 
        FUNCTION
              a542cmplex_view_stored (
                    VAR acv     : tak_all_command_glob;
                    VAR view_id : tgg_surrogate) : boolean;
 
        FUNCTION
              a542GetAndRemovePacket (VAR acv : tak_all_command_glob) : tsp_moveobj_ptr;
 
        PROCEDURE
              a542fill_packet (
                    VAR acv  : tak_all_command_glob;
                    pos      : tsp_int4;
                    len      : tsp_int4;
                    fillchar : char);
 
        PROCEDURE
              a542move_to_packet (
                    VAR acv    : tak_all_command_glob;
                    const_addr : tsp_moveobj_ptr;
                    const_len  : tsp_int4);
 
        PROCEDURE
              a542identifier_to_packet (
                    VAR acv        : tak_all_command_glob;
                    VAR identifier : tsp_knl_identifier);
 
        PROCEDURE
              a542internal_packet (
                    VAR acv                 : tak_all_command_glob;
                    release_internal_packet : boolean;
                    required_len            : tsp_int4);
 
        FUNCTION
              a542initial_cmd_segm (VAR acv : tak_all_command_glob) : tsp1_segment_ptr;
 
        FUNCTION
              a542initial_mess_code(VAR acv : tak_all_command_glob) : tsp_code_type;
 
        PROCEDURE
              a542next_intern_sql_cmd (
                    VAR acv        : tak_all_command_glob;
                    release_packet : boolean;
                    VAR tree    : tgg00_FileId;
                    VAR key_int : tsp_int2);
 
        PROCEDURE
              a542change_intern_sql_cmd (
                    VAR acv  : tak_all_command_glob;
                    VAR tree : tgg00_FileId;
                    key_int  : tsp_int2);
 
        PROCEDURE
              a542pop_packet (VAR acv : tak_all_command_glob);
 
        PROCEDURE
              a542push_packet (
                    VAR acv : tak_all_command_glob;
                    pPacket : tsp_moveobj_ptr);
 
        PROCEDURE
              a542release_packet (
                    VAR acv  : tak_all_command_glob;
                    segm_ptr : tsp1_segment_ptr);
 
        PROCEDURE
              a542reset_packet (VAR acv : tak_all_command_glob);
 
        PROCEDURE
              a542store_current_command (
                    VAR acv     : tak_all_command_glob;
                    VAR tree    : tgg00_FileId;
                    VAR key_int : tsp_int2);
 
        PROCEDURE
              a542get_abapinfo (
                    VAR acv         : tak_all_command_glob;
                    VAR abapname    : tsp_c40;
                    VAR abapnamelen : integer;
                    VAR abaplinenr  : tsp_number);
 
.CM *-END-* define --------------------------------------
***********************************************************
 
Use     :
 
        FROM
              Scanner : VAK01;
 
        VAR
              a01nil_part_desc     : tsp1_part_header;
              a01char_size         : integer;
              a01kw                : tak_keywordtab;
 
        FUNCTION
              a01is_whitespace_char (
                    VAR m    : tsp_moveobj;
                    pos      : tsp_int4) : boolean;
 
        FUNCTION
              a01aligned_cmd_len (len : tsp_int4) : tsp_int4;
 
        FUNCTION
              a01equal_char (
                    VAR m    : tsp_moveobj;
                    pos      : tsp_int4;
                    cmp_char : char) : boolean;
 
      ------------------------------ 
 
        FROM
              AK_semantic_scanner_tools : VAK05;
 
        PROCEDURE
              a05put_identifier (
                    VAR id      : tsp_knl_identifier;
                    VAR moveobj : tsp_moveobj;
                    moveobj_size: tsp_int4;
                    VAR pos     : tsp_int4;
                    VAR retcode : tsp_int2);
 
      ------------------------------ 
 
        FROM
              AK_universal_semantic_tools : VAK06;
 
        PROCEDURE
              a06determine_username (
                    VAR acv       : tak_all_command_glob;
                    VAR userid    : tgg_surrogate;
                    VAR user_name : tsp_knl_identifier);
 
        PROCEDURE
              a06inc_linkage (VAR linkage : tsp_c2);
 
      ------------------------------ 
 
        FROM
              AK_error_handling : VAK07;
 
        PROCEDURE
              a07_b_put_error (
                    VAR acv : tak_all_command_glob;
                    b_err   : tgg_basis_error;
                    err_code : tsp_int4);
 
        PROCEDURE
              a07_hex_uni_error (
                    VAR acv     : tak_all_command_glob;
                    uni_err     : tsp8_uni_error;
                    err_code    : tsp_int4;
                    to_unicode  : boolean;
                    bytestr     : tsp_moveobj_ptr;
                    len         : tsp_int4 );
 
      ------------------------------ 
 
        FROM
              Systeminfo_cache : VAK10;
 
        PROCEDURE
              a10new_packet (
                    VAR acv : tak_all_command_glob;
                    size    : tsp_int4;
                    VAR ptr : tsp_moveobj_ptr);
 
        PROCEDURE
              a10dispose (
                    VAR acv : tak_all_command_glob;
                    VAR p : tsp_moveobj_ptr);
 
        PROCEDURE
              a10get_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg_sysinfokey;
                    dstate       : tak_directory_state;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              AK_Connect : VAK51;
 
        PROCEDURE
              a51switch_user (
                    VAR acv            : tak_all_command_glob;
                    VAR new_user_name  : tsp_knl_identifier;
                    VAR curr_user_name : tsp_knl_identifier);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_1 : VBD01;
 
        PROCEDURE
              b01tcreate_file (
                    VAR t       : tgg00_TransContext;
                    VAR current : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_2 : VBD07;
 
        PROCEDURE
              b07cadd_record (
                    VAR t       : tgg00_TransContext;
                    VAR current : tgg00_FileId;
                    VAR b       : tgg00_Rec);
 
        PROCEDURE
              b07cget_record (
                    VAR t       : tgg00_TransContext;
                    VAR current : tgg00_FileId;
                    VAR rk      : tgg00_Lkey;
                    VAR b       : tgg00_Rec);
 
        PROCEDURE
              b07crepl_record (
                    VAR t       : tgg00_TransContext;
                    VAR file_id : tgg00_FileId;
                    VAR b       : tgg00_Rec);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01code           : tgg_code_globals;
              g01unicode        : boolean;
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG10;
 
        PROCEDURE
              g10mv   (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size1          : tsp_int4;
                    size2          : tsp_int4;
                    VAR val1       : tsp_moveobj;
                    p1             : tsp_int4;
                    VAR val2       : tsp_moveobj;
                    p2             : tsp_int4;
                    cnt            : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv1  (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size1          : tsp_int4;
                    size2          : tsp_int4;
                    VAR val1       : tgg_surrogate;
                    p1             : tsp_int4;
                    VAR val2       : tsp_moveobj;
                    p2             : tsp_int4;
                    cnt            : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv9  (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size1          : tsp_int4;
                    size2          : tsp_int4;
                    VAR val1       : tsp_moveobj;
                    p1             : tsp_int4;
                    VAR val2       : tsp1_segment;
                    p2             : tsp_int4;
                    cnt            : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv10 (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size1          : tsp_int4;
                    size2          : tsp_int4;
                    VAR val1       : tsp1_segment;
                    p1             : tsp_int4;
                    VAR val2       : tsp_moveobj;
                    p2             : tsp_int4;
                    cnt            : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv11 (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size1          : tsp_int4;
                    size2          : tsp_int4;
                    VAR val1       : tsp1_part;
                    p1             : tsp_int4;
                    VAR val2       : tsp_moveobj;
                    p2             : tsp_int4;
                    cnt            : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv12 (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size1          : tsp_int4;
                    size2          : tsp_int4;
                    VAR val1       : tgg_surrogate;
                    p1             : tsp_int4;
                    VAR val2       : tsp_buf;
                    p2             : tsp_int4;
                    cnt            : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv13 (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size1          : tsp_int4;
                    size2          : tsp_int4;
                    VAR val1       : tak_viewtext;
                    p1             : tsp_int4;
                    VAR val2       : tsp_buf;
                    p2             : tsp_int4;
                    cnt            : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv17 (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size1          : tsp_int4;
                    size2          : tsp_int4;
                    VAR val1       : tsp_moveobj;
                    p1             : tsp_int4;
                    VAR val2       : tgg_surrogate;
                    p2             : tsp_int4;
                    cnt            : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv21 (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size1          : tsp_int4;
                    size2          : tsp_int4;
                    VAR source     : tsp_moveobj;
                    source_pos     : tsp_int4;
                    VAR destin     : tsp_c40;
                    destin_pos     : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10fil  (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size           : tsp_int4;
                    VAR m          : tsp_moveobj;
                    pos            : tsp_int4;
                    len            : tsp_int4;
                    fillchar       : char;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10filuni (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size           : tsp_int4;
                    VAR m          : tsp_moveobj;
                    pos            : tsp_int4;
                    len            : tsp_int4;
                    filluchar      : tsp_c2;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10filuni1 (
                    mod_id         : tsp_c6;
                    mod_intern_num : tsp_int4;
                    size           : tsp_int4;
                    VAR m          : tsp_c40;
                    pos            : tsp_int4;
                    len            : tsp_int4;
                    filluchar      : tsp_c2;
                    VAR e          : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-20 : VSP20;
 
        PROCEDURE
              s20ch4   (
                    val      : tsp_int4;
                    VAR dest : tsp_buf;
                    di       : tsp_int4);
 
        PROCEDURE
              s20ch4a  (
                    val      : tsp_int4;
                    VAR dest : tsp_key;
                    di       : tsp_int4);
 
        PROCEDURE
              s20ch4l  (
                    val      : tsp_int4;
                    VAR dest : tsp_moveobj;
                    di       : tsp_int4);
 
        FUNCTION
              s20or4a (
                    VAR source    : tsp_moveobj;
                    source_pos    : tsp_int4) : tsp_int4;
 
      ------------------------------ 
 
        FROM
              Packet_handling : VSP26;
 
        FUNCTION
              s26partlen (VAR part : tsp1_part) : tsp_int4;
 
        PROCEDURE
              s26find_part (
                    VAR segm         : tsp1_segment;
                    part_kind        : tsp1_part_kind;
                    VAR part_ptr     : tsp1_part_ptr);
 
        PROCEDURE
              s26nextpart (VAR part_ptr : tsp1_part_ptr);
 
      ------------------------------ 
 
        FROM
              PUTSTRING-Conversions : VSP43;
 
        PROCEDURE
              s43pstr  (
                    VAR dbuf   : tsp_number;
                    dpos       : tsp_int4;
                    datalen    : integer;
                    datafrac   : integer;
                    VAR source : tsp_moveobj;
                    spos       : tsp_int4;
                    slen       : integer;
                    VAR err    : tsp_num_error);
 
        PROCEDURE
              s43pstr1  (
                    VAR dbuf   : tsp_number;
                    dpos       : tsp_int4;
                    datalen    : integer;
                    datafrac   : integer;
                    VAR source : tsp_c10;
                    spos       : tsp_int4;
                    slen       : integer;
                    VAR err    : tsp_num_error);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-80: VSP80;
 
        PROCEDURE
              s80uni_trans
                    (src_ptr        : tsp_moveobj_ptr;
                    src_len         : tsp_int4;
                    src_codeset     : tsp_int2;
                    dest_ptr        : tsp_moveobj_ptr;
                    VAR dest_len    : tsp_int4;
                    dest_codeset    : tsp_int2;
                    trans_options   : tsp8_uni_opt_set;
                    VAR rc          : tsp8_uni_error;
                    VAR err_char_no : tsp_int4);
&       IFDEF TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01int4 (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname;
                    int      : tsp00_Int4);
 
        PROCEDURE
              t01moveobj (
                    level     : tgg00_Debug;
                    VAR buf   : tsp00_MoveObj;
                    pos_start : tsp00_Int4;
                    pos_end   : tsp00_Int4);
 
        PROCEDURE
              t01segment (
                    debug       : tgg00_Debug;
                    VAR segm    : tsp1_segment);
&       ENDIF
 
.CM *-END-* use -----------------------------------------
***********************************************************
 
Synonym :
 
        PROCEDURE
              a10dispose;
 
              tak_sysbufferaddress tsp_moveobj_ptr
 
        PROCEDURE
              g10mv1;
 
              tsp_moveobj tgg_surrogate
 
        PROCEDURE
              g10mv9;
 
              tsp_moveobj tsp1_segment
 
        PROCEDURE
              g10mv10;
 
              tsp_moveobj tsp1_segment
 
        PROCEDURE
              g10mv11;
 
              tsp_moveobj tsp1_part
 
        PROCEDURE
              g10mv12;
 
              tsp_moveobj tgg_surrogate
              tsp_moveobj tsp_buf
 
        PROCEDURE
              g10mv13;
 
              tsp_moveobj tak_viewtext
              tsp_moveobj tsp_buf
 
        PROCEDURE
              g10mv17;
 
              tsp_moveobj tgg_surrogate
 
        PROCEDURE
              g10mv21;
 
              tsp_moveobj tsp_c40
 
        PROCEDURE
              g10filuni1;
 
              tsp_moveobj tsp_c40
 
        PROCEDURE
              s20ch4;
 
              tsp_moveobj tsp_buf
 
        PROCEDURE
              s20ch4a;
 
              tsp_moveobj tsp_key
 
        PROCEDURE
              s43pstr;
 
              tsp_moveobj tsp_number
 
        PROCEDURE
              s43pstr1;
 
              tsp_moveobj  tsp_number
              tsp_moveobj  tsp_c10
 
.CM *-END-* synonym -------------------------------------
***********************************************************
 
Specification:
 
A54_SUBQUERY: Generation of information records for
subqueries in updates and deletes, of
the updates and deletes themselves and,
if appropriate, execution of subqueries and modifications
 
.CM *-END-* specification -------------------------------
***********************************************************
.CM -lll-
Code    :
 
 
CONST
      intern_keylen     = 4;
      c_user_pos        = cgg_rec_key_offset + intern_keylen + 1;
      c_sum_pos         = c_user_pos + mxgg_surrogate;
      c_sqlmode_pos     = c_sum_pos         + 1;
      c_prepare_pos     = c_sqlmode_pos     + 1;
      c_datetime_pos    = c_prepare_pos     + 1;
      c_trunc_pos       = c_datetime_pos    + 1;
      c_cmd_or_segm_pos = c_trunc_pos       + 1;
      c_length_pos      = c_cmd_or_segm_pos + 1;
      c_cmd             =  0;
      c_segm            =  1;
      c_trans_from_uni  =  false;  (* a07_hex_uni_err *)
      c_unicode_wid     =  2;      (* a07_hex_uni_err *)
 
TYPE
 
      tak542packet_context = RECORD
            ct_in_packet        : tsp1_packet_ptr;
            ct_cmd_segm         : tsp1_segment_ptr;
            ct_data_part        : tsp1_part_ptr;
            ct_cmd_part         : tsp1_part_ptr;
            ct_data_ptr         : tsp_moveobj_ptr;
            ct_cmd_length       : tsp_int4;
            ct_data_len         : tsp_int4;
            ct_packet           : tsp1_packet;
      END;
 
      tak542packet_ct_ptr = ^tak542packet_context;
 
 
(*------------------------------*) 
 
PROCEDURE
      a542add_intern_file (
            VAR acv         : tak_all_command_glob;
            VAR tableid     : tgg_surrogate;
            VAR owner       : tgg_surrogate;
            correlated_view : boolean;
            sqlmode         : tsp_sqlmode;
            ptr             : tak_sysbufferaddress);
 
VAR
      b_err      : tgg_basis_error;
      get_next   : boolean;
      next_exist : boolean;
      next_outbuf: boolean;
      i2c2       : tsp_int_map_c2;
      buf_index  : integer;
      bpos       : integer;
      cnt        : integer;
      move_len   : integer;
      vpos       : integer;
      cmd_length : tsp_int4;
      viewtkey   : tgg_sysinfokey;
      buf        : ARRAY[1..2] OF tgg_rec_buf;
 
BEGIN
b_err := e_ok;
IF  acv.a_max_intern_select = 0
THEN
    BEGIN
    b01tcreate_file (acv.a_transinf.tri_trans, acv.a_intern_cmd_tree);
    b_err := acv.a_transinf.tri_trans.trError_gg00
    END;
(*ENDIF*) 
IF  b_err = e_ok
THEN
    BEGIN
    buf[1].keylen := mxgg_surrogate;
    g10mv12 ('VAK542',   1,    
          sizeof(tableid), sizeof(buf[1].buf),
          tableid, 1, buf[1].buf,
          cgg_rec_key_offset + 1, sizeof(tableid),
          acv.a_return_segm^.sp1r_returncode);
    i2c2.map_int                    := acv.a_max_intern_select + 1;
    buf[1].info[mxgg_surrogate + 1] := i2c2.map_c2[ 1 ];
    buf[1].info[mxgg_surrogate + 2] := i2c2.map_c2[ 2 ];
    i2c2.map_int               := cak_is_undefined;
    buf[1].info[mxgg_surrogate + 3] := i2c2.map_c2[ 1 ];
    buf[1].info[mxgg_surrogate + 4] := i2c2.map_c2[ 2 ];
    buf[1].len := cgg_rec_key_offset + mxgg_surrogate + 4;
    buf[1].recVarcolOffset_gg00 := 0;
    buf[1].recVarcolCnt_gg00    := 0;
    b07cadd_record (acv.a_transinf.tri_trans,
          acv.a_intern_cmd_tree, buf[1]);
    b_err := acv.a_transinf.tri_trans.trError_gg00
    END;
(*ENDIF*) 
IF  b_err = e_ok
THEN
    BEGIN
    acv.a_max_intern_select := succ(acv.a_max_intern_select);
    viewtkey                := ptr^.syskey;
    s20ch4 (acv.a_max_intern_select, buf[1].buf, cgg_rec_key_offset+1);
    s20ch4 (acv.a_max_intern_select, buf[2].buf, cgg_rec_key_offset+1);
    WITH ptr^.sviewtext DO
        vpos := vtselect_pos - (vttabcount * mxak_vttabdef);
    (*ENDWITH*) 
    g10mv12 ('VAK542',   2,    
          sizeof(owner), sizeof(buf[1].buf), owner, 1, buf[1].buf,
          c_user_pos, sizeof(owner),
          acv.a_return_segm^.sp1r_returncode);
    buf[1].buf[c_sum_pos     ]    := chr(ord(correlated_view));
    buf[1].buf[c_sqlmode_pos ]    := chr(ord(sqlmode));
    buf[1].buf[c_prepare_pos ]    := chr(ord(false));
    buf[1].buf[c_trunc_pos   ]    := chr(ord(false));
    buf[1].buf[c_cmd_or_segm_pos] := chr(c_cmd);
    bpos                          := c_length_pos + 4;
    buf[1].keylen                 := intern_keylen;
    buf[1].len                    := bpos - 1;
    buf[2].recVarcolOffset_gg00   := 0;
    buf[2].recVarcolCnt_gg00      := 0;
    get_next                      := false;
    cnt                           := 0;
    buf_index                     := 1;
    cmd_length                    := 0;
    REPEAT
        IF  get_next
        THEN
            BEGIN
            a06inc_linkage (viewtkey.slinkage);
            a10get_sysinfo (acv, viewtkey, d_release, ptr, b_err);
            vpos := 1;
            END;
        (*ENDIF*) 
        IF  b_err = e_ok
        THEN
            WITH ptr^.sviewtext DO
                BEGIN
                IF  viewtkey.slinkage = cak_init_linkage
                THEN
                    (* PTS 1112472 E.Z. *)
                    IF  vtcontext MOD 10 = ord(dtf_was_ansi_now_is_same_as_iso)
                    THEN
                        buf[1].buf[c_datetime_pos] :=
                              chr(ord(dtf_iso))
                    ELSE
                        buf[1].buf[c_datetime_pos] :=
                              chr(vtcontext MOD 10);
                    (*ENDIF*) 
                (*ENDIF*) 
                IF  vttextlength - vpos <= mxgg_record - bpos
                THEN
                    move_len := vttextlength - vpos + 1
                ELSE
                    move_len := mxgg_record - bpos + 1;
                (*ENDIF*) 
                g10mv13 ('VAK542',   3,    
                      sizeof(vttbuf), sizeof(buf[buf_index].buf),
                      vttbuf, vpos + (vttabcount * mxak_vttabdef),
                      buf[buf_index].buf, bpos, move_len,
                      acv.a_return_segm^.sp1r_returncode);
                b_err := acv.a_return_segm^.sp1r_returncode;
                bpos       := bpos + move_len;
                vpos       := vpos + move_len;
                cmd_length := cmd_length + move_len;
                next_exist := (vpos <= vttextlength) OR
                      vtnextexist;
                buf[buf_index].len := buf[buf_index].len + move_len;
                (* PTS 1120916 E.Z. *)
                next_outbuf := false;
                IF  (b_err = e_ok)
                    AND
                    (buf_index <> 1)
                    AND
                    ((bpos > mxgg_record) OR NOT (next_exist))
                THEN
                    BEGIN
                    b07cadd_record (acv.a_transinf.tri_trans,
                          acv.a_intern_cmd_tree, buf[buf_index]);
                    b_err      := acv.a_transinf.tri_trans.trError_gg00;
                    next_outbuf := true;
                    END
                ELSE
                    IF  (buf_index = 1) AND (bpos > mxgg_record)
                    THEN
                        next_outbuf := true;
                    (*ENDIF*) 
                (*ENDIF*) 
                IF  next_outbuf
                THEN
                    BEGIN
                    buf_index := 2;
                    buf[2].keylen := intern_keylen + 1;
                    bpos          := cgg_rec_key_offset + buf[2].keylen + 1;
                    buf[2].len    := bpos - 1;
                    cnt           := succ(cnt);
                    buf[2].buf[ cgg_rec_key_offset + buf[2].keylen ] :=
                          chr(cnt);
                    END;
                (*ENDIF*) 
                get_next := (vtnextexist) AND (vpos > vttextlength);
                END;
              (*ENDWITH*) 
        (*ENDIF*) 
    UNTIL
        (b_err <> e_ok) OR NOT (next_exist);
    (*ENDREPEAT*) 
    IF  b_err = e_ok
    THEN
        BEGIN
        s20ch4 (cmd_length, buf[1].buf, c_length_pos);
        b07cadd_record (acv.a_transinf.tri_trans,
              acv.a_intern_cmd_tree, buf[1]);
        b_err := acv.a_transinf.tri_trans.trError_gg00
        END;
    (*ENDIF*) 
    END
ELSE
    IF  b_err = e_duplicate_key
    THEN
        b_err := e_ok;
    (*ENDIF*) 
(*ENDIF*) 
IF  b_err <> e_ok
THEN
    a07_b_put_error (acv, b_err, 1);
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542char_to_packet (
            VAR acv : tak_all_command_glob;
            c : char);
 
VAR
      aux : tsp_c1;
 
BEGIN
aux[1] := c;
a542move_to_packet (acv, @aux[1], 1)
END;
 
(*------------------------------*) 
 
FUNCTION
      a542cmplex_view_stored (
            VAR acv     : tak_all_command_glob;
            VAR view_id : tgg_surrogate) : boolean;
 
VAR
 
      k : RECORD
            CASE boolean OF
                true :
                    (dummy   : tsp_int2;
                    klen     : tsp_int2;
                    vcol_off : tsp_int2;
                    vcol_cnt : tsp_int2;
                    tabid    : tgg_surrogate);
                false :
                    (lk : tgg_lkey);
                END;
            (*ENDCASE*) 
 
      rec_buf : tgg_rec_buf;
 
BEGIN
IF  acv.a_max_intern_select = 0
THEN
    a542cmplex_view_stored := false
ELSE
    BEGIN
    k.klen := mxgg_surrogate;
    k.tabid := view_id;
    b07cget_record (acv.a_transinf.tri_trans,
          acv.a_intern_cmd_tree, k.lk, rec_buf);
    a542cmplex_view_stored :=
          acv.a_transinf.tri_trans.trError_gg00 = e_ok
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542fill_packet (
            VAR acv : tak_all_command_glob;
            pos : tsp_int4;
            len : tsp_int4;
            fillchar : char);
 
VAR
      unicode_char : tsp_c2;
 
BEGIN
WITH acv DO
    IF  g01unicode
    THEN
        BEGIN
        unicode_char[1] := csp_unicode_mark;
        unicode_char[2] := fillchar;
        g10filuni ('VAK542',   4,    
              a_cmd_part^.sp1p_buf_size, a_cmd_part^.sp1p_buf,
              pos, len, unicode_char,
              a_return_segm^.sp1r_returncode)
        END
    ELSE
        g10fil ('VAK542',   5,    
              a_cmd_part^.sp1p_buf_size, a_cmd_part^.sp1p_buf,
              pos, len, fillchar,
              a_return_segm^.sp1r_returncode)
    (*ENDIF*) 
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542identifier_to_packet (
            VAR acv        : tak_all_command_glob;
            VAR identifier : tsp_knl_identifier);
 
BEGIN
WITH acv, a_cmd_part^ DO
    BEGIN
    sp1p_buf_len := sp1p_buf_len + 1;
    a05put_identifier (identifier, sp1p_buf,
          sp1p_buf_size, sp1p_buf_len,
          acv.a_return_segm^.sp1r_returncode);
    sp1p_buf_len := sp1p_buf_len - 1
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542move_to_packet (
            VAR acv    : tak_all_command_glob;
            const_addr : tsp_moveobj_ptr;
            const_len  : tsp_int4);
 
VAR
      err_char_no : tsp_int4;
      uni_err     : tsp8_uni_error;
      curr_len    : tsp_int4;
 
BEGIN
WITH acv DO
    BEGIN
    IF  g01unicode
    THEN
        BEGIN
        curr_len := a_cmd_part^.sp1p_buf_size -
              a_cmd_part^.sp1p_buf_len;
        s80uni_trans (const_addr, const_len, csp_ascii,
              @a_cmd_part^.sp1p_buf[a_cmd_part^.sp1p_buf_len + 1],
              curr_len, csp_unicode, [ ],
              uni_err, err_char_no);
        IF  uni_err <> uni_ok
        THEN
            a07_hex_uni_error (acv, uni_err,
                  err_char_no, c_trans_from_uni,
                  @const_addr^[err_char_no],
                  c_unicode_wid)
        ELSE
            a_cmd_part^.sp1p_buf_len :=
                  a_cmd_part^.sp1p_buf_len + curr_len
        (*ENDIF*) 
        END
    ELSE
        IF  a_cmd_part^.sp1p_buf_len + const_len <=
            a_cmd_part^.sp1p_buf_size
        THEN
            BEGIN
            g10mv ('VAK542',   6,    
                  const_len, a_cmd_part^.sp1p_buf_size,
                  const_addr^, 1, a_cmd_part^.sp1p_buf,
                  a_cmd_part^.sp1p_buf_len + 1, const_len,
                  a_return_segm^.sp1r_returncode);
            a_cmd_part^.sp1p_buf_len :=
                  a_cmd_part^.sp1p_buf_len + const_len
            END
        ELSE
            a07_b_put_error (acv, e_too_small_packet_size, 1)
        (*ENDIF*) 
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542internal_packet (
            VAR acv                 : tak_all_command_glob;
            release_internal_packet : boolean;
            required_len            : tsp_int4);
 
VAR
      aligned_len          : tsp_int4;
      intern_cmdsegm_len   : tsp_int4;
      init_mess_type       : tsp1_cmd_mess_type;
      init_sqlmode         : tsp1_sqlmode;
      init_command_options : tsp1_command_options;
 
      ptr : RECORD
            CASE boolean OF
                true :
                    (ct_ptr : tak542packet_ct_ptr);
                false :
                    (moveobj_ptr : tsp_moveobj_ptr);
                END;
            (*ENDCASE*) 
 
 
BEGIN
init_mess_type       := acv.a_cmd_segm^.sp1c_mess_type;
init_sqlmode         := acv.a_cmd_segm^.sp1c_sqlmode;
init_command_options := acv.a_cmd_segm^.sp1c_command_options;
IF  release_internal_packet AND
    (acv.a_cmd_segm^.sp1c_producer = sp1pr_kernel)
THEN
    a542reset_packet (acv);
(*ENDIF*) 
aligned_len := a01aligned_cmd_len (required_len);
intern_cmdsegm_len := aligned_len + sizeof (tsp1_part_header)
      + sizeof (tsp1_segment_header);
IF  acv.a_cmd_stack.cst_top < cak_max_cmd_stack
THEN
    a10new_packet (acv,
          sizeof (tak542packet_context) - sizeof (tsp_moveobj) +
          intern_cmdsegm_len, ptr.moveobj_ptr)
ELSE
    ptr.moveobj_ptr := NIL;
(*ENDIF*) 
IF  ptr.moveobj_ptr <> NIL
THEN
    BEGIN
    WITH acv, ptr.ct_ptr^, a_cmd_stack DO
        BEGIN
        cst_top             := cst_top + 1;
        cst_stack[cst_top]  := ptr.moveobj_ptr;
        ct_in_packet        := a_in_packet;
        ct_cmd_segm         := a_cmd_segm;
        ct_data_part        := a_data_part;
        ct_cmd_part         := a_cmd_part;
        ct_cmd_length       := a_cmd_part^.sp1p_buf_len;
        ct_data_ptr         := a_data_ptr;
        ct_data_len         := a_data_length;
        a_in_packet         := @ct_packet;
        WITH a_in_packet^.sp1_header DO
            BEGIN
            IF  g01unicode
            THEN
                sp1h_mess_code := csp_unicode
            ELSE
                sp1h_mess_code := g01code.ctype;
            (*ENDIF*) 
            sp1h_no_of_segm    := 1;
            sp1h_varpart_size  := intern_cmdsegm_len;
            sp1h_mess_swap     := g01code.kernel_swap
            END;
        (*ENDWITH*) 
        a_cmd_segm := @ct_packet.sp1_segm;
        WITH a_cmd_segm^ DO
            BEGIN
            sp1s_segm_kind          := sp1sk_cmd;
            sp1s_segm_offset        := 0;
            sp1s_segm_len           := intern_cmdsegm_len;
            sp1s_no_of_parts        := 1;
            sp1s_own_index          := cst_top;
            sp1c_mess_type          := init_mess_type;
            sp1c_commit_immediately := false;
            sp1c_with_info          := false;
            sp1c_sqlmode            := init_sqlmode;
            sp1c_producer           := sp1pr_kernel;
            sp1c_ignore_costwarning := true;
            sp1c_prepare            := false;
            sp1c_mass_cmd           := false;
            sp1c_parsing_again      := false;
            sp1c_command_options    := init_command_options;
            END;
        (*ENDWITH*) 
        a_cmd_segm^.sp1p_part_header := a01nil_part_desc;
        WITH a_cmd_segm^.sp1p_part_header DO
            BEGIN
            sp1p_buf_len   := required_len;
            sp1p_buf_size  := aligned_len;
            sp1p_part_kind := sp1pk_command;
            sp1p_arg_count := 1
            END;
        (*ENDWITH*) 
        a_data_part        := NIL;
        a_data_ptr         := NIL;
        a_cmd_part         := @ct_packet.sp1_segm.sp1p_part_header;
        a542fill_packet (acv, 1, required_len, bsp_c1);
        a_cmd_part^.sp1p_buf_len     := 0;
        END;
    (*ENDWITH*) 
    END
ELSE
    a07_b_put_error (acv, e_no_more_memory, 1)
(*ENDIF*) 
END;
 
  (* PTS 1119569 E.Z. *)
(*------------------------------*) 
 
FUNCTION
      a542initial_mess_code(VAR acv : tak_all_command_glob)
            :
            tsp_code_type;
 
VAR
 
      ptr : RECORD
            CASE boolean OF
                true :
                    (ct_ptr : tak542packet_ct_ptr);
                false :
                    (moveobj_ptr : tsp_moveobj_ptr);
                END;
            (*ENDCASE*) 
 
 
BEGIN 
IF  acv.a_cmd_segm^.sp1c_producer = sp1pr_kernel
THEN
    BEGIN
    (* curr cmd segment is an internal segment *)
    (* original segm is first on stack         *)
    ptr.moveobj_ptr       := acv.a_cmd_stack.cst_stack[1];
    a542initial_mess_code := ptr.ct_ptr^.ct_in_packet^.sp1_header.sp1h_mess_code;
    END
ELSE
    a542initial_mess_code := acv.a_in_packet^.sp1_header.sp1h_mess_code;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
FUNCTION
      a542initial_cmd_segm (VAR acv : tak_all_command_glob)
            :
            tsp1_segment_ptr;
 
VAR
 
      ptr : RECORD
            CASE boolean OF
                true :
                    (ct_ptr : tak542packet_ct_ptr);
                false :
                    (moveobj_ptr : tsp_moveobj_ptr);
                END;
            (*ENDCASE*) 
 
 
BEGIN
IF  acv.a_cmd_segm^.sp1c_producer = sp1pr_kernel
THEN
    BEGIN
    (* curr cmd segment is an internal segment *)
    (* original segm is first on stack         *)
    ptr.moveobj_ptr      := acv.a_cmd_stack.cst_stack[1];
    a542initial_cmd_segm := ptr.ct_ptr^.ct_cmd_segm
    END
ELSE
    a542initial_cmd_segm := acv.a_cmd_segm
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542change_intern_sql_cmd (
            VAR acv  : tak_all_command_glob;
            VAR tree : tgg00_FileId;
            key_int  : tsp_int2);
 
VAR
      i2c2            : tsp_int_map_c2;
      k               : tgg_lkey;
 
BEGIN
WITH acv, a_mblock, mb_data^ DO
    BEGIN
    i2c2.map_int := key_int;
    a_intern_res_tree.fileLevel_gg00[ 1 ] := i2c2.map_c2[ 1 ];
    a_intern_res_tree.fileLevel_gg00[ 2 ] := i2c2.map_c2[ 2 ];
    s20ch4a (key_int, k.k, 1);
    k.len           := 4;
    b07cget_record (a_transinf.tri_trans,
          tree, k, mbp_rec);
    IF  a_transinf.tri_trans.trError_gg00 = e_ok
    THEN
        BEGIN
        IF  ord (mbp_buf[c_sum_pos]) <> ord(true)
        THEN
            mbp_buf[c_sum_pos] := chr(ord(true));
        (*ENDIF*) 
        b07crepl_record (a_transinf.tri_trans, tree, mbp_rec);
        END;
    (*ENDIF*) 
    IF  a_transinf.tri_trans.trError_gg00 <> e_ok
    THEN
        IF  acv.a_transinf.tri_trans.trError_gg00 = e_key_not_found
        THEN
            a07_b_put_error (acv, e_sysinfo_not_found, 1)
        ELSE
            a07_b_put_error (acv,
                  acv.a_transinf.tri_trans.trError_gg00, 1);
        (*ENDIF*) 
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542next_intern_sql_cmd (
            VAR acv        : tak_all_command_glob;
            release_packet : boolean;
            VAR tree       : tgg00_FileId;
            VAR key_int    : tsp_int2);
 
CONST
      c_exit_loop = -2;
 
VAR
      first           : boolean;
      i2c2            : tsp_int_map_c2;
      cnt             : integer;
      pos             : integer;
      cmd_or_segm     : integer;
      length          : tsp_int4;
      moved_length    : tsp_int4;
      new_user_id     : tgg_surrogate;
      new_user_name   : tsp_knl_identifier;
      dummy_user_name : tsp_knl_identifier;
      internal        : tsp_c18;
      k               : tgg_lkey;
 
      c_map_sqlmode : RECORD
            CASE boolean OF
                true :
                    (c : tsp_c1);
                false :
                    (mode : tsp_sqlmode);
                END;
            (*ENDCASE*) 
 
 
      c_map_dt : RECORD
            CASE boolean OF
                true :
                    (c : tsp_c1);
                false :
                    (dt : tgg_datetimeformat);
                END;
            (*ENDCASE*) 
 
 
BEGIN
WITH acv, a_mblock, mb_data^ DO
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        key_int      := succ(key_int);
        i2c2.map_int := key_int;
        a_intern_res_tree.fileLevel_gg00[ 1 ] := i2c2.map_c2[ 1 ];
        a_intern_res_tree.fileLevel_gg00[ 2 ] := i2c2.map_c2[ 2 ];
        s20ch4a (key_int, k.k, 1);
        k.len           := 4;
        cnt             := 0;
        first           := true;
        length          := 0;
        moved_length    := 0;
        REPEAT
            b07cget_record (a_transinf.tri_trans,
                  tree, k, mbp_rec);
            IF  a_transinf.tri_trans.trError_gg00 = e_ok
            THEN
                BEGIN
                IF  first
                THEN
                    BEGIN
                    first              := false;
                    a_corr_select      := ord (mbp_buf[c_sum_pos]) = ord(true);
                    a_trunc_identifier :=
                          ord (mbp_buf[c_trunc_pos]) = ord(true);
                    c_map_sqlmode.c[1] := mbp_buf[c_sqlmode_pos];
                    a_sqlmode := c_map_sqlmode.mode;
&                   IFDEF TRACE
                    t01int4 (ak_sem,
                          'acv_corr_sel', ord(a_corr_select));
&                   ENDIF
                    g10mv17 ('VAK542',   7,    
                          mb_data_size, sizeof(new_user_id),
                          mbp_buf, c_user_pos,
                          new_user_id, 1, sizeof (new_user_id),
                          a_return_segm^.sp1r_returncode);
                    a06determine_username (acv,
                          new_user_id, new_user_name);
                    cmd_or_segm := ord(mbp_buf[ c_cmd_or_segm_pos ]);
                    length := s20or4a (mbp_buf, c_length_pos);
                    IF  cmd_or_segm = c_segm
                    THEN
                        length := length - sizeof (tsp1_segment_header) -
                              sizeof (tsp1_part_header);
                    (*ENDIF*) 
                    IF  a_return_segm^.sp1r_returncode = 0
                    THEN
                        a542internal_packet (acv,
                              release_packet, length);
                    (*ENDIF*) 
                    IF  cmd_or_segm = c_segm
                    THEN
                        length := length + sizeof (tsp1_segment_header) +
                              sizeof (tsp1_part_header);
                    (*ENDIF*) 
                    IF  ord (mbp_buf[c_prepare_pos]) = ord(true)
                    THEN
                        a_cmd_segm^.sp1c_prepare := true;
                    (*ENDIF*) 
                    c_map_dt.c[1] := mbp_buf[c_datetime_pos];
                    a_dt_format   := c_map_dt.dt;
                    a51switch_user (acv,
                          new_user_name, dummy_user_name);
                    pos := c_length_pos + 4
                    END
                ELSE
                    pos := cgg_rec_key_offset + mbp_keylen + 1;
                (*ENDIF*) 
                IF  a_return_segm^.sp1r_returncode = 0
                THEN
                    BEGIN
                    IF  cmd_or_segm = c_cmd
                    THEN
                        BEGIN
                        g10mv ('VAK542',   8,    
                              mb_data_size, acv.a_cmd_segm^.sp1p_buf_size,
                              mbp_buf, pos, acv.a_cmd_part^.sp1p_buf,
                              a_cmd_part^.sp1p_buf_len + 1,
                              mbp_reclen - pos + 1,
                              a_return_segm^.sp1r_returncode);
                        a_cmd_part^.sp1p_buf_len := a_cmd_part^.sp1p_buf_len
                              + mbp_reclen - pos + 1;
                        k.len        := intern_keylen + 1;
                        cnt          := succ(cnt);
                        k.k[ k.len ] := chr (cnt);
                        END
                    ELSE
                        BEGIN
                        (* complete command segment *)
                        g10mv9 ('VAK542',   9,    
                              mb_data_size, length,
                              mbp_buf, pos, acv.a_cmd_segm^,
                              moved_length+1,
                              mbp_reclen - pos + 1,
                              a_return_segm^.sp1r_returncode);
                        (* the part_size-values and segm_size-values *)
                        (* are not ok *)
                        END;
                    (*ENDIF*) 
                    moved_length := moved_length + mbp_reclen - pos + 1;
                    END
                (*ENDIF*) 
                END
            ELSE
                IF  acv.a_transinf.tri_trans.trError_gg00 = e_key_not_found
                THEN
                    a07_b_put_error (acv, e_sysinfo_not_found, 1)
                ELSE
                    a07_b_put_error (acv,
                          acv.a_transinf.tri_trans.trError_gg00, 1);
                (*ENDIF*) 
            (*ENDIF*) 
        UNTIL
            (moved_length >= length) OR
            (a_return_segm^.sp1r_returncode <> 0);
        (*ENDREPEAT*) 
        IF  cmd_or_segm = c_cmd
        THEN
            BEGIN
            WHILE a01is_whitespace_char (a_cmd_part^.sp1p_buf,
                  a_cmd_part^.sp1p_buf_len - (a01char_size - 1)) DO
                a_cmd_part^.sp1p_buf_len :=
                      a_cmd_part^.sp1p_buf_len - a01char_size;
            (*ENDWHILE*) 
            (* PTS 1105418 G.G.*)
            internal := a01kw[ cak_i_internal ];
            length   := a_cmd_part^.sp1p_buf_len;
            pos      := 8 (* sizeof('INTERNAL') *);
            WHILE pos > 0 DO
                IF  a01equal_char (a_cmd_part^.sp1p_buf,
                    length - (a01char_size - 1), internal[pos])
                THEN
                    BEGIN
                    pos    := pos - 1;
                    length := length - a01char_size
                    END
                ELSE
                    pos := c_exit_loop;
                (*ENDIF*) 
            (*ENDWHILE*) 
            IF  ( pos <> c_exit_loop ) AND
                ( a01is_whitespace_char(a_cmd_part^.sp1p_buf,
                length - (a01char_size - 1) ) OR
                ( a_cmd_part^.sp1p_buf[ length ] = ')'  ) OR
                ( a_cmd_part^.sp1p_buf[ length ] = '"'  ) OR
                ( a_cmd_part^.sp1p_buf[ length ] = '''' ))
            THEN
                a_cmd_part^.sp1p_buf_len := length;
            (*ENDIF*) 
            END
        ELSE
            acv.a_cmd_segm^.sp1c_producer := sp1pr_kernel;
        (*ENDIF*) 
&       IFDEF TRACE
        t01moveobj (ak_sem, a_cmd_part^.sp1p_buf, 1, a_cmd_part^.sp1p_buf_len);
&       ENDIF
        END;
    (*ENDIF*) 
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542pop_packet (VAR acv : tak_all_command_glob);
 
VAR
 
      ptr : RECORD
            CASE integer OF
                1 :
                    (mobj_ptr      : tsp_moveobj_ptr);
                2 :
                    (packet_ct_ptr : tak542packet_ct_ptr);
                END;
            (*ENDCASE*) 
 
 
BEGIN
(* releases the internal packet of the top of the packet stack *)
(* and restores the context of the pred packet                 *)
WITH acv DO
    BEGIN
    IF  a_cmd_stack.cst_top > 0
    THEN
        BEGIN
        ptr.mobj_ptr := a_cmd_stack.cst_stack[a_cmd_stack.cst_top];
        WITH ptr.packet_ct_ptr^ DO
            BEGIN
            a_in_packet              := ct_in_packet;
            a_cmd_segm               := ct_cmd_segm;
            a_data_part              := ct_data_part;
            a_cmd_part               := ct_cmd_part;
            (* h.b. 20.09.1995 This statement produces
                  an error if we handle with UNICODE ! Why ?
                  a_cmd_part^.sp1p_buf_len := ct_cmd_length; *)
            a_data_ptr               := ct_data_ptr;
            a_data_length            := ct_data_len
            END;
        (*ENDWITH*) 
        a10dispose (acv, ptr.mobj_ptr);
        a_cmd_stack.cst_top := a_cmd_stack.cst_top - 1
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542push_packet (
            VAR acv : tak_all_command_glob;
            pPacket : tsp_moveobj_ptr);
 
VAR
      ct_ptr : tak542packet_ct_ptr;
 
BEGIN
WITH acv, a_cmd_stack DO
    BEGIN
    cst_top             := cst_top + 1;
    cst_stack[cst_top]  := pPacket;
    END;
(*ENDWITH*) 
ct_ptr := @pPacket^;
WITH ct_ptr^ DO
    BEGIN
    ct_in_packet        := acv.a_in_packet;
    ct_cmd_segm         := acv.a_cmd_segm;
    ct_data_part        := acv.a_data_part;
    ct_cmd_part         := acv.a_cmd_part;
    ct_cmd_length       := acv.a_cmd_part^.sp1p_buf_len;
    ct_data_ptr         := acv.a_data_ptr;
    ct_data_len         := acv.a_data_length;
    acv.a_in_packet     := @ct_packet;
    acv.a_cmd_segm      := @ct_packet.sp1_segm;
    acv.a_data_part     := NIL;
    acv.a_data_ptr      := NIL;
    acv.a_cmd_part      := @ct_packet.sp1_segm.sp1p_part_header
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542release_packet (
            VAR acv  : tak_all_command_glob;
            segm_ptr : tsp1_segment_ptr);
 
VAR
      ix           : integer;
      packet_index : integer;
      packet_ptr   : tsp_moveobj_ptr;
 
      p1,p2        : RECORD
            CASE boolean OF
                true :
                    (m : tsp_moveobj_ptr);
                false :
                    (p : tak542packet_ct_ptr);
                END;
            (*ENDCASE*) 
 
 
BEGIN
(* releases an internal packet without restoring the context *)
packet_index := segm_ptr^.sp1s_own_index;
IF  (packet_index <= acv.a_cmd_stack.cst_top) AND
    (acv.a_cmd_stack.cst_top > 1)             AND
    (segm_ptr^.sp1c_producer = sp1pr_kernel)
THEN
    BEGIN
    packet_ptr := acv.a_cmd_stack.cst_stack[packet_index];
&   ifdef trace
    t01int4 (ak_sem, 'release pack', packet_index);
    t01moveobj (ak_sem, segm_ptr^.sp1p_buf, 1,
          segm_ptr^.sp1p_part_header.sp1p_buf_len);
&   endif
    IF  packet_index < acv.a_cmd_stack.cst_top
    THEN
        BEGIN
        p1.m               := packet_ptr;
        p2.m               := acv.a_cmd_stack.cst_stack[packet_index + 1];
        p2.p^.ct_in_packet := p1.p^.ct_in_packet;
        p2.p^.ct_cmd_segm  := p1.p^.ct_cmd_segm;
        p2.p^.ct_data_part := p1.p^.ct_data_part;
        p2.p^.ct_cmd_part  := p1.p^.ct_cmd_part;
        p2.p^.ct_cmd_length:= p1.p^.ct_cmd_length;
        p2.p^.ct_data_ptr  := p1.p^.ct_data_ptr;
        FOR ix := packet_index + 1 TO acv.a_cmd_stack.cst_top DO
            BEGIN
            acv.a_cmd_stack.cst_stack[ix-1] :=
                  acv.a_cmd_stack.cst_stack[ix];
            p1.m  := acv.a_cmd_stack.cst_stack[ix];
            p1.p^.ct_packet.sp1_segm.sp1s_own_index := ix - 1
            END;
        (*ENDFOR*) 
        END;
    (*ENDIF*) 
    acv.a_cmd_stack.cst_top := acv.a_cmd_stack.cst_top - 1;
    a10dispose (acv, packet_ptr)
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
FUNCTION
      a542GetAndRemovePacket (VAR acv : tak_all_command_glob) : tsp_moveobj_ptr;
 
VAR
 
      ptr : RECORD
            CASE integer OF
                1 :
                    (mobj_ptr      : tsp_moveobj_ptr);
                2 :
                    (packet_ct_ptr : tak542packet_ct_ptr);
                END;
            (*ENDCASE*) 
 
 
BEGIN
(* return the internal packet of the top of the packet stack *)
(* and restores the context of the previous packet           *)
WITH acv DO
    BEGIN
    IF  a_cmd_stack.cst_top > 0
    THEN
        BEGIN
        ptr.mobj_ptr := a_cmd_stack.cst_stack[a_cmd_stack.cst_top];
        WITH ptr.packet_ct_ptr^ DO
            BEGIN
            a_in_packet   := ct_in_packet;
            a_cmd_segm    := ct_cmd_segm;
            a_data_part   := ct_data_part;
            a_cmd_part    := ct_cmd_part;
            a_data_ptr    := ct_data_ptr;
            a_data_length := ct_data_len
            END;
        (*ENDWITH*) 
        a542GetAndRemovePacket := ptr.mobj_ptr;
        a_cmd_stack.cst_top    := a_cmd_stack.cst_top - 1
        END
    ELSE
        a542GetAndRemovePacket := NIL;
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542reset_packet (VAR acv : tak_all_command_glob);
 
BEGIN
(* releases all internal packets and restores the context of *)
(* the initial in_packet                                     *)
WITH acv, a_cmd_stack DO
    IF  cst_top > 0
    THEN
        BEGIN
        WHILE cst_top > 1 DO
            BEGIN
            a10dispose (acv, cst_stack[cst_top]);
            cst_top := cst_top - 1
            END;
        (*ENDWHILE*) 
        a542pop_packet (acv)
        END;
    (*ENDIF*) 
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a542store_current_command (
            VAR acv     : tak_all_command_glob;
            VAR tree    : tgg00_FileId;
            VAR key_int : tsp_int2);
 
VAR
      bpos     : integer;
      cnt      : integer;
      move_len : integer;
      vpos     : integer;
      now_to_move  : integer;
      cmd_length   : tsp_int4;
      moved_len    : tsp_int4;
      align_cmd_len: tsp_int4;
      cmd_move_len : tsp_int4;
      before_cmd   : tsp_int4;
      pos_in_cmd   : tsp_int4;
      old_segm_len : tsp_int4;
      old_cmd_ptr  : tsp1_part_ptr;
      part_ptr     : tsp1_part_ptr;
 
BEGIN
WITH acv, a_mblock, mb_data^ DO
    BEGIN
    (*------------ key ==> buffer --------------*)
    key_int := succ(key_int);
    s20ch4l (key_int, mbp_buf, cgg_rec_key_offset + 1);
    (*------------ user id ==> buffer ----------*)
    g10mv1 ('VAK542',  10,    
          sizeof(a_curr_user_id), mb_data_size,
          a_curr_user_id, 1, mbp_buf,
          c_user_pos, mxgg_surrogate,
          a_return_segm^.sp1r_returncode);
    (*------------ sum indicator ==> buffer ----*)
    mbp_buf[c_sum_pos] :=
          chr(ord(a_ap_tree^[ a_ap_tree^[ 0 ].n_lo_level ].n_symb = s_sum));
    (*------------ sqlmode ==> buffer ----------*)
    mbp_buf[c_sqlmode_pos ]    := chr(ord(a_sqlmode));
    mbp_buf[c_prepare_pos ]    := chr(ord(a_cmd_segm^.sp1c_prepare));
    mbp_buf[c_datetime_pos]    := chr(ord(a_dt_format));
    mbp_buf[c_trunc_pos   ]    := chr(ord(false));
    mbp_buf[c_cmd_or_segm_pos] := chr(c_segm);
    (*------------ cmd length ==> buffer -------*)
    s20ch4l (a_cmd_segm^.sp1s_segm_len, mbp_buf, c_length_pos);
    vpos       := 1;
    bpos       := c_length_pos + 4;
    mbp_keylen := 4;
    mbp_reclen := bpos - 1;
    mbp_varcol_offset := 0;
    mbp_varcol_cnt    := 0;
    cnt := 0;
    IF  NOT g01unicode
    THEN
        REPEAT
            IF  a_cmd_segm^.sp1s_segm_len - vpos <= mxgg_record - bpos
            THEN
                move_len := a_cmd_segm^.sp1s_segm_len - vpos + 1
            ELSE
                move_len := mxgg_record - bpos + 1;
            (*ENDIF*) 
            g10mv10 ('VAK542',  11,    
                  a_cmd_segm^.sp1s_segm_len, mb_data_size, a_cmd_segm^,
                  vpos, mbp_buf, bpos, move_len,
                  a_return_segm^.sp1r_returncode);
            bpos       := bpos + move_len;
            vpos       := vpos + move_len;
            mbp_reclen := mbp_reclen + move_len;
            b07cadd_record (acv.a_transinf.tri_trans, tree, mbp_rec);
            bpos       := cgg_rec_key_offset + intern_keylen + 1 + 1;
            mbp_keylen := intern_keylen + 1;
            mbp_reclen := cgg_rec_key_offset + mbp_keylen;
            cnt        := succ(cnt);
            mbp_buf[ cgg_rec_key_offset + mbp_keylen ] := chr(cnt);
        UNTIL
            (acv.a_transinf.tri_trans.trError_gg00 <> e_ok) OR
            (vpos > a_cmd_segm^.sp1s_segm_len)
        (*ENDREPEAT*) 
    ELSE
        BEGIN
        before_cmd := sizeof(tsp1_segment_header);
        s26find_part (a_cmd_segm^, sp1pk_command, old_cmd_ptr);
        part_ptr := @a_cmd_segm^.sp1p_part;
        WHILE part_ptr <> old_cmd_ptr DO
            BEGIN
            s26nextpart (part_ptr);
            IF  part_ptr <> old_cmd_ptr
            THEN
                before_cmd := before_cmd + s26partlen(part_ptr^);
            (*ENDIF*) 
            END;
        (*ENDWHILE*) 
        pos_in_cmd := 1;
        align_cmd_len  := a01aligned_cmd_len (a_cmd_part^.sp1p_buf_len);
        cmd_length     := a_cmd_segm^.sp1s_segm_len -
              s26partlen(old_cmd_ptr^) +
              sizeof(a_cmd_part^.sp1p_part_header) +
              align_cmd_len;
        (* in case of unicode p_buf_len and a_cmd_part^.sp1p_buf_len *)
        (* may differ *)
        s20ch4l (cmd_length, mbp_buf, c_length_pos);
        old_segm_len := a_cmd_segm^.sp1s_segm_len;
        a_cmd_segm^.sp1s_segm_len := cmd_length;
        cmd_move_len   := sizeof(a_cmd_part^.sp1p_part_header) +
              a_cmd_part^.sp1p_buf_len;
        moved_len      := 0;
&       ifdef TRACE
        t01segment (ak_sem, a_cmd_segm^);
        t01int4 (ak_sem, 'old partlen ', s26partlen(old_cmd_ptr^));
        t01int4 (ak_sem, 'align_cmd_le', align_cmd_len);
        t01int4 (ak_sem, 'segm_len    ', a_cmd_segm^.sp1s_segm_len);
        t01int4 (ak_sem, 'old_segm_len', old_segm_len);
        t01int4 (ak_sem, 'buf_len     ', a_cmd_part^.sp1p_buf_len);
        t01int4 (ak_sem, 'cmd_length  ', cmd_length);
        t01int4 (ak_sem, 'cmd_move_len', cmd_move_len);
&       endif
        REPEAT
            IF  cmd_length - moved_len <=
                mxgg_record - bpos
            THEN
                move_len := cmd_length - moved_len
            ELSE
                move_len := mxgg_record - bpos + 1;
            (*ENDIF*) 
&           ifdef TRACE
            t01int4 (ak_sem, 'move_len   1', move_len);
&           endif
            IF  before_cmd > 0
            THEN
                BEGIN
                IF  before_cmd > move_len
                THEN
                    now_to_move := move_len
                ELSE
                    now_to_move := before_cmd;
                (*ENDIF*) 
&               ifdef TRACE
                t01int4 (ak_sem, 'before_cmd  ', before_cmd);
                t01int4 (ak_sem, 'now_to_move ', now_to_move);
&               endif
                g10mv10 ('VAK542',  12,    
                      old_segm_len, mb_data_size, a_cmd_segm^,
                      vpos, mbp_buf, bpos, now_to_move,
                      a_return_segm^.sp1r_returncode);
                vpos       := vpos       + now_to_move;
                move_len   := move_len   - now_to_move;
                before_cmd := before_cmd - now_to_move;
                bpos       := bpos       + now_to_move;
                moved_len  := moved_len  + now_to_move;
&               ifdef TRACE
                t01int4 (ak_sem, 'move_len   1', move_len);
                t01int4 (ak_sem, 'moved_len  1', moved_len);
&               endif
                END;
            (*ENDIF*) 
            IF  bpos <= mxgg_record
            THEN
                IF  (move_len > 0) AND (cmd_move_len > 0)
                THEN
                    WITH a_cmd_part^ DO
                        BEGIN
                        IF  cmd_move_len > move_len
                        THEN
                            BEGIN
                            g10mv11 ('VAK542',  13,    
                                  sizeof(sp1p_part_header) +
                                  a_cmd_part^.sp1p_buf_len,
                                  mb_data_size,
                                  a_cmd_part^, pos_in_cmd,
                                  mbp_buf, bpos, move_len,
                                  a_return_segm^.sp1r_returncode);
                            cmd_move_len := cmd_move_len - move_len;
                            bpos         := bpos         + move_len;
                            moved_len    := moved_len    + move_len;
                            pos_in_cmd   := pos_in_cmd   + move_len;
                            move_len     := 0;
                            END
                        ELSE
                            BEGIN
                            IF  cmd_move_len > 0
                            THEN
                                g10mv11 ('VAK542',  14,    
                                      sizeof(sp1p_part_header) +
                                      a_cmd_part^.sp1p_buf_len,
                                      mb_data_size,
                                      a_cmd_part^, pos_in_cmd,
                                      mbp_buf, bpos, cmd_move_len,
                                      a_return_segm^.sp1r_returncode);
                            (*ENDIF*) 
                            move_len := move_len - cmd_move_len -
                                  align_cmd_len + a_cmd_part^.sp1p_buf_len;
                            bpos := bpos + cmd_move_len +
                                  align_cmd_len - a_cmd_part^.sp1p_buf_len;
                            moved_len := moved_len + cmd_move_len +
                                  align_cmd_len - a_cmd_part^.sp1p_buf_len;
                            cmd_move_len := 0;
                            vpos := vpos + s26partlen(old_cmd_ptr^);
&                           ifdef TRACE
                            t01int4 (ak_sem, 'move_len   2', move_len);
                            t01int4 (ak_sem, 'moved_len  2', moved_len);
&                           endif
                            END
                        (*ENDIF*) 
                        END;
                    (*ENDWITH*) 
&               ifdef TRACE
                (*ENDIF*) 
            (*ENDIF*) 
            t01int4 (ak_sem, 'move_len   3', move_len);
            t01int4 (ak_sem, 'moved_len  3', moved_len);
&           endif
            IF  bpos <= mxgg_record
            THEN
                IF  move_len > 0
                THEN
                    BEGIN
                    g10mv10 ('VAK542',  15,    
                          old_segm_len, mb_data_size,
                          a_cmd_segm^, vpos, mbp_buf,
                          bpos, move_len,
                          a_return_segm^.sp1r_returncode);
                    vpos      := vpos      + move_len;
                    bpos      := bpos      + move_len;
                    moved_len := moved_len + move_len;
                    END;
&               ifdef TRACE
                (*ENDIF*) 
            (*ENDIF*) 
            t01int4 (ak_sem, 'moved_len  4', moved_len);
&           endif
            mbp_reclen := bpos-1;
            b07cadd_record (acv.a_transinf.tri_trans, tree, mbp_rec);
            bpos       := cgg_rec_key_offset + intern_keylen + 1 + 1;
            mbp_keylen := intern_keylen + 1;
            mbp_reclen := cgg_rec_key_offset + mbp_keylen;
            cnt        := succ(cnt);
            mbp_buf[ cgg_rec_key_offset + mbp_keylen ] := chr(cnt);
        UNTIL
            (acv.a_transinf.tri_trans.trError_gg00 <> e_ok) OR
            (a_return_segm^.sp1r_returncode <> 0) OR
            (vpos > old_segm_len);
        (*ENDREPEAT*) 
        a_cmd_segm^.sp1s_segm_len := old_segm_len;
        END;
    (*ENDIF*) 
    IF  acv.a_transinf.tri_trans.trError_gg00 <> e_ok
    THEN
        a07_b_put_error (acv, acv.a_transinf.tri_trans.trError_gg00, 1)
    (*ENDIF*) 
    END
(*ENDWITH*) 
END; { a542store_current_command }
 
(*------------------------------*) 
 
PROCEDURE
      a542get_abapinfo (
            VAR acv         : tak_all_command_glob;
            VAR abapname    : tsp_c40;
            VAR abapnamelen : integer;
            VAR abaplinenr  : tsp_number);
 
VAR
      _pos         : integer;
      _len         : integer;
      _err         : tsp_num_error;
      _err_char_no : tsp_int4;
      _e           : tsp8_uni_error;
      _temp_space  : tsp_c10;
      _uni_len     : tsp_int4;
 
BEGIN
abapnamelen := 0;
abaplinenr := csp_null_number;
IF  g01unicode
THEN
    g10filuni1('VAK542',  16,    
          sizeof(abapname), abapname,
          1, sizeof(abapname), csp_unicode_blank,
          acv.a_return_segm^.sp1r_returncode)
ELSE
    abapname := bsp_c40;
(*ENDIF*) 
abaplinenr := csp_minluns;
IF  acv.a_abap_part <> NIL
THEN
    WITH acv, a_abap_part^ DO
        BEGIN
        _pos := 2;
        abapnamelen := ord(sp1p_buf[1]);
        IF  abapnamelen > sizeof(abapname)
        THEN
            abapnamelen := sizeof(abapname);
        (*ENDIF*) 
        IF  g01unicode
        THEN
            BEGIN
            IF  a_out_packet^.sp1_header.sp1h_mess_code = csp_unicode
            THEN
                BEGIN
                g10mv21 ('VAK542',  17,    
                      sp1p_buf_size, sizeof (abapname),
                      sp1p_buf, 2, abapname, 1, abapnamelen,
                      acv.a_return_segm^.sp1r_returncode)
                END
            ELSE
                BEGIN
                _len := abapnamelen;
                IF  a_out_packet^.sp1_header.sp1h_mess_code <> csp_unicode_swap
                THEN
                    IF  _len > sizeof(abapname) DIV 2
                    THEN
                        _len := sizeof(abapname) DIV 2;
                    (*ENDIF*) 
                (*ENDIF*) 
                abapnamelen := sizeof(abapname);
                s80uni_trans (@sp1p_buf[ 2 ], _len,
                      a_out_packet^.sp1_header.sp1h_mess_code,
                      @abapname, abapnamelen,
                      csp_unicode, [ ], _e, _err_char_no)
                END
            (*ENDIF*) 
            END
        ELSE
            g10mv21 ('VAK542',  18,    
                  sp1p_buf_size, sizeof (abapname),
                  sp1p_buf, 2, abapname, 1, abapnamelen,
                  acv.a_return_segm^.sp1r_returncode);
        (*ENDIF*) 
        _pos := 3 + ord(sp1p_buf[1]);
        _len := ord(sp1p_buf[_pos-1]);
        IF  a_out_packet^.sp1_header.sp1h_mess_code >= csp_unicode_swap
        THEN
            BEGIN
            _uni_len := sizeof (_temp_space);
            s80uni_trans (@(sp1p_buf[_pos]), _len, a_out_packet^.sp1_header.sp1h_mess_code,
                  @_temp_space, _uni_len, csp_ascii, [ ], _e,
                  _err_char_no);
            IF  _e = uni_ok
            THEN
                s43pstr1 (abaplinenr, 1, csp_fixed, csp_float_frac,
                      _temp_space, 1, _uni_len, _err)
            ELSE
                _err := num_invalid
            (*ENDIF*) 
            END
        ELSE
            s43pstr (abaplinenr, 1, csp_fixed, csp_float_frac,
                  sp1p_buf, _pos, _len, _err);
        (*ENDIF*) 
&       ifdef trace
        t01moveobj (ak_sem, sp1p_buf, 1, sp1p_buf_len);
        t01int4 (ak_sem, ' hhh pos    ', _pos);
        t01int4 (ak_sem, ' hhh len    ', _len);
        t01int4 (ak_sem, ' hhh err    ', ord(_err));
&       endif
        END;
    (*ENDWITH*) 
(*ENDIF*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        471
*-PRETTY-*  lines of code :       1366        PRETTYX 3.10 
*-PRETTY-*  lines in file :       2045         1997-12-10 
.PA 
