Re: *DTAQ existence API

Kelly Beard <[email protected]>
Newsgroups gmane.comp.lang.as400.c
Message-ID <CAOvM2SseJFzZQk7aaPr7imHC0xLmAdNnMb1pgdjFf+wp2ZVGrg@mail.gmail.com>
I often write tiny, throw-away things when I need to learn a new API or
something on the 400 and found that I had an example of handling an
exception like this for an old API.  Anyway, I came up with the following.
I will gladly entertain suggestions for improvements, etc.

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <unistd.h>
#include <qmhqrdqd.h>
#include <except.h>
#include <signal.h>

using namespace std;


//
http://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/apis/qmhqrdqd.htm
// icc qmhqrdqd.cpp -o qmhqrdqd

#define TRIMMED_STRING(x) (string((x), sizeof((x))))

static _INTRPT_Hndlr_Parms_T exception_data;
static void handler_SIGALL(int sig)
{
    _GetExcData(&exception_data);
    cout << "Exception message ID is " <<
TRIMMED_STRING(exception_data.Msg_Id) << endl;
    cout << "Signal raised is " << sig << endl;
    throw runtime_error("your mom goes to college");
}


int main(int argc, char* argv[])
{
    Qmh_Qrdqd_RDQD0100_t dtaqDesc;

    try {
        void (*signal_handler)(int);
        signal_handler = signal(SIGALL, handler_SIGALL);
        QMHQRDQD(&dtaqDesc, sizeof(Qmh_Qrdqd_RDQD0100_t), "RDQD0100",
"BOGUS     BOGUS     ");
        signal_handler = signal(SIGALL, signal_handler);

        cout << "Bytes_Return=" << dtaqDesc.Bytes_Return << endl;
        cout << "Bytes_Available=" << dtaqDesc.Bytes_Available << endl;
        cout << "Message_Length=" << dtaqDesc.Message_Length << endl;
        cout << "Key_Length=" << dtaqDesc.Key_Length << endl;
        cout << "Sequence=" << TRIMMED_STRING(dtaqDesc.Sequence) << endl;
        cout << "Include_Sender_Id=" <<
TRIMMED_STRING(dtaqDesc.Include_Sender_Id) << endl;
        cout << "Force_Indicators=" <<
TRIMMED_STRING(dtaqDesc.Force_Indicators) << endl;
        cout << "Text=" << TRIMMED_STRING(dtaqDesc.Text) << endl;
        cout << "Type=" << TRIMMED_STRING(dtaqDesc.Type) << endl;
        cout << "Automatic_Reclaim=" <<
TRIMMED_STRING(dtaqDesc.Automatic_Reclaim) << endl;
        cout << "Enforce_Object_Locks=" <<
TRIMMED_STRING(dtaqDesc.Enforce_Object_Locks) << endl;
        cout << "Number_Messages=" << dtaqDesc.Number_Messages << endl;
        cout << "Max_Number_Messages=" << dtaqDesc.Max_Number_Messages <<
endl;
        cout << "Data_Queue_Name=" <<
TRIMMED_STRING(dtaqDesc.Data_Queue_Name) << endl;
        cout << "Data_Queue_Library=" <<
TRIMMED_STRING(dtaqDesc.Data_Queue_Library) << endl;
        cout << "Max_Number_Entries_Allowed=" <<
dtaqDesc.Max_Number_Entries_Allowed << endl;
        cout << "Initial_Number_Entries=" <<
dtaqDesc.Initial_Number_Entries << endl;
        cout << "Max_Number_Entries_Specified=" <<
dtaqDesc.Max_Number_Entries_Specified << endl;
        cout << "Last_Auto_Reclaim_Date_Time=" <<
TRIMMED_STRING(dtaqDesc.Last_Auto_Reclaim_Date_Time) << endl;
    }
    catch (runtime_error& e) {
        cerr << e.what() << endl;
    }
}


On Thu, Nov 10, 2016 at 11:36 AM, Tim Bronski <[email protected]> wrote:

> If you're using system() then something like this:
>
> if (rc=system(cmdstring)) {
>          if (!strcmp(_EXCP_MSGID, "CPF9801"))
>            return ERR_OBJ_NOT_FOUND;
>          if (!strcmp(_EXCP_MSGID, "CPF9810"))
>            return ERR_LIB_NOT_FOUND;
>          return -1;
> } else
>     return 0;    // Object found
>
>
>
> On 11/10/2016 6:27 PM, Buck Calabro wrote:
>
>> On 11/10/2016 11:54 AM, Kelly Beard wrote:
>>
>>> http://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/
>>> apis/qmhqrdqd.htm
>>>
>>> QMHQRDQD() is an API without an error receiver variable, yet the page
>>> lists
>>> possible error codes.  How do you get these back from the API?  I need a
>>> good C/C++ example on this.
>>>
>> This particular API returns errors the old fashioned way - as exception
>> messages.  If the API runs into an issue (like not authorised to the
>> library) then IBM i will send a message to your program (the caller of
>> the API) telling you so.
>>
>> You need to monitor for, and receive those messages.
>>
>> The whole topic is covered in 'Handling Exceptions in a Program'
>> https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rza
>> rh/hexcp.htm#hexcp
>>
>> It's a little upside down to typical C where you get errno via a 'side
>> channel' and you can check it or not as you see fit.  When IBM i throws
>> exception messages, your code gets interrupted and a white message
>> occurs unless you specifically monitor and handle the message.
>>
>> Also, isn't there a reason no CRTDTAQ API is available?  Why just a
>>> command?  That makes it difficult to capture any potential errors on that
>>> as well.
>>>
>> This works the same as QMHQRDQD(); you handle the exception message that
>> arises.
>>
>>
> --
> Need sFTP or PGP? Download your native sFTP or OpenPGP solutions here:
> www.arpeggiosoftware.com
>
> --
> This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L)
> mailing list
> To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected]
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/c400-l
> or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected]
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/c400-l.
>
>


-- 
Kelly Beard
-- 
This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L) mailing list
To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected]
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/c400-l
or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected]
Before posting, please take a moment to review the archives
at http://archive.midrange.com/c400-l.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.