Product Documentation

FairCom ISAM for C

Previous Topic

Next Topic

Manage

The database() function includes a loop that asks if you want to add a new record, delete an existing record, or quit. The other functions implement various data management functions: datadd(), transkey(), getfld(), and datdel().

Below is the code for the "Manage" functions, database(), datadd(), transkey(), getfld(), and datdel():

/********************************************************

* *

* database: This is the main action function. *

* *

********************************************************/

#ifdef PROTOTYPE

VOID database(void)

#else

VOID database()

#endif

{

TEXT choice[2];

#ifdef PROTOTYPE

VOID datadd(void), datdel(void);

#else

VOID datadd(), datdel();

#endif

choice[0] = '\0';

while (choice[0] != 'Q')

{

printf("\n\nA)dd D)elete Q)uit:");

fflush(stdout);

ctsfill(inpbuf,0,INPBUFSIZ);

if (!ctrt_fgets(inpbuf, sizeof(inpbuf), stdin))

inpbuf[0] = 'Q';

choice[0] = (TEXT)toupper((NINT)inpbuf[0]);

switch (choice[0])

{

case 'A':

datadd(); /* add new entry to database */

break;

case 'D':

datdel(); /* delete existing entries */

break;

default:

break;

} /* end switch */

} /* end while */

}

/********************************************************

* *

* dataadd: Add a new record *

* *

********************************************************/

#ifdef PROTOTYPE

VOID datadd(void)

#else

VOID datadd()

#endif

{

printf("\nADD NEW DATA\n\n");

/* Initialize the new record so that all fields are blank */

invent.delete_flag[0] = '\0';

invent.delete_flag[1] = '\0';

invent.item[0] = '\0';

invent.descrip[0] = '\0';

invent.location[0] = '\0';

invent.quantity = 0.0;

invent.cost = 0.0;

getfld(); /* acquire new item info */

transkey(keyfld,invent.item,sizeof(invent.item)); /* prepare key for use */

/* Look to see if this key is already *

* in the file. */

if (GetKey(INVENTIDX,keyfld))

{

printf("\nKey already in file, cannot add");

return;

}

if (uerr_cod) /* Check for error in EQLKEY call*/

{

func_error(INVENTIDX);

return;

}

/* Get data record from data file */

if ((datarec = NewData(INVENTDAT)) == 0)

/* assignment intended */

{

func_error(INVENTDAT);

return;

}

/* Write data record to data file */

if (WriteData(INVENTDAT,datarec,&invent))

{

func_error(INVENTDAT);

ReleaseData(INVENTDAT,datarec);

/* if we cannot write to *

* the record, we will *

* return the record to *

* the pool. */

LockCtData(INVENTDAT,ctFREE,datarec);

/* NewData puts a lock on *

* the record automatically*

* that we must free */

return;

}

/* Add key to the index, now that we know*

* that we have successfully added the *

* record to the data file. */

if (AddKey(INVENTIDX,keyfld,datarec,REGADD))

{

func_error(INVENTIDX);

ReleaseData(INVENTDAT,datarec);

/* If cannot add key, *

* then return the record.*/

LockCtData(INVENTDAT,ctFREE,datarec);

/* NewData puts a lock on *

* the record automatically*

* that we must free */

return;

}

printf("\nSuccessful Addition");

LockCtData(INVENTDAT,ctFREE,datarec);

/* release the lock that NewData placed*/

return;

}

/**********************************************************

* *

* transkey: The key field must be properly formatted *

* by us, as c-tree does not format it *

* automatically with low level functions. *

* We are going to do two things to the *

* key. First, we will translate all of the *

* alpha characters to upper case. Second, *

* we will pad the key to its full length. *

* This second part is very critical! c-tree *

* looks at the entire buffer when comparing *

* keys, and if you have garbage after a *

* null terminated string in a key buffer, *

* that becomes a part of the key! *

* *

***********************************************************/

#ifdef PROTOTYPE

VOID transkey(pTEXT dest,pTEXT source,NINT len)

#else

VOID transkey(dest,source,len)

pTEXT dest,source;

NINT len;

#endif

{

TEXT ch;

len--;

/* loop until field filled or null found,

* translating any lower case to upper case */

while(*source && len-- > 0)

{

ch = *source++;

*dest++ = (TEXT)toupper((NINT)ch);

}

/* fill the rest of the field with nulls, if needed */

while(len-- > 0)

*dest++ = '\0';

*dest = '\0';

}

/********************************************************

* *

* getfld: enter input information *

* *

********************************************************/

#ifdef PROTOTYPE

VOID getfld(void)

#else

VOID getfld()

#endif

{

printf("\nEnter Item ID: ");

fflush(stdout);

ctsfill(inpbuf,0,INPBUFSIZ);

ctrt_fgets(inpbuf, sizeof(inpbuf), stdin);

if (inpbuf[0] != '\0')

cpybuf(invent.item,inpbuf,sizeof(invent.item));

printf("\nEnter Description: ");

fflush(stdout);

ctsfill(inpbuf,0,INPBUFSIZ);

ctrt_fgets(inpbuf, sizeof(inpbuf), stdin);

if (inpbuf[0] != '\0')

cpybuf(invent.descrip,inpbuf,sizeof(invent.descrip));

printf("\nEnter Location: ");

fflush(stdout);

ctsfill(inpbuf,0,INPBUFSIZ);

ctrt_fgets(inpbuf, sizeof(inpbuf), stdin);

if (inpbuf[0] != '\0')

cpybuf(invent.location,inpbuf,sizeof(invent.location));

printf("\nEnter Quantity: ");

fflush(stdout);

ctsfill(inpbuf,0,INPBUFSIZ);

ctrt_fgets(inpbuf, sizeof(inpbuf), stdin);

if (inpbuf[0] != '\0')

sscanf(inpbuf,"%lf",&invent.quantity);

printf("\nEnter Cost: ");

fflush(stdout);

ctsfill(inpbuf,0,INPBUFSIZ);

ctrt_fgets(inpbuf, sizeof(inpbuf), stdin);

if (inpbuf[0] != '\0')

sscanf(inpbuf,"%lf",&invent.cost);

}

/********************************************************

* *

* datdel: find and delete record *

* *

********************************************************/

#ifdef PROTOTYPE

VOID datdel(void)

#else

VOID datdel()

#endif

{

printf("\nDELETE DATA\n");

printf("\nEnter Item to Delete:");

fflush(stdout);

ctsfill(inpbuf,0,INPBUFSIZ);

ctrt_fgets(inpbuf, sizeof(inpbuf), stdin);

transkey(keyfld,inpbuf,sizeof(invent.item));

/* Prepare key for use. It is important to form

* this key in the same way as we do keys to be added,

* since we will be looking for an exact match

*/

/* find the key to delete in index */

if (!(datarec = GetKey(INVENTIDX,keyfld)))

{

if (uerr_cod)

func_error(INVENTIDX);

else

printf("\nKey not found");

return;

}

/* read the record to display */

if (ReadData(INVENTDAT,datarec,&invent))

func_error(INVENTDAT);

else

{

printf("\n\nItem %s",invent.item);

printf("\nDescription %s",invent.descrip);

printf("\nLocation %s",invent.location);

printf("\nQuantity %f",invent.quantity);

printf("\nCost %f",invent.cost);

}

/* Delete the key from index */

if (DeleteKey(INVENTIDX,keyfld,datarec))

{

printf("\n\nKey delete failed (code %d).",uerr_cod);

return;

}

/* Return the data record to pool */

if (ReleaseData(INVENTDAT,datarec))

printf("\n\nData record delete failed (code %d).",uerr_cod);

else

printf("\n\nDelete Successful");

}

TOCIndex