.ad 8
.bm 8
.fm 4
.bt $Copyright (c) 2000-2005 SAP AG$$Page %$
.tm 12
.hm 6
.hs 3
.TT 1 $SQL$Project Distributed Database System$VAK261$
.tt 2 $$$
.TT 3 $ThomasA$AK_Stored_Procedure_DDL$$2000-09-18$
***********************************************************
.nf
 
 .nf
 
    ========== licence begin  GPL
    Copyright (c) 2000-2005 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
 
 
.fo
.nf
.sp
MODULE  : AK_Stored_Procedure_DDL
=========
.sp
Purpose :
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        PROCEDURE
              a261drop_procedure (VAR acv : tak_all_command_glob;
                    VAR procbuf  : tak_sysbufferaddress);
 
        PROCEDURE
              a261proc_handling (VAR acv : tak_all_command_glob);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              AK_usertab_tools : VAK19;
 
        PROCEDURE
              a19del_usertab  (VAR acv : tak_all_command_glob;
                    VAR user      : tgg00_Surrogate;
                    VAR surrogate : tgg00_Surrogate);
 
        PROCEDURE
              a19DelSystemTab  (VAR acv : tak_all_command_glob;
                    VAR surrogate  : tgg00_Surrogate);
 
        PROCEDURE
              a19add_usertab  (VAR acv : tak_all_command_glob;
                    VAR user       : tgg00_Surrogate;
                    VAR surrogate  : tgg00_Surrogate;
                    surrogate_desc : tak_usertab_descriptor);
 
      ------------------------------ 
 
        FROM
              Scanner : VAK01;
 
        VAR
              a01defaultkey       : tgg00_SysInfoKey;
              a01_i_public        : tsp00_KnlIdentifier;
              a01_il_b_identifier : tsp00_KnlIdentifier;
 
      ------------------------------ 
 
        FROM
              AK_semantic_scanner_tools : VAK05;
 
        PROCEDURE
              a05identifier_get (VAR acv : tak_all_command_glob;
                    tree_index  : integer;
                    obj_len     : integer;
                    VAR moveobj : tsp00_C256);
 
      ------------------------------ 
 
        FROM
              AK_universal_semantic_tools : VAK06;
 
        PROCEDURE
              a06check_username (VAR acv : tak_all_command_glob;
                    VAR auth   : tsp00_KnlIdentifier;
                    VAR is_dba : boolean;
                    VAR ok     : boolean);
 
        PROCEDURE
              a06determine_username (VAR acv : tak_all_command_glob;
                    VAR userid    : tgg00_Surrogate;
                    VAR user_name : tsp00_KnlIdentifier);
 
        PROCEDURE
              a06get_username (VAR acv : tak_all_command_glob;
                    VAR tree_index : integer;
                    VAR username   : tsp00_KnlIdentifier);
 
        PROCEDURE
              a06inc_linkage (VAR linkage : tsp00_C2);
 
      ------------------------------ 
 
        FROM
              AK_error_handling : VAK07;
 
        PROCEDURE
              a07_b_put_error (VAR acv : tak_all_command_glob;
                    b_err    : tgg00_BasisError;
                    err_code : tsp00_Int4);
 
        PROCEDURE
              a07_nb_put_error (VAR acv : tak_all_command_glob;
                    b_err    : tgg00_BasisError;
                    err_code : tsp00_Int4;
                    VAR n    : tsp00_KnlIdentifier);
 
        PROCEDURE
              a07_kw_put_error (
                    VAR acv  : tak_all_command_glob;
                    b_err    : tgg00_BasisError;
                    err_code : tsp00_Int4;
                    kw       : integer);
 
      ------------------------------ 
 
        FROM
              Systeminfo_cache :  VAK10;
 
        PROCEDURE
              a10get_sysinfo (VAR acv : tak_all_command_glob;
                    VAR syskey   : tgg00_SysInfoKey;
                    dstate       : tak_directory_state;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg00_BasisError);
 
        PROCEDURE
              a10add_sysinfo (VAR acv : tak_all_command_glob;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg00_BasisError);
 
        PROCEDURE
              a10_cache_delete  (VAR acv : tak_all_command_glob;
                    is_rollback : boolean);
 
        PROCEDURE
              a10_del_tab_sysinfo  (
                    VAR acv     : tak_all_command_glob;
                    VAR tableid : tgg00_Surrogate;
                    VAR qual    : tak_del_tab_qual;
                    temp_table  : boolean;
                    VAR b_err   : tgg00_BasisError);
 
        PROCEDURE
              a10repl_sysinfo (VAR acv : tak_all_command_glob;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg00_BasisError);
 
        PROCEDURE
              a10del_sysinfo (VAR acv : tak_all_command_glob;
                    VAR syskey   : tgg00_SysInfoKey;
                    VAR b_err    : tgg00_BasisError);
 
        PROCEDURE
              a10next_sysinfo (VAR acv : tak_all_command_glob;
                    VAR syskey    : tgg00_SysInfoKey;
                    stop_prefix   : integer;
                    dstate        : tak_directory_state;
                    rec_kind      : tsp00_C2;
                    VAR syspoint  : tak_sysbufferaddress;
                    VAR b_err     : tgg00_BasisError);
 
        PROCEDURE
              a10_fix_len_get_sysinfo (VAR acv : tak_all_command_glob;
                    VAR syskey   : tgg00_SysInfoKey;
                    dstate       : tak_directory_state;
                    required_len : integer;
                    plus         : integer;
                    VAR syspoint : tak_sysbufferaddress;
                    VAR b_err    : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              CatalogWrapper : VAK103;
 
        PROCEDURE
              a103CheckDropInPrivilege (
                    VAR acv        : tak_all_command_glob;
                    VAR schemaName : tsp00_KnlIdentifier (* ptocConst *);
                    errorPos       : integer);
 
      ------------------------------ 
 
        FROM
              AK_Table : VAK11;
 
        PROCEDURE
              a11put_date_time (VAR date : tsp00_Int4;
                    VAR time : tsp00_Int4);
 
        PROCEDURE
              a11del_usage_entry (VAR acv : tak_all_command_glob;
                    VAR usa_tabid : tgg00_Surrogate;
                    VAR del_tabid : tgg00_Surrogate);
 
      ------------------------------ 
 
        FROM
              AK_Domain : VAK12;
 
        FUNCTION
              a12dbproc_exist (VAR acv : tak_all_command_glob;
                    VAR owner      : tsp00_KnlIdentifier;
                    VAR dbproc     : tsp00_KnlIdentifier;
                    dstate         : tak_directory_state;
                    VAR method_buf : tak_sysbufferaddress) : boolean;
 
        FUNCTION
              a12DBFuncExistsNoPrivCheck (VAR acv : tak_all_command_glob;
                    VAR schema      : tsp00_KnlIdentifier;
                    VAR dbfunc_name : tsp00_KnlIdentifier;
                    dstate          : tak_directory_state;
                    VAR method_buf  : tak_sysbufferaddress) : boolean;
 
        FUNCTION
              a12dbfunc_exist (VAR acv : tak_all_command_glob;
                    VAR owner       : tsp00_KnlIdentifier;
                    VAR dbfunc_name : tsp00_KnlIdentifier;
                    dstate          : tak_directory_state;
                    VAR method_buf  : tak_sysbufferaddress) : boolean;
 
        FUNCTION
              a12SystemTriggerExists (VAR acv : tak_all_command_glob;
                    VAR schema     : tsp00_KnlIdentifier;
                    VAR dbproc     : tsp00_KnlIdentifier;
                    dstate         : tak_directory_state;
                    VAR method_buf : tak_sysbufferaddress) : boolean;
 
      ------------------------------ 
 
        FROM
              AK_Grant_Revoke : VAK22;
 
        FUNCTION
              a22exist_user  (VAR acv : tak_all_command_glob;
                    VAR user      : tsp00_KnlIdentifier;
                    errorpos      : integer;
                    VAR user_info : tak_user_info) : boolean;
 
      ------------------------------ 
 
        FROM
              AK_dialog_tools : VAK260;
 
        PROCEDURE
              a260get_proc (VAR acv : tak_all_command_glob;
                    VAR authname   : tsp00_KnlIdentifier;
                    VAR proc       : tsp00_KnlIdentifier;
                    VAR tree_index : integer);
 
        PROCEDURE
              a260GetDBProcOwner (
                    VAR acv          : tak_all_command_glob;
                    VAR MethodRecord : tak_methodrecord;
                    VAR OwnerId      : tgg00_Surrogate);
 
        FUNCTION
              a260IsInternalDBProc (VAR MethodRec : tak_methodrecord) : boolean;
 
      ------------------------------ 
 
        FROM
              SQLManager : vak101;
 
        PROCEDURE
              a101_InvalidateListAppend (
                    VAR acv       : tak_all_command_glob;
                    VAR SchemaId  : tgg00_Surrogate;
                    VAR Tablename : tsp00_KnlIdentifier);
 
      ------------------------------ 
 
        FROM
              AK_Trigger : VAK262;
 
        PROCEDURE
              a262CreateDBProc (VAR acv : tak_all_command_glob;
                    isSystemTrigger : boolean);
 
        PROCEDURE
              a262DBFuncCreate (VAR acv : tak_all_command_glob;
                    isPublic : boolean);
 
        PROCEDURE
              a262LoadCode (VAR acv : tak_all_command_glob;
                    VAR CodeId  : tgg00_Surrogate;
                    Linkage     : tsp00_C2;
                    VAR p       : tak_sysbufferaddress);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01tabid : tgg04_TabIdGlobals;
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG101;
 
        PROCEDURE
              SAPDB_PascalForcedMove (
                    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);
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        PROCEDURE
              a05identifier_get;
 
              tsp00_MoveObj tsp00_C256
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : ThomasA
.sp
.cp 3
Created : 1989-08-29
.sp
.cp 3
.sp
.cp 3
Release :      Date : 2000-09-18
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
.sp 4
.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_is_rollback = true;
 
 
(*------------------------------*) 
 
PROCEDURE
      ak261all_revoke_execute (VAR acv : tak_all_command_glob;
            VAR ProcId  : tgg00_Surrogate;
            VAR OwnerId : tgg00_Surrogate);
 
VAR
      ok          : boolean;
      is_dba      : boolean;
      b_err       : tgg00_BasisError;
      sysbuf      : tak_sysbufferaddress;
      sysk_ptr    : ^tgg00_SysInfoKey;
      user_name   : tsp00_KnlIdentifier;
      sysk        : tgg00_SysInfoKey;
 
BEGIN
WITH acv, a_mblock DO
    BEGIN
    sysk.stableid  := ProcId;
    sysk.sentrytyp := cak_eprocpriv;
    sysk.skeylen   := SURROGATE_MXGG00 + 2;
    (* find out all users that have the execute privilege for *)
    (* the current procedure and delete it from their         *)
    (* tusertab record                                        *)
    REPEAT
        a10next_sysinfo (acv, sysk, SURROGATE_MXGG00+2, d_release,
              cak_eprocpriv, sysbuf, b_err);
        IF  b_err = e_ok
        THEN
            BEGIN
            IF  sysbuf^.syskey.suserid = cak_public_id
            THEN
                ok := true
            ELSE
                BEGIN
                a06determine_username (acv,
                      sysbuf^.syskey.suserid, user_name);
                a06check_username (acv, user_name, is_dba, ok)
                END;
            (*ENDIF*) 
            IF  ok
            THEN
                a19del_usertab (acv,
                      sysbuf^.syskey.suserid, sysk.stableid);
            (*ENDIF*) 
            END;
        (*ENDIF*) 
    UNTIL
        b_err <> e_ok;
    (*ENDREPEAT*) 
    IF  b_err = e_no_next_record
    THEN (* delete procedure from usertab record of the owner *)
        a19del_usertab (acv, OwnerId, sysk.stableid);
    (*ENDIF*) 
    IF  b_err <> e_no_next_record
    THEN
        a07_b_put_error (acv, b_err, 1);
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak261drop_proc (VAR acv : tak_all_command_glob;
            isDBFunction    : boolean;
            isPublic        : boolean;
            isSystemTrigger : boolean);
 
VAR
      tree_index : integer;
      packageId  : tgg00_Surrogate;
      dbprocId   : tgg00_Surrogate;
      schemaName : tsp00_KnlIdentifier;
      proc       : tsp00_KnlIdentifier;
      procbuf    : tak_sysbufferaddress;
 
BEGIN
WITH acv, a_mblock DO
    BEGIN
    tree_index := 2;
    a260get_proc (acv, schemaName, proc, tree_index);
    IF  NOT isPublic AND (schemaName <> a_curr_user_name)
    THEN
        IF  NOT acv.a_in_ddl_trigger (* PTS 1133300 TA 2005-01-11 *)
        THEN
            a103CheckDropInPrivilege (acv, schemaName, a_ap_tree^[ 2 ].n_pos);
        (*ENDIF*) 
    (*ENDIF*) 
    IF  acv.a_returncode = 0
    THEN
        IF  isDBFunction
        THEN
            BEGIN
            IF  isPublic
            THEN
                schemaName := a01_i_public;
            (*ENDIF*) 
            IF  NOT a12DBFuncExistsNoPrivCheck (acv, schemaName, proc, d_fix, procbuf)
            THEN
                a07_nb_put_error (acv, e_unknown_functionname,
                      a_ap_tree^[ 2 ].n_pos, proc)
            ELSE
                IF  isPublic
                THEN
                    IF  procbuf^.smethod.me_owner <> acv.a_curr_user_id
                    THEN
                        a07_kw_put_error (acv, e_missing_privilege, 1, cak_i_userid)
                    (*ENDIF*) 
                (*ENDIF*) 
            (*ENDIF*) 
            END
        ELSE
            IF  isSystemTrigger
            THEN
                BEGIN
                IF  NOT a12SystemTriggerExists (acv, schemaName, proc, d_fix, procbuf)
                THEN
                    a07_nb_put_error (acv, e_unknown_name, a_ap_tree^[ 2 ].n_pos, proc)
                (*ENDIF*) 
                END
            ELSE
                IF  NOT a12dbproc_exist (acv, schemaName, proc, d_fix, procbuf)
                THEN
                    a07_nb_put_error (acv, e_unknown_procedure_name,
                          a_ap_tree^[ 2 ].n_pos, proc);
                (*ENDIF*) 
            (*ENDIF*) 
        (*ENDIF*) 
    (*ENDIF*) 
    IF  a_returncode = 0
    THEN
        BEGIN
        packageId := procbuf^.smethod.me_package_id;
        dbprocId  := procbuf^.smethod.me_surrogate;
        a261drop_procedure (acv, procbuf);
        IF  isSystemTrigger (* PTS 1133300 TA 2005-01-11 *)
        THEN
            a19DelSystemTab  (acv, dbprocId);
        (*ENDIF*) 
        a11del_usage_entry (acv, packageId, dbprocId)
        END;
    (*ENDIF*) 
    IF  a_returncode <> 0
    THEN
        a_part_rollback := true
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak261grant_execute (VAR acv : tak_all_command_glob;
            grant_execute : boolean);
 
VAR
      ok         : boolean;
      to_public  : boolean;
      usertab_upd: boolean;
      b_err      : tgg00_BasisError;
      tree_index : integer;
      err_pos    : integer;
      ownerId    : tgg00_Surrogate;
      procbuf    : tak_sysbufferaddress;
      privbuf    : tak_sysbufferaddress;
      authname   : tsp00_KnlIdentifier;
      proc       : tsp00_KnlIdentifier;
      grantee    : tsp00_KnlIdentifier;
      user_info  : tak_user_info;
      sysk       : tgg00_SysInfoKey;
 
BEGIN
WITH acv, a_mblock DO
    BEGIN
    tree_index := 2;
    a260get_proc (acv, authname, proc, tree_index);
    IF  NOT a12dbproc_exist (acv, authname, proc, d_fix, procbuf)
    THEN
        IF  NOT a12dbfunc_exist (acv, authname, proc, d_fix, procbuf)
        THEN
            a07_nb_put_error (acv, e_unknown_procedure_name,
                  a_ap_tree^[ 2 ].n_pos, proc);
        (*ENDIF*) 
    (*ENDIF*) 
    IF  a_returncode = 0
    THEN
        BEGIN
        a260GetDBProcOwner (acv, procbuf^.smethod, ownerId);
        IF  ownerId <> acv.a_curr_user_id
        THEN
            a07_kw_put_error (acv, e_missing_privilege, 1, cak_i_userid)
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  a_returncode = 0
    THEN
        BEGIN
        sysk.stableid  := procbuf^.smethod.me_surrogate;
        sysk.sentrytyp := cak_eprocpriv;
        sysk.slinkage  := cak_init_linkage;
        sysk.skeylen   := mxak_standard_sysk + SURROGATE_MXGG00;
        REPEAT
            a06get_username (acv, tree_index, grantee);
            err_pos   := a_ap_tree^[tree_index].n_pos;
            to_public := grantee = a01_i_public ;
            IF  NOT to_public
            THEN
                IF  grantee = authname
                THEN
                    a07_nb_put_error (acv,
                          e_user_not_allowed, err_pos, grantee)
                ELSE
                    ok := a22exist_user (acv, grantee,
                          err_pos, user_info)
                (*ENDIF*) 
            ELSE
                user_info.ui_id := cak_public_id;
            (*ENDIF*) 
            IF  a_returncode = 0
            THEN
                BEGIN
                usertab_upd  := false;
                sysk.suserid := user_info.ui_id;
                IF  grant_execute
                THEN (* grant execute *)
                    BEGIN
                    (* search fr procpriv record *)
                    a10_fix_len_get_sysinfo (acv, sysk, d_release,
                          sizeof (tak_proc_seq_privilege), 0,
                          privbuf, b_err);
                    IF  (a_returncode = 0) AND
                        (b_err = e_sysinfo_not_found)
                    THEN
                        BEGIN
                        WITH privbuf^.sprocseqpriv DO
                            BEGIN
                            psp_seqmentid :=
                                  procbuf^.smethod.me_segmentid;
                            psp_grantOption := false;
                            psp_priv        := [];
                            a11put_date_time (psp_date, psp_time)
                            END;
                        (*ENDWITH*) 
                        a10add_sysinfo (acv, privbuf, b_err);
                        usertab_upd := true
                        END;
                    (*ENDIF*) 
                    END
                ELSE (* revoke execute *)
                    BEGIN
                    (* delete privproc record *)
                    a10del_sysinfo (acv, sysk, b_err);
                    IF  b_err = e_sysinfo_not_found
                    THEN
                        b_err := e_ok
                    ELSE
                        usertab_upd := true
                    (*ENDIF*) 
                    END;
                (*ENDIF*) 
                IF  b_err <> e_ok
                THEN
                    a07_b_put_error (acv, b_err, 1)
                ELSE
                    IF  usertab_upd
                    THEN (* update usertab record of grantee *)
                        IF  grant_execute
                        THEN (* grant execute *)
                            a19add_usertab (acv, user_info.ui_id,
                                  sysk.stableid, ut_procedure)
                        ELSE (* revoke execute *)
                            a19del_usertab (acv,
                                  user_info.ui_id, sysk.stableid);
                        (*ENDIF*) 
                    (*ENDIF*) 
                (*ENDIF*) 
                END;
            (*ENDIF*) 
        UNTIL
            (tree_index = 0) OR (a_returncode <> 0)
        (*ENDREPEAT*) 
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a261drop_procedure (VAR acv : tak_all_command_glob;
            VAR procbuf  : tak_sysbufferaddress);
 
CONST
      cTempTable= true;
 
VAR
      isFunction      : boolean;
      b_err           : tgg00_BasisError;
      dbprocinfobuf   : tak_sysbufferaddress;
      pCode           : tak_sysbufferaddress;
      procId          : tgg00_Surrogate;
      ownerId         : tgg00_Surrogate;
      qual            : tak_del_tab_qual;
      sysk            : tgg00_SysInfoKey;
 
BEGIN
WITH acv DO
    BEGIN
    isFunction := procbuf^.smethod.me_type = dbo_dbfunc;
    procId     := procbuf^.smethod.me_surrogate;
    IF  a260IsInternalDBProc (procbuf^.smethod)
    THEN
        BEGIN
        (* current db procedure is an internal procedure, drop code *)
        a262LoadCode (acv, procId, cak_init_linkage, pCode);
        IF  a_returncode = 0
        THEN
            BEGIN
            a10del_sysinfo (acv, pCode^.syskey, b_err);
            IF  b_err <> e_ok
            THEN
                a07_b_put_error (acv, b_err, 1);
            (*ENDIF*) 
            END
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  a_returncode = 0
    THEN
        BEGIN (* get info record of procedure *)
        sysk           := procbuf^.syskey;
        sysk.sentrytyp := cak_emethodinfo;
        a10get_sysinfo (acv, sysk, d_fix, dbprocinfobuf, b_err);
        IF  b_err <> e_ok
        THEN
            a07_b_put_error (acv, b_err, 1);
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  (a_returncode = 0) AND isFunction
    THEN
        a101_InvalidateListAppend (acv, dbprocinfobuf^.smethodinfo.mei_schema,
              dbprocinfobuf^.smethodinfo.mei_name);
    (*ENDIF*) 
    IF  a_returncode = 0
    THEN
        BEGIN
        ownerId        := dbprocinfobuf^.smethodinfo.mei_owner;
        sysk           := a01defaultkey;
        sysk.sauthid   := dbprocinfobuf^.smethodinfo.mei_schema;
        sysk.sentrytyp := cak_emethodref;
        sysk.sappl     := dbprocinfobuf^.smethodinfo.mei_name;
        sysk.skeylen   := sysk.skeylen + sizeof (sysk.sappl);
        a10del_sysinfo (acv, sysk, b_err);
        IF  (b_err <> e_ok) AND (b_err <> e_sysinfo_not_found)
        THEN
            a07_b_put_error (acv, b_err, 1)
        ELSE
            ak261all_revoke_execute (acv, procId, ownerId);
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  a_returncode = 0
    THEN
        BEGIN (* delete all catalog records of procedure *)
        qual.del_colno := 0;
        a10_del_tab_sysinfo  (acv, procId, qual, NOT cTempTable, b_err);
        IF  b_err <> e_ok
        THEN
            a07_b_put_error (acv, b_err, 1)
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      a261proc_handling (VAR acv : tak_all_command_glob);
 
VAR
      tree_index : tsp00_Int4;
 
BEGIN
WITH acv.a_ap_tree^[ acv.a_ap_tree^[ 0 ].n_lo_level ] DO
    BEGIN
    a10_cache_delete (acv, NOT c_is_rollback);
    tree_index := n_sa_level;
    CASE n_subproc OF
        cak_i_create :
            IF  n_length in [cak_i_function, cak_i_public]
            THEN
                a262DBFuncCreate (acv, n_length = cak_i_public)
            ELSE
                a262CreateDBProc (acv, n_length = cak_i_system);
            (*ENDIF*) 
        cak_i_alter :
            ak261alter_dbproc (acv, tree_index);
        cak_i_drop, cak_i_public :
            ak261drop_proc (acv, n_pos in [cak_i_function, cak_i_public],
                  n_pos = cak_i_public, n_pos = cak_i_system);
        cak_i_grant, cak_i_revoke :
            ak261grant_execute (acv,
                  acv.a_ap_tree^[ acv.a_ap_tree^[ 0 ].n_lo_level ].n_subproc =
                  cak_i_grant);
        END;
    (*ENDCASE*) 
    END;
(*ENDWITH*) 
IF  acv.a_returncode <> 0
THEN
    BEGIN
    a10_cache_delete (acv, c_is_rollback);
    acv.a_part_rollback := true
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      ak261alter_dbproc (VAR acv : tak_all_command_glob;
            VAR tree_index : integer);
 
CONST
      c_found = csp_maxint2;
 
VAR
      ti         : tsp00_Int4;
      ix         : integer;
      jx         : integer;
      b_err      : tgg00_BasisError;
      authname   : tsp00_KnlIdentifier;
      proc       : tsp00_KnlIdentifier;
      procbuf    : tak_sysbufferaddress;
      param      : tsp00_C256;
      curr_param : tsp00_C256;
 
BEGIN
WITH acv, a_mblock DO
    BEGIN
    a260get_proc (acv, authname, proc, tree_index);
    IF  authname <> a_curr_user_name
    THEN
        a07_b_put_error (acv, e_missing_privilege, 1)
    ELSE
        IF  NOT a12dbproc_exist (acv, authname, proc, d_fix, procbuf)
        THEN
            a07_b_put_error (acv, e_unknown_procedure_name,
                  a_ap_tree^[ 2 ].n_pos);
        (*ENDIF*) 
    (*ENDIF*) 
    IF  a_returncode = 0
    THEN
        BEGIN
        ti := a_ap_tree^[0].n_lo_level;
        IF  a_ap_tree^[ti].n_length = cak_i_param
        THEN
            BEGIN
            ti := a_ap_tree^[ti].n_lo_level;
            a05identifier_get (acv, ti, sizeof(param), param);
            ti := a_ap_tree^[ti].n_sa_level;
            ix := 1;
            WHILE (ix < procbuf^.smethod.me_param_cnt) DO
                WITH procbuf^.smethod.me_param_list[ix]^ DO
                    BEGIN
                    SAPDB_PascalForcedMove (sizeof (param_name), sizeof(curr_param),
                          @param_name, 1, @curr_param, 1, ord(param_name_len));
                    FOR jx := ord(param_name_len) + 1 TO sizeof (curr_param) DO
                        curr_param[jx] := ' ';
                    (*ENDFOR*) 
                    IF  curr_param = param
                    THEN
                        BEGIN
                        ix := c_found;
                        CASE param_datatype OF
                            dcha, dchb :
                                CASE a_ap_tree^[ti].n_subproc OF
                                    cak_i_ascii :
                                        param_datatype := dcha;
                                    OTHERWISE
                                        param_datatype := dchb;
                                    END;
                                (*ENDCASE*) 
                            OTHERWISE
                                a07_b_put_error (acv, e_incompatible_datatypes, 1);
                            END;
                        (*ENDCASE*) 
                        END
                    ELSE
                        ix := ix + 1;
                    (*ENDIF*) 
                    END;
                (*ENDWITH*) 
            (*ENDWHILE*) 
            IF  ix <> c_found
            THEN
                a07_b_put_error (acv, e_unknown_name, 1)
            (*ENDIF*) 
            END
        ELSE
            IF  a_ap_tree^[ti].n_length = cak_i_on
            THEN
                procbuf^.smethod.me_debug := dbg_local
            ELSE
                procbuf^.smethod.me_debug := dbg_inproc;
            (*ENDIF*) 
        (*ENDIF*) 
        a10repl_sysinfo (acv, procbuf, b_err);
        IF  b_err <> e_ok
        THEN
            a07_b_put_error (acv, b_err, 1)
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  a_returncode <> 0
    THEN
        a_part_rollback := true
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
