/****************************************************************************
  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-2004 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
              k35diagnose (VAR m : tgg00_MessBlock);
 
        PROCEDURE
              k35end_clear_diag (VAR t : tgg00_TransContext);
 
        PROCEDURE
              k35new_buf_addr (buf_addr : tkb00_PagePtr);
 
        PROCEDURE
              k35outcopy_diag (VAR m : tgg00_MessBlock);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              KB_restart_record : VKB57;
 
        VAR
              k57restartrec : tkb00_PagePtr;
 
      ------------------------------ 
 
        FROM
              AK_cold_utility_functions : VAK36;
 
        PROCEDURE
              a36dg_tablename_get (
                    VAR t         : tgg00_TransContext;
                    VAR tabid     : tgg00_Surrogate;
                    VAR owner_id  : tgg00_Surrogate;
                    VAR tablename : tsp00_KnlIdentifier);
 
        PROCEDURE
              a36dg_username_get (
                    VAR t        : tgg00_TransContext;
                    VAR user_id  : tgg00_Surrogate;
                    VAR username : tsp00_KnlIdentifier);
 
        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
              b01restart_filesystem (
                    VAR t                : tgg00_TransContext;
                    IncrementConvVersion : boolean);
 
        PROCEDURE
              b01shutdown_filesystem (VAR t : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_8 : VBD08;
 
        PROCEDURE
              b08tstart_treediagnose (
                    VAR t       : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
        PROCEDURE
              b08bytestr_diagnose (
                    VAR t : tgg00_TransContext;
                    VAR b : tsp00_Page);
 
        PROCEDURE
              b08tree_diagnose (
                    VAR t : tgg00_TransContext;
                    VAR b : tsp00_Page);
 
        FUNCTION
              b08was_last_page : boolean;
 
      ------------------------------ 
 
        FROM
              pagestore: VBD10;
 
        PROCEDURE
              bd10GetBlockAddress(
                    VAR Trans   : tgg00_TransContext;
                    PageNo      : tsp00_PageNo;
                    bIsDynamic  : boolean;
                    VAR DevNo   : tsp00_Int2;
                    VAR BlockNo : tsp00_Int4 );
 
      ------------------------------ 
 
        FROM
              BD_Wrapper : VBD999;
 
        PROCEDURE
              bd999AttachOneDataVolume(
                    TaskId      : tsp00_TaskId;
                    DevNo       : tsp00_Int2;
                    VAR TrError : tgg00_BasisError);
 
        PROCEDURE
              bd999AttachOneLogVolume(
                    TaskId      : tsp00_TaskId;
                    DevNo       : tsp00_Int2;
                    VAR TrError : tgg00_BasisError);
 
        PROCEDURE
              bd999DetachAllVolumes( TaskId : tsp00_TaskId );
 
        PROCEDURE
              bd999EnableBadVolume(
                    TaskId      : tsp00_TaskId;
                    VAR DevName : tsp00_VFilename;
                    VAR TrError : tgg00_BasisError );
 
        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
              bd999ReadLogPageDirect(
                    TaskId      : tsp00_TaskId;
                    DevNo       : tsp00_Int2;
                    BlockNo     : tsp00_Int4;
                    VAR pPage   : tkb00_PagePtr;
                    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
              Select_Help_Procedures : VGG04;
 
        FUNCTION
              gg04IsStaticPage (PageType2 : tgg00_PageType2) : boolean;
 
      ------------------------------ 
 
        FROM
              Regions_and_Longwaits : VGG08;
 
        VAR
              g08surrogate : tsp00_RegionId;
 
      ------------------------------ 
 
        FROM
              RTE_kernel : VEN101;
 
        PROCEDURE
              vbegexcl (
                    pid     : tsp00_TaskId;
                    region  : tsp00_RegionId);
 
        PROCEDURE
              vendexcl (
                    pid     : tsp00_TaskId;
                    region  : tsp00_RegionId);
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG101;
 
        PROCEDURE
              SAPDB_PascalMove (
                    mod_id   : tsp00_C6;
                    mod_num  : tsp00_Int4;
                    src_upb  : tsp00_Int4;
                    dest_upb : tsp00_Int4;
                    src      : tsp00_MoveObjPtr;
                    src_pos  : tsp00_Int4;
                    dest     : tsp00_MoveObjPtr;
                    dest_pos : tsp00_Int4;
                    length   : tsp00_Int4;
                    VAR err  : tgg00_BasisError);
 
        PROCEDURE
              g10mv (
                    mod_id      : tsp00_C6;            
                    mod_num     : tsp00_Int4;
                    source_upb  : tsp00_Int4;          
                    dest_upb    : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;       
                    src_pos     : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;       
                    dest_pos    : tsp00_Int4;
                    length      : tsp00_Int4;
                    VAR e       : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-20 : VSP20;
 
&       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
              a36get_catalog_record;
 
              tgg00_SysInfoKey   tgg00_Lkey
              tak_systembuffer tgg00_Rec
 
.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
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
      INCREMENT_CONV_VERSION   = true;
      (* *)
      c_first_logdev           =  1;
      c_first_datadev          =  1;
      c_loginfo_pno            =  1;
      c_restartrec_pno         =  1;
 
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;
 
 
 
(*------------------------------*) 
 
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;
      auxerr     : tgg00_BasisError;
 
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     ) OR
    (m.mb_qual^.mut_diag_type = diagLogFrom_egg00 ) OR
    (m.mb_qual^.mut_diag_type = diagLogLast_egg00 ) OR
    (m.mb_qual^.mut_diag_type = diagConvPage_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
                    bd999AttachOneDataVolume( 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
                        bd999AttachOneLogVolume( 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;
                bd999AttachOneLogVolume( 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;
                    bd999AttachOneLogVolume( 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
                    bd999AttachOneDataVolume( 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);
                    g10mv ('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*) 
            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);
                            g10mv ('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
                bd999EnableBadVolume( 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
                g10mv ('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);
                g10mv ('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
                    g10mv ('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
                        g10mv ('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);
                        g10mv ('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];
                        g10mv ('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
    BEGIN
    auxerr := m.mb_trns^.trError_gg00;
    m.mb_trns^.trError_gg00 := e_ok;
    b01shutdown_filesystem (m.mb_trns^);
    m.mb_trns^.trError_gg00 := auxerr;
    END
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
      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
    bd999DetachAllVolumes (t.trTaskId_gg00);
(*ENDIF*) 
kb35reset_diag_variables;
IF  t.trError_gg00 = e_ok
THEN
    t.trError_gg00 := aux_err
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      k35new_buf_addr (buf_addr : tkb00_PagePtr);
 
BEGIN
k35page := buf_addr;
kb35reset_diag_variables
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
        kb35diagnose_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
      kb35end_shutdown_diag (VAR t : tgg00_TransContext);
 
VAR
      aux_err : tgg00_BasisError;
 
BEGIN
aux_err        := t.trError_gg00;
t.trError_gg00 := e_ok;
b01shutdown_filesystem (t);
kb35reset_diag_variables;
IF  t.trError_gg00 = e_ok
THEN
    t.trError_gg00 := aux_err
(*ENDIF*) 
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
    g10mv ('VKB35 ',  11,
          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*) 
                    bd999DetachAllVolumes (m.mb_trns^.trTaskId_gg00);
                    END
                (*ENDWITH*) 
            END
        (*ENDCASE*) 
        END
    (*ENDIF*) 
    END
ELSE
    m.mb_trns^.trError_gg00 := e_too_short_datapart
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb35diagnose_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 page_count  : tsp00_Int4);
 
VAR
      copy_page : boolean;
      pageaddr  : tsp00_PageAddr;
 
BEGIN
t.trError_gg00 := e_ok;
databuf_len    := 0;
WHILE (t.trError_gg00 = e_ok)
      AND
      (NOT ((diag_type = diagPages_egg00) AND (page_count = 1)))
      AND
      (NOT ((diag_type = diagConvPage_egg00) AND (page_count = 1)))
      AND
      (databuf_len + sizeof (ptr^.pageBuf_kb00) <= databuf_size) DO
    BEGIN
    copy_page := false;
    pageaddr  := @databuf [databuf_len+1];
    CASE diag_type OF
        diagDev_egg00:
            BEGIN
            IF  (pno <= stop_pno) AND (pno <> NIL_PAGE_NO_GG00)
            THEN
                BEGIN
                CASE devtype OF
                    sp2dt_data:
                        bd999ReadDataPageDirect( t.trTaskId_gg00, devno, pno, ptr, t.trError_gg00 );
                    sp2dt_log:
                        bd999ReadLogPageDirect( t.trTaskId_gg00, devno, pno, ptr, t.trError_gg00 );
                    OTHERWISE:
                        t.trError_gg00 := e_disk_not_accessible;
                    END;
                (*ENDCASE*) 
                pno := pno + 1;
                END
            ELSE
                t.trError_gg00 := e_no_next_record;
            (*ENDIF*) 
            copy_page := (t.trError_gg00 = e_ok)
            END;
        diagLogFrom_egg00, diagLogLast_egg00:
            t.trError_gg00 := e_not_implemented;
        diagFile_egg00,
        diagInvId_egg00,
        diagInvName_egg00,
        diagMultInvId_egg00,
        diagMultInvName_egg00,
        diagTabId_egg00,
        diagTabName_egg00,
        diagInvTree_egg00:
            BEGIN
            b08tree_diagnose (t, pageaddr^);
            IF  t.trError_gg00 = e_ok
            THEN
                BEGIN
                databuf_len := databuf_len + sizeof (pageaddr^);
                page_count  := page_count  + 1
                END
            (*ENDIF*) 
            END;
        diagColId_egg00, diagColRoot_egg00:
            BEGIN
            b08bytestr_diagnose (t, pageaddr^);
            IF  t.trError_gg00 = e_ok
            THEN
                BEGIN
                databuf_len := databuf_len + sizeof (pageaddr^);
                page_count  := page_count  + 1
                END
            (*ENDIF*) 
            END;
        diagRestart_egg00:
            IF  page_count = 0
            THEN
                BEGIN
                t.trError_gg00 := e_not_implemented;
&               ifdef NOTUSED
                b01rread_restartpage (t, ptr);
                copy_page := (t.trError_gg00 = e_ok)
&                     endif
                END
            ELSE
                t.trError_gg00 := e_no_next_record
            (*ENDIF*) 
        OTHERWISE
            t.trError_gg00 := e_not_implemented
        END;
    (*ENDCASE*) 
    IF  (t.trError_gg00 = e_ok) AND copy_page
    THEN
        BEGIN
        g10mv ('VKB35 ',  12,
              sizeof (ptr^.pageBuf_kb00), databuf_size,
              @ptr^.pageBuf_kb00, 1,
              @databuf, databuf_len+1, sizeof (ptr^.pageBuf_kb00),t.trError_gg00);
        databuf_len := databuf_len + sizeof (ptr^.pageBuf_kb00);
        page_count  := page_count  + 1;
        (* PTS 1111574 E.Z. *)
        IF  (diag_type = diagDev_egg00) AND
            (databuf_len + sizeof (ptr^.pageBuf_kb00) > databuf_size)
        THEN
            IF  b08was_last_page
            THEN
                t.trError_gg00 := e_no_next_record
            (*ENDIF*) 
        (*ENDIF*) 
        END
    (*ENDIF*) 
    END
(*ENDWHILE*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
