Sample C program for creating a local queue (amqsaicq.c)
The sample C program amqsaicq.c creates a local queue using the MQAI.
/******************************************************************************/ /* */ /* Program name: AMQSAICQ.C */ /* */ /* Description: Sample C program to create a local queue using the */ /* IBM MQ Administration Interface (MQAI). */ /* */ /* */ /* 84H2000, 5765-B73 */ /* 84H2001, 5639-B42 */ /* 84H2002, 5765-B74 */ /* 84H2003, 5765-B75 */ /* 84H2004, 5639-B43 */ /* */ /* (C) Copyright IBM Corp. 1999, 2020 */ /* */ /******************************************************************************/ /* */ /* Function: */ /* AMQSAICQ is a sample C program that creates a local queue and is an */ /* example of the use of the mqExecute call. */ /* */ /* - The name of the queue to be created is a parameter to the program. */ /* */ /* - A PCF command is built by placing items into an MQAI bag. */ /* These are:- */ /* - The name of the queue */ /* - The type of queue required, which, in this case, is local. */ /* */ /* - The mqExecute call is executed with the command MQCMD_CREATE_Q. */ /* The call generates the correct PCF structure. */ /* The call receives the reply from the command server and formats into */ /* the response bag. */ /* */ /* - The completion code from the mqExecute call is checked and if there */ /* is a failure from the command server then the code returned by the */ /* command server is retrieved from the system bag that is */ /* embedded in the response bag to the mqExecute call. */ /* */ /* Note: The command server must be running. */ /* */ /* */ /******************************************************************************/ /* */ /* AMQSAICQ has 2 parameters - the name of the local queue to be created */ /* - the queue manager name (optional) */ /* */ /******************************************************************************/ /******************************************************************************/ /* Includes */ /******************************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <cmqc.h> /* MQI */ #include <cmqcfc.h> /* PCF */ #include <cmqbc.h> /* MQAI */ void CheckCallResult(MQCHAR *, MQLONG, MQLONG ); void CreateLocalQueue(MQHCONN, MQCHAR *); int main(int argc, char *argv[]) { MQHCONN hConn; /* handle to IBM MQ connection */ MQCHAR QMName[MQ_Q_MGR_NAME_LENGTH+1]=""; /* default QMgr name */ MQLONG connReason; /* MQCONN reason code */ MQLONG compCode; /* completion code */ MQLONG reason; /* reason code */ /***************************************************************************/ /* First check the required parameters */ /***************************************************************************/ printf("Sample Program to Create a Local Queue\n"); if (argc < 2) { printf("Required parameter missing - local queue name\n"); exit(99); } /***************************************************************************/ /* Connect to the queue manager */ /***************************************************************************/ if (argc > 2) strncpy(QMName, argv[2], (size_t)MQ_Q_MGR_NAME_LENGTH); MQCONN(QMName, &hConn, &compCode, &connReason); /******************************************************************************/ /* Report reason and stop if connection failed */ /******************************************************************************/ if (compCode == MQCC_FAILED) { CheckCallResult("MQCONN", compCode, connReason); exit( (int)connReason); } /******************************************************************************/ /* Call the routine to create a local queue, passing the handle to the */ /* queue manager and also passing the name of the queue to be created. */ /******************************************************************************/ CreateLocalQueue(hConn, argv[1]); /***************************************************************************/ /* Disconnect from the queue manager if not already connected */ /***************************************************************************/ if (connReason != MQRC_ALREADY_CONNECTED) { MQDISC(&hConn, &compCode, &reason); CheckCallResult("MQDISC", compCode, reason); } return 0; } /******************************************************************************/ /* */ /* Function: CreateLocalQueue */ /* Description: Create a local queue by sending a PCF command to the command */ /* server. */ /* */ /******************************************************************************/ /* */ /* Input Parameters: Handle to the queue manager */ /* Name of the queue to be created */ /* */ /* Output Parameters: None */ /* */ /* Logic: The mqExecute call is executed with the command MQCMD_CREATE_Q. */ /* The call generates the correct PCF structure. */ /* The default options to the call are used so that the command is sent*/ /* to the SYSTEM.ADMIN.COMMAND.QUEUE. */ /* The reply from the command server is placed on a temporary dynamic */ /* queue. */ /* The reply is read from the temporary queue and formatted into the */ /* response bag. */ /* */ /* The completion code from the mqExecute call is checked and if there */ /* is a failure from the command server then the code returned by the */ /* command server is retrieved from the system bag that is */ /* embedded in the response bag to the mqExecute call. */ /* */ /******************************************************************************/ void CreateLocalQueue(MQHCONN hConn, MQCHAR *qName) { MQLONG reason; /* reason code */ MQLONG compCode; /* completion code */ MQHBAG commandBag = MQHB_UNUSABLE_HBAG; /* command bag for mqExecute */ MQHBAG responseBag = MQHB_UNUSABLE_HBAG;/* response bag for mqExecute */ MQHBAG resultBag; /* result bag from mqExecute */ MQLONG mqExecuteCC; /* mqExecute completion code */ MQLONG mqExecuteRC; /* mqExecute reason code */ printf("\nCreating Local Queue %s\n\n", qName); /***************************************************************************/ /* Create a command Bag for the mqExecute call. Exit the function if the */ /* create fails. */ /***************************************************************************/ mqCreateBag(MQCBO_ADMIN_BAG, &commandBag, &compCode, &reason); CheckCallResult("Create the command bag", compCode, reason); if (compCode !=MQCC_OK) return; /***************************************************************************/ /* Create a response Bag for the mqExecute call, exit the function if the */ /* create fails. */ /***************************************************************************/ mqCreateBag(MQCBO_ADMIN_BAG, &responseBag, &compCode, &reason); CheckCallResult("Create the response bag", compCode, reason); if (compCode !=MQCC_OK) return; /***************************************************************************/ /* Put the name of the queue to be created into the command bag. This will */ /* be used by the mqExecute call. */ /***************************************************************************/ mqAddString(commandBag, MQCA_Q_NAME, MQBL_NULL_TERMINATED, qName, &compCode, &reason); CheckCallResult("Add q name to command bag", compCode, reason); /***************************************************************************/ /* Put queue type of local into the command bag. This will be used by the */ /* mqExecute call. */ /***************************************************************************/ mqAddInteger(commandBag, MQIA_Q_TYPE, MQQT_LOCAL, &compCode, &reason); CheckCallResult("Add q type to command bag", compCode, reason); /***************************************************************************/ /* Send the command to create the required local queue. */ /* The mqExecute call will create the PCF structure required, send it to */ /* the command server and receive the reply from the command server into */ /* the response bag. */ /***************************************************************************/ mqExecute(hConn, /* IBM MQ connection handle */ MQCMD_CREATE_Q, /* Command to be executed */ MQHB_NONE, /* No options bag */ commandBag, /* Handle to bag containing commands */ responseBag, /* Handle to bag to receive the response*/ MQHO_NONE, /* Put msg on SYSTEM.ADMIN.COMMAND.QUEUE*/ MQHO_NONE, /* Create a dynamic q for the response */ &compCode, /* Completion code from the mqExecute */ &reason); /* Reason code from mqExecute call */ if (reason == MQRC_CMD_SERVER_NOT_AVAILABLE) { printf("Please start the command server: <strmqcsv QMgrName>\n") MQDISC(&hConn, &compCode, &reason); CheckCallResult("MQDISC", compCode, reason); exit(98); } /***************************************************************************/ /* Check the result from mqExecute call and find the error if it failed. */ /***************************************************************************/ if ( compCode == MQCC_OK ) printf("Local queue %s successfully created\n", qName); else { printf("Creation of local queue %s failed: Completion Code = %d qName, compCode, reason); if (reason == MQRCCF_COMMAND_FAILED) { /*********************************************************************/ /* Get the system bag handle out of the mqExecute response bag. */ /* This bag contains the reason from the command server why the */ /* command failed. */ /*********************************************************************/ mqInquireBag(responseBag, MQHA_BAG_HANDLE, 0, &resultBag, &compCode, &reason); CheckCallResult("Get the result bag handle", compCode, reason); /*********************************************************************/ /* Get the completion code and reason code, returned by the command */ /* server, from the embedded error bag. */ /*********************************************************************/ mqInquireInteger(resultBag, MQIASY_COMP_CODE, MQIND_NONE, &mqExecuteCC, &compCode, &reason); CheckCallResult("Get the completion code from the result bag", compCode, reason); mqInquireInteger(resultBag, MQIASY_REASON, MQIND_NONE, &mqExecuteRC, &compCode, &reason); CheckCallResult("Get the reason code from the result bag", compCode, reason); printf("Error returned by the command server: Completion code = %d : Reason = %d\n", mqExecuteCC, mqExecuteRC); } } /***************************************************************************/ /* Delete the command bag if successfully created. */ /***************************************************************************/ if (commandBag != MQHB_UNUSABLE_HBAG) { mqDeleteBag(&commandBag, &compCode, &reason); CheckCallResult("Delete the command bag", compCode, reason); } /***************************************************************************/ /* Delete the response bag if successfully created. */ /***************************************************************************/ if (responseBag != MQHB_UNUSABLE_HBAG) { mqDeleteBag(&responseBag, &compCode, &reason); CheckCallResult("Delete the response bag", compCode, reason); } } /* end of CreateLocalQueue */ /******************************************************************************/ /* */ /* Function: CheckCallResult */ /* */ /******************************************************************************/ /* */ /* Input Parameters: Description of call */ /* Completion code */ /* Reason code */ /* */ /* Output Parameters: None */ /* */ /* Logic: Display the description of the call, the completion code and the */ /* reason code if the completion code is not successful */ /* */ /******************************************************************************/ void CheckCallResult(char *callText, MQLONG cc, MQLONG rc) { if (cc != MQCC_OK) printf("%s failed: Completion Code = %d : Reason = %d\n", callText, cc, rc); }Parent topic: Use the MQAI to simplify the use of PCFs