?? c_index.cpp
字號:
/***********************************************************************
* Module: c_index.cpp
* Author: Administrator
* Modified: 2005年9月15日 15:40:43
* Purpose: Implementation of the class c_index
* Comment: 用于對共享內存中的數據建立索引。 并利用索引進行查詢。
找到所需的數據. 索引是基于共享內存而存在的。
共享內存在使用時, 只要同索引類打交道即可. 更新索引的時間由各個使用者自行確定。
***********************************************************************/
#include "c_shm_mem.h"
#include "c_index.h"
//表示是全局變量.用于指示字段信息
INDEX_KEY_INFO g_index_key[MAX_INDEX_COUNT];
int index_no = 0;
int index_count = 0;
c_buf g_buf[MAX_INDEX_COUNT];
c_buf g_list_buf[MAX_INDEX_COUNT];
int c_list::append(int a )
{
if( record_count == 0 )
{
// next = NULL;
data = a;
}
else
{
c_list* temp_point = (c_list*)g_list_buf[index_no].getSpace();
temp_point->data = a;
if( next != NULL )
temp_point->record_count = next->record_count + 1;
else
temp_point->record_count = 1;
temp_point->next = next;
next = temp_point;
}
record_count++;
return 0;
}
int c_list::del( int seq )
{
if( seq >= record_count || seq < 0 )
{
printf("沒有這個序號的數據!");
return -1;
}
int i;
c_list* temp_point;
c_list* delete_point;
if( seq == 0 )
{
temp_point = next;
next = temp_point->next;
data = temp_point->data;
}
else if(seq == 1)
{
temp_point = next;
next = temp_point->next;
}
else
{
temp_point = next;
for ( i = 1; i < seq - 1; i ++ )
{
temp_point = temp_point->next;
}
//刪除
delete_point = temp_point->next;
temp_point->next = delete_point->next;
}
//釋放內存
record_count--;
return 0;
}
////////////////////////////////////////////////////////////////////////
// Name: c_index::createIndex()
// Purpose: Implementation of c_index::createIndex()
// Return: int
////////////////////////////////////////////////////////////////////////
void c_index::appendKeySeq(int c, int app)
{
if( app == 0 )
{
for( int i = 0 ; i < keySeq.size(); i++ )
shm_mem->deleteKey( keySeq[i] );
keySeq.clear();
g_index_key[index_no].key_count = 0;
}
shm_mem->addKey( c );
//同時更新g_index_key
memcpy( &(g_index_key[index_no].field_info[g_index_key[index_no].key_count]), &(shm_mem->p_field_info[c]), sizeof(MEM_FIELD) );
//重置field_pos
if( g_index_key[index_no].key_count == 0 )
g_index_key[index_no].field_info[g_index_key[index_no].key_count].field_pos = 0;
else
g_index_key[index_no].field_info[g_index_key[index_no].key_count].field_pos =
g_index_key[index_no].field_info[g_index_key[index_no].key_count-1].field_pos + g_index_key[index_no].field_info[g_index_key[index_no].key_count-1].field_size;
//key值大小
g_index_key[index_no].key_size = g_index_key[index_no].field_info[g_index_key[index_no].key_count].field_pos + g_index_key[index_no].field_info[g_index_key[index_no].key_count].field_size ;
g_index_key[index_no].key_count++;
//設置buf的參數
g_index_key[index_no].m_buf.record_size = g_index_key[index_no].key_size;
g_index_key[index_no].m_buf.unit = 100;
g_buf[index_no].record_size = g_index_key[index_no].key_size;
g_buf[index_no].unit = 10;
keySeq.push_back(c );
}
void c_index::test()
{
INDEX_VALUE t_index[5800];
int i;
char *p_field, *p_element;
int field_seq;
int j = 0;
for( i = 0; i < shm_mem->p_stShareInfo->real_record_count && i < 5800 ; i ++ )
{
p_element = shm_mem->getElement( i );
//測試, 打印出各個字段的值
//構造t_index
cout<<i<<endl;
//if( i % 10000 == 0 ) cout<<i<<endl;
for( field_seq = 0; field_seq< keySeq.size(); field_seq++ )
{
// t_index[j].key.setData( field_seq, (char*)p_element + shm_mem->p_field_info[keySeq[field_seq] ].field_pos );
t_index[j].key.setData( field_seq, p_element + shm_mem->p_field_info[keySeq[field_seq] ].field_pos );
j++;
}
if( i > 579000 )
break;
}
cout<<"索引數組大小為:"<<sizeof(t_index)<<endl;
cout<<"單個大小為:"<<sizeof(INDEX_VALUE)<<endl;
cout<<"關鍵字類大小為:"<<sizeof(c_key_value)<<endl;
g_buf[index_no].display();
}
void c_index::createIndex( int begin_no, int end_no )
{
INDEX_VALUE t_index;
int field_seq;
//先第一條記錄
//對共享內存進行遍歷一次
void *p_field, *p_element;
char out_value[30];
int i;
//取得記錄數
for( i = begin_no; i < end_no; i ++ )
{
p_element = shm_mem->getElement( i );
if ( p_element == NULL )
{
continue;
}
//構造t_index
for( field_seq = 0; field_seq< keySeq.size(); field_seq++ )
{
t_index.key.setData( field_seq, (char*)p_element + shm_mem->p_field_info[keySeq[field_seq] ].field_pos );
}
//要在set中插入一條記錄
pr = index_tree.insert( t_index );
INDEX_VALUE& ss = (INDEX_VALUE&)(*pr.first);
ss.record_seq.append(i);
//pp->append(i);
//if( i%100000==0 )
// cout<<i<<endl;
if( singal_terminate.isTerminated() )
{
g_buf[index_no].recvSpace();
cout<<"程序終止!"<<endl;
singal_terminate.kill();
}
}
//收回空間
g_buf[index_no].recvSpace();
}
//創建索引
int c_index::createIndex(void)
{
// TODO : implement
index_record_count = shm_mem->getRecordCount();
cout<<"共享內存記錄數為:"<<index_record_count<<endl;
createIndex( 0, index_record_count );
return 0;
}
////////////////////////////////////////////////////////////////////////
// Name: c_index::find(c_key_value* key)
// Purpose: Implementation of c_index::find()
// Comment: 返回在共享內存中的一個seq. 即記錄序號或位置
// Parameters:
// - key
// Return: int
////////////////////////////////////////////////////////////////////////
//設置key_v的一些屬性
void c_index::getKeyValue( c_key_value& key_v )
{
}
const c_list* c_index::find(c_key_value& key)
{
//更新索引
updateIndex();
// TODO : implement
SET_INDEX_TREE::const_iterator iter_index;
INDEX_VALUE t_index;
t_index.key = key; //需增加該函數
iter_index = index_tree.find( t_index );
g_buf[index_no].recvSpace();
if( iter_index != index_tree.end() )
{
//將其序列打印出來
#ifdef _DEBUG
//cout<<"找到:"<<iter_index->key.buf<<endl;
const c_list* p_list1 = &(iter_index->record_seq);
cout<<"tmp "<<p_list1->data<<endl;
cout<<"序號為:"<<iter_index->record_seq.data<<'\t';
c_list* p_list = iter_index->record_seq.next;
int i = 0;
while( p_list != NULL )
{
cout<<p_list->data<<'\t';
p_list = p_list->next;
i ++;
if( i >= 30 )
break;
}
cout<<endl;
#endif
return &(iter_index->record_seq);
//return iter_index->record_seq.next;
}
else
{
return NULL;
}
//空間回收
}
////////////////////////////////////////////////////////////////////////
// Name: c_index::updateIndex()
// Purpose: Implementation of c_index::updateIndex()
// Return: int
////////////////////////////////////////////////////////////////////////
int c_index::updateIndex(void)
{
// TODO : implement
//當記錄數發生改變時, 要進行索引更新
int t_count = shm_mem->getRecordCount();
if( t_count != index_record_count )
{
createIndex( index_record_count, t_count );
index_record_count = t_count;
}
return 0;
}
////////////////////////////////////////////////////////////////////////
// Name: c_index::nextElement()
// Purpose: Implementation of c_index::nextElement()
// Return: void*
// p_data為返回的元素的指針
////////////////////////////////////////////////////////////////////////
const c_list* c_index::nextElement( const c_list* p_list )
{
// TODO : implement
if( p_list == NULL )
{
return NULL;
}
return p_list->next;
}
void* c_index::getField( int record_no, int field_seq )
{
if( shm_mem->p_field_info[field_seq].field_size == -1 )
{
void* p_element = shm_mem->getElement( record_no );
if(shm_mem->getFieldValue(field_seq, &add_value[0] ) == 0 )
return &add_value[0];
else
return NULL;
}
else
{
void* p_element = shm_mem->getElement( record_no );
return (char*)p_element + shm_mem->p_field_info[field_seq].field_pos;
}
}
void c_index::display( int seq )
{
char out[200];
int out_i;
shm_mem->getElement(seq );
for(int i = 0; i< shm_mem->p_share_mem_info->field_count; i++ )
{
switch( shm_mem->p_field_info[i].field_type )
{
case 1:
shm_mem->getFieldValue( i, out );
cout<<out<<endl;
break;
case 2:
shm_mem->getFieldIntValue(i, &out_i );
cout<<out_i<<endl;
break;
case 3:
break;
default:
shm_mem->getFieldValue( i, out );
cout<<out<<endl;
break;
}
}
}
void c_index::recvSpace()
{
//如果該索引不用了, 可以將其釋放掉
g_index_key[index_no].m_buf.release();
g_buf[index_no].release();
g_list_buf[index_no].release();
//將set釋放掉
index_tree.clear();
//將key值去掉
for( int i = 0 ; i < keySeq.size(); i++ )
shm_mem->deleteKey( keySeq[i] );
}
//2006-03-12
void c_index::createIndex(bool (*p_func)(c_index*, char*))
{
index_record_count = shm_mem->getRecordCount();
cout<<"共享內存記錄數為:"<<index_record_count<<endl;
createIndex( 0, index_record_count, p_func );
return ;
}
void c_index::createIndex( int begin_no, int end_no, bool (*p_func)(c_index*, char*) )
{
INDEX_VALUE t_index;
int field_seq;
//先第一條記錄
//對共享內存進行遍歷一次
void *p_field, *p_element;
char out_value[30];
int i;
//取得記錄數
for( i = begin_no; i < end_no; i ++ )
{
p_element = shm_mem->getElement( i );
if ( p_element == NULL )
{
continue;
}
//判斷是否滿足條件,滿足才可以繼續
if ( !p_func(this, (char*)p_element) )
{
continue;
}
//構造t_index
for( field_seq = 0; field_seq< keySeq.size(); field_seq++ )
{
t_index.key.setData( field_seq, (char*)p_element + shm_mem->p_field_info[keySeq[field_seq] ].field_pos );
}
//要在set中插入一條記錄
t_index.record_seq.append(i);
pr = index_tree.insert( t_index );
//pr.first->record_seq.append(i);
if( singal_terminate.isTerminated() )
{
g_buf[index_no].recvSpace();
cout<<"程序終止!"<<endl;
singal_terminate.kill();
}
}
//收回空間
g_buf[index_no].recvSpace();
return;
}
int c_index::getKeySeqByAttrName( const char* event_attr_name )
{
int seq = shm_mem->getFieldSeqByAttrName( event_attr_name );
if( seq < 0 )
{
return -1;
}
else
{
for ( int i = 0 ; i < keySeq.size() ; i ++ )
{
if ( keySeq[i] == seq )
{
return i;
}
}
}
return -1;
}
//添加一個索引
INDEX_MANAGER* c_index_manager::appendIndex()
{
if( index_count >= MAX_INDEX_COUNT )
{
cout<<"錯誤: 超過最大索引數, 最大為:"<<MAX_INDEX_COUNT<<endl;
return NULL;
}
INDEX_MANAGER t_manager;
t_manager.m_index = new c_index();
t_manager.g_buf = &g_buf[index_count];
t_manager.m_key_info = &g_index_key[index_count];
t_manager.m_list_buf = &g_list_buf[index_count];
//置上索引序列, 以便于跟蹤
t_manager.m_index_no = index_count;
t_manager.m_list_buf->record_size = sizeof( c_list );
t_manager.m_list_buf->unit = 100;
index_no = index_count;
index_count++;
index_group.push_back( t_manager );
//建立關鍵字類型
// index_group[index_count-1].m_key = new c_key_value();
return &index_group[index_count-1];
}
INDEX_MANAGER* c_index_manager::appendIndex(const char* mem_name, string p_key[], const int key_size)
{
c_shm_mem* p_shm_mem = c_shm::getInstPtr()->get_mem( mem_name );
if( p_shm_mem == NULL )
{
cout<<"沒有找到該塊共享內存:"<<mem_name<<endl;
exit(1);
}
return appendIndex( p_shm_mem, p_key, key_size);
}
INDEX_MANAGER* c_index_manager::appendIndex(c_shm_mem* p_shm_mem, string p_key[], const int key_size)
{
if( index_count >= MAX_INDEX_COUNT )
{
cout<<"錯誤: 超過最大索引數, 最大為:"<<MAX_INDEX_COUNT<<endl;
return NULL;
}
int jj = 0;
string index_str = p_shm_mem->p_share_mem_info->mem_name;
for( jj = 0; jj < key_size; jj++ )
{
index_str += p_key[jj];
}
for( jj = 0; jj < indexString.size(); jj++ )
{
if( strcmp( index_str.c_str(), indexString[jj].index_string ) == 0 )
{
index_group[jj].refer_count++;
return &index_group[jj];
}
}
INDEX_MANAGER t_manager;
t_manager.m_index = new c_index();
t_manager.refer_count = 0;
t_manager.g_buf = &g_buf[index_count];
t_manager.m_key_info = &g_index_key[index_count];
t_manager.m_list_buf = &g_list_buf[index_count];
//置上索引序列, 以便于跟蹤
t_manager.m_index_no = index_count;
t_manager.m_list_buf->record_size = sizeof( c_list );
t_manager.m_list_buf->unit = 100;
index_no = index_count;
//設置共享內存和key
t_manager.setShm( p_shm_mem );
if( key_size == 0 )
{
printf("沒有設置索引主鍵\n"); fflush(stdout);
return NULL;
}
else
{
int i = 0;
for( i = 0; i < key_size; i++ )
{
int field_seq = p_shm_mem->getFieldSeqByAttrName( p_key[i].c_str() );
if( field_seq < 0 )
{
cout<<p_key[i].c_str()<<"該字段不存在,請檢查"<<endl;
exit(1);
}
else
{
t_manager.appendKey( field_seq );
}
}
}
t_manager.initKey();
t_manager.m_index->createIndex();
index_count++;
INDEX_STRING t_index_str;
strcpy( t_index_str.index_string, index_str.c_str() );
indexString.push_back( t_index_str );
index_group.push_back( t_manager );
//建立關鍵字類型
// index_group[index_count-1].m_key = new c_key_value();
return &index_group[index_count-1];
}
//獲得索引
INDEX_MANAGER* c_index_manager::getIndex(int seq )
{
if( seq< 0 || seq >= index_group.size() )
return NULL;
else
{
index_no = seq;
return &index_group[seq];
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -