/****************************************************************************

** (c) 版权所有 IBM Corp. 2007 保留所有权利。

** 

** 以下源代码示例("示例")属于国际 

** 商业机器公司或其子公司之一(" IBM "),并且是 

** 有版权和许可证,不得出售。 您可以使用、复制、修改和 

** 在不向 IBM 付费的情况下,以任何形式分发样品,目的是 

** 协助您开发应用程序。

** 

** 示例代码是在 "原样 "的基础上提供给您的,不对以下方面作出保证 

** 任何一种。 IBM 在此,本公司明确声明不作任何保证,无论是明示的还是 

** 默示保证,包括但不限于以下默示保证 

** 适销性和特定用途的适用性。 一些辖区确实 

** 不允许排除或限制默示保证,因此上述 

** 限制或排除条款可能不适用于您。 IBM SHALL NOT BE LIABLE FOR 

** 您因使用、复制、修改或执行以下行为而遭受的任何损失 

** 分发样品,即使 IBM 已被告知可能出现以下情况 

** 此类损害赔偿。

*****************************************************************************

**

** 源文件名称: ininfo.C

**

** 示例:在实例级别设置和获取信息

**

** DB2 使用的应用程序接口:

** db2CfgGet -- 获取配置

** db2CfgSet -- 设置配置

** sqlecadb -- 目录数据库

** sqlectnd -- 目录节点

** sqledcgd -- 更改数据库注释

** db2DbDirCloseScan -- 关闭数据库目录扫描

** db2DbDirGetNextEntry -- 获取下一个数据库目录条目

** db2DbDirOpenScan -- 打开数据库目录扫描

** sqlegdad -- ADD DCS DIRECTORY ENTRY

** sqlegdcl -- 关闭 DCS 目录扫描

** sqlegdel -- 删除 DCS 目录项

** sqlegdge -- GET DCS DIRECTORY ENTRY

** sqlegdgt -- 获取 DCS 目录条目

** sqlegdsc -- 打开 DCS 目录扫描

** sqlegins -- GET INSTANCE

** sqlencls -- 关闭节点目录扫描

** sqlengne -- GET NEXT NODE DIRECTORY ENTRY

** sqlenops -- 打开节点目录扫描

** sqlesdeg -- 设置运行时间度数

** sqleuncn -- UNCATALOG NODE

** sqleuncd -- UNCATALOG DATABASE

**

** 使用的结构:

** sql_dir_entry

** sqle_node_struct

** sqle_node_tcpip

** sqlca

** sqledinfo

** sqleninfo

**

**                           

*****************************************************************************

**

** 有关示例程序的更多信息,请参阅 README 文件。

**

** 有关开发嵌入式 SQL 应用程序的信息,请参阅《开发嵌入式 SQL 应用程序》一书。

**

** 有关 DB2 API 的信息,请参阅《管理 API 参考》。

**

** 有关编程、编译和运行的最新信息 DB2

** 申请请访问 DB2 信息中心,网址为

**       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 ) &&!定义了 DB2HP &&!定义了 DB2AIX )|| \

    ( DB2LINUX && ( __LP64__ || (__gnuc__ >= 3)) ) )

   #include <iostream>

   using namespace std;

#else

   #include < iostream.h >

#endif



类 InInfo

{

  public:

    int CurrentLocalInstanceNameGet( );

    int CurrentLocalNodeDirInfoSetGet( );

    int CurrentLocalDatabaseDirInfoSetGet( );

    int CurrentLocalDCSDirInfoSetGet( );



    // 支持功能

    int LocalOrRemoteDbmConfigSave(db2Cfg );

    int LocalOrRemoteDbmConfigRestore(db2Cfg );



    int LocalOrRemoteDbmConfigSetGet( );

    int LocalOrRemoteDbmConfigDefaultsSetGet( );

    int LocalOrRemoteRunTimeDegreeSet( );



  private:

    // 辅助功能

    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;



  // 获取本地实例

  sqlegins( currentLocalInstanceName, &sqlca);

  DB2_API_CHECK("CurrentLocalInstanceName -- 获取");



  cout << "\n 当前本地实例名称是:";

  strnout( currentLocalInstanceName, SQL_INSTNAME_SZ);



  return 0;

} //InInfo::CurrentLocalInstanceNameGet



int InInfo::CurrentLocalNodeDirInfoSetGet( )

{

  struct sqlca sqlca;

  结构 sqle_node_struct newNode;

  struct sqle_node_tcpip TCPIPprotocol;

  无符号短 nodeDirHandle, nodeEntryNb, nbNodeEntries = 0;

  结构 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 -- 关闭节点目录扫描" << endl;

  cout << " sqleuncn -- UNCATALOG NODE" << endl;

  cout << "TO SET/GET THE LOCAL NODE DIRECTORY INFO.: " << endl;



  // --------------- 新节点编目 ----------------------------

  strncpy( newNode.nodename, "newnode", SQL_NNAME_SZ + 1);

  strncpy( newNode.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、

          "服务名称"、

          sql_service_name_sz + 1);



  cout << "\n 编目新节点。" << endl;

  cout << "\n 节点名称 : " << newNode.nodename << endl;

  cout << " comment : " << newNode.comment << endl;

  cout << " 结构标识符:SQL_NODE_STR_ID" << endl;

  cout << " 协议:SQL_PROTOCOL_TCPIP" << endl;

  cout << " hostname : " << TCPIPprotocol.hostname << endl;

  cout << " 服务名称 : " << TCPIPprotocol.service_name

       << endl;



  // 对节点进行编目

  sqlectnd( &newNode, &TCPIPprotocol, &sqlca);

  DB2_API_CHECK( "新节点 -- 目录");



  // ------------- 读取节点目录 ---------------------------

  cout << "\n Open the node directory." << endl;



  // 打开节点目录扫描

  sqlenops( &nodeDirHandle, &nbNodeEntries, &sqlca);

  DB2_API_CHECK( "节点目录 - 开放");



  // 读取节点条目

  cout << "\n Read the node directory." << endl;

  for ( nodeEntryNb = 0; nodeEntryNb < nbNodeEntries; nodeEntryNb++ )

  {

    // 获取下一个节点目录条目

    sqlengne( nodeDirHandle, &nodeEntry, &sqlca);

    DB2_API_CHECK( "节点目录 -- 读取");



    // 将节点信息打印到屏幕上

    cout << "\n 节点名称 : ";

    strnout( nodeEntry->nodename, 8);

    cout << " 节点注释 : ";

    strnout( nodeEntry->comment, 30);

    cout << " 节点主机名 : ";

    strnout( nodeEntry->hostname, 30);

    cout << " 节点服务名称 : ";

    strnout( nodeEntry->service_name, 14);



    开关 ( nodeEntry->protocol )

    {

      情况 SQL_PROTOCOL_LOCAL:

        cout << " 节点协议:LOCAL" << endl;

        break;

      案例 SQL_PROTOCOL_NPIPE:

        cout << " 节点协议:NPIPE" << endl;

        break;

      案例 SQL_PROTOCOL_SOCKS:

        cout << " 节点协议:SOCKS" << endl;

        break;

      个案 SQL_PROTOCOL_SOCKS4:

        cout << " 节点协议 : SOCKS4 " << endl;

        break;

      案例 SQL_PROTOCOL_TCPIP:

        cout << " 节点协议:TCP/IP" << endl;

        break;

      个案 SQL_PROTOCOL_TCPIP4:

        cout << " 节点协议 : TCP/IPv4 " << endl;

        break;

      个案 SQL_PROTOCOL_TCPIP6:

        cout << " 节点协议 : TCP/IPv6 " << endl;

        break;

      缺省值:

        cout << " 节点协议 : " << endl;

        break;

    }//切换

  }//为



  // 关闭节点目录扫描

  sqlencls( nodeDirHandle, &sqlca);

  DB2_API_CHECK( "节点目录 - 关闭");



  // ------------- 取消新节点的目录 ----------------------------

  cout << "\n Uncatalog the node:" << newNode.nodename << endl;



  // 取消节点目录

  sqleuncn( newNode.nodename, &sqlca);

  DB2_API_CHECK( "新节点 - 未编目");



  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[ ] = "数据库注释示例";

  unsigned short dbAuthentication = SQL_AUTHENTICATION_SERVER;

  char *dbDirPath = NULL;

  db2Uint16 dbDirHandle = 0;

  db2Uint16 dbEntryNb = 0;

  char changedDbComment[ ] = "已更改的数据库注释";

  db2Uint32 versionNumber = db2Version970;



  cout << "\n-----------------------------------------------------------";

  cout << ""\nUSE THE DB2 APIs:" << endl;

  cout << " sqlecadb -- 目录数据库" << endl;

  cout << " db2DbDirOpenScan -- OPEN DATABASE DIRECTORY SCAN" << endl;

  cout << " db2DbDirGetNextEntry -- GET NEXT DATABASE DIRECTORY ENTRY" << endl;

  cout << " sqledcgd -- 更改数据库注释 " << endl;

  cout << " db2DbDirCloseScan -- 关闭数据库目录扫描" << endl;

  cout << " sqleuncd -- UNCATALOG DATABASE" << endl;

  cout << "TO SET/GET THE LOCAL DATABASE DIRECTORY INFO.: " << endl;



  // --------------- 新数据库编目 ------------------------

  cout << "\n 编目新数据库。" << endl;

  cout << "\n 数据库名称 : " << dbName << endl;

  cout << " 数据库别名 : " << dbAlias << endl;

  cout << " type : SQL_REMOTE" << endl;

  cout << " 节点名称 : " << nodeName << endl;

  cout << " path : NULL" << endl;

  cout << " comment : " << dbComment << endl;

  cout << " 验证 : SQL_AUTHENTICATION_SERVER" << endl;



  // 目录数据库

  sqlecadb( dbName,

           dbAlias,

           dbType,

           nodeName,

           dbPath,

           dbComment,

           dbAuthentication,

           NULL,

           &sqlca);



  // 忽略警告 SQL1100W = 节点未编目、

  // 不要在你的代码中做同样的事情

  if ( sqlca.sqlcode!= 1100)

  {

    DB2_API_CHECK( "数据库 - 目录");

  }



  // ------------- 读取数据库目录 -----------------------

  cout << "\n Open the database directory." << endl;



  // 打开数据库目录扫描

  dbDirOpenParmStruct.piPath = dbDirPath;

  dbDirOpenParmStruct.oHandle = dbDirHandle;

  db2DbDirOpenScan(versionNumber,

                   &dbDirOpenParmStruct,

                   &sqlca);



  DB2_API_CHECK( "数据库目录 - 开放");



  // 读取数据库条目

  cout << "\n Read the database directory." << endl;

  dbDirNextEntryParmStruct.iHandle = dbDirHandle;

  dbDirNextEntryParmStruct.poDbDirEntry = dbEntry;

  for ( dbEntryNb = 1; dbEntryNb <= dbDirOpenParmStruct.oNumEntries; dbEntryNb++ )

  {

    // 获取下一个数据库目录条目

    db2DbDirGetNextEntry(versionNumber,

                         &dbDirNextEntryParmStruct,

                         &sqlca);



    DB2_API_CHECK( "数据库目录 -- 读取");



    dbEntry = dbDirNextEntryParmStruct.poDbDirEntry;



    // 将数据库信息打印到屏幕上

    cout << "\n 数据库别名 : ";

    strnout( dbEntry->alias, 8);

    cout << " 数据库名称 : ";

    strnout( dbEntry->dbname, 8);

#if (defined( DB2NT ))

    cout << " 数据库驱动器 : ";

    strnout( dbEntry->drive, 12);

#else //UNIX

    cout << " 数据库驱动器 : ";

    strnout( dbEntry->drive, 215);

#endif

    cout << " 数据库子目录:";

    strnout( dbEntry->intname, 8);

    cout << " 节点名称 : ";

    strnout( dbEntry->nodename, 8);

    cout << " 数据库发布类型:";

    strnout( dbEntry->dbtype, 20);

    cout << " 数据库注释 : ";

    strnout( dbEntry->comment, 30);



    开关 ( dbEntry->type )

    {

      案例 SQL_INDIRECT:

        cout << " 数据库条目类型:间接" << endl;

        break;

      案例 SQL_REMOTE:

        cout << " 数据库条目类型:远程" << endl;

        break;

      情况 SQL_HOME:

        cout << " 数据库条目类型:主页" << endl;

        break;

      案例 SQL_DCE:

        cout << " 数据库条目类型:dce" << endl;

        break;

      缺省值:

        break;

    }



    开关 ( dbEntry->authentication )

    {

      案例 SQL_AUTHENTICATION_SERVER:

        cout << " 验证 : SERVER" << endl;

        break;

      案例 SQL_AUTHENTICATION_CLIENT:

        cout << " 验证 : CLIENT" << endl;

        break;

      案例 SQL_AUTHENTICATION_DCS:

        cout << " 验证 : DCS" << endl;

        break;

      缺省值:

        break;

    }//切换

  }//为



  // 更改新数据库的数据库注释

  cout << "\n 将新数据库注释更改为:" << endl;

  cout << " " << changedDbComment << endl;



  // 更改数据库注释

  sqledcgd( dbAlias, "", changedDbComment, &sqlca);

  DB2_API_CHECK( "数据库评论 - 更改");



  // 关闭数据库目录扫描

  dbDirCloseParmStruct.iHandle = dbDirHandle;

  db2DbDirCloseScan(versionNumber,

                    &dbDirCloseParmStruct,

                    &sqlca);



  DB2_API_CHECK( "数据库目录 - 关闭");



  // ------------- 取消新数据库的编目 ------------------------

  cout << "\n Uncatalog the database cataloged as:" << dbAlias << endl;



  // 取消数据库编目

  sqleuncd( dbAlias, &sqlca);

  DB2_API_CHECK( "数据库 -- 非目录");



  return 0;

} //InInfo::CurrentLocalDatabaseDirInfoSetGet



int InInfo::CurrentLocalDCSDirInfoSetGet( )

{

  struct sqlca sqlca;

  struct sql_dir_entry newDcsDbEntry;

  struct sql_dir_entry dcsDbEntry;

  短 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 -- 关闭 DCS 目录扫描" << endl;

  cout << " sqlegdel -- DELETE DCS DIRECTORY ENTRY" << endl;

  cout << "TO SET/GET THE LOCAL DCS DIRECTORY INFO.: " << endl;



  // --------------- 编目新的 DCS 数据库 --------------------

  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 编录新的 DCS 数据库。" << endl;

  cout << "\n 中间别名 : " << newDcsDbEntry.ldb << endl;

  cout << " name : " << newDcsDbEntry.tdb << endl;

  cout << " comment : " << newDcsDbEntry.comment << endl;

  cout << " 客户端应用程序。 name : " << newDcsDbEntry.ar << endl;



  // 编目 DCS 数据库

  sqlegdad( &newDcsDbEntry, &sqlca);

  DB2_API_CHECK( "新的 DCS 数据库 -- 目录");



  // ------------- 读取 DCS 数据库目录 -------------------

  cout << "\n Open the DCS database directory." << endl;



  // 打开 DCS 数据库目录

  sqlegdsc( &nbDcsDbEntries, &sqlca);

  DB2_API_CHECK( "DCS数据库目录 -- 开放");



  // 从 DCS 数据库目录中读取特定条目

  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;



  // 获取数据库的 DCS 目录条目

  sqlegdge( &dcsDbEntry, &sqlca);

  DB2_API_CHECK( "DCS数据库条目--已读");



  cout << "\n 中间别名 : ";

  strnout( dcsDbEntry.ldb,8);

  cout << " name : ";

  strnout( dcsDbEntry.tdb, 18);

  cout << " comment : ";

  strnout( dcsDbEntry.comment, 30);

  cout << " 客户端应用程序。 名称:"......";

  strnout( dcsDbEntry.ar, 32);

  cout << " DCS 参数 : ";

  strnout( dcsDbEntry.parm, 48);

  cout << " DCS 发布级别 : 0x "

       << hex << dcsDbEntry.release << endl;



  if ( nbDcsDbEntries > 0)

  {

    pAllDcsDbEntries = new sql_dir_entry[ ]; nbDcsDbEntries



    cout << "\n Read the DCS database directory." << endl;



    // 获取 DCS 数据库目录条目

    sqlegdgt( &nbDcsDbEntries, pAllDcsDbEntries, &sqlca);

    DB2_API_CHECK( "DCS数据库目录--读取");



    // 打印 DCS 数据库条目

    for ( dcsDbEntryNb = 0; dcsDbEntryNb < nbDcsDbEntries; dcsDbEntryNb++ )

    {

      cout << "\n 中间别名 : ";

      strnout( pAllDcsDbEntries[dcsDbEntryNb ].ldb, 8);

      cout << " name : ";

      strnout( pAllDcsDbEntries[dcsDbEntryNb ].tdb, 18);

      cout << " comment : ";

      strnout( pAllDcsDbEntries[dcsDbEntryNb ].comment, 30);

      cout << " 客户端应用程序。 名称:"......";

      strnout( pAllDcsDbEntries[dcsDbEntryNb ].ar, 32);

      cout << " DCS 参数 : ";

      strnout( pAllDcsDbEntries[dcsDbEntryNb ].parm, 48);

      cout << " DCS 发布级别 : 0x "

           << hex << pAllDcsDbEntries[dcsDbEntryNb ].release << endl;

    }//为

  }

  删去 pAllDcsDbEntries;



  // 关闭 DCS 目录扫描

  sqlegdcl(&sqlca);

  DB2_API_CHECK( "DCS目录 - 关闭");



  // ------------- 取消新 DCS 数据库的编目 --------------------

  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;



  // 取消目录 DCS 数据库

  sqlegdel( &newDcsDbEntry, &sqlca);

  DB2_API_CHECK( "新的 DCS 数据库 -- Uncatalog");



  return 0;

} //InInfo::CurrentLocalDCSDirInfoSetGet



int InInfo::LocalOrRemoteDbmConfigSave(db2Cfg cfgStruct )

{

  struct sqlca sqlca;



  // 初始化 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;



  // 获取数据库管理器配置

  db2CfgGet(db2Version970, (void *)&cfgStruct, &sqlca);

  DB2_API_CHECK( "DBM配置。 -- 保存");



  return 0;

} //InInfo::LocalOrRemoteDbmConfigSave



int InInfo::

LocalOrRemoteDbmConfigRestore(db2Cfg cfgStruct)

{

  struct sqlca sqlca;



  cout << "\n****** RESTORE DATABASE MANAGER CONFIGURATION ******" << endl;



  // 更新数据库管理器配置

  db2CfgSet(db2Version970, (void *)&cfgStruct, &sqlca);

  DB2_API_CHECK( "DBM配置。 -- 还原");



  删除 [] cfgStruct.paramArray[0 ].ptrvalue;

  删除 [] 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 -- 设置配置" << endl;

  cout << " db2CfgGet -- GET CONFIGURATION" << endl;

  cout << "TO SET/GET DATABASE MANAGER CONFIGURATION PARAMETERS:" << endl;



  // 初始化 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;



  // 设置两个数据库配置参数

  strcpy( cfgParameters[0 ].ptrvalue,"会计字符串后缀");

  *(unsigned short *)( cfgParameters[1 ].ptrvalue) = 512;

  cout << "\n 设置数据库管理器配置参数:" << endl;

  cout << " dft_account_str = " << cfgParameters[0 ].ptrvalue << endl;

  cout << " udf_mem_sz = " << dec

       << *(unsigned short *)( cfgParameters[1 ].ptrvalue) << endl;



  // 初始化 cfgStruct

  cfgStruct.numItems = 2;

  cfgStruct.paramArray = cfgParameters;

  cfgStruct.flags = db2CfgDatabaseManager | db2CfgDelayed;

  cfgStruct.dbname = NULL;



  // 设置数据库管理器配置

  db2CfgSet(db2Version970, (void *)&cfgStruct, &sqlca);

  DB2_API_CHECK( "DBM配置。 -- 设置");



  // 获得两个 DBM 配置。 字段

  strcpy( cfgParameters[0 ].ptrvalue, "");

  *(unsigned short *)( cfgParameters[1 ].ptrvalue) = 0;



  cout << "\n Get two Database Manager Configuration parameters:" << endl;



  // 获取数据库管理器配置

  db2CfgGet(db2Version970, (void *)&cfgStruct, &sqlca);

  DB2_API_CHECK( "DBM 配置。 -- 获取");



  cout << " dft_account_str = " << cfgParameters[0 ].ptrvalue << endl;

  cout << " udf_mem_sz = "

       << *(unsigned short *)( cfgParameters[1 ].ptrvalue) << endl;



  // 释放已分配的内存

  删除 [] cfgParameters[0 ].ptrvalue;

  删除 [] 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 -- 设置配置" << endl;

  cout << " db2CfgGet -- GET CONFIGURATION" << endl;

  cout << "TO SET/GET DATABASE MANAGER CONFIGURATION DEFAULTS:" << endl;



  // 初始化 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;



  // 获得两个 DBM 配置。 缺省值

  strcpy( cfgParameters[0 ].ptrvalue, "");

  *(unsigned short *)( cfgParameters[1 ].ptrvalue) = 0;



  // 初始化 cfgStruct

  cfgStruct.numItems = 2;

  cfgStruct.paramArray = cfgParameters;

  cfgStruct.flags = db2CfgDatabaseManager | db2CfgGetDefaults;

  cfgStruct.dbname = NULL;



  cout << "\n Get two Database Manager Configuration defaults:" << endl;



  // 获取数据库管理器配置默认值

  db2CfgGet(db2Version970, (void *)&cfgStruct, &sqlca);

  DB2_API_CHECK( "DBM配置"。 默认值 -- 获取");



  cout << " dft_account_str = " << cfgParameters[0 ].ptrvalue << endl;

  cout << " udf_mem_sz = "

       << *(unsigned short *)( cfgParameters[1 ].ptrvalue) << endl;



  /* 重置 DBM 时发出警告 Congif. */

  cout << endl;

  cout << " 警告:We are now about to set all Database Manager\n"

          " 使用 API 默认配置参数, db2CfgSet.\n "

          " 运行此应用程序接口后,一些非默认用户/n"

          "设置和安装程序的设置"

          "将被相应更改,并且不会被恢复

          "这个计划。  将生成一个文本文件 dbmcfg.TXT "

          " 在当前目录下的所有设置 before\n"

          "执行该应用程序接口。  用户需要恢复"

          " 设置 manually.\n ";

  cout << endl;

  cout << " 您想运行此 API 吗?



  // 获取用户输入

  cin >> 输入;

  如果 (输入 == 'y')

  {

    // 保存 DBM 配置。 到文本文件中

    system(" db2 get dbm cfg > dbmcfg.TXT ");



    // 设置所有 DBM 配置。 缺省值

    cout << "\n 设置所有数据库管理器配置参数";

    cout << " 改为默认值。" << endl;



    // 初始化 cfgStruct

    cfgStruct.numItems = 0;

    cfgStruct.paramArray = NULL;

    cfgStruct.flags = db2CfgDatabaseManager | db2CfgReset | db2CfgDelayed;

    cfgStruct.dbname = NULL;



    // 重置数据库管理器配置

    db2CfgSet(db2Version970, (void *)&cfgStruct, &sqlca);

    DB2_API_CHECK( "DBM配置"。 默认 - 设置");



    cout << "\n All Database Manager Configuration parameters";

    cout << " 设置为默认值。" << endl;

  }



  // 释放已分配的内存

  删除 [] cfgParameters[0 ].ptrvalue;

  删除 [] 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;



  // 设置运行时间度数

  runTimeDegree = 4;

  cout << "\n 将运行时间度设置为值:"

       << runTimeDegree << endl;



  // 设置运行度

  sqlesdeg(SQL_ALL_USERS, NULL, runTimeDegree, &sqlca);

  DB2_API_CHECK( "运行时间度 - 设置");



  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 检查;

  InInfo 信息

  实例 inst;

  db2CfgParam cfgParameters[2 ]; // 保存 DBM 配置。

  db2Cfg cfgStruct;



  // 初始化 cfgStruct

  cfgStruct.numItems = 2;

  cfgStruct.paramArray = cfgParameters;

  cfgStruct.flags = db2CfgDatabaseManager | db2CfgDelayed;

  cfgStruct.dbname = NULL;



  // 检查命令行参数

  rc = check.CmdLineArgsCheck2(argc, argv, inst);

  如果 (rc!= 0)

  {

    return rc;

  }



  cout << ""\nTHIS SAMPLE SHOWS HOWS TO SET/GET INFO AT INSTANCE LEVEL."

       << endl;



  // 设置/获取作为名称的本地实例的信息

  // 环境变量的值 DB2INSTANCE

  rc = info.CurrentLocalInstanceNameGet( );

  rc = info.CurrentLocalNodeDirInfoSetGet( );

  rc = info.CurrentLocalDatabaseDirInfoSetGet( );

  rc = info.CurrentLocalDCSDirInfoSetGet( );



  // 附加到本地或远程实例

  rc = inst.Attach ();

  如果 (rc!= 0)

  {

    return rc;

  }



  // 保存 DBM 配置。

  rc = info.LocalOrRemoteDbmConfigSave(cfgStruct );

  如果 (rc!= 0)

  {

    return rc;

  }



  // 与 DBM 配置一起工作。

  rc = info.LocalOrRemoteDbmConfigSetGet( );



  // 恢复 DBM 配置。

  rc = info.LocalOrRemoteDbmConfigRestore(cfgStruct );



  // 与 DBM 配置一起工作。

  rc = info.LocalOrRemoteDbmConfigDefaultsSetGet( );



  // 设置运行时间度数

  rc = info.LocalOrRemoteRunTimeDegreeSet( );



  // 与本地或远程实例分离

  rc = inst.Detach ();

  如果 (rc!= 0)

  {

    return rc;

  }



  return 0;

}//main