/****************************************************************************
  module      : vkb05
  author      : JuergenA
  responsible : UweH
  special area: KB_functions
  created     : 1980-02-15
  last changed: 2000-01-07  12:00
  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$VKB05$
.tt 3 $UweH$KB_functions$2000-08-18$
 
Module  : KB_functions
 
Define  :
 
        PROCEDURE
              k05cold_functions (VAR mblock : tgg00_MessBlock);
 
        PROCEDURE
              k05functions (VAR mblock : tgg00_MessBlock);
 
        PROCEDURE
              k05init;
 
        FUNCTION
              k05is_fatal_error (e : tgg00_BasisError): boolean;
 
        PROCEDURE
              kb05AddRecord (
                    VAR Trans   : tgg00_TransContext;
                    VAR FileId  : tgg00_FileId;
                    VAR Buf     : tgg00_Rec);
 
        PROCEDURE
              kb05DelRecord (
                    VAR Trans   : tgg00_TransContext;
                    VAR FileId  : tgg00_FileId;
                    VAR Key     : tgg00_Lkey);
 
        PROCEDURE
              kb05GetRecord (
                    VAR Trans   : tgg00_TransContext;
                    VAR FileId  : tgg00_FileId;
                    VAR Key     : tgg00_Lkey;
                    VAR Buf     : tgg00_Rec);
 
        PROCEDURE
              kb05ReplRecord (
                    VAR Trans   : tgg00_TransContext;
                    VAR FileId  : tgg00_FileId;
                    VAR Buf     : tgg00_Rec);
 
        PROCEDURE
              kb05ReturnErrorHandling (VAR Trans : tgg00_TransContext;
                    BeginSubtransSet : boolean;
                    StartMessType    : tgg00_MessType);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              Scanner : VAK01;
 
        VAR
              a01diag_monitor_on : boolean;
              a01diag_analyze_on : boolean;
 
      ------------------------------ 
 
        FROM
              AK_Table : VAK11;
 
        PROCEDURE
              a11put_date_time (VAR date : tsp_int4;
                    VAR time : tsp_int4);
 
      ------------------------------ 
 
        FROM
              KB_Check : VKB03;
 
        PROCEDURE
              kb03CheckInit;
 
      ------------------------------ 
 
        FROM
              KB_init_config : VKB06;
 
        PROCEDURE
              k06add_config (VAR m : tgg00_MessBlock; is_cold : boolean);
 
        PROCEDURE
              k06init_config (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_shutdown : VKB28;
 
        PROCEDURE
              k28emergency_shutdown (VAR t : tgg00_TransContext;
                    origin_mess_type : tgg00_MessType);
 
        PROCEDURE
              k28shutdown (VAR t : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              KB_index_handling : VKB33;
 
        PROCEDURE
              k33create_index (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_utility : VKB35;
 
        PROCEDURE
              k35check_table (VAR m : tgg00_MessBlock;
                    with_lock : boolean);
 
        PROCEDURE
              k35clear_log (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35cold_save_data (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35diagnose (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35end_clear_diag (VAR t : tgg00_TransContext);
 
        PROCEDURE
              k35get_restart_version (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35log_restore (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35log_save (VAR m : tgg00_MessBlock;
                    is_cold : boolean);
 
        PROCEDURE
              k35outcopy_diag (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35restore_data (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35save_data (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35set_not_generated;
 
        PROCEDURE
              k35temp_outcopy (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35verify (VAR m : tgg00_MessBlock; is_cold : boolean);
 
        PROCEDURE
              kb35ReIntegrateBadLogVolume(
                    VAR Trans   : tgg00_TransContext;
                    VAR DevName : tsp00_VFilename );
 
        PROCEDURE
              kb35GetBadLogVolume(
                    VAR Trans   : tgg00_TransContext;
                    VAR DevName : tsp00_VFilename);
 
      ------------------------------ 
 
        FROM
              KB_diagnose_outcopy : VKB37;
 
        PROCEDURE
              k37dump (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_headmaster : VKB38;
 
        PROCEDURE
              k38e_autosave_end (VAR t : tgg00_TransContext; is_quick : boolean);
 
        PROCEDURE
              k38headmaster (VAR messbuf : tgg00_MessBlock);
 
        PROCEDURE
              k38i_autosave_init (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k38restore_config (VAR mblock : tgg00_MessBlock);
 
        PROCEDURE
              k38set_not_generated;
 
        PROCEDURE
              k38sh_autosave_show (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_stringcol_copy_trunc_expand : VKB43;
 
        PROCEDURE
              k43begin_load (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k43ccopy_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k43cexpand_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k43clock_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k43ctrunc_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k43cwrite_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k43cnwrite_column (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_stringcol_open_close : VKB44;
 
        PROCEDURE
              k44copen_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k44fread_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k44fnull_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k44fwrite_column (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_stringcol_read_search_length : VKB45;
 
        PROCEDURE
              k45clength_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k45cread_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k45cnread_column (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k45csearch_column (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_trans_state : VKB50;
 
        PROCEDURE
              k50not_connected (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k50transindex_check (VAR t : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              KB_locklist : VKB51;
 
        VAR
              k51_kb_func_calls : tsp00_8ByteCounter;
 
        PROCEDURE
              k51examine_trans (VAR t : tgg00_TransContext);
 
        PROCEDURE
              k51set_not_generated;
 
        PROCEDURE
              k51sys_share_remove (TaskId : tsp00_TaskId;
                    TransIndex            : tgg00_TransIndex;
                    VAR TransState        : tgg00_TransState);
 
      ------------------------------ 
 
        FROM
              KB_show_lock : VKB52;
 
        PROCEDURE
              k52show_lock (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_transaction : VKB53;
 
        PROCEDURE
              k53connect (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k53end_of_trans (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k53lock_command (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k53release (VAR t : tgg00_TransContext;
                    force_release : boolean);
 
        PROCEDURE
              k53unlock (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_temp_logging : VKB54;
 
        PROCEDURE
              k54create_drop_temp_file (VAR t : tgg00_TransContext;
                    create_drop_type : tgg00_MessType;
                    VAR temp_file    : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              KB_Logging : VKB560;
 
        PROCEDURE
              kb560BeginSubtransLogTransaction (VAR Trans : tgg00_TransContext);
 
        PROCEDURE
              kb560EndSubtransLogTransaction (VAR Trans : tgg00_TransContext);
 
        PROCEDURE
              kb560RollbackLogTransAction (VAR Trans : tgg00_TransContext;
                    RollbackKind : tgg00_MessType2;
                    SubTransNo   : tgg00_SubtransNo);
 
        PROCEDURE
              kb560StartSavepoint (VAR Trans : tgg00_TransContext;
                    MessType2 : tgg00_MessType2);
 
      ------------------------------ 
 
        FROM
              KB_restart_record : VKB57;
 
        PROCEDURE
              k57sequence_no (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k57set_not_generated;
 
        PROCEDURE
              k57stamp (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_ins_del_upd : VKB61;
 
        PROCEDURE
              k61add_upd_record (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k61del_upd_qual (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k61ins_del_upd (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k61table_ins_del_upd (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_file_table_handling : VKB64;
 
        PROCEDURE
              k64begin_load (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k64change_filetype (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k64cmd_drop (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k64end_load (VAR m  : tgg00_MessBlock);
 
        PROCEDURE
              k64set_file_version (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k64set_read_only_file (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k64set_treeleafnodes (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k64table_create (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k64temp_file_handling (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k64unload_reload (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_change_key : VKB66;
 
        PROCEDURE
              k66modify_table (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_get : VKB71;
 
        PROCEDURE
              k71column_statistic (VAR m : tgg_mess_block);
 
        PROCEDURE
              k71file_statistic (VAR m : tgg_mess_block);
 
        PROCEDURE
              k71get (VAR m : tgg_mess_block);
 
        PROCEDURE
              k71select (VAR m  : tgg_mess_block);
 
      ------------------------------ 
 
        FROM
              Single_Select : VKB720;
 
        PROCEDURE
              k720_single_select (VAR m : tgg_mess_block);
 
      ------------------------------ 
 
        FROM
              Single_Select_Part2 : VKB721;
 
        PROCEDURE
              k721eval_pagecount (VAR m : tgg_mess_block);
 
        PROCEDURE
              k721read_subquery (VAR m : tgg_mess_block);
 
      ------------------------------ 
 
        FROM
              Unionhandling : VKB722;
 
        PROCEDURE
              k722_union_select (VAR m : tgg_mess_block);
 
      ------------------------------ 
 
        FROM
              KB_Join_Select : VKB74;
 
        PROCEDURE
              k74_join_select (VAR m : tgg_mess_block);
 
      ------------------------------ 
 
        FROM
              KB_Fetch : VKB75;
 
        PROCEDURE
              k75_fetch (VAR m : tgg_mess_block);
 
      ------------------------------ 
 
        FROM
              KB_restart : VKB81;
 
        PROCEDURE
              k81local_restart (VAR t      : tgg00_TransContext;
                    until_date             : tsp00_Date;
                    until_time             : tsp00_Time;
                    is_restore_log         : boolean;
                    activate_state         : tgg00_MessType2;
                    VAR predecessorVersion : tsp00_Version);

 
      ------------------------------ 
 
        FROM
              filesysteminterface_1  : VBD01;
 
        PROCEDURE
              b01end_read_only (VAR t : tgg00_TransContext);
 
        PROCEDURE
              b01shutdown_filesystem (VAR t : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_1  : VBD02;
 
        PROCEDURE
              b02add_record (VAR t : tgg00_TransContext;
                    VAR file_id : tgg00_FileId;
                    VAR b       : tgg00_Rec);
 
        PROCEDURE
              b02del_record (VAR t : tgg00_TransContext;
                    VAR file_id : tgg00_FileId;
                    VAR rk      : tgg00_Lkey);
 
        PROCEDURE
              b02get_record (VAR t : tgg00_TransContext;
                    VAR file_id : tgg00_FileId;
                    VAR rk      : tgg00_Lkey;
                    VAR b       : tgg00_Rec);
 
        PROCEDURE
              b02repl_record (VAR t : tgg00_TransContext;
                    VAR file_id : tgg00_FileId;
                    VAR b       : tgg00_Rec);
 
      ------------------------------ 
 
        FROM
              Trace : VBD120;
 
        PROCEDURE
              b120InsertTrace (VAR t   : tgg00_TransContext;
                    trace_layer  : tgg00_Debug;
                    trace_object : tgg00_VtraceType;
                    body_len     : tsp00_Int2;
                    trace_body   : tgg11_VtraceBodyPtr);
 
      ------------------------------ 
 
        FROM
              task_temp_data_cache : VBD21;
 
        PROCEDURE
              b21m_reset_monitor (temp_cache_ptr : tgg00_TempDataCachePtr;
                    reset_sum : boolean);
 
      ------------------------------ 
 
        FROM
              RTE_kernel : VEN101;
 
        PROCEDURE
              vclock (VAR sec : tsp_int4;
                    VAR microsec : tsp_int4);
&       ifdef TRACE
&       ifdef NOTUSED
 
        PROCEDURE
              vscheck (VAR maxstacksize : tsp_int4);
&       endif
&       endif
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01vtrace : tgg_vtrace_state;
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG10;
 
        PROCEDURE
              g10mv  (mod_id     : tsp_c6;
                    mod_intern_num : tsp_int4;
                    source_upb     : tsp_int4;
                    destin_upb     : tsp_int4;
                    VAR source     : tsp00_VFilename;
                    source_pos     : tsp_int4;
                    VAR destin     : tsp00_MoveObj;
                    destin_pos     : tsp_int4;
                    length         : tsp_int4;
                    VAR e          : tgg_basis_error);
 
        PROCEDURE
              g10mv1 (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 : tgg11_VtraceBody; destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
&       ifdef NOTUSED
        VAR
              tdmaxstack : tgg00_MaxstackArr;
&       endif
 
        PROCEDURE
              t01handling (layer : tgg00_Debug;
                    nam : tsp00_Sname;
                    s   : tgg00_HandlingSet);
 
        PROCEDURE
              t01messblock (debug : tgg00_Debug;
                    nam           : tsp00_Sname;
                    VAR m         : tgg00_MessBlock);
 
        PROCEDURE
              t01messtype (layer : tgg00_Debug;
                    nam          : tsp00_Sname;
                    mess_type    : tgg00_MessType);
 
        PROCEDURE
              t01mess2type (layer : tgg00_Debug;
                    nam           : tsp00_Sname;
                    mess_type     : tgg00_MessType2);
 
        PROCEDURE
              t01name (layer : tgg00_Debug; nam : tsp00_Name);
 
        FUNCTION
              t01trace (debug : tgg00_Debug) : boolean;
 
        PROCEDURE
              t01messmaxstack (debug  : tgg00_Debug;
                    nam       : tsp00_Sname;
                    mess_type : tgg00_MessType;
                    int       : tsp00_Int4);
              (*
              PROCEDURE
              t01int4 (level : tgg00_Debug;
              nam : tsp00_Sname;
              val : tsp00_Int4);
              *)
&       endif
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        PROCEDURE
              g10mv;
 
              tsp_moveobj tsp00_VFilename
              tsp_moveobj tsp00_MoveObj
 
        PROCEDURE
              g10mv1;
 
              tsp_moveobj tsp00_Key
              tsp_moveobj tgg11_VtraceBody
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : J. Stanicki/J.Aurisch
.sp
.cp 3
Created : 1980-02-15
.sp
.cp 3
Version : 2002-09-13
.sp
.cp 3
Release :      Date : 2000-10-18
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
 
Update Use:
k35set_not_generated; (* PTS 1000431 UH *)
 
.sp 2
Procedure K05COLD_FUNCTIONS
.sp
Distributor for KB functions in COLD mode.
.sp 2;.cp 4
Procedure K05FUNCTIONS
.sp
Distributor for KB functions in a restarted database (WARM mode).
At the end of K05FUNCTIONS, a rollback is executed if
the error KB_ROLLBACK_WANTED is set and a command rollback is executed
if a non fatal error is occurred.
The fact that the process is no longer in the KB layer
is recorded in the lock list so that if there is a lock timeout,
the timeout process can remove the locks.
.br
When "fatal" errors occur, an emergency shutdown is executed.
.sp 2;.cp 4
Procedure K05INIT
.sp
This procedure is called when SQL-DB (XSTART) is started.  It sets
the NOT GENERATED state for the various global KB variables.
.sp 2;.cp 4
Function K05IS_FATAL_ERROR
.sp
The result of this function is TRUE if the specified basis error should
lead to an emergency shutdown.
.CM *-END-* specification -------------------------------
.sp 2;
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
.sp
The distributor can be regarded as a driver program for the
local DB system consisting of the KB and BD layer.
.br
The individual procedures for the orders to be executed are called
via K05COLD_FUNCTIONS and K05FUNCTIONS, according to the
message types received. After the order has been processed, the
result is sent back (M_RETURN_RESULT) or, in the
case of an error, a return message (M_RETURN_ERROR) is sent back
with the basis error.
.sp 2;.cp 5;.nf
VTRACE for KB calls with tree id (and key):
-----------------------------------+-------------
| mess type| mess2 type | table id | klen | key |
-----------------------------------+-------------
      1           1   SURROGATE_MXGG00   1    klen
.sp 2;.cp 5
VTRACE for other commands:
--------------------------
| mess type | mess2 type |
--------------------------
      1            1
.sp 2;.cp 5
VTRACE for termination of VKB05
---------------
| basis error |
---------------
       2
.fo
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 25
.nf
.oc _/1
.CM -lll-
Code    :
 
 
CONST
      c_cold           = true;
      c_with_lock      = true;
      c_is_restore_log = true;
      c_quick          = true;
      c_reset_sum      = true;
 
 
(*------------------------------*) 
 
PROCEDURE
      k05cold_functions (VAR mblock : tgg00_MessBlock);
 
VAR
      StartMessType : tgg00_MessType;
      mess_trace    : tgg11_KbDateTimeTrace;
 
BEGIN
mblock.mb_trns^.trError_gg00 := e_ok;
StartMessType                := mblock.mb_type;
&ifdef TRACE
t01name      (kb_funct, '==================');
t01messblock (kb_funct, 'MESSBUF ----', mblock);
&endif
IF  g01vtrace.vtrAll_gg00
THEN
    BEGIN
    WITH mess_trace.kbdtHead_gg11 DO
        BEGIN
        kbMessType_gg11  := mblock.mb_type;
        kbMessType2_gg11 := mblock.mb_type2;
        kbError_gg11     := e_ok
        END;
    (*ENDWITH*) 
    a11put_date_time (mess_trace.kbdtDate_gg11, mess_trace.kbdtTime_gg11);
    b120InsertTrace (mblock.mb_trns^, kb, vttKbColdFunctions_egg00, sizeof (mess_trace), @mess_trace);
    END;
(*ENDIF*) 
IF  (mblock.mb_trns^.trIndex_gg00 <> cgg_nil_transindex) AND
    (mblock.mb_trns^.trError_gg00   <> e_move_error      )
THEN
    k50transindex_check (mblock.mb_trns^);
(*ENDIF*) 
IF  mblock.mb_trns^.trError_gg00 <> e_move_error
THEN
    CASE mblock.mb_type OF
        m_change   (*
        ========   *):
            mblock.mb_trns^.trError_gg00 := e_not_implemented;
        m_clear_log   (*
        ===========   *):
            k35clear_log (mblock);
        m_diagnose   (*
        ==========   *):
            IF  mblock.mb_type2 = mm_dump
            THEN
                k37dump (mblock)
            ELSE
                k35diagnose (mblock);
            (*ENDIF*) 
        m_end   (*
        =====   *):
            IF  mblock.mb_type2 = mm_clear
            THEN
                k35end_clear_diag (mblock.mb_trns^)
            ELSE
                mblock.mb_trns^.trError_gg00 := e_not_implemented;
            (*ENDIF*) 
        m_get   (*
        =====   *):
            IF  mblock.mb_type2 = mm_log
            THEN
                k35get_restart_version (mblock)
                      (* PTS 1117472 E.Z. *)
            ELSE
                IF  mblock.mb_type2 = mm_log_cold
                THEN
                    kb05GetBadLogVolume (mblock)
                ELSE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented;
                (*ENDIF*) 
            (*ENDIF*) 
        m_init_config   (*
        =============   *):
            IF  mblock.mb_type2 = mm_standby
            THEN
                mblock.mb_trns^.trError_gg00 := e_not_implemented
            ELSE
                k06init_config (mblock);
            (*ENDIF*) 
        m_insert   (*
        ========   *):
            IF  (mblock.mb_type2 = mm_device) OR
                (mblock.mb_type2 = mm_log   )
            THEN
                k06add_config (mblock, c_cold)
            ELSE
                k61add_upd_record (mblock);
            (*ENDIF*) 
        m_outcopy   (*
        =========   *):
            k35outcopy_diag (mblock);
        m_release   (*
        =========   *):
            BEGIN
            END;
        m_restart   (*
        =========   *):
            CASE mblock.mb_type2 OF
                mm_nil, mm_first:
                    k81local_restart (mblock.mb_trns^,
                          mblock.mb_qual^.msave_restore.sripUntilDate_gg00,
                          mblock.mb_qual^.msave_restore.sripUntilTime_gg00,
                          NOT c_is_restore_log,
                          mblock.mb_type2,
                          mblock.mb_qual^.mrst_version);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented;
                END;
            (*ENDCASE*) 
        m_restore   (*
        =========   *):
            CASE mblock.mb_type2 OF
                mm_database, mm_pages:
                    k35restore_data (mblock);
                mm_log:
                    k35log_restore (mblock);
                (* PTS 1117472 E.Z. *)
                mm_log_cold:
                    kb35ReIntegrateBadLogVolume(mblock.mb_trns^,
                          mblock.mb_qual^.mut_dev);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_restore_parallel (*
        ================== *):
            CASE mblock.mb_type2 OF
                mm_database, mm_pages:
                    k35restore_data (mblock);
                mm_log:
                    k35log_restore (mblock);
                mm_abort, mm_acknowledge,
                mm_ignore, mm_newtape:
                    k38headmaster (mblock);
                mm_config:
                    (* PTS 1103756 UH 1999-09-02 *)
                    k38restore_config (mblock);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_save, m_save_overwrite   (*
        ========================   *):
            CASE mblock.mb_type2 OF
                mm_database, mm_pages:
                    k35cold_save_data (mblock);
                mm_log:
                    k35log_save (mblock, c_cold);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_save_parallel (*
        ================ *):
            CASE mblock.mb_type2 OF
                mm_database, mm_pages:
                    k35cold_save_data (mblock);
                mm_log:
                    k35log_save (mblock, c_cold);
                mm_newtape, mm_abort, mm_ignore,
                mm_fread, mm_fwrite, mm_string:
                    k38headmaster (mblock);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_shutdown_filesystem   (*
        =====================   *):
            b01shutdown_filesystem (mblock.mb_trns^);
        m_update_rec   (*
        ============   *):
            k61add_upd_record (mblock);
        m_verify   (*
        ========   *):
            IF  mblock.mb_type2 = mm_participant
            THEN
                mblock.mb_trns^.trError_gg00 := e_not_implemented
            ELSE
                k35verify (mblock, c_cold);
            (*ENDIF*) 
        OTHERWISE
            mblock.mb_trns^.trError_gg00 := e_not_implemented
        END;
    (*ENDCASE*) 
(*ENDIF*) 
IF  (mblock.mb_type <> m_return_result)
    OR
    ((mblock.mb_trns^.trError_gg00 <> e_ok)
    AND
    ((StartMessType <> m_outcopy) OR
    (mblock.mb_trns^.trError_gg00 <> e_no_next_record)))
THEN
    BEGIN
    mblock.mb_type  := m_return_error;
    mblock.mb_type2 := mm_nil;
    IF  StartMessType <> m_diagnose
    THEN
        mblock.mb_data_len := 0;
    (*ENDIF*) 
    IF  (StartMessType = m_verify          ) OR
        (StartMessType = m_save_parallel   ) OR
        (StartMessType = m_restore_parallel)
    THEN
        mblock.mb_struct := mbs_buf
    ELSE
        BEGIN
        mblock.mb_qual_len  := 0;
        mblock.mb_struct    := mbs_nil
        END
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  g01vtrace.vtrAll_gg00
THEN
    BEGIN
    WITH mess_trace.kbdtHead_gg11 DO
        BEGIN
        IF  (mblock.mb_type = m_return_result) AND (mblock.mb_trns^.trError_gg00 = e_ok)
        THEN
            kbMessType_gg11 := m_return_result
        ELSE
            kbMessType_gg11 := m_return_error;
        (*ENDIF*) 
        kbMessType2_gg11 := mm_nil;
        kbError_gg11     := mblock.mb_trns^.trError_gg00
        END;
    (*ENDWITH*) 
    a11put_date_time (mess_trace.kbdtDate_gg11, mess_trace.kbdtTime_gg11);
    b120InsertTrace (mblock.mb_trns^, kb, vttKbColdFunctions_egg00, sizeof (mess_trace), @mess_trace);
    END;
&ifdef TRACE
(*ENDIF*) 
t01messblock (kb_funct, 'RETURN MBUF ', mblock);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      k05functions (VAR mblock : tgg00_MessBlock);
 
VAR
      BeginSubtransSet : boolean;
      StartMessType    : tgg00_MessType;
      StartMessType2   : tgg00_MessType2;
      keylen           : integer;
      len              : integer;
      start_time_sec   : tsp00_Int4;
      start_time_msec  : tsp00_Int4;
      stop_time_sec    : tsp00_Int4;
      stop_time_msec   : tsp00_Int4;
      diff_sec         : tsp00_Int4;
      diff_msec        : tsp00_Int4;
      mess_trace       : tgg11_KbTabKeyTrace;
      mess_time_trace  : tgg11_KbTimeTrace;
&     ifdef TRACE
&     ifdef NOTUSED
      startstack       : tsp00_Int4;
&     endif
&     endif
 
BEGIN
BeginSubtransSet := false;
&ifdef TRACE
&ifdef NOTUSED
vscheck (startstack);
WITH mblock.mb_trns^ DO
    IF  ((trTaskId_gg00 > 0) AND
        ( trTaskId_gg00 <= MAX_STACK_GG00))
    THEN
        tdmaxstack [trTaskId_gg00] := MAX_INT4_SP00;
&   endif
&   endif
    (*ENDIF*) 
(*ENDWITH*) 
WITH mblock.mb_trns^ DO
    BEGIN
    trError_gg00   := e_ok;
    trState_gg00   := trState_gg00 - [tsFunctRollbSet_egg00];
    trRteCommPtr_gg00^.virt_reads := -MAX_INT2_SP00;
    END;
(*ENDWITH*) 
StartMessType   := mblock.mb_type;
StartMessType2  := mblock.mb_type2;
start_time_sec  := 0;
start_time_msec := 0;
k51_kb_func_calls := k51_kb_func_calls + ONE_8BYTE_CNT_GG00; (* PTS 1103743 JA 1999-08-25 *)
IF  g01vtrace.vtrTime_gg00 OR a01diag_monitor_on OR a01diag_analyze_on
THEN
    BEGIN
    vclock (start_time_sec, start_time_msec);
    IF  a01diag_monitor_on OR a01diag_analyze_on
    THEN
        b21m_reset_monitor (mblock.mb_trns^.trBdTcachePtr_gg00,
              NOT c_reset_sum);
    (*ENDIF*) 
    END;
&ifdef TRACE
(*ENDIF*) 
t01name      (kb_funct, '==================');
t01messblock (kb_funct, 'MESSBUF ----', mblock);
IF  t01trace (ak_isolev)
THEN
    BEGIN
    IF  (mblock.mb_type in [m_delete, m_insert, m_insert_select,
        m_select, m_select_row, m_update])
        AND (mblock.mb_type2 <> mm_device)
        AND (mblock.mb_type2 <> mm_log   )
    THEN
        BEGIN
        IF  
            NOT (ftsTemp_egg00 in mblock.mb_qual^.mtree.fileType_gg00)
            OR (mblock.mb_qual^.mtree.fileTfnTemp_gg00 <> ttfnPars_egg00)
        THEN
            BEGIN
            t01name      (ak_isolev, '  KB05 k05function');
            t01messtype  (ak_isolev, 'mess_type   ', mblock.mb_type);
            t01mess2type (ak_isolev, 'mess2_type  ', mblock.mb_type2);
            t01handling  (ak_isolev, 'handling    ',
                  mblock.mb_qual^.mtree.fileHandling_gg00)
            END
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END;
&endif
(*ENDIF*) 
IF  g01vtrace.vtrAll_gg00
THEN
    BEGIN
    WITH mess_trace.kbtkTabHead_gg11.kbtHead_gg11 DO
        BEGIN
        kbMessType_gg11  := mblock.mb_type;
        kbMessType2_gg11 := mblock.mb_type2;
        kbSubtrans_gg11  := mblock.mb_trns^.trSubtransId_gg00
        END;
    (*ENDWITH*) 
    len := sizeof (mess_trace.kbtkTabHead_gg11.kbtHead_gg11);
    IF  (mblock.mb_type in [m_delete, m_fetch, m_insert_select,
        m_select, m_select_row, m_update, m_update_rec])
        OR
        ((mblock.mb_type  =  m_insert ) AND
        ( mblock.mb_type2 <> mm_device) AND
        ( mblock.mb_type2 <> mm_log   ))
        OR
        ((mblock.mb_type  =  m_get   ) AND
        ( mblock.mb_type2 <> mm_pages) AND
        ( mblock.mb_type2 <> mm_read ))
    THEN
        (* write FileId into vtrace *)
        BEGIN
        mess_trace.kbtkTabHead_gg11.kbtTabId_gg11  := mblock.mb_qual^.mtree.fileTabId_gg00;
        mess_trace.kbtkTabHead_gg11.kbtKeyLen_gg11 := 0;
        len := sizeof (mess_trace.kbtkTabHead_gg11);
        IF  ((mblock.mb_type = m_update) AND
            (mblock.mb_type2 = mm_nil))
            OR
            ((mblock.mb_type = m_insert) AND (mblock.mb_type2 = mm_nil))
            OR
            ((mblock.mb_type = m_delete) AND (mblock.mb_type2 = mm_nil))
            OR
            ((mblock.mb_type = m_get) AND (mblock.mb_type2 <> mm_test))
            OR
            ((mblock.mb_type  = m_select_row) AND
            ( mblock.mb_type2 = mm_direct   ))
            OR
            (mblock.mb_type = m_update_rec)
        THEN
            (* write key into vtrace *)
            BEGIN
            keylen := mblock.mb_data^.mbp_keylen;
            mess_trace.kbtkTabHead_gg11.kbtKeyLen_gg11 := keylen;
            IF  len + keylen > sizeof (tgg11_VtraceBody)
            THEN
                keylen := sizeof (tgg11_VtraceBody) - len;
            (*ENDIF*) 
            g10mv1 ('VKB05 ',   1,    
                  mblock.mb_data_size, sizeof (mess_trace.kbtkKey_gg11),
                  mblock.mb_data^.mbp_key.k, 1,
                  mess_trace.kbtkKey_gg11, 1, keylen, mblock.mb_trns^.trError_gg00);
            len := len + keylen
            END
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  mblock.mb_trns^.trError_gg00 <> e_move_error
    THEN
        b120InsertTrace (mblock.mb_trns^, kb, vttKbFunctions_egg00, len, @mess_trace)
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  mblock.mb_trns^.trError_gg00 <> e_move_error
THEN
    CASE mblock.mb_type OF
        m_autosave (*
        =======    *):
            CASE mblock.mb_type2 OF
                mm_clear:
                    k38e_autosave_end (mblock.mb_trns^, c_quick);
                mm_last:
                    k38e_autosave_end (mblock.mb_trns^, NOT c_quick);
                mm_nil:
                    k38i_autosave_init (mblock);
                mm_outcopy:
                    k38sh_autosave_show (mblock);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_begin (*
        ======= *):
            BEGIN
            BeginSubtransSet := true;
            kb560BeginSubtransLogTransaction (mblock.mb_trns^);
            CASE mblock.mb_type2 OF
                mm_string:
                    k43begin_load (mblock);
                mm_key, mm_nokey:
                    k64begin_load (mblock);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
            END;
        m_change (*
        ======== *):
            BEGIN
            BeginSubtransSet := true;
            kb560BeginSubtransLogTransaction (mblock.mb_trns^);
            CASE mblock.mb_type2 OF
                mm_key, mm_table :
                    k66modify_table (mblock);
                mm_file :
                    k64change_filetype (mblock);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
            END;
        m_column   (*
        ========   *):
            CASE mblock.mb_type2 OF
                mm_copy:
                    BEGIN
                    BeginSubtransSet := true;
                    kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                    k43ccopy_column   (mblock);
                    END;
                mm_expand:
                    BEGIN
                    BeginSubtransSet := true;
                    kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                    k43cexpand_column (mblock);
                    END;
                mm_fread:
                    k44fread_column   (mblock);
                mm_fnull:
                    BEGIN
                    BeginSubtransSet := true;
                    kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                    k44fnull_column   (mblock);
                    END;
                mm_fwrite:
                    BEGIN
                    BeginSubtransSet := true;
                    kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                    k44fwrite_column  (mblock);
                    END;
                mm_length:
                    k45clength_column (mblock);
                mm_lock:
                    k43clock_column   (mblock);
                mm_new_read:
                    k45cnread_column  (mblock);
                mm_new_write:
                    BEGIN
                    BeginSubtransSet := true;
                    kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                    k43cnwrite_column (mblock);
                    END;
                mm_open:
                    k44copen_column   (mblock);
                mm_read:
                    k45cread_column   (mblock);
                mm_search:
                    k45csearch_column (mblock);
                mm_trunc:
                    BEGIN
                    BeginSubtransSet := true;
                    kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                    k43ctrunc_column  (mblock);
                    END;
                mm_write:
                    BEGIN
                    BeginSubtransSet := true;
                    kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                    k43cwrite_column  (mblock);
                    END;
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_column_statistic  (*
        ==================  *):
            k71column_statistic (mblock);
        m_commit   (*
        ========   *):
            IF  mblock.mb_type2 = mm_keep_lock
            THEN
                mblock.mb_trns^.trError_gg00 := e_not_implemented
            ELSE
                k53end_of_trans (mblock);
            (*ENDIF*) 
        m_connect   (*
        =========   *):
            k53connect (mblock);
        m_copy_tempfile (*
        =============== *):
            k35temp_outcopy (mblock);
        m_create_index   (*
        ==============   *):
            BEGIN
            BeginSubtransSet := true;
            kb560BeginSubtransLogTransaction (mblock.mb_trns^);
            IF  mblock.mb_type2 <> mm_participant
            THEN
                k33create_index (mblock)
            ELSE
                mblock.mb_trns^.trError_gg00 := e_not_implemented;
            (*ENDIF*) 
            END;
        m_create_table (*
        ============== *):
            BEGIN
            BeginSubtransSet := true;
            kb560BeginSubtransLogTransaction (mblock.mb_trns^);
            IF  ftsTemp_egg00 in mblock.mb_qual^.mtree.fileType_gg00
            THEN
                k54create_drop_temp_file (mblock.mb_trns^,
                      mblock.mb_type, mblock.mb_qual^.mtree)
            ELSE
                k64table_create (mblock);
            (*ENDIF*) 
            END;
        m_down  (*
        ======  *):
            IF  mblock.mb_type2 = mm_user
            THEN
                k50not_connected (mblock)
            ELSE
                mblock.mb_trns^.trError_gg00 := e_not_implemented;
            (*ENDIF*) 
        m_delete, m_update   (*
        ==================   *):
            BEGIN
            BeginSubtransSet := true;
            kb560BeginSubtransLogTransaction (mblock.mb_trns^);
            IF  (mblock.mb_type2 = mm_qual       ) OR
                (mblock.mb_type2 = mm_empty      ) OR
                (mblock.mb_type2 = mm_qual_no_opt)
            THEN
                BEGIN
                mblock.mb_trns^.trRteCommPtr_gg00^.file_record_cnt := 0;
                (* in file_record_cnt the deletes pages are counted *)
                k61del_upd_qual (mblock)
                END
            ELSE
                k61ins_del_upd (mblock);
            (*ENDIF*) 
            END;
        m_destroy_temp   (*
        ==============   *):
            k64temp_file_handling (mblock);
        m_diagnose   (*
        ==========   *):
            CASE mblock.mb_type2 OF
                mm_dump:
                    k37dump (mblock);
                mm_index:
                    k33create_index (mblock);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_drop (*
        ====== *):
            BEGIN
            BeginSubtransSet := true;
            kb560BeginSubtransLogTransaction (mblock.mb_trns^);
            IF  (mblock.mb_type2 = mm_table) AND
                (mblock.mb_qual^.mtree.fileTfn_gg00 = tfnTemp_egg00)
            THEN
                k54create_drop_temp_file (mblock.mb_trns^,
                      mblock.mb_type, mblock.mb_qual^.mtree)
            ELSE
                k64cmd_drop (mblock);
            (*ENDIF*) 
            END;
        m_eval   (*
        ======   *):
            CASE mblock.mb_type2 OF
                mm_pages, mm_key, mm_table:
                    k721eval_pagecount (mblock);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_fetch   (*
        =======   *):
            k75_fetch (mblock);
        m_flush   (*
        =======   *):
            WITH mblock DO
                BEGIN
                mb_struct       := mbs_result;
                mb_type         := m_return_result;
                mb_type2        := mm_nil;
                mb_qual_len     := 0;
                mb_data_len     := 0;
                mb_trns^.trError_gg00 := e_ok
                END;
            (*ENDWITH*) 
        m_get   (*
        =====   *):
            WITH mblock DO
                CASE mb_type2 OF
                    mm_read, mm_pages:
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    OTHERWISE:
                        BEGIN
                        k71get (mblock);
                        IF  mb_trns^.trError_gg00 <> e_ok
                        THEN
                            BEGIN
                            mb_struct    := mbs_nil;
                            mb_type      := m_return_error;
                            mb_type2     := mm_nil;
                            mb_qual_len  := 0;
                            mb_data_len  := 0
                            END
                        (*ENDIF*) 
                        END;
                    END;
                (*ENDCASE*) 
            (*ENDWITH*) 
        m_index_statistic, m_table_statistic   (*
        ====================================   *):
            k71file_statistic (mblock);
        m_insert   (*
        ========   *):
            IF  (mblock.mb_type2 = mm_device) OR
                (mblock.mb_type2 = mm_log   )
            THEN
                k06add_config (mblock, NOT c_cold)
            ELSE
                BEGIN
                BeginSubtransSet := true;
                kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                k61ins_del_upd (mblock);
                END;
            (*ENDIF*) 
        m_insert_select   (*
        ===============   *):
            BEGIN
            BeginSubtransSet := true;
            kb560BeginSubtransLogTransaction (mblock.mb_trns^);
            k61table_ins_del_upd (mblock);
            END;
        m_key   (*
        ======  *):
            k721read_subquery (mblock);
        m_lock   (*
        ======   *):
            k53lock_command (mblock);
        m_mend   (*
        ======   *):
            k64end_load (mblock);
        m_move   (*
        =======   *):
            k64temp_file_handling (mblock);
        m_nextval   (*
        =======   *):
            k57sequence_no (mblock);
        (* PTS 1107952 E.Z. *)
        m_release   (*
        =========   *):
            k53release (mblock.mb_trns^, mblock.mb_type2 = mm_ignore);
        m_reload, m_unload   (*
        ==================   *):
            BEGIN
            BeginSubtransSet := true;
            kb560BeginSubtransLogTransaction (mblock.mb_trns^);
            k64unload_reload (mblock);
            END;
        (* PTS 1115982 E.Z. *)
        m_rollback   (*
        ==========   *):
            CASE mblock.mb_type2 OF
                mm_keep_lock,
                mm_subtrans:
                    mblock.mb_trns^.trError_gg00 := e_not_implemented;
                OTHERWISE
                    k53end_of_trans (mblock)
                END;
            (*ENDCASE*) 
        m_save, m_save_overwrite   (*
        ========================   *):
            CASE mblock.mb_type2 OF
                mm_pages:
                    k35save_data (mblock);
                mm_log:
                    k35log_save (mblock, NOT c_cold);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_save_parallel  (*
        ===============  *):
            CASE mblock.mb_type2 OF
                mm_database, mm_pages:
                    k35save_data (mblock);
                mm_log:
                    k35log_save (mblock, NOT c_cold);
                mm_newtape, mm_abort, mm_ignore,
                mm_fread, mm_fwrite, mm_string:
                    k38headmaster (mblock);
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_select   (*
        ========   *):
            IF  (mblock.mb_type2 = mm_with_join) OR
                (mblock.mb_type2 = mm_join_with_last_tab)
            THEN
                k74_join_select (mblock)
            ELSE
                k720_single_select (mblock);
            (*ENDIF*) 
        m_select_row   (*
        ============   *):
            BEGIN
            k71select (mblock);
            IF  mblock.mb_trns^.trError_gg00 <> e_ok
            THEN
                WITH mblock DO
                    BEGIN
                    mb_struct    := mbs_nil;
                    mb_type      := m_return_error;
                    mb_type2     := mm_nil;
                    mb_qual_len  := 0;
                    mb_data_len  := 0
                    END
                (*ENDWITH*) 
            (*ENDIF*) 
            END;
        m_set   (*
        =====   *):
            CASE mblock.mb_type2 OF
                mm_end_read_only:
                    BEGIN
                    kb560StartSavepoint (mblock.mb_trns^, mm_end_read_only);
                    IF  mblock.mb_trns^.trError_gg00 = e_ok
                    THEN
                        b01end_read_only (mblock.mb_trns^)
                    (*ENDIF*) 
                    END;
                mm_pages:
                    BEGIN
                    BeginSubtransSet := true;
                    kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                    k64set_treeleafnodes (mblock);
                    END;
                mm_write_on:
                    IF  mblock.mb_qual_len  = MB_PART1_HEAD_MXGG00
                    THEN
                        BEGIN
                        BeginSubtransSet := true;
                        kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                        k64set_read_only_file (mblock)
                        END
                    ELSE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    (*ENDIF*) 
                mm_write_off:
                    IF  mblock.mb_qual_len  = MB_PART1_HEAD_MXGG00
                    THEN
                        BEGIN
                        BeginSubtransSet := true;
                        kb560BeginSubtransLogTransaction (mblock.mb_trns^);
                        k64set_read_only_file (mblock)
                        END
                    ELSE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    (*ENDIF*) 
                OTHERWISE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented
                END;
            (*ENDCASE*) 
        m_show   (*
        ======   *):
            k52show_lock (mblock);
        m_shutdown   (*
        ==========   *):
            k28shutdown (mblock.mb_trns^);
        m_stamp   (*
        =======   *):
            k57stamp (mblock);
        m_succ_file_version   (*
        ===================   *):
            BEGIN
            BeginSubtransSet := true;
            kb560BeginSubtransLogTransaction (mblock.mb_trns^);
            k64set_file_version (mblock);
            END;
        m_union   (*
        =======   *):
            k722_union_select (mblock);
        m_unlock   (*
        ========   *):
            IF  mblock.mb_type2 = mm_table
            THEN
                (* PTS 1103526 JA 1999-09-03 *)
                WITH mblock.mb_trns^ DO
                    k51sys_share_remove (trTaskId_gg00, trIndex_gg00, trState_gg00)
                (*ENDWITH*) 
            ELSE
                k53unlock (mblock);
            (*ENDIF*) 
        m_update_rec   (*
        ============   *):
            BEGIN
            BeginSubtransSet := true;
            kb560BeginSubtransLogTransaction (mblock.mb_trns^);
            k61ins_del_upd (mblock);
            END;
        m_verify       (*
        ============   *):
            CASE mblock.mb_type2 OF
                (* PTS 1108979 E.Z. *)
                mm_table :
                    k35check_table (mblock, NOT c_with_lock);
                mm_lock :
                    k35check_table (mblock,     c_with_lock);
                mm_participant :
                    mblock.mb_trns^.trError_gg00 := e_not_implemented;
                OTHERWISE
                    k35verify (mblock, NOT c_cold)
                END;
            (*ENDCASE*) 
        OTHERWISE
            mblock.mb_trns^.trError_gg00 := e_not_implemented
        END;
    (*ENDCASE*) 
(*ENDIF*) 
IF  mblock.mb_trns^.trError_gg00 <> e_ok
THEN
    kb05ReturnErrorHandling (mblock.mb_trns^, BeginSubtransSet, StartMessType)
ELSE
    IF  BeginSubtransSet
    THEN
        kb560EndSubtransLogTransaction (mblock.mb_trns^);
    (*ENDIF*) 
(*ENDIF*) 
IF  ((mblock.mb_type <> m_return_result) OR
    ( mblock.mb_trns^.trError_gg00 <> e_ok  ))
    AND
    (mblock.mb_trns^.trError_gg00 <> e_wait_for_lock_release)
    AND
    (StartMessType <> m_save_parallel   )
    AND
    (StartMessType <> m_restore_parallel)
THEN
    BEGIN
    mblock.mb_struct := mbs_nil;
    mblock.mb_type   := m_return_error;
    mblock.mb_type2  := mm_nil;
    IF  (StartMessType <> m_verify) AND
        (
        ((mblock.mb_trns^.trError_gg00 <> e_no_next_record) AND
        ( mblock.mb_trns^.trError_gg00 <> e_key_not_found))
        OR
        (mblock.mb_qual_len  <> MB_PART1_HEAD_MXGG00 +
        cgg_return_stack_entries * STACK_ENTRY_MXGG00)
        )
    THEN
        mblock.mb_qual_len := 0;
    (*ENDIF*) 
    IF  (StartMessType <> m_fetch) OR
        (mblock.mb_trns^.trError_gg00 <> e_no_next_record)
    THEN
        mblock.mb_data_len := 0
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  g01vtrace.vtrAll_gg00
THEN
    BEGIN
    IF  g01vtrace.vtrTime_gg00
    THEN
        BEGIN
        vclock (stop_time_sec, stop_time_msec);
        diff_sec  := stop_time_sec - start_time_sec;
        diff_msec := stop_time_msec - start_time_msec;
        IF  stop_time_msec < start_time_msec
        THEN
            BEGIN
            diff_sec  := diff_sec  - 1;
            diff_msec := diff_msec + 1000000 ;
            END
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    WITH mess_time_trace.kbtmHead_gg11 DO
        BEGIN
        IF  (mblock.mb_type = m_return_result) AND (mblock.mb_trns^.trError_gg00 = e_ok)
        THEN
            kbMessType_gg11 := m_return_result
        ELSE
            kbMessType_gg11 := m_return_error;
        (*ENDIF*) 
        kbMessType2_gg11 := mm_nil;
        kbError_gg11     := mblock.mb_trns^.trError_gg00
        END;
    (*ENDWITH*) 
    IF  g01vtrace.vtrTime_gg00
    THEN
        BEGIN
        mess_time_trace.kbtmHead_gg11.kbMessType2_gg11 := mm_test;
        mess_time_trace.kbtmSec_gg11  := diff_sec;
        mess_time_trace.kbtmMsec_gg11 := diff_msec;
        len := sizeof (mess_time_trace)
        END
    ELSE
        len := sizeof (mess_time_trace.kbtmHead_gg11);
    (*ENDIF*) 
    b120InsertTrace (mblock.mb_trns^, kb, vttKbFunctions_egg00, len, @mess_time_trace);
    END;
&ifdef TRACE
(*ENDIF*) 
t01messblock (kb_funct, 'RETURN MBUF ', mblock);
&ifdef NOTUSED
WITH mblock.mb_trns^ DO
    IF  ((trTaskId_gg00 > 0) AND
        ( trTaskId_gg00 <= MAX_STACK_GG00))
    THEN
        BEGIN
        t01messmaxstack (st_stack, 'maxstack    ', StartMessType,
              tdmaxstack[trTaskId_gg00] - startstack);
        END;
&   endif
&   endif
    (*ENDIF*) 
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k05init;
 
BEGIN
kb03CheckInit;        (* PTS 1103957 JA 1999-09-15 *)
k35set_not_generated; (* PTS 1000431 UH *)
k38set_not_generated;
k51set_not_generated;
k57set_not_generated
END;
 
(*------------------------------*) 
 
FUNCTION
      k05is_fatal_error (e : tgg00_BasisError): boolean;
 
BEGIN
CASE e OF
    e_bad_fdir,
    e_bad_logpage,
    e_disk_not_accessible,
    e_illegal_branchlength,
    e_illegal_entrylength,
    e_illegal_entrypos,
    e_illegal_keylength,
    e_illegal_page_no,
    e_invalid_entrypos,
    e_invalid_index_structure,
    e_invalid_leaves_structure,
    e_no_converter_entry,
    e_page_in_wrong_tree,
    e_illegal_page_address,
    e_invalid_fbm_mark,
    e_log_error,
    e_net_error,
    e_sysbuffer_overflow,
    e_corrupted_datapage_from_io,
    e_xstart_required:
        k05is_fatal_error := true;
    OTHERWISE
        k05is_fatal_error := false
    END
(*ENDCASE*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb05AddRecord (
            VAR Trans   : tgg00_TransContext;
            VAR FileId  : tgg00_FileId;
            VAR Buf     : tgg00_Rec);
 
BEGIN
(* CR 1104870 TS 1999-12-02 *)
b02add_record (Trans, FileId, Buf);
IF  (e_ok <> Trans.trError_gg00)
THEN
    BEGIN
    IF  k05is_fatal_error (Trans.trError_gg00)
    THEN
        k28emergency_shutdown (Trans, m_insert)
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb05DelRecord (
            VAR Trans   : tgg00_TransContext;
            VAR FileId  : tgg00_FileId;
            VAR Key     : tgg00_Lkey);
 
BEGIN
(* CR 1104870 TS 1999-12-02 *)
b02del_record (Trans, FileId, Key);
IF  (e_ok <> Trans.trError_gg00)
THEN
    BEGIN
    IF  k05is_fatal_error (Trans.trError_gg00)
    THEN
        k28emergency_shutdown (Trans, m_delete)
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
(* PTS 1117472 E.Z. *)
(*------------------------------*) 
 
PROCEDURE
      kb05GetBadLogVolume (VAR mblock : tgg00_MessBlock);
 
VAR
      DevName       : tsp00_VFilename;
 
BEGIN
kb35GetBadLogVolume(mblock.mb_trns^, DevName);
IF  mblock.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    mblock.mb_data^.mbp_buf[1] := csp_ascii_blank;
    g10mv ('VKB05 ',   2,    
          sizeof(DevName), mblock.mb_data_size,
          DevName, 1, mblock.mb_data^.mbp_buf, 2,
          sizeof(DevName), mblock.mb_trns^.trError_gg00);
    mblock.mb_data_len := 1 + sizeof(DevName);
    mblock.mb_type := m_return_result;
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb05GetRecord (
            VAR Trans   : tgg00_TransContext;
            VAR FileId  : tgg00_FileId;
            VAR Key     : tgg00_Lkey;
            VAR Buf     : tgg00_Rec);
 
BEGIN
(* CR 1104870 TS 1999-12-02 *)
b02get_record (Trans, FileId, Key, Buf);
IF  (e_ok <> Trans.trError_gg00)
THEN
    BEGIN
    IF  k05is_fatal_error (Trans.trError_gg00)
    THEN
        k28emergency_shutdown (Trans, m_get)
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb05ReplRecord (
            VAR Trans   : tgg00_TransContext;
            VAR FileId  : tgg00_FileId;
            VAR Buf     : tgg00_Rec);
 
BEGIN
(* CR 1104870 TS 1999-12-02 *)
b02repl_record (Trans, FileId, Buf);
IF  (e_ok <> Trans.trError_gg00)
THEN
    BEGIN
    IF  k05is_fatal_error (Trans.trError_gg00)
    THEN
        k28emergency_shutdown (Trans, m_update)
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb05ReturnErrorHandling (VAR Trans : tgg00_TransContext;
            BeginSubtransSet : boolean;
            StartMessType    : tgg00_MessType);
      (******** hkb05.h ********)
 
VAR
      AuxError : tgg00_BasisError;
 
BEGIN
IF  Trans.trError_gg00 <> e_ok
THEN
    BEGIN
    IF  Trans.trError_gg00 = e_cancelled
    THEN
        BEGIN
        k51examine_trans (Trans);
        IF  Trans.trError_gg00 = e_ok
        THEN
            Trans.trError_gg00 := e_cancelled
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  k05is_fatal_error (Trans.trError_gg00)
    THEN
        BEGIN
        IF  NOT (
            (StartMessType = m_verify)
            AND
            ((Trans.trError_gg00 = e_invalid_leaves_structure) OR
            ( Trans.trError_gg00 = e_invalid_index_structure ) OR
            ( Trans.trError_gg00 = e_page_in_wrong_tree      ) OR
            ( Trans.trError_gg00 = e_no_converter_entry      ) OR (* PTS 1106076 TS 2000-04-25 *)
            ( Trans.trError_gg00 = e_bad_datapage            ) OR
            ( Trans.trError_gg00 = e_illegal_entrypos        ))  (* PTS 1105530 TS 2000-02-08 *)
            )
        THEN
            k28emergency_shutdown (Trans, StartMessType)
        (*ENDIF*) 
        END
    ELSE
        IF  (Trans.trError_gg00 <> e_new_hostfile_required) AND
            (Trans.trError_gg00 <> e_rollback_wanted      ) AND
            (Trans.trError_gg00 <> e_shutdown             ) AND
            (Trans.trError_gg00 <> e_trans_already_working) AND
            (Trans.trError_gg00 <> e_work_rolled_back     ) AND
            (Trans.trError_gg00 <> e_wait_for_lock_release) AND
            (StartMessType      <> m_restart              ) AND
            (StartMessType      <> m_save_parallel        )
        THEN
            BEGIN
            AuxError           := Trans.trError_gg00;
            Trans.trError_gg00 := e_ok;
            k51examine_trans (Trans);
            IF  BeginSubtransSet
            THEN
                kb560RollbackLogTransAction (Trans, mm_nil, Trans.trSubtransId_gg00);
            (*ENDIF*) 
            IF  Trans.trError_gg00 = e_ok
            THEN
                Trans.trError_gg00 := AuxError
            (*ENDIF*) 
            END
        ELSE
            IF  BeginSubtransSet
            THEN
                kb560EndSubtransLogTransaction (Trans);
            (*ENDIF*) 
        (*ENDIF*) 
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        399
*-PRETTY-*  lines of code :       1202        PRETTYX 3.10 
*-PRETTY-*  lines in file :       2011         1997-12-10 
.PA 
