📄 dbfile.cpp
字号:
// DBFile1.cpp: implementation of the CDBFile class.
//
// 2002 - 7 - 30
//
// 2002 - 8 - 5
//
// 2003 - 4 - 22 MemFile , MaskField by lk
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DBFile.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define DBFILE_NAME "dbfile.dat"
CDBFile::CDBFile()
{
m_DataBuffer = NULL;
m_fieldname = NULL;
m_fielddata = NULL;
m_index = NULL;
m_info.Info = NULL;
sprintf(m_dbfilename,"%s",DBFILE_NAME);
memset(&m_head,0,sizeof(m_head));
memset(&m_info,0,sizeof(m_info));
memset(&m_datahd,0,sizeof(m_datahd));
m_bExistIndex = FALSE;
m_bUseMemFile = FALSE;
m_onum = 0;
m_fieldmask = NULL;
}
CDBFile::~CDBFile()
{
if (m_fielddata!=NULL) {
for( int i = 0 ; i < m_fieldhd.FieldNum ; i ++) {
if (m_fielddata[i].DataBuff!=NULL) {
delete m_fielddata[i].DataBuff;
}
}
delete m_fielddata ; m_fielddata = NULL;
}
if (m_fieldname!=NULL) delete m_fieldname;
if (m_fieldmask!=NULL) delete m_fieldmask;
if (m_index!=NULL) delete m_index;
if (m_info.Info!=NULL)
{
delete [] m_info.Info;
m_info.Info=NULL;
}
}
/************************************************************************
EL_DBFileTag
EL_DBFileInfo.Len
EL_DBFileInfo.DBInfo;
*************************************************************************/
int CDBFile::Open(int mode,char *fn)
{
m_bUseMemFile=FALSE;
memset(&m_head,0,sizeof(m_head));
memset(&m_info,0,sizeof(m_info));
memset(&m_datahd,0,sizeof(m_datahd));
if (fn) {
SetFilePath(fn);
}
switch(mode) {
case DB_MODE_CREATE: return CreateFile(m_dbfilename);
case DB_MODE_APPEND: return AddFile(m_dbfilename);
case DB_MODE_READ:
default:
return OpenFile(m_dbfilename);
}
}
int CDBFile::OpenMem(char *buf,int len,int mode)
{
m_bUseMemFile=TRUE;
memset(&m_head,0,sizeof(m_head));
memset(&m_info,0,sizeof(m_info));
memset(&m_datahd,0,sizeof(m_datahd));
switch(mode) {
case DB_MODE_CREATE:
m_mfile.open(CMFile::MF_MODE_CREATE,buf,len);
return CreateFile(m_dbfilename);
break;
case DB_MODE_APPEND:
m_mfile.open(CMFile::MF_MODE_APPEND,buf,len);
return AddFile(m_dbfilename);
break;
case DB_MODE_READ:
default:
m_mfile.open(CMFile::MF_MODE_READ,buf,len);
return OpenFile(m_dbfilename);
break;
}
}
int CDBFile::Close()
{
if(m_info.Info!=NULL)
{
delete m_info.Info;
m_info.Info = NULL;
}
if(m_fp!=NULL) {close_file(m_fp);m_fp=NULL;}
return 0;
}
//创建
int CDBFile::CreateFile(char *fn)
{
if ((m_fp=open_file(fn,"wb"))==NULL)
{ return -1; }
memset(&m_head,0,sizeof(m_head));
memset(&m_info,0,sizeof(m_info));
memset(&m_datahd,0,sizeof(m_datahd));
m_head.flag[0]='E';
m_head.flag[1]='L';
memset(m_head.Result,'L',sizeof(m_head.Result));
if(write_file(&m_head,1,sizeof(EL_DBFileHeadTag),m_fp)!=sizeof(EL_DBFileHeadTag))
{ return -1; }
return 0;
}
//打开
int CDBFile::OpenFile(char *fn)
{
if ((m_fp=open_file(fn,"rb"))==NULL) return -1;
memset(&m_head,0,sizeof(m_head));
memset(&m_info,0,sizeof(m_info));
//
if(seek_file(m_fp,0,SEEK_SET)!=0){ goto _err; }
// 文件头
if(read_file(&m_head,1,sizeof(m_head),m_fp)!=sizeof(m_head))
{ return -1; }
if (( m_head.flag[0]!='E')||(m_head.flag[1]!='L'))
{
close_file(m_fp);
m_fp=NULL;
AfxMessageBox("非DBFile 文件");
return -1;
};
// 读信息描述区的头
if(read_file(&m_info.InfoLen,1,sizeof(m_info.InfoLen),m_fp)!=sizeof(m_info.InfoLen))
{ goto _err; }
// 读域名头描述
if (m_info.InfoLen){ if(seek_file(m_fp,m_info.InfoLen,SEEK_CUR)!=0) goto _err; }
if (read_file(&m_fieldhd,1,sizeof(m_fieldhd),m_fp)!=sizeof(m_fieldhd)) goto _err;
// 读数据区描述
if (m_fieldhd.FieldLen) { if(seek_file(m_fp,m_fieldhd.FieldLen,SEEK_CUR)!=0) goto _err;}
// 获取数据区偏移
if (read_file(&m_datahd,1,sizeof(m_datahd),m_fp)!=sizeof(m_datahd)) goto _err;
// 初始化信息
//
// 获取信息
if(ReadFileInfo()<0){ goto _err; }
// 获取表名区
if(ReadField()<0){ goto _err; }
//读索引区
if(ReadIndex()<0){ goto _err; }
if (m_bExistIndex==FALSE)
{// 创建索引
if(CreateIndex()<0){ goto _err; }
}
return 0;
_err:
Close();
return -1;
}
// 添加打开
int CDBFile::AddFile(char *fn)
{
if ((m_fp=open_file(fn,"rb+wb"))==NULL) return -1;
memset(&m_head,0,sizeof(m_head));
memset(&m_info,0,sizeof(m_info));
// 文件头
if(read_file(&m_head,1,sizeof(m_head),m_fp)!=sizeof(m_head)) { goto _err; }
if (( m_head.flag[0]!='E')||(m_head.flag[1]!='L')) {
close_file(m_fp); m_fp=NULL;AfxMessageBox("非DBFile 文件");return -1;
};
// 读信息描述区的头
if(read_file(&m_info.InfoLen,1,sizeof(m_info.InfoLen),m_fp)!=sizeof(m_info.InfoLen))
{ goto _err; }
// 读域名头描述
if (m_info.InfoLen){ if(seek_file(m_fp,m_info.InfoLen,SEEK_CUR)!=0) goto _err; }
if (read_file(&m_fieldhd,1,sizeof(m_fieldhd),m_fp)!=sizeof(m_fieldhd)) goto _err;
// 读数据区描述
if (m_fieldhd.FieldLen) { seek_file(m_fp,m_fieldhd.FieldLen,SEEK_CUR);}
// 获取数据区偏移
if (read_file(&m_datahd,1,sizeof(m_datahd),m_fp)!=sizeof(m_datahd)) goto _err;
// 初始化信息
//
// 获取信息
if(ReadFileInfo()<0) { goto _err; }
// 获取表名区
if(ReadField()<0) { goto _err; }
//读索引区
if(ReadIndex()<0) { goto _err; }
if (m_bExistIndex==FALSE)
{// 创建索引
if(CreateIndex()<0){ goto _err; }
}
return 0;
_err:
Close();
return -1;
}
// 获得表信息区位置
DWORD CDBFile::get_fieldoffset()
{ return sizeof(m_head)+sizeof(m_info.InfoLen) +m_info.InfoLen; }
// 获得记录数据位置
DWORD CDBFile::get_dataoffset()
{ return get_fieldoffset() + sizeof(m_fieldhd) + m_fieldhd.FieldLen; }
// 获得索引表的位置
DWORD CDBFile::get_indexoffset()
{ return get_dataoffset() + sizeof(m_datahd) + m_datahd.DataLen; }
// 写DBF的信息区
int CDBFile::WriteFileInfo()
{
// seek_file(m_fp,FILEINFO_OFFSET,SEEK_SET);
if(write_file(&m_info.InfoLen,1,sizeof(m_info.InfoLen),m_fp)!=sizeof(m_info.InfoLen))
{ return -1; }
if (m_info.InfoLen){
if(write_file(m_info.Info,1,m_info.InfoLen,m_fp)!=m_info.InfoLen)
{ return -1; }
}
return 0;
}
// 读DBF的信息区
int CDBFile::ReadFileInfo()
{
if(seek_file(m_fp,FILEINFO_OFFSET,SEEK_SET)!=0){ return -1; }
long len=0;
if(read_file(&m_info.InfoLen,1,sizeof(m_info.InfoLen),m_fp)!=sizeof(m_info.InfoLen))
{
return -1;
}
if (m_info.InfoLen){
m_info.Info = NewInfo(m_info.InfoLen+1);
if(read_file(m_info.Info,1,m_info.InfoLen,m_fp)!=m_info.InfoLen)
{ return -1; }
}
return len;
}
// 写DBF的表名信息
int CDBFile::WriteField()
{
/// seek_file(m_fp,get_fieldoffset(),SEEK_SET);
m_fieldhd.FieldLen = m_fieldhd.FieldNum*sizeof(EL_FieldTag);
m_fieldhd.state[0] = 'I';
m_fieldhd.state[1] = 'N';
if(write_file(&m_fieldhd,1,sizeof(m_fieldhd),m_fp)!=sizeof(m_fieldhd)) { return -1; }
if (m_fieldhd.FieldNum){
for(int i=0;i<(int)m_fieldhd.FieldNum;i++){
if(write_file(&m_fieldname[i],1,sizeof(EL_FieldTag),m_fp)!=sizeof(EL_FieldTag))
{ return -1; }
}
}
return 0;
}
// 读DBF的表名信息
int CDBFile::ReadField()
{
if(seek_file(m_fp,get_fieldoffset(),SEEK_SET)!=0){ return -1; }
if(read_file(&m_fieldhd,1,sizeof(m_fieldhd),m_fp)!=sizeof(m_fieldhd))
{ return -1; }
if (m_fieldhd.FieldNum){
m_fieldname =NewFieldTag(m_fieldhd.FieldNum);
if (m_fieldmask!=NULL) delete m_fieldmask;
m_fieldmask = new char[m_fieldhd.FieldNum];
for(int i=0;i<(int)m_fieldhd.FieldNum;i++){
if(read_file(&m_fieldname[i],1,sizeof(EL_FieldTag),m_fp)!=sizeof(EL_FieldTag))
{ return -1;}
m_fieldmask[i]=0;
}
//有效区间
}
return 0;
}
// 申请表信息空间
EL_FieldTag *CDBFile::NewFieldTag(int num)
{
if (m_fieldname!=NULL) delete m_fieldname;
m_fieldhd.FieldNum = num;
EL_FieldTag *pEF = new EL_FieldTag[num];
memset(pEF,0,sizeof(EL_FieldTag)*num);
return pEF;
}
///
/// 记录集的操作
///
///
// 写记录集头
// 创建索引表
int CDBFile::CreateIndex()
{
if(seek_file(m_fp,get_dataoffset()+sizeof(m_datahd),SEEK_SET)!=0){ return -1; }
int count =get_recordcount();
if (m_index !=NULL) delete m_index;
m_index = new SEEK_TAG[count];
memset(m_index,0,sizeof(SEEK_TAG)*count);
for(int i = 0 ; i < count ; i ++ ) {
m_index[i].index = tell_file(m_fp);
if(read_file(&m_record,1,sizeof(m_record),m_fp)!=sizeof(m_record))
{ return -1; }
if(seek_file(m_fp, m_record.RecordLen,SEEK_CUR)!=0)
{ return -1; }
}
m_indexhd.IndexNum = get_recordcount();
return 0;
}
// 写索引表
int CDBFile::WriteIndex()
{
seek_file(m_fp,get_indexoffset(),SEEK_SET);
/// m_indexhd.IndexNum = get_recordcount();
int count = m_indexhd.IndexNum;
m_indexhd.state[0]='#';
m_indexhd.state[1]='I';
if(write_file(&m_indexhd,1,sizeof(m_indexhd),m_fp)!=sizeof(m_indexhd))
{ return -1; }
/// if (m_index !=NULL) delete m_index;
for(int i = 0 ; i < count ; i ++ ) {
if(write_file(&m_index[i],1,sizeof(m_index[i]),m_fp)!=sizeof(SEEK_TAG))
{ return -1; }
}
return 0;
}
// 读索引表
int CDBFile::ReadIndex()
{
int aa = get_indexoffset();
if(seek_file(m_fp,get_indexoffset(),SEEK_SET)!=0) { return -1; }
/// m_indexhd.IndexNum = get_recordcount();
memset(&m_indexhd,0,sizeof(m_indexhd));
int a;
if((a=read_file(&m_indexhd,1,sizeof(m_indexhd),m_fp)) !=sizeof(m_indexhd))
{
m_bExistIndex=FALSE;
return 0;
}
int count = m_indexhd.IndexNum;
if (m_index !=NULL) delete m_index;
m_index = new SEEK_TAG[count];
memset(m_index,0,sizeof(SEEK_TAG)*count);
for(int i = 0 ; i < count ; i ++ )
{
if(write_file(&m_index[i],1,sizeof(m_index[i]),m_fp)!=sizeof(SEEK_TAG))
{ return -1; }
}
return count;
}
int CDBFile::WriteDataHead()
{
if(seek_file(m_fp,get_dataoffset(),SEEK_SET)!=0)
{ return -1; }
m_datahd.state[0]='*';
m_datahd.state[1]='D';
write_file(&m_datahd,1,sizeof(m_datahd),m_fp);
return 0;
}
// 读记录集头
int CDBFile::ReadDataHead()
{
if(seek_file(m_fp,get_dataoffset(),SEEK_SET)!=0)
{ return -1; }
if(read_file(&m_datahd,1,sizeof(m_datahd),m_fp)!=sizeof(m_datahd))
{ return -1; }
return 0;
}
// 获得记录集总数
int CDBFile::get_recordcount()
{
return m_datahd.DataNum;
}
// 定位一个记录
int CDBFile::SeekRecord(int i)
{
if(seek_file(m_fp, m_index[i].index,SEEK_SET)!=0) return -1;
return 0;
}
// 写一个记录 // 只能追加写入
int CDBFile::WriteRecord()
{
if(seek_file(m_fp,get_indexoffset(),SEEK_SET)!=0){ return -1; }
int curfseek = tell_file(m_fp);
if (curfseek <(int)(get_dataoffset() + sizeof(m_datahd))) {
//第一条记录,加数据头
WriteDataHead();
curfseek = tell_file(m_fp);
}
m_record.RecordNo = get_recordcount(); // 编号
m_record.RecordNum = m_fieldhd.FieldNum ; // 记录数等于表数
if(write_file(&m_record,1,sizeof(m_record),m_fp)!=sizeof(m_record))
{ return -1; }
int fseek0 = tell_file(m_fp);
for(int i =0 ;i<(int)m_record.RecordNum;i++)
{
if(write_file(&m_fielddata[i].DataSize,1,sizeof(m_fielddata[i].DataSize),m_fp)!=sizeof(m_fielddata[i].DataSize))
{ return -1; }
if (m_fielddata[i].DataSize)
{
if(write_file(m_fielddata[i].DataBuff,1,m_fielddata[i].DataSize,m_fp)!=m_fielddata[i].DataSize)
{ return -1; }
}
}
int fseekend = tell_file(m_fp);
m_record.RecordLen = fseekend-fseek0;
if(seek_file(m_fp,curfseek,SEEK_SET)!=0){ return -1; }
if(write_file(&m_record,1,sizeof(m_record),m_fp)!=sizeof(m_record))
{ return -1; }
m_datahd.DataNum ++ ;
int datalen = m_record.RecordLen + sizeof(m_record);
m_datahd.DataLen += datalen;
WriteDataHead();
return 0;
}
// 读一条记录
int CDBFile::ReadRecord()
{
SeekRecord(m_curindex);
int a = tell_file(m_fp);
if(read_file(&m_record,1,sizeof(m_record),m_fp)!=sizeof(m_record))
{
return -1;
}
int num = m_record.RecordNum;
m_fielddata = NewFieldDataTag(num); // 申请空间
for(int i =0 ;i<num;i++)
{
if(read_file(&m_fielddata[i].DataSize,1,sizeof(m_fielddata[i].DataSize),m_fp)!=sizeof(m_fielddata[i].DataSize))
{ return -1; }
if (IsMaskField(i)) {
m_fielddata[i].DataBuff=NULL;
continue; // 是否屏蔽?
}
if (m_fielddata[i].DataSize)
{ m_fielddata[i].DataBuff = NewDataBuff(i,m_fielddata[i].DataSize);
if(read_file(m_fielddata[i].DataBuff,1,m_fielddata[i].DataSize,m_fp)!=m_fielddata[i].DataSize)
{ return -1; }
}
}
m_curindex++;
return m_curindex;
}
// 申请空间
BYTE *CDBFile::NewDataBuff(int id,int len)
{
if (m_fielddata[id].DataBuff!=NULL)
{
delete m_fielddata[id].DataBuff;m_fielddata[id].DataBuff =NULL;
}
BYTE *buf = new BYTE[len+1];
memset(buf, 0,len+1);
return buf;
}
EL_FieldDataTag *CDBFile::NewFieldDataTag(int num)
{
// static onum =0;//modify by zy 20020730
if (m_onum >=num &&m_onum !=0)
{
for(int ii=0;ii<m_onum;ii ++)
{
if(m_fielddata[ii].DataBuff!=0)
memset(m_fielddata[ii].DataBuff,0,m_fielddata[ii].DataSize);
}
return m_fielddata;
}
// m_onum = num;
if (m_fielddata!=NULL) {
for( int i = 0 ; i < m_onum ; i ++) {
if (m_fielddata[i].DataBuff!=NULL) {
delete m_fielddata[i].DataBuff;m_fielddata[i].DataBuff=NULL;
}
}
delete m_fielddata ; m_fielddata = NULL;
}
m_onum = num;
EL_FieldDataTag *pfdt = new EL_FieldDataTag[num];
memset(pfdt, 0 , sizeof(EL_FieldDataTag)*num);
return pfdt;
}
char *CDBFile::NewInfo(int num)
{
if (m_info.Info!=NULL)
{
delete m_info.Info;
m_info.Info = NULL;
}
char *pbuf= new char[num];
memset(pbuf,0,num);
return pbuf;
}
FILE * CDBFile::open_file(char *fn, char *mode)
{
if (m_bUseMemFile){
///m_mfile.open(fn);
return (FILE *)1;
}
else {
return fopen(fn,mode);
}
}
void CDBFile::close_file(FILE *fp)
{
if (m_bUseMemFile){
m_mfile.close();
}
else {
fclose(fp);
}
}
int CDBFile::seek_file(FILE *fp, int pos, int mode)
{
if (m_bUseMemFile){
return m_mfile.seek(pos,mode);
}
else {
return fseek(fp,pos,mode);
}
}
int CDBFile::read_file(void *buf, int len, int size, FILE *fp)
{
if (m_bUseMemFile) {
return m_mfile.read((char *)buf,size);
}
else{
return fread(buf,len,size,fp);
}
}
int CDBFile::write_file(const void *buf, int len, int size, FILE *fp)
{
if (m_bUseMemFile) {
return m_mfile.write((char *)buf,size);
}
else {
return fwrite(buf,len,size,fp);
}
}
int CDBFile::tell_file(FILE *fp)
{
if (m_bUseMemFile) {
return m_mfile.tell();
}
else {
return ftell(fp);
}
}
BOOL CDBFile::IsMaskField(int field)
{
return m_fieldmask[field];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -