.ad 8
.bm 8
.fm 4
.bt $Copyright (c) 2000-2004 SAP AG$$Page %$
.tm 12
.hm 6
.hs 3
.TT 1 $SQL$Project Distributed Database System$VBD09$
.tt 2 $$$
.TT 3 $JuergenP$filesysteminterface_9$$$2002-10-17$
***********************************************************
.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
.nf
.sp
MODULE  : filesysteminterface_9
=========
.sp
Purpose : Handling of SAP DB Loader functions
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        PROCEDURE
              bd09FinishLoad (
                    VAR t          : tgg00_TransContext;
                    VAR file_id    : tgg00_FileId;
                    rightmost_leaf : tsp00_PageNo);
 
        PROCEDURE
              bd09GetNextLong (
                    VAR t             : tgg00_TransContext;
                    VAR file_id       : tgg00_FileId;
                    string_col_cnt    : integer;
                    VAR rk            : tgg00_Lkey;
                    VAR string_col_no : integer;
                    VAR col_id        : tgg00_FileId;
                    VAR file_pos      : tgg00_FilePos);
 
        PROCEDURE
              bd09InitLoad (
                    VAR t              : tgg00_TransContext;
                    VAR file_id        : tgg00_FileId;
                    set_read_only      : boolean;
                    VAR rightmost_leaf : tsp00_PageNo);
 
        PROCEDURE
              bd09InitUnload (
                    VAR t       : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
        PROCEDURE
              bd09LoadTable (
                    VAR t              : tgg00_TransContext;
                    VAR tree_id        : tgg00_FileId;
                    VAR rightmost_leaf : tsp00_PageNo;
                    VAR check_leaf     : tsp00_PageNo;
                    load_buf_len       : tsp00_Int4;
                    VAR load_buf       : tsp00_MoveObj);
 
        PROCEDURE
              bd09ReorgTreeIndex (
                    VAR t       : tgg00_TransContext;
                    VAR file_id : tgg00_FileId;
                    VAR rk      : tgg00_Lkey);
 
        PROCEDURE
              bd09UnloadTable (
                    VAR t           : tgg00_TransContext;
                    VAR tree_id     : tgg00_FileId;
                    VAR pno         : tsp00_PageNo;
                    VAR pno_x       : tsp00_PageNo;
                    ret_buf_size    : tsp00_Int4;
                    VAR ret_buf     : tsp00_MoveObj;
                    VAR ret_buf_len : tsp00_Int4);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              filesysteminterface_1 :  VBD01;
 
        VAR
              b01downfilesystem : boolean;
 
        PROCEDURE
              b01bcreate_bytestr (VAR t : tgg00_TransContext;
                    VAR file_id : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_5 : VBD05;
 
        PROCEDURE
              b05finish_load (
                    VAR t          : tgg00_TransContext;
                    VAR file_id    : tgg00_FileId;
                    rightmost_leaf : tsp00_PageNo);
 
        PROCEDURE
              b05load_string (VAR lnptr : tbd_node_ptrs;
                    VAR nptr     : tbd_node_ptrs;
                    VAR left_pno : tsp00_PageNo;
                    VAR current  : tbd_current_tree);
 
        PROCEDURE
              b05trunc_bytestr (VAR t : tgg00_TransContext;
                    VAR file_id    : tgg00_FileId;
                    new_filelength : tsp00_Int4;
                    str_vers       : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              nodehandling         : VBD13;
 
        PROCEDURE
              bd13GetNode (VAR Current : tbd_current_tree;
                    Pno          : tsp00_PageNo;
                    PageLockMode : tbd00_PageLockMode;
                    NodeReq      : tbd_node_request;
                    VAR Nptrs    : tbd_node_ptrs);
 
        PROCEDURE
              b13init_default_data_page (
                    VAR FileId  : tgg00_FileId;
                    Level       : tsp00_Int2;
                    NewPno      : tsp00_PageNo;
                    VAR Nptrs   : tbd_node_ptrs);
 
        PROCEDURE
              b13new_node (lno : tsp00_Int2;
                    VAR nptr    : tbd_node_ptrs;
                    VAR current : tbd_current_tree);
 
        PROCEDURE
              b13r_release_node (VAR nptr : tbd_node_ptrs;
                    VAR current : tbd_current_tree;
                    lru_info    : tbd_lru_info);
 
        PROCEDURE
              b13w_release_node (VAR nptr : tbd_node_ptrs;
                    VAR current : tbd_current_tree);
 
      ------------------------------ 
 
        FROM
              filedirectory        : VBD17;
 
        PROCEDURE
              b17state_fdir (VAR fn : tgg00_Filename;
                    VAR fi          : tbd_fileinfo;
                    concurrent_file : boolean;
                    VAR t           : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              treehandling : VBD30;
 
        PROCEDURE
              b30fdir_to_treeid (VAR fi : tbd_fileinfo;
                    VAR file_id : tgg00_FileId);
 
        PROCEDURE
              b30init_load (VAR rightmost_leaf : tsp00_PageNo;
                    VAR current : tbd_current_tree);
 
        PROCEDURE
              b30load_table (VAR lnptr : tbd_node_ptrs;
                    VAR nptr           : tbd_node_ptrs;
                    only_left          : boolean;
                    VAR current        : tbd_current_tree);
 
        PROCEDURE
              bd30GetNextLeafPage (
                    VAR nextLeafPage : tsp00_PageNo;
                    VAR nptr         : tbd_node_ptrs;
                    VAR current      : tbd_current_tree);
 
        PROCEDURE
              bd30GetNextLong (
                    VAR recKey      : tgg00_Lkey;
                    numberOfLongs   : integer;
                    VAR currentLong : integer;
                    VAR longFileId  : tgg00_FileId;
                    VAR filePos     : tgg00_FilePos;
                    VAR current     : tbd_current_tree);
 
        PROCEDURE
              bd30GetTree (
                    VAR trans      : tgg00_TransContext;
                    VAR fileId     : tgg00_FileId;
                    VAR current    : tbd_current_tree;
                    bTreeExclusive : boolean;
                    messType       : tgg00_MessType);
 
        PROCEDURE
              bd30ReleaseTree (
                    VAR current : tbd_current_tree);
 
        PROCEDURE
              bd30SetReadOnly (
                    VAR trans  : tgg00_TransContext;
                    VAR fileId : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              indexhandling : VBD50;
 
        PROCEDURE
              bd50ReorgTreeIndex (
                    VAR truncRecKey : tgg00_Lkey;
                    longColCnt      : integer;
                    VAR current     : tbd_current_tree);
 
      ------------------------------ 
 
        FROM
              bytestring_handling : VBD60;
 
        PROCEDURE
              bd60GetNextByteLeafPage (
                    VAR nextLeafPage : tsp00_PageNo;
                    VAR nptr         : tbd_node_ptrs;
                    VAR current      : tbd_current_tree);
 
      ------------------------------ 
 
        FROM
              BD_Wrapper : VBD999;
 
        PROCEDURE
              bd999CheckSpace(
                    VAR Trans         : tgg00_TransContext;
                    NumPagesRequestes : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              Select_Help_Procedures : VGG04;
 
        FUNCTION
              g04inv_tfn (tfn : tgg00_Tfn) : boolean;
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG101;
 
        PROCEDURE
              SAPDB_PascalMove (
                    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);
 
        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);
 
        PROCEDURE
              s10mv (
                    source_upb  : tsp00_Int4;       
                    destin_upb  : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;    
                    source_pos  : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;    
                    destin_pos  : tsp00_Int4;
                    length      : tsp00_Int4);
 
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01page (debug : tgg00_Debug;
                    VAR buf  : tbd_node;
                    startpos : tsp00_Int4;
                    endpos   : tsp00_Int4);
 
        PROCEDURE
              t01basis_error (debug : tgg00_Debug;
                    nam   : tsp00_Sname;
                    b_err : tgg00_BasisError);
 
        PROCEDURE
              t01buf (debug  : tgg00_Debug;
                    VAR buf  : tsp00_MoveObj;
                    startpos : integer;
                    endpos   : integer);
 
        PROCEDURE
              t01int4 (debug : tgg00_Debug;
                    nam      : tsp00_Sname;
                    int4     : tsp00_Int4);
 
        PROCEDURE
              t01lkey (debug : tgg00_Debug;
                    VAR k : tgg00_Lkey);
 
        PROCEDURE
              t01name (debug : tgg00_Debug; nam  : tsp00_Name);
 
        PROCEDURE
              t01treeid (debug : tgg00_Debug;
                    nam        : tsp00_Sname;
                    VAR treeid : tgg00_FileId);
&       endif
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
&             ifdef TRACE
 
        PROCEDURE
              t01buf;
 
              tsp00_Buf tsp00_MoveObj
 
        PROCEDURE
              t01page;
 
              tsp00_Page tbd_node
&             endif
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : JuergenP
.sp
.cp 3
Created : 2002-10-17
.sp
.cp 3
Version : 2003-01-16
.sp
.cp 3
Release :      Date : 2002-10-17
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
 
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
 
 
.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_only_left  = true;
 
 
(*------------------------------*) 
 
PROCEDURE
      bd09FinishLoad (
            VAR t          : tgg00_TransContext;
            VAR file_id    : tgg00_FileId;
            rightmost_leaf : tsp00_PageNo);
 
BEGIN
&ifdef TRACE
t01name (bi, '====> bd finish lo');
t01int4 (bi, 'root        ', file_id.fileRoot_gg00);
t01int4 (bi, 'rightmost lf', rightmost_leaf);
&endif
IF  b01downfilesystem
THEN
    t.trError_gg00 := e_shutdown
ELSE
    BEGIN
    t.trError_gg00 := e_ok;
    IF  (ftsByteStr_egg00 IN file_id.fileType_gg00) AND
        (rightmost_leaf <> NIL_PAGE_NO_GG00)
    THEN
        b05finish_load (t, file_id, rightmost_leaf);
    (*ENDIF*) 
    END;
(*ENDIF*) 
&ifdef TRACE
t01basis_error (bi, 'fini load e ', t.trError_gg00);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd09GetNextLong (
            VAR t             : tgg00_TransContext;
            VAR file_id       : tgg00_FileId;
            string_col_cnt    : integer;
            VAR rk            : tgg00_Lkey;
            VAR string_col_no : integer;
            VAR col_id        : tgg00_FileId;
            VAR file_pos      : tgg00_FilePos);
 
VAR
      current : tbd_current_tree;
 
BEGIN
&ifdef TRACE
t01name   (bi, '====> bd next col ');
t01treeid (bi, 'treeid      ', file_id);
IF  rk.keyLen_gg00 = 0
THEN
    BEGIN
    t01int4   (bi, 'tab leaf    ', file_pos.tpsPno_gg00);
    t01int4   (bi, 'tab index   ', file_pos.tpsIndex_gg00);
    END;
(*ENDIF*) 
t01int4   (bi, 'str col cnt ', string_col_cnt);
t01lkey   (bi, rk);
&endif
WITH t DO
    IF  b01downfilesystem
    THEN
        trError_gg00 := e_shutdown
    ELSE
        BEGIN
        trError_gg00 := e_ok;
        bd30GetTree (t, file_id, current, NOT LOCK_TREE_EXCL_BD00, m_select);
        IF  trError_gg00 = e_ok
        THEN
            BEGIN
            IF  rk.keyLen_gg00 = 0
            THEN
                file_pos.tpsPno_gg00 := NIL_PAGE_NO_GG00;
            (*ENDIF*) 
            bd30GetNextLong (rk, string_col_cnt, string_col_no, col_id, file_pos, current)
            END;
        (*ENDIF*) 
        bd30ReleaseTree (current);
        END;
    (*ENDIF*) 
(*ENDWITH*) 
&ifdef TRACE
IF  t.trError_gg00 = e_ok
THEN
    BEGIN
    t01treeid (bi, 'col id      ', col_id);
    t01int4   (bi, 'tab leaf    ', file_pos.tpsPno_gg00);
    t01int4   (bi, 'tab index   ', file_pos.tpsIndex_gg00);
    t01int4   (bi, 'str col no  ', string_col_no);
    t01lkey   (bi, rk);
    END;
(*ENDIF*) 
t01basis_error (bi, 'next col  e ', t.trError_gg00);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd09InitLoad (VAR t      : tgg00_TransContext;
            VAR file_id        : tgg00_FileId;
            set_read_only      : boolean;
            VAR rightmost_leaf : tsp00_PageNo);
 
VAR
      fi      : tbd_fileinfo;
      current : tbd_current_tree;
 
BEGIN
&ifdef TRACE
t01name   (bi, '====> bd init load');
t01treeid (bi, 'treeid      ', file_id);
&endif
rightmost_leaf := NIL_PAGE_NO_GG00;
IF  b01downfilesystem
THEN
    t.trError_gg00 := e_shutdown
ELSE
    WITH t DO
        BEGIN
        trError_gg00 := e_ok;
        IF  ftsByteStr_egg00 in file_id.fileType_gg00
        THEN
            BEGIN
            file_id.fileRoot_gg00 := NIL_PAGE_NO_GG00;
            b01bcreate_bytestr (t, file_id);
            IF  trError_gg00 = e_duplicate_filename
            THEN
                b05trunc_bytestr (t, file_id, 0, NIL_STR_VERSION_GG00);
            (*ENDIF*) 
            IF  trError_gg00 = e_ok
            THEN
                rightmost_leaf := file_id.fileRoot_gg00
            (*ENDIF*) 
            END
        ELSE
            BEGIN
            b17state_fdir (file_id.fileName_gg00, fi, ftsShared_egg00 in
                  file_id.fileType_gg00, t);
            IF  trError_gg00 = e_ok
            THEN
                BEGIN
                b30fdir_to_treeid (fi, file_id);
                IF  (file_id.fileVersion_gg00.ci2_gg00 <> cgg_dummy_file_version)
                    AND (fi.fi_vers <> file_id.fileVersion_gg00)
                THEN
                    trError_gg00 := e_old_fileversion
                ELSE
                    IF  f_bad in fi.fi_state
                    THEN
                        trError_gg00 := e_bad_file
                    ELSE
                        BEGIN
                        bd30GetTree (t, file_id, current, NOT LOCK_TREE_EXCL_BD00, m_nil);
                        IF  trError_gg00 = e_ok
                        THEN
                            b30init_load (rightmost_leaf, current);
                        (*ENDIF*) 
                        bd30ReleaseTree (current);
                        IF  trError_gg00 = e_ok
                        THEN
                            file_id := current.curr_tree_id
                        (*ENDIF*) 
                        END
                    (*ENDIF*) 
                (*ENDIF*) 
                END
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  (trError_gg00 = e_ok) AND set_read_only  AND
            (NOT (ftsTemp_egg00 in file_id.fileType_gg00)) AND
            (NOT g04inv_tfn (file_id.fileTfn_gg00))
        THEN
            bd30SetReadOnly (t, file_id)
        (*ENDIF*) 
        END;
    (*ENDWITH*) 
(*ENDIF*) 
&ifdef TRACE
t01int4        (bi, 'rightmost lf', rightmost_leaf);
t01basis_error (bi, 'init load e ', t.trError_gg00);
IF  ftsByteStr_egg00 IN file_id.fileType_gg00
THEN
    t01treeid (bi, 'new treeid  ', file_id);
&endif
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd09InitUnload (VAR t : tgg00_TransContext;
            VAR file_id : tgg00_FileId);
 
VAR
      fi : tbd_fileinfo;
 
BEGIN
&ifdef TRACE
t01name   (bi, '====> bd init unlo');
t01treeid (bi, 'treeid      ', file_id);
&endif
IF  b01downfilesystem
THEN
    t.trError_gg00 := e_shutdown
ELSE
    BEGIN
    t.trError_gg00 := e_ok;
    b17state_fdir (file_id.fileName_gg00, fi, ftsShared_egg00 IN file_id.fileType_gg00, t);
    IF  t.trError_gg00 = e_ok
    THEN
        BEGIN
        b30fdir_to_treeid (fi, file_id);
        IF  (file_id.fileVersion_gg00.ci2_gg00 <> cgg_dummy_file_version)
            AND (fi.fi_vers <> file_id.fileVersion_gg00)
        THEN
            t.trError_gg00 := e_old_fileversion
        ELSE
            IF  f_bad in fi.fi_state
            THEN
                t.trError_gg00 := e_bad_file
            (*ENDIF*) 
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDIF*) 
&ifdef TRACE
t01basis_error (bi, 'init unlo e ', t.trError_gg00);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd09LoadTable (VAR t     : tgg00_TransContext;
            VAR tree_id        : tgg00_FileId;
            VAR rightmost_leaf : tsp00_PageNo;
            VAR check_leaf     : tsp00_PageNo;
            load_buf_len       : tsp00_Int4;
            VAR load_buf       : tsp00_MoveObj);
 
VAR
      only_left         : boolean;
      data_pos          : tsp00_Int4;
      left_pno          : tsp00_PageNo;
      lnptr             : tbd_node_ptrs;
      nptr              : tbd_node_ptrs;
      current           : tbd_current_tree;
      save_bottom       : tgg00_PagePos;
      save_conv_version : tsp00_Int4;
      save_rec_cnt      : tsp00_Int4;
      save_file_state   : tbd_file_state_set;
 
BEGIN
&ifdef TRACE
t01name (bi, '====> bd load tab ');
t01treeid (bi, 'treeid      ', tree_id);
t01int4   (bi, 'rightmost   ', rightmost_leaf);
t01int4   (bi, 'buffer len  ', load_buf_len);
&endif
IF  b01downfilesystem
THEN
    t.trError_gg00 := e_shutdown
ELSE
    WITH t DO
        BEGIN
        trError_gg00   := e_ok;
        lnptr.np_ptr   := NIL;
        lnptr.np_cbptr := NIL;
        nptr           := lnptr;
        left_pno       := NIL_PAGE_NO_GG00;
        IF  rightmost_leaf <> check_leaf
        THEN
            trError_gg00 := e_invalid
        ELSE
            bd999CheckSpace(t, 10);
        (*ENDIF*) 
        IF  trError_gg00 = e_ok
        THEN
            BEGIN
            bd30GetTree (t, tree_id, current, LOCK_TREE_EXCL_BD00, m_nil);
            data_pos := 1;
            IF  trError_gg00 = e_ok
            THEN
                BEGIN
                IF  rightmost_leaf = current.curr_tree_id.fileRoot_gg00
                THEN
                    lnptr := current.currRootNptrs_bd00
                ELSE
                    bd13GetNode (current, rightmost_leaf, plmLock_ebd00,
                          nr_for_update, lnptr)
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            WHILE (trError_gg00 = e_ok) AND (data_pos < load_buf_len) DO
                BEGIN
                IF  lnptr.np_ptr^.nd_bottom = BODY_BEG_BD00
                THEN
                    IF  rightmost_leaf <> current.curr_tree_id.fileRoot_gg00
                    THEN
                        trError_gg00 := e_invalid
                    ELSE
                        WITH lnptr, np_ptr^ DO
                            BEGIN
&                           ifdef TRACE
                            t01buf (bi, load_buf, 1, 80);
&                           endif
                            (* *)
                            (* rightmost_leaf = root *)
                            (* *)
                            save_file_state   := nd_file_state;(* PTS 1116857 TS 2002-07-24 *)
                            save_conv_version := nd_conv_version;
                            (* *)
                            g10mv ('VBD09 ',   1,    
                                  load_buf_len, sizeof (np_ptr^),
                                  @load_buf, sizeof (nd_id) + data_pos,
                                  @np_ptr^, sizeof (nd_id) + 1,
                                  sizeof (np_ptr^) - sizeof (nd_id),
                                  trError_gg00);
                            IF  trError_gg00 = e_ok
                            THEN
                                BEGIN
                                data_pos         := sizeof (np_ptr^) + data_pos;
                                save_bottom     := nd_bottom;
                                save_rec_cnt    := nd_record_cnt;
                                b13init_default_data_page (current.curr_tree_id, LEAF_LEVEL_BD00, nd_id, lnptr);
                                nd_bottom       := save_bottom;
                                nd_record_cnt   := save_rec_cnt;
                                nd_file_version := current.curr_tree_id.fileVersion_gg00;
                                nd_file_state   := save_file_state; (* PTS 1116857 TS 2002-07-24 *)
                                nd_conv_version := save_conv_version;
&                               ifdef TRACE
                                t01page (bi, np_ptr^, 1, 80);
&                               endif
                                IF  load_buf_len <= sizeof (lnptr.np_ptr^)
                                THEN
                                    only_left := true
                                ELSE
                                    BEGIN
                                    b13new_node (LEAF_LEVEL_BD00, nptr, current);
                                    IF  trError_gg00 = e_ok
                                    THEN
                                        WITH nptr, np_ptr^ DO
                                            BEGIN
                                            only_left := false;
                                            g10mv ('VBD09 ',   2,    
                                                  load_buf_len, sizeof (np_ptr^),
                                                  @load_buf, sizeof (nd_id) + data_pos,
                                                  @np_ptr^, sizeof (nd_id)+1,
                                                  sizeof (np_ptr^) - sizeof (nd_id), trError_gg00);
                                            data_pos := data_pos + sizeof (np_ptr^);
&                                           ifdef TRACE
                                            t01page (bi, np_ptr^, 1, 80);
&                                           endif
                                            END
                                        (*ENDWITH*) 
                                    (*ENDIF*) 
                                    END
                                (*ENDIF*) 
                                END;
                            (*ENDIF*) 
                            IF  trError_gg00 = e_ok
                            THEN
                                IF  ftsByteStr_egg00 IN current.curr_tree_id.fileType_gg00
                                THEN
                                    b05load_string (lnptr, nptr, left_pno, current)
                                ELSE
                                    b30load_table (lnptr, nptr, only_left, current)
                                (*ENDIF*) 
                            (*ENDIF*) 
                            END
                        (*ENDWITH*) 
                    (*ENDIF*) 
                ELSE
                    BEGIN
                    b13new_node (LEAF_LEVEL_BD00, nptr, current);
                    IF  trError_gg00 = e_ok
                    THEN
                        WITH nptr, np_ptr^ DO
                            BEGIN
                            g10mv ('VBD09 ',   3,    
                                  load_buf_len, sizeof (np_ptr^),
                                  @load_buf, sizeof (nd_id) + data_pos,
                                  @np_ptr^, sizeof (nd_id) + 1,
                                  sizeof (np_ptr^) - sizeof (nd_id), trError_gg00);
                            data_pos := data_pos + sizeof (np_ptr^);
&                           ifdef TRACE
                            t01page (bi, np_ptr^, 1, 80);
&                           endif
                            IF  trError_gg00 = e_ok
                            THEN
                                IF  ftsByteStr_egg00 IN current.curr_tree_id.fileType_gg00
                                THEN
                                    b05load_string (lnptr, nptr, left_pno, current)
                                ELSE
                                    b30load_table (lnptr, nptr, NOT c_only_left, current)
                                (*ENDIF*) 
                            (*ENDIF*) 
                            END
                        (*ENDWITH*) 
                    (*ENDIF*) 
                    END
                (*ENDIF*) 
                END;
            (*ENDWHILE*) 
            IF  (ftsByteStr_egg00 IN current.curr_tree_id.fileType_gg00) AND
                (trError_gg00 = e_ok              ) AND
                (left_pno <> NIL_PAGE_NO_GG00     )
            THEN
                BEGIN
                (* b61add_bstrindex must be executed *)
                nptr.np_ptr := NIL;
                b05load_string (lnptr, nptr, left_pno, current)
                END;
            (*ENDIF*) 
            IF  lnptr.np_ptr = NIL
            THEN
                rightmost_leaf := NIL_PAGE_NO_GG00
            ELSE
                BEGIN
                rightmost_leaf := lnptr.np_ptr^.nd_id;
                IF  trError_gg00 = e_ok
                THEN
                    b13w_release_node (lnptr, current)
                ELSE
                    b13r_release_node (lnptr, current, lru_normal)
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            IF  nptr.np_ptr <> NIL
            THEN
                b13r_release_node (nptr, current, lru_normal);
            (*ENDIF*) 
            check_leaf := rightmost_leaf;
            bd30ReleaseTree (current)
            END
        (*ENDIF*) 
        END;
    (*ENDWITH*) 
(*ENDIF*) 
&ifdef TRACE
t01basis_error (bi, 'load tab  e ', t.trError_gg00);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd09ReorgTreeIndex (
            VAR t       : tgg00_TransContext;
            VAR file_id : tgg00_FileId;
            VAR rk      : tgg00_Lkey);
 
VAR
      fi      : tbd_fileinfo;
      current : tbd_current_tree;
 
BEGIN
&ifdef TRACE
t01name   (bi, '====> bd reorg tre');
t01treeid (bi, 'treeid      ', file_id);
t01lkey   (bi, rk);
&endif
IF  b01downfilesystem
THEN
    t.trError_gg00 := e_shutdown
ELSE
    WITH t DO
        BEGIN
        trError_gg00 := e_ok;
        b17state_fdir (file_id.fileName_gg00, fi, ftsShared_egg00 in
              file_id.fileType_gg00, t);
        IF  trError_gg00 = e_ok
        THEN
            BEGIN
            b30fdir_to_treeid (fi, file_id);
            bd30GetTree (t, file_id, current, NOT LOCK_TREE_EXCL_BD00, m_nil);
            IF  trError_gg00 = e_ok
            THEN
                bd50ReorgTreeIndex (rk, fi.fi_col_cnt, current);
            (*ENDIF*) 
            bd30ReleaseTree (current);
            IF  trError_gg00 = e_ok
            THEN
                file_id := current.curr_tree_id
            (*ENDIF*) 
            END
        (*ENDIF*) 
        END;
    (*ENDWITH*) 
(*ENDIF*) 
&ifdef TRACE
t01basis_error (bi, 'reorg tree e', t.trError_gg00);
&endif
END;
 
(*------------------------------*) 
 
PROCEDURE
      bd09UnloadTable (VAR t : tgg00_TransContext;
            VAR tree_id      : tgg00_FileId;
            VAR pno          : tsp00_PageNo;
            VAR pno_x        : tsp00_PageNo;
            ret_buf_size     : tsp00_Int4;
            VAR ret_buf      : tsp00_MoveObj;
            VAR ret_buf_len  : tsp00_Int4);
 
VAR
      finished : boolean;
      nptr     : tbd_node_ptrs;
      current  : tbd_current_tree;
 
BEGIN
&ifdef TRACE
t01name   (bi, '====> bd load tab ');
t01treeid (bi, 'treeid      ', tree_id);
t01int4   (bi, 'pno         ', pno);
t01int4   (bi, 'pno_x       ', pno_x);
&endif
IF  b01downfilesystem
THEN
    t.trError_gg00 := e_shutdown
ELSE
    WITH t DO
        BEGIN
        trError_gg00  := e_ok;
        nptr.np_ptr   := NIL;
        nptr.np_cbptr := NIL;
        ret_buf_len   := 0;
        finished      := false;
        IF  pno <> pno_x
        THEN
            trError_gg00 := e_invalid
        ELSE
            BEGIN
            bd30GetTree (t, tree_id, current, NOT LOCK_TREE_EXCL_BD00, m_nil);
            WHILE (trError_gg00 = e_ok) AND (NOT finished) DO
                BEGIN
                IF  ftsByteStr_egg00 IN current.curr_tree_id.fileType_gg00
                THEN
                    bd60GetNextByteLeafPage (pno, nptr, current)
                ELSE
                    bd30GetNextLeafPage (pno, nptr, current);
                (*ENDIF*) 
                IF  (trError_gg00 = e_ok) AND (nptr.np_ptr <> NIL)
                THEN
                    BEGIN
&                   ifdef TRACE
                    t01name (bi, 'copy long into res');
                    t01int4 (bi, 'long pno    ', nptr.np_ptr^.nd_id);
&                   endif
                    g10mv ('VBD09 ',   4,    
                          sizeof (tbd_node), ret_buf_size,
                          @nptr.np_ptr^, 1,
                          @ret_buf, ret_buf_len + 1,
                          sizeof (tbd_node), trError_gg00);
                    ret_buf_len := ret_buf_len + sizeof (tbd_node);
                    END;
                (*ENDIF*) 
                finished := (ret_buf_len + sizeof (tbd_node)) > ret_buf_size;
                IF  (pno = NIL_PAGE_NO_GG00) AND (trError_gg00 = e_ok)
                THEN
                    trError_gg00 := e_no_next_record;
                (*ENDIF*) 
                END;
            (*ENDWHILE*) 
            IF  nptr.np_ptr <> NIL
            THEN
                b13r_release_node (nptr, current, lru_normal);
            (*ENDIF*) 
            bd30ReleaseTree (current);
            END;
        (*ENDIF*) 
        pno_x := pno;
        END;
    (*ENDWITH*) 
(*ENDIF*) 
&ifdef TRACE
t01basis_error (bi, 'unload ta e ', t.trError_gg00);
&endif
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        207
*-PRETTY-*  lines of code :        589        PRETTYX 3.10 
*-PRETTY-*  lines in file :       1007         1997-12-10 
.PA 
