home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lclint.zip / lclint-2_3h-os2-bin.zip / test / db1 / dbase.c < prev    next >
C/C++ Source or Header  |  1997-09-03  |  4KB  |  279 lines

  1. # include <strings.h>
  2. # include "dbase.h"
  3.  
  4. # define firstERC mMGRS
  5. # define lastERC fNON
  6. # define numERCS (lastERC - firstERC + 1)
  7.  
  8. typedef enum
  9. {
  10.   mMGRS, fMGRS, mNON, fNON
  11. } employeeKinds;
  12.  
  13. erc db[numERCS];
  14.  
  15. bool initDone = FALSE;
  16.  
  17. void db_initMod (void)
  18. {
  19.   int i;
  20.   
  21.   if (initDone)
  22.     {
  23.       return;
  24.     }
  25.   
  26.   bool_initMod ();
  27.   employee_initMod ();
  28.   eref_initMod ();
  29.   erc_initMod ();
  30.   empset_initMod ();
  31.   
  32.   for (i = firstERC; i <= lastERC; i++)
  33.     {
  34.       db[i] = erc_create ();
  35.     }
  36.   
  37.   initDone = TRUE;
  38. }
  39.  
  40. eref _db_ercKeyGet (erc c, int key) 
  41. {
  42.   eref er;
  43.   ercIter it;
  44.   
  45.   for_ercElems (er, it, c)
  46.     {
  47.       if (eref_get (er).ssNum == key)
  48.     {
  49.       erc_iterReturn (it, er);
  50.     }
  51.     }
  52.   
  53.   return erefNIL;
  54. }
  55.  
  56. eref _db_keyGet (int key)
  57. {
  58.   int i;
  59.   eref er;
  60.   
  61.   for (i = firstERC; i <= lastERC; i++)
  62.     {
  63.       er = _db_ercKeyGet (db[i], key);
  64.       if (!eref_equal (er, erefNIL))
  65.     {
  66.       return er;
  67.     }
  68.     }
  69.   
  70.   return erefNIL;
  71. }
  72.  
  73. int _db_addEmpls (erc c, int l, int h, empset s)
  74. {
  75.   eref er;
  76.   ercIter it;
  77.   employee e;
  78.   int numAdded;
  79.   numAdded = 0;
  80.   
  81.   for_ercElems (er, it, c)
  82.     {
  83.       e = eref_get (er);
  84.       if ((e.salary >= l) && (e.salary <= h))
  85.     {
  86.       empset_insert (s, e);
  87.       numAdded++;
  88.     }
  89.     }
  90.   
  91.   return numAdded;
  92. }
  93.  
  94. db_status hire (employee e)
  95. {
  96.   if (e.gen == gender_ANY)
  97.     return genderERR;
  98.  
  99.   if (e.j == job_ANY)
  100.     return jobERR;
  101.  
  102.   if (e.salary < 0)
  103.     return salERR;
  104.  
  105.   if (!eref_equal (_db_keyGet (e.ssNum), erefNIL))
  106.     return duplERR;
  107.  
  108.   uncheckedHire (e);
  109.   return db_OK;
  110. }
  111.  
  112. void uncheckedHire (employee e)
  113. {
  114.   eref er;
  115.   
  116.   er = eref_alloc ();
  117.   eref_assign (er, e);
  118.   
  119.   if (e.gen == MALE)
  120.     if (e.j == MGR)
  121.       erc_insert (db[mMGRS], er);
  122.     else
  123.       erc_insert (db[mNON], er);
  124.   else
  125.     if (e.j == MGR)
  126.       erc_insert (db[fMGRS], er);
  127.     else
  128.       erc_insert (db[fNON], er);
  129. }
  130.  
  131. bool fire (int ssNum)
  132. {
  133.   int i;
  134.   eref er;
  135.   ercIter it;
  136.   
  137.   for (i = firstERC; i <= lastERC; i++)
  138.     for_ercElems (er, it, db[i])
  139.       if (eref_get (er).ssNum == ssNum)
  140.     {
  141.       erc_iterFinal (it);
  142.       erc_delete (db[i], er);
  143.       return TRUE;
  144.     }
  145.   
  146.   return FALSE;
  147. }
  148.  
  149. bool promote (int ssNum)
  150. {
  151.   eref er;
  152.   employee e;
  153.   gender g;
  154.   
  155.   g = MALE;
  156.   er = _db_ercKeyGet (db[mNON], ssNum);
  157.   
  158.   if (eref_equal (er, erefNIL))
  159.     {
  160.       er = _db_ercKeyGet (db[fNON], ssNum);
  161.       if (eref_equal (er, erefNIL))
  162.     return FALSE;
  163.       g = FEMALE;
  164.     }
  165.   
  166.   e = eref_get (er);
  167.   e.j = MGR;
  168.   eref_assign (er, e);
  169.   
  170.   if (g == MALE)
  171.     {
  172.       erc_delete (db[mNON], er);
  173.       erc_insert (db[mMGRS], er);
  174.     } 
  175.   else
  176.     {
  177.       erc_delete (db[fNON], er);
  178.       erc_insert (db[fMGRS], er);
  179.     }
  180.   
  181.   return TRUE;
  182. }
  183.  
  184. db_status setSalary (int ssNum, int sal)
  185. {
  186.   eref er;
  187.   employee e;
  188.   
  189.   if (sal < 0)
  190.     {
  191.       return salERR;
  192.     }
  193.  
  194.   er = _db_keyGet (ssNum);
  195.  
  196.   if (eref_equal (er, erefNIL))
  197.     {
  198.       return missERR;
  199.     }
  200.  
  201.   e = eref_get (er);
  202.   e.salary = sal;
  203.   eref_assign (er, e);
  204.  
  205.   return db_OK;
  206. }
  207.  
  208. int query (db_q q, empset s)
  209. {
  210.   eref er;           
  211.   employee e;        
  212.   int numAdded;
  213.   int l, h;
  214.   int i;
  215.  
  216.   l = q.l;
  217.   h = q.h;
  218.  
  219.   switch (q.g)
  220.     {
  221.     case gender_ANY:
  222.       switch (q.j)
  223.     {
  224.     case job_ANY:
  225.       numAdded = 0;
  226.       for (i = firstERC; i <= lastERC; i++)
  227.         numAdded += _db_addEmpls (db[i], l, h, s);
  228.       return numAdded;
  229.     case MGR:
  230.       numAdded = _db_addEmpls (db[mMGRS], l, h, s);
  231.       numAdded += _db_addEmpls (db[fMGRS], l, h, s);
  232.       return numAdded;
  233.     case NONMGR:
  234.       numAdded = _db_addEmpls (db[mNON], l, h, s);
  235.       numAdded += _db_addEmpls (db[fNON], l, h, s);
  236.       return numAdded;
  237.     }
  238.     case MALE:
  239.       switch (q.j)
  240.     {
  241.     case job_ANY:
  242.       numAdded = _db_addEmpls (db[mMGRS], l, h, s);
  243.       numAdded += _db_addEmpls (db[mNON], l, h, s);
  244.       return numAdded;
  245.     case MGR:
  246.       return _db_addEmpls (db[mMGRS], l, h, s);
  247.     case NONMGR:
  248.       return _db_addEmpls (db[mNON], l, h, s);
  249.     }
  250.     case FEMALE:
  251.       switch (q.j)
  252.     {
  253.     case job_ANY:
  254.       numAdded = _db_addEmpls (db[fMGRS], l, h, s);
  255.       numAdded += _db_addEmpls (db[fNON], l, h, s);
  256.       return numAdded;
  257.     case MGR:
  258.       return _db_addEmpls (db[fMGRS], l, h, s);
  259.     case NONMGR:
  260.       return _db_addEmpls (db[fNON], l, h, s);
  261.     }
  262.     }
  263. }
  264.  
  265. void db_print (void)
  266. {
  267.   int i;
  268.   char *printVal;
  269.   
  270.   printf ("Employees:\n");
  271.  
  272.   for (i = firstERC; i <= lastERC; i++)
  273.     {
  274.       printVal = erc_sprint (db[i]);
  275.       printf ("%s", printVal);
  276.       free (printVal);
  277.     }
  278. }
  279.