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

📄 ntpaddb.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
				goto endrv;

			temp_I_index_list = I_index_list;
			for( i = 0; i < num; i++ )
			{
				next_record_index = temp_I_index_list->next;
				for( j = 0; j < temp_I_index_list->num; j++ )
				{
					GetLocalSearchList( &local_search_list, next_record_index->index );
					next_record_index = next_record_index->next;
				}
				lacb->head->num = (WORD)( lacb->head->num + temp_I_index_list->num );
				temp_I_index_list++; 
			}
			break;
		case NOTEPAD_NAME_FIELD:
			GetNameFieldIandIIIndex( data, field_I_index, field_II_index, &PY_num);	//将关键字转化为索引
			I_index_list += ( *field_I_index - 'a' );
			if( I_index_list->num == 0 )
			{
				goto endrv;
			}else{
				II_index_list = I_index_list->sub;
				II_index_list += ( *field_II_index );//确定二级索引表
			}
			break;
	}
			
	switch( field )	//得到查找的链表
	{
		case NOTEPAD_PARENT_FIELD:
			if( lacb->head->num == 0 )
				goto endrv;

			if( ( record_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * lacb->head->num ) ) == NULL ) 
			{
				SysLfree( lacb->head );
				return NULL;
			}

			next_record_data = record_head;
			temp_I_index_list = I_index_list;
			for( count = 0, i = 0; i < num; i++ )
			{
				next_record_index = temp_I_index_list->next;
				for( j = 0; j < temp_I_index_list->num; j++ )
				{
					//获取记录表上已有记录的同一字段值
					tmp_id = next_record_index->index;
					read_rv = GlobalReadRecord( lacb->gacb->PLInfo, tmp_id, &record );
					if( read_rv != DB_OK )
						goto endrv;
					head_info = (DBRECORDHEAD *)record;
					record_data = (BYTE *)(&head_info->data);
#ifdef SIM_ON_PC
					field_head = (WORD *)record_data;
					if( field_head[field] != 0 )			// 字段有字段值
					{
						field_value = record_data + field_head[field];
#else
					ByteReversal( &field_head, record_data+field*sizeof(WORD) );
					if( field_head != 0 )			// 字段有字段值
					{
						field_value = record_data + field_head;
#endif
						rv = strcmp( field_value, data );	//比较同一字段

						if( rv >= 0 )	//符合查找父目录
						{
							if( mode == PRECISE_PART_MATCH )	//部分匹配只用在名称字段上
							{
								cmp_data_size = (WORD)strlen(data);
								if( ( tmp_field_value = (BYTE *)SysLmalloc( cmp_data_size + 1 ) ) == NULL )
									return NULL;
								memcpy( tmp_field_value, field_value, cmp_data_size );
								*( tmp_field_value + cmp_data_size ) = '\0';
								rv = strcmp( tmp_field_value, data );
								SysLfree(tmp_field_value);
							}

							if( rv == 0 )
							{
								next_record_data->index = tmp_id;
								next_record_data->data = record;
								next_record_data->datalen = head_info->size;
								count++;
								next_record_data++;
							}else{
								SysLfree(record);
							}
						}else{
							SysLfree(record);
						}
					}else{
						SysLfree(record);
					}
					next_record_index = next_record_index->next;
				}
				temp_I_index_list++;
			}

			lacb->head->num = count;
			if( count != 0 )
			{
				if( ( record_data_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * count ) ) == NULL ) 
				{
					SysLfree( record_head );
					SysLfree( lacb->head );
					goto endrv;
				}
				memcpy( record_data_head, record_head, ( sizeof(RECORDDATA) * count ) );
				lacb->head->head = record_data_head;
			}
			SysLfree( record_head );
			FreeRecordList( local_search_list );
			break;
		case NOTEPAD_ID_FIELD:
			read_rv = GetParentRecord( lacb, lacb->head, I_index_list, data );
			if( read_rv == DB_ERROR )
				goto endrv;
			break;
		case NOTEPAD_NAME_FIELD:	// 姓名字段
			if( II_index_list->num == 0 )	
				goto	endrv;

			read_rv = SearchPreciseRecord( II_index_list, lacb, field, data, mode );
			if( read_rv != DB_OK )
			{
				SysLfree( lacb->head );
				return NULL;
			}
			
			NotepadDBSortList( lacb, lacb->head, NOTEPAD_MODIFY_TIME_FIELD, 0 );
			break;
		case NOTEPAD_MODIFY_TIME_FIELD:	// 时间字段
//			lacb->head = SearchTimeRange( lacb, data, I_index_list );
			lacb->head = SearchTimeRange( lacb, data, I_index_list, NOTEPAD_MODIFY_TIME_FIELD );
			NotepadDBSortList( lacb, lacb->head, NOTEPAD_MODIFY_TIME_FIELD, 0 );
			break;
	}

endrv:
	return ( lacb->head );
}

/**********************************************************************/
//在指定数据库中对记录进行排序(同一个目录下)
LOCALSEARCHLIST* NotepadDBSortRecord( DBLACB *lacb, BYTE field, BYTE *data, BYTE reserved )
{	
	WORD				i, count = 0;
	FIELDINDEXLIST		*list;		//字段索引表	
	FIELDINDEX			*I_index_list;
	DBRECORDHEAD		*head_info;
	RECORDINDEX			*next_record_index; 
	RECORDDATA			*record_head, *next_record_data;
	BYTE				*record;	//记录数据
	BYTE				*record_data, *field_value;
	WORD				record_size;
#ifdef SIM_ON_PC
	WORD				*field_head;
#else
	WORD				field_head;
#endif
	WORD				*field_I_index;	//字段一二级索引值
	WORD				temp_field_I_list;
	DWORD				tmp_id;		//记录地址
	DWORD				read_rv = DB_OK;
	CHAR				rv;			//字段值比较结果

	//验证字段的有效性
	if( ( field != NOTEPAD_NAME_FIELD ) && ( field != NOTEPAD_MODIFY_TIME_FIELD) )
		return NULL;
	
	//验证字段值的有效性
	if( data == NULL )
		return NULL;

	list = lacb->gacb->FList;
	I_index_list = list[NOTEPAD_PARENT_FIELD].head;//找到相符的一级字段索引表
	
	//申请局部查找表
	if( ( lacb->head = (LOCALSEARCHLIST *)SysLmalloc( sizeof(LOCALSEARCHLIST) ) ) == NULL )	
		return NULL;
	lacb->head->num = 0;
	lacb->head->head = NULL;
	
	// 父目录字段
	if( strlen(data) == 0 )	//根目录
	{
		temp_field_I_list = 0;
	}else{				//子目录
		temp_field_I_list = (WORD)(*data);
	}
	field_I_index = &temp_field_I_list;

	I_index_list += ( *field_I_index );			//确定一级索引表
	if( I_index_list->num == 0 )
		goto endrv;
			
	if( ( record_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * I_index_list->num ) ) == NULL ) 
	{
		SysLfree( lacb->head );
		return NULL;
	}

	memdbgprintf( "### Sort Record ###" );

	next_record_data = record_head;
	next_record_index = I_index_list->next;
	for( count = 0, i = 0; i < I_index_list->num; i++ )
	{
		//获取记录表上已有记录的同一字段值
		tmp_id = next_record_index->index;
		read_rv = GlobalReadRecord( lacb->gacb->PLInfo, tmp_id, &record );
		if( read_rv != DB_OK )
			goto endrv;
		head_info = (DBRECORDHEAD *)record;
		record_size = head_info->size;

		record_data = (BYTE *)(&head_info->data);
#ifdef SIM_ON_PC
		field_head = (WORD *)record_data;
		if( field_head[NOTEPAD_PARENT_FIELD] != 0 )
		{
			field_value = record_data + field_head[NOTEPAD_PARENT_FIELD];
#else
		ByteReversal( &field_head, record_data+(NOTEPAD_PARENT_FIELD*sizeof(WORD)) );
		if( field_head != 0 )
		{
			field_value = record_data + field_head;
#endif
			if( strlen(data) == 0 )
			{
				rv = 0;			//根目录
			}else{
				rv = strcmp( field_value, data );	//判断是否是同目录
			}
			if( rv == 0 )	//同目录
			{
				next_record_data->index = tmp_id;
				next_record_data->datalen = record_size;
				next_record_data->data = record;
				count++;
				next_record_data++;
			}else{
				SysLfree(record);
			}
		}else{
			SysLfree(record);
		}
		next_record_index = next_record_index->next;
	}
	memdbgprintf( "### Sort Record OK ###" );

	lacb->head->num = count;
	if( count == 0 )
	{
		SysLfree( record_head );
		goto endrv;
	}else{
		if( ( lacb->head->head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * count ) ) == NULL ) 
		{
			SysLfree( record_head );
			SysLfree( lacb->head );
			return NULL;
		}

		memcpy( lacb->head->head, record_head, ( sizeof(RECORDDATA) * count ) );
	//	lacb->head->head = record_head;
		SysLfree( record_head );
		NotepadDBSortList( lacb, lacb->head, field, 0 );
	}

endrv:
	return ( lacb->head );
}

/**********************************************************************/
//对指定列表进行排序
LOCALSEARCHLIST* NotepadDBSortList( DBLACB *lacb, LOCALSEARCHLIST *searchlist, BYTE field, BYTE reserved )
{	
	WORD				i, count;
	CHAR				rv;			//字段值比较结果
	DBRECORDHEAD		*head_info, *tmp_head_info;
	BYTE				*record_data, *field_value, *tmp_data, *tmp_field_value;
#ifdef SIM_ON_PC
	WORD				*field_head, *tmp_field_head;
#else
	WORD				field_head, tmp_field_head;
#endif
	RECORDDATA			*next_record_data;

	//验证字段的有效性
	if( ( field != NOTEPAD_NAME_FIELD ) && ( field != NOTEPAD_MODIFY_TIME_FIELD) )
		return NULL;
	
	if(  searchlist->num != 0 )
	{
		count = searchlist->num;
		if( ( next_record_data = (RECORDDATA *)SysLmalloc(sizeof(RECORDDATA)) ) == NULL )
			return NULL;
		while( count != 1 )	//冒泡算法
		{
			for( i = 0; i < (WORD)( count - 1 ) ; i++ )
			{
				head_info = (DBRECORDHEAD *)( searchlist->head[i].data );
				record_data = (BYTE *)(&head_info->data);
#ifdef SIM_ON_PC
				field_head = (WORD *)record_data;
				if( field_head[field] != 0 )
					field_value = record_data + field_head[field];
#else
				ByteReversal( &field_head, record_data+(field*sizeof(WORD)) );
				if( field_head != 0 )
					field_value = record_data + field_head;
#endif

				tmp_head_info = (DBRECORDHEAD *)( searchlist->head[i+1].data );
				tmp_data = (BYTE *)(&tmp_head_info->data);
#ifdef SIM_ON_PC
				tmp_field_head = (WORD *)tmp_data;
				if( tmp_field_head[field] != 0 )
					tmp_field_value = tmp_data + tmp_field_head[field];
#else
				ByteReversal( &tmp_field_head, tmp_data+(field*sizeof(WORD)) );
				tmp_field_head = (WORD *)tmp_data;
				if( tmp_field_head != 0 )
					tmp_field_value = tmp_data + tmp_field_head;
#endif

				switch( field )
				{
					case NOTEPAD_NAME_FIELD:
						rv = CompareChar( field_value, tmp_field_value );
						break;
					case NOTEPAD_MODIFY_TIME_FIELD:
						rv = strcmp( field_value, tmp_field_value );
						break;
				}
				if( rv > 0 )	//名字按拼音和长度排列(大的放后面),交换;时间按新的放在后面
				{
					//暂存前一个数据
					next_record_data->index = searchlist->head[i].index;
					next_record_data->data = searchlist->head[i].data;
					next_record_data->datalen = searchlist->head[i].datalen;

					//重新写入前一个数据
					searchlist->head[i].index = searchlist->head[i+1].index;
					searchlist->head[i].data = searchlist->head[i+1].data;
					searchlist->head[i].datalen = searchlist->head[i+1].datalen;

					//重新写入后一个数据
					searchlist->head[i+1].index = next_record_data->index;
					searchlist->head[i+1].data = next_record_data->data;
					searchlist->head[i+1].datalen = next_record_data->datalen;
				}
			}
			count--;
		}
		SysLfree( next_record_data );
	}
	if( searchlist->num != 0 )
	{
		i = DetachListDirandFile( searchlist->num, searchlist->head, searchlist );
		if( i == DB_ERROR )
		{
			SysLfree( searchlist->head );
			return NULL;

⌨️ 快捷键说明

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