www.gusucode.com > 一些VC++加密算法+实例源码源码程序 > 一些VC++加密算法+实例源码/优化后的加密注册模块/优化后的加密注册模块/inventory(syn_thread)/InventoryObj.cpp

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

       Arko Information Technology Co.,Ltd.      
  
*******************************************************

*InventoryObj.cpp           Version: 1.0                 
*Copyright: This is a part of the Arko Source Code … 

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

*Programmmer:	yangfan                              
*Date:			2000/12/19                               

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

*Description:
		Implementation of CInventoryObj.
		Implementation of all interface function.

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

#include "stdafx.h"
#include <afx.h>
#include "am_lv1.h"
#include "Module.h"
#include "general.h"
#include "Inventory.h"
#include "InventoryObj.h"
#include "Encry.h"
#include "MapLink.h"
#include "ErrorReport.h"
#include "sqlservice_i.c"

extern MapLink *MAPL;		//map link(global)
extern unsigned char pKey[8];		//the global public key for communication
extern int SetMask(int index1, int index2, int index3, int index4);
extern Eventinfo eventinfo;		//event information

int RecordNum[10];		//global array for record number

//define a pointer of BSTR for each table
extern		BSTR  *condevdb;
extern		BSTR  *mapdb;
extern		BSTR  *cpudb;
extern		BSTR  *memdb;
extern		BSTR  *filedb;
extern		BSTR  *osdb;
extern		BSTR  *devicedb;
extern		BSTR  *networkdb;
extern		BSTR  *statdb;
extern		BSTR  *netstatdb;

/////////////////////////////////////////////////////////////////////////////
// CInventoryObj
//////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CInventoryObj::InterfaceSupportsErrorInfo(REFIID riid)
{
	static const IID* arr[] = 
	{
		&IID_IInventoryObj
	};
	for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		if (InlineIsEqualGUID(*arr[i],riid))
			return S_OK;
	}
	return S_FALSE;
}

STDMETHODIMP CInventoryObj::HelloWorld()
{
	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Connect_To_DB	                     *
//*Function:                                         *
//*   Connect to database service					 *
//*Call format:										 *
//*CINV_s_sObj::Connect_To_DB()						 *
//*Output:											 *
//*   success of failure on connect to db service    *
//*Procedure called:                                 *
//*   _tWinMain: connect to database service		 * 
//*   CINV_s_sObj::Put_CPUInfo						 *
//*   CINV_s_sObj::Put_MEMInfo						 *
//*   CINV_s_sObj::Put_FILEInfo						 *
//*   CINV_s_sObj::Put_OSInfo						 *
//*   CINV_s_sObj::Put_DEVInfo						 *
//*   CINV_s_sObj::Put_NETInfo						 *
//*   CINV_s_sObj::Put_STATInfo						 *
//*   CINV_s_sObj::Put_NSTAInfo						 *
//*   CINV_s_sObj::Put_MAPInfo						 *
//*   CINV_s_sObj::Put_CONInfo						 *
//*   CINV_s_sObj::Put_SendPol						 *
//*   CINV_s_sObj::Put_SendPolNet					 *
//*   CINV_s_sObj::Put_SelectNet					 *
//*				: connect to database service		 * 
//****************************************************
STDMETHODIMP CInventoryObj::Connect_To_DB(void)
{
	COSERVERINFO ServerInfo;
	memset(&ServerInfo, 0, sizeof(ServerInfo));
	char temp[20];
	strcpy(temp,dbip);
	char *RemoteService=temp;
	ServerInfo.pwszName=new wchar_t[IP_LEN];
	mbstowcs(ServerInfo.pwszName, RemoteService, IP_LEN);

	m_pIobject_mm=NULL;
	MULTI_QI mqi[]={
		{&IID_IDBObject,NULL,0}};

	HRESULT hRes=CoCreateInstanceEx(
			CLSID_DBObject,
		    NULL,
			CLSCTX_ALL,
			&ServerInfo,
			sizeof(mqi)/sizeof(mqi[0]),
			mqi);
/*	HRESULT hRes=::CoCreateInstance(CLSID_object_mm,
									NULL,
									CLSCTX_ALL,
									IID_Iobject_mm,
									(void**)&m_pIobject_mm);
*/	
		if(hRes==0 && SUCCEEDED(mqi[0].hr))
		m_pIobject_mm=(IDBObject*)mqi[0].pItf;
	else
	if(hRes!=S_OK || m_pIobject_mm==NULL)
		return S_FALSE;
	
	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Put_CPUInfo		                     *
//*Function:                                         *
//*   put cpu information into database				 *
//*Call format:										 *
//*CINV_s_sObj::Put_CPUInfo(CPUdb FAR *result,		 *
//*						long FAR *ID,int first		 *
//*	  result : CPU information structure			 *
//*	  ID     : calling end system's ID(no use)		 *
//*	  first  : whether this is the first record		 *
//*Input:					                         *
//*   all parameters of putting cpu information		 *
//*Output:											 *
//*   success of failure on putting cpu information  *
//*Procedure called:                                 *
//*   End system agent: put cpu information into db  * 
//****************************************************
STDMETHODIMP CInventoryObj::Put_CPUInfo(CPUdb FAR *result,long FAR *ID,int first)
{
	char sql_str[MAX_BUFFER];

	HRESULT hRes=Connect_To_DB();	//connect to sqlservice
	if(hRes==S_OK)
	{
		db_table		in_table;

		in_table.db_table_id = DB_INV | TABLE_INV_CPU;
		in_table.encrypt_id = 0;

		//delete the original record that has the same endsystemid as "result->ID"
		if(first==1)
		{
			in_table.db_operation = DELETE;
			sprintf((char *)sql_str,"delete from INV_CPUTAB where EndSystemID = %ld",result->ID);
			DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);		//encrypt SQL sentence
			hRes = m_pIobject_mm->av_dbsql2(&in_table);
		}

		//insert the record that is from Mas_Agent (result)
		in_table.db_operation = INSERT;
		char CPUType[STR32], CPUManufacture[STR128];
		DesStrDe((unsigned char *)result->CPUType, (unsigned char *)CPUType, (unsigned char *)pKey);	//decrypt the data from Mas_Agent
		DesStrDe((unsigned char *)result->CPUManufacture, (unsigned char *)CPUManufacture, (unsigned char *)pKey);

		sprintf((char *)sql_str,"insert into INV_CPUTAB values (%ld,\"%s\",%d,\"%s\",%d)",result->ID,CPUType,result->CPUSpeed,CPUManufacture,result->CPUMMXFlag);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);		//encrypt SQL sentence
		hRes = m_pIobject_mm->av_dbsql2(&in_table);
		m_pIobject_mm->Release();
	}
	if (hRes != DB_SUCCEED)
		return 501;		//the error code is: connect db failed

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Put_MEMInfo		                     *
//*Function:                                         *
//*   put memory information into database			 *
//*Call format:										 *
//*CINV_s_sObj::Put_MEMInfo(MEMORYdb FAR *result,	 *
//*						long FAR *ID,int first		 *
//*	  result : memory information structure			 *
//*	  ID     : calling end system's ID(no use)		 *
//*	  first  : whether this is the first record		 *
//*Input:					                         *
//*   all parameters of putting memory information	 *
//*Output:											 *
//*   success of failure on putting memory info		 *
//*Procedure called:                                 *
//*   End system agent: put memory info into db		 * 
//****************************************************
STDMETHODIMP CInventoryObj::Put_MEMInfo(MEMORYdb FAR *result,long FAR *ID,int first)
{
	char sql_str[MAX_BUFFER];

    HRESULT hRes=Connect_To_DB();		//connect to sqlservice
	if(hRes==S_OK) 
	{
		db_table		in_table;

		in_table.db_table_id = DB_INV | TABLE_INV_MEM;
		in_table.encrypt_id = 0;

		//delete the original record that has the same endsystemid as "result->ID"
		if(first==1)
		{
			in_table.db_operation = DELETE;
			sprintf((char *)sql_str,"delete from INV_MEMORYTAB where EndSystemID = %ld",result->ID);
			DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
			hRes = m_pIobject_mm->av_dbsql2(&in_table);
		}

		//insert the record that is from Mas_Agent (result)
		in_table.db_operation = INSERT;
		sprintf((char *)sql_str,"insert into INV_MEMORYTAB values (%ld,%d,%d,%d)",result->ID,result->PhysicalSize,result->VirtualSize,result->PageSize);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);
		m_pIobject_mm->Release();	
	}
	if (hRes != DB_SUCCEED)
		return 501;

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Put_FILEInfo		                 *
//*Function:                                         *
//*   put filesystem information into database		 *
//*Call format:										 *
//*CINV_s_sObj::Put_CPUInfo(FILESYSTEMdb FAR *result,*
//*						long FAR *ID,int first		 *
//*	  result : filesystem information structure		 *
//*	  ID     : calling end system's ID(no use)		 *
//*	  first  : whether this is the first record		 *
//*Input:					                         *
//*   all parameters of putting file system info	 *
//*Output:											 *
//*   success of failure on putting file system info *
//*Procedure called:                                 *
//*   End system agent: put file system info into db * 
//****************************************************
STDMETHODIMP CInventoryObj::Put_FILEInfo(FILESYSTEMdb FAR *result,long FAR *ID,int first)
{
	char sql_str[MAX_BUFFER];

    HRESULT hRes=Connect_To_DB();
	if(hRes==S_OK) 
	{
		db_table		in_table;

		in_table.db_table_id = DB_INV | TABLE_INV_FS;
		in_table.encrypt_id = 0;

		//delete the original record that has the same endsystemid as "result->ID"
		if(first==1)
		{
			in_table.db_operation = DELETE;
			sprintf((char *)sql_str,"delete from INV_FILETAB where EndSystemID = %ld",result->ID);
			DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
			hRes = m_pIobject_mm->av_dbsql2(&in_table);
		}

		//insert the record that is from Mas_Agent (result)
		in_table.db_operation = INSERT;
		//decrypt data from Mas_Agent
		char FileSystemType[STR128], FileSystemDeviceName[STR32], FileSystemDescription[STR256];
		DesStrDe((unsigned char *)result->FileSystemType, (unsigned char *)FileSystemType, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->FileSystemDeviceName, (unsigned char *)FileSystemDeviceName, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->FileSystemDescription, (unsigned char *)FileSystemDescription, (unsigned char *)pKey);

		sprintf((char *)sql_str,"insert into INV_FILETAB values (%ld,\"%s\",%d,%d,\"%s\",\"%s\")",result->ID,FileSystemType,result->FileSystemSize,result->FileSystemSurplus,FileSystemDeviceName,FileSystemDescription);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);
		m_pIobject_mm->Release();	
	}
	if (hRes != DB_SUCCEED)
		return 501;

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Put_OSInfo		                     *
//*Function:                                         *
//*   put os information into database				 *
//*Call format:										 *
//*CINV_s_sObj::Put_OSInfo(OSdb FAR *result,		 *
//*						long FAR *ID,int first		 *
//*	  result : OS information structure				 *
//*	  ID     : calling end system's ID(no use)		 *
//*	  first  : whether this is the first record		 *
//*Input:					                         *
//*   all parameters of putting os information		 *
//*Output:											 *
//*   success of failure on putting os information   *
//*Procedure called:                                 *
//*   End system agent: put os information into db   * 
//****************************************************
STDMETHODIMP CInventoryObj::Put_OSInfo(OSdb FAR *result,long FAR *ID,int first)
{
	char sql_str[MAX_BUFFER];

    HRESULT hRes=Connect_To_DB();
	if(hRes==S_OK) 
	{
		db_table		in_table;

		in_table.db_table_id = DB_INV | TABLE_INV_OS;
		in_table.encrypt_id = 0;

		//delete the original record that has the same endsystemid as "result->ID"
		if(first==1)
		{
			in_table.db_operation = DELETE;
			sprintf((char *)sql_str,"delete from INV_OSTAB where EndSystemID = %ld",result->ID);
			DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
			hRes = m_pIobject_mm->av_dbsql2(&in_table);
		}

		//insert the record that is from Mas_Agent (result)
		in_table.db_operation = INSERT;
		//decrypt data from Mas_Agent
		char OSType[STR32], OSVersion[STR32], OSDescription[STR256], OSInstallPath[STR256];
		DesStrDe((unsigned char *)result->OSType, (unsigned char *)OSType, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->OSVersion, (unsigned char *)OSVersion, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->OSDescription, (unsigned char *)OSDescription, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->OSInstallPath, (unsigned char *)OSInstallPath, (unsigned char *)pKey);

		in_table.encrypt_id=SetMask(3,0,0,0);
		sprintf((char *)sql_str,"insert into INV_OSTAB values (%ld,\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")",result->ID,OSType,OSVersion,result->OSInstallTime,OSDescription,OSInstallPath);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);
		m_pIobject_mm->Release();	
	}
	if (hRes != DB_SUCCEED)
		return 501;

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Put_DEVInfo		                     *
//*Function:                                         *
//*   put device information into database			 *
//*Call format:										 *
//*CINV_s_sObj::Put_DEVInfo(DEVICEdb FAR *result,	 *
//*						long FAR *ID,int first		 *
//*	  result : device information structure			 *
//*	  ID     : calling end system's ID(no use)		 *
//*	  first  : whether this is the first record		 *
//*Input:					                         *
//*   all parameters of putting device information	 *
//*Output:											 *
//*   success of failure on putting device info		 *
//*Procedure called:                                 *
//*   End system agent: put device info into db		 * 
//****************************************************
STDMETHODIMP CInventoryObj::Put_DEVInfo(DEVICEdb FAR *result,long FAR *ID,int first)
{
	char sql_str[MAX_BUFFER];

    HRESULT hRes=Connect_To_DB();
	if(hRes==S_OK) 
	{
		db_table		in_table;

		in_table.db_table_id = DB_INV | TABLE_INV_DEV;
		in_table.encrypt_id = 0;

		//delete the original record that has the same endsystemid as "result->ID"
		if(first==1)
		{
			in_table.db_operation = DELETE;
			sprintf((char *)sql_str,"delete from INV_DEVICETAB where EndSystemID = %ld",result->ID);
			DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
			hRes = m_pIobject_mm->av_dbsql2(&in_table);
		}

		//insert the record that is from Mas_Agent (result)
		in_table.db_operation = INSERT;
		//decrypt data from Mas_Agent
		char DeviceName[STR128], DeviceManufacture[STR128], DeviceModel[STR128];
		DesStrDe((unsigned char *)result->DeviceName, (unsigned char *)DeviceName, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->DeviceManufacture, (unsigned char *)DeviceManufacture, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->DeviceModel, (unsigned char *)DeviceModel, (unsigned char *)pKey);

		in_table.encrypt_id=SetMask(4,0,0,0);
		sprintf((char *)sql_str,"insert into INV_DEVICETAB values (%ld,\"%s\",\"%s\",\"%s\",\"%s\",%d,%d,%d)",result->ID,DeviceName,DeviceManufacture,DeviceModel,result->DeviceInstallTime,result->DeviceWorkStatus,result->DevicePNPFlag,result->DeviceIRQNO);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);
		m_pIobject_mm->Release();	
	}
	if (hRes != DB_SUCCEED)
		return 501;

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Put_NETInfo		                     *
//*Function:                                         *
//*   put network information into database			 *
//*Call format:										 *
//*CINV_s_sObj::Put_NETInfo(NETWORKdb FAR *result,	 *
//*						long FAR *ID,int first		 *
//*	  result : network information structure		 *
//*	  ID     : calling end system's ID(no use)		 *
//*	  first  : whether this is the first record		 *
//*Input:					                         *
//*   all parameters of putting network information	 *
//*Output:											 *
//*   success of failure on putting network info	 *
//*Procedure called:                                 *
//*   End system agent: put network info into db	 * 
//****************************************************
STDMETHODIMP CInventoryObj::Put_NETInfo(NETWORKdb FAR *result,long FAR *ID,int first)
{
	char sql_str[MAX_BUFFER];

    HRESULT hRes=Connect_To_DB();
	if(hRes==S_OK) 
	{
		db_table		in_table;

		in_table.db_table_id = DB_INV | TABLE_INV_NET;
		in_table.encrypt_id = 0;

		//delete the original record that has the same endsystemid as "result->ID"
		if(first==1)
		{
			in_table.db_operation = DELETE;
			sprintf((char *)sql_str, "delete from INV_NETWORKTAB where EndSystemID = %ld",result->ID);
			DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
			hRes = m_pIobject_mm->av_dbsql2(&in_table);
		}

		//insert the record that is from Mas_Agent (result)
		in_table.db_operation = INSERT;
		Transform_IP((char *)result->IPAddress);
		Transform_IP((char *)result->NetMask);
		//decrypt data from Mas_Agent
		char HostName[STR128], Currentuser[STR32], WorkGroup[STR32], LoginDomain[STR32], AdapterMAC[MAC_LEN];
		DesStrDe((unsigned char *)result->HostName, (unsigned char *)HostName, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->Currentuser, (unsigned char *)Currentuser, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->WorkGroup, (unsigned char *)WorkGroup, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->LoginDomain, (unsigned char *)LoginDomain, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->AdapterMAC, (unsigned char *)AdapterMAC, (unsigned char *)pKey);

		in_table.encrypt_id=SetMask(2,3,0,0);
		sprintf((char *)sql_str,"insert into INV_NETWORKTAB values (%ld,\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")",result->ID,HostName,result->IPAddress,result->NetMask,Currentuser,WorkGroup,LoginDomain ,AdapterMAC);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);
		m_pIobject_mm->Release();	
	}
	if (hRes != DB_SUCCEED)
		return 501;

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Put_STATInfo		                 *
//*Function:                                         *
//*   put statistics information into database		 *
//*Call format:										 *
//*CINV_s_sObj::Put_STATInfo(STATdb FAR *result,	 *
//*						long FAR *ID,int first		 *
//*	  result : statistics information structure		 *
//*	  ID     : calling end system's ID(no use)		 *
//*	  first  : whether this is the first record		 *
//*Input:					                         *
//*   all parameters of putting statistics info		 *
//*Output:											 *
//*   success of failure on putting statistics info  *
//*Procedure called:                                 *
//*   End system agent: put statistics info into db  * 
//****************************************************
STDMETHODIMP CInventoryObj::Put_STATInfo(STATISTICSdb FAR *result,long FAR *ID,int first)
{
	char sql_str[MAX_BUFFER];

    HRESULT hRes=Connect_To_DB();
	if(hRes==S_OK) 
	{
		db_table		in_table;

		in_table.db_table_id = DB_INV | TABLE_INV_STAT;
		in_table.encrypt_id = 0;

		//update the original record which newtag=1 
		in_table.db_operation = UPDATE;
		sprintf((char *)sql_str,"update INV_STATISTICSTAB set newtag=0 where newtag=1 and endsystemID=%ld",result->ID);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);

		//insert the record from Mas_Agent(result)
		in_table.db_operation = INSERT;
		sprintf((char *)sql_str,"insert into INV_STATISTICSTAB values (%ld,\"%s\",%d,%f,%f,%f,1)",result->ID,result->StatisticsTime,result->ProcessNum,result->CPUUseRate,result->MemoryUseRate,result->FileSystemUseRate);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		in_table.encrypt_id=SetMask(1,0,0,0);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);
		m_pIobject_mm->Release();	
	}
	if (hRes != DB_SUCCEED)
		return 501;

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Put_NSTAInfo		                 *
//*Function:                                         *
//*   put net statistics information into database	 *
//*Call format:										 *
//*CINV_s_sObj::Put_NSTAInfo(NETSTATdb FAR *result,	 *
//*						long FAR *ID,int first		 *
//*	  result : net statistics information structure	 *
//*	  ID     : calling end system's ID(no use)		 *
//*	  first  : whether this is the first record		 *
//*Input:					                         *
//*   all parameters of putting net statistics info	 *
//*Output:											 *
//*   success of failure on putting net statistics info*
//*Procedure called:                                 *
//*   End system agent: put net statistics info into db* 
//****************************************************
STDMETHODIMP CInventoryObj::Put_NSTAInfo(NETSTATdb FAR *result,long FAR *ID,int first)
{
	char sql_str[MAX_BUFFER];

    HRESULT hRes=Connect_To_DB();
	if(hRes==S_OK) 
	{
		db_table		in_table;

		in_table.db_table_id = DB_INV | TABLE_INV_NETSTAT;
		in_table.encrypt_id = 0;

		//update the record which newtag=1
		in_table.db_operation = UPDATE;
		sprintf((char *)sql_str,"update INV_NETSTATAB set newtag=0 where newtag=1 and endsystemID=%ld",result->ID);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);

		//insert the record from Mas_Agent(result)
		in_table.db_operation = INSERT;
		Transform_IP((char *)result->IPAddress);
		Transform_IP((char *)result->NetMask);
		char AdapterMAC[MAC_LEN];
		DesStrDe((unsigned char *)result->AdapterMAC, (unsigned char *)AdapterMAC, (unsigned char *)pKey);

		in_table.encrypt_id=SetMask(1,2,4,0);
		sprintf((char *)sql_str,"insert into INV_NETSTATAB values (%ld,\"%s\",\"%s\",\"%s\",%u,%u,%u,%u,%u,%u,%u,\"%s\",1)",result->ID,result->IPAddress,result->NetMask,AdapterMAC,result->ReceiveByte,result->SendByte,result->ReceiveByte,result->SendPacket,result->DiscardPacket,result->UnknownProtocols,result->ErrorPacket,result->StatisticsTime);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);
		m_pIobject_mm->Release();	
	}
	if (hRes != DB_SUCCEED)
		return 501;

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Put_MAPInfo		                     *
//*Function:                                         *
//*   put map information into database				 *
//*Call format:										 *
//*CINV_s_sObj::Put_MAPInfo(MAPdb FAR *result,		 *
//*						long FAR *ID,int first		 *
//*	  result : map information structure			 *
//*	  ID     : calling end system's ID(-1 if new member*
//*	  first  : whether this is the first record		 *
//*Input:					                         *
//*   all parameters of putting map information		 *
//*Output:											 *
//*   success of failure on putting map information  *
//*	  distribute ID to new end system				 *
//*Procedure called:                                 *
//*   End system agent: put map information into db  * 
//****************************************************
STDMETHODIMP CInventoryObj::Put_MAPInfo(MAPdb FAR *result,long *ID,int first)
{
	char sql_str[1024];

	HRESULT hRes;
    hRes=Connect_To_DB();
	db_table		in_table;
	if(result->ID==-1)		//a new endsystem add
	{
		if(hRes==S_OK) 
		{
			tab_record		records;
			tables_union	*ret_records=NULL;
			int				i=0,start = 0,rec_number=0;
			int				offset = 0;
			in_table.db_table_id = DB_INV | TABLE_INV_MAP;
			in_table.encrypt_id = 0;
			
			Transform_IP((char *)result->IPAddress);

			//search the record that has the same ipaddr and hostname as "result"
			in_table.db_operation = SELECT;
			char HostName[STR128];
			DesStrDe((unsigned char *)result->HostName, (unsigned char *)HostName, (unsigned char *)pKey);

			in_table.encrypt_id=SetMask(1,0,0,0);
			sprintf((char *)sql_str, "select * from INV_MAPTAB where IPAddress=\"%s\"", result->IPAddress);
			DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
			hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
			if(rec_number > 0)
			{
				//exist such record that has the same ipaddr and hostname as "result",
				//so delete the original record from each table bases on endsystemid.
				ret_records = (tables_union *)records.records_buf;
				long ID = ret_records->table_inv_cpu.endsystem_id;

				in_table.db_operation = DELETE;
				in_table.encrypt_id = 0;
				sprintf((char *)sql_str, "delete from INV_MAPTAB where EndSystemID=%d", ID);
				DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
				hRes = m_pIobject_mm->av_dbsql2(&in_table);

				in_table.db_table_id = DB_INV | TABLE_INV_CPU;
				in_table.encrypt_id = 0;
				sprintf((char *)sql_str, "delete from INV_CPUTAB where EndSystemID=%d", ID);
				DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
				hRes = m_pIobject_mm->av_dbsql2(&in_table);

				in_table.db_table_id = DB_INV | TABLE_INV_MEM;
				in_table.encrypt_id = 0;
				sprintf((char *)sql_str, "delete from INV_MEMORYTAB where EndSystemID=%d", ID);
				DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
				hRes = m_pIobject_mm->av_dbsql2(&in_table);
				
				in_table.db_table_id = DB_INV | TABLE_INV_FS;
				in_table.encrypt_id = 0;
				sprintf((char *)sql_str, "delete from INV_FILETAB where EndSystemID=%d", ID);
				DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
				hRes = m_pIobject_mm->av_dbsql2(&in_table);

				in_table.db_table_id = DB_INV | TABLE_INV_OS;
				in_table.encrypt_id = 0;
				sprintf((char *)sql_str, "delete from INV_OSTAB where EndSystemID=%d", ID);
				DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
				hRes = m_pIobject_mm->av_dbsql2(&in_table);

				in_table.db_table_id = DB_INV | TABLE_INV_DEV;
				in_table.encrypt_id = 0;
				sprintf((char *)sql_str, "delete from INV_DEVICETAB where EndSystemID=%d", ID);
				DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
				hRes = m_pIobject_mm->av_dbsql2(&in_table);

				in_table.db_table_id = DB_INV | TABLE_INV_NET;
				in_table.encrypt_id = 0;
				sprintf((char *)sql_str, "delete from INV_NETWORKTAB where EndSystemID=%d", ID);
				DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
				hRes = m_pIobject_mm->av_dbsql2(&in_table);

				in_table.db_table_id = DB_INV | TABLE_INV_STAT;
				in_table.encrypt_id = 0;
				sprintf((char *)sql_str, "delete from INV_STATISTICSTAB where EndSystemID=%d", ID);
				DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
				hRes = m_pIobject_mm->av_dbsql2(&in_table);

				in_table.db_table_id = DB_INV | TABLE_INV_NETSTAT;
				in_table.encrypt_id = 0;
				sprintf((char *)sql_str, "delete from INV_NETSTATAB where EndSystemID=%d", ID);
				DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
				hRes = m_pIobject_mm->av_dbsql2(&in_table);

			}

			//insert the new record to map table
			in_table.db_table_id = DB_INV | TABLE_INV_MAP;
			in_table.db_operation = INSERT;
			in_table.encrypt_id=SetMask(1,0,0,0);
			//the endsystemid of this new record is automatic created by SQL server
			sprintf((char *)sql_str,"insert into INV_MAPTAB values (\"%s\",\"%s\",%d)",result->IPAddress,HostName,1);
			DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
			hRes = m_pIobject_mm->av_dbsql2(&in_table);
		
			//select map table to get the new endsystemid
			in_table.db_operation = SELECT;
			in_table.encrypt_id=SetMask(1,0,0,0);
			sprintf((char *)sql_str,"select * from INV_MAPTAB where IPAddress= \"%s\" and HostName= \"%s\"",result->IPAddress,HostName);
			DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
			hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
			if (hRes == DB_SUCCEED)
			{
				ret_records = (tables_union *)records.records_buf;
				if(offset > 0)
					result->ID=(ret_records+i)->table_inv_map.endsystem_id;
			}
			m_pIobject_mm->Release();
		}
	}
	else	//update the exist record of original endsystem 
	{
		if(hRes==S_OK) 
		{
			in_table.db_table_id = DB_INV | TABLE_INV_MAP;
			in_table.encrypt_id = 0;
			if(first==1)
			{
				//update the original record
				in_table.db_operation = UPDATE;
				Transform_IP((char *)result->IPAddress);
				char HostName[STR128];
				DesStrDe((unsigned char *)result->HostName, (unsigned char *)HostName, (unsigned char *)pKey);
				in_table.encrypt_id=SetMask(1,0,0,0);
				sprintf((char *)sql_str,"update INV_MAPTAB set IPAddress= \"%s\", HostName= \"%s\", AvailableTag=%d where EndSystemID = %ld",result->IPAddress,HostName,1 /*result->AvailableTag*/,result->ID);
				DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
				hRes = m_pIobject_mm->av_dbsql2(&in_table);
			}
			m_pIobject_mm->Release();	
		}
	}

	*ID=result->ID;		//output the endsystem identity to Mas_Agent

	if (hRes != DB_SUCCEED)
		return 501;
	
	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Put_CONInfo		                     *
//*Function:                                         *
//*   put connect device information into database	 *
//*Call format:										 *
//*CINV_s_sObj::Put_CONInfo(CONDEVdb FAR *result,	 *
//*						long FAR *ID,int first		 *
//*	  result : connect device information structure	 *
//*	  ID     : calling end system's ID(no use)		 *
//*	  first  : whether this is the first record		 *
//*Input:					                         *
//*   all parameters of putting connect device info	 *
//*Output:											 *
//*   success of failure on putting connect device info*
//*Procedure called:                                 *
//*   End system agent: put connect device info into db* 
//****************************************************
STDMETHODIMP CInventoryObj::Put_CONInfo(CONDEVdb FAR *result,long FAR *ID)
{
	char sql_str[MAX_BUFFER];

    HRESULT hRes=Connect_To_DB();
	if(hRes==S_OK) 
	{
		db_table		in_table;

		in_table.db_table_id = DB_INV | TABLE_INV_DEVSYS;
		in_table.encrypt_id = 0;

		//delete the exist record that has the same DeviceObjectID and DeviceSysName as "result"
		in_table.db_operation = DELETE;
		char DeviceObjectID[STR256], DeviceSysName[STR256];
		DesStrDe((unsigned char *)result->DeviceObjectID, (unsigned char *)DeviceObjectID, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->DeviceSysName, (unsigned char *)DeviceSysName, (unsigned char *)pKey);
		
		sprintf((char *)sql_str,"delete from INV_CONDEVTAB where DeviceObjectID = \"%s\" and DeviceSysName=\"%s\"",DeviceObjectID, DeviceSysName);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);

		//insert the new record
		in_table.db_operation = INSERT;
		char DeviceSysDescr[STR256], DeviceSysContact[STR256], DeviceSysLocation[STR256], DeviceVender[STR128];
		DesStrDe((unsigned char *)result->DeviceSysDescr, (unsigned char *)DeviceSysDescr, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->DeviceSysContact, (unsigned char *)DeviceSysContact, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->DeviceSysLocation, (unsigned char *)DeviceSysLocation, (unsigned char *)pKey);
		DesStrDe((unsigned char *)result->DeviceVender, (unsigned char *)DeviceVender, (unsigned char *)pKey);
		
		sprintf((char *)sql_str,"insert into INV_CONDEVTAB values (\"%s\",\"%s\",\"%s\",\"%s\",%d,%d,%d,\"%s\",\"%s\")",DeviceSysDescr,DeviceObjectID,DeviceSysContact,DeviceSysLocation,result->DeviceSysServices,result->DeviceAvailablePortNO,result->DeviceActivePortNum,DeviceVender,DeviceSysName);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql2(&in_table);
		m_pIobject_mm->Release();	
	}
	if (hRes != DB_SUCCEED)
		return 501;

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::RecCount		                     *
//*Function:                                         *
//*   get the number of records of each table		 *
//*Call format:										 *
//*CINV_s_sObj::RecCount(BSTR DBname,				 *
//*						long FAR *count)			 *
//*	  name   : table name							 *
//*	  count  : number of records of each table		 *
//*Input:					                         *
//*   table name									 *
//*Output:											 *
//*   number of records of each table				 *
//*Procedure called:                                 *
//*   INV CSCI: get the number of each table'srecords* 
//*   NM  CSCI: get the number of each table'srecords* 
//****************************************************
STDMETHODIMP CInventoryObj::RecCount(BSTR DBname,long FAR *count)
{
	//decrypt the table name
	BSTR des_name=SysAllocStringByteLen(NULL, STR32*2);
	DesBSTRDe(DBname, &des_name, (unsigned char *)pKey);

	char tmpstr[STR32];
	WideCharToMultiByte(CP_ACP, 0, des_name, -1, tmpstr, STR32, NULL, NULL);
	SysFreeString(des_name);

	//matching table name, and output the record number
	if(strcmp(tmpstr , "MAP")==0)
		*count=RecordNum[0];
	else if(strcmp(tmpstr , "CPU")==0)
		*count=RecordNum[1];
	else if(strcmp(tmpstr , "MEM")==0)
		*count=RecordNum[2];
	else if(strcmp(tmpstr , "FILE")==0)
		*count=RecordNum[3];
	else if(strcmp(tmpstr , "OS")==0)
		*count=RecordNum[4];
	else if(strcmp(tmpstr, "DEVICE")==0)
		*count=RecordNum[5];
	else if(strcmp(tmpstr , "NETWORK")==0)
	     *count=RecordNum[6];	
	else if(strcmp(tmpstr, "STAT")==0)
	     *count=RecordNum[7];
	else if(strcmp(tmpstr ,"NETSTAT")==0)
	     *count=RecordNum[8];
	else if(strcmp(tmpstr ,"CONDEV")==0)
		*count=RecordNum[9];

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::SendPolNet		                     *
//*Function:                                         *
//*   search db by given net policy					 *
//*Call format:										 *
//*CINV_s_sObj::SendPolNet(BSTR name,				 *
//*			long andor1,long andor2,long andor3,	 *
//*			BSTR Sysname,BSTR Vender,long Services)	 *
//*	  name    : policy name							 *
//*	  andorX  : and/or/Nothing				  		 *
//*	  Sysname : device system name					 *
//*	  Vender  : device vendor						 *
//*   Services: service level						 *
//*Input:					                         *
//*   net policy name and content					 *
//*Output:											 *
//*   success of failure on searching database		 *
//*Procedure called:                                 *
//*   INV CSCI: search db by given net policy		 * 
//****************************************************
STDMETHODIMP CInventoryObj::SendPolNet(BSTR name,long andor1,long andor2,long andor3,BSTR Sysname,BSTR Vender,long Services)
{
	//decrypt the policy name
	BSTR des_name=SysAllocStringByteLen(NULL, STR32*2);
	DesBSTRDe(name, &des_name, (unsigned char *)pKey);

    HRESULT hRes=Connect_To_DB();
	if(hRes!=S_OK)
	{
		RecordNum[9]=0;
		return 501;
	}
	int				rec_number,i,j;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start = 0;
	int				offset=0;

	in_table.db_table_id = DB_INV | TABLE_INV_DEVSYS;
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;
	char temp[10];		
	char namestr[STR32],Sysnamestr[STR256],Venderstr[STR128];
	char sel_str[4096],sql_str[4096];
	strcpy((char *)sel_str,"select * from INV_CONDEVTAB");
	int first=1;

	//if the pointer of name is null, query all records.
	//the pointer of name isn't null, so build the policy.
	if (strcmp((LPSTR)des_name , "")!=0) 
	{
		//decrypt the input variables
		BSTR des_Sysname=SysAllocStringByteLen(NULL, STR256*2);
		BSTR des_Vender=SysAllocStringByteLen(NULL, STR256*2);
		DesBSTRDe(Sysname, &des_Sysname, (unsigned char *)pKey);
		DesBSTRDe(Vender, &des_Vender, (unsigned char *)pKey);

		WideCharToMultiByte(CP_ACP, 0, des_name, -1, namestr, STR32, NULL, NULL);
		WideCharToMultiByte(CP_ACP, 0, des_Sysname, -1, Sysnamestr, STR256, NULL, NULL);
		WideCharToMultiByte(CP_ACP, 0, des_Vender, -1, Venderstr, STR128, NULL, NULL);

		SysFreeString(des_name);
		SysFreeString(des_Sysname);
		SysFreeString(des_Vender);

		//build SQL sentence
		strcpy((char *)sql_str,"");

		//device_system name: "or"
		if(andor1==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			strcat((char *)sql_str,"DeviceSysName = \"");
			strcat((char *)sql_str,Sysnamestr);
			strcat((char *)sql_str,"\"");
		}

		//device_vender: "or"
		if(andor2==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			strcat((char *)sql_str,"DeviceVendor = \"");
			strcat((char *)sql_str,Venderstr);
			strcat((char *)sql_str,"\"");
		}

		//service level: "or"
		if(andor3==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			char tmp[2];
			strcat((char *)sql_str,"DeviceSysServices = ");
			strcat((char *)sql_str,_itoa( Services, (char *)tmp, 10 ));
		}
		if(first==0) 
			strcat((char *)sql_str," ) ");

		//device_system name: " and "
		if(andor1==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			strcat((char *)sql_str,"DeviceSysName = \"");
			strcat((char *)sql_str,Sysnamestr);
			strcat((char *)sql_str,"\"");
		}

		//device_vender: " and "
		if(andor2==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			strcat((char *)sql_str,"DeviceVendor = \"");
			strcat((char *)sql_str,Venderstr);
			strcat((char *)sql_str,"\"");
		}

		//service level: "and"
		if(andor3==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			char tmp[2];
			strcat((char *)sql_str,"DeviceSysServices = ");
			strcat((char *)sql_str,_itoa( Services, (char *)tmp, 10 ));
		}

		if(strcmp((char *)sql_str,"")!=0)
		{
			strcat((char *)sel_str," where ");
			strcat((char *)sel_str,sql_str);
		}
	}

	//encrypt SQL sentence
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);

	first=0;

	BSTR tempbstr;
	char tempstr[STR256];
	start=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED)
		{
			RecordNum[9]=0;
			if(hRes==1001)
				return S_OK;
			return 2014;
		}
		//distribute a memory block for condevdb
		if(first==0)
		{
			delete []condevdb;
			RecordNum[9]=rec_number;
			condevdb = new BSTR[9*rec_number];
			first=1;
		}
		ret_records = (tables_union *)records.records_buf;

		//put the records queried from db to condevdb
		if(offset > 0){
			for(i=0,j=start;i<offset;i++,j++){
				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_desc, 
					     (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_oid, 
						   (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9+1] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+1], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_contact,  
						   (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9+2] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+2], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_location, 
						   (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9+3] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+3], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				itoa((ret_records+i)->table_inv_devsys.devsys_service,temp,10);
				tempbstr = MakeWideStrFromAnsi((char *)temp);
				condevdb[j*9+4] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+4], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				itoa((ret_records+i)->table_inv_devsys.devsys_port_no,temp,10);
				tempbstr = MakeWideStrFromAnsi((char *)temp);
				condevdb[j*9+5] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+5], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				itoa((ret_records+i)->table_inv_devsys.devsys_port_num,temp,10);
				tempbstr = MakeWideStrFromAnsi((char *)temp);
				condevdb[j*9+6] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+6], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_name, 
						   (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9+7] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+7], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_vendor, 
						   (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9+8] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+8], (unsigned char *)pKey);
				SysFreeString(tempbstr); 
			}
		}
	}
	while(start+offset<RecordNum[9]);

	m_pIobject_mm->Release();
	
	return S_OK;
}

//****************************************************
//*CINV_s_sObj::SelectNet		                     *
//*Function:                                         *
//*   search db by given ObjectID					 *
//*Call format:										 *
//*CINV_s_sObj::SelectNet(BSTR ObjectID)			 *
//*	  ObjectID : connect device ObjectID			 *
//*Input:					                         *
//*   connect device ObjectID						 *
//*Output:											 *
//*   success of failure on searching database		 *
//*Procedure called:                                 *
//*   INV CSCI: search db by given ObjectID			 * 
//****************************************************
STDMETHODIMP CInventoryObj::SelectNet(BSTR ObjectID, BSTR DeviceSysName)
{
    HRESULT hRes=Connect_To_DB();
	if(hRes!=S_OK)
	{
		RecordNum[9]=0;
		return 501;
	}
	int				rec_number,i,j;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start = 0;
	int				offset=0;

	in_table.db_table_id = DB_INV | TABLE_INV_DEVSYS;
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;
	char temp[10];
	char sel_str[4096],ObjID[STR256],SysName[STR256];

	int first=1;
	//decrypt the input variables
	BSTR des_ObjectID=SysAllocStringByteLen(NULL, STR256*2);
	BSTR des_DeviceSysName=SysAllocStringByteLen(NULL, STR256*2);
	DesBSTRDe(ObjectID, &des_ObjectID, (unsigned char *)pKey);
	DesBSTRDe(DeviceSysName, &des_DeviceSysName, (unsigned char *)pKey);

	WideCharToMultiByte(CP_ACP, 0, des_ObjectID, -1, ObjID, STR256, NULL, NULL);
	WideCharToMultiByte(CP_ACP, 0, des_DeviceSysName, -1, SysName, STR256, NULL, NULL);
	SysFreeString(des_ObjectID); SysFreeString(des_DeviceSysName);

	//build SQL sentence
	sprintf((char *)sel_str, "Select * from INV_CONDEVTAB where DeviceObjectID=\"%s\" and DeviceSysName=\"%s\"", ObjID, SysName);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);

	BSTR tempbstr;
	char tempstr[STR256];
	first=0;
	start=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED)
		{
			RecordNum[9]=0;
			if(hRes==1001)
				return S_OK;
			return 2014;
		}
		//distribute a memory block for condevdb
		if(first==0)
		{
			delete []condevdb;
			RecordNum[9]=rec_number;
			condevdb = new BSTR[9*rec_number];
			first=1;
		}
		ret_records = (tables_union *)records.records_buf;

		//put the records queried from db to condevdb
		if(offset > 0){
			for(i=0,j=start;i<offset;i++,j++){
				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_desc, 
					     (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_oid, 
						   (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9+1] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+1], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_contact,  
						   (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9+2] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+2], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_location, 
						   (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9+3] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+3], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				itoa((ret_records+i)->table_inv_devsys.devsys_service,temp,10);
				tempbstr = MakeWideStrFromAnsi((char *)temp);
				condevdb[j*9+4] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+4], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				itoa((ret_records+i)->table_inv_devsys.devsys_port_no,temp,10);
				tempbstr = MakeWideStrFromAnsi((char *)temp);
				condevdb[j*9+5] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+5], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				itoa((ret_records+i)->table_inv_devsys.devsys_port_num,temp,10);
				tempbstr = MakeWideStrFromAnsi((char *)temp);
				condevdb[j*9+6] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+6], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_name, 
						   (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9+7] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+7], (unsigned char *)pKey);
				SysFreeString(tempbstr); 

				DesStrDe((unsigned char *)(ret_records+i)->table_inv_devsys.devsys_vendor, 
						   (unsigned char *)tempstr, (unsigned char *)pKey);
				tempbstr = MakeWideStrFromAnsi((char *)tempstr);
				condevdb[j*9+8] = SysAllocStringByteLen(NULL, 256*2);
				DesBSTREn(tempbstr,  &condevdb[j*9+8], (unsigned char *)pKey);
				SysFreeString(tempbstr); 
			}
		}
	}
	while(start+offset<RecordNum[9]);

	m_pIobject_mm->Release();	

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::SendPol			                     *
//*Function:                                         *
//*   search db by given policy						 *
//*Call format:										 *
//*CINV_s_sObj::SendPol(BSTR name,					 *
//*			long andor1,long andor2,long andor3,	 *
//*			long andor4,long andor5,long andor6,	 *
//*			long andor7,BSTR CPUMin,BSTR CPUMax,	 *
//*			BSTR MemMin,BSTR MemMax,BSTR DskMin,	 *
//*			BSTR DskMax,long OSIndex, BSTR Equ,		 *
//*			BSTR IPMin,BSTR IPMax,BSTR Mac)			 *
//*	  name    : policy name							 *
//*	  andorX  : and/or/Nothing				  		 *
//*	  CPUMin,CPUMax : CPU speed range				 *
//*	  MemMin,MemMax : Memory space range			 *
//*   DskMin,DskMax : Disk space range 				 *
//*	  OsIndex : OS type index						 *
//*		0--Windows 95								 *
//*		1--Windows 98								 *
//*		2--Windows NT								 *
//*		3--Solaris									 *
//*	  Equ     : Equipment name						 *
//*	  IPMin,IPMax : IP address range				 *
//*   Mac     : Mac address							 *
//*Input:					                         *
//*   policy name and content						 *
//*Output:											 *
//*   success of failure on searching database		 *
//*Procedure called:                                 *
//*   INV CSCI: search db by given policy			 * 
//****************************************************
STDMETHODIMP CInventoryObj::SendPol(BSTR name,long andor1,long andor2,long andor3,long andor4,long andor5,long andor6,long andor7,BSTR CPUMin,BSTR CPUMax,BSTR MemMin,BSTR MemMax,BSTR DskMin,BSTR DskMax,long OSIndex, BSTR Equ,BSTR IPMin,BSTR IPMax,BSTR Mac)
{
	//decrypt the policy name
	BSTR des_name=SysAllocStringByteLen(NULL, STR32*2);
	DesBSTRDe(name, &des_name, (unsigned char *)pKey);

	int i,j;
    HRESULT hRes=Connect_To_DB();
	if(hRes!=S_OK)
	{
		for(i=0;i<7;i++)
			RecordNum[i]=0;
		return 501;
	}
	int				rec_number;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start = 0;
	int				offset=0;

	in_table.db_table_id = DB_INV | VIEW_INV_ENDSYSTEM;
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;
	char temp[10];
	char namestr[STR32],CPUMinstr[STR32],CPUMaxstr[STR32],MemMinstr[STR32],MemMaxstr[STR32],DskMinstr[STR32],DskMaxstr[STR32],Equstr[STR128],IPMinstr[IP_LEN],IPMaxstr[IP_LEN],Macstr[MAC_LEN];
	char sel_str[4096],sql_str[4096];
	int first=1;
	strcpy((char *)sql_str,"");

	//if the pointer of name is null, query all records.
	//the pointer of name isn't null, so build the policy.
	if (strcmp((LPSTR)des_name , "")!=0) 
	{
		//decryt the input variables
		WideCharToMultiByte(CP_ACP, 0, des_name, -1, namestr, STR32, NULL, NULL);
		SysFreeString(des_name);

		BSTR des_CPUMin=SysAllocStringByteLen(NULL, STR32*2);
		DesBSTRDe(CPUMin, &des_CPUMin, (unsigned char *)pKey);
		WideCharToMultiByte(CP_ACP, 0, des_CPUMin, -1, CPUMinstr, STR32, NULL, NULL);
		SysFreeString(des_CPUMin);

		BSTR des_CPUMax=SysAllocStringByteLen(NULL, STR32*2);
		DesBSTRDe(CPUMax, &des_CPUMax, (unsigned char *)pKey);
		WideCharToMultiByte(CP_ACP, 0, CPUMax, -1, CPUMaxstr, STR32, NULL, NULL);
		SysFreeString(des_CPUMax);

		BSTR des_MemMin=SysAllocStringByteLen(NULL, STR32*2);
		DesBSTRDe(MemMin, &des_MemMin, (unsigned char *)pKey);
		WideCharToMultiByte(CP_ACP, 0, des_MemMin, -1, MemMinstr, STR32, NULL, NULL);
		SysFreeString(des_MemMin);

		BSTR des_MemMax=SysAllocStringByteLen(NULL, STR32*2);
		DesBSTRDe(MemMax, &des_MemMax, (unsigned char *)pKey);
		WideCharToMultiByte(CP_ACP, 0, des_MemMax, -1, MemMaxstr, STR32, NULL, NULL);
		SysFreeString(des_MemMax);

		BSTR des_DskMin=SysAllocStringByteLen(NULL, STR32*2);
		DesBSTRDe(DskMin, &des_DskMin, (unsigned char *)pKey);
		WideCharToMultiByte(CP_ACP, 0, des_DskMin, -1, DskMinstr, STR32, NULL, NULL);
		SysFreeString(des_DskMin);

		BSTR des_DskMax=SysAllocStringByteLen(NULL, STR32*2);
		DesBSTRDe(DskMax, &des_DskMax, (unsigned char *)pKey);
		WideCharToMultiByte(CP_ACP, 0, des_DskMax, -1, DskMaxstr, STR32, NULL, NULL);
		SysFreeString(des_DskMax);

		WideCharToMultiByte(CP_ACP, 0, IPMin, -1, IPMinstr, IP_LEN, NULL, NULL);
		if (strcmp(IPMinstr, "")!=0) 
			Transform_IP(IPMinstr);

		WideCharToMultiByte(CP_ACP, 0, IPMax, -1, IPMaxstr, IP_LEN, NULL, NULL);
		if(strcmp(IPMaxstr, "")!=0)
			Transform_IP(IPMaxstr);

		BSTR des_Equ=SysAllocStringByteLen(NULL, STR128*2);
		DesBSTRDe(Equ, &des_Equ, (unsigned char *)pKey);
		WideCharToMultiByte(CP_ACP, 0, des_Equ, -1, Equstr, STR128, NULL, NULL);
		SysFreeString(des_Equ);

		BSTR des_Mac=SysAllocStringByteLen(NULL, MAC_LEN*2);
		DesBSTRDe(Mac, &des_Mac, (unsigned char *)pKey);
		WideCharToMultiByte(CP_ACP, 0, des_Mac, -1, Macstr, MAC_LEN, NULL, NULL);
		SysFreeString(des_Mac);

		strcpy((char *)sel_str,"select * from EndSystemView");
		//build SQL sentence
		strcpy((char *)sql_str,"");

		//CPU speed: "or"
		if(andor1==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			//have both  the min and max value
			if(strcmp((char *)CPUMinstr,"")!=0 && strcmp((char *)CPUMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"CPUSpeed >= ");
				strcat((char *)sql_str,CPUMinstr);
				strcat((char *)sql_str," and CPUSpeed <=");
				strcat((char *)sql_str,CPUMaxstr);
			}
			//only have the min value
			else if(strcmp((char *)CPUMinstr,"")!=0)
			{
		
				strcat((char *)sql_str,"CPUSpeed >= ");
				strcat((char *)sql_str,CPUMinstr);
			}
			//only have the max value
			else if(strcmp((char *)CPUMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"CPUSpeed <=");
				strcat((char *)sql_str,CPUMaxstr);
			}
		}

		//memory size: "or"
		if(andor2==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			//have both  the min and max value
			if(strcmp((char *)MemMinstr,"")!=0 && strcmp((char *)MemMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize >= ");
				strcat((char *)sql_str,MemMinstr);
				strcat((char *)sql_str," and MemorySize <=");
				strcat((char *)sql_str,MemMaxstr);
			}
			//only have the min value
			else if(strcmp((char *)MemMinstr,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize >= ");
				strcat((char *)sql_str,MemMinstr);
			}
			//only have the max value
			else if(strcmp((char *)MemMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize <=");
				strcat((char *)sql_str,MemMaxstr);
			}
		}

		//harddisk size: "or"
		if(andor3==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			//have both the min and max value
			if(strcmp((char *)DskMinstr,"")!=0 && strcmp((char *)DskMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize >= ");
				strcat((char *)sql_str,DskMinstr);
				strcat((char *)sql_str," and HardDiskSize <=");
				strcat((char *)sql_str,DskMaxstr);
			}
			//only have the min value
			else if(strcmp((char *)DskMinstr,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize >= ");
				strcat((char *)sql_str,DskMinstr);
			}
			//only have the max value
			else if(strcmp((char *)DskMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize <=");
				strcat((char *)sql_str,DskMaxstr);
			}
		}

		//os type: "or"
		if(andor4==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			switch (OSIndex)
			{
			case 0:
				strcat((char *)sql_str,"OSType = \"Windows 95\"");
				break;
			case 1:
				strcat((char *)sql_str,"OSType = \"Windows 98\"");
				break;
			case 2:
				strcat((char *)sql_str,"OSType = \"Windows NT\"");
				break;
			case 3:
				strcat((char *)sql_str,"OSType = \"Solaris\"");
				break;
			}
		}

		//equipment name: "or"
		if(andor5==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			strcat((char *)sql_str,"DeviceName = \"");
			strcat((char *)sql_str,Equstr);
			strcat((char *)sql_str,"\"");
		}

		//ip address: "or"
		if(andor6==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			//have both the min and max value
			if(strcmp((char *)IPMinstr,"")!=0 && strcmp((char *)IPMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress >= \"");
				strcat((char *)sql_str,IPMinstr);
				strcat((char *)sql_str,"\" and IPAddress <= \"");
				strcat((char *)sql_str,IPMaxstr);
				strcat((char *)sql_str,"\"");
			}
			//only have the min value
			else if(strcmp((char *)IPMinstr,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress >= \"");
				strcat((char *)sql_str,IPMinstr);
				strcat((char *)sql_str,"\"");
			}
			//only have the max value
			else if(strcmp((char *)IPMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress <= \"");
				strcat((char *)sql_str,IPMaxstr);
				strcat((char *)sql_str,"\"");
			}
		}

		//MAC address: "or"
		if(andor7==1)
		{
			if (first==0) 
				strcat((char *)sql_str," or ");
			else
			{
				strcat((char *)sql_str," ( ");
				first = 0;
			}
			strcat((char *)sql_str,"MACAddress = \"");
			strcat((char *)sql_str,Macstr);
			strcat((char *)sql_str,"\"");
		}
		if(first==0) 
			strcat((char *)sql_str," ) ");

		//CPU speed: "and"
		if(andor1==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			//have both the min and max value
			if(strcmp((char *)CPUMinstr,"")!=0 && strcmp((char *)CPUMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"CPUSpeed >= ");
				strcat((char *)sql_str,CPUMinstr);
				strcat((char *)sql_str," and CPUSpeed <=");
				strcat((char *)sql_str,CPUMaxstr);
			}
			//only have the min value
			else if(strcmp((char *)CPUMinstr,"")!=0)
			{
				strcat((char *)sql_str,"CPUSpeed >= ");
				strcat((char *)sql_str,CPUMinstr);
			}
			//only have the max value
			else if(strcmp((char *)CPUMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"CPUSpeed <=");
				strcat((char *)sql_str,CPUMaxstr);
			}
		}

		//memory size: "and"
		if(andor2==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			//have both the min and max value
			if(strcmp((char *)MemMinstr,"")!=0 && strcmp((char *)MemMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize >= ");
				strcat((char *)sql_str,MemMinstr);
				strcat((char *)sql_str," and MemorySize <=");
				strcat((char *)sql_str,MemMaxstr);
			}
			//only have the min value
			else if(strcmp((char *)MemMinstr,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize >= ");
				strcat((char *)sql_str,MemMinstr);
			}
			//only have the max value
			else if(strcmp((char *)MemMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"MemorySize <=");
				strcat((char *)sql_str,MemMaxstr);
			}
		}

		//harddisk size: "and"
		if(andor3==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			//have both the min and max value
			if(strcmp((char *)DskMinstr,"")!=0 && strcmp((char *)DskMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize >= ");
				strcat((char *)sql_str,DskMinstr);
				strcat((char *)sql_str," and HardDiskSize <=");
				strcat((char *)sql_str,DskMaxstr);
			}
			//only have the min value
			else if(strcmp((char *)DskMinstr,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize >= ");
				strcat((char *)sql_str,DskMinstr);
			}
			//only have the max value
			else if(strcmp((char *)DskMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"HardDiskSize <=");
				strcat((char *)sql_str,DskMaxstr);
			}
		}

		//os type: " and "
		if(andor4==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			switch (OSIndex)
			{
			case 0: 
				strcat((char *)sql_str,"OSType = \"Windows 95\"");
				break;
			case 1:
				strcat((char *)sql_str,"OSType = \"Windows 98\"");
				break;
			case 2:
				strcat((char *)sql_str,"OSType = \"Windows NT\"");
				break;
			case 3:
				strcat((char *)sql_str,"OSType = \"Solaris\"");
				break;
			}
		}

		//equipment name: "and"
		if(andor5==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			strcat((char *)sql_str,"DeviceName = \"");
			strcat((char *)sql_str,Equstr);
			strcat((char *)sql_str,"\"");
		}

		//IP address: "and"
		if(andor6==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			//both have the min and max value 
			if(strcmp((char *)IPMinstr,"")!=0 && strcmp((char *)IPMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress >= \"");
				strcat((char *)sql_str,IPMinstr);
				strcat((char *)sql_str,"\" and IPAddress <= \"");
				strcat((char *)sql_str,IPMaxstr);
				strcat((char *)sql_str,"\"");
			}
			//only have the min value
			else if(strcmp((char *)IPMinstr,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress >= \"");
				strcat((char *)sql_str,IPMinstr);
				strcat((char *)sql_str,"\"");
			}
			//only have the max value
			else if(strcmp((char *)IPMaxstr,"")!=0)
			{
				strcat((char *)sql_str,"IPAddress <= \"");
				strcat((char *)sql_str,IPMaxstr);
				strcat((char *)sql_str,"\"");
			}
		}

		//MAC address: "and"
		if(andor7==2)
		{
			if (first==0) 
				strcat((char *)sql_str," and ");
			else
				first = 0;
			strcat((char *)sql_str,"MACAddress = \"");
			strcat((char *)sql_str,Macstr);
			strcat((char *)sql_str,"\"");
		}

		if(strcmp((char *)sql_str,"")!=0)
		{
			strcat((char *)sel_str," where ");
			strcat((char *)sel_str,sql_str);
		}

		//encrypt SQL sentence
		DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		//set mask for ipaddress
		int index=0;
		if(andor6==1)
		{
			if(andor4==1) index++;
			else if(andor5==1) index++;
				 else if(strcmp((char *)IPMinstr,"")!=0 && strcmp((char *)IPMaxstr,"")!=0) index=index+2;
					  else if(strcmp((char *)IPMinstr,"")!=0) index++;
					       else if(strcmp((char *)IPMaxstr,"")!=0) index++;
		}
		else if(andor6==2)
		{
			if(andor7==1) index++;
			else if(andor4==1 || andor4==2) index++;
				else if(andor5==1 || andor5==2) index++;
					 else if(strcmp((char *)IPMinstr,"")!=0 && strcmp((char *)IPMaxstr,"")!=0) index=index+2;
					      else if(strcmp((char *)IPMinstr,"")!=0) index++;
					           else if(strcmp((char *)IPMaxstr,"")!=0) index++;
		}

		if( index>0 )
		{
			if(strcmp((char *)IPMinstr,"")!=0 && strcmp((char *)IPMaxstr,"")!=0)
				in_table.encrypt_id=SetMask(index-1, index,0,0);
			else if(strcmp((char *)IPMinstr,"")!=0 || strcmp((char *)IPMaxstr,"")!=0)
				in_table.encrypt_id=SetMask(index,0,0,0);
		}

		first=0;
		//build "where" sentence basis on the endsystemid that queried from the view
		strcpy((char *)sel_str,"");
		start=0;
		do
		{
			start+=offset;
		    hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
			ret_records = (tables_union *)records.records_buf;

			if (hRes != DB_SUCCEED){
				for(i=0;i<7;i++)
					RecordNum[i]=0;
				return 2005;
			}
			if(offset > 0){
				for(i=0;i<offset;i++)
				{
					if(first!=0)
						strcat((char *)sel_str," or ");
					else
						first=1;
					_ltoa((ret_records+i)->view_inv_endsystem.endsystem_id,temp,10);
					strcat(sel_str,"EndSystemID=");
					strcat(sel_str,temp);
				}
			}
		}
		while(start+offset<rec_number);
		if(first>0)
		{
			strcpy((char *)sql_str," where ");
			strcat((char *)sql_str,sel_str);
		}
		else
			strcpy((char *)sql_str,"");
	}

	//build SQL sentence(add "where" condition), select each table
	//encrypt/decrypt each records
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;

	char tempstr[STR256];
	BSTR tempbstr;


	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_MAP;
	strcpy((char *)sel_str,"Select * from INV_MAPTAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED)
		{
			RecordNum[0]=0;
			if(hRes==1001)
				return S_OK;
			return 2005;
		}
		ret_records = (tables_union *)records.records_buf;

		//distribute a memory block for mapdb
		if(first==0)
		{
			delete []mapdb;
			RecordNum[0]=rec_number;
			mapdb = new BSTR[4*rec_number];
			first=1;
		}

		//put the records queried from db to mapdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_map.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			mapdb[j*4]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_map.map_ip_addr);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			mapdb[j*4+1]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_map.map_hostname, 
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi((char *)tempstr);
			mapdb[j*4+2]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_map.map_available_flag,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			mapdb[j*4+3]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[0]);

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_CPU;
	strcpy((char *)sel_str,"Select * from INV_CPUTAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[1]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for cpudb
		if(first==0)
		{
			delete []cpudb;
			RecordNum[1]=rec_number;
			cpudb = new BSTR[5*rec_number];
			first=1;
		}

		//put the records queried from db to cpudb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_cpu.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			cpudb[j*5] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &cpudb[j*5], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_cpu.cpu_type,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			cpudb[j*5+1] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &cpudb[j*5+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_cpu.cpu_speed,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			cpudb[j*5+2] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &cpudb[j*5+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_cpu.cpu_manufacture,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			cpudb[j*5+3] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &cpudb[j*5+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_cpu.cpu_mmx_flag,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			cpudb[j*5+4] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &cpudb[j*5+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[1]);

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_MEM;
	strcpy((char *)sel_str,"Select * from INV_MEMORYTAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[2]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block from db to memdb
		if(first==0)
		{
			delete []memdb;
			RecordNum[2]=rec_number;
			memdb = new BSTR[4*rec_number];
			first=1;
		}

		//put the records queried from db to memdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_mem.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			memdb[j*4] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &memdb[j*4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_mem.mem_physical_size,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			memdb[j*4+1] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &memdb[j*4+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_mem.mem_virtual_size,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			memdb[j*4+2] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &memdb[j*4+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_mem.mem_page_size,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			memdb[j*4+3] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &memdb[j*4+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[2]);

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_FS;
	strcpy((char *)sel_str,"Select * from INV_FILETAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[3]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for filedb
		if(first==0)
		{
			delete []filedb;
			RecordNum[3]=rec_number;
			filedb = new BSTR[6*rec_number];
			first=1;
		}

		//put the records queried from db to filedb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_fs.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			filedb[j*6] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &filedb[j*6], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_fs.fs_type,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			filedb[j*6+1] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &filedb[j*6+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_fs.fs_size,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			filedb[j*6+2] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &filedb[j*6+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_fs.fs_surplus,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			filedb[j*6+3] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &filedb[j*6+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_fs.fs_dev_name,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			filedb[j*6+4] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &filedb[j*6+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_fs.fs_desc,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			filedb[j*6+5] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &filedb[j*6+5], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[3]);

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_OS;
	strcpy((char *)sel_str,"Select * from INV_OSTAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[4]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for osdb
		if(first==0)
		{
			delete []osdb;
			RecordNum[4]=rec_number;
			osdb = new BSTR[6*rec_number];
			first=1;
		}

		//put the records queried from db to osdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_os.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			osdb[j*6] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &osdb[j*6], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_os.os_type,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			osdb[j*6+1] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &osdb[j*6+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_os.os_ver,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			osdb[j*6+2] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &osdb[j*6+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			tempbstr = MakeWideStrFromAnsi((char *)(ret_records+i)->table_inv_os.os_install_time);
			osdb[j*6+3] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &osdb[j*6+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_os.os_desc,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			osdb[j*6+4] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &osdb[j*6+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_os.os_install_path,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			osdb[j*6+5] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &osdb[j*6+5], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[4]);

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_DEV;
	strcpy((char *)sel_str,"Select * from INV_DEVICETAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[5]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for devicedb
		if(first==0)
		{
			delete []devicedb;
			RecordNum[5]=rec_number;
			devicedb = new BSTR[8*rec_number];
			first=1;
		}

		//put the records queried from db to devicedb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_dev.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			devicedb[j*8] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &devicedb[j*8], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_dev.dev_name,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			devicedb[j*8+1] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &devicedb[j*8+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_dev.dev_manufacture,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			devicedb[j*8+2] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &devicedb[j*8+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_dev.dev_model,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			devicedb[j*8+3] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &devicedb[j*8+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			tempbstr = MakeWideStrFromAnsi((char *)(ret_records+i)->table_inv_dev.dev_install_time);
			devicedb[j*8+4] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &devicedb[j*8+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_dev.dev_status,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			devicedb[j*8+5] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &devicedb[j*8+5], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_dev.dev_pnp_flag,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			devicedb[j*8+6] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &devicedb[j*8+6], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_dev.dev_irq_no,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			devicedb[j*8+7] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &devicedb[j*8+7], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[5]);

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_NET;
	strcpy((char *)sel_str,"Select * from INV_NETWORKTAB ");
	strcat((char *)sel_str,sql_str);
	DesStrEn((unsigned char *)sel_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[6]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for networkdb
		if(first==0)
		{
			delete []networkdb;
			RecordNum[6]=rec_number;
			networkdb = new BSTR[8*rec_number];
			first=1;
		}

		//put the records queried from db to networkdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_dev.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			networkdb[j*8] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &networkdb[j*8], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_net.net_hostname,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			networkdb[j*8+1] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &networkdb[j*8+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_net.net_ip_addr);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			networkdb[j*8+2] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &networkdb[j*8+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_net.net_mask);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			networkdb[j*8+3] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &networkdb[j*8+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_net.net_cur_user,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			networkdb[j*8+4] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &networkdb[j*8+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_net.net_work_grp,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			networkdb[j*8+5] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &networkdb[j*8+5], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_net.net_domain,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			networkdb[j*8+6] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &networkdb[j*8+6], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_net.net_mac_addr,
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi(tempstr);
			networkdb[j*8+7] =SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &networkdb[j*8+7], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[6]);

	m_pIobject_mm->Release();	

	return S_OK;
}

//****************************************************
//*CINV_s_sObj::SelectDyn		                     *
//*Function:                                         *
//*   search db dynamically							 *
//*Call format:										 *
//*CINV_s_sObj::SelectDyn()							 *
//*Output:											 *
//*   success of failure on searching database		 *
//*Procedure called:                                 *
//*   INV CSCI: search db dynamically				 * 
//****************************************************
STDMETHODIMP CInventoryObj::SelectDyn()
{
	char sql_str[MAX_BUFFER];

	int				i;
    HRESULT hRes=Connect_To_DB();
	if(hRes!=S_OK)
	{
		RecordNum[0]=0;
		for(i=7;i<9;i++)
			RecordNum[i]=0;
		return 501;
	}
	int				j,rec_number;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start,offset,first;
	char temp[10],IPMinstr[16];

	//select each table
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;

	char tempstr[256];
	BSTR tempbstr;

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_MAP;
	strcpy((char *)sql_str,"Select * from INV_MAPTAB");
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED)
		{
			RecordNum[0]=0;
			if(hRes==1001)
				return S_OK;
			return 2005;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for mapdb
		if(first==0)
		{
		/*	if(RecordNum[0]>0)//是否应该释放?
			{
				for(i=0; i<RecordNum[0]; i++)
				{
					SysFreeString(mapdb[i*4]);
					SysFreeString(mapdb[i*4+1]);
					SysFreeString(mapdb[i*4+2]);
					SysFreeString(mapdb[i*4+3]);
				}
			}*/
			delete []mapdb;

			RecordNum[0]=rec_number;
			mapdb = new BSTR[4*rec_number];
			first=1;
		}

		//put the records queried from db to mapdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_map.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			mapdb[j*4]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_map.map_ip_addr);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			mapdb[j*4+1]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_map.map_hostname, 
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi((char *)tempstr);
			mapdb[j*4+2]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_map.map_available_flag,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			mapdb[j*4+3]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[0]);

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_STAT;
	strcpy((char *)sql_str,"Select * from INV_STATISTICSTAB where newtag=1");
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[7]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for statdb
		if(first==0)
		{
			delete []statdb;
			RecordNum[7]=rec_number;
			statdb=new BSTR[6*rec_number];
			first=1;
		}

		//put the records queried from db to statdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_stat.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			tempbstr = MakeWideStrFromAnsi((char *)(ret_records+i)->table_inv_stat.stat_time);
			statdb[j*6+1] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_stat.stat_proc_num,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+2] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			sprintf(temp,"%f",(ret_records+i)->table_inv_stat.stat_cpu_rate);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+3] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			sprintf(temp,"%f",(ret_records+i)->table_inv_stat.stat_mem_rate);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+4] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			sprintf(temp,"%f",(ret_records+i)->table_inv_stat.stat_fs_rate);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+5] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+5], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[7]);

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_NETSTAT;
	strcpy((char *)sql_str,"Select * from INV_NETSTATAB where newtag=1");
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[8]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for netstatdb
		if(first==0)
		{
			delete []netstatdb;
			RecordNum[8]=rec_number;
			netstatdb = new BSTR[12*rec_number];
			first=1;
		}

		//put the records queried from db to netstatdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_netstat.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12], (unsigned char *)pKey);
			SysFreeString(tempbstr);


			tempbstr = MakeWideStrFromAnsi((char *)(ret_records+i)->table_inv_netstat.netstat_time);
			netstatdb[j*12+1] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_netstat.netstat_ip_addr);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			netstatdb[j*12+2] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_netstat.netstat_mask);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			netstatdb[j*12+3] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_netstat.netstat_mac_addr, 
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi((char *)tempstr);
			netstatdb[j*12+4] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_rcv_byte,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+5] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+5], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_send_byte,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+6] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+6], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_rcv_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+7] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+7], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_send_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+8] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+8], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_discard_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+9] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+9], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_unknown_protocol,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+10] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+10], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_error_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+11] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+11], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[8]);


m_pIobject_mm->Release();	
return S_OK;
}

//****************************************************
//*CINV_s_sObj::SelectDyn1		                     *
//*Function:                                         *
//*   search db dynamically							 *
//*Call format:										 *
//*CINV_s_sObj::SelectDyn1()							 *
//*Output:											 *
//*   success of failure on searching database		 *
//*Procedure called:                                 *
//*   INV CSCI: search db dynamically				 * 
//****************************************************
STDMETHODIMP CInventoryObj::SelectDyn1()
{
	char sql_str[MAX_BUFFER];

	int				i;
    HRESULT hRes=Connect_To_DB();
	if(hRes!=S_OK)
	{
		RecordNum[0]=0;
		RecordNum[7]=0;
		return 501;
	}
	int				j,rec_number;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start,offset,first;
	char temp[10],IPMinstr[IP_LEN];

	//select each table
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;

	char tempstr[STR256];
	BSTR tempbstr;
	
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_MAP;
	strcpy((char *)sql_str, "Select * from INV_MAPTAB");
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED)
		{
			RecordNum[0]=0;
			if(hRes==1001)
				return S_OK;
			return 2005;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for mapdb
		if(first==0)
		{
			delete []mapdb;
			RecordNum[0]=rec_number;
			mapdb = new BSTR[4*rec_number];
			first=1;
		}

		//put the records queried from db to mapdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_map.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			mapdb[j*4]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_map.map_ip_addr);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			mapdb[j*4+1]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_map.map_hostname, 
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi((char *)tempstr);
			mapdb[j*4+2]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_map.map_available_flag,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			mapdb[j*4+3]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[0]);

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_STAT;
	strcpy((char *)sql_str,"Select * from INV_STATISTICSTAB where newtag=1");
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[7]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for statdb
		if(first==0)
		{
			delete []statdb;
			RecordNum[7]=rec_number;
			statdb=new BSTR[6*rec_number];
			first=1;
		}

		//put the records queried from db to statdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_stat.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			tempbstr = MakeWideStrFromAnsi((char *)(ret_records+i)->table_inv_stat.stat_time);
			statdb[j*6+1] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_stat.stat_proc_num,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+2] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			sprintf(temp,"%f",(ret_records+i)->table_inv_stat.stat_cpu_rate);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+3] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			sprintf(temp,"%f",(ret_records+i)->table_inv_stat.stat_mem_rate);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+4] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			sprintf(temp,"%f",(ret_records+i)->table_inv_stat.stat_fs_rate);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+5] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+5], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[7]);

	m_pIobject_mm->Release();	
	return S_OK;
}

//****************************************************
//*CINV_s_sObj::SelectDyn2		                     *
//*Function:                                         *
//*   search db dynamically							 *
//*Call format:										 *
//*CINV_s_sObj::SelectDyn2()						 *
//*Output:											 *
//*   success of failure on searching database		 *
//*Procedure called:                                 *
//*   INV CSCI: search db dynamically				 * 
//****************************************************
STDMETHODIMP CInventoryObj::SelectDyn2()
{
	char sql_str[MAX_BUFFER];

	int				i;
    HRESULT hRes=Connect_To_DB();
	if(hRes!=S_OK)
	{
		RecordNum[0]=0;
		RecordNum[8]=0;
		return 501;
	}
	int				j,rec_number;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start,offset,first;
	char temp[10],IPMinstr[IP_LEN];

	//select each table 
	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;

	char tempstr[STR256];
	BSTR tempbstr;

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_MAP;
	strcpy((char *)sql_str,"Select * from INV_MAPTAB");
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED)
		{
			RecordNum[0]=0;
			if(hRes==1001)
				return S_OK;
			return 2005;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for mapdb
		if(first==0)
		{
			delete []mapdb;
			RecordNum[0]=rec_number;
			mapdb = new BSTR[4*rec_number];
			first=1;
		}

		//put the records queried from db to mapdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_map.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			mapdb[j*4]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_map.map_ip_addr);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			mapdb[j*4+1]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_map.map_hostname, 
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi((char *)tempstr);
			mapdb[j*4+2]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_map.map_available_flag,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			mapdb[j*4+3]=SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr,  &mapdb[j*4+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[0]);

	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_NETSTAT;
	strcpy((char *)sql_str,"Select * from INV_NETSTATAB where newtag=1");
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[8]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for netstatdb
		if(first==0)
		{
			delete []netstatdb;
			RecordNum[8]=rec_number;
			netstatdb = new BSTR[12*rec_number];
			first=1;
		}

		//put the records queried from db to netstatdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_netstat.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12], (unsigned char *)pKey);
			SysFreeString(tempbstr);


			tempbstr = MakeWideStrFromAnsi((char *)(ret_records+i)->table_inv_netstat.netstat_time);
			netstatdb[j*12+1] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_netstat.netstat_ip_addr);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			netstatdb[j*12+2] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_netstat.netstat_mask);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			netstatdb[j*12+3] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_netstat.netstat_mac_addr, 
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi((char *)tempstr);
			netstatdb[j*12+4] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_rcv_byte,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+5] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+5], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_send_byte,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+6] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+6], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_rcv_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+7] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+7], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_send_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+8] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+8], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_discard_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+9] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+9], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_unknown_protocol,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+10] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+10], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_error_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+11] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+11], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[8]);

	m_pIobject_mm->Release();	
	return S_OK;
}

//****************************************************
//*CINV_s_sObj::Sel_NetChart	                     *
//*Function:                                         *
//*   search EndSystemID's Statistics				 *
//*Call format:										 *
//*CINV_s_sObj::Sel_NetChart(BSTR EndSystemID,		 *
//*					BSTR FromTime,BSTR ToTime)		 *
//*		EndSystemID : ID of EndSysstem				 *
//*		FromTime    : Select from this time			 *
//*		ToTime		: Select to this time			 *
//*Input:											 *
//*	  select condition
//*Output:											 *
//*   success of failure on searching database		 *
//*Procedure called:                                 *
//*   INV CSCI: search EndSystemID's Statistics		 * 
//****************************************************
STDMETHODIMP CInventoryObj::Sel_NetChart(BSTR EndSystemID, BSTR FromTime,BSTR ToTime)
{
	char sql_str[MAX_BUFFER];
	char tempstr[STR256];
	BSTR tempbstr;

	int				i;
    HRESULT hRes=Connect_To_DB();
	if(hRes!=S_OK)
	{
		RecordNum[8]=0;
		return 501;
	}
	int				j,rec_number;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start,offset,first;
	char temp[10],IPMinstr[IP_LEN];
	char IDstr[7],Fromstr[15],Tostr[15];

	WideCharToMultiByte(CP_ACP, 0, EndSystemID, -1, IDstr, 7, NULL, NULL);
	WideCharToMultiByte(CP_ACP, 0, FromTime, -1, Fromstr, 15, NULL, NULL);
	WideCharToMultiByte(CP_ACP, 0, ToTime, -1, Tostr, 15, NULL, NULL);
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_NETSTAT;
	in_table.encrypt_id=SetMask(2,3,0,0);
	//build SQL sentence 
	sprintf((char *)sql_str, "Select * from INV_NETSTATAB where EndSystemID=%s and StatisticsTime > '%s' and StatisticsTime<='%s'",IDstr,Fromstr,Tostr);
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[8]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for netstatdb
		if(first==0)
		{
			delete netstatdb;
			RecordNum[8]=rec_number;
			netstatdb = new BSTR[12*rec_number];
			first=1;
		}

		//put the records queried from db to netstatdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_netstat.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12], (unsigned char *)pKey);
			SysFreeString(tempbstr);


			tempbstr = MakeWideStrFromAnsi((char *)(ret_records+i)->table_inv_netstat.netstat_time);
			netstatdb[j*12+1] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_netstat.netstat_ip_addr);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			netstatdb[j*12+2] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			strcpy((char *)IPMinstr,(char *)(ret_records+i)->table_inv_netstat.netstat_mask);
			Tranvers_IP(IPMinstr);
			tempbstr = MakeWideStrFromAnsi(IPMinstr);
			netstatdb[j*12+3] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			DesStrDe((unsigned char *)(ret_records+i)->table_inv_netstat.netstat_mac_addr, 
					 (unsigned char *)tempstr, (unsigned char *)pKey);
			tempbstr = MakeWideStrFromAnsi((char *)tempstr);
			netstatdb[j*12+4] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_rcv_byte,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+5] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+5], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_send_byte,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+6] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+6], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_rcv_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+7] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+7], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_send_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+8] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+8], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_discard_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+9] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+9], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_unknown_protocol,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+10] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+10], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_netstat.netstat_error_packet,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			netstatdb[j*12+11] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &netstatdb[j*12+11], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[8]);

m_pIobject_mm->Release();	
return S_OK;
}

//****************************************************
//*CINV_s_sObj::Sel_StaChart	                     *
//*Function:                                         *
//*   search EndSystemID's Statistics				 *
//*Call format:										 *
//*CINV_s_sObj::Sel_StaChart(BSTR EndSystemID,		 *
//*					BSTR FromTime,BSTR ToTime)		 *
//*		EndSystemID : ID of EndSysstem				 *
//*		FromTime    : Select from this time			 *
//*		ToTime		: Select to this time			 *
//*Input:											 *
//*	  select condition
//*Output:											 *
//*   success of failure on searching database		 *
//*Procedure called:                                 *
//*   INV CSCI: search EndSystemID's Statistics		 * 
//****************************************************
STDMETHODIMP CInventoryObj::Sel_StaChart(BSTR EndSystemID, BSTR FromTime,BSTR ToTime)
{
	char sql_str[MAX_BUFFER];
	BSTR tempbstr;

	int				i;
    HRESULT hRes=Connect_To_DB();
	if(hRes!=S_OK)
	{
		RecordNum[7]=0;
		return 501;
	}
	int				j,rec_number;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;
	int				start,offset,first;
	char temp[10];
	char IDstr[7],Fromstr[15],Tostr[15];
	WideCharToMultiByte(CP_ACP, 0, EndSystemID, -1, IDstr, 7, NULL, NULL);
	WideCharToMultiByte(CP_ACP, 0, FromTime, -1, Fromstr, 15, NULL, NULL);
	WideCharToMultiByte(CP_ACP, 0, ToTime, -1, Tostr, 15, NULL, NULL);
	start = 0;
	offset = 0;
 	in_table.db_table_id = DB_INV | TABLE_INV_STAT;
	in_table.encrypt_id=SetMask(2,3,0,0);
	//build SQL sentence
	sprintf((char *)sql_str,"Select * from INV_STATISTICSTAB where EndSystemID=%s and StatisticsTime > '%s' and StatisticsTime<='%s'",IDstr,Fromstr,Tostr);
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
	first=0;
	do
	{
		start+=offset;
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);
		if (hRes != DB_SUCCEED){
			RecordNum[7]=0;
			first=1;
			offset=0;
			rec_number=0;
		}
		ret_records = (tables_union *)records.records_buf;
		//distribute a memory block for statdb
		if(first==0)
		{
			delete statdb;
			RecordNum[7]=rec_number;
			statdb=new BSTR[6*rec_number];
			first=1;
		}

		//put the records queried from db to statdb
		if(offset > 0){
		for(i=0,j=start;i<offset;i++,j++){
			_ltoa((ret_records+i)->table_inv_stat.endsystem_id,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			tempbstr = MakeWideStrFromAnsi((char *)(ret_records+i)->table_inv_stat.stat_time);
			statdb[j*6+1] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+1], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			itoa((ret_records+i)->table_inv_stat.stat_proc_num,temp,10);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+2] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+2], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			sprintf(temp,"%f",(ret_records+i)->table_inv_stat.stat_cpu_rate);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+3] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+3], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			sprintf(temp,"%f",(ret_records+i)->table_inv_stat.stat_mem_rate);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+4] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+4], (unsigned char *)pKey);
			SysFreeString(tempbstr);

			sprintf(temp,"%f",(ret_records+i)->table_inv_stat.stat_fs_rate);
			tempbstr = MakeWideStrFromAnsi(temp);
			statdb[j*6+5] = SysAllocStringByteLen(NULL, 256*2);
			DesBSTREn(tempbstr, &statdb[j*6+5], (unsigned char *)pKey);
			SysFreeString(tempbstr);
			}
		}
	}
	while(start+offset<RecordNum[7]);
m_pIobject_mm->Release();	
return S_OK;
}

//****************************************************
//*CINV_s_sObj::ReceiveMAP		                     *
//*Function:                                         *
//*   receive search result 						 *
//*Call format:										 *
//*CINV_s_sObj::ReceiveMAP(VARIANT FAR *oarray)		 *
//*	  oarray  : search result 						 *
//*Output:											 *
//*   search result									 *
//*Procedure called:                                 *
//*   INV CSCI: receive search result				 * 
//****************************************************
STDMETHODIMP CInventoryObj::ReceiveMAP(VARIANT FAR *oarray)
{
	BSTR *pbstr;
	SAFEARRAY FAR* psa = NULL;
	HRESULT hr;
	int i,count;
	count=RecordNum[0];

	psa = V_ARRAY(oarray);
	// Get a pointer to the elements of the array.
	hr=SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
	if (FAILED(hr))
		goto error;

	for (i=0;i<count;i++)	//put the data to variant
	{
		pbstr[i*4] = mapdb[i*4];
		pbstr[i*4+1] = mapdb[i*4+1];
		pbstr[i*4+2] = mapdb[i*4+2];
		pbstr[i*4+3] = mapdb[i*4+3];
	}
	
	hr=SafeArrayUnaccessData(psa);
	if (FAILED(hr))         
		goto error;

	return S_OK;
error:      
	eventinfo.flag = 1;
	eventinfo.EventID = 2005;
	ErrorProc(&eventinfo);
    return eventinfo.EventID;
}

//****************************************************
//*CINV_s_sObj::ReceiveCPU		                     *
//*Function:                                         *
//*   receive search result 						 *
//*Call format:										 *
//*CINV_s_sObj::ReceiveCPU(VARIANT FAR *oarray)		 *
//*	  oarray  : search result 						 *
//*Output:											 *
//*   search result									 *
//*Procedure called:                                 *
//*   INV CSCI: receive search result				 * 
//****************************************************
STDMETHODIMP CInventoryObj::ReceiveCPU(VARIANT FAR *oarray)
{
	BSTR HUGEP *pbstr;
	SAFEARRAY FAR* psa = NULL;
	HRESULT hr;
	int i,count;

	psa = V_ARRAY(oarray);

	// Get a pointer to the elements of the array.
	hr=SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
	if (FAILED(hr))         
		goto error;

	count=RecordNum[1];
	for (i=0;i<count;i++)		//put the data to variant
	{
		pbstr[i*5] = cpudb[i*5];
		pbstr[i*5+1] = cpudb[i*5+1];
		pbstr[i*5+2] = cpudb[i*5+2];
		pbstr[i*5+3] = cpudb[i*5+3];
		pbstr[i*5+4] = cpudb[i*5+4];
	}
	
	hr=SafeArrayUnaccessData(psa);
	if (FAILED(hr))         
		goto error;

	return S_OK;
error:      
	eventinfo.flag = 1;
	eventinfo.EventID = 2006;
	ErrorProc(&eventinfo);
    return eventinfo.EventID;
}

//****************************************************
//*CINV_s_sObj::ReceiveMEM		                     *
//*Function:                                         *
//*   receive search result 						 *
//*Call format:										 *
//*CINV_s_sObj::ReceiveMEM(VARIANT FAR *oarray)		 *
//*	  oarray  : search result 						 *
//*Output:											 *
//*   search result									 *
//*Procedure called:                                 *
//*   INV CSCI: receive search result				 * 
//****************************************************
STDMETHODIMP CInventoryObj::ReceiveMEM(VARIANT FAR *oarray)
{
	BSTR HUGEP *pbstr;
	SAFEARRAY FAR* psa = NULL;
	HRESULT hr;
	int i,count;

	psa = V_ARRAY(oarray);

	// Get a pointer to the elements of the array.
	hr=SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
	if (FAILED(hr))         
		goto error;

	count=RecordNum[2];
	for (i=0;i<count;i++)		//put the data to variant
	{
		pbstr[i*4] = memdb[i*4];
		pbstr[i*4+1] = memdb[i*4+1];
		pbstr[i*4+2] = memdb[i*4+2];
		pbstr[i*4+3] = memdb[i*4+3];
	}
	
	hr=SafeArrayUnaccessData(psa);
	if (FAILED(hr))         
		goto error;

	return S_OK;
error:      
	eventinfo.flag = 1;
	eventinfo.EventID = 2007;
	ErrorProc(&eventinfo);
    return eventinfo.EventID;
}

//****************************************************
//*CINV_s_sObj::ReceiveFILE		                     *
//*Function:                                         *
//*   receive search result 						 *
//*Call format:										 *
//*CINV_s_sObj::ReceiveFILE(VARIANT FAR *oarray)		 *
//*	  oarray  : search result 						 *
//*Output:											 *
//*   search result									 *
//*Procedure called:                                 *
//*   INV CSCI: receive search result				 * 
//****************************************************
STDMETHODIMP CInventoryObj::ReceiveFILE(VARIANT FAR *oarray)
{
	BSTR HUGEP *pbstr;
	SAFEARRAY FAR* psa = NULL;
	HRESULT hr;
	int i,count;

	psa = V_ARRAY(oarray);

	// Get a pointer to the elements of the array.
	hr=SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
	if (FAILED(hr))         
		goto error;

	count=RecordNum[3];
	for (i=0;i<count;i++)		//put the data to variant
	{
		pbstr[i*6] = filedb[i*6];
		pbstr[i*6+1] = filedb[i*6+1];
		pbstr[i*6+2] = filedb[i*6+2];
		pbstr[i*6+3] = filedb[i*6+3];
		pbstr[i*6+4] = filedb[i*6+4];
		pbstr[i*6+5] = filedb[i*6+5];
	}
	
	hr=SafeArrayUnaccessData(psa);
	if (FAILED(hr))         
		goto error;

	return S_OK;
error:      
	eventinfo.flag = 1;
	eventinfo.EventID = 2008;
	ErrorProc(&eventinfo);
    return eventinfo.EventID;
}

//****************************************************
//*CINV_s_sObj::ReceiveOS		                     *
//*Function:                                         *
//*   receive search result 						 *
//*Call format:										 *
//*CINV_s_sObj::ReceiveOS(VARIANT FAR *oarray)		 *
//*	  oarray  : search result 						 *
//*Output:											 *
//*   search result									 *
//*Procedure called:                                 *
//*   INV CSCI: receive search result				 * 
//****************************************************
STDMETHODIMP CInventoryObj::ReceiveOS(VARIANT FAR *oarray)
{
	BSTR HUGEP *pbstr;
	SAFEARRAY FAR* psa = NULL;
	HRESULT hr;
	int i,count;

	psa = V_ARRAY(oarray);

	// Get a pointer to the elements of the array.
	hr=SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
	if (FAILED(hr))         
		goto error;

	count=RecordNum[4];
	for (i=0;i<count;i++)		//put the data to variant
	{
		pbstr[i*6] = osdb[i*6];
		pbstr[i*6+1] = osdb[i*6+1];
		pbstr[i*6+2] = osdb[i*6+2];
		pbstr[i*6+3] = osdb[i*6+3];
		pbstr[i*6+4] = osdb[i*6+4];
		pbstr[i*6+5] = osdb[i*6+5];
	}
	
	hr=SafeArrayUnaccessData(psa);
	if (FAILED(hr))         
		goto error;

	return S_OK;
error:      
	eventinfo.flag = 1;
	eventinfo.EventID = 2009;
	ErrorProc(&eventinfo);
    return eventinfo.EventID;
}

//****************************************************
//*CINV_s_sObj::ReceiveDEVICE	                     *
//*Function:                                         *
//*   receive search result 						 *
//*Call format:										 *
//*CINV_s_sObj::ReceiveDEVICE(ARIANT FAR *oarray)	 *
//*	  oarray  : search result 						 *
//*Output:											 *
//*   search result									 *
//*Procedure called:                                 *
//*   INV CSCI: receive search result				 * 
//****************************************************
STDMETHODIMP CInventoryObj::ReceiveDEVICE(VARIANT FAR *oarray)
{
	BSTR HUGEP *pbstr;
	SAFEARRAY FAR* psa = NULL;
	HRESULT hr;
	int i,count;

	psa = V_ARRAY(oarray);

	// Get a pointer to the elements of the array.
	hr=SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
	if (FAILED(hr))         
		goto error;

	count=RecordNum[5];
	for (i=0;i<count;i++)		//put the data to variant
	{
		pbstr[i*8] = devicedb[i*8];
		pbstr[i*8+1] = devicedb[i*8+1];
		pbstr[i*8+2] = devicedb[i*8+2];
		pbstr[i*8+3] = devicedb[i*8+3];
		pbstr[i*8+4] = devicedb[i*8+4];
		pbstr[i*8+5] = devicedb[i*8+5];
		pbstr[i*8+6] = devicedb[i*8+6];
		pbstr[i*8+7] = devicedb[i*8+7];
	}
	
	hr=SafeArrayUnaccessData(psa);
	if (FAILED(hr))         
		goto error;

	return S_OK;
error:      
	eventinfo.flag = 1;
	eventinfo.EventID = 2010;
	ErrorProc(&eventinfo);
    return eventinfo.EventID;
}

//****************************************************
//*CINV_s_sObj::ReceiveNETWORK	                     *
//*Function:                                         *
//*   receive search result 						 *
//*Call format:										 *
//*CINV_s_sObj::ReceiveNETWORK(VARIANT FAR *oarray)	 *
//*	  oarray  : search result 						 *
//*Output:											 *
//*   search result									 *
//*Procedure called:                                 *
//*   INV CSCI: receive search result				 * 
//****************************************************
STDMETHODIMP CInventoryObj::ReceiveNETWORK(VARIANT FAR *oarray)
{
	BSTR HUGEP *pbstr;
	SAFEARRAY FAR* psa = NULL;
	HRESULT hr;
	int i,count;

	psa = V_ARRAY(oarray);

	// Get a pointer to the elements of the array.
	hr=SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
	if (FAILED(hr))         
		goto error;

	count=RecordNum[6];
	for (i=0;i<count;i++)		//put the data to variant
	{
		pbstr[i*8] = networkdb[i*8];
		pbstr[i*8+1] = networkdb[i*8+1];
		pbstr[i*8+2] = networkdb[i*8+2];
		pbstr[i*8+3] = networkdb[i*8+3];
		pbstr[i*8+4] = networkdb[i*8+4];
		pbstr[i*8+5] = networkdb[i*8+5];
		pbstr[i*8+6] = networkdb[i*8+6];
		pbstr[i*8+7] = networkdb[i*8+7];
	}
	
	hr=SafeArrayUnaccessData(psa);
	if (FAILED(hr))         
		goto error;

	return S_OK;
error:      
	eventinfo.flag = 1;
	eventinfo.EventID = 2011;
	ErrorProc(&eventinfo);
    return eventinfo.EventID;
}

//****************************************************
//*CINV_s_sObj::ReceiveSTAT		                     *
//*Function:                                         *
//*   receive search result 						 *
//*Call format:										 *
//*CINV_s_sObj::ReceiveSTAT(VARIANT FAR *oarray)	 *
//*	  oarray  : search result 						 *
//*Output:											 *
//*   search result									 *
//*Procedure called:                                 *
//*   INV CSCI: receive search result				 * 
//****************************************************
STDMETHODIMP CInventoryObj::ReceiveSTAT(VARIANT FAR *oarray)
{
	BSTR HUGEP *pbstr;
	SAFEARRAY FAR* psa = NULL;
	HRESULT hr;
	int i,count;

	psa = V_ARRAY(oarray);

	// Get a pointer to the elements of the array.
	hr=SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
	if (FAILED(hr))         
		goto error;

	count=RecordNum[7];
	for (i=0;i<count;i++)		//put the data to variant
	{
		pbstr[i*6] = statdb[i*6];
		pbstr[i*6+1] = statdb[i*6+1];
		pbstr[i*6+2] = statdb[i*6+2];
		pbstr[i*6+3] = statdb[i*6+3];
		pbstr[i*6+4] = statdb[i*6+4];
		pbstr[i*6+5] = statdb[i*6+5];
	}
	
	hr=SafeArrayUnaccessData(psa);
	if (FAILED(hr))         
		goto error;

	return S_OK;
error:      
	eventinfo.flag = 1;
	eventinfo.EventID = 2012;
	ErrorProc(&eventinfo);
    return eventinfo.EventID;
}

//****************************************************
//*CINV_s_sObj::ReceiveNETSTAT	                     *
//*Function:                                         *
//*   receive search result 						 *
//*Call format:										 *
//*CINV_s_sObj::ReceiveNETSTAT(VARIANT FAR *oarray)	 *
//*	  oarray  : search result 						 *
//*Output:											 *
//*   search result									 *
//*Procedure called:                                 *
//*   INV CSCI: receive search result				 *
//****************************************************
STDMETHODIMP CInventoryObj::ReceiveNETSTAT(VARIANT FAR *oarray)
{
	BSTR HUGEP *pbstr;
	SAFEARRAY FAR* psa = NULL;
	HRESULT hr;
	int i,count;

	psa = V_ARRAY(oarray);

	// Get a pointer to the elements of the array.
	hr=SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
	if (FAILED(hr))         
		goto error;

	count=RecordNum[8];
	for (i=0;i<count;i++)		//put the data to variant
	{
		pbstr[i*12] = netstatdb[i*12];
		pbstr[i*12+1] = netstatdb[i*12+1];
		pbstr[i*12+2] = netstatdb[i*12+2];
		pbstr[i*12+3] = netstatdb[i*12+3];
		pbstr[i*12+4] = netstatdb[i*12+4];
		pbstr[i*12+5] = netstatdb[i*12+5];
		pbstr[i*12+6] = netstatdb[i*12+6];
		pbstr[i*12+7] = netstatdb[i*12+7];
		pbstr[i*12+8] = netstatdb[i*12+8];
		pbstr[i*12+9] = netstatdb[i*12+9];
		pbstr[i*12+10] = netstatdb[i*12+10];
		pbstr[i*12+11] = netstatdb[i*12+11];
	}
	
	hr=SafeArrayUnaccessData(psa);
	if (FAILED(hr))         
		goto error;

	return S_OK;
error:      
	eventinfo.flag = 1;
	eventinfo.EventID = 2013;
	ErrorProc(&eventinfo);
    return eventinfo.EventID;
}

//****************************************************
//*CINV_s_sObj::ReceiveCONDEV	                     *
//*Function:                                         *
//*   receive search result 						 *
//*Call format:										 *
//*CINV_s_sObj::ReceiveCONDEV(VARIANT FAR *oarray)	 *
//*	  oarray  : search result 						 *
//*Output:											 *
//*   search result									 *
//*Procedure called:                                 *
//*   INV CSCI: receive search result				 * 
//****************************************************
STDMETHODIMP CInventoryObj::ReceiveCONDEV(VARIANT FAR *oarray)
{
	BSTR HUGEP *pbstr;
	SAFEARRAY FAR* psa = NULL;
	HRESULT hr;
	int i,count;

	psa = V_ARRAY(oarray);

	// Get a pointer to the elements of the array.
	hr=SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
	if (FAILED(hr))         
		goto error;
	count=RecordNum[9];
	for (i=0;i<count;i++)		//put the data to variant
	{
		pbstr[i*9]=condevdb[i*9];
		pbstr[i*9+1]=condevdb[i*9+1];
		pbstr[i*9+2]=condevdb[i*9+2];
		pbstr[i*9+3]=condevdb[i*9+3];
		pbstr[i*9+4]=condevdb[i*9+4];
		pbstr[i*9+5]=condevdb[i*9+5];
		pbstr[i*9+6]=condevdb[i*9+6];
		pbstr[i*9+7]=condevdb[i*9+7];
		pbstr[i*9+8]=condevdb[i*9+8];
		
	}
	
	hr=SafeArrayUnaccessData(psa);
	if (FAILED(hr))         
		goto error;

	return S_OK;
error:
	eventinfo.flag = 1;
	eventinfo.EventID = 2014;
	ErrorProc(&eventinfo);
    return eventinfo.EventID;
}


//***************************************************************
//ModifyMap
//		Modify the map link 
//parameters
//		<in> result		pointer of MAPdb
//		<in> thenum		no useful
//return
//		S_OK
//comments
//		Call this function after call Put_MAPInfo().
//		If the endsystem isn't in the map link, add this endsystem
//		to map link.
//****************************************************************
STDMETHODIMP CInventoryObj::ModifyMap(MAPdb *result, int thenum)
{

	if(MAPL->SearchNode (result->ID) == NULL)
	{
	    MAPL->AddNode (result);
	}

	return S_OK;
}


/********************************************************
*check:                                                 *
*   check the caller's permission                       *
*para.                                                  *
* UserName caller's username                            *
* permission 1 caller has the access.                   *
*    0 caller hasn't the access.                        *
*    -1 errors occurred.                                *
*********************************************************/
extern int CheckAccess(long service_id, BSTR user_name);
STDMETHODIMP CInventoryObj::Check(BSTR UserName, int *permission)
{
	*permission=CheckAccess(INV_S_ID,UserName);
 
	//call the event-service method to report events occurred.
	switch(*permission)
	{
		case 1:
			break;
		case 0:
			eventinfo.flag=1;
			eventinfo.EventID=800;
			ErrorProc(&eventinfo);
			return eventinfo.EventID;
		case -1:
			eventinfo.flag=1;
			eventinfo.EventID=506;
			ErrorProc(&eventinfo);
			return eventinfo.EventID;
		default:
		break;
	}

	return S_OK;
}

//**************************************************************
//QueryFromNet                                                 
//		Finish the Query from NetService   
//parameters
//		<in> IPAdress		BSTR of ipaddress
//		<in,out> HostName	pointer of a BSTR of hostname
//		<in,out> OSType		pointer of a BSTR of ostype                    
//return                                                      
//		If succeed,return S_OK;or return error code
//comments
//		Query hostname and ostype from db basis on corresponding ipaddress 
//		that provided by Netservice.                 
//**************************************************************
STDMETHODIMP CInventoryObj::QueryFromNet(BSTR IPAddress, BSTR *HostName, BSTR *OSType)
{
	char IpAddr[IP_LEN], Host[STR128], OS[STR32];
	char sql_str[MAX_BUFFER];
	long ID;

	HRESULT hRes;
	hRes = Connect_To_DB();
	if(hRes!=DB_SUCCEED)
		return 501;

	WideCharToMultiByte(CP_ACP, 0, IPAddress, -1, IpAddr, 16, NULL, NULL);
    Transform_IP(IpAddr);
	int				rec_number = 0;
	int				start = 0;
	int				offset=0;
	db_table		in_table;
	tab_record		records;
	tables_union	*ret_records;

	in_table.db_operation = SELECT;
	in_table.encrypt_id = 0;
	//query map table basis on ipaddr, get endsystemid  and hostname
	in_table.db_table_id = DB_INV | TABLE_INV_MAP;
	in_table.encrypt_id=SetMask(1,0,0,0);
	sprintf((char *)sql_str, "Select * from INV_MAPTAB where IpAddress=\"%s\"", IpAddr);
	DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);

	hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);

	ret_records = (tables_union *)records.records_buf;

	if((rec_number>0) && (ret_records->table_inv_map.map_available_flag!=0))
	{
		ID = ret_records->table_inv_map.endsystem_id;
		DesStrDe((unsigned char *)ret_records->table_inv_map.map_hostname, (unsigned char *)Host, (unsigned char *)pKey);

		//query os table basis on endsystemid, get ostype
		start = 0; offset = 0; rec_number = 0;
		in_table.db_table_id = DB_INV | TABLE_INV_OS;
		sprintf((char *)sql_str, "Select * from INV_OSTAB where EndSystemID=%d", ID);
		DesStrEn((unsigned char *)sql_str, (unsigned char *)in_table.sql_statement, (unsigned char *)pKey);
		hRes = m_pIobject_mm->av_dbsql(&in_table,&records,&rec_number,&offset,start);      
		
		ret_records = (tables_union *)records.records_buf;
		if(rec_number > 0)
		{
			DesStrDe((unsigned char *)ret_records->table_inv_os.os_type, (unsigned char *)OS, (unsigned char *)pKey);
		}
		else
			strcpy((char *)OS, "");
	}
	else
	{
		strcpy((char *)Host, "");
		strcpy((char *)OS, "");
	}

	//encrypt hostname and ostype, export to Netservice
	BSTR wHost, wOS, des_HostName, des_OSTpye;
	wHost =MakeWideStrFromAnsi(Host);
 	wOS = MakeWideStrFromAnsi(OS);
	des_HostName=SysAllocStringByteLen(NULL, 32*2);
	des_OSTpye=SysAllocStringByteLen(NULL, 32*2);
	DesBSTREn(wHost, &des_HostName, (unsigned char *)pKey);
	DesBSTREn(wOS,  &des_OSTpye, (unsigned char *)pKey);

	*HostName = des_HostName;
	*OSType = des_OSTpye;

	SysFreeString(wHost); SysFreeString(wOS);

	m_pIobject_mm->Release();
	return S_OK;
}

//*********************************************************
//SendCryptkey                                            
//		Send the crypted public key to agent 
//parameters
//		<in> inbstr			input BSTR(encrypted agent ip)
//		<in,out> outbstr	encrypted public key             
//return                                                  
//		If succeed, return S_OK;else, return S_FALSE.
//comments
//		Agent must call this interface function to get the public key for
//		communicating with service.                        
//*********************************************************
STDMETHODIMP CInventoryObj::SendCryptKey(BSTR inbstr, BSTR *outbstr)
{
	unsigned int i=0;

	if(pKey[0]!=0 && pKey[1]!=0 && pKey[2]!=0 && pKey[3]!=0
		   && pKey[4]!=0 && pKey[5]!=0 && pKey[6]!=0 && pKey[7]!=0)
	return 2;	//return error because the pKey is error.

	//get local ipaddr, and encrypt it by MD5
	char localip[IP_LEN],md5_localip[MD5KLEN];
	unsigned int size = IP_LEN;
	c_GetIpAddr(localip, &size);
	i = md5hash((unsigned char *)localip,strlen(localip), (unsigned char *)md5_localip);
	if(i!=0)
		return S_FALSE; 

	//decrypt, get the agent ipaddr
	BSTR wagent_ip=BSTRAS;
	char agentip[IP_LEN];
	i = DesBSTRDe(inbstr, &wagent_ip, (unsigned char *)md5_localip);
	if(i!=0)
		return S_FALSE;

	WideCharToMultiByte(CP_ACP, 0, wagent_ip, -1, agentip, IP_LEN, NULL, NULL);

	//encrypt the agent ipaddr by MD5
	char md5_agentip[MD5KLEN];
	i = md5hash((unsigned char *)agentip, strlen(agentip), (unsigned char *)md5_agentip);
	if(i!=0)
		return S_FALSE;

	//encrypt public key
	BSTR wPublicKey=BSTRAS, des_PublicKey=BSTRAS;
	wPublicKey=MakeWideStrFromAnsi((char *)pKey);
	i = DesBSTREn(wPublicKey, &des_PublicKey, (unsigned char *)md5_agentip);
	if(i!=0)
		return S_FALSE;

	*outbstr = des_PublicKey;	//export encrypted public key

	return S_OK;
}