FATS - Fast Access Tree System
Inhaltsverzeichnis
Programmierschnittstellen
MS-C für OS/2


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 für OS/2)
 
   Datei KUNDEN.DAT re-indizieren

   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           szFATSkey[256];
   unsigned short uFATSError;
   unsigned long  dwFATSRecno;

   struct kdat    kdata;


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


   /*
      -------> Aktivierung des FATS Cachesystems
    
      Standardmäßig ist die Cacheverwaltung ausgeschaltet. Sie können diese
      mit dem Befehl  "Y" Auto Refresh initialisieren.
    
      Mit diesem Befehl können Sie vor einer Reorganisation den FATS-Cache
      mittels "Y\5" oder "Y\106" einschalten, die entsprechende Indexdatei
      erzeugen oder öffnen und dann die Schlüssel einfügen.
      Nach Beenden der Reorganisation stellen Sie den ursprünglichen Zustand
      mit "Y\0", "Y\2" etc. wieder her. Die Operation kann dadurch im
      günstigsten Fall bis zu 30x schneller ablaufen.
    
      Bei der Einstellung "Y\5" werden die Daten nicht sofort nach jedem
      schreibenden Befehl auf die Platte geschrieben, sondern solange in den
      FATS internen Cachepuffern behalten, bis diese überlaufen. Beim ersten
      Schreibzugriff werden jedoch sämtliche zu der jeweiligen Datei gehörende
      Puffer auf die Platte geschrieben, wodurch die Integrität der Indexdatei
      garantiert wird. Das Zurückschreiben der Cachepuffer kann auch jederzeit
      durch den Befehl W (Write Page Map) erreicht werden.
    
      Diese Einstellung bringt im günstigsten Fall eine bis zu 30-fache
      Beschleunigung gegenüber den herkömmlichen Einstellungen ("Y\0" & "Y\2"),
      es muß jedoch selbst dafür gesorgt werden, daß die Indexdatei bei
      Beendigung des Programmes mit dem Befehl Close Indexfile (K) geschlossen
      wird.
    
      Als Äquivalent im Netzwerkbetrieb dient der Befehl "Y\106"
    

   */  

   dwFATSRecno = FATSCALL( "Y\\5", &uFATSError, szFATSkey );


   /*
      -------> Datendatei öffnen
   */ 

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


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

   dwFATSRecno = FATSCALL( "C\\KUNDEN.KEY\\25\\3\\A\\1", &uFATSError, szFATSkey );


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

   do {

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

     if ( nIOresult != sizeof( kdata ) ) {

       break;
     }
     dwRecords++;

     if ( !kdata.LOESCHKENNZ ) {

       /*
           "BK" Build Keys
        
          Diesem Befehl wird die im Befehl Create Indexfile (C)
          angegebene Anzahl Schlüssel im Kommandostring übergeben.
          Die Schlüssel werden in die Indexdatei einsortiert und
          der Satznummer "RecNo" zugeordnet.
        
          Dieser Befehl entspricht dem Befehl Insert Keys (IK), die
          Daten werden jedoch nicht sofort nach dem Befehl auf die
          Platte geschrieben, sondern solange in den FATS internen
          Cachepuffern behalten, bis diese überlaufen.
        
          Der Aufbau des Kommandostrings:
        
            szCmnd = "BK\{RecNo}\{FileNo}\{KeyStr1}[\{KeyStr2}[\{KeyStr3}]]"
        
              RecNo      Datensatznummer
        
              FileNo     Nummer der Indexdatei
        
              KeyStr#    Schlüssel

       */  

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

     } else {

       /*
           "DL" Manipulate Deleted List

       */  

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

       dwFATSRecno = FATSCALL( szCmnd, &uFATSError, szFATSkey );


   } while ( !uFATSError );

   /*
      --------> Indexdatei schließen
   */ 

   dwFATSRecno = FATSCALL( "K\\1", &uFATSError, szFATSkey );

   close( hKunden );

}

© 2008  GCS Software, Udo Gertz