📄 common.c
字号:
RECORDINDEX *match_record, *next_match_record, *prev_match_record;
tmp_local_list = *local_search_list;
if( ( match_record = (RECORDINDEX *)SysLmalloc( sizeof( RECORDINDEX ) ) ) == NULL )
return DB_ERROR;
if( tmp_local_list == NULL ) //无记录
{
tmp_local_list = match_record;
*local_search_list = tmp_local_list;
tmp_local_list->next = NULL;
tmp_local_list->prev = NULL;
tmp_local_list->index = id;
return DB_OK;
}
next_match_record = tmp_local_list;
while( next_match_record != NULL ) //寻找局部查找表的尾记录
{
prev_match_record = next_match_record;
next_match_record = prev_match_record->next;
}
prev_match_record->next = match_record; //把新纪录添加到局部查找表上
match_record->next = NULL;
match_record->prev = prev_match_record;
match_record->index = id;
return DB_OK;
}
/**********************************************************************/
LOCALSEARCHLIST *SearchTimeRange( DBLACB *lacb, BYTE *data, FIELDINDEX *index_list, BYTE time_field )
{
WORD field_I_index, field_II_index;
FIELDINDEX *I_index_list, *II_index_list, *temp_II_index_list;
FIELDINDEX *month_I_index_list = NULL, *week_II_index_list_1 = NULL, *week_II_index_list_2 = NULL, *special_II_index_list = NULL;
RECORDDATA *record_data_head, *record_head, *next_record_data;
RECORDINDEX *next_record_index;
DBRECORDHEAD *head_info;
DWORD tmp_id;
WORD i, j, k, count = 0;
TIME_INDEX com_time;
TIME_INDEX com_time_int, time;
WORD day_num;
BYTE search_range;
DWORD read_rv = DB_OK;
search_range = (BYTE)( *(data) & 0x0f );
data++;
memcpy( &com_time, data, sizeof(TIME_INDEX) );
Time2Int( &com_time, &com_time_int );
I_index_list = index_list;
GetTimeFieldIandIIIndex( data, &field_I_index, &field_II_index );
I_index_list += field_I_index; //确定一级索引表
if( I_index_list->sub == NULL )
goto endrv;
II_index_list = I_index_list->sub;
II_index_list += field_II_index;//确定二级索引表
switch( search_range )
{
case DAY_RANGE:
if( II_index_list->num == 0 )
goto endrv;
if( ( record_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * II_index_list->num ) ) == NULL )
return NULL;
next_record_data = record_head;
next_record_index = II_index_list->next;
for( count = 0, i = 0; i < II_index_list->num; i++ )
{
//获取记录表上已有记录的同一字段值
tmp_id = next_record_index->index;
time = GetRecordInfo( tmp_id, lacb->gacb->PLInfo, &head_info, time_field );
if( com_time_int.year == time.year ) //同年同月同日
{
count++;
next_record_data->index = tmp_id;
next_record_data->data = (BYTE *)head_info;
next_record_data->datalen = head_info->size;
next_record_data++;
}else{
SysLfree( head_info );
}
next_record_index = next_record_index->next;
}
goto GetSearchList;
break;
case WEEK_RANGE:
if( ( field_II_index + 1 ) < 7 ) //换月
{
//区分平年和闰年(2月)的换月
if( ( field_I_index + 1 ) == 3 )
{
month_I_index_list = I_index_list - 1;
if( month_I_index_list->sub != NULL ) //下一个月有二级索引
{
week_II_index_list_1 = month_I_index_list->sub;
if( com_time_int.year%4 == 0 ) //闰年(2月29天)
{
week_II_index_list_1 += ( 29 - ( 7 - ( field_II_index + 1 ) ) );
week_II_index_list_2 = month_I_index_list->sub + 28;
}else{ //平年(2月28天)
week_II_index_list_1 += ( 28 - ( 7 - ( field_II_index + 1 ) ) );
week_II_index_list_2 = month_I_index_list->sub + 27;
}
}
}
//处理换月后为小月(30天)
if( ( ( field_I_index + 1 ) == 5 ) || ( ( field_I_index + 1 ) == 7 )
|| ( ( field_I_index + 1 ) == 10 ) || ( ( field_I_index + 1 ) == 12 ) )
{
month_I_index_list = I_index_list - 1;
if( month_I_index_list->sub != NULL ) //下一个月有二级索引
{
week_II_index_list_1 = month_I_index_list->sub;
week_II_index_list_1 += ( 30 - ( 7 - ( field_II_index + 1 ) ) );
week_II_index_list_2 = month_I_index_list->sub + 29;
}
}
//处理换月后为大月(31天)
if( ( ( field_I_index + 1 ) == 1 ) || ( ( field_I_index + 1 ) == 4 ) || ( ( field_I_index + 1 ) == 6 )
|| ( ( field_I_index + 1 ) == 8 ) || ( ( field_I_index + 1 ) == 9 ) || ( ( field_I_index + 1 ) == 11 ) )
{
if( ( field_I_index + 1 ) == 1 )
{
month_I_index_list = index_list + 11; //处理1月的换月(换年)
}else{
month_I_index_list = I_index_list - 1;
}
if( month_I_index_list->sub != NULL ) //下一个月有二级索引
{
week_II_index_list_1 = month_I_index_list->sub;
week_II_index_list_1 += ( 31 - ( 7 - ( field_II_index + 1 ) ) );
week_II_index_list_2 = month_I_index_list->sub + 30;
}
}
}
//计算记录个数
temp_II_index_list = II_index_list; //计算不用换月的记录
for( j = 0; ( j < ( field_II_index + 1 ) ) && ( j < 7 ); j ++ )
{
lacb->head->num = (WORD)( lacb->head->num + temp_II_index_list->num );
temp_II_index_list--;
}
temp_II_index_list = week_II_index_list_2; //计算换月后的记录
if( temp_II_index_list != NULL )
{
do{
lacb->head->num = (WORD)( lacb->head->num +temp_II_index_list->num );
temp_II_index_list--;
}
while( ( temp_II_index_list + 1 ) != week_II_index_list_1 );
}
if( lacb->head->num == 0 )
goto endrv;
if( ( record_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * lacb->head->num ) ) == NULL )
return NULL;
count = 0;//计算实际符合搜索的记录
next_record_data = record_head;
temp_II_index_list = II_index_list;
for( j = 0; ( j < ( field_II_index + 1 ) ) && ( j < 7 ); j++ ) //链接当前月的记录
{
next_record_index = temp_II_index_list->next;
for( i = 0; i < temp_II_index_list->num; i++ )
{
//获取记录表上已有记录的同一字段值
tmp_id = next_record_index->index;
time = GetRecordInfo( tmp_id, lacb->gacb->PLInfo, &head_info, time_field );
if( com_time_int.year == time.year ) //同年同月同日
{
count++;
next_record_data->index = tmp_id;
next_record_data->data = (BYTE *)head_info;
next_record_data->datalen = head_info->size;
next_record_data++;
}else{
SysLfree( head_info );
}
// else if( count == lacb->head->num )
// {
// break;
// }
next_record_index = next_record_index->next;
}
temp_II_index_list--;
}
if( week_II_index_list_2 == NULL )
{
goto GetSearchList;
}else{
temp_II_index_list = week_II_index_list_2;
}
do{ //链接换月的记录
next_record_index = temp_II_index_list->next;
for( i = 0; i < temp_II_index_list->num; i++ )
{
//获取记录表上已有记录的同一字段值
tmp_id = next_record_index->index;
time = GetRecordInfo( tmp_id, lacb->gacb->PLInfo, &head_info, time_field );
if( ( field_I_index + 1 ) != 1 )
{
if( com_time_int.year == time.year ) //同年同月同日
{
count++;
next_record_data->index = tmp_id;
next_record_data->data = (BYTE *)head_info;
next_record_data->datalen = head_info->size;
next_record_data++;
}else{
SysLfree( head_info );
}
// else if( count == lacb->head->num )
// {
// break;
// }
}else{
if( ( com_time_int.year - 1 ) == time.year ) //前一年
{
count++;
next_record_data->index = tmp_id;
next_record_data->data = (BYTE *)head_info;
next_record_data->datalen = head_info->size;
next_record_data++;
}else{
SysLfree( head_info );
}
// else if( ( ( com_time_int.year - 1 ) > time.year ) || ( count == lacb->head->num ) )
// {
// break;
// }
}
next_record_index = next_record_index->next;
}
temp_II_index_list--;
}while( ( temp_II_index_list + 1 ) != week_II_index_list_1 );
goto GetSearchList;
break;
case MONTH_RANGE:
//区分平年和闰年(2月)的换月
if( ( field_I_index + 1 ) == 3 )
{
if( ( com_time_int.year%4 == 0 ) && ( ( field_II_index + 1 ) != 1 ) )//闰年(2月29天)
{
month_I_index_list = I_index_list - 1;
if( month_I_index_list->sub != NULL ) //下一个月有二级索引
{
week_II_index_list_1 = month_I_index_list->sub + ( field_II_index + 1 ) - 1;
week_II_index_list_2 = month_I_index_list->sub + 28;
}
}
if( com_time_int.year%4 != 0 )//平年(2月28天)
{
month_I_index_list = I_index_list - 1;
if( month_I_index_list->sub != NULL ) //下一个月有二级索引
{
week_II_index_list_1 = month_I_index_list->sub + ( field_II_index + 1 ) - 2;
week_II_index_list_2 = month_I_index_list->sub + 27;
}
}
}
if( ( ( field_I_index + 1 ) == 3 ) && ( ( field_II_index + 1 ) == 1 ) && ( com_time_int.year%4 != 0 ) ) //平年(2月28天)
{
if( ( I_index_list - 2 )->sub != NULL )
{
special_II_index_list = ( I_index_list - 2 )->sub + 30;
}
month_I_index_list = I_index_list - 1;
if( month_I_index_list->sub != NULL ) //下一个月有二级索引
{
week_II_index_list_1 = month_I_index_list->sub;
week_II_index_list_2 = month_I_index_list->sub + 28;
}
}
//处理换月后为小月(30天)
if( ( ( field_I_index + 1 ) == 5 ) || ( ( field_I_index + 1 ) == 7 )
|| ( ( field_I_index + 1 ) == 10 ) || ( ( field_I_index + 1 ) == 12 ) )
{
month_I_index_list = I_index_list - 1;
if( month_I_index_list->sub != NULL ) //下一个月有二级索引
{
week_II_index_list_1 = month_I_index_list->sub + ( field_II_index + 1 );
week_II_index_list_2 = month_I_index_list->sub + 29;
}
}
//处理换月后为大月(31天)
if( ( ( field_I_index + 1 ) == 1 ) || ( ( field_I_index + 1 ) == 4 ) || ( ( field_I_index + 1 ) == 6 )
|| ( ( field_I_index + 1 ) == 8 ) || ( ( field_I_index + 1 ) == 9 ) || ( ( field_I_index + 1 ) == 11 ) )
{
if( ( field_I_index + 1 ) == 1 )
{
month_I_index_list = index_list + 11; //处理1月的换月(换年)
}else{
month_I_index_list = I_index_list - 1;
}
if( month_I_index_list->sub != NULL ) //下一个月有二级索引
{
week_II_index_list_1 = month_I_index_list->sub + ( field_II_index + 1 ) + 1;
week_II_index_list_2 = month_I_index_list->sub + 30;
}
}
//计算记录个数
temp_II_index_list = II_index_list; //计算不用换月的记录
for( j = 0; ( j < ( field_II_index + 1 ) ) && ( j < 30 ); j ++ )
{
lacb->head->num = (WORD)( lacb->head->num +temp_II_index_list->num );
temp_II_index_list--;
}
temp_II_index_list = week_II_index_list_2; //计算换月后的记录
if( temp_II_index_list != NULL )
{
do{
lacb->head->num = (WORD)( lacb->head->num +temp_II_index_list->num );
temp_II_index_list--;
}
while( ( temp_II_index_list + 1 ) != week_II_index_list_1 );
}
temp_II_index_list = special_II_index_list; //计算特殊的一个换月
if( temp_II_index_list != NULL )
{
lacb->head->num = (WORD)( lacb->head->num + temp_II_index_list->num );
}
if( lacb->head->num == 0 )
goto endrv;
if( ( record_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * lacb->head->num ) ) == NULL )
return NULL;
count = 0;//计算实际符合搜索的记录
next_record_data = record_head;
temp_II_index_list = II_index_list;
for( j = 0; ( j < ( field_II_index + 1 ) ) && ( j < 30 ); j++ ) //链接当前月的记录
{
next_record_index = temp_II_index_list->next;
for( i = 0; i < temp_II_index_list->num; i++ )
{
//获取记录表上已有记录的同一字段值
tmp_id = next_record_index->index;
time = GetRecordInfo( tmp_id, lacb->gacb->PLInfo, &head_info, time_field );
if( com_time_int.year == time.year ) //同年同月同日
{
count++;
next_record_data->index = tmp_id;
next_record_data->data = (BYTE *)head_info;
next_record_data->datalen = head_info->size;
next_record_data++;
}else{
SysLfree( head_info );
}
// else if( count == lacb->head->num )
// {
// break;
// }
next_record_index = next_record_index->next;
}
temp_II_index_list--;
}
if( week_II_index_list_2 == NULL )
{
goto GetSearchList;
}else{
temp_II_index_list = week_II_index_list_2;
}
do{ //链接换月的记录
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -