* _READV
* READV statement recursive code
* Copyright (c) 2005 Ladybridge Systems, All Rights Reserved
*
* 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, 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.
* 
* Ladybridge Systems can be contacted via the www.openqm.com web site.
* 
* START-HISTORY:
* 12 Dec 05  2.3-2 0439 Now returns clause selection status via e-stack.
* 16 Mar 05  2.1-10 Added support for PICKREAD mode.
* 03 Jan 05  2.1-0 Allow break key to abort lock wait.
* 09 Dec 04  2.1-0 0290 Added support for the LOCKED clause.
* 16 Sep 04  2.0-1 OpenQM launch. Earlier history details suppressed.
* END-HISTORY
*
* START-DESCRIPTION:
*
* END-DESCRIPTION
*
* START-CODE

$internal
$no.symbols
$no.xref
$recursive
$flags allow.break

$include int$keys.h
$include err.h

subroutine readv(tgt, file, id, field.no, op_flags)

   locked.clause = bitand(op_flags, P$LOCKED)

   begin case
      case bitand(op_flags, P$LLOCK)             ;* READVL
         if locked.clause then 
            readl rec from file, id
               on error goto on.error
               locked goto locked
               else goto else.clause
         end else
            readl rec from file, id
               on error goto on.error
               else goto else.clause
         end

      case bitand(op_flags, P$ULOCK)             ;* READVU
         if locked.clause then 
            readu rec from file, id
               on error goto on.error
               locked goto locked
               else goto else.clause
         end else
            readu rec from file, id
               on error goto on.error
               else goto else.clause
         end

      case 1                                 ;* READV
         read rec from file, id on error return else goto else.clause
   end case

   tgt = rec<field.no>
   return value 0

on.error:
   return value -abs(status())   ;* Ensure returned negative

locked:
   return value ER$LCK

else.clause:
   if not(bitand(op_flags, P$PICKREAD)) then tgt = ''
   return value status()
end

* END-CODE
