📄 database.c
字号:
default:
return _DB_ELSE_ERROR; // 其它类型时表示出错
}
}
*pRecord=DB_REC_NORMAL; // 结尾加上有效记录标记
return _DB_CORRECT;
}
// 增加一条记录,OK
int db_addRecord(int databaseID, unsigned long recordID,void *buffer)
{
int hFile;
int len;
int num;
unsigned char *pDelete;
if(!buffer)
{
gDatabase[databaseID].error=_DB_ELSE_ERROR;
return _DB_ELSE_ERROR; // 数据错误
}
if( (unsigned int)databaseID>=_DB_DBD_MAX )
{
gDatabase[databaseID].error=_DB_ID_ERROR;
return _DB_ID_ERROR; // ID号错误
}
hFile=gDatabase[databaseID].hFile;
if( hFile<0)
{
gDatabase[databaseID].error=_DB_ID_ERROR;
return _DB_ID_ERROR; // ID号错误
}
if( fs_lseek(hFile,0,SEEK_END)<0 ) // 定位到文件结尾
{
gDatabase[databaseID].error=_FS_ERROR;
return _FS_ERROR; // 定位文件指针出错
}
if(_db_encodeRecord(databaseID,buffer)!=_DB_CORRECT ) // 编码一条记录
{
gDatabase[databaseID].error=_DB_ELSE_ERROR;
return _DB_ELSE_ERROR; // 记录编码错误
}
len=gDatabase[databaseID].recordSize;
if( fs_write(hFile,gDatabase[databaseID].pRecord,len)!=len )
{
gDatabase[databaseID].error=_FS_ERROR;
return _FS_ERROR; // 保存记录错误
}
gDatabase[databaseID].curRecord=gDatabase[databaseID].recordNum; // 当前记录指向新记录
gDatabase[databaseID].curPosition=gDatabase[databaseID].recordTotal;
num=gDatabase[databaseID].recordTotal;
gDatabase[databaseID].recordNum++; // 有效记录加1
gDatabase[databaseID].recordTotal++; // 物理记录加1
pDelete=gDatabase[databaseID].pDelete;
if( num%8 )
pDelete[num/8]|=(0x80>>(num%8));
else
pDelete[num/8]=0x80;
gDatabase[databaseID].error=_DB_CORRECT;
// fs_flush(gDatabase[databaseID].hFile);
// fs_flush(gDatabase[databaseID].hmem);
fs_flushAll(); // by zhangxp
return _DB_CORRECT;
}
// 将第n条有效记录设置为当前记录,在调用本函数前后必须进出关键代码段保护,OK
int _db_recSet(int databaseID,int nth, int type)
{
int n,count;
register int j,i;
unsigned char *pDelete,delFlag;
if(nth>=gDatabase[databaseID].recordNum || nth<0)
return _DB_NOT_FOUND;
if(type==_DB_END)
nth=gDatabase[databaseID].recordNum-nth-1;
pDelete=gDatabase[databaseID].pDelete;
n=(gDatabase[databaseID].recordTotal+7)/8;
count=0;
for(i=0;i<n;i++)
{
delFlag=pDelete[i];
if(delFlag==0xff)
{
count+=8;
if(count>=nth)
{
gDatabase[databaseID].curPosition=(i+1)*8-(count-nth);
gDatabase[databaseID].curRecord=nth; // 保存当前记录号
return _DB_CORRECT;
}
}
else
{
for(j=0;j<8;j++)
{
if( delFlag&0x80 ) // 记录有效
{
if( count==nth )
{
gDatabase[databaseID].curPosition=i*8+j; // 保存当前记录的物理记录号
gDatabase[databaseID].curRecord=nth; // 保存当前记录号
return _DB_CORRECT;
}
count++;
}
delFlag<<=1;
}
}
}
return _DB_NOT_FOUND;
}
// 将当前记录读进缓冲区中,OK
int _db_recRead(int databaseID)
{
int hFile;
int size;
hFile=gDatabase[databaseID].hFile;
size=gDatabase[databaseID].recordSize;
// 文件指针定位到当前记录
if( fs_lseek(hFile,gDatabase[databaseID].offset+size*gDatabase[databaseID].curPosition,SEEK_SET)<0 )
return _FS_ERROR;
// 将记录内容读进缓冲区
if( fs_read(hFile,gDatabase[databaseID].pRecord,size)!=size )
return _FS_ERROR;
return _DB_CORRECT;
}
// 将缓冲区中的数据写进当前记录,OK
int _db_recWrite(int databaseID)
{
int hFile;
int size;
hFile=gDatabase[databaseID].hFile;
size=gDatabase[databaseID].recordSize;
// 文件指针定位到当前记录
if( fs_lseek(hFile,gDatabase[databaseID].offset+size*gDatabase[databaseID].curPosition,SEEK_SET)<0 )
return _FS_ERROR;
// 将缓冲区内容写进记录
if( fs_write(hFile,gDatabase[databaseID].pRecord,size)!=size )
return _FS_ERROR;
//fs_flush(gDatabase[databaseID].hFile);
//fs_flush(gDatabase[databaseID].hmem);
fs_flushAll(); // by zhangxp
return _DB_CORRECT;
}
// 将当前记录置上删除标记,OK
int _db_recDelete(int databaseID)
{
int hFile;
int size, len;
unsigned char ch;
int pos;
TRecordHead recordHead;
hFile=gDatabase[databaseID].hFile;
size=gDatabase[databaseID].recordSize;
/*
// 文件指针定位到当前记录
if( fs_lseek(hFile,gDatabase[databaseID].offset+size*gDatabase[databaseID].curPosition+size-1,
SEEK_SET)<0 )
return _FS_ERROR;
// 将删除标记写进记录
ch=DB_REC_DELETE;
*/
// by zhangxp 2003/07/02
//////////////////////////////////
if( fs_lseek(hFile,gDatabase[databaseID].offset+size*gDatabase[databaseID].curPosition,SEEK_SET)<0 )
return _FS_ERROR;
len = sizeof(TRecordHead);
// 将记录头读进缓冲区
if( fs_read(hFile, &recordHead, len)!=len )
return _FS_ERROR;
// 文件指针定位到当前记录
if( fs_lseek(hFile,gDatabase[databaseID].offset+size*gDatabase[databaseID].curPosition+size-1,
SEEK_SET)<0 )
return _FS_ERROR;
// 将删除标记写进记录
if(recordHead.SyncAttr==SYNCATTR_NEW || recordHead.SyncAttr==SYNCATTR_DEL)
ch=DB_REC_REMOVE;
else
ch=DB_REC_DELETE;
/////////////////////////////////
if( fs_write(hFile,&ch,1)!=1 )
return _FS_ERROR;
//fs_flush(hFile);
pos=gDatabase[databaseID].curPosition;
gDatabase[databaseID].pDelete[pos/8]&=~(0x80>>pos%8);
fs_flushAll(); // by zhangxp
return _DB_CORRECT;
}
// 读出第n条记录,OK
int db_readNthRecord(int databaseID, unsigned long recordID, void *buffer,int nth, int type)
{
int curRecord,curPosition;
int result;
if( (unsigned int)databaseID>=_DB_DBD_MAX )
return _DB_ID_ERROR; // ID号错误
if( gDatabase[databaseID].hFile<0 )
return _DB_ID_ERROR; // ID号错误
curRecord=gDatabase[databaseID].curRecord; // 保存当前记录信息
curPosition=gDatabase[databaseID].curPosition;
dbEnterWCS();
result=_db_recSet(databaseID,nth,type); // 将第n条记录设置为当前记录
dbExitWCS();
if( result!=_DB_CORRECT )
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=result;
return result;
}
result=_db_recRead(databaseID); // 读出当前记录
if( result!=_DB_CORRECT )
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=result;
return result;
}
result=_db_decodeRecord(databaseID,buffer); // 解码当前记录
if( result!=_DB_CORRECT )
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=result;
return result;
}
gDatabase[databaseID].error=_DB_CORRECT; // 操作成功
return _DB_CORRECT;
}
// 写入第n条记录,OK
int db_writeNthRecord(int databaseID, unsigned long recordID, void * buffer,int nth, int type)
{
int curRecord,curPosition;
int result;
if( (unsigned int)databaseID>=_DB_DBD_MAX )
return _DB_ID_ERROR; // ID号错误
if( gDatabase[databaseID].hFile<0 )
return _DB_ID_ERROR; // ID号错误
curRecord=gDatabase[databaseID].curRecord; // 保存当前记录信息
curPosition=gDatabase[databaseID].curPosition;
dbEnterWCS();
result=_db_recSet(databaseID,nth,type); // 将第n条记录设置为当前记录
dbExitWCS();
if( result!=_DB_CORRECT )
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=result;
return result;
}
result=_db_encodeRecord(databaseID,buffer); // 编码当前记录
if( result!=_DB_CORRECT )
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=result;
return result;
}
result=_db_recWrite(databaseID); // 写入当前记录
if( result!=_DB_CORRECT )
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=result;
return result;
}
gDatabase[databaseID].error=_DB_CORRECT; // 操作成功
return _DB_CORRECT;
}
// 删除第n条记录,OK
int db_deleteNthRecord(int databaseID, unsigned long recordID, int nth, int type)
{
int result;
int curRecord,curPosition;
if( (unsigned int)databaseID>=_DB_DBD_MAX )
return _DB_ID_ERROR; // ID号错误
if( gDatabase[databaseID].hFile<0 )
return _DB_ID_ERROR; // ID号错误
curRecord=gDatabase[databaseID].curRecord; // 保存当前记录信息
curPosition=gDatabase[databaseID].curPosition;
dbEnterWCS();
result=_db_recSet(databaseID,nth,type); // 将第n条记录设置为当前记录
dbExitWCS();
if( result!=_DB_CORRECT)
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=result;
return result;
}
// 写删除标记
result=_db_recDelete(databaseID);
if( result!=_DB_CORRECT ) // 写入删除标记
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=_FS_ERROR;
return _FS_ERROR;
}
gDatabase[databaseID].curRecord=-1; // 失去当前记录
gDatabase[databaseID].curPosition=-1;
gDatabase[databaseID].recordNum--;
gDatabase[databaseID].error=_DB_CORRECT; // 操作成功
return _DB_CORRECT;
}
// 获取最后一次操作的错误代码,OK
int db_getLastError(int databaseID,int *errorCode)
{
if( (unsigned int)databaseID>=_DB_DBD_MAX )
return _DB_ID_ERROR; // ID号错误
if( gDatabase[databaseID].hFile<0 )
return _DB_ID_ERROR; // ID号错误
*errorCode=gDatabase[databaseID].error;
return _DB_CORRECT;
}
// 获取有效记录数,OK
int db_getRecordNumber(int databaseID,int *num)
{
if( (unsigned int)databaseID>=_DB_DBD_MAX )
return _DB_ID_ERROR; // ID号错误
if( gDatabase[databaseID].hFile<0 )
return _DB_ID_ERROR; // ID号错误
*num=gDatabase[databaseID].recordNum;
return _DB_CORRECT;
}
// 获取记录总数,OK
int db_getRecordTotal(int databaseID,int *num)
{
if( (unsigned int)databaseID>=_DB_DBD_MAX )
return _DB_ID_ERROR; // ID号错误
if( gDatabase[databaseID].hFile<0 )
return _DB_ID_ERROR; // ID号错误
*num=gDatabase[databaseID].recordTotal;
return _DB_CORRECT;
}
// 指针移到第一条记录,OK
int db_recFirst(int databaseID)
{
int curRecord,curPosition;
int result;
if( (unsigned int)databaseID>=_DB_DBD_MAX )
return _DB_ID_ERROR; // ID号错误
if( gDatabase[databaseID].hFile<0 )
return _DB_ID_ERROR; // ID号错误
curRecord=gDatabase[databaseID].curRecord; // 保存当前记录信息
curPosition=gDatabase[databaseID].curPosition;
dbEnterWCS();
result=_db_recSet(databaseID,0,_DB_SET); // 将第一条记录设置为当前记录
dbExitWCS();
if( result!=_DB_CORRECT )
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=result;
return result;
}
gDatabase[databaseID].error=_DB_CORRECT;
return _DB_CORRECT;
}
// 指针移到最后一条记录,OK
int db_recLast(int databaseID)
{
int curRecord,curPosition;
int result;
if( (unsigned int)databaseID>=_DB_DBD_MAX )
return _DB_ID_ERROR; // ID号错误
if( gDatabase[databaseID].hFile<0 )
return _DB_ID_ERROR; // ID号错误
curRecord=gDatabase[databaseID].curRecord; // 保存当前记录信息
curPosition=gDatabase[databaseID].curPosition;
dbEnterWCS();
result=_db_recSet(databaseID,0,_DB_END); // 将最后一条记录设置为当前记录
dbExitWCS();
if( result!=_DB_CORRECT )
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=result;
return result;
}
gDatabase[databaseID].error=_DB_CORRECT;
return _DB_CORRECT;
}
// 指针移到下一条记录,OK
int db_recNext(int databaseID)
{
int curRecord,curPosition;
int result;
if( (unsigned int)databaseID>=_DB_DBD_MAX )
return _DB_ID_ERROR; // ID号错误
if( gDatabase[databaseID].hFile<0 )
return _DB_ID_ERROR; // ID号错误
curRecord=gDatabase[databaseID].curRecord; // 保存当前记录信息
curPosition=gDatabase[databaseID].curPosition;
if( curRecord==-1 ) // 不存在当前记录
{
gDatabase[databaseID].error=_REC_NO_ERROR;
return _REC_NO_ERROR;
}
dbEnterWCS();
result=_db_recSet(databaseID,curRecord+1,_DB_SET);
dbExitWCS();
if( result!=_DB_CORRECT)
{
gDatabase[databaseID].curRecord=curRecord; // 恢复当前记录信息
gDatabase[databaseID].curPosition=curPosition;
gDatabase[databaseID].error=result;
return result;
}
gDatabase[databaseID].error=_DB_CORRECT;
return _DB_CORRECT;
}
// 指针移到前一条记录,OK
int db_recPrev(int databaseID)
{
int curRecord,curPosition;
int result;
if( (unsigned int)databaseID>=_DB_DBD_MAX )
return _DB_ID_ERROR; // ID号错误
if( gDatabase[databaseID].hFile<0 )
return _DB_ID_ERROR; // ID号错误
curRecord=gDatabase[databaseID].curRecord; // 保存当前记录信息
curPosition=gDatabase[databaseID].curPosition;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -