SV_DBF.C
上传用户:bjghjy
上传日期:2007-01-07
资源大小:379k
文件大小:6k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <windowsx.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <time.h>
  7. #include <errno.h>
  8. #include <math.h>
  9. #include "sv_dbf.h"
  10. #define TRUE  1
  11. #define FALSE 0
  12. void DelayMs(int ms)
  13. {
  14.    Sleep(ms);
  15. }
  16. HFILE OpenDbfBase(char *file_name,int amode)
  17. {
  18.    int try=0;
  19. HFILE hf;
  20.    OFSTRUCT os;
  21. hf=OpenFile(file_name, &os, amode|OF_SHARE_DENY_NONE);
  22.    while(hf==-1) {
  23.   hf=OpenFile(file_name,&os, amode|OF_SHARE_DENY_NONE);
  24.   try++;
  25.   if(try==OPEN_RETR)
  26.   return(-1);
  27.   DelayMs(OPEN_INTERVAL);
  28.    }
  29.    return(hf);
  30. }
  31. int CloseDbf(int hd)
  32. {
  33.    return(_lclose(hd));
  34. }
  35. int CheckDbf(int hd,DbfStruct *d_info,FieldStruct *f_info,short f_num)
  36. {
  37.    int flen1,flen2;
  38.    short i,rlen,wid;
  39.    _llseek(hd, 0, FILE_BEGIN);
  40.    flen1 =(int)_llseek(hd, 0, FILE_END);
  41.    _llseek(hd, 0, FILE_BEGIN);
  42.    flen2=(int)(*(short *)d_info->rlen)*((int)*(unsigned short *)d_info->recnum)+
  43.    (int)*(short *)d_info->hlen;
  44.    if((flen1!=flen2)&&(flen1!=flen2+1)) {
  45. return(DBF_DESTROYED);
  46.    }
  47.    rlen=0;
  48.    for(i=0;i<f_num;i++)
  49.   rlen+=(short)f_info[i].wid;
  50.    rlen++;
  51.    if (*(short*)d_info->rlen!=rlen) {
  52.    return(DBF_DESTROYED);
  53.    }
  54. /* if offset of first Field is not valid */
  55.    if (*(short*)f_info[0].offset!=1) {
  56.    return(DBF_DESTROYED);
  57.    }
  58.    for(i=0;i<f_num-1;i++) {
  59.    wid=*(short*)f_info[i+1].offset-*(short*)f_info[i].offset;
  60.    if (wid!=(short)f_info[i].wid) {
  61.    return(DBF_DESTROYED);
  62.    }
  63.    }
  64.    return(SUCCEED);
  65. }
  66. int InitBase(int hd, DbfStruct *BaseInfo,FieldStruct **FldInfo,short *FieldNum)
  67. {
  68. int ret;
  69. short wid;
  70. int i;
  71. _llseek(hd,0l,SEEK_SET);
  72. if((ret=_lread(hd,BaseInfo,sizeof(DbfStruct)))!=sizeof(DbfStruct)) {
  73.    return(READ_ERROR);
  74. }
  75. if(BaseInfo->id!=0x03 && BaseInfo->id!=0x83) {
  76.    return(DBF_ERR);
  77. }
  78. *FieldNum=(*(short*)(BaseInfo->hlen)-1)/32-1;
  79.    /**
  80. exclude one byte of 0x0d and 32 bytes of DBF
  81. structure.
  82. **/
  83. if ((*FldInfo=GlobalAllocPtr(GHND,(*FieldNum)*sizeof(FieldStruct)))==NULL)
  84. return(ALLOC_ERROR);
  85. if(_lread(hd,(void*)*FldInfo,sizeof(FieldStruct)*(*FieldNum))
  86.    !=(UINT)sizeof(FieldStruct)*(*FieldNum)) {
  87. GlobalFreePtr(*FldInfo);
  88.    *FldInfo =NULL;
  89.    return(READ_ERROR);
  90. }
  91.    /////////////////////
  92. wid =1;
  93. for(i =0; i<*FieldNum; i++)
  94. {
  95. *(short *)(*FldInfo)[i].offset =wid;
  96. wid+=(short)(*FldInfo)[i].wid;
  97. }
  98. return(SUCCEED);
  99. }
  100. int GetRecNum(int hd)
  101. {
  102. char c[5];
  103. _llseek(hd,4L,SEEK_SET);   
  104. _lread(hd,c,4);
  105. return *(int *)c;
  106. }
  107. long GetDbfRecCount(int hf,short hlen,short rlen)
  108. {
  109. long bytes,total;
  110. int i=0;
  111. long rec;
  112. char tmp[10];
  113. total =_llseek(hf,0L,SEEK_END);
  114. if(total == -1)
  115. return 0;
  116. if(total <=hlen)
  117. return 0;
  118. _llseek(hf,4l,SEEK_SET);
  119. do
  120. {     
  121. bytes =_lread(hf,tmp,4);
  122. if(bytes!=4)
  123. {
  124. DelayMs(4);
  125. _llseek(hf,4l,SEEK_SET);    
  126. i++;
  127. }
  128. if(i>5)
  129. return 0L; 
  130. }while(bytes !=4);
  131. tmp[4] =0;
  132. rec =*(int *)tmp;
  133.     return rec;
  134. }
  135. int ReadRecord(int hd,int no,short hlen,short rlen,char *rbuff)
  136. {
  137.   _llseek(hd,(int)hlen+(int)rlen*(no-1l),SEEK_SET);
  138.   if(_lread(hd,rbuff,rlen)!=(UINT)rlen)
  139.  return(READ_ERROR);
  140.   return(SUCCEED);
  141. }
  142. int AppendRecord(int hDbf, DbfStruct *lpDbfInfo, char *lpDbfRecBuf)
  143. {
  144.    unsigned char c[5];
  145.    char cEndOfFile;
  146.    int i;
  147.    int recnum;
  148.    recnum =GetRecNum(hDbf);
  149. //   if (*(short *)lpDbfInfo->recnum==0)
  150. //   _llseek(hDbf,0l,2);
  151. //   else
  152. //   _llseek(hDbf,-1l,2);
  153.   
  154.    //if(recnum==0&&_filelength(hDbf)==*(short *)lpDbfInfo->hlen)
  155.    if(recnum==0)
  156. _llseek(hDbf,0l,2);
  157.    else
  158.    _llseek(hDbf,-1l,2);
  159.    if(_lwrite(hDbf,lpDbfRecBuf,*(short *)lpDbfInfo->rlen)
  160.        ==(UINT)*(short *)lpDbfInfo->rlen)
  161.    {
  162.   cEndOfFile=ENDOFFILE;
  163.   _lwrite(hDbf,&cEndOfFile,1);
  164.   _llseek(hDbf,4L,0);
  165.   _lread(hDbf,c,4);
  166.   (*(int *)c)++;
  167.   _llseek(hDbf,4L,0);
  168.   _lwrite(hDbf,c,4);
  169.   for(i=0;i<4;i++)
  170.     lpDbfInfo->recnum[i]=c[i];
  171.   return 0;
  172.    }
  173.    return -1;
  174. }
  175. int WriteRecord(int hd,int no,short hlen,short rlen,char  *rbuff)
  176. {
  177.   _llseek(hd,(long)(hlen+rlen*(no-1l)),FILE_BEGIN);
  178.   if (_lwrite(hd,rbuff,rlen)!=(UINT)rlen)
  179.  return -1;
  180.   return 0;
  181. }
  182. int FldToString(char *rbuff,FieldStruct *finfo,char *fstr)
  183. {
  184.   short offs,inc;
  185.   offs=*(short *)(finfo->offset);
  186.   if(offs <0 || offs >256)
  187. return -1;
  188.   inc=0;
  189.   while(rbuff[offs+inc]==CH_SPACE && inc <(short)finfo->wid)
  190.  inc++;
  191.   strncpy(fstr,&(rbuff[offs+inc]),(short)finfo->wid-inc);
  192.   fstr[(short)finfo->wid-inc]=0;
  193.   return(SUCCEED);
  194. }
  195. int StringToFld(char *fbuff,FieldStruct finfo,char *fstr)
  196. {
  197.    short len,offs;
  198.    len=strlen(fstr);
  199.    if(len>(short)finfo.wid)
  200.    len =(short)finfo.wid;
  201.    offs=*(short*)finfo.offset;
  202.    while(offs<(*(short*)finfo.offset+(short)finfo.wid-len))
  203.    fbuff[offs++]=CH_SPACE;
  204.    strncpy(&(fbuff[offs]),fstr,len);
  205.    return(SUCCEED);
  206. }
  207. int EndOfDbf(int hd)
  208. {
  209.    char id;
  210.    _lread(hd,&id,1);
  211.    if (id==ENDOFFILE)
  212.    return(TRUE);
  213.    return(FALSE);
  214. }
  215. void ErrPrint(char *);
  216. int DbfErrorPrint(int type,char *str,int no)
  217. {
  218. char temp[256];
  219. switch(type) {
  220.   case OPEN_ERROR:
  221. sprintf(temp, "FILE OPEN ERROR: %s!",str);
  222. break;
  223.   case ALLOC_ERROR:
  224. sprintf(temp, "ALLOCATION ERROR: %s!",str);
  225. break;
  226.   case DBF_ERR:
  227. sprintf(temp, "DBF ERROR: name=%s,record=%d",str,no);
  228. break;
  229.   case READ_ERROR:
  230. sprintf(temp,"FILE READ ERROR: %s!",str);
  231. break;
  232.   case LOCK_FAILED:
  233. sprintf(temp, "FILE LOCK ERROR: %s!",str);
  234. break;
  235.   case DBF_DESTROYED:
  236. sprintf(temp, "DBF DESTROYED: name=%s,record=%d!",str,no);
  237. break;
  238.   case INIT_DBF_ERROR:
  239. sprintf(temp, "Initializing DBF Error: name=%s!",str);
  240. break;
  241.   default:
  242. return SUCCEED;
  243.  }
  244. ErrPrint(temp); 
  245.  return(SUCCEED);
  246. }