/*!***************************************************************************
 
  module      : vkb44
  author      : JuergenA
  responsible : UweH
  special area: KB_stringcol_open_close
  last changed: 2001-05-03
  copyright   : Copyright by SAP AG, 2001
  see also    :
  description :
 
 
 
    ========== 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
 
*****************************************************************************/
 
.tt 1 $SAP$LiveCache$VKB44$
.tt 3 $UweH$KB_stringcol_open_close$$$1999-11-08$
 
Module  : KB_stringcol_open_close
 
Define  :
 
        PROCEDURE
              k44cdelete_column_content (VAR m : tgg00_MessBlock;
                    VAR shc_id : tgg00_Surrogate);
 
        PROCEDURE
              k44copen_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k44copy_move_shrt_to_bstr_file (
                    VAR mtrans     : tgg00_TransContextPtr;
                    VAR mheader    : tgg00_MessBufHeader;
                    VAR prim_tabid : tgg00_Surrogate;
                    VAR src_tree   : tgg00_FileId;
                    VAR dst_tree   : tgg00_FileId;
                    VAR shc_buf    : tgg00_Rec;
                    use_shc_buf    : boolean;
                    move_shc_entry : boolean);
 
        PROCEDURE
              k44fnull_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k44fread_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k44fwrite_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k44get_shrt_col_rec (
                    VAR mtrans     : tgg00_TransContextPtr;
                    VAR mtree      : tgg00_FileId;
                    VAR shc_buf    : tgg00_Rec;
                    VAR prim_tabid : tgg00_Surrogate;
                    VAR shc_id     : tgg00_Surrogate);
 
        PROCEDURE
              k44get_short_col_rec (VAR m : tgg00_MessBlock;
                    VAR shc_buf    : tgg00_Rec;
                    VAR prim_tabid : tgg00_Surrogate;
                    VAR shc_id     : tgg00_Surrogate);
 
        PROCEDURE
              k44insdelupdshort_col_rec (
                    VAR mtrans     : tgg00_TransContextPtr;
                    VAR mheader    : tgg00_MessBufHeader;
                    VAR mtree      : tgg00_FileId;
                    VAR shc_buf    : tgg00_Rec;
                    VAR prim_tabid : tgg00_Surrogate;
                    VAR shc_id     : tgg00_Surrogate;
                    mess_type      : tgg00_MessType;
                    use_shc_buf    : boolean);
 
        PROCEDURE
              k44ins_del_upd_short_col_rec (VAR m : tgg00_MessBlock;
                    VAR shc_buf    : tgg00_Rec;
                    VAR prim_tabid : tgg00_Surrogate;
                    VAR shc_id     : tgg00_Surrogate;
                    mess_type      : tgg00_MessType;
                    use_shc_buf    : boolean);
 
        PROCEDURE
              k44upgrade_to_bstr_file (VAR m : tgg00_MessBlock;
                    VAR prim_tabid : tgg00_Surrogate;
                    VAR shc_buf    : tgg00_Rec;
                    use_shc_buf    : boolean);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              KB_stringcol_copy_trunc_expand : VKB43;
 
        PROCEDURE
              k43cflock_column (VAR m : tgg00_MessBlock;
                    VAR col_lock : tgg00_Lock;
                    VAR col_key  : tgg00_Lkey);
 
        PROCEDURE
              k43cwrite_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k43ttwrite_string (VAR t : tgg00_TransContext;
                    VAR curr_file      : tgg00_FileId;
                    VAR curr_long_qual : tgg00_LongQual;
                    buf_size           : tsp00_Int4;
                    buf_addr           : tsp00_MoveObjPtr;
                    inpos              : tsp00_Int4;
                    inlen              : tsp00_Int4;
                    VAR str_vers       : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              KB_transaction : VKB53;
 
        PROCEDURE
              k53lock (VAR t         : tgg00_TransContext;
                    VAR lock_tabid   : tgg00_Surrogate;
                    VAR k            : tgg00_Lkey;
                    wanted_mode      : tgg00_LockReqMode;
                    wanted_state     : tgg00_LockReqState;
                    nowait           : boolean;
                    collision_test   : boolean;
                    VAR granted_mode : tgg00_LockReqMode);
 
        PROCEDURE
              k53wait (VAR t  : tgg00_TransContext;
                    MessType  : tgg00_MessType;
                    MessType2 : tgg00_MessType2);
 
      ------------------------------ 
 
        FROM
              KB_restart_record : VKB57;
 
        PROCEDURE
              k57table_key_get (pid : tsp00_TaskId;
                    VAR trans_state : tgg00_TransState;
                    VAR syskey      : tgg00_Lkey);
 
      ------------------------------ 
 
        FROM
              KB_ins_del_upd : VKB61;
 
        PROCEDURE
              k61ins_del_upd (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_file_table_handling : VKB64;
 
        PROCEDURE
              k64create_bd_file (VAR t : tgg00_TransContext;
                    VAR tree_id    : tgg00_FileId;
                    mess_type      : tgg00_MessType;
                    mess2_type     : tgg00_MessType2;
                    str_col_cnt    : tsp00_Int2);
 
        PROCEDURE
              k64drop_tree (VAR t  : tgg00_TransContext;
                    VAR file_id    : tgg00_FileId;
                    with_stringcol : boolean);
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01int4 (layer : tgg00_Debug;
                    nam      : tsp00_Sname;
                    int      : tsp00_Int4);
 
        PROCEDURE
              t01long_qual (debug : tgg00_Debug;
                    nam           : tsp00_Sname;
                    VAR long_qual : tgg00_LongQual);
 
        PROCEDURE
              t01messblock (debug : tgg00_Debug;
                    nam           : tsp00_Sname;
                    VAR m         : tgg00_MessBlock);
 
        PROCEDURE
              t01treeid (
                    debug      : tgg00_Debug;
                    nam        : tsp00_Sname;
                    VAR treeid : tgg00_FileId);
&       endif
 
      ------------------------------ 
 
        FROM
              filesysteminterface_1 : VBD01;
 
        VAR
              b01niltree_id : tgg00_FileId;
 
        PROCEDURE
              b01filestate (VAR t : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_2 : VBD02;
 
        PROCEDURE
              b02select_record (VAR t : tgg00_TransContext;
                    VAR file_id     : tgg00_FileId;
                    VAR RecKey      : tsp00_Key;
                    VAR RecKeyLen   : tsp00_Int2;
                    VAR StopKey     : tsp00_Key;
                    StopKeyLen      : tsp00_Int4;
                    recbuf_size     : tsp00_Int4;
                    recbuf_ptr      : tsp00_MoveObjPtr;
                    VAR sel         : tgg00_SelectFieldsParam;
                    VAR stack_desc  : tgg00_StackDesc;
                    VAR unqualified : boolean);
 
        PROCEDURE
              b02get_record (VAR t : tgg00_TransContext;
                    VAR file_id : tgg00_FileId;
                    VAR rk      : tgg00_Lkey;
                    VAR b       : tgg00_Rec);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_5 : VBD05;
 
        PROCEDURE
              b05length_bytestr (VAR t : tgg00_TransContext;
                    VAR file_id    : tgg00_FileId;
                    VAR filelength : tsp00_Int4;
                    VAR page_count : tsp00_Int4;
                    VAR str_vers   : tsp00_Int4);
 
        PROCEDURE
              b05read_bytestr (VAR t : tgg00_TransContext;
                    VAR file_id  : tgg00_FileId;
                    pos          : tsp00_Int4;
                    VAR length   : tsp00_Int4;
                    buf_size     : tsp00_Int4;
                    buf_addr     : tsp00_MoveObjPtr;
                    bufpos       : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG10;
 
        PROCEDURE
              g10fil (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    size       : tsp_int4;
                    VAR m      : tsp_moveobj;     pos        : tsp_int4;
                    len        : tsp_int4;        fillchar   : char;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv (mod_id    : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tgg00_Surrogate; source_pos : tsp_int4;
                    VAR destin : tsp_moveobj;     destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv1 (mod_id   : tsp_c6;            mod_num  : tsp_int4;
                    source_upb : tsp_int4;          dest_upb : tsp_int4;
                    VAR source : tgg00_RecBody;     src_pos  : tsp_int4;
                    VAR destin : tgg00_Surrogate;   dest_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv2 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tsp00_Key;       source_pos : tsp_int4;
                    VAR destin : tgg00_FileId;    destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv3 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tgg00_Lock;       source_pos : tsp_int4;
                    VAR destin : tsp_moveobj;     destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv4 (mod_id : tsp_c6;                mod_num  : tsp_int4;
                    src_upb  : tsp_int4;              dest_upb : tsp_int4;
                    VAR src  : tgg00_StringFileDescr; src_pos  : tsp_int4;
                    VAR dest : tsp_moveobj;           dest_pos : tsp_int4;
                    length   : tsp_int4;
                    VAR err  : tgg_basis_error);
 
        PROCEDURE
              g10mv5 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tsp00_Key;       source_pos : tsp_int4;
                    VAR destin : tsp_moveobj;     destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv6 (mod_id   : tsp_c6;            mod_num    : tsp_int4;
                    source_upb : tsp_int4;          destin_upb : tsp_int4;
                    VAR source : tgg00_Surrogate;   source_pos : tsp_int4;
                    VAR destin : tsp00_Key;         destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv7 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tsp00_Buf;       source_pos : tsp_int4;
                    VAR destin : tsp_moveobj;     destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv8 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tsp_moveobj;     source_pos : tsp_int4;
                    VAR destin : tsp_moveobj;     destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv9 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tsp_moveobj;     source_pos : tsp_int4;
                    VAR destin : tsp00_Key;       destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01localsite      : tgg_serverdb_no;
              g01nil_long_qual  : tgg_long_qual;
              g01nil_stack_desc : tgg_stack_desc;
 
        PROCEDURE
              g01mblock_init (VAR source_trans : tgg00_TransContext;
                    mess_type  : tgg_message_type;
                    mess2_type : tgg_message2_type;
                    VAR mblock : tgg_mess_block);
 
      ------------------------------ 
 
        FROM
              Select_Help_Procedures : VGG04;
 
        PROCEDURE
              g04init_select_fields (VAR sel : tgg_select_fields_param;
                    data_addr     : tsp_moveobj_ptr;
                    data_size     : tsp_int4;
                    work_st_addr  : tgg_stack_list_ptr;
                    work_st_max   : tsp_int2;
                    work_buf_addr : tsp_moveobj_ptr;
                    work_buf_size : tsp_int4;
                    curr_sqlmode  : tsp_sqlmode);
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        PROCEDURE
              g10mv;
 
              tsp_moveobj tgg00_Surrogate
 
        PROCEDURE
              g10mv1;
 
              tsp_moveobj tgg00_RecBody
              tsp_moveobj tgg00_Surrogate
 
        PROCEDURE
              g10mv2;
 
              tsp_moveobj tsp00_Key
              tsp_moveobj tgg00_FileId
 
        PROCEDURE
              g10mv3;
 
              tsp_moveobj tgg00_Lock
 
        PROCEDURE
              g10mv4;
 
              tsp_moveobj tgg00_StringFileDescr
 
        PROCEDURE
              g10mv5;
 
              tsp_moveobj tsp00_Key
 
        PROCEDURE
              g10mv6;
 
              tsp_moveobj tgg00_Surrogate
              tsp_moveobj tsp00_Key
 
        PROCEDURE
              g10mv7;
 
              tsp_moveobj tsp00_Buf
 
        PROCEDURE
              g10mv9;
 
              tsp_moveobj tsp00_Key
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  :
.sp
.cp 3
Created : 1985-02-04
.sp
.cp 3
Version : 2002-08-01
.sp
.cp 3
Release :      Date : 1999-11-08
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
.sp 2
K44copen_column
.sp;.in +3
A string column is opened for use in either read or
read/write mode, i.e. a ??-byte string file descripton
and a lockentry record are returned to the AK layer.
To 'open' a column means either to 'open' an existing
string file or to create
a new one. If the column was not opened before and, therefore,
has to be created, the record containing this column
will be updated with the filedescription mentioned
above.  If a column was opened at least once before for use in the
read/write mode, it can be opened for use in the read mode only.
.sp
The returned lock entry contains all available KB information
that is necessary to aquire a lock on the table record
containing the column (the transaction mechanism for
string columns is implemented by locking the table records
only).
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
.sp 2
.cm  hier input description
.nf
.fo
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :
 
 
CONST
      c_collision_test = true;
      c_new_file       = true;
      c_nowait         = true;
      c_use_shc_buf    = true;
      c_with_stringcol = true;
      c_move_shc_entry = true;
 
 
(*------------------------------*) 
 
PROCEDURE
      k44copen_column (VAR m : tgg00_MessBlock);
 
VAR
      cfd : tgg00_StringFileDescr;
 
BEGIN
kb44open_column (m, cfd);
IF  m.mb_trns^.trError_gg00 <> e_ok
THEN
    BEGIN
    m.mb_type     := m_return_error;
    m.mb_qual_len := 0;
    m.mb_data_len := 0;
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k44fnull_column (VAR m : tgg00_MessBlock);
 
VAR
      cfd : tgg00_StringFileDescr;
 
BEGIN
kb44delete_column (m, cfd);
END;
 
(*------------------------------*) 
 
PROCEDURE
      k44fread_column (VAR m : tgg00_MessBlock);
 
VAR
      i          : integer;
      dummy_vers : tsp00_Int4;
      page_count : tsp00_Int4;
      cfd        : tgg00_StringFileDescr;
      shc_buf    : tgg00_Rec;
 
BEGIN
WITH m, mb_qual^, ml_long_qual DO
    BEGIN
    lq_pos := 1;
    i := ord (mb_st^ [1].ecol_tab [1]);
    CASE i OF
        0 :
            lq_code := csp_ebcdic;
        1 :
            lq_code := csp_ascii;
        2 :
            lq_code := csp_codeneutral;
        (*  3 : lq_code := dbyte; *)
        4 :
            lq_code := csp_unicode;
        OTHERWISE
            m.mb_trns^.trError_gg00 := e_num_overflow;
        END;
    (*ENDCASE*) 
    IF  mb_trns^.trError_gg00 = e_ok
    THEN
        kb44open_column (m, cfd);
    (*ENDIF*) 
    IF  mb_trns^.trError_gg00 = e_ok
    THEN
        BEGIN
        IF  cfd.str_treeid.fileTfn_gg00 = tfnShortScol_egg00
        THEN
            BEGIN
            k44get_short_col_rec (m, shc_buf, mtree.fileTabId_gg00,
                  cfd.str_treeid.fileTabId_gg00);
            IF  mb_trns^.trError_gg00 = e_ok
            THEN
                BEGIN
                lq_long_size := shc_buf.len - cgg_rec_key_offset -
                      shc_buf.keylen;
                lq_len := lq_long_size;
                IF  lq_len > 0
                THEN
                    BEGIN
                    g10mv7 ('VKB44 ',   1,    
                          sizeof (shc_buf.buf), mb_data_size,
                          shc_buf.buf,
                          cgg_rec_key_offset + shc_buf.keylen + 1,
                          mb_data^.mbp_buf, lq_data_offset + 1, lq_len,
                          m.mb_trns^.trError_gg00);
                    lq_pos := lq_pos + lq_len;
                    END
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END
        ELSE
            BEGIN
            b05length_bytestr (mb_trns^, cfd.str_treeid,
                  lq_long_size, page_count, dummy_vers);
            IF  (mb_trns^.trError_gg00 = e_ok) AND (lq_long_size > 0)
            THEN
                BEGIN
                IF  lq_len  > mb_data_size - lq_data_offset
                THEN
                    lq_len := mb_data_size - lq_data_offset;
                (*ENDIF*) 
                IF  lq_len > lq_long_size
                THEN
                    lq_len := lq_long_size;
                (*ENDIF*) 
                b05read_bytestr (mb_trns^, cfd.str_treeid,
                      lq_pos, lq_len,
                      mb_data_size, @mb_data^.mbp_buf,
                      lq_data_offset + 1);
                IF  mb_trns^.trError_gg00 = e_ok
                THEN
                    BEGIN
                    lq_pos := lq_pos + lq_len;
&                   ifdef TRACE
                    t01int4 (fs_kb, 'fread len   ', lq_len)
&                         endif
                    END
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  mb_trns^.trError_gg00 =  e_ok
    THEN
        BEGIN
        mb_qual_len := MB_PART1_HEAD_MXGG00 + sizeof (ml_long_qual);
        mb_data_len := lq_data_offset + lq_len;
        mb_qual^.mqual_cnt := 0;
        mb_qual^.mcol_cnt  := 0;
        END
    ELSE
        BEGIN
        mb_type      := m_return_error;
        mb_qual_len  := 0;
        mb_data_len  := 0;
        END
    (*ENDIF*) 
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k44fwrite_column (VAR m : tgg00_MessBlock);
 
VAR
      data_offset   : integer;
      cfd           : tgg00_StringFileDescr;
      aux_m         : tgg00_MessBlock;
      mess_datapart : tgg00_Rec (*double*);
      mess_qualpart : tgg00_QualBuf;
 
BEGIN
g01mblock_init (m.mb_trns^, m_column, mm_fwrite, aux_m);
WITH aux_m DO
    BEGIN
    mb_header             := m.mb_header;
    mb_struct             := mbs_long;
    mb_data               := @mess_datapart;
    mb_data_size          := sizeof (mess_datapart);
    mb_qual               := @mess_qualpart;
    mb_qual_size          := sizeof (mess_qualpart);
    mb_st                 := m.mb_st;
    mb_st_size            := m.mb_st_size;
    mb_st_max             := m.mb_st_max;
    mb_work_st            := m.mb_work_st;
    mb_work_st_max        := m.mb_work_st_max;
    mb_workbuf            := m.mb_workbuf;
    mb_workbuf_size       := m.mb_workbuf_size;
    (* *)
    mb_qual^.mtree        := m.mb_qual^.mtree;
    mb_qual^.mstack_desc  := m.mb_qual^.mstack_desc;
    mb_qual^.mst_addr     := mb_st;
    mb_qual^.mst_max      := mb_st_max;
    mb_qual^.ml_long_qual := m.mb_qual^.ml_long_qual;
    mb_qual_len           := MB_PART1_HEAD_MXGG00 +
          sizeof (mb_qual^.ml_long_qual);
    mb_data_len           :=  m.mb_qual^.ml_long_qual.lq_data_offset
          (* mb_data^.mbp_keylen   := 0 *)
    END;
(*ENDWITH*) 
WITH m.mb_qual^ DO
    ml_long_qual.lq_lock_tabid := mtree.fileTabId_gg00;
(*ENDWITH*) 
data_offset := cgg_rec_key_offset + m.mb_data^.mbp_keylen;
g10mv8 ('VKB44 ',   2,    
      m.mb_data_size, aux_m.mb_data_size,
      m.mb_data^.mbp_buf, 1, aux_m.mb_data^.mbp_buf, 1,
      m.mb_qual^.ml_long_qual.lq_data_offset, m.mb_trns^.trError_gg00);
m.mb_data^.mbp_keylen := 0;
(* mbp_keylen = 0 ==> avoid locking in k43cwrite_column *)
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    kb44open_column (aux_m, cfd);
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    WITH m, mb_qual^, ml_long_qual DO
        BEGIN
        mtree           := cfd.str_treeid;
        lq_long_in_file := (cfd.str_treeid.fileTfn_gg00 = tfnColumn_egg00);
&       ifdef TRACE
        t01long_qual (fs_kb, 'open l_qual:',
              aux_m.mb_qual^.ml_long_qual);
&       endif
        END;
    (*ENDWITH*) 
&   ifdef TRACE
    t01messblock (fs_kb, 'K44FWRITE_CO', m);
&   endif
    k43cwrite_column (m);
    IF  m.mb_qual^.ml_long_qual.lq_long_in_file
    THEN
        BEGIN
        cfd.str_treeid.fileTfn_gg00  := tfnColumn_egg00;
        cfd.str_treeid.fileType_gg00 := [ftsByteStr_egg00, ftsConcurrent_egg00];
        END
    ELSE
        BEGIN
        cfd.str_treeid.fileTfn_gg00  := tfnShortScol_egg00;
        cfd.str_treeid.fileType_gg00 := [ftsPerm_egg00, ftsConcurrent_egg00];
        END;
    (*ENDIF*) 
    g10mv8 ('VKB44 ',   3,    
          aux_m.mb_data_size, m.mb_data_size,
          aux_m.mb_data^.mbp_buf, 1, m.mb_data^.mbp_buf, 1,
          aux_m.mb_data_len, m.mb_trns^.trError_gg00);
    g10mv4 ('VKB44 ',   4,    
          sizeof (cfd), m.mb_data_size,
          cfd, 1, m.mb_data^.mbp_buf,
          cgg_rec_key_offset + 1, sizeof (cfd), m.mb_trns^.trError_gg00);
    m.mb_qual_len := aux_m.mb_qual_len;
    m.mb_data_len := aux_m.mb_data_len;
    m.mb_type     := m_return_result;
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 <> e_ok
THEN
    BEGIN
    m.mb_type      := m_return_error;
    m.mb_qual_len  := 0;
    m.mb_data_len  := 0;
    END;
(*ENDIF*) 
m.mb_type2 := mm_nil
END;
 
(*------------------------------*) 
 
PROCEDURE
      k44get_short_col_rec (VAR m : tgg00_MessBlock;
            VAR shc_buf    : tgg00_Rec;
            VAR prim_tabid : tgg00_Surrogate;
            VAR shc_id     : tgg00_Surrogate);
 
BEGIN
k44get_shrt_col_rec (m.mb_trns, m.mb_qual^.mtree,
      shc_buf, prim_tabid, shc_id);
END;
 
(*------------------------------*) 
 
PROCEDURE
      k44get_shrt_col_rec (
            VAR mtrans     : tgg00_TransContextPtr;
            VAR mtree      : tgg00_FileId;
            VAR shc_buf    : tgg00_Rec;
            VAR prim_tabid : tgg00_Surrogate;
            VAR shc_id     : tgg00_Surrogate);
 
VAR
      shc_treeid : tgg00_FileId;
      shc_key    : tgg00_Lkey;
 
BEGIN
kb44build_short_col_file_id (mtree, shc_treeid, prim_tabid);
shc_key.len := SURROGATE_MXGG00;
g10mv6 ('VKB44 ',   5,    
      sizeof (shc_id), sizeof (shc_key.k),
      shc_id, 1, shc_key.k, 1, sizeof (shc_id), mtrans^.trError_gg00);
IF  mtrans^.trError_gg00 = e_ok
THEN
    b02get_record (mtrans^, shc_treeid, shc_key, shc_buf)
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k44ins_del_upd_short_col_rec (VAR m : tgg00_MessBlock;
            VAR shc_buf    : tgg00_Rec;
            VAR prim_tabid : tgg00_Surrogate;
            VAR shc_id     : tgg00_Surrogate;
            mess_type      : tgg00_MessType;
            use_shc_buf    : boolean);
 
BEGIN
k44insdelupdshort_col_rec(m.mb_trns, m.mb_header, m.mb_qual^.mtree,
      shc_buf, prim_tabid, shc_id, mess_type, use_shc_buf);
END;
 
(*------------------------------*) 
 
PROCEDURE
      k44insdelupdshort_col_rec (
            VAR mtrans     : tgg00_TransContextPtr;
            VAR mheader    : tgg00_MessBufHeader;
            VAR mtree      : tgg00_FileId;
            VAR shc_buf    : tgg00_Rec;
            VAR prim_tabid : tgg00_Surrogate;
            VAR shc_id     : tgg00_Surrogate;
            mess_type      : tgg00_MessType;
            use_shc_buf    : boolean);
 
VAR
      lcl_mbuf        : tgg00_MessBlock;
      mess_datapart   : tgg00_Rec;
      mess_qualpart   : tgg00_QualBuf;
 
BEGIN
g01mblock_init (mtrans^, mess_type, mm_nil, lcl_mbuf);
WITH lcl_mbuf DO
    BEGIN
    mb_header            := mheader;
    mb_data              := @mess_datapart;
    mb_data_size         := sizeof (mess_datapart);
    mb_qual              := @mess_qualpart;
    mb_qual_size         := sizeof (mess_qualpart);
    mb_st                := NIL;
    mb_st_size           := 0;
    mb_st_max            := 0;
    mb_struct            := mbs_stack_addr;
    mb_qual_len          := MB_PART1_HEAD_MXGG00;
    mb_qual^.mstack_desc := g01nil_stack_desc;
    mb_qual^.mfirst_free := 1;
    kb44build_short_col_file_id (mtree, mb_qual^.mtree, prim_tabid);
    mb_type              := mess_type;
    mb_type2             := mm_nil;
    END;
(*ENDWITH*) 
IF  NOT use_shc_buf
THEN
    BEGIN
    g10mv ('VKB44 ',   6,    
          sizeof (shc_id), lcl_mbuf.mb_data_size,
          shc_id, 1, lcl_mbuf.mb_data^.mbp_buf,
          cgg_rec_key_offset + 1, sizeof (shc_id), mtrans^.trError_gg00);
    lcl_mbuf.mb_data^.mbp_keylen := SURROGATE_MXGG00;
    lcl_mbuf.mb_data^.mbp_reclen := cgg_rec_key_offset + SURROGATE_MXGG00;
    END
ELSE
    g10mv7 ('VKB44 ',   7,    
          sizeof (shc_buf.buf), lcl_mbuf.mb_data_size,
          shc_buf.buf, 1,
          lcl_mbuf.mb_data^.mbp_buf, 1, shc_buf.len, mtrans^.trError_gg00);
(*ENDIF*) 
(* PTS 1104430 E.Z *)
lcl_mbuf.mb_data^.mbp_varcol_offset := 0;
lcl_mbuf.mb_data^.mbp_varcol_cnt    := 0;
lcl_mbuf.mb_data_len := lcl_mbuf.mb_data^.mbp_reclen;
&ifdef TRACE
t01messblock (fs_kb, 'K44INS_DEL_U', lcl_mbuf);
&endif
IF  mtrans^.trError_gg00 = e_ok
THEN
    k61ins_del_upd (lcl_mbuf);
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k44upgrade_to_bstr_file (VAR m : tgg00_MessBlock;
            VAR prim_tabid : tgg00_Surrogate;
            VAR shc_buf    : tgg00_Rec;
            use_shc_buf    : boolean);
 
BEGIN
k44copy_move_shrt_to_bstr_file (m.mb_trns, m.mb_header, prim_tabid,
      m.mb_qual^.mtree, m.mb_qual^.mtree, shc_buf, use_shc_buf,
      c_move_shc_entry);
END;
 
(*------------------------------*) 
 
PROCEDURE
      k44copy_move_shrt_to_bstr_file (
            VAR mtrans     : tgg00_TransContextPtr;
            VAR mheader    : tgg00_MessBufHeader;
            VAR prim_tabid : tgg00_Surrogate;
            VAR src_tree   : tgg00_FileId;
            VAR dst_tree   : tgg00_FileId;
            VAR shc_buf    : tgg00_Rec;
            use_shc_buf    : boolean;
            move_shc_entry : boolean);
 
VAR
      str_vers      : tsp00_Int4;
      lc_treeid     : tgg00_FileId;
      aux_long_qual : tgg00_LongQual;
 
BEGIN
&ifdef TRACE
t01treeid    (fs_kb, 'src_tree    ', src_tree);
t01treeid    (fs_kb, 'dst_tree    ', dst_tree);
&endif
lc_treeid               := dst_tree;
lc_treeid.fileType_gg00 := [ ftsByteStr_egg00, ftsConcurrent_egg00 ];
lc_treeid.fileVersion_gg00.ci2_gg00 := cgg_dummy_file_version;
lc_treeid.fileTfn_gg00  := tfnColumn_egg00;
IF  NOT use_shc_buf
THEN
    k44get_shrt_col_rec (mtrans, src_tree, shc_buf, prim_tabid,
          src_tree.fileTabId_gg00);
(*ENDIF*) 
IF  mtrans^.trError_gg00 = e_ok
THEN
    k64create_bd_file (mtrans^, lc_treeid, m_create_file, mm_nil, 0);
(*ENDIF*) 
IF  (mtrans^.trError_gg00 = e_ok)
    AND (shc_buf.len > cgg_rec_key_offset + SURROGATE_MXGG00)
THEN
    BEGIN
    aux_long_qual := g01nil_long_qual;
    WITH aux_long_qual DO
        BEGIN
        lq_len   := shc_buf.len - cgg_rec_key_offset - SURROGATE_MXGG00;
        lq_pos   := 1;
        str_vers := -MAX_INT4_SP00 + 1;
        k43ttwrite_string  (mtrans^, lc_treeid,
              aux_long_qual, sizeof (shc_buf.buf), @shc_buf.buf,
              cgg_rec_key_offset + SURROGATE_MXGG00 + 1, lq_len, str_vers);
        END;
    (*ENDWITH*) 
    END;
(*ENDIF*) 
IF  move_shc_entry AND (mtrans^.trError_gg00 = e_ok)
THEN
    k44insdelupdshort_col_rec (mtrans, mheader, src_tree, shc_buf, prim_tabid,
          src_tree.fileTabId_gg00, m_delete, NOT c_use_shc_buf);
(*ENDIF*) 
IF  mtrans^.trError_gg00 = e_ok
THEN
    dst_tree := lc_treeid;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb44build_column_file_id (VAR m : tgg00_MessBlock;
            VAR cfd  : tgg00_StringFileDescr;
            new_file : boolean);
 
VAR
      str_col_no : tgg00_Lkey;
 
BEGIN
WITH cfd DO
    BEGIN
    str_treeid                   := b01niltree_id;
    str_treeid.fileUserRef_gg00  := m.mb_qual^.mtree.fileUserRef_gg00;
    str_treeid.fileHandling_gg00 := m.mb_qual^.mtree.fileHandling_gg00;
    str_treeid.fileBdUse_gg00    := [];
    str_treeid.fileType_gg00     := [ftsByteStr_egg00, ftsConcurrent_egg00];
    str_treeid.fileTfn_gg00      := tfnColumn_egg00;
    END;
(*ENDWITH*) 
IF  new_file
THEN
    BEGIN
    k57table_key_get (m.mb_trns^.trTaskId_gg00, m.mb_trns^.trState_gg00,
          str_col_no);
    cfd.str_treeid.fileType_gg00 := [ftsPerm_egg00, ftsConcurrent_egg00];
    cfd.str_treeid.fileTfn_gg00  := tfnShortScol_egg00;
    g10mv2 ('VKB44 ',   8,    
          sizeof (str_col_no.k), sizeof (cfd.str_treeid),
          str_col_no.k, 1, cfd.str_treeid,
          cgg_treeid_fn_offset + 3, str_col_no.len, m.mb_trns^.trError_gg00)
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb44build_short_col_file_id (VAR mtree : tgg00_FileId;
            VAR shc_treeid : tgg00_FileId;
            VAR shc_tabid  : tgg00_Surrogate);
 
BEGIN
shc_treeid                := mtree;
shc_treeid.fileBdUse_gg00 := [];
shc_treeid.fileRoot_gg00  := NIL_PAGE_NO_GG00;
shc_treeid.fileType_gg00  := [ftsPerm_egg00, ftsConcurrent_egg00];
shc_treeid.fileTfn_gg00   := tfnShortScol_egg00;
shc_treeid.fileTabId_gg00 := shc_tabid;
shc_treeid.fileVersion_gg00.ci2_gg00 := cgg_dummy_file_version;
END;
 
(*------------------------------*) 
 
PROCEDURE
      k44cdelete_column_content (VAR m : tgg00_MessBlock;
            VAR shc_id : tgg00_Surrogate);
 
VAR
      cfd : tgg00_StringFileDescr;
 
BEGIN
kb44build_column_file_id (m, cfd, NOT c_new_file);
cfd.str_treeid.fileTabId_gg00 := shc_id;
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    k64drop_tree (m.mb_trns^, cfd.str_treeid,
          NOT c_with_stringcol);
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_file_not_found
THEN
    BEGIN
    m.mb_trns^.trError_gg00 := e_ok;
    IF  m.mb_trns^.trError_gg00 = e_ok
    THEN
        (* mb_data will not be changed - just dummy supply *)
        k44ins_del_upd_short_col_rec (m, m.mb_data^.mbp_rec,
              m.mb_qual^.mtree.fileTabId_gg00,
              shc_id, m_delete, NOT c_use_shc_buf);
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb44delete_column (VAR m : tgg00_MessBlock;
            VAR cfd : tgg00_StringFileDescr);
 
VAR
      str_def_byte_pos : integer;
      col_lock         : tgg00_Lock;
      lcl_key          : tgg00_Lkey;
      buf              : tgg00_Rec;
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
lcl_key.len := 0;
kb44get_primary_rec (m, buf, lcl_key);
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    str_def_byte_pos := buf.keylen + m.mb_qual^.mst_addr^ [1].epos;
    IF  buf.info [str_def_byte_pos] = csp_undef_byte
    THEN
        m.mb_trns^.trError_gg00 := e_string_column_empty
    ELSE
        BEGIN
        kb44build_column_file_id (m, cfd, NOT c_new_file);
        g10mv1 ('VKB44 ',   9,    
              sizeof (buf.info), sizeof (cfd.str_treeid.fileTabId_gg00),
              buf.info,
              str_def_byte_pos + 1, cfd.str_treeid.fileTabId_gg00, 1,
              sizeof (cfd.str_treeid.fileTabId_gg00), m.mb_trns^.trError_gg00);
        IF  m.mb_trns^.trError_gg00 = e_ok
        THEN
            k64drop_tree (m.mb_trns^, cfd.str_treeid,
                  NOT c_with_stringcol);
        (*ENDIF*) 
        IF  m.mb_trns^.trError_gg00 = e_file_not_found
        THEN
            BEGIN
            m.mb_trns^.trError_gg00 := e_ok;
            (* locking log necessary *)
            k43cflock_column (m, col_lock, lcl_key);
            IF  m.mb_trns^.trError_gg00 = e_ok
            THEN
                k44ins_del_upd_short_col_rec (m, buf,
                      m.mb_qual^.mtree.fileTabId_gg00,
                      cfd.str_treeid.fileTabId_gg00, m_delete, NOT c_use_shc_buf)
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    m.mb_qual_len          := MB_PART1_HEAD_MXGG00;
    m.mb_qual^.mcol_cnt    := 1;
    m.mb_qual^.mcol_pos    := 1;
    m.mb_qual^.mfirst_free := 2;
    m.mb_type              := m_update;
    m.mb_type2             := mm_nil;
    m.mb_qual^.mst_addr^[ 1 ].ecol_tab [ 1 ] := chr (0);
    m.mb_data_len  := cgg_rec_key_offset + m.mb_data^.mbp_keylen + 1
          + 1 + cgg_str_col_entry_size;
    m.mb_data^.mbp_reclen := m.mb_data_len ;
    m.mb_data^.mbp_buf [cgg_rec_key_offset + m.mb_data^.mbp_keylen+1] :=
          chr (1 + cgg_str_col_entry_size);
    m.mb_data^.mbp_buf [cgg_rec_key_offset + m.mb_data^.mbp_keylen+2] :=
          csp_undef_byte;
    g10fil ('VKB44 ',  10,    
          m.mb_data_size, m.mb_data^.mbp_buf,
          cgg_rec_key_offset + m.mb_data^.mbp_keylen + 2 + 1,
          cgg_str_col_entry_size, chr (255), m.mb_trns^.trError_gg00);
&   ifdef TRACE
    t01messblock (fs_kb, 'KB44DELETE_C', m);
&   endif
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    k61ins_del_upd (m);
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    m.mb_type     := m_return_error;
    m.mb_qual_len := 0;
    m.mb_data_len := 0;
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb44get_primary_rec (VAR m : tgg00_MessBlock;
            VAR b : tgg00_Rec;
            VAR k : tgg00_Lkey);
 
VAR
      dummy_bool : boolean;
      stopkey    : tgg00_Lkey;
      sel        : tgg00_SelectFieldsParam;
 
BEGIN
k.len := m.mb_data^.mbp_keylen;
g10mv9 ('VKB44 ',  11,    
      m.mb_data_size, sizeof (k.k),
      m.mb_data^.mbp_buf, cgg_rec_key_offset + 1,
      k.k, 1, k.len, m.mb_trns^.trError_gg00);
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    stopkey.len := 0;
    g04init_select_fields (sel, @m.mb_data^.mbp_buf, m.mb_data_size,
          m.mb_work_st, m.mb_work_st_max, m.mb_workbuf,
          m.mb_workbuf_size, m.mb_qual^.msqlmode);
    WITH sel DO
        BEGIN
        sfp_bd_mess_type    := m_column;
        sfp_bd_mess2_type   := mm_direct;
        sfp_is_first_record := false;
        sfp_m_result_addr   := @b;
        sfp_m_result_size   := sizeof (b);
        END;
    (*ENDWITH*) 
    m.mb_trns^.trRteCommPtr_gg00^.file_root       := NIL_PAGE_NO_GG00;
    m.mb_trns^.trRteCommPtr_gg00^.file_record_cnt := 0;
    b02select_record (m.mb_trns^, m.mb_qual^.mtree, k.keyVal_gg00, k.keyLen_gg00,
          stopkey.keyVal_gg00, stopkey.keyLen_gg00, sizeof (b),
          @b, sel, m.mb_qual^.mstack_desc, dummy_bool)
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb44open_column (VAR m : tgg00_MessBlock;
            VAR cfd : tgg00_StringFileDescr);
 
VAR
      new_file         : boolean;
      is_replicated    : boolean;
      write_request    : boolean;
      i                : integer;
      str_def_byte_pos : integer;
      lc_treeid        : tgg00_FileId;
      dummy_granted    : tgg00_LockReqMode;
      col_lock         : tgg00_Lock;
      lcl_key          : tgg00_Lkey;
      buf              : tgg00_Rec;
 
BEGIN
is_replicated     := m.mb_replicated = rpl_full;
m.mb_trns^.trError_gg00 := e_ok;
new_file := true;
write_request := m.mb_qual^.mbool;
&ifdef TRACE
t01int4 (fs_kb, 'write req   ', ord (write_request));
&endif
lcl_key.len := 0;
kb44get_primary_rec (m, buf, lcl_key);
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    WITH col_lock DO
        BEGIN
        lockTabId_gg00 := m.mb_qual^.mtree.fileTabId_gg00;
        lockSite_gg00  := g01localsite;
        lockMode_gg00  := lckRowShare_egg00;
        lockState_gg00 := [  ];
        IF  m.mb_type2 = mm_fwrite
        THEN
            BEGIN
            lockMode_gg00  := lckRowExcl_egg00;
            lockState_gg00 := [lrsEotExcl_egg00];
            END;
        (*ENDIF*) 
        lockKeyLen_gg00   := lcl_key.len;
        lockKeyPos_gg00   := 1;
        IF  (NOT (hsWithoutLock_egg00 in m.mb_qual^.mtree.fileHandling_gg00))
            OR (m.mb_type2 = mm_fwrite)
        THEN
            BEGIN
            IF  m.mb_type2 = mm_fwrite
            THEN
                k43cflock_column (m, col_lock, lcl_key)
            ELSE
                BEGIN
                k53lock (m.mb_trns^, col_lock.lockTabId_gg00, lcl_key,
                      col_lock.lockMode_gg00, [], NOT c_nowait,
                      NOT c_collision_test, dummy_granted);
                IF  m.mb_trns^.trError_gg00 = e_wait_for_lock_release
                THEN
                    k53wait (m.mb_trns^, m.mb_type, m.mb_type2)
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END;
    (*ENDWITH*) 
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    str_def_byte_pos := buf.keylen + m.mb_st^ [1].epos;
    IF  buf.info [str_def_byte_pos] = csp_undef_byte
    THEN
        BEGIN
        IF  NOT write_request
        THEN
            m.mb_trns^.trError_gg00 := e_string_column_empty
        ELSE
            BEGIN
            kb44build_column_file_id (m, cfd, c_new_file);
            IF  (m.mb_trns^.trError_gg00 = e_ok) AND
                (m.mb_type2 = mm_fwrite  )
                AND
                (m.mb_qual^.mst_addr^[2].elen_var
                > MAX_SHORTCOL_LEN_KB00)
            THEN
                BEGIN
                lc_treeid               := cfd.str_treeid;
                lc_treeid.fileType_gg00 := [ ftsByteStr_egg00, ftsConcurrent_egg00 ];
                lc_treeid.fileTfn_gg00  := tfnColumn_egg00;
                k64create_bd_file (m.mb_trns^, lc_treeid, m_create_file,
                      mm_nil, 0);
                IF  m.mb_trns^.trError_gg00 = e_ok
                THEN
                    kb44lock_colid (m.mb_trns^,
                          cfd.str_treeid.fileTabId_gg00, write_request);
                (*ENDIF*) 
                IF  m.mb_trns^.trError_gg00 = e_ok
                THEN
                    BEGIN
                    cfd.str_treeid.fileTfn_gg00  := tfnColumn_egg00;
                    cfd.str_treeid.fileType_gg00 :=
                          [ ftsByteStr_egg00, ftsConcurrent_egg00 ]
                    END
                (*ENDIF*) 
                END
            ELSE
                BEGIN
                col_lock.lockMode_gg00  := lckRowExcl_egg00;
                col_lock.lockState_gg00 := [lrsEotExcl_egg00];
                k43cflock_column (m, col_lock, lcl_key);
                IF  m.mb_trns^.trError_gg00 = e_ok
                THEN
                    kb44lock_colid (m.mb_trns^,
                          cfd.str_treeid.fileTabId_gg00, write_request);
                (*ENDIF*) 
                IF  m.mb_trns^.trError_gg00 = e_ok
                THEN
                    k44ins_del_upd_short_col_rec (m, buf,
                          col_lock.lockTabId_gg00,
                          cfd.str_treeid.fileTabId_gg00, m_insert,
                          NOT c_use_shc_buf)
                (*ENDIF*) 
                END
            (*ENDIF*) 
            END
        (*ENDIF*) 
        END
    ELSE
        BEGIN
        new_file := false;
        kb44build_column_file_id (m, cfd, NOT c_new_file);
        g10mv1 ('VKB44 ',  12,    
              sizeof (buf.info), sizeof (cfd.str_treeid.fileTabId_gg00),
              buf.info, str_def_byte_pos + 1,
              cfd.str_treeid.fileTabId_gg00, 1, sizeof (cfd.str_treeid.fileTabId_gg00),
              m.mb_trns^.trError_gg00);
        lc_treeid               := cfd.str_treeid;
        lc_treeid.fileType_gg00 := [ ftsByteStr_egg00, ftsConcurrent_egg00 ];
        lc_treeid.fileTfn_gg00  := tfnColumn_egg00;
        IF  m.mb_trns^.trError_gg00 = e_ok
        THEN
            b01filestate (m.mb_trns^, lc_treeid);
        (*ENDIF*) 
        IF  (m.mb_trns^.trError_gg00 = e_file_read_only) AND NOT
            write_request
        THEN
            m.mb_trns^.trError_gg00 := e_ok;
        (*ENDIF*) 
        IF  m.mb_trns^.trError_gg00 = e_ok
        THEN
            BEGIN
            cfd.str_treeid.fileType_gg00 := [ ftsByteStr_egg00, ftsConcurrent_egg00 ];
            cfd.str_treeid.fileTfn_gg00  := tfnColumn_egg00;
            kb44lock_colid (m.mb_trns^,
                  cfd.str_treeid.fileTabId_gg00, write_request);
            END
        ELSE
            IF  m.mb_trns^.trError_gg00 = e_file_not_found
            THEN
                BEGIN
                m.mb_trns^.trError_gg00 := e_ok;
                kb44lock_colid (m.mb_trns^,
                      cfd.str_treeid.fileTabId_gg00, write_request);
                IF  m.mb_trns^.trError_gg00 = e_ok
                THEN
                    k44get_short_col_rec (m, buf, col_lock.lockTabId_gg00,
                          lc_treeid.fileTabId_gg00);
                (*ENDIF*) 
                IF  m.mb_trns^.trError_gg00 = e_ok
                THEN
                    BEGIN
                    cfd.str_treeid.fileTfn_gg00  := tfnShortScol_egg00;
                    cfd.str_treeid.fileType_gg00 :=
                          [ ftsPerm_egg00, ftsConcurrent_egg00 ];
                    END
                (*ENDIF*) 
                END
            (*ENDIF*) 
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    cfd.str_treeid.fileRoot_gg00 := NIL_PAGE_NO_GG00;
    IF  write_request
    THEN
        cfd.use_mode := fs_readwrite
    ELSE
        cfd.use_mode := fs_read;
    (*ENDIF*) 
    IF  is_replicated
    THEN
        cfd.dhomesite := g01localsite (* cgg_replicated_site *)
    ELSE
        cfd.dhomesite := g01localsite;
    (*ENDIF*) 
    WITH cfd DO
        BEGIN
        WITH m.mb_st^ [1] DO
            BEGIN
            i := ord (ecol_tab [1]);
            CASE i OF
                0 :
                    codespec := csp_ebcdic;
                1 :
                    codespec := csp_ascii;
                2 :
                    codespec := csp_codeneutral;
                (*  3 : codespec := dbyte; *)
                4 :
                    codespec := csp_unicode;
                OTHERWISE
                    m.mb_trns^.trError_gg00 := e_num_overflow;
                END;
            (*ENDCASE*) 
            ecol_tab [ 1 ] := chr (0)
            END;
        (*ENDWITH*) 
        IF  ( m.mb_trns^.trError_gg00 = e_ok ) AND new_file
        THEN
            BEGIN
            m.mb_qual_len          := MB_PART1_HEAD_MXGG00;
            m.mb_qual^.mcol_cnt    := 1;
            m.mb_qual^.mcol_pos    := 1;
            m.mb_qual^.mqual_cnt   := 0;
            m.mb_qual^.mview_cnt   := 0;
            m.mb_qual^.mfirst_free := 2;
            m.mb_type              := m_update;
            m.mb_type2             := mm_nil;
            m.mb_struct            := mbs_stack_addr;
            m.mb_data_len          := cgg_rec_key_offset
                  + m.mb_data^.mbp_keylen + 1 + 1
                  + cgg_str_col_entry_size;
            m.mb_data^.mbp_reclen := m.mb_data_len ;
            m.mb_data^.mbp_buf
                  [cgg_rec_key_offset + m.mb_data^.mbp_keylen + 1] :=
                  chr (1 + cgg_str_col_entry_size);
            m.mb_data^.mbp_buf
                  [cgg_rec_key_offset + m.mb_data^.mbp_keylen + 2] :=
                  csp_defined_byte;
            g10mv ('VKB44 ',  13,    
                  sizeof (cfd.str_treeid.fileTabId_gg00), m.mb_data_size,
                  cfd.str_treeid.fileTabId_gg00, 1, m.mb_data^.mbp_buf,
                  cgg_rec_key_offset + m.mb_data^.mbp_keylen + 2 + 1,
                  cgg_str_col_entry_size, m.mb_trns^.trError_gg00);
&           ifdef TRACE
            t01messblock (fs_kb, 'KB44OPEN_COL', m);
&           endif
            IF  m.mb_trns^.trError_gg00 = e_ok
            THEN
                k61ins_del_upd (m)
            (*ENDIF*) 
            END
        (*ENDIF*) 
        END
    (*ENDWITH*) 
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    WITH m, mb_qual^ DO
        BEGIN
        g10mv4 ('VKB44 ',  14,    
              sizeof (cfd), m.mb_data_size,
              cfd, 1, m.mb_data^.mbp_buf,
              cgg_rec_key_offset + 1, sizeof (cfd), m.mb_trns^.trError_gg00);
        col_lock.lockState_gg00 := [  ];
        g10mv3 ('VKB44 ',  15,    
              sizeof (col_lock), m.mb_data_size,
              col_lock, 1, m.mb_data^.mbp_buf, cgg_rec_key_offset +
              STRING_FD_MXGG00 + 1, sizeof (col_lock), m.mb_trns^.trError_gg00);
        g10mv5 ('VKB44 ',  16,    
              sizeof (lcl_key.k), m.mb_data_size,
              lcl_key.k, 1, m.mb_data^.mbp_buf, cgg_rec_key_offset +
              STRING_FD_MXGG00 + LOCK_MXGG00 + 1, lcl_key.len,
              m.mb_trns^.trError_gg00);
        mcol_pos    := 0;
        mcol_cnt    := 0;
        mfirst_free := 1;
        mb_qual_len := MB_PART1_HEAD_MXGG00 + sizeof (ml_long_qual);
        mb_struct   := mbs_long;
        mb_data_len := cgg_rec_key_offset + STRING_FD_MXGG00
              + LOCK_MXGG00 + lcl_key.len;
        mb_data^.mbp_reclen := m.mb_data_len ;
        IF  ml_long_qual.lq_data_offset < mb_data_len
        THEN
            ml_long_qual.lq_data_offset := mb_data_len;
        (*ENDIF*) 
        mb_type := m_return_result
        END
    (*ENDWITH*) 
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb44lock_colid (VAR t : tgg00_TransContext;
            col_id     : tgg00_Surrogate;
            write_req  : boolean);
 
VAR
      lock_mode     : tgg00_LockReqMode;
      dummy_k       : tgg00_Lkey;
      dummy_granted : tgg00_LockReqMode;
 
BEGIN
IF  write_req
THEN
    BEGIN
    lock_mode := lckTabExcl_egg00;
    col_id [3] := chr (128);
    k53lock (t, col_id, dummy_k, lock_mode, [], NOT c_nowait,
          NOT c_collision_test, dummy_granted);
    IF  t.trError_gg00 = e_wait_for_lock_release
    THEN
        k53wait (t, m_column, mm_lock);
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
&ifdef NOTUSED
(*------------------------------*) 
 
PROCEDURE
      dummy ;
 
BEGIN
END;
 
&endif
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        356
*-PRETTY-*  lines of code :       1025        PRETTYX 3.10 
*-PRETTY-*  lines in file :       1549         1997-12-10 
.PA 
