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

📄 c_shm_merge.cpp

📁 HP共享内存实现,只要将sql语句配置好,装载共享内存即可
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	while( i_item_seq < MAX_ITEM_COUNT )
	{
		if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->record_count )
		{
			i_sort_seq = 1;
			return &(p_merge_item[i_item_seq]->p_merge_list[i_element_seq]);
		}
		if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->add_record_count )
		{
			i_sort_seq = 0;
			return &(p_merge_item[i_item_seq]->p_add_merge_list[i_element_seq]);
		}
		i_item_seq ++;
	}
	return NULL;	
	//return getElementBySeq(i_item_seq, i_element_seq, i_sort_seq );
}

SHM_MERGE_LIST* c_shm_merge::getNextElement()
{
	i_element_seq ++;
	if( 1 == i_sort_seq )
	{
		//有序区是否已经找完,是,到无序区找。
		if( i_element_seq >= p_merge_item[i_item_seq]->p_merge_info->record_count )
		{
			i_sort_seq = 0;
			i_element_seq = 0;
		}
	}
	else
	{
		//无序区是否找完,是,到下一个子块中找
		if( i_element_seq >= p_merge_item[i_item_seq]->p_merge_info->add_record_count )
		{
			i_sort_seq = 1;
			i_element_seq = 0;
			i_item_seq ++;
			while( i_item_seq < MAX_ITEM_COUNT )
			{
				if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->record_count )
				{
					i_sort_seq = 1;
					return &(p_merge_item[i_item_seq]->p_merge_list[i_element_seq]);
				}
				if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->add_record_count )
				{
					i_sort_seq = 0;
					return &(p_merge_item[i_item_seq]->p_add_merge_list[i_element_seq]);
				}
				i_item_seq ++;
			}
		}
	}
	
	//是否已到最大块?
	if( i_item_seq >= MAX_ITEM_COUNT )
	{
		return NULL;
	}
	else
	{
		//返回值
		if( 1 == i_sort_seq )
			return &(p_merge_item[i_item_seq]->p_merge_list[i_element_seq]);
		else
			return &(p_merge_item[i_item_seq]->p_add_merge_list[i_element_seq]);
	}	
}

bool c_shm_merge::getChargeList1(const long serv_id, const int billing_cycle_id )
{
	//构造main
	char tmp_buf[20];
	memcpy( &tmp_buf[0], &serv_id, 8 );
	memcpy( &tmp_buf[8], &billing_cycle_id, 4 );

	//首先确定是在哪一块中
	int main_seq = getMergeItemSeq(&tmp_buf[0]);
	//在小块中查找
	SHM_MERGE_LIST* p_find_main = p_merge_item[main_seq]->find(&tmp_buf[0]);
	if( p_find_main != NULL )
	{
		//找到号码
		get_next_pos = p_find_main ->item_pos;
		p_list = getNext();
		list_get_item_count = -1;
		return true;
	}
	else
	{
		return false;
	}
}

int c_shm_merge::getChargeList(const int serv_id, const int counting_type_id)
{
	//首先确定是在哪一块中
	int main_seq = (serv_id%100)/10;
	//在小块中查找
	SHM_MERGE_LIST* p_find_main = p_merge_item[main_seq]->findServID( serv_id, counting_type_id );
	p_find_charge_main = p_find_main ;
	if( p_find_main != NULL )
	{
		//找到号码
		//return update( p_find_main->item_pos, p_item, p_fee );
		get_next_pos = p_find_main->item_pos;
		return 0;
	}
	else
	{
		//打不到
		get_next_pos = -1;
		return -1;
	}
}

void c_shm_merge::displayMain()
{
	/*
	char main_value[500];
	int int_value;
	long long_value;
	double double_value;
	if( p_find_charge_main != NULL )
	{
		for ( int i = 0 ; i < g_main_key.size() ; i ++)
		{
			memcpy(&main_value[0], &(p_find_charge_main->main[g_main_key[i].pos]), g_main_key[i].size);
			main_value[g_main_key[i].size] = '\0';
			switch ( g_main_key[i].type )
			{
				catch 1:
					cout<<i<<"field:"<<main_value<<endl;
					break;
				catch 2:
					memcpy( &int_value, &main_value[0], 4 );
					cout<<i<<"field:"<<int_value<<endl;					
					break;
				catch 3:
					cout<<i<<"field:"<<main_value<<endl;
					break;
				catch 4:
					memcpy( &double_value, &main_value[0], 8 );
					cout<<i<<"field:"<<double_value<<endl;
					break;
				catch 5:
					memcpy( &long_value, &main_value[0], 12 );
					cout<<i<<"field:"<<long_value<<endl;
					break;
				default:
					cout<<i<<"field:"<<main_value<<endl;
					break;
			}
		}
	}
	*/
	return;
}

//冒泡法排序,只对8个进行排序
int c_shm_merge_addition::qSort(const int begin_pos)
{
	return 0;
}

int c_shm_merge_addition::getPos(const int get_pos)
{
	return p_merge_list_item[get_pos].next_pos;
}

long c_shm_merge_addition::getFee( const int main_pos, const int item )
{
	int j, last_pos, get_comp_pos;
	
	int last_main_pos = main_pos;

	int t;
	
	if( p_merge_list_item[last_main_pos].next_pos == -1 )
	{
		t =  p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
		if( t == 0 )
		{
			return p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee;
		}
		else if( t < 0 )
		{
			return -999999;
		}
		else 
		{
			//在本块中查找
			for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
			{
				t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
				if( t == 0 )
					return p_merge_list_item[ last_main_pos ].acctFee[ j ].fee;
				else if( t > 0 )
					return -999999;
			}
		}
	}

	while( p_merge_list_item[last_main_pos].next_pos != -1 )
	{
		t =  p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;

		if( t == 0 )
		{
			return p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee;
		}
		else if( t < 0 )
		{
			last_main_pos = p_merge_list_item[last_main_pos].next_pos;
		}
		else 
		{
			//在本块中查找
			for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
			{
				t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
				if( t == 0 )
					return p_merge_list_item[ last_main_pos ].acctFee[ j ].fee;
				else if( t > 0 )
					return -999999;
			}
		}
	}
	
	return -999999;
}


bool c_shm_merge_addition::getFee( int main_pos, const int item, long* out_value )
{
	int j, last_pos, get_comp_pos;
	
	int last_main_pos = main_pos;

	int t;
	
	if( p_merge_list_item[last_main_pos].next_pos == -1 )
	{
		t =  p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
		if( t == 0 )
		{
			memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), sizeof(long) );
			return true;
		}
		else if( t < 0 )
		{
			return false;
		}
		else 
		{
			//在本块中查找
			for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
			{
				t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
				if( t == 0 )
				{
					memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), sizeof(long) );
					return true;
				}
				else if( t > 0 )
					return false;
			}
		}
	}

	while( p_merge_list_item[last_main_pos].next_pos != -1 )
	{
		t =  p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;

		if( t == 0 )
		{
			memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), sizeof(long) );
			return true;
		}
		else if( t < 0 )
		{
			last_main_pos = p_merge_list_item[last_main_pos].next_pos;
		}
		else 
		{
			//在本块中查找
			for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
			{
				t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
				if( t == 0 )
				{
					memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), sizeof(long) );
					return true;
				}
				else if( t > 0 )
					return false;
			}
		}
	}
	
	return false;
}

bool c_shm_merge_addition::updateFee( const int main_pos, const int item, const long fee )
{	
	int j, last_pos, get_comp_pos;
	
	int last_main_pos = main_pos;

	int t;
	
	if( p_merge_list_item[last_main_pos].next_pos == -1 )
	{
		t =  p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
		if( t == 0 )
		{
			memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), &fee, sizeof(long) );
			return true;
			//p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee = fee;
		}
		else if( t < 0 )
		{
			append( main_pos, &item, &fee );
			return true;
		}
		else 
		{
			//在本块中查找
			for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
			{
				t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
				if( t == 0 )
				{				
					memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), &fee, sizeof(long) );
					//long test_long ;
					//memcpy( &test_long, &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), sizeof(long) );
					//int tmp_d;
					//char tmp_char[17];
					//memcpy( &tmp_char[0], &(p_merge_list_item[ last_main_pos ].acctFee[ j ].key), 16 );
					//for( tmp_d = 0 ; tmp_d < 16; tmp_d ++ )
					//	printf( "%d\t", tmp_char[tmp_d] );
					//printf("\n");fflush(stdout);
					return true;
					//p_merge_list_item[ last_main_pos ].acctFee[ j ].fee = fee;
				}
				else if( t > 0 )
				{
					append( main_pos, &item, &fee );
					return true;
				}
			}
		}
	}

	while( p_merge_list_item[last_main_pos].next_pos != -1 )
	{
		t =  p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;

		if( t == 0 )
		{
			memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), &fee, sizeof(long) );
			return true;
			//p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee = fee;
		}
		else if( t < 0 )
		{
			last_main_pos = p_merge_list_item[last_main_pos].next_pos;
		}
		else 
		{
			//在本块中查找
			for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
			{
				t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
				if( t == 0 )
				{
					memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), &fee, sizeof(long) );
					return true;
					//p_merge_list_item[ last_main_pos ].acctFee[ j ].fee = fee;
				}
				else if( t > 0 )
				{
					append( main_pos, &item, &fee );
					return true;
				}
			}
		}
	}
	
	return true;
}

/*
SHM_MERGE_LIST_ITEM* c_shm_merge_addition::binfind( const int begin_pos, const int end_pos, const SHM_MERGE_LIST_ITEM* item ) 
{
	if( begin_pos == end_pos )
	{
		if( listItemComp(&(p_merge_list_item[begin_pos]), item ) == 0 )
		{
			return &(p_merge_list_item[begin_pos]);
		}
		else
		{
			return NULL;
		}
	}
	else
	{
		int middle_pos = begin_pos + (end_pos-begin_pos)/2;
		int comp = listItemComp(&(p_merge_list_item[middle_pos]), item );
		if( comp == 0 )
		{
			return &(p_merge_list_item[middle_pos]);
		}
		else if( comp > 0 )
		{
			return binfind( begin_pos, middle_pos, item );
		}
		else
		{
			return binfind( middle_pos+1, end_pos, item );

⌨️ 快捷键说明

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