/**************************************************************************** ** (c) Copyright IBM Corp. 2007 All rights reserved. ** ** The following sample of source code ("Sample") is owned by International ** Business Machines Corporation or one of its subsidiaries ("IBM") and is ** copyrighted and licensed, not sold. You may use, copy, modify, and ** distribute the Sample in any form without payment to IBM, for the purpose of ** assisting you in the development of your applications. ** ** The Sample code is provided to you on an "AS IS" basis, without warranty of ** any kind. IBM HEREBY EXPRESSLY DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR ** IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Some jurisdictions do ** not allow for the exclusion or limitation of implied warranties, so the above ** limitations or exclusions may not apply to you. IBM shall not be liable for ** any damages you suffer as a result of using, copying, modifying or ** distributing the Sample, even if IBM has been advised of the possibility of ** such damages. ***************************************************************************** ** ** SOURCE FILE NAME: cli_info.C ** ** SAMPLE: Set and get information at the client level ** ** DB2 APIs USED: ** sqleseti -- SET CLIENT INFORMATION ** sqleqryi -- QUERY CLIENT INFORMATION ** sqlesetc -- SET CLIENT ** sqleqryc -- QUERY CLIENT ** ** STRUCTURES USED: ** sqle_client_info ** sqle_conn_setting ** sqlca ** ** ***************************************************************************** * * For information on developing embedded SQL applications see the Developing Embedded SQL Applications book. * * For more information on DB2 APIs, see the Administrative API Reference. * * For the latest information on programming, compiling, and running DB2 * applications, visit the DB2 Information Center: * http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp ****************************************************************************/ #include <string.h> #include <sqlenv.h> #include "utilapi.h" #if ((__cplusplus >= 199711L) && !defined DB2HP && !defined DB2AIX) || \ (DB2LINUX && (__LP64__ || (__GNUC__ >= 3)) ) #include <iostream> using namespace std; #else #include <iostream.h> #endif class ApInfo { public: static int ClientAppNameSetGet(); static int ClientUseridSetGet(); static int ClientWorkstationSetGet(); static int ClientSuffixForAccountingStringSetGet(); static int ClientConnectionAttrsSetGet(); }; int ApInfo::ClientAppNameSetGet() { struct sqlca sqlca; struct sqle_client_info clientAppInfo[1]; unsigned short dbAliasLen; char dbAlias[SQL_ALIAS_SZ + 1]; cout << "\n-----------------------------------------------------------"; cout << "\nUSE THE DB2 APIs:" << endl; cout << " sqleseti -- SET CLIENT INFORMATION" << endl; cout << " sqleqryi -- QUERY CLIENT INFORMATION" << endl; cout << "TO SET/GET THE CLIENT APPLICATION NAME:" << endl; // specify all the connections dbAliasLen = 0; strcpy(dbAlias, ""); // initialize clientAppInfo clientAppInfo[0].type = SQLE_CLIENT_INFO_APPLNAME; clientAppInfo[0].pValue = (char *)new char[SQLE_CLIENT_APPLNAME_MAX_LEN + 1]; // set client application name strcpy(clientAppInfo[0].pValue, "ClientApplicationName"); clientAppInfo[0].length = strlen((char *)clientAppInfo[0].pValue); cout << "\n Set the Client Application Name to the value:" << endl; cout << " " << clientAppInfo[0].pValue << endl; // set client information sqleseti(dbAliasLen, dbAlias, 1, &clientAppInfo[0], &sqlca); DB2_API_CHECK("Client Application Name -- set"); // get client application name strcpy(clientAppInfo[0].pValue, ""); cout << " Get the Client Application Name." << endl; // query client information sqleqryi(dbAliasLen, dbAlias, 1, &clientAppInfo[0], &sqlca); DB2_API_CHECK("Client Application Name -- get"); cout << " The Client Application Name is:" << endl; cout << " " << clientAppInfo[0].pValue << endl; // release the memory allocated delete [] clientAppInfo[0].pValue; return 0; } //ApInfo::ClientAppNameSetGet int ApInfo::ClientUseridSetGet() { struct sqlca sqlca; struct sqle_client_info clientAppInfo[1]; unsigned short dbAliasLen; char dbAlias[SQL_ALIAS_SZ + 1]; cout << "\n-----------------------------------------------------------"; cout << "\nUSE THE DB2 APIs:" << endl; cout << " sqleseti -- SET CLIENT INFORMATION" << endl; cout << " sqleqryi -- QUERY CLIENT INFORMATION" << endl; cout << "TO SET/GET THE CLIENT USER ID:" << endl; // specify all the connections dbAliasLen = 0; strcpy(dbAlias, ""); // initialize clientAppInfo clientAppInfo[0].type = (unsigned short)SQLE_CLIENT_INFO_USERID; clientAppInfo[0].pValue = (char *)new char[SQLE_CLIENT_USERID_MAX_LEN + 1]; // set client user ID strcpy(clientAppInfo[0].pValue, "ClientUserid"); clientAppInfo[0].length = strlen((char *)clientAppInfo[0].pValue); cout << "\n Set the Client User ID to the value:" << endl; cout << " " << clientAppInfo[0].pValue << endl; // set client information sqleseti(dbAliasLen, dbAlias, 1, &clientAppInfo[0], &sqlca); DB2_API_CHECK("Client User ID -- set"); // get client user ID strcpy(clientAppInfo[0].pValue, ""); cout << " Get the Client User ID." << endl; // query client information sqleqryi(dbAliasLen, dbAlias, 1, &clientAppInfo[0], &sqlca); DB2_API_CHECK("Client User ID -- get"); cout << " The Client User ID is:" << endl; cout << " " << clientAppInfo[0].pValue << endl; // release the memory allocated delete [] clientAppInfo[0].pValue; return 0; } //ApInfo::ClientUseridSetGet int ApInfo::ClientWorkstationSetGet() { struct sqlca sqlca; struct sqle_client_info clientAppInfo[1]; unsigned short dbAliasLen; char dbAlias[SQL_ALIAS_SZ + 1]; cout << "\n-----------------------------------------------------------"; cout << "\nUSE THE DB2 APIs:" << endl; cout << " sqleseti -- SET CLIENT INFORMATION" << endl; cout << " sqleqryi -- QUERY CLIENT INFORMATION" << endl; cout << "TO SET/GET THE CLIENT WORKSTATION NAME:" << endl; // specify all the connections dbAliasLen = 0; strcpy(dbAlias, ""); // initialize clientAppInfo clientAppInfo[0].type = SQLE_CLIENT_INFO_WRKSTNNAME; clientAppInfo[0].pValue = (char *)new char[SQLE_CLIENT_WRKSTNNAME_MAX_LEN + 1]; // set client workstation strcpy(clientAppInfo[0].pValue, "ClientWorkstation"); clientAppInfo[0].length = strlen((char *)clientAppInfo[0].pValue); cout << "\n Set the Client Workstation Name to the value:"; cout << "\n " << clientAppInfo[0].pValue << endl; // set client information sqleseti(dbAliasLen, dbAlias, 1, &clientAppInfo[0], &sqlca); DB2_API_CHECK("Client Workstation Name -- set"); // get client workstation strcpy(clientAppInfo[0].pValue, ""); cout << " Get the Client Workstation Name." << endl; // query client information sqleqryi(dbAliasLen, dbAlias, 1, &clientAppInfo[0], &sqlca); DB2_API_CHECK("Client Workstation Name -- get"); cout << " The Client Workstation Name is:" << endl; cout << " " << clientAppInfo[0].pValue << endl; // release the memory allocated delete [] clientAppInfo[0].pValue; return 0; } //ApInfo::ClientWorkstationSetGet int ApInfo::ClientSuffixForAccountingStringSetGet() { struct sqlca sqlca; struct sqle_client_info clientAppInfo[1]; char clientAccStrSuffix[] = "ClientSuffixForAccountingString"; unsigned short dbAliasLen; char dbAlias[SQL_ALIAS_SZ + 1]; cout << "\n-----------------------------------------------------------"; cout << "\nUSE THE DB2 APIs:" << endl; cout << " sqleseti -- SET CLIENT INFORMATION" << endl; cout << " sqleqryi -- QUERY CLIENT INFORMATION" << endl; cout << "TO SET/GET THE CLIENT SUFFIX FOR THE ACCOUNTING STRING:"; cout << endl; // specify all the connections dbAliasLen = 0; strcpy(dbAlias, ""); // initialize clientAppInfo clientAppInfo[0].type = SQLE_CLIENT_INFO_ACCTSTR; clientAppInfo[0].pValue = (char *)new char[SQLE_CLIENT_APPLNAME_MAX_LEN + 1]; // set client suffix for accounting string strcpy(clientAppInfo[0].pValue, "ClientSuffixForAccountingString"); clientAppInfo[0].length = strlen((char *)clientAppInfo[0].pValue); cout << "\n Use the DB2 API sqleseti to set the Client Suffix"; cout << "\n for the Accounting String to the value:"; cout << "\n " << clientAppInfo[0].pValue << endl; // set client information sqleseti(dbAliasLen, dbAlias, 1, &clientAppInfo[0], &sqlca); DB2_API_CHECK("Client Suffix for Accounting String -- set"); // get client suffix for accounting string strcpy(clientAppInfo[0].pValue, ""); cout << " Get the Client Suffix for the Accounting String." << endl; // query client information sqleqryi(dbAliasLen, dbAlias, 1, &clientAppInfo[0], &sqlca); DB2_API_CHECK("Client Suffix for Accounting String -- get"); cout << " The Client Suffix for the Accounting String is:" << endl; cout << " " << clientAppInfo[0].pValue << endl; // release the memory allocated delete [] clientAppInfo[0].pValue; return 0; } //ApInfo::ClientSuffixForAccountingStringSetGet int ApInfo::ClientConnectionAttrsSetGet() { struct sqlca sqlca; struct sqle_conn_setting clientAppInfo[8]; cout << "\n-----------------------------------------------------------"; cout << "\nUSE THE DB2 APIs:" << endl; cout << " sqlesetc -- SET CLIENT" << endl; cout << " sqleqryc -- QUERY CLIENT" << endl; cout << "TO SET/GET THE CLIENT CONNECTION ATTRIBUTES:" << endl; // initialize clientAppInfo clientAppInfo[0].type = SQL_CONNECT_TYPE; clientAppInfo[1].type = SQL_RULES; clientAppInfo[2].type = SQL_DISCONNECT; clientAppInfo[3].type = SQL_SYNCPOINT; clientAppInfo[4].type = SQL_MAX_NETBIOS_CONNECTIONS; clientAppInfo[5].type = SQL_DEFERRED_PREPARE; clientAppInfo[6].type = SQL_CONNECT_NODE; clientAppInfo[7].type = SQL_ATTACH_NODE; clientAppInfo[0].value = SQL_CONNECT_2; clientAppInfo[1].value = SQL_RULES_STD; clientAppInfo[2].value = SQL_DISCONNECT_COND; clientAppInfo[3].value = SQL_SYNC_ONEPHASE; clientAppInfo[4].value = 16; clientAppInfo[5].value = SQL_DEFERRED_PREPARE_YES; clientAppInfo[6].value = 3; clientAppInfo[7].value = 3; // set client connection attributes cout << "\n Set the Client Connection Attributes to the values:"; cout << "\n SQL_CONNECT_TYPE = SQL_CONNECT_2"; cout << "\n SQL_RULES = SQL_RULES_STD"; cout << "\n SQL_DISCONNECT = SQL_DISCONNECT_COND"; cout << "\n SQL_SYNCPOINT = SQL_SYNC_ONEPHASE"; cout << "\n SQL_MAX_NETBIOS_CONNECTIONS = 16"; cout << "\n SQL_DEFERRED_PREPARE = SQL_DEFERRED_PREPARE_YES"; cout << "\n SQL_CONNECT_NODE = 3"; cout << "\n SQL_ATTACH_NODE = 3" << endl; // set client sqlesetc(&clientAppInfo[0], 8, &sqlca); DB2_API_CHECK("Client Connection Attributes -- set"); // get client connection attributes // reset clientAppInfo clientAppInfo[0].value = SQL_CONNECT_1; clientAppInfo[1].value = SQL_RULES_DB2; clientAppInfo[2].value = SQL_DISCONNECT_EXPL; clientAppInfo[3].value = SQL_SYNC_TWOPHASE; clientAppInfo[4].value = 1; clientAppInfo[5].value = SQL_DEFERRED_PREPARE_NO; clientAppInfo[6].value = 1; clientAppInfo[7].value = 1; cout << " Get the Client Connection Attributes." << endl; // query client sqleqryc(&clientAppInfo[0], 8, &sqlca); DB2_API_CHECK("Client Conn. Attrs. -- get"); cout << " The Client Connection Attributes are:" << endl; switch (clientAppInfo[0].value) { case SQL_CONNECT_1: cout << " SQL_CONNECT_TYPE = SQL_CONNECT_1"; cout << endl; break; case SQL_CONNECT_2: cout << " SQL_CONNECT_TYPE = SQL_CONNECT_2"; cout << endl; break; default: break; } switch (clientAppInfo[1].value) { case SQL_RULES_DB2: cout << " SQL_RULES = SQL_RULES_DB2"; cout << endl; break; case SQL_RULES_STD: cout << " SQL_RULES = SQL_RULES_STD"; cout << endl; break; default: break; } switch (clientAppInfo[2].value) { case SQL_DISCONNECT_EXPL: cout << " SQL_DISCONNECT = SQL_DISCONNECT_EXPL"; cout << endl; break; case SQL_DISCONNECT_COND: cout << " SQL_DISCONNECT = SQL_DISCONNECT_COND"; cout << endl; break; case SQL_DISCONNECT_AUTO: cout << " SQL_DISCONNECT = SQL_DISCONNECT_EXPL"; cout << endl; break; default: break; } switch (clientAppInfo[3].value) { case SQL_SYNC_TWOPHASE: cout << " SQL_SYNCPOINT = SQL_SYNC_TWOPHASE" << endl; break; case SQL_SYNC_ONEPHASE: cout << " SQL_SYNCPOINT = SQL_SYNC_ONEPHASE" << endl; break; case SQL_SYNC_NONE: cout << " SQL_SYNCPOINT = SQL_SYNC_NONE" << endl; break; default: break; } cout << " SQL_MAX_NETBIOS_CONNECTIONS = " << clientAppInfo[4].value << endl; switch (clientAppInfo[5].value) { case SQL_DEFERRED_PREPARE_NO: cout << " SQL_DEFERRED_PREPARE = SQL_DEFERRED_PREPARE_NO" << endl; break; case SQL_DEFERRED_PREPARE_YES: cout << " SQL_DEFERRED_PREPARE = SQL_DEFERRED_PREPARE_YES" << endl; break; case SQL_DEFERRED_PREPARE_ALL: cout << " SQL_DEFERRED_PREPARE = SQL_DEFERRED_PREPARE_ALL" << endl; break; default: break; } cout << " SQL_CONNECT_NODE = " << clientAppInfo[6].value << endl; cout << " SQL_ATTACH_NODE = " << clientAppInfo[7].value << endl; return 0; } //ApInfo::ClientConnectionAttrsSetGet int main(int argc, char *argv[]) { int rc = 0; ApInfo info; // check command line arguments if (argc != 1) { cout << "\nUSAGE: " << argv[0] << endl; return 1; } cout << "\nHOW TO SET AND GET INFOMATION AT THE CLIENT LEVEL." << endl; rc = info.ClientAppNameSetGet(); rc = info.ClientUseridSetGet(); rc = info.ClientWorkstationSetGet(); rc = info.ClientSuffixForAccountingStringSetGet(); rc = info.ClientConnectionAttrsSetGet(); return 0; } //main