📄 dbfop.cpp
字号:
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 + -