.CM  SCRIPT , Version - 1.1 , last edited by D.Dittmar
.pa
.bm 8
.fm 4
.bt $Copyright by   SAP AG, 1996$$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


    ========== licence begin LGPL
    Copyright (C) 2000 SAP AG

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library 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
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    ========== licence end

.fo
.nf
.sp
MODULE  : SQLDB-long-support
=========
.sp
Purpose :
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        PROCEDURE
              i22igetval (
                    g_area : tin_global_in_vars;
                    cnt    : tsp_int2 );
 
        FUNCTION
              i22lcnt (
                    g_area : tin_global_in_vars ) : tsp_int2;
 
        PROCEDURE
              i22pldesc (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tsp_long_descriptor;
                    max_read      : tsp_int4 );
 
        PROCEDURE
              i22gldesc (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tsp_long_descriptor;
                    idx           : integer );
 
        PROCEDURE
              i22gnextdesc (
                    g_area        : tin_global_in_vars;
                    VAR prev_desc : tsp_long_descriptor;
                    VAR long_desc : tsp_long_descriptor );
 
        PROCEDURE
              i22glong (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tsp_long_descriptor;
                    VAR buf       : tsp_any_packed_char;
                    VAR bufpos    : tsp_int4;
                    buflen        : tsp_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    : tsp_int4;
                    var_index : char;
                    is_null   : boolean );
 
        PROCEDURE
              i22inslong (
                    g_area        : tin_global_in_vars;
                    ld_pos        : tsp_int4;
                    VAR buf       : tsp_any_packed_char;
                    VAR bufpos    : tsp_int4;
                    buflen        : tsp_int4;
                    VAR full      : boolean );
 
        PROCEDURE
              i22plong (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tsp_long_descriptor;
                    VAR buf       : tsp_any_packed_char;
                    VAR bufpos    : tsp_int4;
                    buflen        : tsp_int4;
                    VAR full      : boolean );
 
        PROCEDURE
              i22npldesc (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tin_long_desc_type;
                    max_read      : tsp_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    : tsp_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       : tsp_any_packed_char;
                    VAR bufpos    : tsp_int4;
                    buflen        : tsp_int4 );
 
        PROCEDURE
              i22nplong (
                    g_area        : tin_global_in_vars;
                    VAR long_desc : tin_long_desc_type;
                    VAR buf       : tsp_any_packed_char;
                    VAR bufpos    : tsp_int4;
                    buflen        : tsp_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 ) : tsp_valmode;
 
        PROCEDURE
              i22setvalmode (
                    VAR long_desc : tin_long_desc_type;
                    valmode       : tsp_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      : tsp_int4;
                    VAR buf       : tsp_any_packed_char;
                    VAR bufpos    : tsp_int4;
                    buflen        : tsp_int4;
                    fillchar      : char;
                    VAR full      : boolean );
 
        FUNCTION
              in2230 : tsp_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 : tsp_long_descriptor;
                    b_pos   : tsp_int4;
                    l_arg   : tin_natural;
                    is_null : boolean);
 
        PROCEDURE
              i21p2barg (
                    g_area  : tin_global_in_vars;
                    VAR arg : tsp_long_desc_block;
                    b_pos   : tsp_int4;
                    l_arg   : tin_natural;
                    is_null : boolean);
 
        PROCEDURE
              i21reset (
                    g_area : tin_global_in_vars;
                    m_type : tsp1_cmd_mess_type);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-10: VSP10;
 
        PROCEDURE
              s10fil (
                    size     : tsp_int4;
                    VAR m    : tsp_moveobj;
                    pos      : tsp_int4;
                    len      : tsp_int4;
                    fillchar : char);
 
        PROCEDURE
              s10mv1 (
                    size1    : tsp_int4;
                    size2    : tsp_int4;
                    VAR val1 : tsp_long_descriptor;
                    p1       : tsp_int4;
                    VAR val2 : tsp_moveobj;
                    p2       : tsp_int4;
                    cnt      : tsp_int4);
 
        PROCEDURE
              s10mv2 (
                    size1    : tsp_int4;
                    size2    : tsp_int4;
                    VAR val1 : tsp_moveobj;
                    p1       : tsp_int4;
                    VAR val2 : tsp_long_descriptor;
                    p2       : tsp_int4;
                    cnt      : tsp_int4);
 
        PROCEDURE
              s10mv3 (
                    size1    : tsp_int4;
                    size2    : tsp_int4;
                    VAR val1 : tsp_moveobj;
                    p1       : tsp_int4;
                    VAR val2 : tsp_any_packed_char;
                    p2       : tsp_int4;
                    cnt      : tsp_int4);
 
        PROCEDURE
              s10mv4 (
                    size1    : tsp_int4;
                    size2    : tsp_int4;
                    VAR val1 : tsp_any_packed_char;
                    p1       : tsp_int4;
                    VAR val2 : tsp_moveobj;
                    p2       : tsp_int4;
                    cnt      : tsp_int4);
 
        PROCEDURE
              s10mv5 (
                    size1    : tsp_int4;
                    size2    : tsp_int4;
                    VAR val1 : tsp_long_desc_block;
                    p1       : tsp_int4;
                    VAR val2 : tsp_moveobj;
                    p2       : tsp_int4;
                    cnt      : tsp_int4);
 
        PROCEDURE
              s10mv6 (
                    size1    : tsp_int4;
                    size2    : tsp_int4;
                    VAR val1 : tsp_moveobj;
                    p1       : tsp_int4;
                    VAR val2 : tsp_long_desc_block;
                    p2       : tsp_int4;
                    cnt      : tsp_int4);
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures: VMT90;
 
        PROCEDURE
              m90p2int4 (
                    layer : tsp_layer;
                    nam1  : tsp_sname;
                    int1  : tsp_int4;
                    nam2  : tsp_sname;
                    int2  : tsp_int4);
 
        PROCEDURE
              m90anyld (
                    layer         : tsp_layer;
                    name          : tsp_sname;
                    VAR long_desc : tin_long_desc_type;
                    full_info     : boolean );
 
        PROCEDURE
              m90ldb_longdescblock (
                    layer         : tsp_layer;
                    name          : tsp_sname;
                    VAR long_desc : tsp_long_desc_block;
                    full_info     : boolean );
 
        PROCEDURE
              m90longdescriptor (
                    layer         : tsp_layer;
                    name          : tsp_sname;
                    VAR long_desc : tsp_long_descriptor;
                    full_info     : boolean );
 
        PROCEDURE
              m90int (
                    layer : tsp_layer;
                    nam   : tsp_sname;
                    int   : integer);
&       endif
 
      ------------------------------ 
 
        FROM
              RTE-Extension-60: VSP60;
 
        FUNCTION
              s60minimal (
                    i1,i2 : tsp_int4) : tsp_int4;
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        PROCEDURE
              i21p1barg;
 
              tsp_buf  tsp_long_descriptor
 
        PROCEDURE
              i21p2barg;
 
              tsp_buf  tsp_long_desc_block
 
        PROCEDURE
              s10mv1;
 
              tsp_moveobj  tsp_long_descriptor
              tsp_moveobj  tsp_moveobj
 
        PROCEDURE
              s10mv2;
 
              tsp_moveobj  tsp_moveobj
              tsp_moveobj  tsp_long_descriptor
 
        PROCEDURE
              s10mv3;
 
              tsp_moveobj  tsp_moveobj
              tsp_moveobj  tsp_any_packed_char
 
        PROCEDURE
              s10mv4;
 
              tsp_moveobj  tsp_any_packed_char
              tsp_moveobj  tsp_moveobj
 
        PROCEDURE
              s10mv5;
 
              tsp_moveobj  tsp_long_desc_block
              tsp_moveobj  tsp_moveobj
 
        PROCEDURE
              s10mv6;
 
              tsp_moveobj  tsp_moveobj
              tsp_moveobj  tsp_long_desc_block
 
        PROCEDURE
              s10fil;
 
              tsp_moveobj          tsp_moveobj
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : DanielD
.sp
.cp 3
Created : 1993-07-02
.sp
.cp 3
Version : 1996-12-04
.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 tsp_long_descriptor   *)
        (* 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 : tsp_int4;
 
BEGIN
(* linkcheck function *)
in2230 := 229020609;
END;
 
(* ============================================================= *)
(* i22igetval : initialze packet for getval with cnt descriptors *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22igetval (
            g_area : tin_global_in_vars;
            cnt    : tsp_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 ) : tsp_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 : tsp_long_descriptor;
            max_read      : tsp_int4 );
 
BEGIN
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    long_desc.ld_vallen := max_read;
&   ifdef TRACE
    m90longdescriptor ( vin, 'putting ldsc', long_desc, false );
&   endif
    sp1p_buf [sp1p_buf_len + 1] := csp_defined_byte;
    s10mv1 ( sizeof(tsp_long_descriptor), mxsp_moveobj, long_desc, 1,
          sp1p_buf, sp1p_buf_len + 2, sizeof(tsp_long_descriptor) );
    sp1p_buf_len := sp1p_buf_len + sizeof(tsp_long_descriptor) + 1;
    END;
(*ENDWITH*) 
END; (* i22pldesc *)
 
(* ============================================================= *)
(* i22gldesc : read descriptor idx from packet                   *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22gldesc (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp_long_descriptor;
            idx           : integer );
 
VAR
      pos  : integer;
 
BEGIN
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    IF  idx > 0
    THEN
        pos := ((idx - 1) * (sizeof(tsp_long_descriptor) + 1) ) + 1
    ELSE
        (* calculate pos from previous long descriptor *)
        pos := long_desc.ld_valpos + long_desc.ld_vallen;
    (*ENDIF*) 
    (* skip defined_byte *)
    s10mv2 (mxsp_moveobj, sizeof(tsp_long_descriptor),
          sp1p_buf, pos + 1, long_desc, 1, sizeof(tsp_long_descriptor) );
&   ifdef TRACE
    m90longdescriptor ( vin, 'reading ldsc', long_desc, false );
    m90int ( vin, 'from pos    ', pos + 1 );
&   endif
    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 : tsp_long_descriptor;
            VAR long_desc : tsp_long_descriptor );
 
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 *)
    s10mv2 (mxsp_moveobj, sizeof(tsp_long_descriptor),
          sp1p_buf, pos + 1, long_desc, 1, sizeof(tsp_long_descriptor) );
&   ifdef TRACE
    m90longdescriptor ( vin, 'reading ldsc', long_desc, false );
    m90int ( vin, 'from pos    ', pos + 1 );
&   endif
    END;
(*ENDWITH*) 
END; (* i22gnextdesc *)
 
(* ============================================================= *)
(* i22glong : copy long contents into host variable              *)
(* ============================================================= *)
(*------------------------------*) 
 
PROCEDURE
      i22glong (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp_long_descriptor;
            VAR buf       : tsp_any_packed_char;
            VAR bufpos    : tsp_int4;
            buflen        : tsp_int4 );
 
VAR
      mvlen : integer;
 
BEGIN
WITH long_desc, g_area^, sql_ptr^, curr_part_ptr ^ DO
    BEGIN
    mvlen := s60minimal ( buflen - bufpos + 1, ld_vallen );
&   ifdef TRACE
    m90longdescriptor ( vin, 'i22glong    ', long_desc, false );
    m90p2int4 ( vin, 'buflen      ', buflen, 'bufpos      ', bufpos );
    m90int ( vin, 'ld_vallen   ', ld_vallen );
    m90int ( vin, 'glong bytes ', mvlen );
&   endif
    IF  ld_valmode in [ vm_datapart, vm_alldata,
        vm_lastdata, vm_data_trunc]
    THEN
        s10mv3 (mxsp_moveobj, 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    : tsp_int4;
            var_index : char;
            is_null   : boolean );
 
VAR
      long_desc : tsp_long_descriptor;
 
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(tsp_long_descriptor),
      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        : tsp_int4;
            VAR buf       : tsp_any_packed_char;
            VAR bufpos    : tsp_int4;
            buflen        : tsp_int4;
            VAR full      : boolean );
 
VAR
      long_desc : tsp_long_descriptor;
 
BEGIN
WITH long_desc, g_area^, sql_ptr^, curr_part_ptr ^ DO
    BEGIN
    (* === get long_desc === *)
    s10mv2 ( mxsp_moveobj, sizeof(tsp_long_descriptor),
          sp1p_buf, ld_pos + 1, long_desc, 1,
          sizeof(tsp_long_descriptor) );
    (* === calculate long_desc variables === *)
    i22_calclong ( curr_part_ptr^, long_desc, bufpos, buflen );
    (* === put long_desc back into sp1p_buf === *)
    s10mv1 ( sizeof(tsp_long_descriptor), mxsp_moveobj,
          long_desc, 1, sp1p_buf, ld_pos + 1,
          sizeof(tsp_long_descriptor) );
    (* === put long data into sp1p_buf === *)
    s10mv4 ( buflen, mxsp_moveobj,
          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 : tsp_long_descriptor;
            VAR buf       : tsp_any_packed_char;
            VAR bufpos    : tsp_int4;
            buflen        : tsp_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(tsp_long_descriptor) + 1)
    THEN
        BEGIN
&       ifdef TRACE
        m90longdescriptor ( vin, 'in i22plong ', long_desc, false );
&       endif
        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(tsp_long_descriptor) + 1;
        (* === calculate long_desc variables === *)
        i22_calclong ( curr_part_ptr^, long_desc, bufpos, buflen );
        (* === put long_desc into sp1p_buf === *)
        s10mv1 ( sizeof(tsp_long_descriptor), mxsp_moveobj,
              long_desc, 1, sp1p_buf, ld_pos + 1, sizeof(tsp_long_descriptor) );
        (* === put long data into sp1p_buf === *)
        s10mv4 ( buflen, mxsp_moveobj, 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(tsp_long_descriptor) + 1);
        END
    ELSE
        full := true;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END; (* i22plong *)
 
(*------------------------------*) 
 
PROCEDURE
      i22_calclong (
            VAR part        : tsp1_part;
            VAR long_desc   : tsp_long_descriptor;
            bufpos          : tsp_int4;
            buflen          : tsp_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;
&   ifdef TRACE
    m90int (vin, 'buflen      ', buflen);
    m90int (vin, 'bufpos      ', bufpos);
    m90int (vin, 'buf_rem     ', buf_rem);
    m90int (vin, 'part len    ', sp1p_buf_len);
    m90int (vin, 'part size   ', sp1p_buf_size);
    m90int (vin, 'packet_rem  ', packet_rem);
&   endif
    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;
&   ifdef TRACE
    (*ENDIF*) 
    m90longdescriptor ( vin, 'after calcld', long_desc, false );
&   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      : tsp_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    : tsp_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       : tsp_any_packed_char;
            VAR bufpos    : tsp_int4;
            buflen        : tsp_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       : tsp_any_packed_char;
            VAR bufpos    : tsp_int4;
            buflen        : tsp_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 ) : tsp_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       : tsp_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;
        s10mv6 (mxsp_moveobj, sizeof(tsp_long_desc_block), sp1p_buf, pos + 1,
              long_desc.lt_new, 1, sizeof(tsp_long_desc_block) );
        pos := pos + sizeof(tsp_long_desc_block) + 1;
        END
    ELSE
        BEGIN
        long_desc.lt_newlong := false;
        s10mv2 (mxsp_moveobj, sizeof(tsp_long_descriptor), sp1p_buf, pos + 1,
              long_desc.lt_old, 1, sizeof(tsp_long_descriptor) );
        pos := pos + sizeof(tsp_long_descriptor) + 1;
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
&ifdef TRACE
m90anyld ( vin, 'read ldesc  ', long_desc, false );
&endif
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];
&   ifdef TRACE
    m90p2int4 ( vin, 'position    ', pos, 'def byte    ',
          ord(def_byte) );
&   endif
    CASE  def_byte OF
        csp_undef_byte:
            BEGIN
&           ifdef TRACE
            m90int ( vin, 'NULL at     ', pos );
&           endif
            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      : tsp_int4;
            VAR buf       : tsp_any_packed_char;
            VAR bufpos    : tsp_int4;
            buflen        : tsp_int4;
            fillchar      : char;
            VAR full      : boolean );
 
VAR
      old_ld    : tsp_long_descriptor;
      new_ld    : tsp_long_desc_block;
      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;
            s10mv4 ( buflen, mxsp_moveobj, buf, bufpos, sp1p_buf,
                  desc_pos + 1, movelen);
            (* fill with bytes *)
            IF  movelen < 254
            THEN
                s10fil ( sizeof(sp1p_buf), sp1p_buf,
                      desc_pos + 1 + movelen, 254 - movelen,
                      fillchar);
            (*ENDIF*) 
            bufpos := bufpos + movelen;
            END
        ELSE
            BEGIN
            (* === get long_desc === *)
            s10mv6 ( mxsp_moveobj, 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 === *)
            s10mv5 ( sizeof(new_ld), mxsp_moveobj, new_ld, 1, sp1p_buf,
                  desc_pos + 1, sizeof(new_ld) );
            (* === put long data into sp1p_buf === *)
            WITH new_ld DO
                s10mv4 ( buflen, mxsp_moveobj, 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 === *)
        s10mv2 ( mxsp_moveobj, 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 === *)
        s10mv1 ( sizeof(old_ld), mxsp_moveobj, old_ld, 1, sp1p_buf,
              desc_pos + 1, sizeof(old_ld) );
        (* === put long data into sp1p_buf === *)
        WITH old_ld DO
            s10mv4 ( buflen, mxsp_moveobj, 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 : tsp_long_desc_block;
            max_read      : tsp_int4 );
 
BEGIN
i21abort;
&ifdef oldpacket
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
&   ifdef TRACE
    m90ldb_longdescblock ( vin, 'putting ldb ', long_desc, false );
    m90int ( vdg, 'part1 length', part1_length );
    m90int ( vdg, 'part2 length', sp1p_buf_len );
&   endif
    long_desc.ldb_vallen := max_read;
    sp1p_buf [sp1p_buf_len + 1] := csp_long_desc_def_byte;
    s10mv5 ( sizeof(tsp_long_desc_block), mxsp_moveobj,
          long_desc, 1, sp1p_buf, sp1p_buf_len + 2, sizeof(tsp_long_desc_block) );
    sp1p_buf_len := sp1p_buf_len + sizeof(tsp_long_desc_block) + 1;
&   ifdef TRACE
    m90int ( vdg, 'part len    ', sp1p_buf_len );
&   endif
    END;
(*ENDWITH*) 
&endif
END; (* in22_pldesc_new *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_gldesc_new (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp_long_desc_block;
            idx           : integer );
 
VAR
      pos  : integer;
 
BEGIN
i21abort;
&ifdef oldpacket
WITH g_area^, sql_ptr^, curr_part_ptr^ DO
    BEGIN
    IF  idx > 0
    THEN
        pos := mxsp_int2 (* skip 2 count bytes *)
              + ((idx - 1) * (sizeof(tsp_long_desc_block) + 1) ) + 1
    ELSE
        (* calculate pos from previous long descriptor *)
        pos := long_desc.ldb_valpos + long_desc.ldb_vallen;
    (*ENDIF*) 
    (* skip defined_byte *)
    s10mv6 (mxsp_moveobj, sizeof(tsp_long_desc_block),
          sp1p_buf, pos + 1, long_desc, 1, sizeof(tsp_long_desc_block) );
&   ifdef TRACE
    m90ldb_longdescblock ( vin, 'reading ldb ', long_desc, true );
    m90int ( vin, 'from pos    ', pos + 1 );
&   endif
    END;
(*ENDWITH*) 
&endif
END; (* in22_gldesc_new *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_gnextdesc_new (
            g_area        : tin_global_in_vars;
            VAR prev_desc : tsp_long_desc_block;
            VAR long_desc : tsp_long_desc_block );
 
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 *)
    s10mv6 (mxsp_moveobj, sizeof(tsp_long_desc_block),
          sp1p_buf, pos + 1, long_desc, 1, sizeof(tsp_long_desc_block) );
&   ifdef TRACE
    m90ldb_longdescblock ( vin, 'reading ldb ', long_desc, false );
    m90int ( vin, 'from pos    ', pos + 1 );
&   endif
    END;
(*ENDWITH*) 
&endif
END; (* in22_gnextdesc_new *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_glong_new (
            g_area        : tin_global_in_vars;
            VAR long_desc : tsp_long_desc_block;
            VAR buf       : tsp_any_packed_char;
            VAR bufpos    : tsp_int4;
            buflen        : tsp_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 );
&   ifdef TRACE
    m90int ( vin, 'glong bytes ', mvlen );
&   endif
    IF  ldb_valmode in [ vm_datapart, vm_alldata,
        vm_lastdata, vm_data_trunc]
    THEN
        s10mv3 (mxsp_moveobj, 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    : tsp_int2;
            var_index : char;
            is_null   : boolean );
 
VAR
      long_desc : tsp_long_desc_block;
 
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(tsp_long_desc_block),
      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 : tsp_long_desc_block;
            VAR buf       : tsp_any_packed_char;
            VAR bufpos    : tsp_int4;
            buflen        : tsp_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(tsp_long_desc_block) + 1)
    THEN
        BEGIN
&       ifdef TRACE
        m90ldb_longdescblock ( vin, 'in i22nplong', long_desc, false );
&       endif
        i22_incr_count ( curr_part_ptr^ );
        ldb_pos := sp1p_buf_len + 1;
        (* === add space for long_desc === *)
&       ifdef TRACE
        m90int ( vdg, 'ldb_pos     ', ldb_pos );
&       endif
        sp1p_buf [ldb_pos] := csp_long_desc_def_byte;
        sp1p_buf_len := sp1p_buf_len + sizeof(tsp_long_desc_block) + 1;
        (* === calculate long_desc variables === *)
        in22_calclong_new ( curr_part_ptr^, long_desc, bufpos, buflen );
        (* === put long_desc into sp1p_buf === *)
        s10mv5 ( sizeof(tsp_long_desc_block), mxsp_moveobj,
              long_desc, 1, sp1p_buf, ldb_pos + 1, sizeof(tsp_long_desc_block) );
        (* === put long data into sp1p_buf === *)
        s10mv4 ( buflen, mxsp_moveobj, 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(tsp_long_desc_block) + 1);
        END
    ELSE
        full := true;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
&endif
END; (* in22_plong_new *)
 
(*------------------------------*) 
 
PROCEDURE
      in22_calclong_new (
            VAR part        : tsp1_part;
            VAR long_desc   : tsp_long_desc_block;
            bufpos          : tsp_int4;
            buflen          : tsp_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;
&   ifdef TRACE
    m90int ( vin, 'buflen      ', buflen );
    m90int ( vin, 'bufpos      ', bufpos );
    m90int ( vin, 'buf_rem     ', buf_rem );
    m90int ( vin, 'part1       ', part1_length );
    m90int ( vin, 'part2       ', sp1p_buf_len );
    m90int ( vin, 'packet_rem  ', packet_rem );
&   endif
    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;
&   ifdef TRACE
    (*ENDIF*) 
    m90ldb_longdescblock ( vin, 'after calclb', long_desc, false );
&   endif
    END;
(*ENDWITH*) 
&endif
END; (* in22_calclong_new *)
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        248
*-PRETTY-*  lines of code :       1058        PRETTY  3.09 
*-PRETTY-*  lines in file :       1631         1992-11-23 
.PA 
