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

金融证券系统

开发平台:

Visual C++

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