.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$VAK96$
.tt 2 $$$
.tt 3 $ElkeZ$Event-Task$$1999-04-28$
***********************************************************
.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  : Event-Task
=========
.sp
Purpose : This module contains the eventtask
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        PROCEDURE
              a96eventtask (VAR t : tgg00_TransContext);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              Scanner : VAK01;
 
        FUNCTION
              a01swap_int2 (old : tsp00_Int2) : tsp00_Int2;
 
      ------------------------------ 
 
        FROM
              DBS_Commands : VAK93;
 
        PROCEDURE
              a93swap_packet_header (
                    VAR packet_header : tsp1_packet_header;
                    kernel_is_dest : boolean;
                    kernel_swap    : tsp00_SwapKind;
                    host_swap      : tsp00_SwapKind);
 
        PROCEDURE
              a93packet_vtrace (
                    VAR t             : tgg00_TransContext;
                    trace_object      : tgg00_VtraceType;
                    packet_ptr        : tsp1_packet_ptr);
 
        PROCEDURE
              a93swap_to_application (
                    VAR packet       : tsp1_packet_ptr;
                    a_mess_code      : tsp00_CodeType;
                    a_mess_swap      : tsp00_SwapKind;
                    a_parameter_spec : tak_param_list;
                    a_variable_input : boolean);
 
      ------------------------------ 
 
        FROM
              Trace : VBD120;
 
        PROCEDURE
              b120InsertTrace (
                    VAR t        : tgg00_TransContext;
                    trace_layer  : tgg00_Debug;
                    trace_object : tgg00_VtraceType;
                    body_len     : tsp00_Int2;
                    trace_body   : tgg11_VtraceBodyPtr);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01code           : tgg04_CodeGlobals;
              g01vtrace         : tgg00_VtraceState;
 
      ------------------------------ 
 
        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);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-20 : VSP20;
 
        PROCEDURE
              s20swap_int4 (VAR val  : tsp00_Int4;
                    source_swap    : tsp00_SwapKind;
                    destin_swap    : tsp00_SwapKind);
 
      ------------------------------ 
 
        FROM
              Packet_handling: VSP26;
 
        PROCEDURE
              s26finish_part (
                    packet_ptr           : tsp1_packet_ptr;
                    VAR finish_part      : tsp1_part);
 
        PROCEDURE
              s26first_segment_init (
                    packet_ptr                  : tsp1_packet_ptr;
                    segm_kind                   : tsp1_segment_kind;
                    VAR first_segm_ptr          : tsp1_segment_ptr);
 
        PROCEDURE
              s26new_part_init (
                    packet_ptr             : tsp1_packet_ptr;
                    VAR segm               : tsp1_segment;
                    VAR new_part_ptr       : tsp1_part_ptr);
 
        FUNCTION
              s26packet_len (packet_ptr : tsp1_packet_ptr) : tsp00_Int4;
 
        FUNCTION
              s26size_new_part (
                    packet_ptr : tsp1_packet_ptr;
                    VAR segm : tsp1_segment) : tsp00_Int4;
 
      ------------------------------ 
 
        FROM
              RTE_kernel : VEN101;
 
        PROCEDURE
              vconnect (
                    pid                : tsp00_TaskId;
                    VAR net_packet_len : tsp00_Int4;
                    VAR sql_comm_err   : tsp1_comm_error);
 
        PROCEDURE
              vreceive (
                    pid                  : tsp00_TaskId;
                    timeout              : tsp00_Int4;
                    VAR rcv_packet_ptr   : tsp1_packet_ptr;
                    VAR rcv_packet_len   : tsp00_Int4;
                    VAR reply_packet_ptr : tsp1_packet_ptr;
                    VAR reply_packet_len : tsp00_Int4;
                    VAR returncode       : tsp1_comm_error);
 
        PROCEDURE
              vreply (
                    pid              : tsp00_TaskId;
                    reply_packet_ptr : tsp1_packet_ptr;
                    reply_packet_len : tsp00_Int4;
                    VAR returncode   : tsp1_comm_error);
 
        PROCEDURE
              vrelease (pid : tsp00_TaskId);
 
        PROCEDURE
              vwait_for_event (
                    pid         : tsp00_TaskId;
                    VAR event   : tsp31_event_description;
                    VAR errtext : tsp00_ErrText;
                    VAR ok      : boolean);
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : ElkeZ
.sp
.cp 3
Created : 1999-04-15
.sp
.cp 3
.sp
.cp 3
Release :      Date : 1999-04-28
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
.sp 2
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :
 
 
CONST
      c_kernel_is_dest = true  (* a93swap_packet_header *);
      c_variable_input = true  (* a93swap_to_application *);
 
 
(*------------------------------*) 
 
PROCEDURE
      a96eventtask (VAR t : tgg00_TransContext);
 
CONST
      eventerr            = -9413;
      eventsqlstate       = 'S9413';
 
VAR
      do_release        : boolean;
      ok                : boolean;
      changed           : boolean;
      basic_code        : tsp00_CodeType;
      event_len         : integer;
      rcv_packet_len    : tsp00_Int4;
      reply_packet_size : tsp00_Int4;
      timeout           : tsp00_Int4;
      reply_length      : tsp00_Int4;
      net_packet_size   : tsp00_Int4;
      rcv_packet_ptr    : tsp1_packet_ptr;
      reply_packet_ptr  : tsp1_packet_ptr;
      return_segm       : tsp1_segment_ptr;
      curr_retpart      : tsp1_part_ptr;
      data_retpart      : tsp1_part_ptr;
      sql_comm_err      : tsp1_comm_error;
      syserr            : tsp00_C14;
      event             : tsp31_event_description;
      errtext           : tsp00_ErrText;
      tr                : tsp00_Line;
      parameter_spec    : tak_param_list;
 
BEGIN
vconnect (t.trTaskId_gg00, net_packet_size, sql_comm_err);
IF  sql_comm_err = sp1ce_ok
THEN
    BEGIN
    timeout := 0;
    do_release := false;
    WITH parameter_spec DO
        BEGIN
        param_spec_ptr := NIL;
        param_counter  := 0;
        END;
    (*ENDWITH*) 
    WHILE NOT do_release DO
        BEGIN
        vreceive (t.trTaskId_gg00, timeout,
              rcv_packet_ptr, rcv_packet_len,
              reply_packet_ptr, reply_packet_size, sql_comm_err);
        IF  sql_comm_err = sp1ce_ok
        THEN
            IF  rcv_packet_ptr^.sp1_segm.sp1c_mess_type <> sp1m_wait_for_event
            THEN
                sql_comm_err := sp1ce_notok;
            (*ENDIF*) 
        (*ENDIF*) 
        IF  sql_comm_err = sp1ce_ok
        THEN
            BEGIN
            ok := true;
            WITH rcv_packet_ptr^, sp1_header DO
                BEGIN
                IF  sp1h_mess_swap <> g01code.kernel_swap
                THEN
                    a93swap_packet_header (sp1_header,
                          c_kernel_is_dest, g01code.kernel_swap,
                          sp1h_mess_swap);
                (*ENDIF*) 
                IF  g01vtrace.vtrAny_gg00
                THEN
                    a93packet_vtrace (t, ak_receive, rcv_packet_ptr);
                (*ENDIF*) 
                basic_code := sp1h_mess_code;
                END;
            (*ENDWITH*) 
            WITH reply_packet_ptr^ DO
                BEGIN
                sp1_header := rcv_packet_ptr^.sp1_header;
                sp1_header.sp1h_varpart_size := reply_packet_size -
                      sizeof (sp1_header);
                (* the following statement can be dropped when the rte *tsp00_Int4)
                      (* guarantees a properly aligned packet size !!! J.P.  *)
                sp1_header.sp1h_varpart_size := (sp1_header.sp1h_varpart_size DIV
                      csp1_part_align_length) * csp1_part_align_length;
                END;
            (*ENDWITH*) 
            s26first_segment_init (reply_packet_ptr, sp1sk_return, return_segm);
            curr_retpart := NIL;
            IF  s26size_new_part (reply_packet_ptr, return_segm^) > 0
            THEN
                s26new_part_init (reply_packet_ptr,
                      return_segm^, curr_retpart);
            (*ENDIF*) 
            IF  ok
            THEN
                BEGIN
                IF  curr_retpart = NIL
                THEN
                    ok := false
                ELSE
                    WITH curr_retpart^ DO
                        IF  sp1p_buf_size < sp1p_buf_len + 1 + sizeof(event)
                        THEN
                            ok := false;
                        (*ENDIF*) 
                    (*ENDWITH*) 
                (*ENDIF*) 
                IF  NOT ok
                THEN
                    errtext := 'Too small packet size                   '
                ELSE
                    vwait_for_event (t.trTaskId_gg00, event,
                          errtext, ok);
                (*ENDIF*) 
                END;
            (*ENDIF*) 
            return_segm^.sp1r_function_code  := csp1_diagnose_fc;
            IF  NOT ok
            THEN
                BEGIN
                WITH return_segm^ DO
                    BEGIN
                    sp1r_sqlstate       := eventsqlstate;
                    sp1r_returncode     := eventerr;
                    END;
                (*ENDWITH*) 
                WITH curr_retpart^ DO
                    BEGIN
                    IF  sp1p_buf_size >= sp1p_buf_len +
                        sizeof(syserr) + sizeof(errtext)
                    THEN
                        syserr := 'System error: ';
                    (*ENDIF*) 
                    SAPDB_PascalForcedMove (sizeof (syserr), sp1p_buf_size,
                          @syserr, 1, @sp1p_buf, sp1p_buf_len + 1,
                          sizeof (syserr));
                    sp1p_buf_len := sp1p_buf_len + sizeof (syserr);
                    SAPDB_PascalForcedMove (sizeof (errtext), sp1p_buf_size,
                          @errtext, 1, @sp1p_buf, sp1p_buf_len + 1,
                          sizeof (errtext));
                    sp1p_buf_len := sp1p_buf_len + sizeof (errtext);
                    END
                (*ENDWITH*) 
                END
            ELSE
                BEGIN
                data_retpart := curr_retpart;
                IF  (event.sp31ed_text_len < 0) OR
                    (event.sp31ed_text_len > sizeof(event.sp31ed_text_value))
                THEN
                    event.sp31ed_text_len := 0;
                (*ENDIF*) 
                event_len := sizeof (event) - sizeof(event.sp31ed_text_value)
                      + event.sp31ed_text_len;
                WITH curr_retpart^ DO
                    BEGIN
                    sp1p_buf[ sp1p_buf_len + 1 ] := csp_defined_byte;
                    SAPDB_PascalForcedMove (sizeof(event), sp1p_buf_size,
                          @event, 1, @sp1p_buf, sp1p_buf_len + 2, event_len);
                    sp1p_buf_len := sp1p_buf_len + 1 + event_len;
                    sp1p_part_kind := sp1pk_data;
                    END
                (*ENDWITH*) 
                END;
            (*ENDIF*) 
            curr_retpart^.sp1p_arg_count := 1;
            s26finish_part (reply_packet_ptr, curr_retpart^);
            reply_length := s26packet_len (reply_packet_ptr);
            reply_packet_ptr^.sp1_header.sp1h_varpart_len := reply_length
                  - sizeof (reply_packet_ptr^.sp1_header);
            IF  g01vtrace.vtrAny_gg00
            THEN
                a93packet_vtrace (t, ak_send, reply_packet_ptr);
            (*ENDIF*) 
            IF  ok
            THEN
                WITH event, return_segm^ DO
                    BEGIN
                    changed := false;
                    IF  basic_code < csp_unicode_swap
                    THEN
                        BEGIN
                        (* not in case of multibyte_sets *)
                        IF  g01code.ctype <> basic_code
                        THEN
                            changed := true;
                        (*ENDIF*) 
                        IF  basic_code <> reply_packet_ptr^.sp1_header.sp1h_mess_code
                        THEN
                            changed := true;
                        (*ENDIF*) 
                        END;
                    (*ENDIF*) 
                    IF  reply_packet_ptr^.sp1_header.sp1h_mess_swap <> g01code.kernel_swap
                    THEN
                        BEGIN
                        changed := true;
                        s20swap_int4 (sp31ed_value_1, g01code.kernel_swap,
                              reply_packet_ptr^.sp1_header.sp1h_mess_swap);
                        s20swap_int4 (sp31ed_value_2, g01code.kernel_swap,
                              reply_packet_ptr^.sp1_header.sp1h_mess_swap);
                        s20swap_int4 (sp31ed_eventcnt, g01code.kernel_swap,
                              reply_packet_ptr^.sp1_header.sp1h_mess_swap);
                        sp31ed_text_len := a01swap_int2 (sp31ed_text_len);
                        END;
                    (*ENDIF*) 
                    IF  changed
                    THEN
                        WITH data_retpart^ DO
                            SAPDB_PascalForcedMove (sizeof(event), sp1p_buf_size,
                                  @event, 1, @sp1p_buf, sp1p_buf_len + 1, event_len);
                        (*ENDWITH*) 
                    (*ENDIF*) 
                    END;
                (*ENDWITH*) 
            (*ENDIF*) 
            a93swap_to_application (reply_packet_ptr,
                  reply_packet_ptr^.sp1_header.sp1h_mess_code,
                  reply_packet_ptr^.sp1_header.sp1h_mess_swap,
                  parameter_spec, NOT c_variable_input);
            vreply (t.trTaskId_gg00, reply_packet_ptr,
                  reply_length, sql_comm_err)
            END;
        (*ENDIF*) 
        IF  sql_comm_err <> sp1ce_ok
        THEN
            BEGIN
            IF  g01vtrace.vtrAny_gg00
            THEN
                BEGIN
                tr[ 1 ] := chr(ord(sql_comm_err));
                b120InsertTrace (t, ak_receive_error, td_none, 1, @tr);
                END;
            (*ENDIF*) 
            do_release := true;
            vrelease (t.trTaskId_gg00)
            END
        (*ENDIF*) 
        END
    (*ENDWHILE*) 
    END
(*ENDIF*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
