C Language Development Kit/Snippets/Database/CreateIndexFile

From OptiWiki

Jump to: navigation, search
Description Make a sorted indexed file from a not sorted database for fast searching in a database that may not be sorted databases. This is also handy when a very large not sorted database gets loaded into the terminal.
Syntax
int CreateIndexFile( SDBFile *dbFile, short offset, short keysize, const char *indexfilename, SDBFile *dbIndex );
Arguments SDBFile *dbFile

dbFile is pointer to a structure that holds information about the database. The SDBFile structure is defined as followed:

typedef struct
{
    short  sRecSz;        // record size of database
    int    fd;            // real handle to the open file
    long   lCurrRecord;   // current record number
    long   lTotalRecords; // total amount of records
    int    bOpen;         // check to see if db is open or closed
}SDBFile;
short offset

How many positions to the right to start making index.

short keysize

the size of the search key to make the index on.

const char *indexfilename

The name of the index file to create.

SDBFile *dbIndex dbIndex is a pointer to a structure that holds information about the index file. How the SDBFile structure is defined see above.

Returns
TRUE On success.
FLASE On failure.
Remarks The declaration of the SDBFile needs to be static to make sure all items are initialized to 0.

When the CreateIndexFile() functions returns FALSE the error code can be obtained by making a call to GetDBErrorCode() function.

WARNING:
If the index file with the indexfilename already exists the index file is overwritten.

Example
#include "lib.h"
#include <stdio.h>
#include "database.h"  //Holds the database functions
 
void main( void )
{
    static SDBFile dbFile;  // static initializes all items to 0
    static SDBFile dbIndex; // static initializes all items to 0
    long recno;
    int i;
    char record[32 + 1];
 
    printf("\fCreate database\n");
    if( !CreateDatabase("file1.txt", 32, &dbFile ))
        printf("Error code = %ld\n", GetDBErrorCode());
 
    memset( record, '\0', sizeof( record ));
    printf("Write 10 records\n");
    for( i = 9; i > -1; i-- )
    {
        sprintf(record, "%01d23456789012345678901234567890\r\n", i);
        if( !WriteRecord( &dbFile, record, WRITE_APPEND ))
        {
            printf("Error code = %ld\n", GetDBErrorCode());
            break;
        }
    }
 
    if( !CreateIndexFile( &dbFile, 0, 2, (char*)"file_idx.txt", &dbIndex ))
        printf("Error code = %ld\n", GetDBErrorCode());
 
    if( (recno = SearchIndexFile( &dbIndex,(char*)"62")) == -1L)
        printf("Error code = %ld\n", GetDBErrorCode());
 
    if( !GotoRecord( &dbFile, recno ))
        printf("Error code = %ld\n", GetDBErrorCode());
    if( !ReadCurrentRecord( &dbFile, record ))
        printf("Error code = %ld\n", GetDBErrorCode());
    printf("recnr = %ld, %-30.30s\n", recno, record );
 
    printf("Close Index file\n");
    CloseDatabase( &dbIndex );
 
    printf("Close database\n");
    CloseDatabase( &dbFile );
 
    while( 1 )
        idle();
}


Views
Personal tools