📄 ntpaddb.c
字号:
}
}
return searchlist;
}
/*************** Local Functions ********************/
//初始化一级索引表
void InitIndexList( void )
{
WORD i;
// 父目录一级索引表
for( i = 0; i < 256; i++ )
{
NotepadParentField[i].next = NULL;
NotepadParentField[i].prev = NULL;
NotepadParentField[i].sub = NULL;
NotepadParentField[i].index = i; // 0 to 256
NotepadParentField[i].num = 0;
}
// 目录/文件的id索引表
for( i = 0; i < 256; i++ )
{
NotepadIDField[i].next = NULL;
NotepadIDField[i].prev = NULL;
NotepadIDField[i].sub = NULL;
NotepadIDField[i].index = i; // 0 to 256
NotepadIDField[i].num = 0;
}
// 姓名一级索引表 // for( i = 0; i < 26; i++ )
for( i = 0; i < 27; i++ )
{
NotepadNameField_I[i].next = NULL;
NotepadNameField_I[i].prev = NULL;
NotepadNameField_I[i].sub = NULL;
NotepadNameField_I[i].index = (WORD)(97+i); // 'a' to 'z'
NotepadNameField_I[i].num = 0;
}
// 创建时间一级索引表
for( i = 0; i < 12; i++ )
{
NotepadModifyTimeField_I[i].next = NULL;
NotepadModifyTimeField_I[i].prev = NULL;
NotepadModifyTimeField_I[i].sub = NULL;
NotepadModifyTimeField_I[i].index = i; // 0 to 11
NotepadModifyTimeField_I[i].num = 0;
}
}
/**********************************************************************/
// 将字段值加入到字段索引表
DWORD Add2FieldIndexTbl( DBGACB *gacb, BYTE field, BYTE *value, DWORD id )
{
FIELDINDEXLIST *list;
BYTE *temp; //指向字段的暂存指针
BYTE i;
BYTE PY_num = 0; //存放汉字的多音字的个数
FIELDINDEX *I_index_list, *II_index_list; //一、二级索引表
WORD field_I_index[PY_MAX_NUM], field_II_index[PY_MAX_NUM];//字段一二级索引值
RECORDINDEX *new_record_head; //新纪录的地址
if( value == NULL )
return DB_ERROR;
temp = value;
list = gacb->FList;
I_index_list = list[field].head; //链接一级索引表
switch( field )
{
case NOTEPAD_PARENT_FIELD: // 父目录字段
if( strlen(value) == 0 )
{
*field_I_index = 0;
}else{
*field_I_index = *value;
}
I_index_list += ( *field_I_index ); //确定一级索引表
new_record_head = Add2RecordIndexTbl( I_index_list, id );
Add2RecordIndex( gacb->RFList, id, new_record_head );// 将字段索引加入到记录字段表
break;
case NOTEPAD_ID_FIELD: // 目录/文件的id字段
if( ( *value < 0 ) || ( *value > 255 ) )
return DB_ERROR;
*field_I_index = *value;
I_index_list += ( *field_I_index );//确定一级索引表
new_record_head = Add2RecordIndexTbl( I_index_list, id );
Add2RecordIndex( gacb->RFList, id, new_record_head );// 将字段索引加入到记录字段表
break;
case NOTEPAD_NAME_FIELD: // 目录/文件的名称字段
GetNameFieldIandIIIndex( temp, field_I_index, field_II_index, &PY_num); //将字段值转化为索引
for( i = 0; i <= PY_num; i++ ) //把单音字/多音字逐个添加到字段索引表中
{
I_index_list += ( field_I_index[i] - 'a' );
II_index_list = CreateIIIndexList( I_index_list, field );// 新建姓名二级索引表
II_index_list += ( field_II_index[i] );//确定二级索引表
new_record_head = Add2RecordIndexTbl( II_index_list, id );
Add2RecordIndex( gacb->RFList, id, new_record_head );// 将字段索引加入到记录字段表
I_index_list = list[field].head;
// field_I_index++;
// field_II_index++;
}
// field_I_index -= (PY_num+1);
// field_II_index -= (PY_num+1);
break;
case NOTEPAD_MODIFY_TIME_FIELD: // 修改时间字段
GetTimeFieldIandIIIndex( temp, field_I_index, field_II_index ); //将字段值转化为索引
I_index_list += ( *field_I_index );//确定一级索引表
II_index_list = CreateIIIndexList( I_index_list, field );// 新建二级索引表
II_index_list += ( *field_II_index );//确定二级索引表
new_record_head = Add2RecordIndexTbl( II_index_list, id );
Add2RecordIndex( gacb->RFList, id, new_record_head );// 将字段索引加入到记录字段表
break;
default:
break;
}
return DB_OK;
}
/**********************************************************************/
//创建新的二级索引表
FIELDINDEX *CreateIIIndexList( FIELDINDEX *I_index_list, BYTE field )
{
BYTE k;
FIELDINDEX *II_index_list;
II_index_list = I_index_list->sub; //链接二级索引表
if( II_index_list == NULL ) //二级索引表为空,则动态申请二级索引表
{
switch( field )
{
case NOTEPAD_NAME_FIELD: // 目录/文件的名称字段
I_index_list->num = 54; //更新一级索引表的索引数
break;
case NOTEPAD_MODIFY_TIME_FIELD: // 修改时间字段
I_index_list->num = 31; //更新一级索引表的索引数
break;
default:
return NULL;
}
if( ( II_index_list = (FIELDINDEX *)SysLmalloc( sizeof(FIELDINDEX) * ( I_index_list->num ) ) ) == NULL )
return NULL;
I_index_list->sub = II_index_list; //链接二级索引表
// 新建二级索引表
for( k = 0; k < I_index_list->num; k++ )
{
II_index_list[k].next = NULL;
II_index_list[k].prev = NULL;
II_index_list[k].sub = NULL;
II_index_list[k].index = k;
II_index_list[k].num = 0;
}
}
return ( II_index_list );
}
/**********************************************************************/
//分开查找表中的目录和文件
WORD DetachListDirandFile( WORD count, RECORDDATA *record_head, LOCALSEARCHLIST *head )
{
RECORDDATA *record_data_head, *next_record_head, *next_record_data;
DBRECORDHEAD *head_info;
BYTE *record_data, *field_value;
#ifdef SIM_ON_PC
WORD *field_head;
#else
WORD field_head;
#endif
WORD i;
if( ( record_data_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * count ) ) == NULL )
return DB_ERROR;
next_record_head = record_data_head;
next_record_data = record_head;
//把目录和文件分开(现放目录,后放文件)
for( i = 0; i < count; i++ ) //放目录
{
head_info = (DBRECORDHEAD *)(next_record_data->data);
record_data = (BYTE *)(&head_info->data);
#ifdef SIM_ON_PC
field_head = (WORD *)record_data;
field_value = record_data + field_head[NOTEPAD_ID_FIELD];
#else
ByteReversal( &field_head, record_data+(NOTEPAD_ID_FIELD*sizeof(WORD)) );
field_value = record_data + field_head;
#endif
if( *field_value != 0 )
{
memcpy( next_record_head, next_record_data, sizeof(RECORDDATA) );
next_record_head++;
}
next_record_data++;
}
next_record_data = record_head;
for( i = 0; i < count; i++ ) //放文件
{
head_info = (DBRECORDHEAD *)(next_record_data->data);
record_data = (BYTE *)(&head_info->data);
#ifdef SIM_ON_PC
field_head = (WORD *)record_data;
field_value = record_data + field_head[NOTEPAD_ID_FIELD];
#else
ByteReversal( &field_head, record_data+(NOTEPAD_ID_FIELD*sizeof(WORD)) );
field_value = record_data + field_head;
#endif
if( *field_value == 0 )
{
memcpy( next_record_head, next_record_data, sizeof(RECORDDATA) );
next_record_head++;
}
next_record_data++;
}
SysLfree( record_head );
head->num = count;
head->head = record_data_head;
return DB_OK;
}
/**********************************************************************/
//获得父目录的各级记录
DWORD GetParentRecord( DBLACB *lacb, LOCALSEARCHLIST *head, FIELDINDEX *I_index_list, BYTE *data )
{
WORD i, j, k, count;
WORD *field_I_index, *temp_field_I_index;
BYTE *temp, dir[50]; //dir为目录路径的深度
BYTE *record, *record_data, *field_value;
FIELDINDEX *temp_index_list;
RECORDINDEX *next_record_head;
RECORDDATA *record_data_index, *next_record_index;
DBRECORDHEAD *head_info;
DWORD tmp_id, read_rv;
#ifdef SIM_ON_PC
WORD *field_head;
#else
WORD field_head;
#endif
CHAR rv;
temp = data;
count = (WORD)strlen(temp); //计算父目录的级数
if( count == 0 ) //父目录是根目录
return DB_OK; //搜索获得的列表长度为0,表示是根目录
//非根目录
//申请索引号
if( ( field_I_index = (WORD *)SysLmalloc( sizeof(WORD) * count ) ) == NULL )
{
SysLfree( head );
return DB_ERROR;
}
temp_field_I_index = field_I_index;
//申请搜索列表
if( ( record_data_index = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * count ) ) == NULL )
{
SysLfree( head );
SysLfree( field_I_index );
return DB_ERROR;
}
next_record_index = record_data_index;
//获得父目录的各级id号
for( i = 0; i < count; i++ )
{
*temp_field_I_index = *temp;
temp_field_I_index++;
temp++;
}
temp_field_I_index = field_I_index;
for( i = 0; i < count; i++ ) //获得父目录的记录列表
{
temp_index_list = I_index_list + ( *temp_field_I_index ); //确定一级索引
if( temp_index_list->num == 0 )
{
SysLfree( head );
SysLfree( field_I_index );
SysLfree( record_data_index );
return DB_ERROR;
}
//获取记录表上已有记录的同一字段值
next_record_head = temp_index_list->next;
for( j = 0; j < temp_index_list->num; j++ )
{
tmp_id = next_record_head->index;
read_rv = GlobalReadRecord( lacb->gacb->PLInfo, tmp_id, &record );
if( read_rv != DB_OK )
{
SysLfree( head );
SysLfree( field_I_index );
return DB_ERROR;
}
head_info = (DBRECORDHEAD *)record;
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
//获得给定父目录中某级的父目录
k = 0;
temp = data;
while( k != i )
{
dir[k] = *temp;
k++;
temp++;
}
dir[k] = '\0';
rv = strcmp( field_value, dir ); //比较父目录
if( rv == 0 ) //找到此目录
{
next_record_index->index = tmp_id;
next_record_index->data = record;
next_record_index->datalen = head_info->size;
next_record_index++;
break;
}else{
SysLfree(record);
}
}else{
SysLfree( record );
}
next_record_head = next_record_head->next;
// SysLfree( record );
}
if( j == temp_index_list->num ) //给定的父目录中有无效的目录号
{
SysLfree( head );
SysLfree( field_I_index );
SysLfree( record_data_index );
return DB_ERROR;
}
temp_field_I_index++;
}
head->head = record_data_index;
head->num = count;
return DB_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -