⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_share_info.cpp

📁 HP共享内存实现,只要将sql语句配置好,装载共享内存即可
💻 CPP
字号:
/***********************************************************************
 * Module:  c_share_info.cpp
 * Author:  Administrator
 * Modified: 2005年9月15日 10:37:23
 * Purpose: Implementation of the class c_share_info
 * Comment: 共享内存信息配置类. 用于将数据库中查询到的信息进行整理, 保存在各个结构中去。并可以进行查询。要提供查找的方法.这是一个基础类, 其它很多模块都要用到。
 ***********************************************************************/

#include "c_share_info.h"

//按MEM_AREA_NO排序的比较
bool lessByMEM_AREA_NO(const SHARE_MEM_INFO& tmp1,const SHARE_MEM_INFO& tmp2)
{
	return tmp1.mem_area_no < tmp2.mem_area_no; 
}

//按SHARE_AREA_ID排序的比较
bool lessBySHARE_AREA_ID(const SHARE_MEM_INFO& tmp1,const SHARE_MEM_INFO& tmp2)
{
	return tmp1.share_area_id < tmp2.share_area_id;
}

//按MEM_NAME排序的比较
bool lessByName1(const SHARE_MEM_INFO& tmp1,const SHARE_MEM_INFO& tmp2)
{
	int t = strcmp(tmp1.mem_name , tmp2.mem_name);
	return t<0?1:0;   
}

bool lessByName2(const SELECT_SQL_INFO& tmp1,const SELECT_SQL_INFO& tmp2)
{
	int t = strcmp(tmp1.mem_name , tmp2.mem_name);
	return t<0?1:0;   
}

bool lessByName3(const MEM_FIELD_INFO& tmp1,const MEM_FIELD_INFO& tmp2)
{
	int t = strcmp(tmp1.mem_name , tmp2.mem_name);
	return t<0?1:0;   
}

//按SELECT_NO和FIELD_SEQ排序的比较
bool lessBySELECT_NOandFIELD_SEQ( const MEM_FIELD_INFO& tmp1,const MEM_FIELD_INFO& tmp2)
{
	if( tmp1.select_no == tmp2.select_no )
		return tmp1.field_seq < tmp2.field_seq;
	else
		return tmp1.select_no < tmp2.select_no;
}

//只以SELECT_NO的比较
bool lessBySELECT_NO( const MEM_FIELD_INFO& tmp1,const MEM_FIELD_INFO& tmp2)
{
	return tmp1.select_no < tmp2.select_no;
}

bool lessEventAttrByName(const EVENT_ATTR& tmp1,const EVENT_ATTR& tmp2)
{
	int t = strcmp(tmp1.attr_name, tmp2.attr_name); 
	return t<0?1:0;   
}

////////////////////////////////////////////////////////////////////////
// Name:       c_share_info::getMemInfo()
// Purpose:    Implementation of c_share_info::getMemInfo()
// Return:     share_mem_info*
// Comment:    根据MEM_AREA_NO排序,由MEM_AREA_NO快速得到对应的内存块信息
////////////////////////////////////////////////////////////////////////
SHARE_MEM_INFO* c_share_info::getMemInfo(int t_mem_area_no)
{
	sort(v_share_info.begin(), v_share_info.end(),  lessByMEM_AREA_NO);
	SHARE_MEM_INFO search;
	search.mem_area_no = t_mem_area_no;
	vector<SHARE_MEM_INFO>::const_iterator vi = lower_bound(v_share_info.begin(), v_share_info.end(), search, lessByMEM_AREA_NO );

    if ( (vi == v_share_info.end()) || t_mem_area_no != (vi)->mem_area_no )
    {
        return NULL;
    }
    return (SHARE_MEM_INFO*)&*vi;
}

////////////////////////////////////////////////////////////////////////
// Name:       c_share_info::getMemInfo()
// Purpose:    Implementation of c_share_info::getMemInfo()
// Return:     share_mem_info*
// Comment:    根据MEM_NAME排序,由MEM_NAME快速得到对应内存块信息
////////////////////////////////////////////////////////////////////////
SHARE_MEM_INFO* c_share_info::getMemInfo( const char* t_mem_name )
{
	sort(v_share_info.begin(), v_share_info.end(),  lessByName1);
	SHARE_MEM_INFO search;
	strcpy(search.mem_name,t_mem_name);
	vector<SHARE_MEM_INFO>::const_iterator vi = lower_bound(v_share_info.begin(), v_share_info.end(), search, lessByName1);
	if( ( vi == v_share_info.end()) || strcmp(search.mem_name,(vi)->mem_name) != 0)
	{
		return  NULL;
	}
	return (SHARE_MEM_INFO*)&*vi;
}


////////////////////////////////////////////////////////////////////////
// Name:       c_share_info::getMemInfoByShareAreaId()
// Purpose:    Implementation of c_share_info::getMemInfoByShareAreaId()
// Retrun      void
// Comment:    根据SHARE_AREA_ID排序,由SHARE_AREA_ID快速得到一组内存块信息,存入v_mem_out中
////////////////////////////////////////////////////////////////////////
void c_share_info::getMemInfoByShareAreaId(int t_share_area_id, vector<SHARE_MEM_INFO>& v_mem_out){
	 
	 sort(v_share_info.begin(), v_share_info.end(),lessBySHARE_AREA_ID);
	 
	 SHARE_MEM_INFO search;
	 search.share_area_id = t_share_area_id;
	 
	 	vector<SHARE_MEM_INFO>::iterator item;
	typedef vector<SHARE_MEM_INFO>::iterator SHARE_MEM_INFO_ITERATOR;
	pair<SHARE_MEM_INFO_ITERATOR, SHARE_MEM_INFO_ITERATOR> p_pair;
	
	p_pair = equal_range( v_share_info.begin(), v_share_info.end(), search, lessBySHARE_AREA_ID );
	v_mem_out.clear();
	if( p_pair.first != p_pair.second )
	{		
		for( item = p_pair.first; item< p_pair.second; item++)
		{
			v_mem_out.push_back( *(item) );
		}
	}
	
}

////////////////////////////////////////////////////////////////////////
// Name:       c_share_info::getMemCountByShareAreaId()
// Purpose:    Implementation of c_share_info::getMemCountByShareAreaId()
// Retrun      int
// Comment:    根据SHARE_AREA_ID排序,由SHARE_AREA_ID快速得到其含有的内存块数
////////////////////////////////////////////////////////////////////////
int c_share_info::getMemCountByShareAreaId(int t_share_area_id)
{
	sort(v_share_info.begin(), v_share_info.end(),lessBySHARE_AREA_ID);
	SHARE_MEM_INFO search;
	search.share_area_id = t_share_area_id;
	int amount = 0;
	vector<SHARE_MEM_INFO>::iterator item;
	typedef vector<SHARE_MEM_INFO>::iterator SHARE_MEM_INFO_ITERATOR;
	pair<SHARE_MEM_INFO_ITERATOR, SHARE_MEM_INFO_ITERATOR> p_pair;
	
	p_pair = equal_range( v_share_info.begin(), v_share_info.end(), search, lessBySHARE_AREA_ID );
	
	if( p_pair.first != p_pair.second )
	{		
		for( item = p_pair.first; item< p_pair.second; item++)
		{
			amount++;
		}
		
	}
	return amount;
}
////////////////////////////////////////////////////////////////////////
// Name:       c_share_info::getSqlInfo()
// Purpose:    Implementation of c_share_info::getSqlInfo()
// Return:     void
// Comment:    根据MEM_NAME排序,由MEM_NAME得到对应内存块中含有的所有SQL信息,存入v_sql_out中
////////////////////////////////////////////////////////////////////////

void c_share_info::getSqlInfo( const char* t_mem_name, vector<SELECT_SQL_INFO>& v_sql_out )
{
  sort(v_sql_info.begin(),v_sql_info.end(),lessByName2);
  SELECT_SQL_INFO search;

  strcpy( search.mem_name, t_mem_name );

	vector<SELECT_SQL_INFO>::iterator item;
	typedef vector<SELECT_SQL_INFO>::iterator SELECT_SQL_INFO_ITERATOR;
	pair<SELECT_SQL_INFO_ITERATOR, SELECT_SQL_INFO_ITERATOR> p_pair;
	
	v_sql_out.clear();
	
	p_pair = equal_range( v_sql_info.begin(), v_sql_info.end(), search, lessByName2 );
	if( p_pair.first != p_pair.second )
	{
		
		for( item = p_pair.first; item< p_pair.second; item++)
		{
			v_sql_out.push_back( *(item) );
		}
	}

}
////////////////////////////////////////////////////////////////////////
// Name:       c_share_info::getFieldInfo()
// Purpose:    Implementation of c_share_info::getFieldInfo()
// Return:     void
// Comment:    根据SELECT_NO和FIELD_SEQ排序,由SELECT_NO得到对应SQL中所有的字段信息,存入v_field_out中
////////////////////////////////////////////////////////////////////////
void c_share_info::getFieldInfo(  const int t_select_no, vector <MEM_FIELD_INFO>& v_field_out )
{
	sort(v_field_info.begin(),v_field_info.end(),lessBySELECT_NOandFIELD_SEQ);
	MEM_FIELD_INFO search;

	search.select_no = t_select_no; 

	vector<MEM_FIELD_INFO>::iterator item;
	typedef vector<MEM_FIELD_INFO>::iterator MEM_FIELD_INFO_ITERATOR;
	pair<MEM_FIELD_INFO_ITERATOR, MEM_FIELD_INFO_ITERATOR> p_pair;
	
	v_field_out.clear();
	
	p_pair = equal_range( v_field_info.begin(), v_field_info.end(), search, lessBySELECT_NO );
	if( p_pair.first != p_pair.second )
	{
		
		for( item = p_pair.first; item< p_pair.second; item++)
		{
			v_field_out.push_back( *(item) );
		}
	}
}

////////////////////////////////////////////////////////////////////////
// Name:       c_share_info::getShareID()
// Purpose:    Implementation of c_share_info::getShareID()
// Return:     int
// Comment:    通过访问数据库根据共享内存的名字得到共享内存的ID
////////////////////////////////////////////////////////////////////////
int c_share_info::getShareID(const char* t_share_area_name)
{
	int share_area_id = -1 ;
	try{
	
	string sql = " select share_area_id from share_area where share_area_name = :v " ;
	g_statement.setSQLString(sql);
	g_statement << t_share_area_name ;
	g_statement.execute();
	g_statement >> share_area_id;
	return share_area_id;
  }catch(Exception ex)
  { cout << ex.what() << endl;}
  	
}

////////////////////////////////////////////////////////////////////////
// Name:       c_share_info::loadAllInfo()
// Purpose:    Implementation of c_share_info::loadAllInfo()
// Return:     void
// Comment:    将所有配置信息加载,分别存入v_share_info,v_sql_info和v_field_info中
////////////////////////////////////////////////////////////////////////
void c_share_info::loadAllInfo()
{ 
	v_share_info.clear();
	v_sql_info.clear();
	v_field_info.clear();
	try 
	{
   
//查询共享内存块的信息
		string sql = " select  a.MEM_AREA_NO,"
							   " a.MEM_NAME,"
						     " a.BYTE_SIZE,"
							   " a.SHARE_AREA_ID,"
							   " a.MEM_SEQ ,"
							   " b.SHARE_AREA_NAME,"
							   " a.APPLICATION,"
							   " a.BLOCK_SIZE,"
							   " a.MEM_KIND,"
							   " a.INDEX_KIND,"
							   " a.FILE_NAME,"
							   " a.ELEMENT_SIZE,"
							   " a.ADDITION_SIZE"
							   " from MEM_AREA_NO a, SHARE_AREA b where a.SHARE_AREA_ID = b.SHARE_AREA_ID";

		g_statement.setSQLString(sql);
		g_statement.execute();
		SHARE_MEM_INFO temp1;
		char field2[400];
    temp1.field_count = 0;//field_count's default value is 0
		while( g_statement 
				>> temp1.mem_area_no 
				>> temp1.mem_name 
				>> temp1.mem_size 
				>> temp1.share_area_id 
				>> temp1.share_area_seq
				>> temp1.share_area_name
				>> temp1.application_kind 
				>> temp1.block_size 
				>> temp1.mem_kind 
				>> temp1.index_kind 
				>> temp1.file_name 
				>> temp1.element_size
				>> temp1.addition_size)
		{
      		v_share_info.push_back(temp1);
		}

//查询sql语句的信息
		sql = " select a.MEM_AREA_NO,"
						" a.MEM_NAME,"
						" b.CONDITION,"
						" b.FROM_SQL,"
						" b.SELECT_NO"
						" from MEM_AREA_NO a,SELECT_NO b "
						" where a.MEM_AREA_NO = b.MEM_AREA_NO ";

		g_statement.setSQLString( sql );
		g_statement.execute();

		SELECT_SQL_INFO temp2;
		strcpy(temp2.sql_str,"");//sql_str's default value is ""
		while( g_statement 
		        >> temp2.mem_area_no 
						>> temp2.mem_name 
						>> temp2.condition
						>> temp2.from_sql
						>> temp2.select_no)
		{
	    		v_sql_info.push_back(temp2);	
		}

    int length;
    sql = " select a.MEM_AREA_NO,"
					" a.MEM_NAME,"
					" d.TYPE_SIZE,"
					" c.DATA_TYPE_ID,"
					" c.EVENT_ATTR_ID,"
					" c.SQL_STMT,"
					" c.SELECT_NO,"
					" c.FIELD_SEQ, "
					" c.FIELD_SIZE "
					" from MEM_AREA_NO a,SELECT_NO b,MEM_FIELD c,DATA_TYPE d"
					" where a.MEM_AREA_NO = b.MEM_AREA_NO and b.SELECT_NO = c.SELECT_NO and c.data_TYPE_ID = d.DATA_TYPE_ID " ;
		g_statement.setSQLString( sql );
		g_statement.execute();
		MEM_FIELD_INFO temp3;
		temp3.field_pos = 0;//field_pos's default value is 0
		while( g_statement 
		        >> temp3.mem_area_no 
						>> temp3.mem_name 
						>> temp3.field_size 
						>> temp3.field_type 
						>> temp3.event_attr_id
						>> temp3.field_sql
						>> temp3.select_no
						>> temp3.field_seq
						>> length)
		{	
			if( temp3.field_type == 1 )
			{
				temp3.field_size = length;
			}
			v_field_info.push_back(temp3);	
		}

		sql = "select event_attr_id, lower(en_name) from event_attr order by 2" ;
		g_statement.setSQLString( sql );
		g_statement.execute();
		EVENT_ATTR tmp4;
		v_event_attr.clear();
		while( g_statement 
		        >> tmp4.attr_id
		        >> tmp4.attr_name)
		{	
			v_event_attr.push_back(tmp4);	
		}
	
	}
	catch ( Exception& ex )
	{
		cout<<ex.what()<<endl;
	}
}

int c_share_info::getEventAttrIDByName( const char* event_name )
{
	EVENT_ATTR tmp;
	strcpy( tmp.attr_name, event_name );
	vector<EVENT_ATTR>::iterator item;
	item = lower_bound( v_event_attr.begin(), v_event_attr.end(), tmp, lessEventAttrByName );
	if( item == v_event_attr.end() || ( strcmp( item->attr_name, event_name ) != 0 ) )
		return -1;
	else
		return item->attr_id;
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -