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 / db2 / dbase.c < prev    next >
C/C++ Source or Header  |  1997-09-03  |  4KB  |  270 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.   erc_elements(c, er)
  43.     {
  44.       if (eref_get(er).ssNum == key) return (er);
  45.     } end_erc_elements ;
  46.  
  47.   return erefNIL;
  48. }
  49.  
  50. eref _db_keyGet (int key)
  51. {
  52.   int i;
  53.   eref er;
  54.   
  55.   for (i = firstERC; i <= lastERC; i++)
  56.     {
  57.       er = _db_ercKeyGet (db[i], key);
  58.       if (!eref_equal (er, erefNIL))
  59.     {
  60.       return er;
  61.     }
  62.     }
  63.   
  64.   return erefNIL;
  65. }
  66.  
  67. int _db_addEmpls (erc c, int l, int h, empset s)
  68. {
  69.   employee e;
  70.   int numAdded;
  71.   numAdded = 0;
  72.   
  73.   erc_elements (c, er) 
  74.     {
  75.       e = eref_get(er);
  76.       if ((e.salary >= l) && (e.salary <= h)) 
  77.     {
  78.       empset_insert(s, e);
  79.       numAdded++;
  80.     }
  81.     } end_erc_elements ;
  82.  
  83.   return numAdded;
  84. }
  85.  
  86. db_status hire (employee e)
  87. {
  88.   if (e.gen == gender_ANY)
  89.     return genderERR;
  90.  
  91.   if (e.j == job_ANY)
  92.     return jobERR;
  93.  
  94.   if (e.salary < 0)
  95.     return salERR;
  96.  
  97.   if (!eref_equal (_db_keyGet (e.ssNum), erefNIL))
  98.     return duplERR;
  99.  
  100.   uncheckedHire (e);
  101.   return db_OK;
  102. }
  103.  
  104. void uncheckedHire (employee e)
  105. {
  106.   eref er;
  107.   
  108.   er = eref_alloc ();
  109.   eref_assign (er, e);
  110.   
  111.   if (e.gen == MALE)
  112.     if (e.j == MGR)
  113.       erc_insert (db[mMGRS], er);
  114.     else
  115.       erc_insert (db[mNON], er);
  116.   else
  117.     if (e.j == MGR)
  118.       erc_insert (db[fMGRS], er);
  119.     else
  120.       erc_insert (db[fNON], er);
  121. }
  122.  
  123. bool fire (int ssNum)
  124. {
  125.   int i;
  126.   
  127.   for (i = firstERC; i <= lastERC; i++)
  128.     {
  129.       erc_elements(db[i], er)
  130.     {
  131.       if (eref_get(er).ssNum == ssNum) 
  132.         {
  133.           erc_delete(db[i], er);
  134.           return TRUE;
  135.         } 
  136.     } end_erc_elements ;
  137.     }
  138.   
  139.   return FALSE;
  140. }
  141.  
  142. bool promote (int ssNum)
  143. {
  144.   eref er;
  145.   employee e;
  146.   gender g;
  147.   
  148.   g = MALE;
  149.   er = _db_ercKeyGet (db[mNON], ssNum);
  150.   
  151.   if (eref_equal (er, erefNIL))
  152.     {
  153.       er = _db_ercKeyGet (db[fNON], ssNum);
  154.       if (eref_equal (er, erefNIL))
  155.     return FALSE;
  156.       g = FEMALE;
  157.     }
  158.   
  159.   e = eref_get (er);
  160.   e.j = MGR;
  161.   eref_assign (er, e);
  162.   
  163.   if (g == MALE)
  164.     {
  165.       erc_delete (db[mNON], er);
  166.       erc_insert (db[mMGRS], er);
  167.     } 
  168.   else
  169.     {
  170.       erc_delete (db[fNON], er);
  171.       erc_insert (db[fMGRS], er);
  172.     }
  173.   
  174.   return TRUE;
  175. }
  176.  
  177. db_status setSalary (int ssNum, int sal)
  178. {
  179.   eref er;
  180.   employee e;
  181.   
  182.   if (sal < 0)
  183.     {
  184.       return salERR;
  185.     }
  186.  
  187.   er = _db_keyGet (ssNum);
  188.  
  189.   if (eref_equal (er, erefNIL))
  190.     {
  191.       return missERR;
  192.     }
  193.  
  194.   e = eref_get (er);
  195.   e.salary = sal;
  196.   eref_assign (er, e);
  197.  
  198.   return db_OK;
  199. }
  200.  
  201. int query (db_q q, empset s)
  202. {
  203.   int numAdded;
  204.   int l, h;
  205.   int i;
  206.  
  207.   l = q.l;
  208.   h = q.h;
  209.  
  210.   switch (q.g)
  211.     {
  212.     case gender_ANY:
  213.       switch (q.j)
  214.     {
  215.     case job_ANY:
  216.       numAdded = 0;
  217.       for (i = firstERC; i <= lastERC; i++)
  218.         numAdded += _db_addEmpls (db[i], l, h, s);
  219.       return numAdded;
  220.     case MGR:
  221.       numAdded = _db_addEmpls (db[mMGRS], l, h, s);
  222.       numAdded += _db_addEmpls (db[fMGRS], l, h, s);
  223.       return numAdded;
  224.     case NONMGR:
  225.       numAdded = _db_addEmpls (db[mNON], l, h, s);
  226.       numAdded += _db_addEmpls (db[fNON], l, h, s);
  227.       return numAdded;
  228.     }
  229.     case MALE:
  230.       switch (q.j)
  231.     {
  232.     case job_ANY:
  233.       numAdded = _db_addEmpls (db[mMGRS], l, h, s);
  234.       numAdded += _db_addEmpls (db[mNON], l, h, s);
  235.       return numAdded;
  236.     case MGR:
  237.       return _db_addEmpls (db[mMGRS], l, h, s);
  238.     case NONMGR:
  239.       return _db_addEmpls (db[mNON], l, h, s);
  240.     }
  241.     case FEMALE:
  242.       switch (q.j)
  243.     {
  244.     case job_ANY:
  245.       numAdded = _db_addEmpls (db[fMGRS], l, h, s);
  246.       numAdded += _db_addEmpls (db[fNON], l, h, s);
  247.       return numAdded;
  248.     case MGR:
  249.       return _db_addEmpls (db[fMGRS], l, h, s);
  250.     case NONMGR:
  251.       return _db_addEmpls (db[fNON], l, h, s);
  252.     }
  253.     }
  254. }
  255.  
  256. void db_print (void)
  257. {
  258.   int i;
  259.   char *printVal;
  260.   
  261.   printf ("Employees:\n");
  262.  
  263.   for (i = firstERC; i <= lastERC; i++)
  264.     {
  265.       printVal = erc_sprint (db[i]);
  266.       printf ("%s", printVal);
  267.       free (printVal);
  268.     }
  269. }
  270.