dbase.c
dbase.c
# include <strings.h>
#include "dbase.h"
# define firstERC mMGRS
# define lastERC fNON
# define numERCS (lastERC - firstERC + 1)
typedef enum
{
mMGRS, fMGRS, mNON, fNON
} employeeKinds;
erc db[numERCS];
bool initDone = FALSE;
void db_initMod (void)
{
int i;
if (initDone)
{
return;
}
bool_initMod ();
employee_initMod ();
eref_initMod ();
erc_initMod ();
empset_initMod ();
for (i = firstERC; i <= lastERC; i++)
{
db[i] = erc_create ();
}
initDone = TRUE;
}
eref _db_ercKeyGet (erc c, int key)
{
eref er;
ercIter it;
for_ercElems (er, it, c)
{
if (eref_get (er).ssNum == key)
{
erc_iterReturn (it, er);
}
}
return erefNIL;
}
eref _db_keyGet (int key)
{
int i;
eref er;
for (i = firstERC; i <= lastERC; i++)
{
er = _db_ercKeyGet (db[i], key);
if (!eref_equal (er, erefNIL))
{
return er;
}
}
return erefNIL;
}
int _db_addEmpls (erc c, int l, int h, empset s)
{
eref er;
ercIter it;
employee e;
int numAdded;
numAdded = 0;
for_ercElems (er, it, c)
{
e = eref_get (er);
if ((e.salary >= l) && (e.salary <= h))
{
empset_insert (s, e);
numAdded++;
}
}
return numAdded;
}
db_status hire (employee e)
{
if (e.gen == gender_ANY)
return genderERR;
if (e.j == job_ANY)
return jobERR;
if (e.salary < 0)
return salERR;
if (!eref_equal (_db_keyGet (e.ssNum), erefNIL))
return duplERR;
uncheckedHire (e);
return db_OK;
}
void uncheckedHire (employee e)
{
eref er;
er = eref_alloc ();
eref_assign (er, e);
if (e.gen == MALE)
if (e.j == MGR)
erc_insert (db[mMGRS], er);
else
erc_insert (db[mNON], er);
else
if (e.j == MGR)
erc_insert (db[fMGRS], er);
else
erc_insert (db[fNON], er);
}
bool fire (int ssNum)
{
int i;
eref er;
ercIter it;
for (i = firstERC; i <= lastERC; i++)
for_ercElems (er, it, db[i])
if (eref_get (er).ssNum == ssNum)
{
erc_iterFinal (it);
erc_delete (db[i], er);
return TRUE;
}
return FALSE;
}
bool promote (int ssNum)
{
eref er;
employee e;
gender g;
g = MALE;
er = _db_ercKeyGet (db[mNON], ssNum);
if (eref_equal (er, erefNIL))
{
er = _db_ercKeyGet (db[fNON], ssNum);
if (eref_equal (er, erefNIL))
return FALSE;
g = FEMALE;
}
e = eref_get (er);
e.j = MGR;
eref_assign (er, e);
if (g == MALE)
{
erc_delete (db[mNON], er);
erc_insert (db[mMGRS], er);
}
else
{
erc_delete (db[fNON], er);
erc_insert (db[fMGRS], er);
}
return TRUE;
}
db_status setSalary (int ssNum, int sal)
{
eref er;
employee e;
if (sal < 0)
{
return salERR;
}
er = _db_keyGet (ssNum);
if (eref_equal (er, erefNIL))
{
return missERR;
}
e = eref_get (er);
e.salary = sal;
eref_assign (er, e);
return db_OK;
}
int query (db_q q, empset s)
{
eref er;
employee e;
int numAdded;
int l, h;
int i;
l = q.l;
h = q.h;
switch (q.g)
{
case gender_ANY:
switch (q.j)
{
case job_ANY:
numAdded = 0;
for (i = firstERC; i <= lastERC; i++)
numAdded += _db_addEmpls (db[i], l, h, s);
return numAdded;
case MGR:
numAdded = _db_addEmpls (db[mMGRS], l, h, s);
numAdded += _db_addEmpls (db[fMGRS], l, h, s);
return numAdded;
case NONMGR:
numAdded = _db_addEmpls (db[mNON], l, h, s);
numAdded += _db_addEmpls (db[fNON], l, h, s);
return numAdded;
}
case MALE:
switch (q.j)
{
case job_ANY:
numAdded = _db_addEmpls (db[mMGRS], l, h, s);
numAdded += _db_addEmpls (db[mNON], l, h, s);
return numAdded;
case MGR:
return _db_addEmpls (db[mMGRS], l, h, s);
case NONMGR:
return _db_addEmpls (db[mNON], l, h, s);
}
case FEMALE:
switch (q.j)
{
case job_ANY:
numAdded = _db_addEmpls (db[fMGRS], l, h, s);
numAdded += _db_addEmpls (db[fNON], l, h, s);
return numAdded;
case MGR:
return _db_addEmpls (db[fMGRS], l, h, s);
case NONMGR:
return _db_addEmpls (db[fNON], l, h, s);
}
}
}
void db_print (void)
{
int i;
char *printVal;
printf ("Employees:\n");
for (i = firstERC; i <= lastERC; i++)
{
printVal = erc_sprint (db[i]);
printf ("%s", printVal);
free (printVal);
}
}
David Evans
University of Virginia, Computer Science
evans@cs.virginia.edu