📄 ntpaddb.c
字号:
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 + -