/****************************************************************************
  module      : vkb35
  author      : JuergenA
  responsible : UweH
  special area: KB_utility
  see also    :
  description :
*****************************************************************************/
 
.tt 1 $SAP$LiveCache$VKB35$
.tt 3 $UweH$KB_utility$2000-11-22$
 
.nf
 
 
    ========== licence begin  GPL
    Copyright (C) 2000 SAP AG
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end
 
.fo
***********************************************************
 
Module  : KB_utility
 
Define  :
 
        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
              k35dump_utility (VAR hostfile : tgg00_VfFileref;
                    VAR buf      : tsp00_Page;
                    VAR out_pno  : tsp00_Int4;
                    VAR out_pos  : integer;
                    VAR host_err : tsp00_VfReturn;
                    VAR errtext  : tsp00_ErrText);
 
        PROCEDURE
              k35end_clear_diag (VAR t : tgg00_TransContext);
 
        PROCEDURE
              k35get_restart_version (VAR m : tgg00_MessBlock);
 
        FUNCTION
              k35is_check_save : boolean;
 
        PROCEDURE
              k35log_restore (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35log_save (VAR m : tgg00_MessBlock;
                    is_cold : boolean);
 
        PROCEDURE
              k35new_buf_addr (buf_addr : tkb00_PagePtr);
 
        PROCEDURE
              k35OmsGetShutdownInfo (VAR Trans : tgg00_TransContext;
                    VAR WasShutdowned : 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
              k35UtilIdGet (TaskId : tsp00_TaskId;
                    VAR UtilId : tgg00_UtilCmdId);
 
        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 );
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              KB_init_config : VKB06;
 
        PROCEDURE
              k06shutdown_filesystem (VAR t : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              KB_diagnose_outcopy : VKB37;
 
        PROCEDURE
              k37diagnose_outcopy (VAR t : tgg00_TransContext;
                    ptr             : tkb00_PagePtr;
                    VAR databuf     : tsp00_MoveObj;
                    databuf_size    : tsp00_Int4;
                    VAR databuf_len : tsp00_Int4;
                    devno           : tsp00_Int2;
                    devtype         : tsp2_dev_type;
                    diag_type       : tgg00_DiagType;
                    VAR pno         : tsp00_PageNo;
                    stop_pno        : tsp00_PageNo;
                    VAR out_count   : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              KB_headmaster: VKB38 ;
 
        FUNCTION
              k38is_on_autosave (VAR t : tgg00_TransContext;
                    in_region : boolean) : boolean;
 
        PROCEDURE
              k38headmaster (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k38history_error_write (VAR utilcmd_id : tgg00_UtilCmdId;
                    save_type1 : tgg00_MessType;
                    save_type2 : tgg00_MessType2;
                    is_cold    : boolean;
                    backup_no  : tsp00_Int4;
                    err_reason : tgg00_BasisError);
 
        PROCEDURE
              k38init_restore (VAR m : tgg00_MessBlock;
                    is_check_save : boolean);
 
        PROCEDURE
              k38init_save (VAR m          : tgg00_MessBlock;
                    is_cold                : boolean;
                    complete_log           : boolean;
                    destructive_tape_check : boolean);
 
        FUNCTION
              k38is_complete_log_segment (VAR mblock : tgg00_MessBlock) : boolean;
 
      ------------------------------ 
 
        FROM
              KB_transaction : VKB53;
 
        PROCEDURE
              k53wait (VAR t  : tgg00_TransContext;
                    MessType  : tgg00_MessType;
                    MessType2 : tgg00_MessType2);
 
        PROCEDURE
              k53perm_temp_lock (VAR t : tgg00_TransContext;
                    lock_unlock    : tgg00_MessType;
                    lock_mode      : tgg00_LockReqMode;
                    lock_handling  : tgg00_HandlingSet;
                    VAR lock_tabid : tgg00_Surrogate;
                    VAR k          : tgg00_Lkey);
 
      ------------------------------ 
 
        FROM
              KB_Logging : VKB560;
 
        PROCEDURE
              kb560ClearArchiveLog (TaskId : tsp00_TaskId);
 
        PROCEDURE
              kb560GetRestartVersion (taskid : tsp00_TaskId;
                    VAR firstiosequence      : tsp00_Int4;
                    VAR dbident              : tsp00_Line;
                    VAR log_devspace_enabled : boolean);
 
        PROCEDURE
              kb560StartSavepointAndWait (VAR Trans : tgg00_TransContext;
                    MessType2 : tgg00_MessType2);
 
        PROCEDURE
              kb560InitLogForLogSave (TaskId : tsp00_TaskId;
                    VAR TrError : tgg00_BasisError);
 
        PROCEDURE
              kb560ConvertInvalidIOSeqToLPNo ( VAR ioSeq : tsp00_PageNo);
 
        FUNCTION
              kb560IsValidIOSeq( ioSeq : tsp00_PageNo) : boolean;
 
        FUNCTION
              kb560IsGreaterIOSeq ( leftOperand : tsp00_PageNo ;
                    rightOperand : tsp00_PageNo)
                    : boolean;
 
      ------------------------------ 
 
        FROM
              KB_restart_record : VKB57;
 
        VAR
              k57restartrec : tkb00_PagePtr;
 
        PROCEDURE
              k57save_restartrecord (TaskId : tsp00_TaskId);
 
        PROCEDURE
              kb57RestoreRestartRecord (TaskId : tsp00_TaskId);
 
      ------------------------------ 
 
        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
              AK_cold_utility_functions : VAK36;
 
        PROCEDURE
              a36dg_tablename_get (VAR t : tgg00_TransContext;
                    VAR tabid     : tgg_surrogate;
                    VAR owner_id  : tgg_surrogate;
                    VAR tablename : tsp_knl_identifier);
 
        PROCEDURE
              a36dg_username_get (VAR t : tgg00_TransContext;
                    VAR user_id  : tgg_surrogate;
                    VAR username : tsp_knl_identifier);
 
        PROCEDURE
              a36get_catalog_record (VAR t : tgg00_TransContext;
                    VAR sysk   : tgg00_Lkey;
                    VAR sysbuf : tgg00_Rec);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_1 : VBD01;
 
        VAR
              b01downfilesystem : boolean;
              b01niltree_id     : tgg00_FileId;
 
        PROCEDURE
              b01check_table (VAR t : tgg00_TransContext;
                    VAR file_id          : tgg00_FileId;
                    long_col_cnt         : tsp00_Int2;
                    new_long_col_cnt     : tsp00_Int2;
                    check_long_existence : boolean);
 
        PROCEDURE
              b01filestate (VAR t : tgg00_TransContext;
                    VAR file_id   : tgg00_FileId);
 
        PROCEDURE
              b01restart_filesystem (VAR t : tgg00_TransContext;
                    IncrementConvVersion : boolean);
 
        PROCEDURE
              b01verify_database (
                    VAR t                 : tgg00_TransContext;
                    bWithUpdate           : boolean;
                    bWithIndexes          : boolean;
                    VAR NumPermPages      : tsp00_Int4;
                    VAR NumReleasedBlocks : tsp00_Int4;
                    VAR bad_index_cnt     : tsp00_Int4;
                    VAR total_bad_cnt     : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_2 : VBD02;
 
        PROCEDURE
              b02file_outcopy (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_8 : VBD08;
 
        PROCEDURE
              b08tstart_treediagnose (VAR t : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              pagestore: VBD10;
 
        PROCEDURE
              bd10BeginSavePages (TaskId : tsp00_TaskId);
 
        PROCEDURE
              bd10BeginSaveData (TaskId : tsp00_TaskId);
 
        PROCEDURE
              bd10EndSave ( TaskId: tsp00_TaskId;
                    bBackUpSuccessfull : boolean);
 
        PROCEDURE
              bd10FlushConverterForColdSave (
                    VAR Trans                      : tgg00_TransContext;
                    VAR PackedConvRootBlockAddress : tsp00_Int4);
 
        PROCEDURE
              bd10GetBlockAddress(
                    VAR Trans   : tgg00_TransContext;
                    PageNo      : tsp00_PageNo;
                    bIsDynamic  : boolean;
                    VAR DevNo   : tsp00_Int2;
                    VAR BlockNo : tsp00_Int4 );
 
      ------------------------------ 
 
        FROM
              backup_and_restore : VBD14;
 
        PROCEDURE
              bd14RestartFileSystemForSaveDataCold (
                    VAR Trans : tgg00_TransContext);
 
        PROCEDURE
              bd14ShutdownFileSystemAfterSaveDataCold (
                    TaskId : tsp00_TaskId);
 
      ------------------------------ 
 
        FROM
              BD_Wrapper : VBD999;
 
        PROCEDURE
              bd999AttachOneDataDevice(
                    TaskId      : tsp00_TaskId;
                    DevNo       : tsp00_Int2;
                    VAR TrError : tgg00_BasisError);
 
        PROCEDURE
              bd999AttachOneLogDevice(
                    TaskId      : tsp00_TaskId;
                    DevNo       : tsp00_Int2;
                    VAR TrError : tgg00_BasisError);
 
        FUNCTION
              bd999AttachAllArchiveLogs( TaskId  : tsp00_TaskId ) : boolean;
 
        PROCEDURE
              bd999DetachAllArchiveLogs( TaskId : tsp00_TaskId );
 
        PROCEDURE
              bd999DetachAllDevices( TaskId : tsp00_TaskId );
 
        PROCEDURE
              bd999EnableBadDevSpace(
                    TaskId      : tsp00_TaskId;
                    VAR DevName : tsp00_VFilename;
                    VAR TrError : tgg00_BasisError );
 
        PROCEDURE
              bd999GetBadLogVolume(
                    TaskId      : tsp00_TaskId;
                    VAR DevName : tsp00_VFilename;
                    VAR TrError : tgg00_BasisError );
 
        PROCEDURE
              bd999GetDataDevName(
                    DevNo        : tsp00_Int2;
                    VAR  DevName : tsp00_VFilename);
 
        FUNCTION
              bd999GetDataDevNo(
                    VAR  DevName : tsp00_VFilename;
                    VAR  DevNo   : tsp00_Int2) : boolean;
 
        FUNCTION
              bd999GetLogDevNo(
                    VAR  DevName : tsp00_VFilename;
                    VAR  DevNo   : tsp00_Int2) : boolean;
 
        PROCEDURE
              bd999ReadDataPageDirect(
                    TaskId      : tsp00_TaskId;
                    DevNo       : tsp00_Int2;
                    BlockNo     : tsp00_Int4;
                    VAR pPage   : tkb00_PagePtr;
                    VAR TrError : tgg00_BasisError);
 
        PROCEDURE
              bd999ReIntegrateBadLogVolume(
                    TaskId      : tsp00_TaskId;
                    VAR DevName : tsp00_VFilename;
                    VAR TrError : tgg00_BasisError );
 
        PROCEDURE
              bd999WriteDataPageDirect(
                    TaskId      : tsp00_TaskId;
                    DevNo       : tsp00_Int2;
                    BlockNo     : tsp00_Int4;
                    VAR pPage   : tkb00_PagePtr;
                    VAR TrError : tgg00_BasisError);
 
        PROCEDURE
              bd999WriteLogPageDirect(
                    TaskId      : tsp00_TaskId;
                    DevNo       : tsp00_Int2;
                    BlockNo     : tsp00_Int4;
                    VAR pPage   : tkb00_PagePtr;
                    VAR TrError : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01code      : tgg_code_globals;
              g01localsite : tgg_serverdb_no;
 
        FUNCTION
              g01is_livecache : boolean;
 
        PROCEDURE
              g01new_dump_page (VAR hostfile : tgg_vf_fileref;
                    VAR buf      : tsp_page;
                    VAR out_pno  : tsp_int4;
                    VAR out_pos  : integer;
                    VAR host_err : tsp_vf_return;
                    VAR errtext  : tsp_errtext);
 
        PROCEDURE
              g01optextmsg (msg_prio : tsp3_priority;
                    msg_type  : tsp3_msg_type;
                    msg_no    : tsp_int4;
                    msg_label : tsp_c8;
                    msg_text  : tsp_c40);
 
      ------------------------------ 
 
        FROM
              Select_Help_Procedures : VGG04;
 
        FUNCTION
              gg04IsStaticPage (PageType2 : tgg00_PageType2) : boolean;
 
      ------------------------------ 
 
        FROM
              Regions_and_Longwaits : VGG08;
 
        VAR
              g08savepoint : tsp00_RegionId;
              g08surrogate : tsp00_RegionId;
 
      ------------------------------ 
 
        FROM
              GG_edit_routines : VGG17;
 
        PROCEDURE
              g17hexto_line (c : char;
                    VAR ln_len : integer;
                    VAR ln     : tsp00_C12);
 
        PROCEDURE
              g17int4to_line (int : tsp00_Int4;
                    with_zero : boolean;
                    int_len   : integer;
                    ln_pos    : integer;
                    VAR ln    : tsp00_Line);
 
      ------------------------------ 
 
        FROM
              RTE_kernel : VEN101;
 
        PROCEDURE
              vbegexcl (pid : tsp_process_id;
                    region  : tsp_region_id);
 
        PROCEDURE
              vendexcl (pid : tsp_process_id;
                    region  : tsp_region_id);
 
        PROCEDURE
              vfwrite (hostfileno : tsp_int4;
                    buf           : tsp_vf_bufaddr;
                    VAR error     : tsp_vf_return;
                    VAR errtext   : tsp_errtext);
 
        PROCEDURE
              vtime_in_seconds (VAR time_in_sec : tsp_int4);
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG10;
 
        PROCEDURE
              g10mv (mod_id  : tsp_c6;              mod_num  : tsp_int4;
                    src_upb  : tsp_int4;            dest_upb : tsp_int4;
                    VAR src  : tsp00_KnlIdentifier; src_pos  : tsp_int4;
                    VAR dest : tsp00_Buf;           dest_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;          destin_upb : tsp_int4;
                    VAR source : tgg00_FileId;      source_pos : tsp_int4;
                    VAR destin : tsp00_Page;        destin_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_Buf;         source_pos : tsp_int4;
                    VAR destin : tgg00_Surrogate;   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 : tsp00_Buf;         source_pos : tsp_int4;
                    VAR destin : tsp00_Key;         destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv4 (mod_id   : tsp_c6;            mod_num    : tsp_int4;
                    source_upb : tsp_int4;          destin_upb : tsp_int4;
                    VAR source : tsp00_C8;          source_pos : tsp_int4;
                    VAR destin : tsp00_Page;        destin_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_Page;        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;
                    src_upb  : tsp_int4;            dest_upb : tsp_int4;
                    VAR src  : tsp00_KnlIdentifier; src_pos  : tsp_int4;
                    VAR dest : tsp00_Key;           dest_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 : tkb00_Page;        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 : tsp00_Line;      source_pos : tsp_int4;
                    VAR destin : tsp_moveobj;     destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv10 (mod_id   : tsp_c6;          mod_num    : tsp_int4;
                    source_upb : tsp_int4;        destin_upb : tsp_int4;
                    VAR source : tsp00_NodeId;    source_pos : tsp_int4;
                    VAR destin : tsp_moveobj;     destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
        PROCEDURE
              g10mv12 (mod_id  : tsp_c6;            mod_num    : tsp_int4;
                    source_upb : tsp_int4;          destin_upb : tsp_int4;
                    VAR source : tsp00_Line;        source_pos : tsp_int4;
                    VAR destin : tsp00_Buf;         destin_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR err    : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-20 : VSP20;
 
        PROCEDURE
              s20ch4 (val    : tsp_int4;
                    VAR dest : tsp00_Page;
                    di       : tsp_int4);
 
        PROCEDURE
              s20ch4sw (val    : tsp_int4;
                    sourceswap : tsp_swap_kind;
                    VAR destin : tsp00_C4;
                    di         : tsp_int4;
                    destswap   : tsp_swap_kind);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-30 : VSP30;
 
        PROCEDURE
              s30cmp (VAR buf1   : tsp00_C10;
                    fieldpos1    : tsp_int4;
                    fieldlength1 : tsp_int4;
                    VAR buf2     : tsp2_devname;
                    fieldpos2    : tsp_int4;
                    fieldlength2 : tsp_int4;
                    VAR l_result : tsp_lcomp_result);
 
      ------------------------------ 
 
        FROM
              PUT-Conversions : VSP41;
 
        PROCEDURE
              s41p4int (
                    VAR buf : tsp_moveobj;
                    pos     : tsp_int4;
                    source  : tsp_int4;
                    VAR res : tsp_num_error);
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01int4 (layer : tgg00_Debug;
                    nam : tsp00_Sname;
                    int : tsp00_Int4);
&       endif
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        PROCEDURE
              k37diagnose_outcopy;
 
              tsp00_Page tsp00_MoveObj
 
        PROCEDURE
              a36get_catalog_record;
 
              tgg_sysinfokey   tgg00_Lkey
              tak_systembuffer tgg00_Rec
 
        PROCEDURE
              g10mv;
 
              tsp_moveobj tsp00_KnlIdentifier
              tsp_moveobj tsp00_Buf
 
        PROCEDURE
              g10mv1;
 
              tsp_moveobj tgg00_FileId
              tsp_moveobj tsp00_Page
 
        PROCEDURE
              g10mv2;
 
              tsp_moveobj tsp00_Buf
              tsp_moveobj tgg00_Surrogate
 
        PROCEDURE
              g10mv3;
 
              tsp_moveobj tsp00_Buf
              tsp_moveobj tsp00_Key
 
        PROCEDURE
              g10mv4;
 
              tsp_moveobj tsp00_C8
              tsp_moveobj tsp00_Page
 
        PROCEDURE
              g10mv5;
 
              tsp_moveobj tsp00_Page
 
        PROCEDURE
              g10mv6;
 
              tsp_moveobj tsp00_KnlIdentifier
              tsp_moveobj tsp00_Key
 
        PROCEDURE
              g10mv8;
 
              tsp_moveobj tkb00_Page
 
        PROCEDURE
              g10mv9;
 
              tsp_moveobj tsp00_Line
 
        PROCEDURE
              g10mv10;
 
              tsp_moveobj tsp00_NodeId
 
        PROCEDURE
              g10mv12;
 
              tsp_moveobj tsp00_Line
              tsp_moveobj tsp00_Buf
 
        PROCEDURE
              g17hexto_line;
 
              tsp00_Line tsp00_C12
 
        PROCEDURE
              s20ch4;
 
              tsp_moveobj tsp00_Page
 
        PROCEDURE
              s20ch4sw;
 
              tsp_moveobj tsp00_C4
 
        PROCEDURE
              s30cmp;
 
              tsp_moveobj tsp00_C10
              tsp_moveobj tsp2_devname
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : JuergenA
.sp
.cp 3
Created : 1983-06-06
.sp
.cp 3
.sp
.cp 3
Release :      Date : 2000-11-22
.sp
***********************************************************
.sp
.cp 9
.fo
.oc _/1
Specification:
 
Update Define:
(* PTS 1000431 UH *)
(* PTS 1000584 UH *)
 
Update Use:
(* PTS 1000360 UH *)
(* PTS 1000431 UH *)
(* PTS 1000584 UH *)
.sp
Procedure K35A_SAVE_ALL
.sp
Initializes the outcopy procedure for SAVE DATABASE or PAGES
in a restarted database (WARM mode). If a host name is specified
in part2, the host file is written by the kernel. If there is a
4-byte integer after the host name or after a blank host name, this
integer gives the maximum number of pages per host file for
multi-volume processing.
.sp 2;.cp 4
Procedure K35C_SAVE_LOG_COLD
.sp
Initializes the outcopy procedure for SAVE LOG COLD
while the system is in COLD mode.
Part1 contains the name of the system devspace
and an optional logdevspace name. If part1 does
not contain a logdevspace name, the first logdevspace from the config
record is used.  If a host name is specified in part2, the host file
is created by the kernel.  If there is a
4-byte integer after the host name or after a blank host name, this
integer gives the maximum number of pages per host file for
multi-volume processing.
.br
For initialization, the log area is scanned for valid log pages,
independent of the restart record; K35.PNO indicates the first page
(PNO and not LPNO) and K35.LASTLOGPNO the last page in the log area.
.sp 2;.cp 10
Procedure K35CLEAR_LOG
.sp
While the system is in COLD mode, the log area is formatted, i.e. the
first log page is assigned the mode LOG_CLEARED and all other log pages
are assigned the mode UNUSED.  CLEAR LOG can only occur if the database
has been shut down correctly or has been 'restored'.  This is verified
on the basis of the boolean value IS_CONSISTENT_DB contained in the
restart record.
.br
Part1 contains the name of the system devspace.
.sp 2;.cp 4
Procedure K35COLD_SAVE_ALL
.sp
Initializes the outcopy procedure for SAVE DATABASE or PAGES
while the system is in COLD mode.  Part1 contains the name of the
system devspace.  If a host name is specified in part2, the host file
is created by the kernel. If there is a 4-byte integer
after the host name or after a blank host name, this integer gives
the maximum number of pages per host file for multi-volume processing.
.sp
SAVE DATABASE/PAGES can be executed only if
the database has been shut down
correctly, i.e. in the restart record, IS_CONSISTENT_DB is 'true'.
.sp 2;.cp 4
Procedure K35CONFIG_CONSISTENT
.sp
Reads the restart record and checks whether the database is in
a consistent state (IS_CONSISTENT_DB = true).
.sp 2;.cp 4
Procedure K35COPY_LOG
.sp
While the system is in COLD mode, this procedure executes the
function "RESTORE LOG FROM... TO..." for the log modes NORMAL and
DUAL.  Part1 contains the system devspace name, the
source logdevspace name and the destination logdevspace name.
.br
For DUAL log, one log area is simply copied over the other whereas,
for NORMAL log, after the destination log area is formatted,
either the last section of the archive log (from the last checkpoint on)
or the temporary log is transferred to the other log area.
.sp 2;.cp 4
Procedure K35DIAGNOSE
.sp
Initializes the incopy or outcopy procedure for DIAGNOSE
commands while the system is in COLD mode.  Part1 contains the
system devspace name and additional parameters for the particular
processing operation. The type of outcopy diagnose command is
not found in M.MESS2_TYPE; at present, it is still located in
M.PART2.LEN as int2 and is assigned to K35.DIAG_TYPE.
.sp 2;.cp 4
Procedure K35END_CLEAR
.sp
This procedure should be called after a faulty incopy/outcopy
procedure so that initializations that have been done can be reset.
.sp 2;.cp 10
Procedure K35L_RESTORE_LOG
.sp
Initializes the outcopy procedure for RESTORE LOG while the system
is in COLD mode.  'Restore log' requires that the log area already have
been formatted via CLEAR_LOG.  Part1 contains the name of the
system devspace and, if applicable, the date and time until which the
log should be updated, i.e. after a complete 'restore', the
log area is deleted after the last COMMIT/ROLLBACK log entry that
falls within the specified time.
.br
The log is updated via the implicit restart and shutdown of the
database.
.sp 2;.cp 4
Procedure K35L_SAVE_LOG
.sp
Initializes the outcopy procedure for SAVE LOG in WARM mode.
If a host name is specified in part2, the host
file is created by the kernel. If there is a 4-byte
integer after the host name or after a blank host name, this integer
gives the maximum number of pages per host file for multi-volume
processing.  If part1/2_len is 0, the last page has been sent.
.sp 2;.cp 3
Procedure K35OFF_LOG_SAVE
.sp
Sets IS_LOG_SAVE to false.
.sp 2;.cp 4
Procedure K35RESTORE
.sp
Initializes the incopy procedure for RESTORE DATABASE, PAGES or
CONFIG while the system is in COLD mode. If a host name is specified in
part2, the host file is read from the kernel.
.sp 2;.cp 4
Procedure K35SET_NOT_GENERATED
.sp
Sets the K35.PTR-not-generated state.
.sp 2;.cp 3
Procedure K35TEMP_OUTCOPY
.sp
Copies the intermediate result table for further join
execution to the remote location.
.sp 2;.cp 4
Procedure K35UPDATE_STATISTICS
.sp
Processes the UPDATE STATISTICS command for the table specified
by MTREE (part1) while the system is in WARM mode. It sets a read lock
on the table and the result is sent back as a 4-byte integer in part1.
.sp 2;.cp 10
Procedure K35VERIFY
.sp
Processes the VERIFY command while the system is in COLD mode. Part1
contains the name of the system devspace.  The results are sent in
readable form (ASCII or EBCDIC) and consist of two strings of 10 bytes
each that contain the number of used pages and the number of repaired
trees.
.sp 2;.cp 4
Procedure KB35INIT_POINTER
.sp
Allocation of K35.PTR.
.CM *-END-* specification -------------------------------
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
.sp 2
.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_backup_successfull     = true;
      c_complete_log           = true; (* PTS 1000360 UH *)
      INCREMENT_CONV_VERSION   = true;
      c_destructive_tape_check = true; (* PTS 1000360 UH *)
      c_in_region              = true;
      c_is_cold                = true;
      c_is_restore_log         = true;
      c_with_zero              = true;
      (* *)
      c_first_logdev           =  1;
      c_first_datadev          =  1;
      c_loginfo_pno            =  1;
      c_restartrec_pno         =  1;
 
TYPE
 
      tkb35_Int4MapC4 = RECORD
            CASE boolean OF
                TRUE  :
                    (icInt4_kb35 : tsp00_Int4);
                FALSE :
                    (icC4_kb35   : tsp00_C4)
                END;
            (*ENDCASE*) 
 
 
VAR
      k35page : tkb00_PagePtr;
 
      k35diag : RECORD
            d_type     : tgg00_DiagType;
            d_devtype  : tsp2_dev_type;
            d_devno    : tsp00_Int2;
            d_pno      : tsp00_PageNo;
            (* *)
            d_stop_pno : tsp00_PageNo;
            d_page_cnt : tsp00_Int4;
            (* *)
            d_tree     : tgg00_FileId;
      END;
 
      kb35util_cmd_req_no  : tsp00_Int2;  (* PTS 1104845 UH 1999-12-02 *)
      kb35WasOmsShutdowned : boolean;     (* PTS 1107456 JA 2000-08-08 *)
      (* PTS 1108979 E.Z. *)
 
 
(*------------------------------*) 
 
PROCEDURE
      k35check_table (VAR m : tgg00_MessBlock;
            with_lock : boolean);
 
VAR
      k         : tgg00_Lkey;
      aux_error : tgg_basis_error;
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
IF  with_lock
THEN
    BEGIN
    k53perm_temp_lock (m.mb_trns^, m_lock, lckTabShare_egg00,
          [hsTempLock_egg00],
          m.mb_qual^.mtree.fileTabId_gg00, k);
    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*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    (* PTS 1109905 E.Z. *)
    b01check_table (m.mb_trns^, m.mb_qual^.mtree,
          m.mb_qual^.mstring_cnt, m.mb_qual^.mlink_cnt,
          with_lock);
    IF  with_lock
    THEN
        BEGIN
        aux_error := m.mb_trns^.trError_gg00;
        k53perm_temp_lock (m.mb_trns^, m_unlock, lckTabShare_egg00,
              [hsTempLock_egg00],
              m.mb_qual^.mtree.fileTabId_gg00, k);
        IF  aux_error <> e_ok
        THEN
            m.mb_trns^.trError_gg00 := aux_error
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
m.mb_qual_len := 0;
m.mb_data_len := 0;
m.mb_struct   := mbs_nil;
m.mb_type2    := mm_nil;
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    m.mb_type := m_return_result
ELSE
    m.mb_type := m_return_error
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35clear_log (VAR m : tgg00_MessBlock);
 
BEGIN
(* PTS 1110951 TS 2001-07-19 *)
IF  bd999AttachAllArchiveLogs( m.mb_trns^.trTaskId_gg00 )
THEN
    BEGIN
    (* Open data devspace containing restart record *)
    bd999AttachOneDataDevice( m.mb_trns^.trTaskId_gg00, c_first_datadev,
          m.mb_trns^.trError_gg00 );
    IF  m.mb_trns^.trError_gg00 = e_ok
    THEN
        BEGIN
        kb57RestoreRestartRecord(  m.mb_trns^.trTaskId_gg00 );
        kb560ClearArchiveLog (m.mb_trns^.trTaskId_gg00);
        END;
    (*ENDIF*) 
    END
ELSE
    m.mb_trns^.trError_gg00 := e_disk_not_accessible;
(*ENDIF*) 
bd999DetachAllDevices( m.mb_trns^.trTaskId_gg00 );
(* bd999DetachAllArchiveLogs(m.mb_trns^.trTaskId_gg00); *)
(* PTS 1110951 *)
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35cold_save_data (VAR m : tgg00_MessBlock);
 
VAR
      is_tapeswap : boolean;
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
is_tapeswap             := false;
bd14RestartFileSystemForSaveDataCold( m.mb_trns^ );
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    vbegexcl (m.mb_trns^.trTaskId_gg00, g08savepoint);
    WITH k57restartrec^ DO
        BEGIN
        IF  m.mb_type2 in [mm_database]
        THEN
            rstLastSaveDataSuccessful_kb00 := false;
        (*ENDIF*) 
        rstDataBackupCnt_kb00 := rstDataBackupCnt_kb00 + 1; (* PTS 1000333 UH *)
        END;
    (*ENDWITH*) 
    k57save_restartrecord (m.mb_trns^.trTaskId_gg00);
    vendexcl (m.mb_trns^.trTaskId_gg00, g08savepoint);
    k38init_save (m, c_is_cold,
          NOT c_complete_log,               (* PTS 1000360 UH *)
          NOT c_destructive_tape_check)     (* PTS 1000360 UH *)
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    IF  m.mb_type2 in [mm_pages]
    THEN
        bd10BeginSavePages (m.mb_trns^.trTaskId_gg00)
    ELSE
        BEGIN
        bd10BeginSaveData  (m.mb_trns^.trTaskId_gg00);
        bd10FlushConverterForColdSave (m.mb_trns^,
              k57restartrec^.rstConfigParam_kb00.crConvRootBlockAddr_gg00);
        k57save_restartrecord (m.mb_trns^.trTaskId_gg00);
        END;
    (*ENDIF*) 
    IF  m.mb_trns^.trError_gg00 = e_ok
    THEN
        BEGIN
        k38headmaster (m);
        is_tapeswap := m.mb_trns^.trError_gg00 = e_new_hostfile_required
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  (m.mb_trns^.trError_gg00 <> e_ok) AND NOT is_tapeswap
THEN
    bd14ShutdownFileSystemAfterSaveDataCold (m.mb_trns^.trTaskId_gg00)
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35diagnose (VAR m : tgg00_MessBlock);
 
CONST
      c_ak_tabid         = 65;
      c_ak_userid        = 77;
      c_segmentid_len    =  2;
      c_tabid_syscat_pos =  7;
 
VAR
      restarted  : boolean;
      bIsDynamic : boolean;
      last_count : tsp00_Int4;
      user_id    : tgg00_Surrogate;
      username   : tsp00_KnlIdentifier;
      tablename  : tsp00_KnlIdentifier;
      k          : tgg00_Lkey;
      rec        : tgg00_Rec;
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
kb35reset_diag_variables;
restarted      := false;
last_count     := m.mb_qual^.mut_count;
k35diag.d_type := m.mb_qual^.mut_diag_type;
IF  m.mb_qual^.mut_diag_type = diagNil_egg00
THEN
    m.mb_trns^.trError_gg00 := e_not_implemented
ELSE
    IF  NOT (m.mb_qual^.mut_diag_type in [
        diagConvPage_egg00,
        diagDev_egg00,
        diagEnableDevspace_egg00,
        diagLoginfoPage_egg00,
        diagLogDev_egg00,
        diagMirrLogDev_egg00,
        diagMirrSysDev_egg00,
        diagRestart_egg00,
        diagSysDev_egg00])
    THEN
        BEGIN
        b01restart_filesystem (m.mb_trns^, NOT INCREMENT_CONV_VERSION);
        restarted := (m.mb_trns^.trError_gg00 = e_ok)
        END;
    (*ENDIF*) 
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    WITH k35diag DO
        CASE m.mb_qual^.mut_diag_type OF
            diagDev_egg00:
                BEGIN
                d_pno      := m.mb_qual^.mut_pno;
                d_stop_pno := m.mb_qual^.mut_pno2;
                IF  bd999GetDataDevNo( m.mb_qual^.mut_dev, d_devno )
                THEN
                    BEGIN
                    bd999AttachOneDataDevice( m.mb_trns^.trTaskId_gg00,
                          d_devno, m.mb_trns^.trError_gg00);
                    d_devtype := sp2dt_data;
                    END
                ELSE
                    IF  bd999GetLogDevNo( m.mb_qual^.mut_dev, d_devno )
                    THEN
                        BEGIN
                        bd999AttachOneLogDevice( m.mb_trns^.trTaskId_gg00,
                              d_devno, m.mb_trns^.trError_gg00);
                        d_devtype := sp2dt_log;
                        END
                    ELSE
                        m.mb_trns^.trError_gg00 := e_disk_not_accessible;
                    (*ENDIF*) 
                (*ENDIF*) 
                IF  (m.mb_type2 = mm_device_restore)
                    AND
                    (m.mb_trns^.trError_gg00 = e_ok)
                THEN
                    BEGIN
                    kb35restore_page (m);
                    kb35reset_diag_variables
                    END
                (*ENDIF*) 
                END;
            diagLogDev_egg00, diagMirrLogDev_egg00:
                BEGIN
                CASE m.mb_qual^.mut_diag_type OF
                    diagLogDev_egg00:
                        d_devtype := sp2dt_log;
                    diagMirrLogDev_egg00:
                        d_devtype := sp2dt_mirr_log;
                    END;
                (*ENDCASE*) 
                d_devno    := m.mb_qual^.mut_count;
                d_pno      := m.mb_qual^.mut_pno;
                d_stop_pno := m.mb_qual^.mut_pno2;
                d_type     := diagDev_egg00;
                bd999AttachOneLogDevice( m.mb_trns^.trTaskId_gg00,
                      d_devno, m.mb_trns^.trError_gg00 );
                IF  (m.mb_type2 = mm_device_restore)
                    AND
                    (m.mb_trns^.trError_gg00 = e_ok)
                THEN
                    BEGIN
                    kb35restore_page (m);
                    kb35reset_diag_variables
                    END
                (*ENDIF*) 
                END;
            diagLoginfoPage_egg00:
                IF  b01downfilesystem
                THEN
                    BEGIN
                    d_devno    := c_first_logdev;
                    d_devtype  := sp2dt_log;
                    d_pno      := c_loginfo_pno;
                    d_stop_pno := c_loginfo_pno;
                    d_type     := diagDev_egg00;
                    bd999AttachOneLogDevice( m.mb_trns^.trTaskId_gg00,
                          d_devno, m.mb_trns^.trError_gg00 );
                    IF  m.mb_trns^.trError_gg00 = e_ok
                    THEN
                        BEGIN
                        IF  m.mb_type2 = mm_device_restore
                        THEN
                            BEGIN
                            m.mb_qual^.mut_pno := d_pno;
                            kb35restore_page (m);
                            kb35reset_diag_variables
                            END
                        ELSE
                            BEGIN
                            k35outcopy_diag (m);
                            IF  m.mb_trns^.trError_gg00 = e_no_next_record
                            THEN
                                m.mb_trns^.trError_gg00 := e_ok
                            (*ENDIF*) 
                            END
                        (*ENDIF*) 
                        END
                    (*ENDIF*) 
                    END
                ELSE
                    BEGIN
                    m.mb_data_len := sizeof (tkb00_Page);
                    m.mb_trns^.trError_gg00 := e_not_implemented;
                    (*+++k56infopage_get (m.mb_trns^.trTaskId_gg00, m.mb_data^.mbp_buf)*)
                    END;
                (*ENDIF*) 
            diagRestart_egg00:
                IF  b01downfilesystem
                THEN
                    BEGIN
                    bd999AttachOneDataDevice( m.mb_trns^.trTaskId_gg00,
                          c_first_datadev, m.mb_trns^.trError_gg00 );
                    d_devno    := c_first_datadev;
                    d_devtype  := sp2dt_data;
                    d_type     := diagDev_egg00;
                    d_pno      := c_restartrec_pno;
                    d_stop_pno := c_restartrec_pno;
                    IF  m.mb_trns^.trError_gg00 = e_ok
                    THEN
                        BEGIN
                        IF  m.mb_type2 = mm_device_restore
                        THEN
                            BEGIN
                            m.mb_qual^.mut_pno := d_pno;
                            kb35restore_page (m);
                            kb35reset_diag_variables
                            END
                        ELSE
                            BEGIN
                            k35outcopy_diag (m);
                            IF  m.mb_trns^.trError_gg00 = e_no_next_record
                            THEN
                                m.mb_trns^.trError_gg00 := e_ok
                            (*ENDIF*) 
                            END
                        (*ENDIF*) 
                        END
                    (*ENDIF*) 
                    END
                ELSE
                    BEGIN
                    vbegexcl (m.mb_trns^.trTaskId_gg00, g08surrogate);
                    m.mb_data_len := sizeof (k57restartrec^.pageBuf_kb00);
                    g10mv5 ('VKB35 ',   1,    
                          sizeof (k57restartrec^.pageBuf_kb00), m.mb_data_size,
                          k57restartrec^.pageBuf_kb00, 1,
                          m.mb_data^.mbp_buf, 1, m.mb_data_len, m.mb_trns^.trError_gg00);
                    vendexcl (m.mb_trns^.trTaskId_gg00, g08surrogate)
                    END;
                (*ENDIF*) 
            diagLogFrom_egg00,
            diagLogLast_egg00:
                m.mb_trns^.trError_gg00 := e_not_implemented;
            diagConvPage_egg00 :
                BEGIN
                m.mb_trns^.trError_gg00 := e_not_implemented;
                END;
            diagPages_egg00:
                IF  m.mb_type2 = mm_device_restore
                THEN
                    BEGIN
                    k35diag.d_type := diagNil_egg00;
                    kb35restore_page (m)
                    END
                ELSE
                    WITH k35diag DO
                        BEGIN
                        d_type     := diagNil_egg00;
                        bIsDynamic := true;
                        bd10GetBlockAddress( m.mb_trns^, m.mb_qual^.mut_pno,
                              bIsDynamic, d_devno, d_pno );
                        IF  m.mb_trns^.trError_gg00 = e_ok
                        THEN
                            bd999ReadDataPageDirect(  m.mb_trns^.trTaskId_gg00,
                                  d_devno, d_pno, k35page, m.mb_trns^.trError_gg00 );
                        (*ENDIF*) 
                        IF  m.mb_trns^.trError_gg00 = e_ok
                        THEN
                            BEGIN
                            m.mb_data_len := sizeof (k35page^.pageBuf_kb00);
                            g10mv5 ('VKB35 ',   2,    
                                  sizeof (k35page^.pageBuf_kb00), m.mb_data_size,
                                  k35page^.pageBuf_kb00, 1,
                                  m.mb_data^.mbp_buf, 1, m.mb_data_len,
                                  m.mb_trns^.trError_gg00)
                            END
                        (*ENDIF*) 
                        END;
                    (*ENDWITH*) 
                (*ENDIF*) 
            diagEnableDevspace_egg00 :
                BEGIN
                bd999EnableBadDevSpace( m.mb_trns^.trTaskId_gg00, m.mb_qual^.mut_dev, m.mb_trns^.trError_gg00 );
                END;
            diagColRoot_egg00, diagFile_egg00, diagInvTree_egg00:
                BEGIN
                k35diag.d_tree.fileRoot_gg00 := m.mb_qual^.mut_pno;
                b08tstart_treediagnose (m.mb_trns^, d_tree)
                END;
            diagInvName_egg00, diagMultInvName_egg00, diagTabName_egg00, diagTabIdGet_egg00,
            diagUserIdGet_egg00 :
                BEGIN
                g10mv6 ('VKB35 ',   3,    
                      sizeof (m.mb_qual^.mut_authname), sizeof (k.k),
                      m.mb_qual^.mut_authname, 1,
                      k.k, 1, 8, m.mb_trns^.trError_gg00);
                k.k [SURROGATE_MXGG00+1] := chr (0);
                k.k [SURROGATE_MXGG00+2] := chr (c_ak_userid);
                k.k [SURROGATE_MXGG00+3] := chr (0);
                k.k [SURROGATE_MXGG00+4] := chr (1);
                g10mv6 ('VKB35 ',   4,    
                      sizeof (m.mb_qual^.mut_authname), sizeof (k.k),
                      m.mb_qual^.mut_authname, 9,
                      k.k, 8+4+1, sizeof (m.mb_qual^.mut_authname) - 8,
                      m.mb_trns^.trError_gg00);
                k.len := sizeof (m.mb_qual^.mut_authname) + 4;
                IF  m.mb_trns^.trError_gg00 = e_ok
                THEN
                    a36get_catalog_record (m.mb_trns^, k, rec);
                (*ENDIF*) 
                IF  (m.mb_qual^.mut_diag_type = diagUserIdGet_egg00)
                    AND
                    (m.mb_trns^.trError_gg00 = e_ok)
                THEN
                    BEGIN
                    g10mv2 ('VKB35 ',   5,    
                          sizeof (rec.buf),
                          sizeof (m.mb_qual^.mtree.fileTabId_gg00),
                          rec.buf,
                          cgg_rec_key_offset + rec.keylen +
                          c_segmentid_len
                          + sizeof (tgg00_ServerdbNo) + 1,
                          m.mb_qual^.mtree.fileTabId_gg00, 1,
                          sizeof (m.mb_qual^.mtree.fileTabId_gg00),
                          m.mb_trns^.trError_gg00);
                    m.mb_type      := m_return_result;
                    m.mb_type2     := mm_nil;
                    m.mb_struct    := mbs_tree_id;
                    m.mb_qual_len  := FILE_ID_MXGG00;
                    m.mb_data_len  := 0
                    END
                ELSE
                    BEGIN
                    IF  m.mb_trns^.trError_gg00 = e_ok
                    THEN
                        BEGIN
                        g10mv3 ('VKB35 ',   6,    
                              sizeof (rec.buf), sizeof (k.k),
                              rec.buf,
                              cgg_rec_key_offset + rec.keylen +
                              c_segmentid_len
                              + sizeof (tgg00_ServerdbNo) + 1,
                              k.k, 1, SURROGATE_MXGG00,
                              m.mb_trns^.trError_gg00);
                        k.k [SURROGATE_MXGG00+1] := chr (0);
                        k.k [SURROGATE_MXGG00+2] := chr (c_ak_tabid);
                        k.k [SURROGATE_MXGG00+3] := chr (0);
                        k.k [SURROGATE_MXGG00+4] := chr (1);
                        g10mv6 ('VKB35 ',   7,    
                              sizeof (m.mb_qual^.mut_tabname),
                              sizeof (k.k),
                              m.mb_qual^.mut_tabname, 1,
                              k.k, SURROGATE_MXGG00+5,
                              sizeof (m.mb_qual^.mut_tabname),
                              m.mb_trns^.trError_gg00);
                        k.len := SURROGATE_MXGG00 + 4 +
                              sizeof (m.mb_qual^.mut_tabname)
                        END;
                    (*ENDIF*) 
                    IF  m.mb_trns^.trError_gg00 = e_ok
                    THEN
                        a36get_catalog_record (m.mb_trns^, k, rec);
                    (*ENDIF*) 
                    IF  m.mb_trns^.trError_gg00 = e_ok
                    THEN
                        BEGIN
                        d_tree               := b01niltree_id;
                        d_tree.fileType_gg00 :=
                              [ftsPerm_egg00, ftsConcurrent_egg00];
                        g10mv2 ('VKB35 ',   8,    
                              sizeof (rec.buf), sizeof (d_tree.fileTabId_gg00),
                              rec.buf, cgg_rec_key_offset + rec.keylen +
                              c_tabid_syscat_pos,
                              d_tree.fileTabId_gg00, 1,
                              sizeof (d_tree.fileTabId_gg00),
                              m.mb_trns^.trError_gg00);
                        CASE m.mb_qual^.mut_diag_type OF
                            diagInvName_egg00,
                            diagMultInvName_egg00:
                                BEGIN
                                d_tree.fileTfn_gg00    := tfnMulti_egg00;
                                d_tree.fileName_gg00 [2] :=
                                      m.mb_qual^.mtree.fileName_gg00 [2]
                                END;
                            diagTabName_egg00:
                                d_tree.fileTfn_gg00 := tfnTable_egg00;
                            diagTabIdGet_egg00:
                                BEGIN
                                m.mb_qual^.mtree := d_tree;
                                m.mb_type        := m_return_result;
                                m.mb_type2       := mm_nil;
                                m.mb_struct      := mbs_tree_id;
                                m.mb_qual_len    := FILE_ID_MXGG00;
                                m.mb_data_len    := 0
                                END
                            END;
                        (*ENDCASE*) 
                        END;
                    (*ENDIF*) 
                    IF  (m.mb_qual^.mut_diag_type <> diagTabIdGet_egg00)
                        AND
                        (m.mb_trns^.trError_gg00 = e_ok)
                    THEN
                        b08tstart_treediagnose (m.mb_trns^, d_tree)
                    (*ENDIF*) 
                    END
                (*ENDIF*) 
                END;
            diagColId_egg00, diagInvId_egg00, diagMultInvId_egg00, diagTabId_egg00,
            diagTabNameGet_egg00, diagUserNameGet_egg00 :
                BEGIN
                d_tree               := m.mb_qual^.mtree;
                d_tree.fileType_gg00 := [ftsPerm_egg00, ftsConcurrent_egg00];
                IF  (m.mb_qual^.mut_diag_type <> diagTabNameGet_egg00) AND
                    (m.mb_qual^.mut_diag_type <> diagUserNameGet_egg00)
                THEN
                    b08tstart_treediagnose (m.mb_trns^, d_tree)
                ELSE
                    BEGIN
                    IF  m.mb_qual^.mut_diag_type = diagTabNameGet_egg00
                    THEN
                        a36dg_tablename_get (m.mb_trns^, d_tree.fileTabId_gg00,
                              user_id, tablename)
                    ELSE
                        user_id := d_tree.fileTabId_gg00;
                    (*ENDIF*) 
                    IF  m.mb_trns^.trError_gg00 = e_ok
                    THEN
                        a36dg_username_get (m.mb_trns^, user_id,
                              username);
                    (*ENDIF*) 
                    IF  m.mb_trns^.trError_gg00 = e_ok
                    THEN
                        BEGIN
                        g10mv ('VKB35 ',   9,    
                              sizeof (username), m.mb_data_size,
                              username, 1, m.mb_data^.mbp_4kbuf, 1,
                              sizeof (username), m.mb_trns^.trError_gg00);
                        IF  m.mb_qual^.mut_diag_type = diagTabNameGet_egg00
                        THEN
                            BEGIN
                            g10mv ('VKB35 ',  10,    
                                  sizeof (tablename), m.mb_data_size,
                                  tablename, 1, m.mb_data^.mbp_4kbuf,
                                  sizeof (username) + 1,
                                  sizeof (tablename),
                                  m.mb_trns^.trError_gg00);
                            m.mb_data_len :=
                                  sizeof (username) + sizeof (tablename)
                            END
                        ELSE
                            m.mb_data_len := sizeof (username);
                        (*ENDIF*) 
                        m.mb_type     := m_return_result;
                        m.mb_struct   := mbs_buf;
                        m.mb_qual_len := 0;
                        END
                    (*ENDIF*) 
                    END
                (*ENDIF*) 
                END;
            OTHERWISE
                m.mb_trns^.trError_gg00 := e_not_implemented
            END;
        (*ENDCASE*) 
    (*ENDWITH*) 
(*ENDIF*) 
IF  restarted
    AND
    ((m.mb_trns^.trError_gg00 <> e_ok) OR
    (m.mb_qual^.mut_diag_type in [diagTabIdGet_egg00,  diagTabNameGet_egg00
    ,                             diagUserIdGet_egg00, diagUserNameGet_egg00
    ,                             diagPages_egg00]))
THEN
    k06shutdown_filesystem (m.mb_trns^)
ELSE
    IF  (m.mb_trns^.trError_gg00 <> e_ok) AND
        (k35diag.d_type <> diagNil_egg00)
    THEN
        k35end_clear_diag (m.mb_trns^)
    (*ENDIF*) 
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35dump_utility (VAR hostfile : tgg00_VfFileref;
            VAR buf      : tsp00_Page;
            VAR out_pno  : tsp00_Int4;
            VAR out_pos  : integer;
            VAR host_err : tsp00_VfReturn;
            VAR errtext  : tsp00_ErrText);
 
CONST
      mark1_k35_vars = 'K35_VARS';
      code1_k35_vars = 1101;
 
VAR
      i2        : tsp00_IntMapC2;
      move_err  : tgg00_BasisError;
      dump_mark : tsp00_C8;
 
BEGIN
host_err := vf_ok;
move_err := e_ok;
g01new_dump_page (hostfile, buf, out_pno, out_pos, host_err, errtext);
IF  host_err = vf_ok
THEN
    WITH k35diag DO
        BEGIN
        (* ---  K 3 5 _ V A R S  --- *)
        dump_mark := mark1_k35_vars;
        g10mv4 ('VKB35 ',  11,    
              sizeof (dump_mark), sizeof (buf),
              dump_mark, 1, buf, out_pos,
              sizeof (dump_mark), move_err);
        out_pos    := out_pos + sizeof (dump_mark);
        i2.mapInt_sp00 := code1_k35_vars;
        buf [out_pos  ] := i2.mapC2_sp00 [1];
        buf [out_pos+1] := i2.mapC2_sp00 [2];
        buf [out_pos+2] := chr (ord (d_type));
        out_pos := out_pos + 3;
        s20ch4 (d_pno,      buf, out_pos  );
        s20ch4 (d_stop_pno, buf, out_pos+4);
        s20ch4 (d_page_cnt, buf, out_pos+8);
        out_pos := out_pos + 12;
        g10mv1 ('VKB35 ',  12,    
              sizeof (d_tree), sizeof (buf),
              d_tree, 1, buf, out_pos,
              sizeof (d_tree), move_err);
        out_pos := out_pos + sizeof (d_tree);
        g01new_dump_page (hostfile, buf, out_pno, out_pos, host_err, errtext)
        END;
    (*ENDWITH*) 
(*ENDIF*) 
IF  host_err = vf_ok
THEN
    vfwrite (hostfile.no, @k35page^, host_err, errtext)
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35end_clear_diag (VAR t : tgg00_TransContext);
 
VAR
      aux_err : tgg00_BasisError;
 
BEGIN
aux_err        := t.trError_gg00;
t.trError_gg00 := e_ok;
IF  k35diag.d_type <> diagNil_egg00
THEN
    bd999DetachAllDevices (t.trTaskId_gg00);
(*ENDIF*) 
kb35reset_diag_variables;
IF  t.trError_gg00 = e_ok
THEN
    t.trError_gg00 := aux_err
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35get_restart_version (VAR m : tgg00_MessBlock);
 
VAR
      fs_restarted            : boolean;
      restartable             : boolean;      (* CR 1000048 UH *)
      aux_err                 : tgg00_BasisError;
      dummy_err               : tsp00_NumError;
      first_log_lpno          : tsp00_PageNo;
      first_used_lpno         : tsp00_PageNo; (* CR 1000048 UH *)
      curr_buf_pos            : tsp00_Int4;   (* CR 1000048 UH *)
      rr_db_ident             : tsp00_Line;   (* PTS 1000449 UH 19980909 *)
      loginfo_db_ident        : tsp00_Line;   (* PTS 1000449 UH 19980909 *)
      nodeid                  : tsp00_NodeId; (* PTS 1111229 E.Z. *)
      log_devspace_enabled    : boolean;      (* PTS 1114658 UH 2002-03-06 *)
 
BEGIN
IF  NOT b01downfilesystem
THEN
    m.mb_trns^.trError_gg00 := e_invalid
ELSE
    BEGIN
    m.mb_data_len :=
          3 * RESNUM_MXSP00 +
          2 * (sizeof (tsp00_Line)+1) +   (* PTS 1000449 UH 19980909 *)
          1 * RESNUM_MXSP00           +   (* PTS 1106528 UH 20000509 *)
          1 * NODEID_MXSP00           +   (* PTS 1111229 E.Z. *)
          1 * RESNUM_MXSP00;              (* PTS 1114658 UH 2002-03-06 *)
    IF  m.mb_data_len > m.mb_data_size (* PTS 1000449 UH 19980909 *)
    THEN
        (* PTS 1000449 UH 19980909 *)
        BEGIN
        m.mb_data_len     := 0;
        m.mb_trns^.trError_gg00 := e_too_small_mb_qual_part
        END;
    (*ENDIF*) 
    IF  m.mb_trns^.trError_gg00 = e_ok
    THEN
        BEGIN
        kb35reset_diag_variables;
        bd999AttachOneDataDevice( m.mb_trns^.trTaskId_gg00, c_first_datadev,
              m.mb_trns^.trError_gg00 );
        IF  m.mb_trns^.trError_gg00 = e_ok
        THEN
            BEGIN
            WITH k35diag DO
                BEGIN
                d_devtype  := sp2dt_data;
                d_devno    := c_first_datadev;
                d_pno      := c_restartrec_pno;
                d_stop_pno := c_restartrec_pno;
                d_type     := diagDev_egg00;
                k37diagnose_outcopy (m.mb_trns^, k35page,
                      m.mb_data^.mbp_buf, m.mb_data_size, m.mb_data_len,
                      d_devno, d_devtype, d_type, d_pno, d_stop_pno, d_page_cnt)
                END;
            (*ENDWITH*) 
            IF  m.mb_trns^.trError_gg00 = e_no_next_record
            THEN
                aux_err := e_ok
            ELSE
                aux_err := m.mb_trns^.trError_gg00;
            (*ENDIF*) 
            m.mb_trns^.trError_gg00 := e_ok;
            k35end_clear_diag (m.mb_trns^);
            IF  m.mb_trns^.trError_gg00 = e_ok
            THEN
                m.mb_trns^.trError_gg00 := aux_err
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  m.mb_trns^.trError_gg00 = e_ok
        THEN
            BEGIN
            first_used_lpno := k35page^.rstLastSavept_kb00.svpIOsequence_kb00;
            IF  NOT kb560IsValidIOSeq(first_used_lpno)  (* PTS1116063 mb 2002-06-06 *)
            THEN
                (* a recovery with FirstIOSeq = 0 is supported *)
                first_used_lpno := 0;
            (*ENDIF*) 
            rr_db_ident     := k35page^.rstDbIdent_kb00; (* PTS 1000449 UH 19980909 *)
            END;
        (*ENDIF*) 
        bd999DetachAllDevices (m.mb_trns^.trTaskId_gg00);
        ;
        (* after restartrecord read the loginfo page *)
        ;
        IF  m.mb_trns^.trError_gg00 = e_ok
        THEN
            BEGIN
            kb35log_prep_cold_save (m.mb_trns^, fs_restarted);
            IF  m.mb_trns^.trError_gg00 = e_ok (* PTS 1116049 UH 2002-06-04 *)
            THEN
                BEGIN
                kb560GetRestartVersion (m.mb_trns^.trTaskId_gg00,
                      first_log_lpno, loginfo_db_ident, (* PTS 1113550 mb 2002-03-22 db-identifier is now valid *)
                      log_devspace_enabled);  (* PTS 1114658 UH 2002-03-06 *)
                IF  NOT kb560IsValidIOSeq(first_log_lpno)
                THEN
                    BEGIN
                    restartable := true;
                    END
                ELSE
                    BEGIN
                    restartable := NOT kb560IsGreaterIOSeq(first_log_lpno, first_used_lpno);
                    END;
                (*ENDIF*) 
                (***** 1 **** FIRST LPNO NEEDED *****)
                kb560ConvertInvalidIOSeqToLPNo(first_log_lpno);
                curr_buf_pos := 1;
                m.mb_data^.mbp_buf [curr_buf_pos] := csp_defined_byte;
                s41p4int (m.mb_data^.mbp_buf, curr_buf_pos + 1,
                      first_used_lpno, dummy_err);
                curr_buf_pos := curr_buf_pos + RESNUM_MXSP00;
                (***** 2 **** FIRST LPNO ON LOG *****)
                IF  m.mb_trns^.trError_gg00 = e_ok
                THEN
                    BEGIN
                    m.mb_data^.mbp_buf [curr_buf_pos] := csp_defined_byte;
                    s41p4int (m.mb_data^.mbp_buf, curr_buf_pos + 1,
                          first_log_lpno, dummy_err);
                    curr_buf_pos := curr_buf_pos + RESNUM_MXSP00
                    END
                ELSE
                    IF  m.mb_trns^.trError_gg00 = e_incompatible_log
                    THEN
                        BEGIN
                        m.mb_trns^.trError_gg00           := e_ok;
                        m.mb_data^.mbp_buf [curr_buf_pos] := csp_undef_byte
                        END;
                    (*ENDIF*) 
                (*ENDIF*) 
                ;
                (***** 3 **** RESTARTABLE *****)
                (* CR 1000048 UH *)
                m.mb_data^.mbp_buf [curr_buf_pos] := csp_defined_byte;
                s41p4int (m.mb_data^.mbp_buf, curr_buf_pos + 1,
                      ord (restartable), dummy_err);
                curr_buf_pos := curr_buf_pos + RESNUM_MXSP00;
                (* PTS 1000449 UH 19980909 begin *)
                (* -- *)
                (***** 4 **** DB IDENT FROM RESTARTRECORD *****)
                m.mb_data^.mbp_buf [curr_buf_pos] := csp_defined_byte;
                g10mv9 ('VKB35 ',  13,    
                      sizeof (tsp00_Line), sizeof (tsp00_Buf),
                      rr_db_ident, 1, m.mb_data^.mbp_buf, curr_buf_pos + 1,
                      sizeof (tsp00_Line), aux_err);
                curr_buf_pos := curr_buf_pos + 1 + sizeof (tsp00_Line);
                (* -- *)
                (***** 5 **** DB IDENT FROM LOGINFO *****)
                m.mb_data^.mbp_buf [curr_buf_pos] := csp_defined_byte;
                g10mv9 ('VKB35 ',  14,    
                      sizeof (tsp00_Line), sizeof (tsp00_Buf),
                      loginfo_db_ident, 1, m.mb_data^.mbp_buf, curr_buf_pos + 1,
                      sizeof (tsp00_Line), aux_err);
                curr_buf_pos := curr_buf_pos + 1 + sizeof (tsp00_Line);
                (* PTS 1000449 UH 19980909 end   *)
                (* -- *)
                (***** 6 **** RESTARTABLE WITOUT LOG *****)
                (* PTS 1106528 UH 20000509 begin *)
                m.mb_data^.mbp_buf [curr_buf_pos] := csp_defined_byte;
                s41p4int (m.mb_data^.mbp_buf, curr_buf_pos + 1,
                      ord (true(*restartable_without_log*)), dummy_err);
                curr_buf_pos := curr_buf_pos + RESNUM_MXSP00;
                (* PTS 1106528 UH 20000509 end *)
                (* PTS 1114658 UH 2002-03-06 begin *)
                (***** 7 **** LOG DEVSPACE ENABLED *****)
                m.mb_data^.mbp_buf [curr_buf_pos] := csp_defined_byte;
                s41p4int (m.mb_data^.mbp_buf, curr_buf_pos + 1,
                      ord (log_devspace_enabled), dummy_err);
                curr_buf_pos := curr_buf_pos + RESNUM_MXSP00;
                (* PTS 1114658 UH 2002-03-06 end *)
                (***** 8 **** MASTER SERVERNODE *****)
                (* PTS 1111229 E.Z. *)
                nodeid := 'das hier ist der master-servernode fr die HotStandByWelt       ';
                m.mb_data^.mbp_buf [curr_buf_pos] := csp_ascii_blank;
                g10mv10 ('VKB35 ',  15,    
                      sizeof (tsp00_NodeId), sizeof (tsp00_Buf),
                      nodeid, 1, m.mb_data^.mbp_buf, curr_buf_pos + 1,
                      sizeof (tsp00_NodeId), aux_err);
                curr_buf_pos := curr_buf_pos + 1 + sizeof (tsp00_NodeId);
                (* -- *)
                (* END PTS 1111229 E.Z. *)
                (* PTS 1115847 E.Z. *)
                (***** 9 **** CONVERTER VERSION *****)
                m.mb_data^.mbp_buf [curr_buf_pos] := csp_defined_byte;
                s41p4int (m.mb_data^.mbp_buf, curr_buf_pos + 1,
                      k35page^.rstConverterVersion_kb00, dummy_err);
                curr_buf_pos := curr_buf_pos + RESNUM_MXSP00;
                m.mb_data_len := curr_buf_pos - 1;
                (* END PTS 1115847 E.Z. *)
                END;
            (*ENDIF*) 
            IF  fs_restarted
            THEN
                bd999DetachAllArchiveLogs( m.mb_trns^.trTaskId_gg00 );
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  m.mb_trns^.trError_gg00 = e_ok
    THEN
        m.mb_type := m_return_result;
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
FUNCTION
      k35is_check_save : boolean;
 
VAR
      check_name   : tsp00_C10;
      data_devname : tsp2_devname;
      cmp_result   : tsp00_LcompResult;
 
BEGIN
check_name := 'CHECKDEV  ' ;
bd999GetDataDevName (c_first_datadev, data_devname);
s30cmp (check_name, 1, sizeof (tsp00_C10) - 1,
      data_devname, 1, sizeof (tsp00_C10) - 1, cmp_result);
k35is_check_save := cmp_result = l_equal
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35log_restore (VAR m : tgg00_MessBlock);
 
VAR
      is_check_save : boolean;
      predecessorVersionDummy : tsp00_Version;
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
is_check_save     := k35is_check_save;
(* until date/time is set via headmaster *)
IF  NOT is_check_save
THEN
    k81local_restart (m.mb_trns^, bsp_date, bsp_time,
          c_is_restore_log, mm_nil, predecessorVersionDummy );
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    k38init_restore (m, is_check_save);
    IF  m.mb_trns^.trError_gg00 = e_ok
    THEN
        k38headmaster (m);
    (*ENDIF*) 
    IF  (m.mb_trns^.trError_gg00 <> e_ok)
        AND
        (m.mb_trns^.trError_gg00 <> e_new_hostfile_required)
    THEN
        k06shutdown_filesystem (m.mb_trns^);
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb35log_prep_cold_save (VAR t : tgg00_TransContext;
            VAR fs_restarted : boolean);
 
BEGIN
(* CR 1107729 TS 2000-08-29 *)
(* CR 1107729 *)
t.trError_gg00 := e_ok;
fs_restarted := TRUE;
IF  bd999AttachAllArchiveLogs( t.trTaskId_gg00 )
THEN
    BEGIN
    fs_restarted := TRUE;
    kb560InitLogForLogSave (t.trTaskId_gg00,t.trError_gg00)
    END
ELSE
    BEGIN
    bd999DetachAllArchiveLogs(t.trTaskId_gg00);
    t.trError_gg00 := e_log_error;
    fs_restarted := FALSE;
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
FUNCTION
      kb35log_segment_count (VAR save_restore_param : tgg00_SaveRestoreInputParam) : tsp00_Int4;
 
VAR
      tape_no       : tsp00_Int2;
      segment_count : tsp00_Int4;
 
BEGIN
segment_count := MAX_INT4_SP00;
WITH save_restore_param DO
    FOR tape_no := 1 TO sripHostTapeNum_gg00 DO
        IF  sripHostTapecount_gg00 [tape_no] > 0
        THEN
            BEGIN
            segment_count                    := sripHostTapecount_gg00 [tape_no];
            sripHostTapecount_gg00 [tape_no] := MAX_INT4_SP00
            END;
        (*ENDIF*) 
    (*ENDFOR*) 
(*ENDWITH*) 
kb35log_segment_count := segment_count
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35log_save (VAR m : tgg00_MessBlock;  (* PTS 1111717 MB 2001-09-14 *)
            is_cold : boolean);
 
CONST
      c_msg = 'log save aborted                        ';
 
VAR
      aux_err                 : tgg00_BasisError;
      first_time_tape_check   : boolean;
      fs_restarted            : boolean;
      log_was_saved           : boolean;
      complete_segment_saved  : boolean;                     (* PTS1111987 martinb 2001-10-12 *)
      complete_log            : boolean;
      initial_mb_head         : tgg00_MessBufHeader;
      initial_user_data       : tgg00_SaveRestoreInputParam;
      last_response_mb_head   : tgg00_MessBufHeader;
      last_response_user_data : tgg00_SaveRestoreInputParam;
 
BEGIN
initial_mb_head         := m.mb_header;
initial_user_data       := m.mb_qual^.msave_restore;
first_time_tape_check := true;
complete_log          :=
      (m.mb_qual^.msave_restore.sripFileVersion_gg00 < 0)
      AND
      (m.mb_qual^.msave_restore.sripHostFiletypes_gg00 [1] <> vf_t_tape_norew);
IF  is_cold
THEN
    BEGIN
    kb35log_prep_cold_save (m.mb_trns^, fs_restarted);
    END
ELSE
    BEGIN
    IF  k38is_on_autosave (m.mb_trns^, NOT c_in_region)
    THEN
        m.mb_trns^.trError_gg00 := e_autosave_running;
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    IF  complete_log
    THEN
        BEGIN
        k38init_save (m, is_cold, complete_log, first_time_tape_check);
        IF  m.mb_trns^.trError_gg00 = e_ok
        THEN
            k38headmaster (m)
        (*ENDIF*) 
        END
    ELSE
        BEGIN
        log_was_saved := FALSE;
        REPEAT
            k38init_save (m, is_cold, complete_log, first_time_tape_check);
            complete_segment_saved := k38is_complete_log_segment(m);
            IF  m.mb_trns^.trError_gg00 = e_ok
            THEN
                BEGIN
                k38headmaster (m);
                IF  m.mb_trns^.trError_gg00 = e_ok
                THEN
                    BEGIN
                    log_was_saved := TRUE;
                    last_response_mb_head := m.mb_header;
                    last_response_user_data := m.mb_qual^.msave_restore;
                    m.mb_header              := initial_mb_head;
                    m.mb_qual_len            := sizeof (m.mb_qual^.msave_restore);
                    m.mb_qual^.msave_restore := initial_user_data;
                    END;
                (*ENDIF*) 
                END;
            (*ENDIF*) 
        UNTIL
            ((m.mb_trns^.trError_gg00 <> e_ok)
            OR
            NOT complete_segment_saved);(* PTS1111987 martinb 2001-10-12 *)
        (*ENDREPEAT*) 
        IF  m.mb_trns^.trError_gg00 = e_new_hostfile_required
        THEN
            BEGIN
            g01optextmsg (sp3p_console, sp3m_warning,
                  kb35LogSaveAborted_csp3, csp3_n_save, c_msg);
            m.mb_header       := initial_mb_head;
            m.mb_qual_len     := 0;
            m.mb_type         := m_save_parallel;
            m.mb_type2        := mm_abort;
            m.mb_trns^.trError_gg00 := e_ok;
            k38headmaster (m);
            fs_restarted            := false; (* d.h die logs werden nicht mehr detached oder? *)
            m.mb_trns^.trError_gg00 := e_cancelled;
            END
        ELSE
            BEGIN
            IF     (m.mb_trns^.trError_gg00 = e_no_log_to_save)
                OR (m.mb_trns^.trError_gg00 = e_ok)
            THEN
                BEGIN
                IF  log_was_saved
                THEN
                    BEGIN
                    m.mb_trns^.trError_gg00 := e_ok;
                    m.mb_header              := last_response_mb_head;
                    m.mb_qual_len            := sizeof (m.mb_qual^.msave_restore);
                    m.mb_qual^.msave_restore := last_response_user_data;
                    END
                ELSE
                    BEGIN
                    (* m.mb_trns^.trError_gg00 := e_ok; PTS 1115887 leave error as it is *)
                    m.mb_data_len           := 0;
                    m.mb_struct             := mbs_buf;
                    m.mb_type               := m_return_result;
                    END
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  is_cold AND fs_restarted
THEN
    BEGIN
    aux_err                 := m.mb_trns^.trError_gg00;
    m.mb_trns^.trError_gg00 := e_ok;
    bd999DetachAllArchiveLogs( m.mb_trns^.trTaskId_gg00 );
    IF  aux_err <> e_ok
    THEN
        BEGIN
        m.mb_trns^.trError_gg00 := aux_err
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35new_buf_addr (buf_addr : tkb00_PagePtr);
 
BEGIN
k35page := buf_addr;
kb35reset_diag_variables
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35OmsGetShutdownInfo (VAR Trans : tgg00_TransContext;
            VAR WasShutdowned : boolean);
 
BEGIN
(* PTS 1107118 UH 2000-07-05 new *)
(* outside region: kb35WasOmsShutdowned is initialized by k56restart_log *)
WasShutdowned := false;
IF  NOT g01is_livecache
THEN
    Trans.trError_gg00 := e_invalid
ELSE
    WasShutdowned := kb35WasOmsShutdowned (* PTS 1107456 JA 2000-08-08 *)
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35outcopy_diag (VAR m : tgg00_MessBlock);
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
m.mb_data_len           := 0;
&ifdef TRACE
t01int4 (kb, 'page_count  ', k35diag.d_page_cnt);
&endif
m.mb_qual_len := 0;
IF  (k35diag.d_type <> diagNil_egg00)
    AND
    (m.mb_data_size >= sizeof (tsp00_Page))
THEN
    WITH k35diag DO
        k37diagnose_outcopy (m.mb_trns^, k35page,
              m.mb_data^.mbp_buf, m.mb_data_size, m.mb_data_len,
              d_devno, d_devtype, d_type, d_pno, d_stop_pno, d_page_cnt)
    (*ENDWITH*) 
ELSE
    m.mb_trns^.trError_gg00 := e_not_implemented;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 <> e_ok
THEN
    BEGIN
    IF  (k35diag.d_type IN [
        diagLogFrom_egg00,
        diagLogLast_egg00,
        diagFile_egg00,
        diagTabId_egg00,
        diagTabName_egg00,
        diagInvId_egg00,
        diagInvName_egg00,
        diagMultInvId_egg00,
        diagMultInvName_egg00,
        diagInvTree_egg00,
        diagColId_egg00,
        diagColRoot_egg00,
        diagRestart_egg00]
        )
    THEN
        kb35end_shutdown_diag (m.mb_trns^)
    ELSE
        k35end_clear_diag (m.mb_trns^);
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  (m.mb_trns^.trError_gg00 = e_ok            ) OR
    (m.mb_trns^.trError_gg00 = e_no_next_record)
THEN
    BEGIN
    m.mb_type   := m_return_result;
    m.mb_type2  := mm_nil;
    m.mb_struct := mbs_buf
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35restore_data (VAR m : tgg00_MessBlock);
 
BEGIN
k38init_restore (m, k35is_check_save);
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    k38headmaster (m)
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35set_not_generated;
 
BEGIN
kb35util_cmd_req_no  := 0;      (* PTS 1104845 UH 1999-12-02 *)
kb35WasOmsShutdowned := false;  (* PTS 1107456 JA 2000-08-08 *)
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35save_data (VAR m : tgg00_MessBlock);
 
VAR
      IsLocked               : boolean; (* PTS 1106761 UH 20000524 *)
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
IsLocked                := false; (* PTS 1106761 UH 20000524 *)
IF  m.mb_type2 in [mm_database, mm_pages]
THEN
    BEGIN
    vbegexcl (m.mb_trns^.trTaskId_gg00, g08savepoint);
    WITH k57restartrec^ DO
        rstDataBackupCnt_kb00 := rstDataBackupCnt_kb00 + 1; (* PTS 1000333 UH *)
    (*ENDWITH*) 
    k57save_restartrecord (m.mb_trns^.trTaskId_gg00);
    vendexcl (m.mb_trns^.trTaskId_gg00, g08savepoint);
    kb560StartSavepointAndWait (m.mb_trns^, m.mb_type2);
    IF  m.mb_trns^.trError_gg00 <> e_ok
    THEN
        BEGIN
        k38history_error_write (m.mb_qual^.msave_restore.sripUtilCmdId_gg00,
              m.mb_type, m.mb_type2,
              NOT c_is_cold, k57restartrec^.rstDataBackupCnt_kb00,
              m.mb_trns^.trError_gg00);
        bd10EndSave (m.mb_trns^.trTaskId_gg00, NOT c_backup_successfull)
        END
    ELSE
        BEGIN
        k38init_save (m, NOT c_is_cold,
              NOT c_complete_log,              (* PTS 1000360 UH *)
              NOT c_destructive_tape_check);   (* PTS 1000360 UH *)
        IF  m.mb_trns^.trError_gg00 = e_ok    (* PTS 1113288 MB *)
        THEN
            k38headmaster (m)
        ELSE
            bd10EndSave (m.mb_trns^.trTaskId_gg00, NOT c_backup_successfull)
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35temp_outcopy (VAR m : tgg00_MessBlock);
 
VAR
      site          : tgg00_ServerdbNo;
      aux_data_size : tsp00_Int4;
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
IF  m.mb_type2 = mm_coordinator
THEN
    BEGIN
    site       := m.mb_qual^.mtree.fileResultSite_gg00;
    site[1]    := chr(ord(site[1]) - 128);
    m.mb_type2 := mm_destroy_temp
    END
ELSE
    site := g01localsite;
(*ENDIF*) 
IF  site <> g01localsite
THEN
    m.mb_trns^.trError_gg00 := e_not_implemented
ELSE
    BEGIN
    aux_data_size  := m.mb_data_size;
    WITH m.mb_qual^ DO
        BEGIN
        m.mb_data_size := mcfc_fill_len;
        IF  mcfc_tree.fileRoot_gg00 = NIL_PAGE_NO_GG00
        THEN
            b01filestate (m.mb_trns^, mcfc_tree);
        (*ENDIF*) 
        IF  m.mb_trns^.trError_gg00 = e_ok
        THEN
            BEGIN
            IF  mcfc_pno = NIL_PAGE_NO_GG00
            THEN
                mcfc_pno := mcfc_tree.fileRoot_gg00;
            (*ENDIF*) 
            b02file_outcopy (m)
            END
        (*ENDIF*) 
        END;
    (*ENDWITH*) 
    m.mb_data_size := aux_data_size;
    m.mb_type      := m_return_result;
    m.mb_type2     := mm_nil;
    m.mb_struct    := mbs_double_buf
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35UtilIdGet (TaskId : tsp00_TaskId;
            VAR UtilId : tgg00_UtilCmdId);
 
VAR
      CmdRequestNo : tsp00_IntMapC2;
      Len          : tsp00_Int4;
      Timestamp    : tkb35_Int4MapC4;
 
BEGIN
(* PTS 1104845 UH 1999-12-02 new *)
vtime_in_seconds (Timestamp.icInt4_kb35);
IF  g01code.kernel_swap <> sw_normal
THEN
    s20ch4sw (Timestamp.icInt4_kb35, g01code.kernel_swap, Timestamp.icC4_kb35, 1, sw_normal);
(*ENDIF*) 
;
(* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
vbegexcl (TaskId, g08surrogate);
kb35util_cmd_req_no := (kb35util_cmd_req_no + 1) MOD 999;
CmdRequestNo.mapInt_sp00  := kb35util_cmd_req_no;
vendexcl (TaskId, g08surrogate);
(* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
;
Len := 0;
g17hexto_line (Timestamp.icC4_kb35[1], Len, UtilId.utidId_gg00);
g17hexto_line (Timestamp.icC4_kb35[2], Len, UtilId.utidId_gg00);
g17hexto_line (Timestamp.icC4_kb35[3], Len, UtilId.utidId_gg00);
g17hexto_line (Timestamp.icC4_kb35[4], Len, UtilId.utidId_gg00);
IF  g01code.kernel_swap = sw_normal
THEN
    BEGIN
    g17hexto_line (CmdRequestNo.mapC2_sp00[1], Len, UtilId.utidId_gg00);
    g17hexto_line (CmdRequestNo.mapC2_sp00[2], Len, UtilId.utidId_gg00)
    END
ELSE
    BEGIN
    g17hexto_line (CmdRequestNo.mapC2_sp00[2], Len, UtilId.utidId_gg00);
    g17hexto_line (CmdRequestNo.mapC2_sp00[1], Len, UtilId.utidId_gg00)
    END;
(*ENDIF*) 
UtilId.utidLineNo_gg00 := 0 (* PTS 1108625 UH 2000-12-11 *)
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35verify (VAR m : tgg00_MessBlock; is_cold : boolean);
 
VAR
      bWithIndexes    : boolean;
      restarted       : boolean;
      aux_err         : tgg00_BasisError;
      pos             : integer;
      bad_index_cnt   : tsp00_Int4;
      total_bad_cnt   : tsp00_Int4;
      pages_used      : tsp00_Int4;
      blocks_released : tsp00_Int4;
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
restarted               := false;
(* PTS 1120781 E.Z. *)
bWithIndexes            := (NOT is_cold) AND (m.mb_type2 <> mm_index);
IF  is_cold AND  (m.mb_trns^.trError_gg00 = e_ok)
THEN
    BEGIN
    vbegexcl (m.mb_trns^.trTaskId_gg00, g08savepoint);
    b01restart_filesystem (m.mb_trns^, NOT INCREMENT_CONV_VERSION);
    restarted := (m.mb_trns^.trError_gg00 = e_ok);
    vendexcl (m.mb_trns^.trTaskId_gg00, g08savepoint)
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 = e_ok
THEN
    b01verify_database (m.mb_trns^, is_cold, bWithIndexes, pages_used,
          blocks_released, bad_index_cnt, total_bad_cnt);
(*ENDIF*) 
IF  is_cold
THEN
    BEGIN
    IF  restarted
    THEN
        BEGIN
        aux_err := m.mb_trns^.trError_gg00;
        k06shutdown_filesystem (m.mb_trns^);
        IF  aux_err <> e_ok
        THEN
            m.mb_trns^.trError_gg00 := aux_err
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  m.mb_trns^.trError_gg00 = e_ok
    THEN
        BEGIN
        m.mb_type   := m_return_result;
        m.mb_struct := mbs_buf;
        pos         := 1;
        kb35int4_to_buf (pages_used,     10, pos, m.mb_qual^.buf,
              m.mb_trns^.trError_gg00);
        kb35int4_to_buf (blocks_released, 10, pos, m.mb_qual^.buf,
              m.mb_trns^.trError_gg00);
        m.mb_qual_len  := pos - 1
        END
    (*ENDIF*) 
    END;
(*ENDIF*) 
IF  m.mb_trns^.trError_gg00 <> e_ok
THEN
    BEGIN
    m.mb_type   := m_return_result;
    m.mb_struct := mbs_buf;
    pos         := 1;
    kb35int4_to_buf (bad_index_cnt, 10, pos, m.mb_qual^.buf,
          m.mb_trns^.trError_gg00);
    kb35int4_to_buf (total_bad_cnt, 10, pos, m.mb_qual^.buf,
          m.mb_trns^.trError_gg00);
    m.mb_qual_len  := pos - 1
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb35ReIntegrateBadLogVolume(
            VAR Trans   : tgg00_TransContext;
            VAR DevName : tsp00_VFilename );
 
BEGIN
bd999ReIntegrateBadLogVolume (Trans.trTaskId_gg00,
      DevName, Trans.trError_gg00)
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb35GetBadLogVolume(
            VAR Trans   : tgg00_TransContext;
            VAR DevName : tsp00_VFilename );
 
BEGIN
bd999GetBadLogVolume (Trans.trTaskId_gg00, DevName, Trans.trError_gg00)
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb35end_shutdown_diag (VAR t : tgg00_TransContext);
 
VAR
      aux_err : tgg00_BasisError;
 
BEGIN
aux_err        := t.trError_gg00;
t.trError_gg00 := e_ok;
k06shutdown_filesystem (t);
kb35reset_diag_variables;
IF  t.trError_gg00 = e_ok
THEN
    t.trError_gg00 := aux_err
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb35int4_to_buf (int : tsp00_Int4;
            length         : integer;
            VAR pos        : integer;
            VAR buf        : tsp00_Buf;
            VAR move_err   : tgg00_BasisError);
 
VAR
      ln : tsp00_Line;
 
BEGIN
g17int4to_line (int, c_with_zero, length, 1, ln);
g10mv12 ('VKB35 ',  16,    
      sizeof (ln), sizeof (buf), ln, 1, buf, pos, length, move_err);
pos := pos + length
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb35reset_diag_variables;
 
BEGIN
WITH k35diag DO
    BEGIN
    d_type     := diagNil_egg00;
    d_devtype  := sp2dt_trace;
    d_devno    := 0;
    d_pno      := NIL_PAGE_NO_GG00;
    d_stop_pno := NIL_PAGE_NO_GG00;
    d_page_cnt := 0;
    d_tree     := b01niltree_id;
    END
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb35restore_page (VAR m : tgg00_MessBlock);
 
BEGIN
m.mb_trns^.trError_gg00 := e_ok;
IF  (m.mb_data_size >= sizeof (tsp00_Page))
    AND
    (m.mb_data_len = sizeof (tsp00_Page))
THEN
    BEGIN
    g10mv8 ('VKB35 ',  17,    
          m.mb_data_size, sizeof (k35page^),
          m.mb_data^.mbp_buf, 1,
          k35page^, 1, sizeof (k35page^),
          m.mb_trns^.trError_gg00);
    IF  m.mb_trns^.trError_gg00 = e_ok
    THEN
        BEGIN
        CASE m.mb_qual^.mut_diag_type OF
            diagPages_egg00 :
                WITH k35diag DO
                    BEGIN
                    bd10GetBlockAddress( m.mb_trns^, k35page^.pageLpno_kb00,
                          NOT( gg04IsStaticPage( k35page^.pageType2_kb00 )),
                          d_devno, d_pno );
                    IF  m.mb_trns^.trError_gg00 = e_ok
                    THEN
                        bd999WriteDataPageDirect(  m.mb_trns^.trTaskId_gg00, d_devno,
                              d_pno, k35page, m.mb_trns^.trError_gg00 )
                    (*ENDIF*) 
                    END;
                (*ENDWITH*) 
            diagConvPage_egg00 :
                BEGIN
                m.mb_trns^.trError_gg00 := e_not_implemented;
                END;
            OTHERWISE :
                (* incopy devspace page *)
                WITH k35diag DO
                    BEGIN
                    IF  sp2dt_data = d_devtype
                    THEN
                        bd999WriteDataPageDirect(  m.mb_trns^.trTaskId_gg00, d_devno,
                              m.mb_qual^.mut_pno, k35page, m.mb_trns^.trError_gg00 )
                    ELSE
                        IF  sp2dt_log = d_devtype
                        THEN
                            bd999WriteLogPageDirect(  m.mb_trns^.trTaskId_gg00, d_devno,
                                  m.mb_qual^.mut_pno, k35page, m.mb_trns^.trError_gg00 )
                        ELSE
                            m.mb_trns^.trError_gg00 := e_disk_not_accessible;
                        (*ENDIF*) 
                    (*ENDIF*) 
                    bd999DetachAllDevices (m.mb_trns^.trTaskId_gg00);
                    END
                (*ENDWITH*) 
            END
        (*ENDCASE*) 
        END
    (*ENDIF*) 
    END
ELSE
    m.mb_trns^.trError_gg00 := e_too_short_datapart
(*ENDIF*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
