亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? c_index.cpp

?? 一個基于HP機器的共享內存的實現, 很使用,大型系統,資料管理非常有用,只要將資料用sql語句配置好,裝載共享內存即可,是一個已經在用的大型系統的共享內存程序,非常有價值.
?? 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 + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成年人网站91| 蜜桃视频一区二区三区在线观看 | 精品国产精品网麻豆系列| 欧美亚洲一区二区在线观看| 中文字幕一区二区视频| 日本一区二区动态图| 欧美国产日产图区| 亚洲欧洲三级电影| 一区二区三区四区国产精品| 一区二区三区蜜桃网| 天天av天天翘天天综合网| 久久一区二区三区四区| 欧美电影免费观看高清完整版在线观看 | 91视频.com| 欧美日韩视频一区二区| 国产一区在线观看视频| 国产99久久精品| 一级做a爱片久久| 久久女同互慰一区二区三区| 色哟哟一区二区在线观看| 精品一区二区三区免费毛片爱| 欧美国产精品一区| 91精品国产综合久久精品麻豆| 欧美一区二区视频在线观看| 色香色香欲天天天影视综合网| 久久精品国产秦先生| 国产精品 欧美精品| 91在线视频观看| 国产高清一区日本| 色94色欧美sute亚洲线路一久 | 欧美久久久一区| 国产91精品精华液一区二区三区| 99视频超级精品| 国产毛片精品视频| 91网上在线视频| 国产98色在线|日韩| 免费成人av在线| 成人综合婷婷国产精品久久| 91免费精品国自产拍在线不卡| 欧美日韩国产天堂| 中日韩av电影| 日韩av中文字幕一区二区| 北条麻妃一区二区三区| 激情五月婷婷综合| 蜜臀精品一区二区三区在线观看| 国产精品一区二区不卡| 欧美系列在线观看| 91社区在线播放| 99精品黄色片免费大全| 91精品国产麻豆| 国产精品丝袜91| 国产精品国产a| 久久99精品视频| 欧美三级乱人伦电影| 国产精品亲子乱子伦xxxx裸| 爽好多水快深点欧美视频| 99久久er热在这里只有精品15| 欧美成人性战久久| 洋洋成人永久网站入口| 成人成人成人在线视频| 国产91在线看| av高清不卡在线| 99久久久无码国产精品| 久久久久久免费| 中文字幕免费不卡在线| 国产精品国产成人国产三级| 国产精品一区在线观看你懂的| 在线中文字幕不卡| 亚洲欧美日韩精品久久久久| 粉嫩久久99精品久久久久久夜| 成人综合在线视频| www.66久久| 欧美日韩视频一区二区| 一区二区三区资源| 色网综合在线观看| 美女在线视频一区| 青青国产91久久久久久| 欧美美女激情18p| 久久综合色之久久综合| 韩国一区二区三区| 成人免费视频一区| 欧美国产日韩精品免费观看| 亚洲欧美激情视频在线观看一区二区三区| 国产激情视频一区二区在线观看 | 亚洲一区二区三区在线| 色综合久久久久| 亚洲精品成a人| 欧美三级三级三级爽爽爽| 亚洲成av人片| 日韩欧美国产一区在线观看| 日韩av不卡一区二区| 欧美xxxxx裸体时装秀| 国产精品青草综合久久久久99| 亚洲电影视频在线| 欧美日韩电影一区| 免费成人av在线| 久久久激情视频| 菠萝蜜视频在线观看一区| 亚洲精品高清视频在线观看| 日韩精品每日更新| 成人午夜伦理影院| 亚洲在线观看免费| 国产白丝精品91爽爽久久| 国产精品毛片久久久久久| 午夜精品久久久久| 色综合天天视频在线观看| 亚洲成人你懂的| 欧美一级二级三级蜜桃| 国产+成+人+亚洲欧洲自线| 91精品国产福利| 国产盗摄视频一区二区三区| 综合久久久久久| 91精品国产黑色紧身裤美女| 国产精品夜夜嗨| 亚洲资源中文字幕| 久久久99精品久久| 欧美亚洲一区二区在线观看| 韩国一区二区视频| 亚洲日韩欧美一区二区在线| 欧美一区二区久久| 国产婷婷色一区二区三区四区| 91在线观看一区二区| 日本在线不卡视频| 亚洲欧美在线观看| 日韩精品中午字幕| 久久久久国产精品人| 精品视频在线看| 成人av第一页| 国产精品伦理在线| 日韩欧美一级二级| 亚洲大片精品永久免费| 欧美日韩一级黄| 午夜av一区二区三区| 欧美日韩综合不卡| 日韩欧美国产精品一区| 91丨九色porny丨蝌蚪| 国产另类ts人妖一区二区| 无吗不卡中文字幕| 日本aⅴ精品一区二区三区| 成人激情免费网站| 欧美高清在线精品一区| 日韩免费电影一区| 在线成人高清不卡| 亚洲老妇xxxxxx| 麻豆视频观看网址久久| 亚洲午夜久久久久久久久久久 | av高清久久久| 国产精品久久久一本精品| 日韩欧美另类在线| 日韩一级在线观看| 亚洲乱码中文字幕综合| 色综合久久久久综合体桃花网| 国产精品99久久久久久似苏梦涵| ww久久中文字幕| 风间由美性色一区二区三区| 7777精品伊人久久久大香线蕉的 | 五月婷婷综合激情| 亚洲高清在线视频| 午夜精品视频在线观看| 日韩影院在线观看| 91精品国产综合久久香蕉麻豆 | 日韩一级高清毛片| 7777女厕盗摄久久久| 91精品国产高清一区二区三区| 91麻豆精品国产综合久久久久久| 亚洲一级二级三级| 亚洲成人tv网| 亚洲h精品动漫在线观看| 欧美精品99久久久**| 日韩一级片网址| 97se亚洲国产综合自在线观| 99视频一区二区三区| 亚洲另类中文字| 久久噜噜亚洲综合| 欧美视频日韩视频| 国产精品一区在线观看乱码| 国产成人在线视频免费播放| 北岛玲一区二区三区四区| 99久久夜色精品国产网站| 欧美午夜一区二区三区免费大片| 亚洲一级二级在线| 国产喷白浆一区二区三区| 亚洲人成精品久久久久| 亚洲成人精品在线观看| 国产精品五月天| 亚洲一区二区三区国产| 久久国产精品99精品国产| 成人一区二区三区视频| 午夜不卡av在线| 粗大黑人巨茎大战欧美成人| 欧洲在线/亚洲| 久久激情五月婷婷| 99久久精品一区| 日韩精品每日更新| 亚洲欧洲无码一区二区三区| 色欧美片视频在线观看在线视频| 精品一区二区三区日韩| 午夜不卡av在线| 成人手机电影网| 91麻豆精品国产91久久久久|