.CM  SCRIPT , Version - 1.1 , last edited by D.Dittmar
.pa
.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$VIN22$
.tt 2 $$$
.TT 3 $DanielD$SQLDB-command-interface$1995-07-27$
***********************************************************
.nf
 
.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
 
 
.fo
.nf
.sp
MODULE  : SQLDB-long-support
=========
.sp
Purpose :
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        PROCEDURE
              i22igetval (
                    g_area : tin_global_in_vars;
                    cnt    : tsp00_Int2 );
 
        FUNCTION
              i22lcnt (
                    g_area : tin_global_in_vars ) : tsp00_Int2;
 
        PROCEDURE
              i22pldesc (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tsp00_LongDescriptor;
                    max_read      : tsp00_Int4 );
 
        PROCEDURE
              i22gldesc (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tsp00_LongDescriptor;
                    idx           : integer );
 
        PROCEDURE
              i22gnextdesc (
                    g_area        : tin_global_in_vars;
                    VAR prev_desc : tsp00_LongDescriptor;
                    VAR long_desc : tsp00_LongDescriptor );
 
        PROCEDURE
              i22glong (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tsp00_LongDescriptor;
                    VAR buf       : tsp00_AnyPackedChar;
                    VAR bufpos    : tsp00_Int4;
                    buflen        : tsp00_Int4 );
 
        PROCEDURE
              i22iinslong (
                    g_area : tin_global_in_vars );
 
        PROCEDURE
              i22iputval (
                    g_area : tin_global_in_vars );
 
        PROCEDURE
              i22ldempty (
                    g_area    : tin_global_in_vars;
                    bufpos    : tsp00_Int4;
                    var_index : char;
                    is_null   : boolean );
 
        PROCEDURE
              i22inslong (
                    g_area        : tin_global_in_vars;
                    ld_pos        : tsp00_Int4;
                    VAR buf       : tsp00_AnyPackedChar;
                    VAR bufpos    : tsp00_Int4;
                    buflen        : tsp00_Int4;
                    VAR full      : boolean );
 
        PROCEDURE
              i22plong (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tsp00_LongDescriptor;
                    VAR buf       : tsp00_AnyPackedChar;
                    VAR bufpos    : tsp00_Int4;
                    buflen        : tsp00_Int4;
                    VAR full      : boolean );
 
        PROCEDURE
              i22npldesc (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tin_long_desc_type;
                    max_read      : tsp00_Int4 );
 
        PROCEDURE
              i22ngldesc (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tin_long_desc_type;
                    idx           : integer );
 
        PROCEDURE
              i22nldempty (
                    g_area    : tin_global_in_vars;
                    bufpos    : tsp00_Int4;
                    var_index : char;
                    is_null   : boolean;
                    newlong   : boolean );
 
        PROCEDURE
              i22ngnextdesc (
                    g_area        : tin_global_in_vars;
                    VAR prev_desc : tin_long_desc_type;
                    VAR long_desc : tin_long_desc_type );
 
        PROCEDURE
              i22nglong (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tin_long_desc_type;
                    VAR buf       : tsp00_AnyPackedChar;
                    VAR bufpos    : tsp00_Int4;
                    buflen        : tsp00_Int4 );
 
        PROCEDURE
              i22nplong (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tin_long_desc_type;
                    VAR buf       : tsp00_AnyPackedChar;
                    VAR bufpos    : tsp00_Int4;
                    buflen        : tsp00_Int4;
                    VAR full      : boolean );
 
        FUNCTION
              i22nvalind (
                    VAR long_desc : tin_long_desc_type ) : integer;
 
        FUNCTION
              i22nvallen (
                    VAR long_desc : tin_long_desc_type ) : integer;
 
        FUNCTION
              i22nvalmode (
                    VAR long_desc : tin_long_desc_type ) : tsp00_ValMode;
 
        PROCEDURE
              i22setvalmode (
                    VAR long_desc : tin_long_desc_type;
                    valmode       : tsp00_ValMode);
 
        PROCEDURE
              i22ngpackeddesc (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tin_long_desc_type;
                    VAR pos       : integer);
 
        PROCEDURE
              i22ngdatadesc (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tin_long_desc_type );
 
        PROCEDURE
              i22ngdesc (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tin_long_desc_type;
                    pos           : integer;
                    VAR isnull    : boolean);
 
        PROCEDURE
              i22ninslong (
                    g_area        : tin_global_in_vars;
                    desc_pos      : tsp00_Int4;
                    VAR buf       : tsp00_AnyPackedChar;
                    VAR bufpos    : tsp00_Int4;
                    buflen        : tsp00_Int4;
                    fillchar      : char;
                    VAR full      : boolean );
 
        FUNCTION
              in2230 : tsp00_Int4;
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              SQLDB-command-interface: VIN21;
 
        PROCEDURE
              i21findpart (
                    g_area    : tin_global_in_vars;
                    part_kind : tsp1_part_kind);
 
        PROCEDURE
              i21abort;
 
        PROCEDURE
              i21p1barg (
                    g_area  : tin_global_in_vars;
                    VAR arg : tsp00_LongDescriptor;
                    b_pos   : tsp00_Int4;
                    l_arg   : tin_natural;
                    is_null : boolean);
 
        PROCEDURE
              i21p2barg (
                    g_area  : tin_global_in_vars;
                    VAR arg : tsp00_LongDescBlock;
                    b_pos   : tsp00_Int4;
                    l_arg   : tin_natural;
                    is_null : boolean);
 
        PROCEDURE
              i21reset (
                    g_area : tin_global_in_vars;
                    m_type : tsp1_cmd_mess_type);
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill: VGG101;
 
        PROCEDURE
              SAPDB_PascalForcedFill (
                    size        : tsp00_Int4;
                    m           : tsp00_MoveObjPtr;
                    pos         : tsp00_Int4;
                    len         : tsp00_Int4;
                    fillchar    : char);
 
        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);
 
        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);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-60: VSP60;
 
        FUNCTION
              s60minimal (
                    i1,i2 : tsp00_Int4) : tsp00_Int4;
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        PROCEDURE
              i21p1barg;
 
              tsp00_Buf  tsp00_LongDescriptor
 
        PROCEDURE
              i21p2barg;
 
              tsp00_Buf  tsp00_LongDescBlock
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : DanielD
.sp
.cp 3
Created : 1993-07-02
.sp
.cp 3
.sp
.cp 3
Release :  6.1.1     Date : 1994-10-28
.sp
***********************************************************
.sp
.cp 20
.nf
.oc _/1
Specification:
 
a ) INSERT/UPDATE
=================
 
i21initexecute ( g_area, parseid )
 
(* put host variables *)
for p in parms
do begin
    if long column
    then i22ldempty ( g_area, sfi.bufpos, varindex, is_null )
        (* varindex : set by programmer, must fit into char *)
    else i21pbarg ()
end for
 
(* fill remaining buffer with longs *)
i22iinslong ( g_area )
while not full and longs_remaining
do begin
    i22inslong ( g_area, sfi.bufpos, buf, bufpos, buflen, full )
        (* sfi.bufpos : bufpos of equivalent tsp00_LongDescriptor   *)
        (* buf        : host variable                              *)
        (* bufpos     : VAR, initialize with 1, new pos after call *)
        (* buflen     : size of buf                                *)
end while
 
(* execute *)
i21request;i21receive
 
(* execute putvals *)
cnt := i22lcnt ( g_area )
for i := 1 to cnt
do begin
    i22gldesc ( g_area, long_desc[i], i )
        (* look into long_desc[i].ld_valind to connect to host var *)
end for
 
i := 1
repeat
i22iputval ( g_area )
    while not full and longs_remaining
    do begin
 
        i22plong ( g_area, long_desc[i], buf, bufpos, buflen, full )
            (* buf        : host variable                              *)
            (* bufpos     : VAR, initialize with 1, new pos after call *)
            (* buflen     : size of buf                                *)
 
        if bufpos > buflen
        then begin
            (* next host variable *)
            bufpos := 1
            i      := i + 1
        end if
 
        if not longs_remaining
        then begin
            (* signal end of longs to kernel *)
            long_desc[i].ld_valmode := vm_last_putval
            i22pldesc ( g_area, long_desc[i], 0 )
        end if
 
    end while
i21request;i21receive
until not longs_remaining or error
 
 
b ) SELECT DIRECT / FETCH / MFETCH
==================================
 
i21request;i21receive
 
(* get host variables and long descriptors *)
for p in parms
do begin
    if long column
    then i21g1val ( ... long_desc[i] ... ) (* must be kept by application *)
    else i21gbarg ()
end for
 
(* get longs from packet *)
while not longs_remaining
    or long_desc[i].ld_valmode in [vm_datapart, vm_nodata]
do begin
    i22glong ( g_area, long_desc[i], buf, 1, long_desc[i].ld_vallen )
end while
 
(* execute getval *)
while not longs_remaining and not error
do begin
 
    i22igetval ( g_area, long_cnt )  (* long_cnt <= 257 *)
    for j := 1 to long_cnt
    do begin
        (* put descriptors into packet *)
        i22pldesc ( g_area, long_desc[i], bytes_to_read[i] )
            (* i specifies the host variable *)
            (* j is a local index            *)
    end for
 
    i21request;i21receive
 
    cnt := i22lcnt ( g_area )
    for j := 1 to cnt
    do begin
        i22gldesc ( g_area, long_desc, ? )
        i22glong ( g_area, long_desc, buf, bufpos, bytes_to_read[i] );
 
        if long_desc.ld_valmode in
            [ vm_alldata, vm_lastdata, vm_data_trunc ]
        then begin
            (* next host variable *)
            bufpos := 1
            i      := i + 1
        end if
 
    end for
 
end while
.CM *-END-* specification -------------------------------
.sp 2.fo
***********************************************************
.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    :
 
 
(*------------------------------*) 
 
FUNCTION
      in2230 : tsp00_Int4;
 
BEGIN
(* linkcheck function *)
in2230 := 229020609;
END;
 
(* ============================================================= *)
(* i22igetval : initialze packet for getval with cnt descriptors *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22igetval (
            g_area : tin_global_in_vars;
            cnt    : tsp00_Int2 );
 
BEGIN
i21reset ( g_area, sp1m_getval );
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    sp1p_part_kind := sp1pk_longdata;
    sp1p_arg_count := cnt;
    END;
(*ENDWITH*) 
END; (* i22igetval *)
 
(* ============================================================= *)
(* i22lcnt : get count of descriptors from packet                *)
(* ============================================================= *)
(*------------------------------*) 
 
FUNCTION
      i22lcnt (
            g_area : tin_global_in_vars ) : tsp00_Int2;
 
BEGIN
i21findpart (g_area, sp1pk_longdata);
WITH g_area^.sql_ptr^ DO
    BEGIN
    IF  curr_part_ptr = NIL
    THEN
        i22lcnt := 0
    ELSE
        i22lcnt := curr_part_ptr^.sp1p_arg_count;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END; (* i22lcnt *)
 
(* ============================================================= *)
(* i22pldesc : add descriptor to getval, read max_read bytes     *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22pldesc (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp00_LongDescriptor;
            max_read      : tsp00_Int4 );
 
BEGIN
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    long_desc.ld_vallen := max_read;
    sp1p_buf [sp1p_buf_len + 1] := csp_defined_byte;
    s10mv (sizeof(tsp00_LongDescriptor),MOVEOBJ_MXSP00,
          @long_desc,1,
          @sp1p_buf,sp1p_buf_len + 2,sizeof(tsp00_LongDescriptor) );
    sp1p_buf_len := sp1p_buf_len + sizeof(tsp00_LongDescriptor) + 1;
    END;
(*ENDWITH*) 
END; (* i22pldesc *)
 
(* ============================================================= *)
(* i22gldesc : read descriptor idx from packet                   *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22gldesc (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp00_LongDescriptor;
            idx           : integer );
 
VAR
      pos  : integer;
 
BEGIN
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    IF  idx > 0
    THEN
        pos := ((idx - 1) * (sizeof(tsp00_LongDescriptor) + 1) ) + 1
    ELSE
        (* calculate pos from previous long descriptor *)
        pos := long_desc.ld_valpos + long_desc.ld_vallen;
    (*ENDIF*) 
    (* skip defined_byte *)
    s10mv (MOVEOBJ_MXSP00,sizeof(tsp00_LongDescriptor),
          @sp1p_buf,pos + 1,
          @long_desc,1,sizeof(tsp00_LongDescriptor) );
    END;
(*ENDWITH*) 
END; (* i22gldesc *)
 
(* ============================================================= *)
(* i22gnextdesc : read descriptor from packet                    *)
(*                calculate pos from previous descriptor         *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22gnextdesc (
            g_area        : tin_global_in_vars;
            VAR prev_desc : tsp00_LongDescriptor;
            VAR long_desc : tsp00_LongDescriptor );
 
VAR
      pos  : integer;
 
BEGIN
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    pos := prev_desc.ld_valpos + prev_desc.ld_vallen;
    (* skip defined_byte *)
    s10mv (MOVEOBJ_MXSP00,sizeof(tsp00_LongDescriptor),
          @sp1p_buf,pos + 1,
          @long_desc,1,sizeof(tsp00_LongDescriptor) );
    END;
(*ENDWITH*) 
END; (* i22gnextdesc *)
 
(* ============================================================= *)
(* i22glong : copy long contents into host variable              *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22glong (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp00_LongDescriptor;
            VAR buf       : tsp00_AnyPackedChar;
            VAR bufpos    : tsp00_Int4;
            buflen        : tsp00_Int4 );
 
VAR
      mvlen : integer;
 
BEGIN
WITH long_desc, g_area^, sql_ptr^, curr_part_ptr ^ DO
    BEGIN
    mvlen := s60minimal ( buflen - bufpos + 1, ld_vallen );
    IF  ld_valmode in [ vm_datapart, vm_alldata,
        vm_lastdata, vm_data_trunc]
    THEN
        s10mv (MOVEOBJ_MXSP00,buflen,
              @sp1p_buf,ld_valpos,
              @buf,bufpos,mvlen );
    (*ENDIF*) 
    IF  ld_vallen > mvlen
    THEN
        ld_valmode := vm_lastdata;
    (*ENDIF*) 
    bufpos := bufpos + ld_vallen;
    END;
(*ENDWITH*) 
END; (* i22glong *)
 
(* chapter putval ------------------------------------------------*)
(* ============================================================= *)
(* i22ldempty : insert a long column ( use instead of i21pbarg ) *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22ldempty (
            g_area    : tin_global_in_vars;
            bufpos    : tsp00_Int4;
            var_index : char;
            is_null   : boolean );
 
VAR
      long_desc : tsp00_LongDescriptor;
 
BEGIN
WITH long_desc DO
    BEGIN
    ld_valind  := ord(var_index);
    ld_valmode := vm_nodata;
    ld_valpos  := 0;
    ld_vallen  := 0;
    END;
(*ENDWITH*) 
i21p1barg ( g_area, long_desc, bufpos, sizeof(tsp00_LongDescriptor),
      is_null );
END; (* i22ldempty *)
 
(* ============================================================= *)
(* i22iinslong : prepare packet for putting longs after regulars *)
(*               Elke Z. special : position of first descriptor  *)
(*                      includes two bytes for count             *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22iinslong (
            g_area : tin_global_in_vars );
 
BEGIN
WITH g_area^.sql_ptr^.curr_part_ptr^ DO
    sp1p_buf_len := sp1p_buf_len + 2;
(*ENDWITH*) 
END; (* i22iinslong *)
 
(* ============================================================= *)
(* i22inslong : add long after regular values                    *)
(*              give only the position of the descriptor         *)
(*              bufpos will be updated                           *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22inslong (
            g_area        : tin_global_in_vars;
            ld_pos        : tsp00_Int4;
            VAR buf       : tsp00_AnyPackedChar;
            VAR bufpos    : tsp00_Int4;
            buflen        : tsp00_Int4;
            VAR full      : boolean );
 
VAR
      long_desc : tsp00_LongDescriptor;
 
BEGIN
WITH long_desc, g_area^, sql_ptr^, curr_part_ptr ^ DO
    BEGIN
    (* === get long_desc === *)
    s10mv (MOVEOBJ_MXSP00,sizeof(tsp00_LongDescriptor),
          @sp1p_buf,ld_pos + 1,
          @long_desc,1,sizeof(tsp00_LongDescriptor) );
    (* === calculate long_desc variables === *)
    i22_calclong ( curr_part_ptr^, long_desc, bufpos, buflen );
    (* === put long_desc back into sp1p_buf === *)
    s10mv (sizeof(tsp00_LongDescriptor),MOVEOBJ_MXSP00,
          @long_desc,1,
          @sp1p_buf,ld_pos + 1,sizeof(tsp00_LongDescriptor) );
    (* === put long data into sp1p_buf === *)
    s10mv (buflen,MOVEOBJ_MXSP00,
          @buf,bufpos,
          @sp1p_buf,ld_valpos,ld_vallen );
    sp1p_buf_len := sp1p_buf_len + ld_vallen;
    bufpos       := bufpos + ld_vallen;
    full         := sp1p_buf_len = sp1p_buf_size;
    END;
(*ENDWITH*) 
END; (* i22inslong *)
 
(* ============================================================= *)
(* i22iputval : initialize packet for putval                     *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22iputval (
            g_area : tin_global_in_vars );
 
BEGIN
i21reset ( g_area, sp1m_putval );
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    sp1p_part_kind := sp1pk_longdata;
    sp1p_arg_count := 0;
    END;
(*ENDWITH*) 
END; (* i22iputval *)
 
(* ============================================================= *)
(* i22plong : add long in putval                                 *)
(*            give the long descriptor                           *)
(*            bufpos will be updated                             *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22plong (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp00_LongDescriptor;
            VAR buf       : tsp00_AnyPackedChar;
            VAR bufpos    : tsp00_Int4;
            buflen        : tsp00_Int4;
            VAR full      : boolean );
 
VAR
      ld_pos : integer;
 
BEGIN
WITH long_desc, g_area^, sql_ptr^, curr_part_ptr ^ DO
    BEGIN
    IF  (sp1p_buf_size - sp1p_buf_len)
        > (sizeof(tsp00_LongDescriptor) + 1)
    THEN
        BEGIN
        i22_incr_count ( curr_part_ptr^ );
        ld_pos := sp1p_buf_len + 1;
        (* === add space for long_desc === *)
        sp1p_buf [ld_pos + 1] := csp_defined_byte;
        sp1p_buf_len := sp1p_buf_len + sizeof(tsp00_LongDescriptor) + 1;
        (* === calculate long_desc variables === *)
        i22_calclong ( curr_part_ptr^, long_desc, bufpos, buflen );
        (* === put long_desc into sp1p_buf === *)
        s10mv (sizeof(tsp00_LongDescriptor),MOVEOBJ_MXSP00,
              @long_desc,1,
              @sp1p_buf,ld_pos + 1,sizeof(tsp00_LongDescriptor) );
        (* === put long data into sp1p_buf === *)
        s10mv (buflen,MOVEOBJ_MXSP00,
              @buf,bufpos,
              @sp1p_buf,ld_valpos,ld_vallen );
        sp1p_buf_len := sp1p_buf_len + ld_vallen;
        bufpos       := bufpos + ld_vallen;
        full         :=  (sp1p_buf_size - sp1p_buf_len)
              <= (sizeof(tsp00_LongDescriptor) + 1);
        END
    ELSE
        full := true;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END; (* i22plong *)
 
(*------------------------------*) 
 
PROCEDURE
      i22_calclong (
            VAR part        : tsp1_part;
            VAR long_desc   : tsp00_LongDescriptor;
            bufpos          : tsp00_Int4;
            buflen          : tsp00_Int4 );
 
VAR
      buf_rem    : integer;
      packet_rem : integer;
 
BEGIN
WITH part, long_desc DO
    BEGIN
    buf_rem    := buflen - bufpos + 1;
    packet_rem := sp1p_buf_size - sp1p_buf_len;
    ld_vallen  := s60minimal ( buf_rem, packet_rem );
    IF  ld_vallen > 0
    THEN
        BEGIN
        ld_valpos := sp1p_buf_len + 1;
        IF  ld_vallen < buf_rem
        THEN
            ld_valmode := vm_datapart
        ELSE
            IF  bufpos = 1
            THEN
                ld_valmode := vm_alldata
            ELSE
                ld_valmode := vm_lastdata;
            (*ENDIF*) 
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END; (* i22_calclong *)
 
(*------------------------------*) 
 
PROCEDURE
      i22_incr_count (
            VAR part : tsp1_part );
 
BEGIN
part.sp1p_arg_count := part.sp1p_arg_count + 1;
END; (* i22_incr_count *)
 
(* ========================================================== *)
(* New functions and procedures for LONG variant record       *)
(* TIN_LONG_DESC_TYPE in VIN00 wich handles both LONG types   *)
(* in one structure.                                          *)
(*                                                            *)
(* H. Becker                             30. September 1994   *)
(* ========================================================== *)
(*------------------------------*) 
 
PROCEDURE
      i22npldesc (
            g_area        : tin_global_in_vars;
            VAR long_desc : tin_long_desc_type;
            max_read      : tsp00_Int4 );
 
BEGIN
IF  long_desc.lt_newlong
THEN
    in22_pldesc_new (g_area, long_desc.lt_new, max_read)
ELSE
    i22pldesc  (g_area, long_desc.lt_old, max_read);
(*ENDIF*) 
END; (* i22npldesc *)
 
(*------------------------------*) 
 
PROCEDURE
      i22ngldesc (
            g_area        : tin_global_in_vars;
            VAR long_desc : tin_long_desc_type;
            idx           : integer );
 
BEGIN
IF  long_desc.lt_newlong
THEN
    in22_gldesc_new (g_area, long_desc.lt_new, idx)
ELSE
    i22gldesc (g_area, long_desc.lt_old, idx);
(*ENDIF*) 
END; (* i22ngldesc *)
 
(*------------------------------*) 
 
PROCEDURE
      i22nldempty (
            g_area    : tin_global_in_vars;
            bufpos    : tsp00_Int4;
            var_index : char;
            is_null   : boolean;
            newlong   : boolean );
 
BEGIN
IF  newlong
THEN
    in22_ldempty_new (g_area, bufpos, var_index, is_null)
ELSE
    i22ldempty (g_area, bufpos, var_index, is_null);
(*ENDIF*) 
END; (* i22nldempty *)
 
(*------------------------------*) 
 
PROCEDURE
      i22ngnextdesc (
            g_area        : tin_global_in_vars;
            VAR prev_desc : tin_long_desc_type;
            VAR long_desc : tin_long_desc_type );
 
BEGIN
IF  long_desc.lt_newlong
THEN
    in22_gnextdesc_new (g_area, prev_desc.lt_new, long_desc.lt_new)
ELSE
    i22gnextdesc (g_area, prev_desc.lt_old, long_desc.lt_old);
(*ENDIF*) 
END; (* i22ngldesc *)
 
(*------------------------------*) 
 
PROCEDURE
      i22nglong (
            g_area        : tin_global_in_vars;
            VAR long_desc : tin_long_desc_type;
            VAR buf       : tsp00_AnyPackedChar;
            VAR bufpos    : tsp00_Int4;
            buflen        : tsp00_Int4 );
 
BEGIN
IF  long_desc.lt_newlong
THEN
    in22_glong_new (g_area, long_desc.lt_new, buf, bufpos, buflen)
ELSE
    i22glong (g_area, long_desc.lt_old, buf, bufpos, buflen);
(*ENDIF*) 
END; (* i22nglong *)
 
(*------------------------------*) 
 
PROCEDURE
      i22nplong (
            g_area        : tin_global_in_vars;
            VAR long_desc : tin_long_desc_type;
            VAR buf       : tsp00_AnyPackedChar;
            VAR bufpos    : tsp00_Int4;
            buflen        : tsp00_Int4;
            VAR full      : boolean );
 
BEGIN
IF  long_desc.lt_newlong
THEN
    in22_plong_new (g_area, long_desc.lt_new, buf, bufpos, buflen, full)
ELSE
    i22plong (g_area, long_desc.lt_old, buf, bufpos, buflen, full);
(*ENDIF*) 
END; (* i22nplong *)
 
(*------------------------------*) 
 
FUNCTION
      i22nvalind (
            VAR long_desc : tin_long_desc_type ) : integer;
 
BEGIN
IF  long_desc.lt_newlong
THEN
    i22nvalind := long_desc.lt_new.ldb_valind
ELSE
    i22nvalind := long_desc.lt_old.ld_valind;
(*ENDIF*) 
END; (* i22nvalind *)
 
(*------------------------------*) 
 
FUNCTION
      i22nvallen (
            VAR long_desc : tin_long_desc_type ) : integer;
 
BEGIN
IF  long_desc.lt_newlong
THEN
    i22nvallen := long_desc.lt_new.ldb_vallen
ELSE
    i22nvallen := long_desc.lt_old.ld_vallen;
(*ENDIF*) 
END; (* i22nvallen *)
 
(*------------------------------*) 
 
FUNCTION
      i22nvalmode (
            VAR long_desc : tin_long_desc_type ) : tsp00_ValMode;
 
BEGIN
IF  long_desc.lt_newlong
THEN
    i22nvalmode := long_desc.lt_new.ldb_valmode
ELSE
    i22nvalmode := long_desc.lt_old.ld_valmode;
(*ENDIF*) 
END; (* i22nvalmode *)
 
(*------------------------------*) 
 
PROCEDURE
      i22setvalmode (
            VAR long_desc : tin_long_desc_type;
            valmode       : tsp00_ValMode);
 
BEGIN
IF  long_desc.lt_newlong
THEN
    long_desc.lt_new.ldb_valmode := valmode
ELSE
    long_desc.lt_old.ld_valmode := valmode;
(*ENDIF*) 
END; (* i22setvalmode *)
 
(* ============================================================= *)
(* i22ngpackeddesc: read long_desc at pos                        *)
(*  this is used to read long_desc;long_desc... after putval     *)
(*  pos is absolute in sp1p_buf                                  *)
(*  reading may start with pos = 0, pos is adjusted to the       *)
(*  position of the first long desc                              *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22ngpackeddesc (
            g_area        : tin_global_in_vars;
            VAR long_desc : tin_long_desc_type;
            VAR pos       : integer);
 
BEGIN
IF  pos = 0
THEN
    pos := 1;
(*ENDIF*) 
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    IF  sp1p_buf [pos] = csp_long_desc_def_byte
    THEN
        BEGIN
        long_desc.lt_newlong := true;
        s10mv (MOVEOBJ_MXSP00,sizeof(tsp00_LongDescBlock),
              @sp1p_buf,pos + 1,
              @long_desc.lt_new,1,sizeof(tsp00_LongDescBlock) );
        pos := pos + sizeof(tsp00_LongDescBlock) + 1;
        END
    ELSE
        BEGIN
        long_desc.lt_newlong := false;
        s10mv (MOVEOBJ_MXSP00,sizeof(tsp00_LongDescriptor),
              @sp1p_buf,pos + 1,
              @long_desc.lt_old,1,sizeof(tsp00_LongDescriptor) );
        pos := pos + sizeof(tsp00_LongDescriptor) + 1;
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END; (* i22ngpackeddesc *)
 
(* ============================================================= *)
(* i22ngdatadesc: read next long desc                            *)
(*  this is used to read long_desc;data;long_desc.. after getval *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22ngdatadesc (
            g_area        : tin_global_in_vars;
            VAR long_desc : tin_long_desc_type );
 
VAR
      pos : integer;
 
BEGIN
IF  long_desc.lt_newlong
THEN
    pos := long_desc.lt_new.ldb_valpos + long_desc.lt_new.ldb_vallen
ELSE
    pos := long_desc.lt_old.ld_valpos + long_desc.lt_old.ld_vallen;
(*ENDIF*) 
i22ngpackeddesc (g_area, long_desc, pos);
END; (* i22ngdatadesc *)
 
(* ============================================================= *)
(* i22ngdesc: read long desc                                     *)
(*  this is used to read long_desc in regular data part          *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22ngdesc (
            g_area        : tin_global_in_vars;
            VAR long_desc : tin_long_desc_type;
            pos           : integer;
            VAR isnull    : boolean);
 
VAR
      def_byte : char;
 
BEGIN
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    def_byte := sp1p_buf [pos];
    CASE  def_byte OF
        csp_undef_byte:
            BEGIN
            isnull := true;
            END;
        csp_defined_byte, csp_long_desc_def_byte:
            BEGIN
            i22ngpackeddesc (g_area, long_desc, pos);
            isnull := false;
            END;
        END;
    (*ENDCASE*) 
    END;
(*ENDWITH*) 
END; (* i22ngdesc *)
 
(*------------------------------*) 
 
PROCEDURE
      i22ninslong (
            g_area        : tin_global_in_vars;
            desc_pos      : tsp00_Int4;
            VAR buf       : tsp00_AnyPackedChar;
            VAR bufpos    : tsp00_Int4;
            buflen        : tsp00_Int4;
            fillchar      : char;
            VAR full      : boolean );
 
VAR
      old_ld    : tsp00_LongDescriptor;
      new_ld    : tsp00_LongDescBlock;
      defbyte   : char;
      movelen   : integer;
 
BEGIN
WITH g_area^.sql_ptr^, curr_part_ptr ^  DO
    BEGIN
    defbyte := sp1p_buf [desc_pos];
    IF  defbyte = csp_long_desc_def_byte
    THEN
        BEGIN
        IF  (buflen <= 254) AND (curr_segm_ptr^.sp1c_mess_type <> sp1m_putval)
        THEN
            BEGIN
            (* put value instead of long descriptor *)
            (* change defined byte *)
            sp1p_buf [desc_pos] := fillchar;
            (* move value *)
            movelen := buflen - bufpos + 1;
            s10mv (buflen,MOVEOBJ_MXSP00,
                  @buf,bufpos,
                  @sp1p_buf,desc_pos + 1,movelen);
            (* fill with bytes *)
            IF  movelen < 254
            THEN
                SAPDB_PascalForcedFill ( sizeof(sp1p_buf), @sp1p_buf,
                      desc_pos + 1 + movelen, 254 - movelen,
                      fillchar);
            (*ENDIF*) 
            bufpos := bufpos + movelen;
            END
        ELSE
            BEGIN
            (* === get long_desc === *)
            s10mv (MOVEOBJ_MXSP00,sizeof(new_ld),
                  @sp1p_buf,desc_pos + 1,
                  @new_ld,1,sizeof(new_ld) );
            (* === calculate long_desc variables === *)
            in22_calclong_new ( curr_part_ptr^, new_ld, bufpos, buflen );
            (* === put long_desc back into sp1p_buf === *)
            s10mv (sizeof(new_ld),MOVEOBJ_MXSP00,
                  @new_ld,1,
                  @sp1p_buf,desc_pos + 1,sizeof(new_ld) );
            (* === put long data into sp1p_buf === *)
            WITH new_ld DO
                s10mv (buflen,MOVEOBJ_MXSP00,
                      @buf,bufpos,
                      @sp1p_buf,ldb_valpos,ldb_vallen );
            (*ENDWITH*) 
            sp1p_buf_len := sp1p_buf_len + new_ld.ldb_vallen;
            bufpos       := bufpos + new_ld.ldb_vallen;
            full         := sp1p_buf_len = sp1p_buf_size;
            END;
        (*ENDIF*) 
        END
    ELSE
        BEGIN
        (* === get long_desc === *)
        s10mv (MOVEOBJ_MXSP00,sizeof(old_ld),
              @sp1p_buf,desc_pos + 1,
              @old_ld,1,sizeof(old_ld) );
        (* === calculate long_desc variables === *)
        i22_calclong ( curr_part_ptr^, old_ld, bufpos, buflen );
        (* === put long_desc back into sp1p_buf === *)
        s10mv (sizeof(old_ld),MOVEOBJ_MXSP00,
              @old_ld,1,
              @sp1p_buf,desc_pos + 1,sizeof(old_ld) );
        (* === put long data into sp1p_buf === *)
        WITH old_ld DO
            s10mv (buflen,MOVEOBJ_MXSP00,
                  @buf,bufpos,
                  @sp1p_buf,ld_valpos,ld_vallen );
        (*ENDWITH*) 
        sp1p_buf_len := sp1p_buf_len + old_ld.ld_vallen;
        bufpos       := bufpos + old_ld.ld_vallen;
        full         := sp1p_buf_len = sp1p_buf_size;
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END; (* i22ninslong *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_pldesc_new (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp00_LongDescBlock;
            max_read      : tsp00_Int4 );
 
BEGIN
i21abort;
&ifdef oldpacket
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    long_desc.ldb_vallen := max_read;
    sp1p_buf [sp1p_buf_len + 1] := csp_long_desc_def_byte;
    s10mv (sizeof(tsp00_LongDescBlock),MOVEOBJ_MXSP00,
          @long_desc,1,
          @sp1p_buf,sp1p_buf_len + 2,sizeof(tsp00_LongDescBlock) );
    sp1p_buf_len := sp1p_buf_len + sizeof(tsp00_LongDescBlock) + 1;
    END;
(*ENDWITH*) 
&endif
END; (* in22_pldesc_new *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_gldesc_new (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp00_LongDescBlock;
            idx           : integer );
 
VAR
      pos  : integer;
 
BEGIN
i21abort;
&ifdef oldpacket
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    IF  idx > 0
    THEN
        pos := INT2_MXSP00 (* skip 2 count bytes *)
              + ((idx - 1) * (sizeof(tsp00_LongDescBlock) + 1) ) + 1
    ELSE
        (* calculate pos from previous long descriptor *)
        pos := long_desc.ldb_valpos + long_desc.ldb_vallen;
    (*ENDIF*) 
    (* skip defined_byte *)
    s10mv (MOVEOBJ_MXSP00,sizeof(tsp00_LongDescBlock),
          @sp1p_buf,pos + 1,
          @long_desc,1,sizeof(tsp00_LongDescBlock) );
    END;
(*ENDWITH*) 
&endif
END; (* in22_gldesc_new *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_gnextdesc_new (
            g_area        : tin_global_in_vars;
            VAR prev_desc : tsp00_LongDescBlock;
            VAR long_desc : tsp00_LongDescBlock );
 
VAR
      pos  : integer;
 
BEGIN
i21abort;
&ifdef oldpacket
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    pos := prev_desc.ldb_valpos + prev_desc.ldb_vallen;
    (* skip defined_byte *)
    s10mv (MOVEOBJ_MXSP00,sizeof(tsp00_LongDescBlock),
          @sp1p_buf,pos + 1,
          @long_desc,1,sizeof(tsp00_LongDescBlock) );
    END;
(*ENDWITH*) 
&endif
END; (* in22_gnextdesc_new *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_glong_new (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp00_LongDescBlock;
            VAR buf       : tsp00_AnyPackedChar;
            VAR bufpos    : tsp00_Int4;
            buflen        : tsp00_Int4 );
 
VAR
      mvlen : integer;
 
BEGIN
i21abort;
&ifdef oldpacket
WITH long_desc, g_area^, sql_ptr^, curr_part_ptr ^ DO
    BEGIN
    mvlen := s60minimal ( buflen - bufpos + 1, ldb_vallen );
    IF  ldb_valmode in [ vm_datapart, vm_alldata,
        vm_lastdata, vm_data_trunc]
    THEN
        s10mv (MOVEOBJ_MXSP00,buflen,
              @sp1p_buf,ldb_valpos,
              @buf,bufpos,mvlen );
    (*ENDIF*) 
    IF  ldb_vallen > mvlen
    THEN
        ldb_valmode := vm_lastdata;
    (*ENDIF*) 
    bufpos := bufpos + ldb_vallen;
    END;
(*ENDWITH*) 
&endif
END; (* in22_glong_new *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_ldempty_new (
            g_area    : tin_global_in_vars;
            bufpos    : tsp00_Int2;
            var_index : char;
            is_null   : boolean );
 
VAR
      long_desc : tsp00_LongDescBlock;
 
BEGIN
i21abort;
&ifdef oldpacket
WITH long_desc DO
    BEGIN
    ldb_valind [1] := var_index;
    ldb_valmode    := vm_nodata;
    ldb_valpos     := 0;
    ldb_vallen     := 0;
    END;
(*ENDWITH*) 
i21p2barg ( g_area, long_desc, bufpos, sizeof(tsp00_LongDescBlock),
      is_null );
WITH g_area^, sql_ptr^, curr_part_ptr ^ DO
    sp1p_buf [bufpos] := csp_long_desc_def_byte;
(*ENDWITH*) 
&endif
END; (* in22_ldempty_new *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_plong_new (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp00_LongDescBlock;
            VAR buf       : tsp00_AnyPackedChar;
            VAR bufpos    : tsp00_Int4;
            buflen        : tsp00_Int4;
            VAR full      : boolean );
 
VAR
      ldb_pos : integer;
 
BEGIN
i21abort;
&ifdef oldpacket
WITH long_desc, g_area^, sql_ptr^, curr_part_ptr ^ DO
    BEGIN
    IF  (sp1p_buf_size - sp1p_buf_len)
        > (sizeof(tsp00_LongDescBlock) + 1)
    THEN
        BEGIN
        i22_incr_count ( curr_part_ptr^ );
        ldb_pos := sp1p_buf_len + 1;
        (* === add space for long_desc === *)
        sp1p_buf [ldb_pos] := csp_long_desc_def_byte;
        sp1p_buf_len := sp1p_buf_len + sizeof(tsp00_LongDescBlock) + 1;
        (* === calculate long_desc variables === *)
        in22_calclong_new ( curr_part_ptr^, long_desc, bufpos, buflen );
        (* === put long_desc into sp1p_buf === *)
        s10mv (sizeof(tsp00_LongDescBlock),MOVEOBJ_MXSP00,
              @long_desc,1,
              @sp1p_buf,ldb_pos + 1,sizeof(tsp00_LongDescBlock) );
        (* === put long data into sp1p_buf === *)
        s10mv (buflen,MOVEOBJ_MXSP00,
              @buf,bufpos,
              @sp1p_buf,ldb_valpos,ldb_vallen );
        sp1p_buf_len := sp1p_buf_len + ldb_vallen;
        bufpos       := bufpos + ldb_vallen;
        full         :=  (sp1p_buf_size - sp1p_buf_len)
              <= (sizeof(tsp00_LongDescBlock) + 1);
        END
    ELSE
        full := true;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
&endif
END; (* in22_plong_new *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_calclong_new (
            VAR part        : tsp1_part;
            VAR long_desc   : tsp00_LongDescBlock;
            bufpos          : tsp00_Int4;
            buflen          : tsp00_Int4 );
 
VAR
      buf_rem    : integer;
      packet_rem : integer;
 
BEGIN
i21abort;
&ifdef oldpacket
WITH sql_packet, long_desc DO
    BEGIN
    buf_rem    := buflen - bufpos + 1;
    packet_rem := sp1p_buf_size - sp1p_buf_len;
    ldb_vallen  := s60minimal ( buf_rem, packet_rem );
    IF  ldb_vallen > 0
    THEN
        BEGIN
        ldb_valpos := sp1p_buf_len + 1;
        IF  ldb_vallen < buf_rem
        THEN
            ldb_valmode := vm_datapart
        ELSE
            IF  bufpos = 1
            THEN
                ldb_valmode := vm_alldata
            ELSE
                ldb_valmode := vm_lastdata;
            (*ENDIF*) 
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
&endif
END; (* in22_calclong_new *)
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
