?? c_shm_mem.cpp
字號:
/***********************************************************************
* Module: c_shm_mem.cpp
* Author: Administrator
* Modified: 2005年9月15日 9:03:22
* Purpose: Implementation of the class c_shm_mem
* Comment: 共享內存基本類
***********************************************************************/
#include "c_shm_mem.h"
////////////////////////////////////////////////////////////////////////
// Name: c_shm_mem::c_shm_mem()
// Purpose: 構造函數
// Comment: 創建c_share_info對象
// Return:
////////////////////////////////////////////////////////////////////////
c_shm_mem::c_shm_mem()
{
p_share_info = new c_share_info();
p_share_info->loadAllInfo();
}
////////////////////////////////////////////////////////////////////////
// Name: c_shm_mem::~c_shm_mem()
// Purpose: 析構函數
// Comment: 刪除c_share_info對象
// Return:
////////////////////////////////////////////////////////////////////////
c_shm_mem::~c_shm_mem()
{
delete p_share_info;
}
/*void c_shm_mem::init( char* mem_name )
{
SHARE_MEM_INFO* tmp = p_share_info->getMemInfo( mem_name);
if( tmp == NULL )
{
printf("不存在%s的共享內存\n", mem_name );fflush(stdout);
exit(1);
}
c_shm newshm(tmp->share_area_id);
newshm.getshm();
c_shm_mem* newmem = newshm.get_mem(mem_name);
p_share_mem_info = newmem->p_share_mem_info;
p_stShareInfo = newmem->p_stShareInfo;
p_field_info = newmem->p_field_info;
head_point = newmem->head_point;
append_mutex._mutex = newmem->append_mutex._mutex;
record_count_mutex._mutex = newmem->record_count_mutex._mutex;
v_update_mutex.clear();
for( int i = 0 ; i < newmem->p_stShareInfo->block_count ; i ++ )
{
c_mutex t_mutex;
t_mutex._mutex = &(newmem->p_stShareInfo->update_lock[i]);
v_update_mutex.push_back( t_mutex );
}
append_key_mutex._mutex = newmem->append_key_mutex._mutex;
//拷貝路徑
strcpy(file_path, newmem->file_path );
}*/
////////////////////////////////////////////////////////////////////////
// Name: c_shm_mem::loadSQL()
// Purpose: 加載SQL信息
// Comment: 從c_share_info對象中加載SQL信息
// Return: int
////////////////////////////////////////////////////////////////////////
int c_shm_mem::loadSQL()
{
//theLog<<"mem_area_name:"<<p_share_mem_info->mem_name<<endi;
p_share_info->getSqlInfo( p_share_mem_info->mem_name , v_sql_info );
return 0;
}
////////////////////////////////////////////////////////////////////////
// Name: c_shm_mem::loadFieldInfo()
// Purpose: 加載字段信息
// Comment: 從c_share_info對象中加載字段信息
// Return: int
////////////////////////////////////////////////////////////////////////
int c_shm_mem::loadFieldInfo( )
{
if( v_sql_info.size() <= 0 )
{
theLog<<"未加載SQL信息!"<<endi;
return errNotloadSQL;
}
//取第一個的sql語句
int select_no = v_sql_info[0].select_no;
//取得字段信息
p_share_info->getFieldInfo( select_no, v_mem_field_info );
//theLog<<"select_no:"<<select_no<<"\tv_mem_field_info.size():"<<v_mem_field_info.size()<<endi;
for( int i = 0 ; i < MAX_ATTR_COUNT ; i ++ )
{
field_attr_id[i] = -1 ;
}
int pos = 0;
for( i = 0 ; i < v_mem_field_info.size() ; i ++ )
{
field_attr_id[v_mem_field_info[i].event_attr_id] = i;
v_mem_field_info[i].field_pos = pos;
//20060609 加載事件屬性名稱
EVENT_ATTR tmp_event_attr;
tmp_event_attr.attr_id = v_mem_field_info[i].event_attr_id;
//////////2005-11-23
//pos += v_mem_field_info[i].field_size;
if( v_mem_field_info[i].field_size == -1 )
{
pos += 4;
}
else
{
pos += v_mem_field_info[i].field_size;
}
///////////////////////
p_field_info[i].event_attr_id = v_mem_field_info[i].event_attr_id ;
p_field_info[i].field_pos = v_mem_field_info[i].field_pos ;
p_field_info[i].field_size = v_mem_field_info[i].field_size ;
p_field_info[i].field_type = v_mem_field_info[i].field_type ;
p_field_info[i].key_count = 0;
}
p_share_mem_info->field_count = v_mem_field_info.size();
return 0;
}
////////////////////////////////////////////////////////////////////////
// Name: c_shm_mem::buildSQLString()
// Purpose: 組裝SQL語句
// Comment: 組裝select count(*) from 語句與select field語句,分別放入v_sqlstring與v_countsqlstring中
// Return: int 成功:0 失敗:errNotloadSQL
////////////////////////////////////////////////////////////////////////
int c_shm_mem::buildSQLString()
{
if( v_sql_info.size() <= 0 )
{
theLog<<"未加載SQL信息!"<<endi;
return errNotloadSQL;
}
int i, j;
v_sqlstring.reserve( 10 );
v_countsqlstring.reserve( 10 );
for( i = 0 ; i < v_sql_info.size() ; i ++ )
{
vector <MEM_FIELD_INFO> memField;
p_share_info->getFieldInfo( v_sql_info[i].select_no, memField );
//theLog<<"select_no:"<<v_sql_info[i].select_no<<"\tmemfield:"<<memField.size()<<endi;
if( memField.size() > 0 )
{
string sql = "select ";
for( j = 0 ; j < memField.size() ; j ++ )
{
sql += memField[j].field_sql ;
if( j < ( memField.size() - 1 ) )
sql += ", ";
}
sql += " from ";
sql += v_sql_info[i].from_sql;
if( strcmp( v_sql_info[i].condition , "" ) != 0 )
{
sql += " ";
sql += v_sql_info[i].condition;
}
//theLog<<"ddd:"<<sql<<"|"<<endi;
v_sqlstring.push_back( sql );
string count_sql = "select count(*) from ";
count_sql += v_sql_info[i].from_sql;
if( strcmp( v_sql_info[i].condition , "" ) != 0 )
{
count_sql += " ";
count_sql += v_sql_info[i].condition;
}
v_countsqlstring.push_back( count_sql );
}
}
return 0;
}
////////////////////////////////////////////////////////////////////////
// Name: c_shm_mem::loadData()
// Purpose: 加載數據,繼承類可以重寫,在初始化后一次調用
// Return: int 成功:0 失敗:errMemDelete,errAppenElement
////////////////////////////////////////////////////////////////////////
int c_shm_mem::loadData(const int sql_seq)
{
if( p_stShareInfo->valid_flag != 1 )
{
theLog<<"共享內存塊不可用!"<<endi;
return errMemDelete;
}
int i, j = 0;
char field[MAX_FIELD_SIZE];
//從數據庫中加載數據
//loadSQL();
//loadFieldInfo();
//buildSQLString();
Statement statement = conn.createStatement();
statement.setSQLString( "alter session set NLS_DATE_FORMAT = yyyymmddhh24miss" );
statement.execute();
//把記錄組合成一個結構,并寫入共享內存中
char buffer[ MAX_RECORD_SIZE ];
int int_field = 0;
int* p_int_field;
double double_field = 0;
long long_field = 0;
double* p_double_field;
long* p_long_field;
char kk[10];
char temp[MAX_RECORD_SIZE];
long load_record_count = 0;
long record_counts = 0;
for( i = 0 ; i < v_sqlstring.size() ; i ++ )
{
if( sql_seq != -1 )
{
if( sql_seq != i )
continue;
}
try
{
statement.setSQLString( v_countsqlstring[i].c_str() );
statement.execute();
statement>>load_record_count;
theLog<<"begin load "<<load_record_count<<" records!"<<endi;
}
catch(Exception& ex1)
{
theLog<<"get count error!"<<endi<<ex1.what();
return -1;
}
theLog<<" exec sql:"<<v_sqlstring[i].c_str()<<endi;
statement.setSQLString( v_sqlstring[i].c_str() );
try
{
statement.execute();
}
catch(Exception& ex)
{
theLog<<"execute sql error!"<<endi<<ex.what();
return -1;
}
try
{
while( statement>>field )
{
//theLog<<i<<":"<<j<<":"<<field<<":"<<p_field_info[j].field_type<<endi;
//theLog<<"p_field_info[j].field_pos:"<<p_field_info[j].field_pos<<endi;
//theLog<<"p_field_info[j].field_size:"<<p_field_info[j].field_size<<endi;
switch( p_field_info[j].field_type )
{
case STRING_TYPE_D:
//theLog<<p_field_info[j].field_type<<"afe";
//memcpy( &(buffer[p_field_info[j].field_pos]), field, p_field_info[j].field_size );
if(SetData(j,field)<0)
{
setRecordCount();
theLog<<"load count3:"<<getRecordCount()<<endi;
return errAppenElement;
}
break;
case INT_TYPE_D:
int_field = atoi( field );
//p_int_field = (int*) temp;
//memcpy( temp, &int_field, sizeof(int) );
//memcpy( &(buffer[p_field_info[j].field_pos]), temp, sizeof(int) );
if(SetData(j, &int_field)<0)
{
setRecordCount();
theLog<<"load count3:"<<getRecordCount()<<endi;
return errAppenElement;
}
break;
case CHAR_TYPE_D:
//memcpy( &(buffer[p_field_info[j].field_pos]), field, p_field_info[j].field_size );
if(SetData(j,field)<0)
{
setRecordCount();
theLog<<"load count3:"<<getRecordCount()<<endi;
return errAppenElement;
}
break;
case DOUBLE_TYPE_D :
double_field = atof(field);
//p_double_field = (double*) temp;
//memcpy( temp, &double_field, sizeof(double) );
//memcpy( &(buffer[p_field_info[j].field_pos]), temp, sizeof(double) );
if(SetData(j,&double_field)<0)
{
setRecordCount();
theLog<<"load count3:"<<getRecordCount()<<endi;
return errAppenElement;
}
break;
case LONG_TYPE_D :
long_field = atol(field);
//p_double_field = (double*) temp;
//memcpy( temp, &double_field, sizeof(double) );
//memcpy( &(buffer[p_field_info[j].field_pos]), temp, sizeof(double) );
if(SetData(j,&long_field)<0)
{
setRecordCount();
theLog<<"load count3:"<<getRecordCount()<<endi;
return errAppenElement;
}
break;
default:
//memcpy( &(buffer[p_field_info[j].field_pos]), field, p_field_info[j].field_size );
SetData(j,field);
break;
};
j ++;
if( j >= p_share_mem_info->field_count )
{
if( singal_terminate.isTerminated() )
{
theLog<<"程序終止!"<<endi;
singal_terminate.kill();
}
j = 0;
if( appendElement( ) < 0 )
{
setRecordCount();
theLog<<"裝載失敗1,已裝載記錄數:"<<getRecordCount()<<endi;
return errAppenElement;
}
//theLog<<"addok1"<<endi;
//theLog<<"buffer:"<<&buffer[30]<<"|"<<endi;
memset( buff, 0, p_share_mem_info->element_size );
record_counts++;
if( record_counts % 200000 == 0 )
{
theLog<<"已裝載記錄數:"<<record_counts<<endi;
}
}
}
}
catch(Exception& ex)
{
theLog<<"裝載第"<<record_counts<<"條記錄第"<<j<<"個字段出錯!"<<field<<endi;
setRecordCount();
return -2;
}
if( j > 0 )
{
//theLog<<"buffer:"<<&buffer[30]<<"|"<<endi;
j = 0;
if( appendElement( ) < 0 )
{
setRecordCount();
theLog<<"裝載失敗2,已裝載記錄數:"<<getRecordCount()<<endi;
return errAppenElement;
}
memset( buff, 0, p_share_mem_info->element_size );
record_counts++;
}
}
setRecordCount();
theLog<<"已裝載記錄數:"<<getRecordCount()<<endi;
if( singal_terminate.isTerminated() )
{
theLog<<"程序終止!"<<endi;
singal_terminate.kill();
}
return 0;
}
////////////////////////////////////////////////////////////////////////
// Name: c_shm_mem::unloadData()
// Purpose: 卸載數據
// Comment: 修改標志,同時,將記錄數修改為0
// Return: int,成功:0,失敗:errMemUnload
////////////////////////////////////////////////////////////////////////
int c_shm_mem::unloadData(void)
{
// TODO : implement
if( p_stShareInfo->valid_flag == 0 )
{
theLog<<"數據已經被卸載!"<<endi;
return errMemUnload;
}
record_count_mutex.enterMutex();
append_mutex.enterMutex();
p_stShareInfo->real_record_count = 0;
p_stShareInfo->append_record_count = 0;
append_mutex.leaveMutex();
record_count_mutex.leaveMutex();
p_stShareInfo->valid_flag = 0;
return 0;
}
////////////////////////////////////////////////////////////////////////
// Name: c_shm_mem::getElement( int seq )
// Purpose: 取得指定序號的記錄,返回頭指針。
// Comment: 將共享內存中的記錄拷貝到臨時buffer中,返回buffer的頭指針
// Return: void*
////////////////////////////////////////////////////////////////////////
char* c_shm_mem::getElement( int seq )
{
//theLog<<"seq:"<<seq<<endi;
//theLog<<"p_stShareInfo->real_record_count:"<<p_stShareInfo->real_record_count<<endi;
// TODO : implement
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -