?? c_share_info.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 + -