|
From: Micha N. <md...@us...> - 2004-08-23 19:13:40
|
Update of /cvsroot/tdbf/tdbf In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2209 Modified Files: dbf_dbffile.pas history.txt Log Message: fixed: better foxpro header writing, fieldoffset, tabletype and headersize Index: history.txt =================================================================== RCS file: /cvsroot/tdbf/tdbf/history.txt,v retrieving revision 1.66 retrieving revision 1.67 diff -C2 -d -r1.66 -r1.67 *** history.txt 23 Aug 2004 18:03:11 -0000 1.66 --- history.txt 23 Aug 2004 19:13:26 -0000 1.67 *************** *** 56,59 **** --- 56,60 ---- - fixed: getting recno in oncalcfields event (rep by lutz) - fixed: AV when checking empty binary fields + - fixed: better foxpro header writing, fieldoffset, tabletype and headersize Index: dbf_dbffile.pas =================================================================== RCS file: /cvsroot/tdbf/tdbf/dbf_dbffile.pas,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** dbf_dbffile.pas 23 Aug 2004 18:03:11 -0000 1.4 --- dbf_dbffile.pas 23 Aug 2004 19:13:26 -0000 1.5 *************** *** 332,335 **** --- 332,336 ---- deleteLink: Boolean; LangStr: PChar; + version: byte; begin // check if not already opened *************** *** 355,359 **** // $03,$F5 FoxPro Level 25 Header Byte $1d=$09, Float -> N($14.$05) DateTime D($08) ! case (PDbfHdr(Header).VerDBF and $07) of $03: if LanguageID = 0 then --- 356,361 ---- // $03,$F5 FoxPro Level 25 Header Byte $1d=$09, Float -> N($14.$05) DateTime D($08) ! version := PDbfHdr(Header).VerDBF; ! case (version and $07) of $03: if LanguageID = 0 then *************** *** 367,371 **** else // check visual foxpro ! if (PDbfHdr(Header).VerDBF and $70) = $30 then begin FDbfVersion := xFoxPro; --- 369,373 ---- else // check visual foxpro ! if ((version and $FE) = $30) or (version = $F5) or (version = $FB) then begin FDbfVersion := xFoxPro; *************** *** 594,599 **** FillChar(Header^, HeaderSize, #0); if FDbfVersion = xFoxPro then ! PDbfHdr(Header).VerDBF := $05 ! else PDbfHdr(Header).VerDBF := $03; // standard language WE, dBase III no language support --- 596,602 ---- FillChar(Header^, HeaderSize, #0); if FDbfVersion = xFoxPro then ! begin ! PDbfHdr(Header).VerDBF := $02 ! end else PDbfHdr(Header).VerDBF := $03; // standard language WE, dBase III no language support *************** *** 653,656 **** --- 656,666 ---- lFieldDescIII.FieldSize := lSize; lFieldDescIII.FieldPrecision := lPrec; + // TODO: bug-endianness + if FDbfVersion = xFoxPro then + lFieldDescIII.FieldOffset := lFieldOffset; + if (PDbfHdr(Header).VerDBF = $02) and (lFieldDef.NativeFieldType in ['0', 'Y', 'T', 'O', '+']) then + PDbfHdr(Header).VerDBF := $30; + if (PDbfHdr(Header).VerDBF = $30) and (lFieldDef.NativeFieldType = '+') then + PDbfHdr(Header).VerDBF := $31; end; *************** *** 672,686 **** // write memo bit if lHasBlob then if FDbfVersion = xBaseIII then PDbfHdr(Header).VerDBF := PDbfHdr(Header).VerDBF or $80 else if FDbfVersion = xFoxPro then ! PDbfHdr(Header).VerDBF := PDbfHdr(Header).VerDBF or $F0 ! else PDbfHdr(Header).VerDBF := PDbfHdr(Header).VerDBF or $88; // update header PDbfHdr(Header).RecordSize := lFieldOffset; PDbfHdr(Header).FullHdrSize := HeaderSize + RecordSize * FieldDefs.Count + 1; // write dbf header to disk --- 682,707 ---- // write memo bit if lHasBlob then + begin if FDbfVersion = xBaseIII then PDbfHdr(Header).VerDBF := PDbfHdr(Header).VerDBF or $80 else if FDbfVersion = xFoxPro then ! begin ! if PDbfHdr(Header).VerDBF = $02 then ! PDbfHdr(Header).VerDBF := $F5; ! end else PDbfHdr(Header).VerDBF := PDbfHdr(Header).VerDBF or $88; + end; // update header PDbfHdr(Header).RecordSize := lFieldOffset; PDbfHdr(Header).FullHdrSize := HeaderSize + RecordSize * FieldDefs.Count + 1; + // add empty "back-link" info, whatever it is: + { A 263-byte range that contains the backlink, which is the relative path of + an associated database (.dbc) file, information. If the first byte is 0x00, + the file is not associated with a database. Therefore, database files always + contain 0x00. } + if FDbfVersion = xFoxPro then + Inc(PDbfHdr(Header).FullHdrSize, 263); // write dbf header to disk |