× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.


  • Subject: Re: QMHRDQM API - Retrieve Data Queue Message
  • From: Carel Teijgeler <teygeler@xxxxxxx>
  • Date: Wed, 20 Dec 2000 18:47:01 +0100

Mark Drazic wrote:

> Brief code snippets for this Service Program, which is running in Activation
> Group QSRV.
>
> This is the version used with a Pointer for the Receiver Variable, which
> always came back *Null whether the pointer was allocated or not.  Some of
> the information, prefixed "dQD", comes from the Retrieve Data Queue
> Description API successfully called prior to this call.  Fields prefixed
> "pp" are passed into this procedure.
>
>      D @lenOfDQEntLst...
>      D                             S             9B 0
>      D @dQEntListPtr...
>      D                             S              *   Inz(*Null)
>      D @dQELFName                    S             8    Inz('RDQM0100')
>      D @lenOfMSelInf               S             9B 0 Inz(8)
>      D @mSelInfFName               S             8    Inz('RDQS0100')
>
>      DDQSelInf01DS                 DS
>      D @dQSelectionType...
>      D                                           1
>      D @dQReserved02...
>      D                                           3
>      D @dQNumberOfMessageTextBytesToRetrieve...
>      D                                           9B 0
>
>      DDQEntInfHdrDS                DS                  Based(@dQEntHdrDSPtr)
>      D @dQBytesReturned...
>      D                                           9B 0
>      D @dQBytesAvailable...
>      D                                           9B 0
>      D @dQNumberOfMessagesReturned...
>      D                                           9B 0
>      D @dQNumberOfMessagesAvailable...
>      D                                           9B 0
>      D @dQMessageKeyLengthReturned...
>      D                                           9B 0
>      D @dQMessageKeyLengthAvailable...
>      D                                           9B 0
>      D @dQMessageTextLengthReturned...
>      D                                           9B 0
>      D @dQMessageTextLengthAvailable...
>      D                                           9B 0
>      D @dQEntryLengthReturned...
>      D                                           9B 0
>      D @dQEntryLengthAvailable...
>      D                                           9B 0
>      D @dQOffsetToFirstMessageEntry...
>      D                                           9B 0
>      D @dQActualDataQLibraryName...
>      D                                          10
>      D @dQReserved01...
>      D                                           1
>
>      D @dQEntHdrDSPtr             S               *   Inz(*Null)
>
>      C                   Eval      @lenOfDQEntLst =
>      C                              (@dQDMessageLength *
> @dQDNumberOfMessages)
>      C                              + %Len(DQEntInfHdrDS)
>      C                              + ((%Len(DQEntInfDS) *
> @dQDNumberOfMessages))
>      C                   Eval      @qualDQName = ppDataQName +
> ppDataQLibrary
>      C                   Eval      @dQSelectionType = 'A'
>      C                   Eval      @dQNumberOfMessageTextBytesToRetrieve =
>      C
> @dQDMessageLength
>
>       *==================
>       * Call API to Retrieve Data Queue Entries
>      C                   Call  (E) 'QMHRDQM'
>      C                   Parm                    @dQEntListPtr
> Receiver Variable
>      C                   Parm                    @lenOfDQEntLst
> Length of Receiver Variable
>      C                   Parm                    @dQELFName
> Format name
>      C                   Parm                    @qualDQName
> Qualified Data Queue Name
>      C                   Parm                    DQSelInf01DS
> Message Selection Information
>      C                   Parm                    @lenOfMSelInf
> Length of Message Selection Information
>      C                   Parm                    @mSelInfFName
> Message Selection Information Format Name
>      C                   Parm                    APIErrorDS
> Error Data Structure
>
> As stated, the pointer as a Receiver Variable is always returned *Null.
> But, if the pointer is changed to a field name, the API immediately starts
> to work and returns information.
>
>      D @dQEntListDta...
>      D                 S          32767    Based(@dQEntListPtr)
>
>      C                   If        @dQEntListPtr = *Null
>      C                   Eval      @lenOfDQEntLst = %Len(@dQEntListDta)
>      C                   Alloc     @lenOfDQEntLst@dQEntListPtr
>      C                   EndIf
>
>       *==================
>       * Call API to Retrieve Data Queue Entries
>      C                   Call  (E) 'QMHRDQM'
>      C                   Parm                    @dQEntListDta
>      C                   Parm                    @lenOfDQEntLst
>      C                   Parm                    @dQELFName
>      C                   Parm                    @qualDQName
>      C                   Parm                    DQSelInf01DS
>      C                   Parm                    @lenOfMSelInf
>      C                   Parm                    @mSelInfFName
>      C                   Parm                    APIErrorDS
>
> The problem with this method is the 32K limit, which in our case, where we
> have Data Queues backed up with a lot of entries and some Queues which have
> long lengths, we can't return enough information to satisfy our users.
> Also, many API's return a Receiver Variable, and I have yet been able to get
> any of them to work with a pointer, including both external calls and
> procedural calls.  Having the ability to utilize more memory dynamically
> would be a big plus in using the API's.
>
> Again, any help would be greatly appreciated.

Mark,

I did a little experiment with this API a few years ago and I could not use
pointers to reference the RTNVAR (being on V3R2M0). I suggests to code the 
RTNVAR
as a data structure and skip the idea of using a pointer. Required information 
on
the offset of the first message and the next message(s) is stored in the RTNVAR.
How do you want to extract that with a pointer? IMHO the datastructure approach
is in that respect much simpler.

The things I found out is:
With a keyed data queue you can settle to retrieve the next set of messages. Of
course this also depends on the composition of the key data.
With a non keyed data queue you can not settle and will always retrieve the 
first
messages.

So the use of this API seems very limited to me. My experiment resulted in a 
copy
programme to another data queue or a PF and vice versa.

With regards,

Carel Teijgeler

+---
| This is the RPG/400 Mailing List!
| To submit a new message, send your mail to RPG400-L@midrange.com.
| To subscribe to this list send email to RPG400-L-SUB@midrange.com.
| To unsubscribe from this list send email to RPG400-L-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: david@midrange.com
+---

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.