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

📄 dbfop.cpp

📁 一个操作DBF格式文件的类
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		dowith(fieldno,tempbuff);
		if(strcmp(tempbuff,fieldvalue)==0){
			errno=0;
			return 0;// found the just record
		}
	}
	errno=NotFound;
	return m_errno;
}
INT2 DBF::IsDeleted()
{
	if(current_recno<=0){
		errno=RecordOutOfRange;
		return m_errno;
	}
        m_errno=DBFOK;
	if(*buff==' ') return 0;
	else return 1;
}
INT2 DBF::Delete()
{
        if(current_recno<=0){
		errno=RecordOutOfRange;
		return m_errno;
	}
	errno=DBFOK;
        *buff='*';
        return m_errno;

}
INT2 DBF::UnDelete()
{
	if(current_recno<=0){
		errno=RecordOutOfRange;
		return m_errno;
	}
	*buff=' ';
        m_errno=DBFOK;
	return m_errno;
}
INT2 DBF::OpenIDX(CHAR * idxfilename)
{
	INT2 RetCode;
	if(pIDX==NULL) pIDX=new IDX();
	if(pIDX==NULL){
		errno=IndexNotInit;
		return m_errno;
	}
	RetCode=pIDX->open(idxfilename);
	if(RetCode!=0){
		delete pIDX;
		pIDX=NULL;
	}
	current_recno=pIDX->GetRecordNo();
	dbf_buff();
	errno=0;
	return 0;
}
INT2 DBF::CloseIDX()
{
	if(pIDX!=NULL){
		delete pIDX;
		pIDX=NULL;
	}
	errno=0;
	return 0;
}
INT2 DBF::Replace(INT2 fieldno_par,CHAR * fieldvalue_par)
{
	CHAR tempbuff[256];
	CHAR * tempp;
	struct FIELD * tpf;
	tempp=tempbuff;
	if(fieldno_par<0||fieldno_par>=fieldnum){
		errno=FieldNotFound;
		return m_errno;
	}
	strncpy(tempbuff,fieldvalue_par,199);
	tempbuff[199]='\x0';
	dowith(fieldno_par,tempp);
	tpf=&(pFIELD[fieldno_par]);
	//memcpy(buff+pFIELD[fieldno_par].address,tempp,pFIELD[fieldno_par].len);
	memcpy(buff+tpf->address,tempp,tpf->len);
	changeflag=1;
	errno=0;
	return 0;
}
INT2 DBF::Replace(CHAR * fieldname,CHAR * fieldvalue_par)
{
	INT2 RetCode;
	if((RetCode=FindField(fieldname))<0){
		errno=FieldNotFound;
		return m_errno;
	}
	if(RetCode>=fieldnum){
		errno=FieldNotFound;
		return m_errno;
	}
	return Replace(RetCode,fieldvalue_par);
}
// reread the record no from dbf file
// return :  0: OK.
//          -1: FAILURE.
INT2 DBF::ReOpen()
{
	CHAR tempbuf[100];
	if(!Installed){
		errno=ClassNotInit;
		return m_errno;
	}
	if(handle==-1){
		errno=FileNotOpen;
		return m_errno;
	}

	lseek(handle,0l,SEEK_SET);

	if(read(handle,tempbuf,32)!=32){
		this->Close();
		errno=NotDBFFile;
		return m_errno;
	}
	record_no=*(UINT4 *)(tempbuf+4);
	errno=DBFOK;
	return DBFOK;
}
// flush current record to dbf file
INT2 DBF::Flush()
{
	return dbf_wbuff();
}
// Retry read current record from dbf file
INT2 DBF::ReRead()
{
	if(current_recno<=record_no||current_recno>=1){
	  return  dbf_buff();
	}
	errno=RecordOutOfRange;
	return m_errno;
}
INT2 DBF::Flock()
{
	INT2 RetCode;
	if(lock_flag==FileLock){  // already file lock
		errno = DBFOK;
		return m_errno;
	}
	if(lock_flag==RecordLock) this->Unlock();  // record lock
	lock_flag=0;
        if(DBFType==Foxbase){
	  RetCode=(INT2)lock(handle,0x40000000L,0x3FFFFFFFL);
        }else{
	  RetCode=(INT2)lock(handle,0x40000000L,0x3FFFFFFFL);
        }
	if(RetCode==0){
                if(DBFType==Foxbase){
		   lock_start=0x40000000L;
		   lock_len=0x3FFFFFFFL;
                }else{
                   lock_start=0x40000000L;
		   lock_len=0x3FFFFFFFL;
                }
		lock_flag=FileLock;
                m_errno=DBFOK;
	}else{
                m_errno=FlockFailure;
        }
	return m_errno;
}
INT2 DBF::Rlock()
{
	INT2 RetCode;
	INT4 tlockpos;
	this->Unlock();
	if(current_recno<0){
		errno=RecordOutOfRange;
		return m_errno;
	}
        if(DBFType==Foxbase){
	    tlockpos=0x40000000l+head_len+(current_recno-1)*record_len;
	    RetCode=(INT2)lock(handle,tlockpos,record_len);
        }else{
	    tlockpos=0x40000000l+head_len+(current_recno-1)*record_len;
	    RetCode=(INT2)lock(handle,tlockpos,record_len);
        }
	if(RetCode==0){
                if(DBFType==Foxbase){
		   lock_start=tlockpos;  // 0x40000000l+head_len+(current_recno-1)*record_len;
		   lock_len=record_len;
                }else{
		   lock_start=tlockpos;  // 0x40000000l+head_len+(current_recno-1)*record_len;
		   lock_len=record_len;
                }
		lock_flag=RecordLock;
                m_errno=DBFOK;
	}else{
                m_errno=RlockFailure;
        }
	return m_errno;
}
INT2 DBF::Unlock()
{
	if(lock_flag){
		lock_flag=0;
		::unlock(handle,lock_start,lock_len);
	}
	errno=0;
	return 0;
}
INT2 DBF::FindField(CHAR * fieldname)
{
	INT2 i,j;
	CHAR tempbuffer[20];
	strncpy(tempbuffer,fieldname,10);
	tempbuffer[10]='\x0';
	j=(INT2)strlen(tempbuffer);
	for(i=0;i<j;i++)tempbuffer[i]=(short)toupper(tempbuffer[i]);
	for(i=0;i<fieldnum;i++){
		if(strcmp(pFIELD[i].name,tempbuffer)==0){
			errno=0;
			return i;
		}
	}
	errno=FieldNotFound;
	//return m_errno;   //liuzb注释 99.05.31
    return -1;
}

CHAR * DBF::GetFieldName(INT2 fn)
{
   INT2 fnaddr;			// 本 fn 的字段在数据库中的位置
   static CHAR tmpbf[11];   	// read field name from dbf.
   fnaddr=(INT2)(fn*32);
   lseek(handle,fnaddr,SEEK_SET);
   if( read(handle,tmpbf,10) == -1 ) return "";
   tmpbf[10]=0;
   return tmpbf;
}

INT2  DBF::GetFieldLen(INT2 fn)
{
	if (fn > fieldnum) return FieldNotFound;
	return pFIELD[fn].len;
}

INT2 DBF::GetFieldNum()
{
	return fieldnum;
}
// -
M_DBF_HEAD::M_DBF_HEAD()
{
   int i;
   id=0x3;
   year=96;
   month=10;
   day=1;
   recorder_num=0;
   head_len=0x21;
   record_len=0x0;
   for(i=0;i<20;i++) reserved[i]=0;
}
M_DBF_FIELD::M_DBF_FIELD()
{
   int i;
   for(i=0;i<14;i++){ reserved_data[i]=0;};
};

CDBF::CDBF()
{
   int i;
   FieldNum=0;
   for(i=0;i<MAXFIELDNUM;i++) {
      pFIELD[i]=NULL;
   }
   c_pos=0l;
}
CDBF::reset()
{
   int i;
   for(i=0;i<FieldNum;i++){
      if(pFIELD[i]!=NULL){
          delete pFIELD[i];
          pFIELD[i]=NULL;
      }
   }
   c_pos=0l;
   FieldNum=0;
   return 0;
}
CDBF::~CDBF()
{
   this->reset();
}
CDBF::add(char * FieldName,char FieldType,unsigned char len,unsigned char bits)
{
   int str_len;
   int i;
   // Check Parameter FieldType='CND'
   if((FieldType!='C')&&(FieldType!='N')&&(FieldType!='D')){
      return -1;
   }
   pFIELD[FieldNum]=new M_DBF_FIELD;
   // -
   if(pFIELD[FieldNum]==NULL){
     return -2;
   }
   FieldNum++;
   //
   str_len=strlen(FieldName);
   if(str_len>10) str_len=10;
   for(i=0;i<str_len;i++)  pFIELD[FieldNum-1]->name[i]=(short)toupper(FieldName[i]);
   for(i=str_len;i<11;i++)  pFIELD[FieldNum-1]->name[i]='\x0';
   pFIELD[FieldNum-1]->f_type=FieldType;
   if(FieldType=='D') pFIELD[FieldNum-1]->len=8;
   else pFIELD[FieldNum-1]->len=len;
   if(FieldType=='N') pFIELD[FieldNum-1]->bits=bits;
   else pFIELD[FieldNum-1]->bits=0;
   // ----------------------
   pFIELD[FieldNum-1]->address=c_pos+1;
   c_pos+=len;
   // ----------------------
   return 0;
}
CDBF::create(char * FileName)
{
   struct date cdate;
   int  i,rec_len;
   char tail[3]="\x0d";

   FILE * fp;
   getdate(&cdate);
   head.year=(short)(cdate.da_year-1900);
   head.month=cdate.da_mon;
   head.day=cdate.da_day;
   head.head_len=(INT2)(32+32*FieldNum+1); // dbf
   for(i=0,rec_len=0;i<FieldNum;i++){
       rec_len+=pFIELD[i]->len;
   }
   head.record_len=(INT2)(rec_len+1);
   // ---------------------------------
   if((fp=fopen(FileName,"wb+"))==NULL){
       return -1;
   }

   if(fwrite(&(this->head),sizeof(M_DBF_HEAD),1,fp)!=1){
      fclose(fp);
      return -2;
   }
   for (i=0;i<FieldNum;i++){
       if(fwrite(pFIELD[i],sizeof(M_DBF_FIELD),1,fp)!=1){
          fclose(fp);
          return -3;
       };
       //Err(pFIELD[i].name);
   }
   fwrite(tail,1,1,fp);
   fclose(fp);
   return 0;
}
//
INT2 DBF::FieldValue(INT2 Fieldid,INT2& FieldValue_par)
{
   CHAR TempBuf[310];
   FieldValue(Fieldid,(CHAR *)TempBuf,300);
   if(errno!=DBFOK){
       return m_errno;
   }
   FieldValue_par=(INT2)atoi(TempBuf);
   return m_errno;
}
INT2 DBF::Replace(INT2 Fieldid,INT2 FieldValue)
{
   CHAR TempBuf[310];
   sprintf(TempBuf,"%d",FieldValue);
   return Replace(Fieldid,TempBuf);
}
INT2 DBF::FieldValue(INT2 Fieldid,UINT2& FieldValue)
{
   CHAR TempBuf[310];
   this->FieldValue(Fieldid,TempBuf,300);
   if(errno!=DBFOK){
       return m_errno;
   }
   FieldValue=(UINT2)atoi(TempBuf);
   return m_errno;
}
INT2 DBF::Replace(INT2 Fieldid,UINT2 FieldValue)
{
   CHAR TempBuf[310];
   sprintf(TempBuf,"%u",FieldValue);
   return Replace(Fieldid,TempBuf);
}
INT2 DBF::FieldValue(INT2 Fieldid,INT4& FieldValue_par)
{
   CHAR TempBuf[310];
   FieldValue(Fieldid,TempBuf,300);
   if(errno!=DBFOK){
       return m_errno;
   }
   FieldValue_par=atol(TempBuf);
   return m_errno;
}
INT2 DBF::Replace(INT2 Fieldid,INT4 FieldValue_par)
{
   CHAR TempBuf[310];
   sprintf(TempBuf,"%ld",FieldValue_par);
   return Replace(Fieldid,TempBuf);
}
INT2 DBF::FieldValue(INT2 Fieldid,UINT4& FieldValue_par)
{
   CHAR TempBuf[310];
   FieldValue(Fieldid,TempBuf,300);
   if(errno!=DBFOK){
       return m_errno;
   }
   FieldValue_par=(UINT4)atol(TempBuf);
   return m_errno;
}
INT2 DBF::Replace(INT2 Fieldid,UINT4 FieldValue_par)
{
   CHAR TempBuf[310];
   sprintf(TempBuf,"%lu",FieldValue_par);
   return Replace(Fieldid,TempBuf);
}
INT2 DBF::FieldValue(INT2 Fieldid,DOUBLE& FieldValue_par)
{
   CHAR TempBuf[310];
   FieldValue(Fieldid,TempBuf,300);
   if(errno!=DBFOK){
       return m_errno;
   }
   FieldValue_par=(DOUBLE)atof(TempBuf);
   return m_errno;
}
INT2 DBF::Replace(INT2 Fieldid,DOUBLE FieldValue_par)
{
   CHAR TempBuf[310];
   sprintf(TempBuf,"%50.25",FieldValue_par);
   return Replace(Fieldid,TempBuf);
}
INT2 DBF::FieldValue(INT2 Fieldid,CHAR& FieldValue_par)
{
   CHAR TempBuf[310];
   FieldValue(Fieldid,TempBuf,300);
   if(errno!=DBFOK){
       return m_errno;
   }
   FieldValue_par=TempBuf[0];
   return m_errno;
}
INT2 DBF::Replace(INT2 Fieldid,CHAR FieldValue_par)
{
   CHAR TempBuf[310];
   TempBuf[0]=FieldValue_par;
   TempBuf[1]='\x0';
   return Replace(Fieldid,TempBuf);
}
INT2 DBF::FieldValue(CHAR* FieldName,INT2& FieldValue_par)
{
   return FieldValue(FindField(FieldName),FieldValue_par);
}
INT2 DBF::Replace(CHAR* FieldName,INT2 FieldValue_par)
{
   return Replace(FindField(FieldName),FieldValue_par);
}
INT2 DBF::FieldValue(CHAR* FieldName,UINT2& FieldValue_par)
{
   return FieldValue(FindField(FieldName),FieldValue_par);
}
INT2 DBF::Replace(CHAR* FieldName,UINT2 FieldValue_par)
{
   return this->Replace(FindField(FieldName),FieldValue_par);
}
INT2 DBF::FieldValue(CHAR* FieldName,INT4& FieldValue_par)
{
   return FieldValue(FindField(FieldName),FieldValue_par);
}
INT2 DBF::Replace(CHAR* FieldName,INT4 FieldValue_par)
{
   return Replace(FindField(FieldName),FieldValue_par);
}
INT2 DBF::FieldValue(CHAR* FieldName,UINT4& FieldValue_par)
{
   return FieldValue(FindField(FieldName),FieldValue_par);
}
INT2 DBF::Replace(CHAR* FieldName,UINT4 FieldValue_par)
{
   return Replace(FindField(FieldName),FieldValue_par);
}
INT2 DBF::FieldValue(CHAR* FieldName,DOUBLE& FieldValue_par)
{
   return FieldValue(FindField(FieldName),FieldValue_par);
}
INT2 DBF::Replace(CHAR* FieldName,DOUBLE FieldValue_par)
{
   return Replace(FindField(FieldName),FieldValue_par);
}
INT2 DBF::FieldValue(CHAR* FieldName,CHAR& FieldValue_par)
{
   return FieldValue(FindField(FieldName),FieldValue_par);
}
INT2 DBF::Replace(CHAR* FieldName,CHAR FieldValue_par)
{
   return Replace(FindField(FieldName),FieldValue_par);
}
INT2  DBF::FieldValue(CHAR * FieldName,CHAR * ValueBuffer,INT2 ValueBufferLen)
{
   return fv(FieldName,ValueBuffer,ValueBufferLen);
}
INT2  DBF::FieldValue(INT2 FieldIndex,CHAR * ValueBuffer,INT2 ValueBufferLen)
{
   return fv(FieldIndex,ValueBuffer,ValueBufferLen);
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -