.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
*****************************************************
Copyright by SAP AG, 1999
SAP Database Technology
 
Release :      Date : 2000-11-16
*****************************************************
modname : VAK31
changed : 2000-11-16
module  : AK_SERVERDB
 
Author  : ThomasA
Created : 1979-06-07
Pretty  : 2001-09-04
*****************************************************
 
Purpose :
 
Define  :
 
        PROCEDURE
              a31alter_serverdb (VAR acv : tak_all_command_glob);
 
        PROCEDURE
              a31cold_site_get (
                    VAR t           : tgg00_TransContext;
                    VAR serverdb    : tsp_dbname;
                    VAR stand_alone : boolean;
                    VAR site        : tgg_serverdb_no);
 
        PROCEDURE
              a31create_serverdb (
                    VAR acv    : tak_all_command_glob;
                    VAR dbname : tsp_dbname);
 
        FUNCTION
              a31exist_serverdb_no (
                    VAR acv       : tak_all_command_glob;
                    site          : tgg_serverdb_no;
                    VAR site_type : tgg_serverdb_type) : boolean;
 
        PROCEDURE
              a31get_serverdbname (
                    VAR acv    : tak_all_command_glob;
                    site       : tgg_serverdb_no;
                    VAR dbname : tsp_dbname);
 
        FUNCTION
              a31in (
                    VAR acv       : tak_all_command_glob;
                    VAR userid    : tgg_surrogate;
                    VAR user_file : tgg00_FileId;
                    VAR user_site : tgg_serverdb_no) : boolean;
 
        PROCEDURE
              a31view_synonym_handling (
                    VAR acv         : tak_all_command_glob;
                    VAR viewscanpar : tak_viewscan_par);
 
.CM *-END-* define --------------------------------------
***********************************************************
 
Use     :
 
        FROM
              AK_User_Password : VAK21;
 
        PROCEDURE
              a21change_grantor (
                    VAR acv    : tak_all_command_glob;
                    VAR userid : tgg_surrogate);
 
      ------------------------------ 
 
        FROM
              AK_data_dictionary : VAK38;
 
        PROCEDURE
              a38serverdb_drop (
                    VAR acv      : tak_all_command_glob;
                    VAR serverdb : tsp_dbname);
 
      ------------------------------ 
 
        FROM
              Build_Strategy_2 : VAK71;
 
        PROCEDURE
              a71default_strat (VAR gg_strategy : tgg07_StrategyInfo);
&       ifdef trace
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01int4 (
                    debug    : tgg00_Debug;
                    nam      : tsp00_Sname;
                    int      : tsp00_Int4);
 
        PROCEDURE
              t01str30 (debug : tgg00_Debug; str30 : tsp00_C30);
 
        PROCEDURE
              t01lidentifier (
                    layer       : tgg00_Debug;
                    identifier  : tsp00_KnlIdentifier);
&       endif
 
      ------------------------------ 
 
        FROM
              AK_usertab_tools : VAK19;
 
        PROCEDURE
              a19del_usertab  (
                    VAR acv            : tak_all_command_glob;
                    VAR user           : tgg_surrogate;
                    VAR surrogate      : tgg_surrogate);
 
      ------------------------------ 
 
        FROM
              Scanner : VAK01;
 
        VAR
              a01defaultkey       : tgg_sysinfokey;
              a01emptypriv        : tak_privilege;
 
      ------------------------------ 
 
        FROM
              AK_semantic_scanner_tools : VAK05;
 
        PROCEDURE
              a05string_literal_get (
                    VAR acv     : tak_all_command_glob;
                    tree_index  : integer;
                    datatyp     : tsp_data_type;
                    VAR moveobj : tsp_nodeid;
                    obj_pos     : integer;
                    obj_len     : integer);
 
      ------------------------------ 
 
        FROM
              AK_universal_semantic_tools : VAK06;
 
&       ifdef trace
        PROCEDURE
              a06determine_username (
                    VAR acv       : tak_all_command_glob;
                    VAR userid    : tgg_surrogate;
                    VAR user_name : tsp_knl_identifier);
&       endif
 
        PROCEDURE
              a06a_mblock_init (
                    VAR acv         : tak_all_command_glob;
                    mtype           : tgg_message_type;
                    m2type          : tgg_message2_type;
                    VAR tree        : tgg00_FileId);
 
        PROCEDURE
              a06unpack_priv (
                    VAR packed_priv   : tak_privilege;
                    VAR unpacked_priv : tak_privilege);
 
        PROCEDURE
              a06_systable_get (
                    VAR acv      : tak_all_command_glob;
                    dstate       : tak_directory_state;
                    VAR tableid  : tgg_surrogate;
                    VAR base_ptr : tak_sysbufferaddress;
                    get_all      : boolean;
                    VAR ok       : boolean);
 
        PROCEDURE
              a06rsend_mess_buf (
                    VAR acv     : tak_all_command_glob;
                    VAR mbuf    : tgg_mess_block;
                    return_req  : boolean;
                    VAR b_err   : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              AK_error_handling : VAK07;
 
        PROCEDURE
              a07_b_put_error (
                    VAR acv : tak_all_command_glob;
                    b_err : tgg_basis_error;
                    err_code : tsp_int4);
 
        PROCEDURE
              a07_kw_put_error (
                    VAR acv  : tak_all_command_glob;
                    b_err    : tgg_basis_error;
                    err_code : tsp_int4;
                    kw       : integer);
 
      ------------------------------ 
 
        FROM
              Systeminfo_cache : VAK10;
 
        PROCEDURE
              a10repl_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10next_sysinfo (
                    VAR acv       : tak_all_command_glob;
                    VAR syskey    : tgg_sysinfokey;
                    stop_prefix   : integer;
                    dstate        : tak_directory_state;
                    rec_kind      : tsp_c2;
                    VAR syspoint  : tak_sysbufferaddress;
                    VAR b_err     : tgg_basis_error);
 
        PROCEDURE
              a10get_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg_sysinfokey;
                    dstate       : tak_directory_state;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10del_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg_sysinfokey;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10_nil_get_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syskey   : tgg_sysinfokey;
                    dstate       : tak_directory_state;
                    syslen       : tsp_int2;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
        PROCEDURE
              a10add_sysinfo (
                    VAR acv      : tak_all_command_glob;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg_basis_error);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_2 : VBD02;
 
        PROCEDURE
              b02get_record (
                    VAR t       : tgg00_TransContext;
                    VAR file_id : tgg00_FileId;
                    VAR rk      : tgg_sysinfokey;
                    VAR b       : tak_systembuffer);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_2 : VBD07;
 
        PROCEDURE
              b07cadd_record (
                    VAR t    : tgg00_TransContext;
                    VAR curr : tgg00_FileId;
                    VAR b    : tgg00_Rec);
 
        PROCEDURE
              b07cget_record (
                    VAR t    : tgg00_TransContext;
                    VAR curr : tgg00_FileId;
                    VAR rk   : tgg00_Lkey;
                    VAR b    : tgg00_Rec);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01stand_alone    : boolean;
              g01localsite      : tgg_serverdb_no;
              g01serverdb_ident : tgg_serverdb_ident;
              g01tabid          : tgg_tabid_globals;
 
      ------------------------------ 
 
        FROM
              Record_Encapsulate_Procedures : VGG09;
 
        PROCEDURE
              g09StratStackentry (
                    VAR NewStackEntry : tgg00_StackEntry;
                    inp_startpos      : tsp_int2;
                    inp_len           : tsp_int2);
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG10;
 
        PROCEDURE
              g10mv (
                    mod_id     : tsp_c6;                 mod_num  : tsp_int4;
                    source_upb : tsp_int4;               dest_upb : tsp_int4;
                    VAR source : tak_systembuffer;       src_pos  : tsp_int4;
                    VAR destin : tak_systembuffer;       dest_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR e      : tgg_basis_error);
 
        PROCEDURE
              g10mv8 (
                    mod_id     : tsp_c6;            mod_num  : tsp_int4;
                    source_upb : tsp_int4;          dest_upb : tsp_int4;
                    VAR source : tgg_sysinfokey;    src_pos  : tsp_int4;
                    VAR destin : tsp_buf;           dest_pos : tsp_int4;
                    length     : tsp_int4;
                    VAR e      : tgg_basis_error);
 
        PROCEDURE
              g10mv9 (
                    mod_id     : tsp_c6;
                    mod_num    : tsp_int4;
                    source_upb : tsp_int4;
                    dest_upb   : tsp_int4;
                    VAR source : tgg07_StrategyInfo;
                    src_pos    : tsp_int4;
                    VAR destin : tsp_moveobj;
                    dest_pos   : tsp_int4;
                    length     : tsp_int4;
                    VAR e      : tgg_basis_error);
 
.CM *-END-* use -----------------------------------------
***********************************************************
 
Synonym :
 
        PROCEDURE
              a05string_literal_get;
 
              tsp_moveobj  tsp_nodeid
 
        PROCEDURE
              b02get_record;
 
              tgg00_Lkey   tgg_sysinfokey;
              tgg00_Rec    tak_systembuffer
 
        PROCEDURE
              g10mv;
 
              tsp_moveobj tak_systembuffer
 
        PROCEDURE
              g10mv8;
 
              tsp_moveobj tgg_sysinfokey
              tsp_moveobj tsp_buf
 
        PROCEDURE
              g10mv9;
 
              tsp_moveobj tgg07_StrategyInfo
 
.CM *-END-* synonym -------------------------------------
***********************************************************
.CM -lll-
Code    :
 
 
(*------------------------------*) 
 
PROCEDURE
      a31alter_serverdb (VAR acv : tak_all_command_glob);
 
VAR
      is_gateway_serverdb : boolean;
      ti                  : integer;
      site                : tgg_serverdb_no;
      dbname              : tsp_dbname;
 
BEGIN
WITH acv DO
    IF  a_current_user_kind in [uprivate, unoprivate]
    THEN
        a07_kw_put_error (acv, e_missing_privilege, 1, cak_i_dba)
    ELSE
        BEGIN
        ti := a_ap_tree^[a_ap_tree^[ 0 ].n_lo_level].n_lo_level;
        ak31serverdb_get (acv, ti, dbname, is_gateway_serverdb, site);
        ak31alter_serverdb (acv, ti, site, dbname)
        END;
    (*ENDIF*) 
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak31alter_serverdb (
            VAR acv    : tak_all_command_glob;
            ti         : integer;
            site       : tgg_serverdb_no;
            VAR dbname : tsp_dbname);
 
VAR
      b_err               : tgg_basis_error;
      sysbuf              : tak_sysbufferaddress;
      newbuf              : tak_sysbufferaddress;
      new_dbname          : tsp_dbname;
      node                : tsp_nodeid;
      new_key             : tgg_sysinfokey;
      old_key             : tgg_sysinfokey;
 
      node_map_dbname : RECORD
            CASE boolean OF
                true :
                    (n : tsp_nodeid);
                false :
                    ( d : tsp_dbname);
                END;
            (*ENDCASE*) 
 
 
BEGIN
WITH acv DO
    BEGIN
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        a05string_literal_get (acv, ti, dcha,
              node_map_dbname.n, 1, sizeof (tsp_dbname));
        new_dbname := node_map_dbname.d;
        ti         := a_ap_tree^[ ti ].n_sa_level;
        a05string_literal_get (acv, ti, dcha,
              node_map_dbname.n, 1, sizeof (tsp_nodeid));
        node := node_map_dbname.n;
        END;
    (*ENDIF*) 
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        new_key           := a01defaultkey;
        new_key.sentrytyp := cak_eserverdbname;
        new_key.sdbname   := new_dbname;
        new_key.skeylen   := mxak_standard_sysk + mxsp_dbname;
        old_key           := new_key;
        a10get_sysinfo (acv, old_key, d_fix, sysbuf, b_err);
        IF  b_err = e_ok
        THEN
            BEGIN
            IF  new_dbname = dbname
            THEN
                BEGIN
                sysbuf^.sserverdbname.snnodeid := node;
                a10repl_sysinfo (acv, sysbuf, b_err)
                END
            ELSE
                BEGIN
                a10_nil_get_sysinfo (acv, new_key, d_release,
                      sysbuf^.b_sl, newbuf, b_err);
                IF  b_err = e_ok
                THEN
                    g10mv ('VAK31 ',   1,    
                          sysbuf^.b_sl, sysbuf^.b_sl,
                          sysbuf^, cgg_rec_key_offset+sysbuf^.b_kl + 1,
                          newbuf^, cgg_rec_key_offset+sysbuf^.b_kl + 1,
                          sysbuf^.b_sl - sysbuf^.b_kl -
                          cgg_rec_key_offset, b_err);
                (*ENDIF*) 
                IF  b_err = e_ok
                THEN
                    BEGIN
                    newbuf^.sserverdbname.snnodeid := node;
                    a10add_sysinfo (acv, newbuf, b_err)
                    END;
                (*ENDIF*) 
                IF  b_err = e_ok
                THEN
                    a10del_sysinfo (acv, old_key, b_err);
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            END;
        (*ENDIF*) 
        IF  b_err = e_ok
        THEN
            BEGIN
            old_key           := a01defaultkey;
            old_key.ssite     := site;
            old_key.sentrytyp := cak_eserverdb;
            a10get_sysinfo (acv, old_key, d_fix, sysbuf, b_err);
            IF  b_err = e_ok
            THEN
                WITH sysbuf^.sserverdb DO
                    BEGIN
                    siteserverdbname := new_dbname;
                    siteid           := node;
                    END;
                (*ENDWITH*) 
            (*ENDIF*) 
            a10repl_sysinfo (acv, sysbuf, b_err)
            END;
        (*ENDIF*) 
        IF  b_err <> e_ok
        THEN
            a07_b_put_error (acv, b_err, 1)
        ELSE
            IF  site = g01localsite
            THEN
                BEGIN
                g01serverdb_ident.svServerdb_gg00   := new_dbname;
                g01serverdb_ident.svServernode_gg00 := node
                END;
            (*ENDIF*) 
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  acv.a_return_segm^.sp1r_returncode <> 0
    THEN
        acv.a_part_rollback := true
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a31cold_site_get (
            VAR t           : tgg00_TransContext;
            VAR serverdb    : tsp_dbname;
            VAR stand_alone : boolean;
            VAR site        : tgg_serverdb_no);
 
VAR
      sysk         : tgg_sysinfokey;
      serverdb_rec : tak_systembuffer;
 
BEGIN
site           := cgg_nil_site;
sysk           := a01defaultkey;
sysk.sdbname   := serverdb;
sysk.sentrytyp := cak_eserverdbname;
sysk.skeylen   := mxak_standard_sysk + mxsp_dbname;
sysk.sreclen   := mxak_standard_sysk + mxsp_dbname;
b02get_record (t, g01tabid.sys2_cat, sysk, serverdb_rec);
IF  t.trError_gg00 = e_ok
THEN
    BEGIN
    stand_alone := false;
    site        := serverdb_rec.sserverdbname.snsite
    END
ELSE
    BEGIN
    stand_alone := true;
    site        := cak_zero_site;
    IF  t.trError_gg00 = e_key_not_found
    THEN
        t.trError_gg00 := e_ok
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a31create_serverdb (
            VAR acv    : tak_all_command_glob;
            VAR dbname : tsp_dbname);
 
VAR
      dummy_code : integer;
 
BEGIN
dummy_code := cak_is_undefined;
END;
 
(*------------------------------*) 
 
FUNCTION
      a31exist_serverdb_no (
            VAR acv       : tak_all_command_glob;
            site          : tgg_serverdb_no;
            VAR site_type : tgg_serverdb_type) : boolean;
 
VAR
      b_err  : tgg_basis_error;
      buf    : tak_sysbufferaddress;
      syskey : tgg_sysinfokey;
 
BEGIN
site_type := sdb_internal;
IF  site = g01localsite
THEN
    a31exist_serverdb_no := true
ELSE
    BEGIN
    a31exist_serverdb_no := false;
    syskey               := a01defaultkey;
    syskey.sentrytyp     := cak_eserverdb;
    syskey.ssite         := site;
    a10get_sysinfo (acv, syskey,
          d_release, buf, b_err);
    IF  b_err = e_ok
    THEN
        BEGIN
        site_type            := buf^.sserverdb.sitetype;
        a31exist_serverdb_no := true;
        END
    ELSE
        IF  b_err <> e_sysinfo_not_found
        THEN
            a07_b_put_error (acv, b_err, 1)
        (*ENDIF*) 
    (*ENDIF*) 
    END;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a31get_serverdbname (
            VAR acv    : tak_all_command_glob;
            site       : tgg_serverdb_no;
            VAR dbname : tsp_dbname);
 
VAR
      b_err  : tgg_basis_error;
      sysbuf : tak_sysbufferaddress;
      syskey : tgg_sysinfokey;
 
BEGIN
IF  NOT g01stand_alone
THEN
    BEGIN
    syskey           := a01defaultkey;
    syskey.sentrytyp := cak_eserverdb;
    syskey.ssite     := site;
    a10get_sysinfo (acv, syskey,
          d_release, sysbuf, b_err);
    IF  b_err = e_ok
    THEN
        dbname := sysbuf^.sserverdb.siteserverdbname
    ELSE
        IF  b_err <> e_sysinfo_not_found
        THEN
            a07_b_put_error (acv, b_err, 1)
        ELSE
            dbname := bsp_dbname
        (*ENDIF*) 
    (*ENDIF*) 
    END
ELSE
    dbname := g01serverdb_ident.svServerdb_gg00
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak31serverdb_get (
            VAR acv                 : tak_all_command_glob;
            VAR index               : integer;
            VAR db_name             : tsp_dbname;
            VAR is_gateway_serverdb : boolean;
            VAR site                : tgg_serverdb_no);
 
VAR
      b_err  : tgg_basis_error;
      buf    : tak_sysbufferaddress;
      sysk   : tgg_sysinfokey;
 
      dbname : RECORD
            CASE boolean OF
                true  :
                    (dbn : tsp_dbname);
                false :
                    (nid : tsp_nodeid);
                END;
            (*ENDCASE*) 
 
 
BEGIN
WITH acv DO
    BEGIN
    WITH a_ap_tree^[ index ] DO
        BEGIN
        a05string_literal_get (acv, index, dcha,
              dbname.nid, 1, sizeof (tsp_nodeid));
        db_name := dbname.dbn;
        index   := n_lo_level;
        IF  a_is_ddl = ddl_drop_serverdb
        THEN
            a38serverdb_drop (acv, dbname.dbn);
        (*ENDIF*) 
        sysk           := a01defaultkey;
        sysk.sdbname   := db_name;
        sysk.sentrytyp := cak_eserverdbname;
        sysk.skeylen   := mxak_standard_sysk + mxsp_dbname;
        a10get_sysinfo (acv, sysk,
              d_release, buf, b_err);
        IF  b_err <> e_ok
        THEN
            IF  b_err = e_sysinfo_not_found
            THEN
                a07_b_put_error (acv,
                      e_unknown_name_of_serverdb, n_pos)
            ELSE
                a07_b_put_error (acv, b_err, 1)
            (*ENDIF*) 
        ELSE
            BEGIN
            site                := buf^.sserverdbname.snsite;
            is_gateway_serverdb := buf^.sserverdbname.snsitetype
                  in [sdb_adabas_c_gateway, sdb_db2_gateway,
                  sdb_oracle_gateway, sdb_odbc_gateway]
            END
        (*ENDIF*) 
        END;
    (*ENDWITH*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak31analyze_privileges (
            VAR acv          : tak_all_command_glob;
            VAR dl_rec       : tak_drop_serverdb_record;
            VAR tabid        : tgg_surrogate;
            VAR user_file    : tgg00_FileId);
 
VAR
      b_err          : tgg_basis_error;
      user_site      : tgg_serverdb_no;
      priv_buf       : tak_sysbufferaddress;
      userid         : tgg_surrogate;
      sysk           : tgg_sysinfokey;
      priv           : tak_privilege;
 
BEGIN
WITH acv DO
    BEGIN
    sysk           := a01defaultkey;
    sysk.stableid  := tabid;
    REPEAT
        a10next_sysinfo (acv, sysk, mxgg_surrogate, d_release,
              cak_epriv, priv_buf, b_err);
        IF  b_err = e_ok
        THEN
            IF  priv_buf^.syskey.stableid <> tabid
            THEN
                b_err := e_no_next_record
            ELSE
                IF  priv_buf^.syskey.suserid <> cak_public_id
                THEN
                    IF  a31in (acv,
                        priv_buf^.syskey.suserid, user_file, user_site)
                    THEN
                        BEGIN
                        (* privilege is revoked from user *)
                        userid := priv_buf^.syskey.suserid;
                        priv   := a01emptypriv;
                        a06unpack_priv (priv_buf^.spriv.pr_priv, priv);
                        ak31delete_priv_records (acv, tabid, userid);
                        IF  (priv.priv_all_grant_set <> [  ]) OR
                            (priv.priv_grant_upd_set <> [  ]) OR
                            (priv.priv_grant_sel_set <> [  ])
                        THEN
                            (* current user may have granted     *)
                            (* at least one Privilege, assign    *)
                            (* owner of current table as grantor *)
                            (* of privileges granted by a2user_id*)
                            a21change_grantor (acv, userid);
                        (*ENDIF*) 
                        IF  NOT (dl_rec.ds_hard_drop)
                        THEN (* home serverdb of user is down *)
                            a19del_usertab (acv, userid, tabid)
                        (*ENDIF*) 
                        END;
                    (*ENDIF*) 
                (*ENDIF*) 
            (*ENDIF*) 
        (*ENDIF*) 
    UNTIL
        (b_err <> e_ok) OR (a_return_segm^.sp1r_returncode <> 0);
    (*ENDREPEAT*) 
    IF  b_err <> e_no_next_record
    THEN
        a07_b_put_error (acv, b_err, 1)
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak31store_table (
            VAR acv       : tak_all_command_glob;
            VAR tabid     : tgg_surrogate;
            VAR temp_file : tgg00_FileId);
 
BEGIN
WITH acv DO
    BEGIN
&   ifdef trace
    ak31td_table (acv, 'store table :                 ', tabid);
&   endif
    a_mblock.mb_data^.mbp_reclen := cgg_rec_key_offset +
          mxgg_surrogate + 2;
    a_mblock.mb_data^.mbp_keylen := mxgg_surrogate;
    a_mblock.mb_data^.mbp_varcol_offset := 2;
    a_mblock.mb_data^.mbp_varcol_cnt    := 0;
    WITH a_mblock.mb_data^, mbp_rec DO
        BEGIN
        mbp_info.basesyskey.stableid    := tabid;
        info[mxgg_surrogate+1] := g01localsite[ 1 ];
        info[mxgg_surrogate+2] := g01localsite[ 2 ];
        END;
    (*ENDWITH*) 
    b07cadd_record (a_transinf.tri_trans,
          temp_file, a_mblock.mb_data^.mbp_rec);
    IF  (a_transinf.tri_trans.trError_gg00 <> e_ok) AND
        (a_transinf.tri_trans.trError_gg00 <> e_duplicate_key)
    THEN
        a07_b_put_error (acv, a_transinf.tri_trans.trError_gg00, 1)
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak31delete_priv_records (
            VAR acv          : tak_all_command_glob;
            VAR tabid        : tgg_surrogate;
            VAR userid       : tgg_surrogate);
      (*===============================================*)
      (* Delete all Privileges the user 'userid' has   *)
      (* on the table specified by tabid               *)
      (*===============================================*)
 
VAR
      b_err   : tgg_basis_error;
      sysk    : tgg_sysinfokey;
 
BEGIN
WITH acv DO
    BEGIN
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
&       ifdef trace
        ak31td_table (acv, 'delete privileges of          ', tabid);
&       endif
        a06a_mblock_init (acv,
              m_delete, mm_qual, g01tabid.sys1_cat);
        sysk.stableid  := tabid;
        sysk.sentrytyp := cak_epriv;
        sysk.slinkage  := cak_init_linkage;
        sysk.suserid   := userid;
        g10mv8 ('VAK31 ',   2,    
              sizeof(sysk), a_mblock.mb_data_size,
              sysk, cgg_rec_key_offset + 1,
              a_mblock.mb_data^.mbp_4kbuf, cgg_rec_key_offset + 1,
              mxgg_surrogate + 4 + mxgg_surrogate,
              a_return_segm^.sp1r_returncode);
        a_mblock.mb_data_len  :=
              cgg_rec_key_offset + mxgg_surrogate + 4 +
              mxgg_surrogate;
        sysk.sentrytyp := cak_eprivuser;
        g10mv8 ('VAK31 ',   3,    
              sizeof(sysk), a_mblock.mb_data_size,
              sysk, cgg_rec_key_offset + 1,
              a_mblock.mb_data^.mbp_4kbuf, a_mblock.mb_data_len  +1,
              mxgg_surrogate + 4 + mxgg_surrogate,
              a_return_segm^.sp1r_returncode)
        END;
    (*ENDIF*) 
    IF  a_return_segm^.sp1r_returncode = 0
    THEN
        BEGIN
        a_mblock.mb_data_len  := a_mblock.mb_data_len  +
              mxgg_surrogate + 4 + mxgg_surrogate;
        WITH a_mblock.mb_st^[ 1 ] DO
            BEGIN
            etype         := st_fixkey;
            eop           := op_none;
            epos          := 1;
            elen_var      := mxgg_surrogate + 4 + mxgg_surrogate;
            ecol_tab[ 1 ] := chr(0);
            ecol_tab[ 2 ] := chr(0)
            END;
        (*ENDWITH*) 
        WITH a_mblock.mb_st^[ 2 ] DO
            BEGIN
            etype         := st_value;
            eop           := op_eq_all;
            epos          := cgg_rec_key_offset + 1;
            elen_var      := mxgg_surrogate + 4 + mxgg_surrogate;
            ecol_tab[ 1 ] := chr(0);
            ecol_tab[ 2 ] := chr(0);
            END;
        (*ENDWITH*) 
        WITH a_mblock.mb_st^[ 3 ] DO
            BEGIN
            etype    := st_jump_true;
            eop      := op_none;
            epos     := 4;
            elen_var := 0;
            ecol_pos := 0;
            END;
        (*ENDWITH*) 
        a_mblock.mb_st^[ 4 ] := a_mblock.mb_st^[ 1 ];
        a_mblock.mb_st^[ 5 ] := a_mblock.mb_st^[ 2 ];
        a_mblock.mb_st^[ 5 ].epos := cgg_rec_key_offset +
              mxgg_surrogate + 4 + mxgg_surrogate + 1;
        WITH a_mblock.mb_st^[ 6 ] DO
            BEGIN
            etype    := st_op;
            eop      := op_or;
            epos     := 0;
            elen_var := 0;
            ecol_pos := 0;
            END;
        (*ENDWITH*) 
        a_mblock.mb_qual^.mqual_pos   := 1;
        a_mblock.mb_qual^.mqual_cnt   := 6;
        a_mblock.mb_qual^.mfirst_free := 7;
        b_err := e_ok;
        ak31strategy (a_mblock, b_err);
        IF  b_err = e_ok
        THEN
            a06rsend_mess_buf (acv, a_mblock,
                  NOT cak_return_req, b_err);
        (*ENDIF*) 
        IF  b_err <> e_ok
        THEN
            a07_b_put_error (acv, b_err, 1)
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak31strategy (
            VAR mbuf  : tgg_mess_block;
            VAR b_err : tgg_basis_error);
 
VAR
      ilen        : integer;
      gg_strategy : tgg07_StrategyInfo;
 
BEGIN
a71default_strat( gg_strategy );
gg_strategy.str_key_len        := mxgg_surrogate + 4 + 2 * mxgg_surrogate;
gg_strategy.str_rec_len        := cgg_rec_key_offset + gg_strategy.str_key_len;
gg_strategy.str_key_in_range.skir_keystart [ 0 ] := 1;
gg_strategy.str_key_in_range.skir_keystop  [ 0 ] := 4;
ilen:= STRATEGY_START_MXGG07 + sizeof( gg_strategy.str_key_in_range );
g10mv9 ('VAK31 ',   4,    
      sizeof( gg_strategy ), mbuf.mb_strat_size,
      gg_strategy, 1,
      mbuf.mb_strat^, mbuf.mb_strat_len  + 1,
      ilen, b_err );
mbuf.mb_qual^.mstrat_pos   := mbuf.mb_qual^.mfirst_free;
mbuf.mb_qual^.mstrat_cnt   := 1;
mbuf.mb_qual^.mfirst_free  := succ(mbuf.mb_qual^.mfirst_free);
g09StratStackentry( mbuf.mb_st^[ mbuf.mb_qual^.mstrat_pos ],
      mbuf.mb_strat_len + 1, ilen );
mbuf.mb_strat_len  := mbuf.mb_strat_len  + ilen;
END;
 
(*------------------------------*) 
 
FUNCTION
      a31in (
            VAR acv       : tak_all_command_glob;
            VAR userid    : tgg_surrogate;
            VAR user_file : tgg00_FileId;
            VAR user_site : tgg_serverdb_no) : boolean;
 
VAR
      userkey    : tgg_lkey;
      buf        : tgg_rec_buf;
      userid_ptr : ^tgg_surrogate;
 
BEGIN
userkey.len := mxgg_surrogate;
userid_ptr  := @userkey.k;
userid_ptr^ := userid;
b07cget_record (acv.a_transinf.tri_trans, user_file,
      userkey, buf);
IF  acv.a_transinf.tri_trans.trError_gg00 = e_ok
THEN
    BEGIN
    IF  buf.len > cgg_rec_key_offset + mxgg_surrogate
    THEN
        BEGIN
        user_site[ 1 ] := buf.info[ mxgg_surrogate+1 ];
        user_site[ 2 ] := buf.info[ mxgg_surrogate+2 ]
        END
    ELSE
        user_site := g01localsite;
    (*ENDIF*) 
    a31in := true;
&   ifdef trace
    t01int4  (ak_syn, 'a31in = true', 1);
&   endif
    END
ELSE
    a31in := false;
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak31complex_view (
            VAR acv         : tak_all_command_glob;
            VAR tabid       : tgg_surrogate;
            VAR viewscanpar : tak_viewscan_par);
 
VAR
      b_err   : tgg_basis_error;
      tabno   : integer;
      tabcnt  : integer;
      buf     : tak_sysbufferaddress;
      sysk    : tgg_sysinfokey;
      basekey : tgg_sysinfokey;
 
BEGIN
WITH acv, viewscanpar DO
    BEGIN
    vsc_delete_view := false;
    IF  (a_return_segm^.sp1r_returncode = 0) AND NOT (vsc_delete_view)
    THEN
        BEGIN (* analyze tables in from part of current view *)
        sysk := a01defaultkey;
        WITH sysk DO
            BEGIN
            stableid  := tabid;
            sentrytyp := cak_eviewtext;
            END;
        (*ENDWITH*) 
        tabno := 1;
        REPEAT
            a10get_sysinfo (acv, sysk, d_release, buf, b_err);
            IF  b_err = e_ok
            THEN
                WITH buf^.sviewtext DO
                    BEGIN
                    tabcnt := vttabcount;
                    WITH vttab[ tabno ] DO
                        BEGIN
                        IF  vttcomplex_view
                        THEN (* table in from part is a complex view *)
                            ak31complex_view (acv,
                                  vtttableid, viewscanpar)
                        ELSE
                            BEGIN
                            vsc_delete_view := false;
                            IF  NOT vsc_delete_view
                            THEN
                                BEGIN
                                basekey          := a01defaultkey;
                                basekey.stableid := vtttableid;
                                a10get_sysinfo (acv, basekey, d_release,
                                      buf, b_err);
                                IF  b_err = e_ok
                                THEN
                                    WITH buf^.sbase DO
                                        BEGIN
                                        vsc_delete_view:= false;
                                        IF  btablekind = tview
                                        THEN
                                            viewscanpar.vsc_delete_view := false;
                                        (*ENDIF*) 
                                        END;
                                    (*ENDWITH*) 
                                (*ENDIF*) 
                                END;
                            (*ENDIF*) 
                            END;
                        (*ENDIF*) 
                        END;
                    (*ENDWITH*) 
                    tabno := succ(tabno);
                    END
                (*ENDWITH*) 
            ELSE
                a07_b_put_error (acv, b_err, 1);
            (*ENDIF*) 
        UNTIL
            (tabno > tabcnt) OR (b_err <> e_ok) OR (vsc_delete_view);
        (*ENDREPEAT*) 
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a31view_synonym_handling (
            VAR acv         : tak_all_command_glob;
            VAR viewscanpar : tak_viewscan_par);
 
BEGIN
WITH viewscanpar, vsc_ds_rec, vsc_usagedef DO
    BEGIN
    IF  usa_tablekind = tsynonym
    THEN
        vsc_delete_view := false
    ELSE
        ak31view_handling (acv, viewscanpar)
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak31view_handling (
            VAR acv         : tak_all_command_glob;
            VAR viewscanpar : tak_viewscan_par);
 
VAR
      ok       : boolean;
      base_ptr : tak_sysbufferaddress;
 
BEGIN
WITH acv, viewscanpar, vsc_ds_rec, vsc_usagedef DO
    BEGIN
    ak31store_table (acv, usa_tableid, ds_analyzed_views);
    a06_systable_get (acv, d_release, usa_tableid,
          base_ptr, false, ok);
    IF  ok
    THEN
        vsc_delete_view := false;
    (*ENDIF*) 
    IF  ok AND NOT (vsc_delete_view)
    THEN
        BEGIN
        IF  base_ptr^.sbase.btablekind = tview
        THEN
            viewscanpar.vsc_delete_view := false
        ELSE
            IF  base_ptr^.sbase.btablekind = tcomplexview
            THEN
                ak31complex_view (acv,
                      base_ptr^.syskey.stableid, viewscanpar)
            (*ENDIF*) 
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  ok AND NOT vsc_delete_view
    THEN
        WITH base_ptr^.sbase DO
            (* local table on serverdb to be dropped *)
            ak31analyze_privileges (acv, vsc_ds_rec, usa_tableid,
                  ds_remote_user_file)
        (*ENDWITH*) 
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
&ifdef trace
(*------------------------------*) 
 
PROCEDURE
      ak31td_table (
            VAR acv   : tak_all_command_glob;
            str30     : tsp_c30;
            VAR tabid : tgg_surrogate);
 
VAR
      ok       : boolean;
      owner    : tsp_knl_identifier;
      base_ptr : tak_sysbufferaddress;
 
BEGIN
WITH acv DO
    BEGIN
    t01str30 (ak_syn, str30);
    a06_systable_get (acv, d_release, tabid, base_ptr, false, ok);
    IF  ok
    THEN
        BEGIN
        a06determine_username (acv, base_ptr^.sbase.bauthid, owner);
        t01lidentifier (ak_syn, owner);
        t01lidentifier (ak_syn, base_ptr^.sbase.btablen^);
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
&endif
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        267
*-PRETTY-*  lines of code :        838        PRETTYX 3.10 
*-PRETTY-*  lines in file :       1251         1997-12-10 
.PA 
