/****************************************************************************
** (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: ininfo.C
**
** SAMPLE: Set and get information at the instance level
**
** DB2 APIs USED:
** db2CfgGet -- GET CONFIGURATION
** db2CfgSet -- SET CONFIGURATION
** sqlecadb -- CATALOG DATABASE
** sqlectnd -- CATALOG NODE
** sqledcgd -- CHANGE DATABASE COMMENT
** db2DbDirCloseScan -- CLOSE DATABASE DIRECTORY SCAN
** db2DbDirGetNextEntry -- GET NEXT DATABASE DIRECTORY ENTRY
** db2DbDirOpenScan -- OPEN DATABASE DIRECTORY SCAN
** sqlegdad -- ADD DCS DIRECTORY ENTRY
** sqlegdcl -- CLOSE DCS DIRECTORY SCAN
** sqlegdel -- DELETE DCS DIRECTORY ENTRY
** sqlegdge -- GET DCS DIRECTORY ENTRY
** sqlegdgt -- GET DCS DIRECTORY ENTRIES
** sqlegdsc -- OPEN DCS DIRECTORY SCAN
** sqlegins -- GET INSTANCE
** sqlencls -- CLOSE NODE DIRECTORY SCAN
** sqlengne -- GET NEXT NODE DIRECTORY ENTRY
** sqlenops -- OPEN NODE DIRECTORY SCAN
** sqlesdeg -- SET RUNTIME DEGREE
** sqleuncn -- UNCATALOG NODE
** sqleuncd -- UNCATALOG DATABASE
**
** STRUCTURES USED:
** sql_dir_entry
** sqle_node_struct
** sqle_node_tcpip
** sqlca
** sqledinfo
** sqleninfo
**
**
*****************************************************************************
**
** For more information on the sample programs, see the README file.
**
** For information on developing embedded SQL applications see the Developing Embedded SQL Applications book.
**
** For 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 at
** http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp
****************************************************************************/
#include <string.h>
#include <stdlib.h>
#include <sqlutil.h>
#include <db2ApiDf.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 InInfo
{
public:
int CurrentLocalInstanceNameGet();
int CurrentLocalNodeDirInfoSetGet();
int CurrentLocalDatabaseDirInfoSetGet();
int CurrentLocalDCSDirInfoSetGet();
// support functions
int LocalOrRemoteDbmConfigSave(db2Cfg);
int LocalOrRemoteDbmConfigRestore(db2Cfg);
int LocalOrRemoteDbmConfigSetGet();
int LocalOrRemoteDbmConfigDefaultsSetGet();
int LocalOrRemoteRunTimeDegreeSet();
private:
// helper functions
void strnout(char *, int);
};
int InInfo::CurrentLocalInstanceNameGet()
{
struct sqlca sqlca;
char currentLocalInstanceName[SQL_INSTNAME_SZ + 1];
cout << "\n-----------------------------------------------------------";
cout << "\nUSE THE DB2 API:" << endl;
cout << " sqlegins -- GET INSTANCE" << endl;
cout << "TO GET THE CURRENT LOCAL INSTANCE NAME:" << endl;
// get local instance
sqlegins(currentLocalInstanceName, &sqlca);
DB2_API_CHECK("CurrentLocalInstanceName -- Get");
cout << "\n The current local instance name is: ";
strnout(currentLocalInstanceName, SQL_INSTNAME_SZ);
return 0;
} //InInfo::CurrentLocalInstanceNameGet
int InInfo::CurrentLocalNodeDirInfoSetGet()
{
struct sqlca sqlca;
struct sqle_node_struct newNode;
struct sqle_node_tcpip TCPIPprotocol;
unsigned short nodeDirHandle, nodeEntryNb, nbNodeEntries = 0;
struct sqleninfo *nodeEntry;
cout << "\n-----------------------------------------------------------";
cout << "\nUSE THE DB2 APIs:" << endl;
cout << " sqlectnd -- CATALOG NODE" << endl;
cout << " sqlenops -- OPEN NODE DIRECTORY SCAN" << endl;
cout << " sqlengne -- GET NEXT NODE DIRECTORY ENTRY" << endl;
cout << " sqlencls -- CLOSE NODE DIRECTORY SCAN" << endl;
cout << " sqleuncn -- UNCATALOG NODE" << endl;
cout << "TO SET/GET THE LOCAL NODE DIRECTORY INFO.:" << endl;
// --------------- catalog the new node ----------------------------
strncpy(newNode.nodename, "newnode", SQL_NNAME_SZ + 1);
strncpy(newNode.comment, "example of node comment", SQL_CMT_SZ + 1);
newNode.struct_id = SQL_NODE_STR_ID;
newNode.protocol = SQL_PROTOCOL_TCPIP;
strncpy(TCPIPprotocol.hostname, "hostname", SQL_HOSTNAME_SZ + 1);
strncpy(TCPIPprotocol.service_name,
"servicename",
SQL_SERVICE_NAME_SZ + 1);
cout << "\n Catalog the new node." << endl;
cout << "\n node name : " << newNode.nodename << endl;
cout << " comment : " << newNode.comment << endl;
cout << " structure identifier : SQL_NODE_STR_ID" << endl;
cout << " protocol : SQL_PROTOCOL_TCPIP" << endl;
cout << " hostname : " << TCPIPprotocol.hostname << endl;
cout << " service name : " << TCPIPprotocol.service_name
<< endl;
// catalog the node
sqlectnd(&newNode, &TCPIPprotocol, &sqlca);
DB2_API_CHECK("New Node -- Catalog");
// ------------- read the node directory ---------------------------
cout << "\n Open the node directory." << endl;
// open node directory scan
sqlenops(&nodeDirHandle, &nbNodeEntries, &sqlca);
DB2_API_CHECK("Node Directory -- Open");
// read the node entries
cout << "\n Read the node directory." << endl;
for (nodeEntryNb = 0; nodeEntryNb < nbNodeEntries; nodeEntryNb++)
{
// get next node directory entry
sqlengne(nodeDirHandle, &nodeEntry, &sqlca);
DB2_API_CHECK("Node Directory -- Read");
// print out the node information on to the screen
cout << "\n node name : ";
strnout(nodeEntry->nodename, 8);
cout << " node comment : ";
strnout(nodeEntry->comment, 30);
cout << " node host name : ";
strnout(nodeEntry->hostname, 30);
cout << " node service name : ";
strnout(nodeEntry->service_name, 14);
switch (nodeEntry->protocol)
{
case SQL_PROTOCOL_LOCAL:
cout << " node protocol : LOCAL" << endl;
break;
case SQL_PROTOCOL_NPIPE:
cout << " node protocol : NPIPE" << endl;
break;
case SQL_PROTOCOL_SOCKS:
cout << " node protocol : SOCKS" << endl;
break;
case SQL_PROTOCOL_SOCKS4:
cout << " node protocol : SOCKS4" << endl;
break;
case SQL_PROTOCOL_TCPIP:
cout << " node protocol : TCP/IP" << endl;
break;
case SQL_PROTOCOL_TCPIP4:
cout << " node protocol : TCP/IPv4" << endl;
break;
case SQL_PROTOCOL_TCPIP6:
cout << " node protocol : TCP/IPv6" << endl;
break;
default:
cout << " node protocol : " << endl;
break;
} //switch
} //for
// close node directory scan
sqlencls(nodeDirHandle, &sqlca);
DB2_API_CHECK("Node Directory -- Close");
// ------------- uncatalog the new node ----------------------------
cout << "\n Uncatalog the node: " << newNode.nodename << endl;
// uncatalog a node
sqleuncn(newNode.nodename, &sqlca);
DB2_API_CHECK("New Node -- Uncatalog");
return 0;
} //InInfo::CurrentLocalNodeDirInfoSetGet
int InInfo::CurrentLocalDatabaseDirInfoSetGet()
{
struct sqlca sqlca;
db2DbDirOpenScanStruct dbDirOpenParmStruct;
db2DbDirCloseScanStruct dbDirCloseParmStruct;
struct db2DbDirNextEntryStructV9 dbDirNextEntryParmStruct;
struct db2DbDirInfoV9 *dbEntry = NULL;
char dbName[] = "db_name";
char dbAlias[] = "db_alias";
unsigned char dbType = SQL_REMOTE;
char nodeName[] = "nodename";
char *dbPath = NULL;
char dbComment[] = "example of database comment";
unsigned short dbAuthentication = SQL_AUTHENTICATION_SERVER;
char *dbDirPath = NULL;
db2Uint16 dbDirHandle = 0;
db2Uint16 dbEntryNb = 0;
char changedDbComment[] = "the changed db comment";
db2Uint32 versionNumber = db2Version970;
cout << "\n-----------------------------------------------------------";
cout << "\nUSE THE DB2 APIs:" << endl;
cout << " sqlecadb -- CATALOG DATABASE" << endl;
cout << " db2DbDirOpenScan -- OPEN DATABASE DIRECTORY SCAN" << endl;
cout << " db2DbDirGetNextEntry -- GET NEXT DATABASE DIRECTORY ENTRY" << endl;
cout << " sqledcgd -- CHANGE DATABASE COMMENT" << endl;
cout << " db2DbDirCloseScan -- CLOSE DATABASE DIRECTORY SCAN" << endl;
cout << " sqleuncd -- UNCATALOG DATABASE" << endl;
cout << "TO SET/GET THE LOCAL DATABASE DIRECTORY INFO.:" << endl;
// --------------- catalog the new database ------------------------
cout << "\n Catalog the new database." << endl;
cout << "\n database name : " << dbName << endl;
cout << " database alias : " << dbAlias << endl;
cout << " type : SQL_REMOTE" << endl;
cout << " node name : " << nodeName << endl;
cout << " path : NULL" << endl;
cout << " comment : " << dbComment << endl;
cout << " authentication : SQL_AUTHENTICATION_SERVER" << endl;
// catalog database
sqlecadb(dbName,
dbAlias,
dbType,
nodeName,
dbPath,
dbComment,
dbAuthentication,
NULL,
&sqlca);
// ignore warning SQL1100W = node not cataloged,
// don't do the same in your code
if (sqlca.sqlcode != 1100)
{
DB2_API_CHECK("Database -- Catalog");
}
// ------------- read the database directory -----------------------
cout << "\n Open the database directory." << endl;
// open database directory scan
dbDirOpenParmStruct.piPath = dbDirPath;
dbDirOpenParmStruct.oHandle = dbDirHandle;
db2DbDirOpenScan(versionNumber,
&dbDirOpenParmStruct,
&sqlca);
DB2_API_CHECK("Database Directory -- Open");
// read the database entries
cout << "\n Read the database directory." << endl;
dbDirNextEntryParmStruct.iHandle = dbDirHandle;
dbDirNextEntryParmStruct.poDbDirEntry = dbEntry;
for (dbEntryNb = 1; dbEntryNb <= dbDirOpenParmStruct.oNumEntries; dbEntryNb++)
{
// get next database directory entry
db2DbDirGetNextEntry(versionNumber,
&dbDirNextEntryParmStruct,
&sqlca);
DB2_API_CHECK("Database Directory -- Read");
dbEntry = dbDirNextEntryParmStruct.poDbDirEntry;
// print out the database information on to the screen
cout << "\n database alias : ";
strnout(dbEntry->alias, 8);
cout << " database name : ";
strnout(dbEntry->dbname, 8);
#if (defined(DB2NT))
cout << " database drive : ";
strnout(dbEntry->drive, 12);
#else //UNIX
cout << " database drive : ";
strnout(dbEntry->drive, 215);
#endif
cout << " database subdirectory: ";
strnout(dbEntry->intname, 8);
cout << " node name : ";
strnout(dbEntry->nodename, 8);
cout << " database release type: ";
strnout(dbEntry->dbtype, 20);
cout << " database comment : ";
strnout(dbEntry->comment, 30);
switch (dbEntry->type)
{
case SQL_INDIRECT:
cout << " database entry type : indirect" << endl;
break;
case SQL_REMOTE:
cout << " database entry type : remote" << endl;
break;
case SQL_HOME:
cout << " database entry type : home" << endl;
break;
case SQL_DCE:
cout << " database entry type : dce" << endl;
break;
default:
break;
}
switch (dbEntry->authentication)
{
case SQL_AUTHENTICATION_SERVER:
cout << " authentication : SERVER" << endl;
break;
case SQL_AUTHENTICATION_CLIENT:
cout << " authentication : CLIENT" << endl;
break;
case SQL_AUTHENTICATION_DCS:
cout << " authentication : DCS" << endl;
break;
default:
break;
} //switch
} //for
// change the database comment for the new database
cout << "\n Change the new database comment to:" << endl;
cout << " " << changedDbComment << endl;
// change database comment
sqledcgd(dbAlias, "", changedDbComment, &sqlca);
DB2_API_CHECK("Database Comment -- Change");
// close database directory scan
dbDirCloseParmStruct.iHandle = dbDirHandle;
db2DbDirCloseScan(versionNumber,
&dbDirCloseParmStruct,
&sqlca);
DB2_API_CHECK("Database Directory -- Close");
// ------------- uncatalog the new database ------------------------
cout << "\n Uncatalog the database cataloged as: " << dbAlias << endl;
// uncatalog the database
sqleuncd(dbAlias, &sqlca);
DB2_API_CHECK("Database -- Uncatalog");
return 0;
} //InInfo::CurrentLocalDatabaseDirInfoSetGet
int InInfo::CurrentLocalDCSDirInfoSetGet()
{
struct sqlca sqlca;
struct sql_dir_entry newDcsDbEntry;
struct sql_dir_entry dcsDbEntry;
short dcsDbEntryNb, nbDcsDbEntries = 0;
struct sql_dir_entry *pAllDcsDbEntries;
cout << "\n-----------------------------------------------------------";
cout << "\nUSE THE DB2 APIs:" << endl;
cout << " sqlegdad -- ADD DCS DIRECTORY ENTRY" << endl;
cout << " sqlegdsc -- OPEN DCS DIRECTORY SCAN" << endl;
cout << " sqlegdge -- GET DCS DIRECTORY ENTRY" << endl;
cout << " sqlegdgt -- GET DCS DIRECTORY ENTRIES" << endl;
cout << " sqlegdcl -- CLOSE DCS DIRECTORY SCAN" << endl;
cout << " sqlegdel -- DELETE DCS DIRECTORY ENTRY" << endl;
cout << "TO SET/GET THE LOCAL DCS DIRECTORY INFO.:" << endl;
// --------------- catalog the new DCS database --------------------
strcpy(newDcsDbEntry.ldb, "dcsAlias");
strcpy(newDcsDbEntry.tdb, "dcsDbName");
strcpy(newDcsDbEntry.comment, "dcsDb comment");
strcpy(newDcsDbEntry.ar, "appName");
strcpy(newDcsDbEntry.parm, "");
newDcsDbEntry.struct_id = SQL_DCS_STR_ID;
cout << "\n Catalog the new DCS database." << endl;
cout << "\n intermediate alias : " << newDcsDbEntry.ldb << endl;
cout << " name : " << newDcsDbEntry.tdb << endl;
cout << " comment : " << newDcsDbEntry.comment << endl;
cout << " client app. name : " << newDcsDbEntry.ar << endl;
// catalog DCS database
sqlegdad(&newDcsDbEntry, &sqlca);
DB2_API_CHECK("New DCS Database -- Catalog");
// ------------- read the DCS database directory -------------------
cout << "\n Open the DCS database directory." << endl;
// open DCS database directory
sqlegdsc(&nbDcsDbEntries, &sqlca);
DB2_API_CHECK("DCS Database Directory -- Open");
// read a specific entry from the DCS database directory
strcpy(dcsDbEntry.ldb, "dcsAlias");
strcpy(dcsDbEntry.tdb, "");
strcpy(dcsDbEntry.comment, "");
strcpy(dcsDbEntry.ar, "");
strcpy(dcsDbEntry.parm, "");
dcsDbEntry.struct_id = SQL_DCS_STR_ID;
cout << "\n Read the entry for the DCS database: "
<< dcsDbEntry.ldb << endl;
// get DCS directory entry for database
sqlegdge(&dcsDbEntry, &sqlca);
DB2_API_CHECK("DCS database entry -- read");
cout << "\n intermediate alias : ";
strnout(dcsDbEntry.ldb, 8);
cout << " name : ";
strnout(dcsDbEntry.tdb, 18);
cout << " comment : ";
strnout(dcsDbEntry.comment, 30);
cout << " client app. name : ";
strnout(dcsDbEntry.ar, 32);
cout << " DCS parameters : ";
strnout(dcsDbEntry.parm, 48);
cout << " DCS release level : 0x"
<< hex << dcsDbEntry.release << endl;
if (nbDcsDbEntries > 0)
{
pAllDcsDbEntries = new sql_dir_entry[nbDcsDbEntries];
cout << "\n Read the DCS database directory." << endl;
// get DCS database directory entries
sqlegdgt(&nbDcsDbEntries, pAllDcsDbEntries, &sqlca);
DB2_API_CHECK("DCS Database Directory -- Read");
// print the DCS database entries
for (dcsDbEntryNb = 0; dcsDbEntryNb < nbDcsDbEntries; dcsDbEntryNb++)
{
cout << "\n intermediate alias : ";
strnout(pAllDcsDbEntries[dcsDbEntryNb].ldb, 8);
cout << " name : ";
strnout(pAllDcsDbEntries[dcsDbEntryNb].tdb, 18);
cout << " comment : ";
strnout(pAllDcsDbEntries[dcsDbEntryNb].comment, 30);
cout << " client app. name : ";
strnout(pAllDcsDbEntries[dcsDbEntryNb].ar, 32);
cout << " DCS parameters : ";
strnout(pAllDcsDbEntries[dcsDbEntryNb].parm, 48);
cout << " DCS release level : 0x"
<< hex << pAllDcsDbEntries[dcsDbEntryNb].release << endl;
} //for
}
delete pAllDcsDbEntries;
// close DCS directory scan
sqlegdcl(&sqlca);
DB2_API_CHECK("DCS Directory -- Close");
// ------------- uncatalog the new DCS database --------------------
strcpy(newDcsDbEntry.ldb, "dcsAlias");
strcpy(newDcsDbEntry.tdb, "");
strcpy(newDcsDbEntry.comment, "");
strcpy(newDcsDbEntry.ar, "");
strcpy(newDcsDbEntry.parm, "");
newDcsDbEntry.struct_id = SQL_DCS_STR_ID;
cout << "\n Uncatalog the DCS database: " << newDcsDbEntry.ldb << endl;
// uncatalog DCS database
sqlegdel(&newDcsDbEntry, &sqlca);
DB2_API_CHECK("New DCS database -- Uncatalog");
return 0;
} //InInfo::CurrentLocalDCSDirInfoSetGet
int InInfo::LocalOrRemoteDbmConfigSave(db2Cfg cfgStruct)
{
struct sqlca sqlca;
// initialize paramArray
cfgStruct.paramArray[0].flags = 0;
cfgStruct.paramArray[0].token = SQLF_KTN_DFT_ACCOUNT_STR;
cfgStruct.paramArray[0].ptrvalue = new char[SQL_ACCOUNT_STR_SZ + 1];
cfgStruct.paramArray[1].flags = 0;
cfgStruct.paramArray[1].token = SQLF_KTN_UDF_MEM_SZ;
cfgStruct.paramArray[1].ptrvalue = (char *)new unsigned short;
cout << "\n******* SAVE DATABASE MANAGER CONFIGURATION **********" << endl;
// get database manager configuration
db2CfgGet(db2Version970, (void *)&cfgStruct, &sqlca);
DB2_API_CHECK("DBM Config. -- Save");
return 0;
} //InInfo::LocalOrRemoteDbmConfigSave
int InInfo::
LocalOrRemoteDbmConfigRestore(db2Cfg cfgStruct)
{
struct sqlca sqlca;
cout << "\n****** RESTORE DATABASE MANAGER CONFIGURATION ******" << endl;
// update database manager configuration
db2CfgSet(db2Version970, (void *)&cfgStruct, &sqlca);
DB2_API_CHECK("DBM Config. -- Restore");
delete [] cfgStruct.paramArray[0].ptrvalue;
delete [] cfgStruct.paramArray[1].ptrvalue;
return 0;
} //InInfo::LocalOrRemoteDbmConfigRestore
int InInfo::LocalOrRemoteDbmConfigSetGet()
{
struct sqlca sqlca;
db2CfgParam cfgParameters[2];
db2Cfg cfgStruct;
cout << "\n-----------------------------------------------------------";
cout << "\nUSE THE DB2 APIs:" << endl;
cout << " db2CfgSet -- SET CONFIGURATION" << endl;
cout << " db2CfgGet -- GET CONFIGURATION" << endl;
cout << "TO SET/GET DATABASE MANAGER CONFIGURATION PARAMETERS:" << endl;
// initialize cfgParameters
cfgParameters[0].flags = 0;
cfgParameters[0].token = SQLF_KTN_DFT_ACCOUNT_STR;
cfgParameters[0].ptrvalue = new char[SQL_ACCOUNT_STR_SZ + 1];
cfgParameters[1].flags = 0;
cfgParameters[1].token = SQLF_KTN_UDF_MEM_SZ;
cfgParameters[1].ptrvalue = (char *)new unsigned short;
// set two Database Configuration parameters
strcpy(cfgParameters[0].ptrvalue, "accounting string suffix");
*(unsigned short *)(cfgParameters[1].ptrvalue) = 512;
cout << "\n Set the Database Manager Configuration parameters:" << endl;
cout << " dft_account_str = " << cfgParameters[0].ptrvalue << endl;
cout << " udf_mem_sz = " << dec
<< *(unsigned short *)(cfgParameters[1].ptrvalue) << endl;
// initialize cfgStruct
cfgStruct.numItems = 2;
cfgStruct.paramArray = cfgParameters;
cfgStruct.flags = db2CfgDatabaseManager | db2CfgDelayed;
cfgStruct.dbname = NULL;
// set database manager configuration
db2CfgSet(db2Version970, (void *)&cfgStruct, &sqlca);
DB2_API_CHECK("DBM Config. -- Set");
// get two DBM Config. fields
strcpy(cfgParameters[0].ptrvalue, "");
*(unsigned short *)(cfgParameters[1].ptrvalue) = 0;
cout << "\n Get two Database Manager Configuration parameters:" << endl;
// get database manager configuration
db2CfgGet(db2Version970, (void *)&cfgStruct, &sqlca);
DB2_API_CHECK("DBM Config. -- Get");
cout << " dft_account_str = " << cfgParameters[0].ptrvalue << endl;
cout << " udf_mem_sz = "
<< *(unsigned short *)(cfgParameters[1].ptrvalue) << endl;
// free the memory allocated
delete [] cfgParameters[0].ptrvalue;
delete [] cfgParameters[1].ptrvalue;
return 0;
} //InInfo::LocalOrRemoteDbmConfigSetGet
int InInfo::LocalOrRemoteDbmConfigDefaultsSetGet()
{
struct sqlca sqlca;
db2CfgParam cfgParameters[2];
db2Cfg cfgStruct;
char input;
cout << "\n-----------------------------------------------------------";
cout << "\nUSE THE DB2 APIs:" << endl;
cout << " db2CfgSet -- SET CONFIGURATION" << endl;
cout << " db2CfgGet -- GET CONFIGURATION" << endl;
cout << "TO SET/GET DATABASE MANAGER CONFIGURATION DEFAULTS:" << endl;
// initialize cfgParameters
cfgParameters[0].flags = 0;
cfgParameters[0].token = SQLF_KTN_DFT_ACCOUNT_STR;
cfgParameters[0].ptrvalue = new char[SQL_ACCOUNT_STR_SZ + 1];
cfgParameters[1].flags = 0;
cfgParameters[1].token = SQLF_KTN_UDF_MEM_SZ;
cfgParameters[1].ptrvalue = (char *)new unsigned short;
// get two DBM Config. defaults
strcpy(cfgParameters[0].ptrvalue, "");
*(unsigned short *)(cfgParameters[1].ptrvalue) = 0;
// initialize cfgStruct
cfgStruct.numItems = 2;
cfgStruct.paramArray = cfgParameters;
cfgStruct.flags = db2CfgDatabaseManager | db2CfgGetDefaults;
cfgStruct.dbname = NULL;
cout << "\n Get two Database Manager Configuration defaults:" << endl;
// get database manager configuration defaults
db2CfgGet(db2Version970, (void *)&cfgStruct, &sqlca);
DB2_API_CHECK("DBM Config. Defaults -- Get");
cout << " dft_account_str = " << cfgParameters[0].ptrvalue << endl;
cout << " udf_mem_sz = "
<< *(unsigned short *)(cfgParameters[1].ptrvalue) << endl;
/* warning for reset of DBM Congif. */
cout << endl;
cout << " Warning: We are now about to set all Database Manager\n"
" Configuration parameters to default using the API, db2CfgSet.\n"
" After running this API, some of the non-default user\n"
" settings and those set by the installation program will\n"
" be changed accordingly and will not be restored by\n"
" this program. A text file, dbmcfg.TXT, will be generated\n"
" in the current directory for all the settings before\n"
" execution of this API. The user is required to restore the\n"
" settings manually.\n";
cout << endl;
cout << " Would you like to run this API?(y/n) ";
// get user input
cin >> input;
if (input == 'y')
{
// save DBM Config. to a text file
system("db2 get dbm cfg >dbmcfg.TXT");
// set all DBM Config. defaults
cout << "\n Set all Database manager Configuration parameters";
cout << " to default." << endl;
// initialize cfgStruct
cfgStruct.numItems = 0;
cfgStruct.paramArray = NULL;
cfgStruct.flags = db2CfgDatabaseManager | db2CfgReset | db2CfgDelayed;
cfgStruct.dbname = NULL;
// reset database manager configuration
db2CfgSet(db2Version970, (void *)&cfgStruct, &sqlca);
DB2_API_CHECK("DBM Config. defaults -- Set");
cout << "\n All Database Manager Configuration parameters";
cout << " are set to default." << endl;
}
// free the memory allocated
delete [] cfgParameters[0].ptrvalue;
delete [] cfgParameters[1].ptrvalue;
return 0;
} //InInfo::LocalOrRemoteDbmConfigDefaultsSetGet
int InInfo::LocalOrRemoteRunTimeDegreeSet()
{
struct sqlca sqlca;
sqlint32 runTimeDegree;
cout << "\n-----------------------------------------------------------";
cout << "\nUSE THE DB2 API:" << endl;
cout << " sqlesdeg -- SET RUNTIME DEGREE" << endl;
cout << "TO SET THE RUN TIME DEGREE:" << endl;
// set the run time degree
runTimeDegree = 4;
cout << "\n Set the run time degree to the value: "
<< runTimeDegree << endl;
// set runtime degree
sqlesdeg(SQL_ALL_USERS, NULL, runTimeDegree, &sqlca);
DB2_API_CHECK("Run Time Degree -- Set");
return 0;
} //InInfo::LocalOrRemoteRunTimeDegreeSet
void InInfo::strnout(char *str, int n)
{
for (int i = 0; (i < n) && (str[i] != '\0'); cout << str[i++]);
cout << endl;
return;
} //InInfo::strnout
int main(int argc, char *argv[])
{
int rc = 0;
CmdLineArgs check;
InInfo info;
Instance inst;
db2CfgParam cfgParameters[2]; // to save the DBM Config.
db2Cfg cfgStruct;
// initialize cfgStruct
cfgStruct.numItems = 2;
cfgStruct.paramArray = cfgParameters;
cfgStruct.flags = db2CfgDatabaseManager | db2CfgDelayed;
cfgStruct.dbname = NULL;
// check the command line arguments
rc = check.CmdLineArgsCheck2(argc, argv, inst);
if (rc != 0)
{
return rc;
}
cout << "\nTHIS SAMPLE SHOWS HOW TO SET/GET INFO AT INSTANCE LEVEL."
<< endl;
// set/get info for the local instance that has as name
// the value of the environment variable DB2INSTANCE
rc = info.CurrentLocalInstanceNameGet();
rc = info.CurrentLocalNodeDirInfoSetGet();
rc = info.CurrentLocalDatabaseDirInfoSetGet();
rc = info.CurrentLocalDCSDirInfoSetGet();
// attach to a local or remote instance
rc = inst.Attach();
if (rc != 0)
{
return rc;
}
// save DBM Config.
rc = info.LocalOrRemoteDbmConfigSave(cfgStruct);
if (rc != 0)
{
return rc;
}
// work with DBM Config.
rc = info.LocalOrRemoteDbmConfigSetGet();
// restore DBM Config.
rc = info.LocalOrRemoteDbmConfigRestore(cfgStruct);
// work with DBM Config.
rc = info.LocalOrRemoteDbmConfigDefaultsSetGet();
// set the run time degree
rc = info.LocalOrRemoteRunTimeDegreeSet();
// detach from the local or remote instance
rc = inst.Detach();
if (rc != 0)
{
return rc;
}
return 0;
} //main