#include "StdAfx.h" #include "Fdbf.h" //***************************************************************************************** Fdbf::Fdbf(void) { } //***************************************************************************************** Fdbf::~Fdbf(void) { } //***************************************************************************************** bool Fdbf::lee( Cb_file *file) { int ncol; colm.n =0; iniCol.n =0; buf.n=0; if(!file->lee(&head, sizeof(head))) return false; ncol = (head.nb_cab - sizeof(Hdr_dbf) - 1) / sizeof(Fld_dbf); if(ncol<=0) return false; if(!(colm+=ncol)) return false; if(!(iniCol+=ncol)) return false; colm.n = ncol; iniCol.n = ncol; //pilla info de campos----------------------- if(!file->lee(&colm[0], sizeof(Fld_dbf)*colm.n)) return false; int aux =1; for(int i =0; ilee(&ncol, 1)) return false; if(!(buf+=head.nb_rec)) return false; buf.n = head.nb_rec; f= file; nReadRow =0; return true; } //***************************************************************************************** int Fdbf::leeNexRow()//devuelve 1 si ok 0 si no mas -1 si error { if(nReadRow>=head.nrec) return 0; if(!f->lee(&buf[0], head.nb_rec)) return -1; nReadRow++; return 1; } //***************************************************************************************** char* Fdbf::getName(int ncol) { if(ncol>=colm.n) return 0; return colm[ncol].nombre; } //***************************************************************************************** BYTE Fdbf::getType(int ncol) { if(ncol>=colm.n) return 0; return colm[ncol].tipo; } //***************************************************************************************** int Fdbf::getSize(int ncol) { if(ncol>=colm.n) return 0; return (int)colm[ncol].nb; } //***************************************************************************************** int Fdbf::getNrow() { return head.nrec; } //***************************************************************************************** int Fdbf::getNcolm() { return colm.n; } //***************************************************************************************** char* Fdbf::get(int ncol) { if(ncol>=colm.n) return 0; //if(!f->lee(&buf[0], head.nb_rec)) // return NULL; return &buf[iniCol[ncol]]; } //***************************************************************************************** bool Fdbf::bufMem(int ncol) { char*d = get(ncol); int nb = colm[ncol].nb+1; if(buf2.mescribe(&head, sizeof(head))) return false; return true; } //***************************************************************************************** bool Fdbf::setCol(int icol, char *name, BYTE type, int size, int ndecimals) { if(icol<0 || icol>colm.n) return false; nReadRow =-1; int i =0; //copia de nombre segura-------- for(; i<11; i++) { colm[icol].nombre[i]=name[i]; if(!name[i]) break; } colm[icol].nombre[i] =0; //------------------------------ colm[icol].tipo = type; colm[icol].nb = size; colm[icol].nd = ndecimals; switch(type) { case(DBF_TYPE_DATA_I64): case(DBF_TYPE_DATA_STR): case(DBF_TYPE_DATA_BIN): case(DBF_TYPE_DATA_I): colm[icol].nd =0; break; } return true; } //***************************************************************************************** bool Fdbf::iniciaRecords() { if(nReadRow>=0) return true; nReadRow =0; int nb =1; for(int i =0; iirAini()) return false; if(!f->escribe(&head, sizeof(head))) return false; //graba info------------------------ if(!f->escribe(&colm[0], sizeof(Fld_dbf)*colm.n)) return false; //graba terminacion de head char ff = 13; if(! f->escribe(&ff, sizeof(ff))) return false; return true; } //***************************************************************************************** bool Fdbf::addVal(int icol, int v) { char st1[64]; if(!iniciaRecords()) return false; buf2.n =0; if(!(buf2+=(colm[icol].nb+1))) return false; buf2.n =colm[icol].nb+1; sprintf(st1,"%%0%ldd",colm[icol].nb); sprintf(&buf2[0],st1,v); int n = (int)strlen(&buf2[0]); if (n > colm[icol].nb) n = colm[icol].nb; //alinea a la derecha char *st = &buf[iniCol[icol]]; memset(st,0x20, colm[icol].nb); memcpy(st+colm[icol].nb-n,&buf2[0],n); return true; } //***************************************************************************************** bool Fdbf::addVal(int icol, double v) { char st1[64]; if(!iniciaRecords()) return false; buf2.n =0; if(!(buf2+=colm[icol].nb)) return false; buf2.n =colm[icol].nb; sprintf(st1,"%%1.%ldlf",colm[icol].nd); sprintf(&buf2[0],st1,v); int n =(int) strlen(&buf2[0]); if (n > colm[icol].nb) n = colm[icol].nb; //alinea a la derecha char *st = &buf[iniCol[icol]]; memset(st,0x20, colm[icol].nb); memcpy(st+colm[icol].nb-n,&buf2[0],n); return true; } //***************************************************************************************** bool Fdbf::addVal(int icol, __int64 v) { char st1[32]; CTime tt(v); if(!iniciaRecords()) return false; buf2.n =0; if(!(buf2+=colm[icol].nb)) return false; buf2.n =colm[icol].nb; strcpy(st1,tt.Format("%Y%m%d")); sprintf(&buf2[0],st1,v); int n =(int) strlen(&buf2[0]); if (n > colm[icol].nb) n = colm[icol].nb; //alinea a la derecha char *st = &buf[iniCol[icol]]; memset(st,0x20, colm[icol].nb); memcpy(st+colm[icol].nb-n,&buf2[0],n); return true; } //***************************************************************************************** bool Fdbf::finRow() { //comprueba maximo if(nReadRow>= head.nrec) return false; nReadRow++; buf[0]=' '; //graba buffer en archivo if(!f->escribe(&buf[0], buf.n)) return false; //si es el final graba head if(nReadRow>= head.nrec) { buf[0]=26; if(!f->escribe(&buf[0], 1)) return false; } return true; } //***************************************************************************************** bool Fdbf::addVal(int icol, char* v) { if(!iniciaRecords()) return false; int i =0; char *dt=&buf[iniCol[icol]]; double maxi = colm[icol].nb; //copia de nombre segura-------- for(; iDbfSet(nrow, ncolm)) return false; //prepara las columnas--------------- for(int i =0; iDbfSetColm(dbf.getName(i),dbf.getType(i),dbf.getSize(i))) return false; } //recorre las filas--------------- int error =dbf.leeNexRow(); while(error ==1) { //por cada fila recorre las columnas for(int i =0; iDbfaddVal(i,dbf.getStr(i)); break; case(DBF_TYPE_DATA_I64): res =lr->DbfaddVal(i,dbf.getI64(i)); break; case(DBF_TYPE_DATA_D): res =lr->DbfaddVal(i,dbf.getD(i)); break; case(DBF_TYPE_DATA_BOOL): return false; break; case(DBF_TYPE_DATA_BIN): res =lr->DbfaddVal(i,dbf.get(i)); break; case(DBF_TYPE_DATA_I): res =lr->DbfaddVal(i,dbf.getI(i)); break; default: return false; } if(!res) return false; } if(!lr->DbfFinRow()) return false; error =dbf.leeNexRow(); } return error == 0 && lr->DbfFinRow(); } //***************************************************************************************** bool ManagerDbf::grabar(char* file, ListenerDbf_R* lw) { Cb_file f; if(!f.abre(file,2,true)) return false; return grabar(&f,lw); } //***************************************************************************************** bool ManagerDbf::grabar(Cb_file* f, ListenerDbf_R* lw) { Fdbf dbf; int nrow =-1; int ncolm =-1; char name[11]; BYTE type; int size; int nd; if(!lw->DbfGet(&nrow, &ncolm) /*|| nrow<=0 || ncolm<=0*/) return false; if(!dbf.set(ncolm, nrow, f)) return false; //prepara las columnas--------------- for(int i =0; iDbfGetColm(i,name,&type,&size,&nd)) return false; if(!dbf.setCol(i,name,type,size,nd)) return false; } //recorre las filas--------------- char *cv; void *vv; double dv; int iv; __int64 i64v; for(int j =0;jDbfGetVal(j, i, &cv) && dbf.addVal(i,cv); break; case(DBF_TYPE_DATA_I64): res =lw->DbfGetVal(j, i, &i64v) && dbf.addVal(i,i64v); break; case(DBF_TYPE_DATA_D): res =lw->DbfGetVal(j, i, &dv) && dbf.addVal(i,dv); break; case(DBF_TYPE_DATA_BOOL): return false; break; case(DBF_TYPE_DATA_BIN): res =lw->DbfGetVal(j, i, &vv) && dbf.addVal(i,vv); break; case(DBF_TYPE_DATA_I): res = lw->DbfGetVal(j, i, &iv) && dbf.addVal(i,iv); break; default: return false; } if(!res) return false; } if(!lw->DbfFinW()) return false; if(!dbf.finRow()) return false; } return true; } //*****************************************************************************************