]>
Commit | Line | Data |
---|---|---|
885824d3 | 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 | } |