Listing 6: Managing application-specific information

#include "plfile.h"

struct PlayEventRec {   // the data base record

    enum { NUM_FIELDS = 5 };

    enum RecFields {
            SeqNum = 0,
            ID, 
            Status,
            Len,
            Name
    };

    enum FieldLengths {
            LEN_SeqNum     = sizeof( long ), // gets cast to a long
            LEN_ID         = 5,
            LEN_Status     = 5,
            LEN_Length     = 4,
            LEN_Name       = 30
    };

    enum FieldPositions {
            START_SeqNum      = 0,
            START_ID          = START_SeqNum + LEN_SeqNum,
            START_Status      = START_ID + LEN_ID,
            START_Length      = START_Status + LEN_Status,
            START_Name        = START_Length + LEN_Length
    };

    char    seqNum[ LEN_SeqNum ];
    char    Id[ LEN_ID ];
    char    status[ LEN_Status ];
    char    length[ LEN_Length ];
    char    name[ LEN_Name ];
};

    /* Allocate and initialize the field information structure. */
static ObjFieldInfo fieldInfo[PlayEventRec::NUM_FIELDS] = {

    { PlayEventRec::START_SeqNum, PlayEventRec::LEN_SeqNum,
      ISAMFile::CHAR_TYPE },
    { PlayEventRec::START_ID, PlayEventRec::LEN_ID, ISAMFile::CHAR_TYPE },
    { PlayEventRec::START_Status, PlayEventRec::LEN_Status,
      ISAMFile::CHAR_TYPE },
    { PlayEventRec::START_Length, PlayEventRec::LEN_Length,
      ISAMFile::CHAR_TYPE },
    { PlayEventRec::START_Name,   PlayEventRec::LEN_Name,
      ISAMFile::CHAR_TYPE }
};

    /* Allocate and initialize the primaryIndexKey
       description structure. */

static ObjIndexKey primaryIndexKey = {
            ISAMFile::noDuplicates,
            1,
            { { PlayEvent::SeqNum, 0 } } // partial init of array of KeyFields
};

// Constructors

PlayListFile::PlayListFile()
:
    ObjFile<PlayEvent>( 0, ::fieldInfo, PlayEventRec::NUM_FIELDS )
{
    SetPrimaryKey( primaryIndexKey );
}

PlayListFile::PlayListFile ( const char * file_name)
:
    ObjFile<PlayEvent>( file_name, ::fieldInfo, PlayEventRec::NUM_FIELDS )
{
    SetPrimaryKey( primaryIndexKey );
}

PlayListFile::~PlayListFile ()
{
    ;
}

// Private methods

int
PlayListFile::ConvObjToRec( PlayEvent & event, char * rec, ObjIndexKey * )
{
    PlayEventRec & peRec = *((PlayEventRec *) rec);
    memset( (void *) &peRec, '\0', sizeof( PlayEventRec ));

    event.GetFieldStr( peRec.seqNum, PlayEvent::SeqNum,
                       PlayEventRec::LEN_SeqNum, PlayEvent::BINARY );
    event.GetFieldStr( peRec.Id, PlayEvent::ID, PlayEventRec::LEN_ID );
    event.GetFieldStr( peRec.status, PlayEvent::Status,
                       PlayEventRec::LEN_Status, PlayEvent::ABREV );
    event.GetFieldStr( peRec.length, PlayEvent::Len,
                       PlayEventRec::LEN_Length, PlayEvent::NO_MINS );
    event.GetFieldStr( peRec.name, PlayEvent::Name, PlayEventRec::LEN_Name );
    return 0;

}

int
PlayListFile::ConvRecToObj( char * rec, PlayEvent & event, ObjIndexKey * )
{
    PlayEventRec & peRec = *((PlayEventRec *) rec);

    event.PutFieldStr( peRec.seqNum, PlayEvent::SeqNum,
                       PlayEventRec::LEN_SeqNum, PlayEvent::BINARY );
    event.PutFieldStr( peRec.Id, PlayEvent::ID, PlayEventRec::LEN_ID );
    event.PutFieldStr( peRec.status, PlayEvent::Status,
                       PlayEventRec::LEN_Status, PlayEvent::ABREV );
    event.PutFieldStr( peRec.length, PlayEvent::Len,
                       PlayEventRec::LEN_Length, PlayEvent::NO_MINS );
    event.PutFieldStr( peRec.name, PlayEvent::Name, PlayEventRec::LEN_Name );
    return 0;

}

boolean
PlayListFile::IsNull( const PlayEvent & event ) const
{
 return event.id() == -1;
}

void
PlayListFile::MakeNull( PlayEvent & event )
{
 event.id( -1 );
}
//End of File