FATS - Fast Access Tree System
Inhaltsverzeichnis
Programmierschnittstellen
MS-Visual C/C++ für Windows 3.x


Das nachfolgende C/C++ Beispiel demonstriert die Verwendung der von FATS bereitgestellten  Index-Befehle:

/*
   FATS 02.30
   (c) GCS Software, Udo Gertz 1993-1998

   Testprogramm (Microsoft C/C++, Visual C/C++)
 
   Schnelle Re-Indizierung (Befehl "XB")
   Es wird die erweiterte FATS Version benötigt.

   19-03-2009 U.Gertz
*/ 

   #include <stdio.h>
   #include <io.h>
   #include <fcntl.h>
   #include <sys\types.h>
   #include <sys\stat.h>
   #include <stdlib.h>
   #include <string.h>
   #include <memory.h>
   #include "FATS.h"



   struct kdat {
          char LOESCHKENNZ;
          char ANREDE[6];
          char NAME[26];
          char BRANCHE[26];
          char STRASSE[26];
          char PLZ[6];
          char ORT[21]; };

   char           szCmnd[256];
   char           szKey[256];
   unsigned int   uErrorcode;
   unsigned long  dwRecno;
   void _far *    lpFATSData;

   struct kdat    kdata;


int main ()
{
   int  hKunden;
   int  nIOresult;
   unsigned long dwRecords = 0L;

   /*
      Bevor Sie die FATS-Befehle in Ihrem Programm verwenden können,
      müssen Sie FATS einen Datenbereich zuweisen:
   */ 

   lpFATSData = FATSLibInit(0, 2);

   /*
      Der erste Parameter bestimmt die Größe des FATS-Datenbereichs.
      Wenn Sie hier eine Null angeben, dann wird der minimal benötigte
      Speicherplatz reserviert (ca. 18-20 KB). Der zweite Parameter
      bestimmt die eingesetzte Programmiersprache. Die Adresse des
      Datenbereichs wird in der Variable lpFatsdata zurückgegeben.
   */ 


   hKunden = open( "KUNDEN.DAT", O_RDWR );
   setmode(hKunden, O_BINARY);


   /*
      -------> Indexdatei erstellen
   */ 

   /*
       "C" Create Indexfile
    
      Mit diesem Befehl erstellen Sie eine Indexdatei, wobei eine
      eventuell bereits vorhandene Datei mit demselben Dateinamen
      gelöscht wird.
      Die Indexdatei wird dabei gleichzeitig mit den über den
      Befehl Auto Refresh (Y) definierten Öffnungsflags geöffnet
      und der Dateinummer "FileNo" zugewiesen. Diese Nummer muß bei
      allen nachfolgenden FATS-Befehlen angegeben werden, um mit
      der Indexdatei zu arbeiten.
    
      Maximal 200 Schlüssel pro Datensatz können in einer Indexdatei
      verwaltet werden, wobei die maximale Schlüssellänge 240 Zeichen
      beträgt.
    
      Beachten Sie bei der Dateipfadangabe, daß der Backslash (\) von
      FATS als Trennzeichen behandelt wird und daher im Pfad durch
      einen normalen Schrägstrich ersetzt werden sollte.
      Alternativ dazu können Sie auch das Trennzeichen umdefinieren,
      indem Sie dieses als erstes Zeichen im Befehlsstring angeben,
      z.B. szCmnd = "&C&C:\ARTIKEL.KEY&1&1&A&1" (das Trennzeichen muß
      ein ASCII-Zeichen kleiner als 48 sein).
    
      Der Aufbau des Kommandostrings:
    
        szCmnd = "C\{Filename}\{KeyLength}\{KeyCount}\{KeyType}\{FileNo}"
    
          FileName   Name der Datei, eventuell mit Pfadangabe
                     (z.B. C:/DATEN/ARTIKEL.KEY oder ARTIKEL.KEY)
    
          KeyLength  Maximale Länge der Schlüssel
    
          KeyCount   Anzahl Schlüssel (1-200)
    
          KeyType    Art der Schlüssel (A=ASCII Textschlüssel, I=Integer)
    
          FileNo     Nummer der Indexdatei (1-40)

   */  

   printf( "Indexdatei wird erstellt ...\n\n" );
   dwRecno = FATSLibCall( "C\\KUNDEN.KEY\\25\\3\\A\\1", &uErrorcode, szKey, lpFATSData );

   if ( uErrorcode ) {

     printf( "FATS Fehlercode: %i\n", uErrorcode );
     return ( uErrorcode );
   }


   /*
      ========================================================================
                Indexdatei wiederherstellen
      ========================================================================
   */ 

   do {

     nIOresult = read( hKunden, &kdata, sizeof( kdata ) );

     if ( nIOresult != sizeof( kdata ) ) {

       /*
          Nachdem der letzte Datensatz indiziert wurde, wird die
          Indizierung durch die Angabe einer Null anstelle einer
          gültigen Datensatznummer beendet ("XB\{Dateinummer}\0").
          Die Datei wird dabei geschlossen - ein Close-Befehl ist
          danach nicht mehr nötig.
       */ 

       dwRecno = FATSLibCall( "XB\\1\\0", &uErrorcode, szKey, lpFATSData );
       break;
     }
     dwRecords++;

     if ( !kdata.LOESCHKENNZ ) {

       /*
           "XB" Re-Indexing: Build
        
          Diesem Befehl wird die im Befehl "C" angegebene Anzahl
          Schlüssel im Kommandostring übergeben. Die Schlüssel
          werden in die Indexdatei einsortiert und der Satznummer
          "RecNo" zugeordnet.
        
          Verwenden Sie diesen Befehl, um nach einem erfolgreichen
          "Create Indexfile" (C) - Befehl innerhalb einer
          Programmschleife die Schlüssel aller Datensätze in den
          Index einzufügen.
          Der Befehl steht nur bei einer Re-Indizierung bereit, d.h.
          unmittelbar nach Ausführung des "C"-Kommandos, spätere
          Änderungen am Index werden z.B. über den Insert Record (I)
          Befehl realisiert.
        
          Das Kommando "XB\{FileNo}\0" beendet die Re-Indizierung und
          schließt die entsprechende Indexdatei. Die Indexdatei wird bei
          einem durch Fehler bedingten vorzeitigen Abbruch der Re-Indizierung
          automatisch geschlossen. In jedem Fall kann ein anschließendes
          Close-Kommando unterbleiben.
        
          Die Länge der übergebenen Schlüssel darf die beim "Create
          Indexfile" (C) angegebene Länge nicht überschreiten, kürzere
          Schlüssel werden mit dem ASCII-Zeichen 00h auf die maximale
          Schlüssellänge erweitert.
        
          Der Aufbau des Kommandostrings:
        
            szCmnd = "XB\{FileNo}\{RecNo}\{KeyStr1}[\{KeyStr2}]"
        
              FileNo     Nummer der Indexdatei
        
              RecNo      <> 0 Datensatznummer
                         == 0 Re-Indizierung beenden
        
              KeyStr#    Schlüssel

       */  

       sprintf( szCmnd, "XB\\1\\%lu\\%s\\%s\\%s%s", dwRecords,
                kdata.NAME, kdata.BRANCHE, kdata.PLZ, kdata.ORT );

     } else {

       /*
          Datensatz als "Gelöscht" markieren
       */ 

       sprintf( szCmnd, "DL\\%lu\\S\\1", dwRecords );
     }

       dwRecno = FATSLibCall( szCmnd, &uErrorcode, szKey, lpFATSData );


   } while ( !uErrorcode );


   close( hKunden );


   /*
      Vor dem Beenden des Anwendungsprogrammes sollten Sie den mit der
      Funktion FATSLibInit reservierten Speicherbereich wieder freigeben.
      Dafür steht die Funktion FATSLibExit zur Verfügung:
   */ 

   lpFATSData = FATSLibExit( lpFATSData );

   /*
      Obwohl der Speicherbereich notfalls auch vom Betriebssystem
      automatisch freigegeben würde, ist dieser Befehl nützlich, da
      er sämtliche noch geöffneten FATS-Dateien ordnungsgemäß schließt.
   */ 


}

© 2008  GCS Software, Udo Gertz