QT4-Classes xBase

Aus SigVDR's Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Info

Zur Zeit ( Sept. 2011 ) im Aufbau mit dem 1. Etappenziel:

  • Dateiformate entsprechend dBaseIV
  • Tabelle "*.DBF" lesen, schreiben, umstrukturieren
  • Memofelder (Text) aus "*.DBT" lesen und schreiben
  • Indexdateien "*.MDX" lesen und schreiben

Benutzerschnittstelle

class XbTable : public QObject;

Klassenbeschreibung

Dateien

DBF Tabelle

DBT Memodatei

MDX Indexdatei

Eine Indexdatei besteht aus einzelnen Blöcken von default=1024k (Die Blockgröße ist veränderbar!). Addressiert werden diese Blöcke über Blocknummern entsprechend ihrer Position in der Datei. Die Nummerierung der Blöcke beginnt mit 1 einen Block 0 gibt es nicht. Die ersten Blöcke enthalten die "Header" Informationen über die Zusammensetzung der Indexdatei. In den von mir untersuchten Indexdateien (erstellt mit Delphi6 im dBaseIV Modus) entsprechen die Blocknummern nicht dem vielfachen der gewählten Blockgröße von 1024k sondern dem vielfachen von 512. Deshalb gibt es auch keine ungeraden Blocknummern.

  • Dateiposition = Blocknummer * 512

MDX Header

0000:0000 | 02 6F 0A 0B  54 45 53 54  00 00 00 00  00 00 00 00 | .o..TEST........
0000:0010 | 00 00 00 00  02 00 00 04  01 30 20 00  03 00 04 58 | .........0 ....X
0000:0020 | 10 00 00 00  00 00 00 00  00 00 00 00  6F 0A 0B 00 | ............o...
  ...
0000:01F0 | 00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00 | ................
Byte 0       Version der Indexdatei
Byte 1       Jahr der letzten Änderung
Byte 2       Monat der letzten Änderung
Byte 3       Tag der letzten Änderung
Byte 4 - 19  Name der zugehörigen Datentabelle ( ohne die Extention .DBF );
Byte 20 - 21 Blocklänge (Multiplikator ) 0x0002 -> 2 x 512 Bytes
Byte 22 - 23 Blocklänge (in Bytes)       0x0400 == 1024 Bytes
Byte 24      Index Flag ???
Byte 25      Anzahl der maximal möglichen Index Header in dieser Datei
Byte 26      Länge eines einzelnen Index Header
Byte 27      unbenutzt ??
Byte 28      Anzahl der tatsächlichen Index Header in dieser Datei
Byte 29      unbenutzt ??
  quint8   language;
  quint32  pagesCount;
  quint32  freePage;
  quint32  freeBlock; // ??????
  quint8   year;
  quint8   month;
  quint8   day;
  char     dummy3[496];
  quint8   tagFlag;

Index Header

Datenblöcke

Schlüsselwerte

Die Schlüsselwerte sind als B-Baum (B-Tree) organisiert. Das bedeutet, es gibt einen Startblock (Header), es gibt Blöcke die nur die 'Äste' (Node) des Baums enthalten und es gibt Blöcke die die 'Blätter' (Leaf) des Baumes enthalten.

Der Startblock enthält die 'Header' Informationen des betreffenden Indexschlüssels und verweist auf den 1. Ast der Schlüsselwerte.

Wichtig für das Verständnis ist die Ausrichtung des Inhalts an 4-Byte Grenzen. Die Zahlenwerte entsprechen immer einer 4-Byte Zahl ( 32 Bit Integer )

Nodes

Ein Block der die Äste enthält könnte z.B so beginnen:

02 00 00 00  FC 00 00 00  C4 05 00 00  31 37 31 33    ....ü...Ä...1713
34 00 00 00  FC 05 00 00  31 37 32 31  38 00 00 00    4...Ü...17218...
2E 06 00 00  00 00 00 00  00 00 00 00  00 00 00 00    ................


Dieser Block enthält diese Informationen:

Byte 0 - 3  : Anzahl der in diesem Block enthaltenen Schlüsselwerte 
Byte 4 - 7  : Blocknummer des übergeordneten Blocks
Byte 8 - 11 : Blocknummer eines Schlüssels, der kleiner oder gleich dem folgenden Schlüssel ist
Byte 12 - 19: Schlüsselwert (hier 5 Stellig) und aufgefüllt mit 0 bis zur nächsten 4-Byte Grenze
Byte 20 - 23: Blocknummer eines Schlüssels, der kleiner oder gleich dem folgenden Schlüssel ist
Byte 24 - 31: Schlüsselwert (hier 5 Stellig) und aufgefüllt mit 0 bis zur nächsten 4-Byte Grenze
Byte 32 - 35: Blocknummer eines Schlüssels, der größer dem vorhergehenden Schlüssel ist
Byte 36 - Rest: undefiniert aber oft 0
Leafs

Ein Block der die Blätter enthält könnte z.B so beginnen:

02 00 00 00  FB 00 00 00  25 05 00 00  31 37 31 33    ....ü...Ä...1713
30 00 00 00  26 05 00 00  31 37 31 33  31 00 00 00    0...Ü...17131...
00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00    ................


Dieser Block enthält diese Informationen:

Byte 0 - 3  : Anzahl der in diesem Block enthaltenen Schlüsselwerte 
Byte 4 - 7  : Blocknummer des übergeordneten Blocks
Byte 8 - 11 : Datensatznummer der dem folgenden Schlüssel entspricht
Byte 12 - 19: Schlüsselwert (hier 5 Stellig) und aufgefüllt mit 0 bis zur nächsten 4-Byte Grenze
Byte 20 - 23: Datensatznummer der dem folgenden Schlüssel entspricht
Byte 24 - 31: Schlüsselwert (hier 5 Stellig) und aufgefüllt mit 0 bis zur nächsten 4-Byte Grenze
Byte 32 - 35: 0 ! Anhand diesem Wert kann zwischen Ästen und Blätter unterschieden werden.  
Byte 36 - Rest: undefiniert aber oft 0
Meine Werkzeuge