database-designdbase

The "deleted row" indicator in dbase?


As you know there is no x64 driver for dBase; from the Visual FoxPro FAQs:

Q: Are there plans for Visual FoxPro to support 64-bit versions of the Windows operating system?

No. While Visual FoxPro will remain 32-bit and not natively use 64-bit addressing; it will run in 32-bit compatibility mode.

I tried to make one.

It is very much faster than ODBC, but there is only one problem: I cannot determine if a row is deleted or not.

In dBase when you delete a row it doesn't get really deleted, it only gets marked as deleted - how do I tell if a row is deleted?


Solution

  • The first byte of each record (not header or field description, but actual record data) will contain an asterisk ("*") if the record is deleted, or a blank space (" ") if not.

    Here's something I found a while back on Wotsit.org that may help:

    ----------------------------------------------------------------------------
    Genaral Format of .dbf files in Xbase languages                    18-Nov-96
    ----------------------------------------------------------------------------
    Applies for / supported by:
    
       FS = FlagShip       D3 = dBaseIII+
       Fb = FoxBase        D4 = dBaseIV
       Fp = FoxPro         D5 = dBaseV
       CL = Clipper
    
    
    1. DBF Structure
    ================
    
    Byte   Description
    ------+--------------------------------------
    0..n   .dbf header (see 2 for size, byte 8)
    n+1    1st record of fixed length (see 2&3)  \
           2nd record (see 2 for size, byte 10)  \ if dbf is
           ...                                   / not empty
           last record                           /
    last   optional: 0x1a (eof byte)
    
    
    2. DBF Header (variable size, depending on field count)
    =======================================================
    
    Byte Size Contents Description                  Applies for (supported by)
    ----+----+--------+----------------------------+-----------------------------
    00     1   0x03    plain .dbf                   FS, D3, D4, D5, Fb, Fp, CL
               0x04    plain .dbf                   D4, D5  (FS)
               0x05    plain .dbf                   D5, Fp  (FS)
               0x43    with  .dbv memo var size     FS
               0xB3    with  .dbv and .dbt memo     FS
               0x83    with  .dbt memo              FS, D3, D4, D5, Fb, Fp, CL
               0x8B    with  .dbt memo in D4 format D4, D5
               0x8E    with  SQL table              D4, D5
               0xF5    with  .fmp memo              Fp
    01     3  YYMMDD   Last update digits           all
    04     4  ulong    Number of records in file    all
    08     2  ushort   Header size in bytes         all
    10     2  ushort   Record size in bytes         all
    12     2   0,0     Reserved                     all
    14     1   0x01    Begin transaction            D4, D5
               0x00    End Transaction              D4, D5
               0x00    ignored                      FS, D3, Fb, Fp, CL
    15     1   0x01    Encryptpted                  D4, D5
               0x00    normal visible               all
    16    12   0 (1)   multi-user environment use   D4,D5
    28     1   0x01    production index exists      Fp, D4, D5
               0x00    index upon demand            all
    29     1   n       language driver ID           D4, D5
               0x01    codepage  437 DOS USA        Fp
               0x02    codepage  850 DOS Multi ling Fp
               0x03    codepage 1251 Windows ANSI   Fp
               0xC8    codepage 1250 Windows EE     Fp
               0x00    ignored                      FS, D3, Fb, Fp, CL
    30     2   0,0     reserved                     all
    32    n*32         Field Descriptor, see (2a)   all
    +1     1   0x0D    Header Record Terminator     all
    
    
    2a. Field descriptor array in dbf header (fix 32 bytes for each field)
    ========================================
    
    Byte Size Contents Description                  Applies for (supported by)
    ----+----+--------+----------------------------+-----------------------------
    0     11   ASCI    field name, 0x00 termin.     all
    11     1   ASCI    field type  (see 2b)         all
    12     4   n,n,n,n fld address in memory        D3
               n,n,0,0 offset from record begin     Fp
               0,0,0,0 ignored                      FS, D4, D5, Fb, CL
    16     1   byte    Field length, bin (see 2b)   all \ FS,CL: for C field type,
    17     1   byte    decimal count, bin           all / both used for fld lng
    18     2   0,0     reserved                     all
    20     1   byte    Work area ID                 D4, D5
               0x00    unused                       FS, D3, Fb, Fp, CL
    21     2   n,n     multi-user dBase             D3, D4, D5
               0,0     ignored                      FS, Fb, Fp, CL
    23     1   0x01    Set Fields                   D3, D4, D5
               0x00    ignored                      FS, Fb, Fp, CL
    24     7   0..0    reserved                     all
    31     1   0x01    Field is in .mdx index       D4, D5
               0x00    ignored                      FS, D3, Fb, Fp, CL
    
    
    2b. Field type and size in dbf header, field descriptor (1 byte)
    =======================================================
    
      Size Type      Description/Storage            Applies for (supported by)
    ------+---------+------------------------------+-----------------------------
    C 1..n Char      ASCII (OEM code page chars)    all
                     rest= space, not \0 term.
                     n = 1..64kb (using deci count) FS
                     n = 1..32kb (using deci count) Fp, CL
                     n = 1..254                     all
    D 8    Date      8 Ascii digits (0..9) in the   all
                     YYYYMMDD format
    F 1..n Numeric   Ascii digits (-.0123456789)    FS, D4, D5, Fp
                     variable pos. of float.point
                     n = 1..20
    N 1..n Numeric   Ascii digits (-.0123456789)    all
                     fix posit/no float.point
                     n = 1..20                      FS, Fp, CL
                     n = 1..18                      D3, D4, D5, Fb
    L 1    Logical   Ascii chars (YyNnTtFf space)   FS, D3, Fb, Fp, CL
                     Ascii chars (YyNnTtFf ?)       D4, D5  (FS)
    M 10   Memo      10 digits repres. the start    all
                     block posit. in .dbt file, or
                     10spaces if no entry in memo
    V 10   Variable  Variable, bin/asc data in .dbv FS
                     4bytes bin= start pos in memo
                     4bytes bin= block size
                     1byte     = subtype
                     1byte     = reserved (0x1a)
                     10spaces if no entry in .dbv
    P 10   Picture   binary data in .ftp            Fp
                     structure like M
    B 10   Binary    binary data in .dbt            D5
                     structure like M
    G 10   General   OLE objects                    D5, Fp
                     structure like M
    2 2    short int binary int max +/- 32767       FS
    4 4    long int  binary int max +/- 2147483647  FS
    8 8    double    binary signed double IEEE      FS
    
    
    3. Each Dbf record (fix length)
    ==================
    
    Byte   Size  Description                           Applies for (supported by)
    ------+----+--------------------------------------+--------------------------
    0      1    deleted flag "*" or not deleted " "     all
    1..n   1..  x-times contents of fields, fixed       all
                length, unterminated.
                For n, see (2) byte 10..11