⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbfile.cpp

📁 ADO查看数据库工具的原码
💻 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 + -