]> andersk Git - moira.git/blame - regtape/employee.pc
assume 50 characters of department name in input.
[moira.git] / regtape / employee.pc
CommitLineData
7ac48069 1/* $Id$
2 *
3 * Load data into Moira from Personnel Office data file
4 *
5 * Copyright (C) 1990-1998 by the Massachusetts Institute of Technology
6 * For copying and distribution information, please see the file
7 * <mit-copyright.h>.
469f80df 8 */
9
7ac48069 10#include <mit-copyright.h>
932028de 11#include <moira.h>
12#include <moira_site.h>
dfaf9b68 13#include <moira_schema.h>
7ac48069 14
15#include <ctype.h>
16#include <stdio.h>
17#include <string.h>
18
02cd9ede 19EXEC SQL INCLUDE sqlca;
7ac48069 20extern void sqlglm(char *, unsigned int *, unsigned int *);
469f80df 21
7ac48069 22RCSID("$Header$");
469f80df 23
02cd9ede 24#define WHO 11859 /* root */
25#define PROG "emp-tape"
469f80df 26
397e9044 27#define MAX_ID_VALUE 31999
469f80df 28#define MIN_ID_VALUE 101
29
30/* File format is:
31
320-8 id number
339-38 name
3439-62 office address
3563-74 phone1
3675-86 phone2
3787-106 dept
38107-156 title
39157-186 username
40187-241 host
41
42*/
43
44#define LOC_ID 0
45#define LOC_NAME 9
46#define LOC_OFFICE 39
47#define LOC_PHONE 63
48#define LOC_PHONE2 75
49#define LOC_DEPT 87
50#define LOC_TITLE 107
51#define LOC_USERNAME 157
52#define LOC_HOST 187
53
54#define LEN_ID 9
a6e9fead 55#define LEN_NAME 30
56#define LEN_OFFICE 24
469f80df 57#define LEN_PHONE 12
58#define LEN_PHONE2 12
e5843fe8 59#define LEN_DEPT 50
a6e9fead 60#define LEN_TITLE 50
61#define LEN_USERNAME 30
469f80df 62#define LEN_HOST 55
63
64
65struct entry {
5eaef520 66 char *name;
67 char *last;
68 char *first;
69 char *middle;
70 char *title;
71 char *class;
72 char *id;
5eaef520 73 char *dept;
74 char *address;
75 char *phone;
76 char *phone2;
77 int highid;
469f80df 78};
79
7ac48069 80struct entry *get_next_entry(FILE *in);
81void process_entry(struct entry *e);
82void newuser(struct entry *e);
83int set_next_users_id(int limit);
84int set_next_uid(int high);
85void sqlexit(void);
86void dbmserr(char *where, int what);
469f80df 87
88char *whoami;
e5843fe8 89int newfinger = 0, debug = 0, highid = 0;
469f80df 90
9f5e5c05 91#define sqlfail() (sqlca.sqlcode && sqlca.sqlcode != 1403)
bd22473a 92#define SQL_DUPLICATE -2112
3e77c6a3 93
469f80df 94
5eaef520 95int main(int argc, char **argv)
02cd9ede 96{
5eaef520 97 FILE *in;
7ac48069 98 struct entry *e;
5eaef520 99 int i, wait = 0;
dfaf9b68 100 char buf[80], *file = NULL;
5eaef520 101 EXEC SQL BEGIN DECLARE SECTION;
102 char *db = "moira";
103 EXEC SQL END DECLARE SECTION;
104
105 whoami = strrchr(argv[0], '/');
106 if (whoami)
107 whoami++;
108 else
109 whoami = argv[0];
110
111 setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
112 setvbuf(stderr, NULL, _IOLBF, BUFSIZ);
113
114 for (i = 1; i < argc; i++)
115 {
116 if (!strcmp(argv[i], "-w"))
117 wait++;
5eaef520 118 else if (!strcmp(argv[i], "-n"))
119 newfinger++;
e5843fe8 120 else if (!strcmp(argv[i], "-d"))
121 debug++;
122 else if (!strcmp(argv[i], "-h"))
123 highid++;
5eaef520 124 else if (file)
125 fprintf(stderr, "Usage: %s [-w] [-D] [-n] inputfile\n", whoami);
126 else
127 file = argv[i];
469f80df 128 }
129
5eaef520 130 in = fopen(file, "r");
131 if (!in)
132 {
133 fprintf(stderr, "Unable to open %s for input\n", file);
134 exit(1);
469f80df 135 }
136
5eaef520 137 initialize_sms_error_table();
325821e4 138
5eaef520 139 EXEC SQL CONNECT :db IDENTIFIED BY :db;
140 if (sqlca.sqlcode)
141 {
142 dbmserr("opening database", sqlca.sqlcode);
143 exit(1);
3e77c6a3 144 }
469f80df 145
5eaef520 146 while ((e = get_next_entry(in)))
147 {
5eaef520 148 process_entry(e);
149 EXEC SQL COMMIT WORK;
150 if (sqlca.sqlcode)
151 {
9f5e5c05 152 dbmserr("committing work", sqlca.sqlcode);
153 exit(1);
3e77c6a3 154 }
5eaef520 155 if (wait)
156 {
157 printf("Next");
158 fflush(stdout);
dfaf9b68 159 fgets(buf, sizeof(buf), stdin);
469f80df 160 }
161 }
162
5eaef520 163 exit(0);
02cd9ede 164}
469f80df 165
5eaef520 166struct entry *get_next_entry(FILE *in)
469f80df 167{
5eaef520 168 static struct entry e;
0e5cfe5f 169 static char buf[BUFSIZ];
5eaef520 170 static char name[LEN_NAME + 1], sname[LEN_NAME + 1], id[LEN_ID + 1];
171 static char office[LEN_OFFICE + 1], phone[LEN_PHONE + 1];
172 static char phone2[LEN_PHONE2 + 1], dept[LEN_DEPT + 1], title[LEN_TITLE + 1];
173 static char username[LEN_USERNAME + 1], host[LEN_HOST + 1];
174 int ends_sr, ends_jr, ends_iii, ends_iv, ends_ii, ends_v;
175 char *p;
176
177 if (!fgets(buf, sizeof(buf), in))
178 return NULL;
179
180 strncpy(id, &buf[LOC_ID], LEN_ID);
181 id[LEN_ID] = '\0';
182 strncpy(name, &buf[LOC_NAME], LEN_NAME);
183 name[LEN_NAME] = '\0';
184 strncpy(office, &buf[LOC_OFFICE], LEN_OFFICE);
185 office[LEN_OFFICE] = '\0';
186 strncpy(phone, &buf[LOC_PHONE], LEN_PHONE);
187 phone[LEN_PHONE] = '\0';
188 strncpy(phone2, &buf[LOC_PHONE2], LEN_PHONE2);
189 phone2[LEN_PHONE2] = '\0';
190 strncpy(dept, &buf[LOC_DEPT], LEN_DEPT);
191 dept[LEN_DEPT] = '\0';
192 strncpy(title, &buf[LOC_TITLE], LEN_TITLE);
193 title[LEN_TITLE] = '\0';
194 strncpy(username, &buf[LOC_USERNAME], LEN_USERNAME);
195 username[LEN_USERNAME] = '\0';
196 strncpy(host, &buf[LOC_HOST], LEN_HOST);
197 host[LEN_HOST] = '\0';
198
199 strcpy(sname, name);
200 e.name = strtrim(sname);
201 p = strchr(name, ',');
202 if (p)
203 *p = '\0';
204 e.last = strtrim(name);
205 if (p)
206 {
207 p++;
208 while (isspace(*p))
a6e9fead 209 p++;
5eaef520 210 e.first = p;
7ac48069 211 if ((p = strchr(e.first, ' ')))
5eaef520 212 {
213 *p = '\0';
214 e.first = strtrim(e.first);
215 e.middle = strtrim(p + 1);
a6e9fead 216 }
5eaef520 217 else
218 {
219 e.first = strtrim(e.first);
220 e.middle = "";
221 }
222 }
223 else
224 {
225 e.first = "";
226 e.middle = "";
a6e9fead 227 }
5eaef520 228 ends_sr = ends_jr = ends_iii = ends_iv = ends_ii = ends_v = 0;
229 LookForSt(e.last);
230 LookForO(e.last);
7ac48069 231 LookForJrAndIII(e.last, &ends_jr, &ends_sr, &ends_ii, &ends_iii,
232 &ends_iv, &ends_v);
233 LookForJrAndIII(e.first, &ends_jr, &ends_sr, &ends_ii, &ends_iii,
234 &ends_iv, &ends_v);
5eaef520 235 FixCase(e.last);
236 FixCase(e.first);
237 FixCase(e.middle);
238
239 e.id = id;
5eaef520 240
241 e.address = strtrim(office);
242 e.phone = strtrim(phone);
243 e.phone2 = strtrim(phone2);
244 e.dept = strtrim(dept);
245 e.title = strtrim(title);
246
247 e.class = "MITS";
e5843fe8 248 e.highid = highid;
7ac48069 249 if (strstr(e.title, "PROF") || strstr(e.title, "LECTURE"))
5eaef520 250 e.class = "FACULTY";
251 if (!strcmp(e.dept, "LINCOLN LAB"))
252 {
253 e.class = "LINCOLN";
254 e.highid = 1;
64b4c6b1 255 }
469f80df 256
5eaef520 257 return &e;
469f80df 258}
259
7ac48069 260void process_entry(struct entry *e)
02cd9ede 261{
0e5cfe5f 262 int changed, nochange;
dfaf9b68 263 char buf[MAX_FIELD_WIDTH], *from, *to;
5eaef520 264 EXEC SQL BEGIN DECLARE SECTION;
0e5cfe5f 265 char *first, *last, *middle, *sid, *name, *rdept;
5eaef520 266 char *rtitle, *raddr, *rhphone, *rophone, *prog;
dfaf9b68 267 char class[USERS_TYPE_SIZE], oaddr[USERS_OFFICE_ADDR_SIZE];
268 char ophone[USERS_OFFICE_PHONE_SIZE], dept[USERS_DEPARTMENT_SIZE];
269 char dfirst[USERS_FIRST_SIZE], dlast[USERS_LAST_SIZE];
270 char dmiddle[USERS_MIDDLE_SIZE];
5eaef520 271 int id, status, who;
272 EXEC SQL END DECLARE SECTION;
273
274 who = WHO;
275 prog = PROG;
276 first = e->first;
dfaf9b68 277 if (strlen(first) > USERS_FIRST_SIZE - 1)
278 first[USERS_FIRST_SIZE - 1] = '\0';
5eaef520 279 last = e->last;
dfaf9b68 280 if (strlen(last) > USERS_LAST_SIZE - 1)
281 last[USERS_LAST_SIZE - 1] = '\0';
5eaef520 282 middle = e->middle;
dfaf9b68 283 if (strlen(middle) > USERS_MIDDLE_SIZE - 1)
284 middle[USERS_MIDDLE_SIZE - 1] = '\0';
5eaef520 285 sid = e->id;
286 id = 0;
5eaef520 287
288 /* Get user info */
289 EXEC SQL SELECT users_id, first, last, middle, type, office_addr,
290 office_phone, department, status
291 INTO :id, :dfirst, :dlast, :dmiddle, :class, :oaddr,
292 :ophone, :dept, :status
293 FROM users
294 WHERE clearid = :sid;
295 if (sqlfail())
296 {
297 if (sqlca.sqlcode == SQL_DUPLICATE)
298 {
299 com_err(whoami, 0, "duplicate ID number %s on user %s %s",
300 sid, first, last);
301 return;
302 }
303 else
304 sqlexit();
3e77c6a3 305 }
5eaef520 306 if (id == 0)
307 {
0e5cfe5f 308 newuser(e);
309 return;
469f80df 310 }
325821e4 311
5eaef520 312 /* Update class/state if necessary. (Exclude several spacial cases.) */
313 if (strcmp(e->class, strtrim(class)) &&
314 strcmp(class, "STAFF") && strcmp(class, "SIPBMEM") &&
315 strcmp(class, "KNIGHT"))
316 {
317 com_err(whoami, 0, "updating class for %s %s from %s to %s",
318 first, last, class, e->class);
319 if (status == US_NOT_ALLOWED)
320 status = US_NO_LOGIN_YET;
321 if (status == US_ENROLL_NOT_ALLOWED)
322 status = US_ENROLLED;
323 strcpy(class, e->class);
e5843fe8 324 if (!debug)
5eaef520 325 {
e5843fe8 326 EXEC SQL UPDATE users
327 SET type = NVL(:class, CHR(0)), status = :status,
328 modtime = SYSDATE, modby = :who, modwith = :prog
329 WHERE users_id = :id;
330 if (sqlca.sqlcode)
331 {
332 dbmserr("updating user", sqlca.sqlcode);
333 exit(1);
334 }
3e77c6a3 335 }
336 }
337
5eaef520 338 /* Update name if necessary */
339 if (strcmp(first, strtrim(dfirst)) ||
340 strcmp(last, strtrim(dlast)) ||
341 strcmp(middle, strtrim(dmiddle)))
342 {
343 com_err(whoami, 0, "updating real name for %s %s", first, last);
e5843fe8 344 if (!debug)
5eaef520 345 {
e5843fe8 346 EXEC SQL UPDATE users
347 SET first = NVL(:first, CHR(0)), last = NVL(:last, CHR(0)),
348 middle = NVL(:middle, CHR(0)), modby = :who, modwith = :prog,
349 modtime = SYSDATE
350 WHERE users_id = :id;
351 if (sqlca.sqlcode)
352 {
353 dbmserr("updating name", sqlca.sqlcode);
354 exit(1);
355 }
356 }
357 else
358 {
359 com_err(whoami, 0, "was %s %s %s, became %s %s %s",
360 dfirst, dmiddle, dlast, first, middle, last);
3e77c6a3 361 }
469f80df 362 }
325821e4 363
5eaef520 364 changed = nochange = 0;
5eaef520 365 strcpy(buf, e->address);
366 while ((to = strchr(buf, ',')))
367 *to = ';';
368 while ((to = strchr(buf, ':')))
369 *to = ';';
370 if (newfinger)
371 {
372 if (oaddr[0] == ' ' && buf[0])
373 {
dfaf9b68 374 strncpy(oaddr, buf, USERS_OFFICE_ADDR_SIZE - 1);
375 oaddr[USERS_OFFICE_ADDR_SIZE - 1] = '\0';
469f80df 376 changed++;
5eaef520 377 }
dfaf9b68 378 else if (strncmp(strtrim(oaddr), buf, USERS_OFFICE_ADDR_SIZE - 1))
5eaef520 379 nochange++;
469f80df 380 }
5eaef520 381 else
382 {
dfaf9b68 383 if (strncmp(strtrim(oaddr), buf, USERS_OFFICE_ADDR_SIZE - 1))
e5843fe8 384 {
385 changed++;
386 if (debug)
387 {
388 com_err(whoami, 0, "office for %s %s changed from %s to %s",
389 first, last, oaddr, buf);
390 }
391 }
dfaf9b68 392 strncpy(oaddr, buf, USERS_OFFICE_ADDR_SIZE - 1);
393 oaddr[USERS_OFFICE_ADDR_SIZE - 1] = '\0';
469f80df 394 }
5eaef520 395 from = e->phone;
396 to = buf;
397 while (*from)
398 {
399 if (isdigit(*from))
400 *to++ = *from;
401 from++;
469f80df 402 }
5eaef520 403 *to = '\0';
404 if (newfinger)
405 {
406 if (ophone[0] == ' ')
407 {
dfaf9b68 408 strncpy(ophone, buf, USERS_OFFICE_PHONE_SIZE - 1);
409 ophone[USERS_OFFICE_PHONE_SIZE - 1] = '\0';
5eaef520 410 }
dfaf9b68 411 else if (strncmp(strtrim(ophone), buf, USERS_OFFICE_PHONE_SIZE - 1))
5eaef520 412 nochange++;
413 }
414 else
415 {
dfaf9b68 416 if (strncmp(strtrim(ophone), buf, USERS_OFFICE_PHONE_SIZE - 1))
e5843fe8 417 {
418 changed++;
419 if (debug)
420 {
421 com_err(whoami, 0, "Phone for %s %s changed from %s to %s",
422 first, last, ophone, buf);
423 }
424 }
dfaf9b68 425 strncpy(ophone, buf, USERS_OFFICE_PHONE_SIZE - 1);
426 ophone[USERS_OFFICE_PHONE_SIZE - 1] = '\0';
469f80df 427 }
5eaef520 428 FixCase(e->dept);
429 FixCase(e->title);
430 if (newfinger)
431 {
432 if (dept[0] == ' ')
433 {
dfaf9b68 434 strncpy(dept, e->dept, USERS_DEPARTMENT_SIZE - 1);
435 dept[USERS_DEPARTMENT_SIZE - 1] = '\0';
5eaef520 436 }
dfaf9b68 437 else if (strncmp(strtrim(dept), e->dept, USERS_DEPARTMENT_SIZE - 1))
5eaef520 438 nochange++;
439 }
440 else
441 {
dfaf9b68 442 if (strncmp(strtrim(dept), e->dept, USERS_DEPARTMENT_SIZE - 1))
e5843fe8 443 {
444 changed++;
445 if (debug)
446 {
447 com_err(whoami, 0, "Department for %s %s changed from %s to %s",
448 first, last, dept, e->dept);
449 }
450 }
dfaf9b68 451 strncpy(dept, e->dept, USERS_DEPARTMENT_SIZE - 1);
452 dept[USERS_DEPARTMENT_SIZE - 1] = '\0';
5eaef520 453 }
454 sid = e->id;
455 name = e->name;
456 rdept = e->dept;
457 rtitle = e->title;
458 raddr = e->address;
459 rhphone = e->phone;
460 rophone = e->phone2;
e5843fe8 461
462 if (debug)
463 return;
464
5eaef520 465 if (changed)
466 {
467 com_err(whoami, 0, "updating finger for %s %s", first, last);
468 EXEC SQL UPDATE users
469 SET office_addr = NVL(:oaddr, CHR(0)),
470 office_phone = NVL(:ophone, CHR(0)), department = NVL(:dept, CHR(0)),
471 fmodtime = SYSDATE, fmodby = :who, fmodwith = :prog,
472 xname = NVL(:name, CHR(0)), xdept = NVL(:rdept, CHR(0)),
473 xtitle = NVL(:rtitle, CHR(0)), xaddress = NVL(:raddr, CHR(0)),
474 xphone1 = NVL(:rhphone, CHR(0)), xphone2 = NVL(:rophone, CHR(0)),
475 xmodtime = SYSDATE, clearid = NVL(:sid, CHR(0))
476 WHERE users_id = :id;
477 if (sqlca.sqlcode)
478 {
9f5e5c05 479 dbmserr(NULL, sqlca.sqlcode);
480 exit(1);
3e77c6a3 481 }
5eaef520 482 }
483 else
484 {
485 EXEC SQL UPDATE users
486 SET xname = NVL(:name, CHR(0)), xdept = NVL(:rdept, CHR(0)),
487 xtitle = NVL(:rtitle, CHR(0)), xaddress = NVL(:raddr, CHR(0)),
488 xphone1 = NVL(:rhphone, CHR(0)), xphone2 = NVL(:rophone, CHR(0)),
489 xmodtime = SYSDATE, clearid = NVL(:sid, CHR(0))
490 WHERE users_id = :id;
491 if (sqlca.sqlcode)
492 {
9f5e5c05 493 dbmserr(NULL, sqlca.sqlcode);
494 exit(1);
3e77c6a3 495 }
a6e9fead 496 }
02cd9ede 497}
469f80df 498
499
7ac48069 500void newuser(struct entry *e)
02cd9ede 501{
5eaef520 502 char *from, *to;
503 EXEC SQL BEGIN DECLARE SECTION;
504 int id, uid, st, who;
dfaf9b68 505 char *last, *first, *class, *middle, login[USERS_LOGIN_SIZE], *sid;
506 char fullname[USERS_FULLNAME_SIZE], *prog;
507 char oaddr[USERS_OFFICE_ADDR_SIZE], ophone[USERS_OFFICE_PHONE_SIZE];
508 char dept[USERS_DEPARTMENT_SIZE], *name, *title;
5eaef520 509 char *rdept, *rhphone, *rophone;
510 EXEC SQL END DECLARE SECTION;
511
512 who = WHO;
513 prog = PROG;
dfaf9b68 514 strncpy(oaddr, e->address, USERS_OFFICE_ADDR_SIZE - 1);
515 oaddr[USERS_OFFICE_ADDR_SIZE - 1] = '\0';
5eaef520 516 while ((to = strchr(oaddr, ',')))
517 *to = ';';
518 while ((to = strchr(oaddr, ':')))
519 *to = ';';
520 from = e->phone;
521 to = ophone;
522 while (*from)
523 {
524 if (isdigit(*from))
525 *to++ = *from;
526 from++;
469f80df 527 }
5eaef520 528 *to = '\0';
529 FixCase(e->dept);
dfaf9b68 530 strncpy(dept, e->dept, USERS_DEPARTMENT_SIZE - 1);
af8b98d0 531 dept[USERS_DEPARTMENT_SIZE - 1] = '\0';
5eaef520 532
533 id = set_next_users_id(0);
534 uid = set_next_uid(e->highid);
535 sprintf(login, "#%d", uid);
536 last = e->last;
537 first = e->first;
538 middle = e->middle;
539 class = e->class;
540 if (*middle)
541 sprintf(fullname, "%s %s %s", first, middle, last);
542 else
543 sprintf(fullname, "%s %s", first, last);
544 st = US_NO_LOGIN_YET;
545
546 sid = e->id;
547 name = e->name;
548 rdept = e->dept;
549 title = e->title;
550 rhphone = e->phone;
551 rophone = e->phone2;
552
e5843fe8 553 com_err(whoami, 0, "adding user %s %s", e->first, e->last);
554 if (debug)
555 return;
556
5eaef520 557 EXEC SQL INSERT INTO users
558 (login, users_id, unix_uid, shell, last, first, middle, status,
559 clearid, type, modtime, modby, modwith, fullname, office_addr,
560 office_phone, department, fmodtime, fmodby, fmodwith,
561 potype, xname, xdept, xtitle, xaddress, xphone1, xphone2, xmodtime)
562 VALUES (:login, :id, :uid, '/bin/athena/tcsh',
563 NVL(:last, CHR(0)), NVL(:first, CHR(0)), NVL(:middle, CHR(0)),
564 :st, NVL(:sid, CHR(0)), NVL(:class, CHR(0)), SYSDATE, :who, :prog,
565 NVL(:fullname, CHR(0)), NVL(:oaddr, CHR(0)), NVL(:ophone, CHR(0)),
566 NVL(:dept, CHR(0)), SYSDATE, :who, :prog, 'NONE',
567 NVL(:name, CHR(0)), NVL(:rdept, CHR(0)), NVL(:title, CHR(0)),
568 NVL(:oaddr, CHR(0)), NVL(:rhphone, CHR(0)), NVL(:rophone, CHR(0)),
569 SYSDATE);
570 if (sqlca.sqlcode)
571 {
9f5e5c05 572 dbmserr("adding user", sqlca.sqlcode);
573 exit(1);
5eaef520 574 }
02cd9ede 575}
469f80df 576
577
7ac48069 578int set_next_users_id(int limit)
02cd9ede 579{
5eaef520 580 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 581 int flag, value, retval;
5eaef520 582 EXEC SQL END DECLARE SECTION;
583
e5843fe8 584 if (debug)
585 return 0;
586
5eaef520 587 EXEC SQL SELECT value INTO :value FROM numvalues
588 WHERE name = 'users_id';
589 if (sqlfail())
590 sqlexit();
591 if (sqlca.sqlerrd[2] != 1)
592 {
593 EXEC SQL ROLLBACK;
594 com_err(whoami, MR_INTERNAL, "values table inconsistancy");
595 exit(1);
3e77c6a3 596 }
597
5eaef520 598 flag = 0;
599 EXEC SQL SELECT users_id INTO :flag FROM users
600 WHERE users_id = :value;
601 if (sqlfail())
602 sqlexit();
603 if (sqlca.sqlerrd[2] == 0)
3e77c6a3 604 flag = 0;
5eaef520 605 while (flag)
606 {
607 value++;
608 if (limit && value > MAX_ID_VALUE)
609 value = MIN_ID_VALUE;
3e77c6a3 610 flag = 0;
5eaef520 611 EXEC SQL SELECT users_id INTO :flag FROM users
612 WHERE users_id = :value;
613 if (sqlfail())
614 sqlexit();
615 if (sqlca.sqlerrd[2] == 0)
3e77c6a3 616 flag = 0;
3e77c6a3 617 }
618
5eaef520 619 retval = value++;
620 if (limit && value > MAX_ID_VALUE)
621 value = MIN_ID_VALUE;
622 EXEC SQL UPDATE numvalues SET value = :value
623 WHERE name = 'users_id';
624 if (sqlca.sqlcode)
625 {
626 dbmserr("assigning ID", sqlca.sqlcode);
627 exit(1);
3e77c6a3 628 }
5eaef520 629 return retval;
3e77c6a3 630}
631
7ac48069 632int set_next_uid(int high)
3e77c6a3 633{
5eaef520 634 EXEC SQL BEGIN DECLARE SECTION;
e5843fe8 635 int flag, initial, value, retval;
5eaef520 636 char *name;
637 EXEC SQL END DECLARE SECTION;
638
e5843fe8 639 if (debug)
640 return 0;
641
5eaef520 642 if (high)
643 name = "high_uid";
644 else
645 name = "unix_uid";
646
e5843fe8 647 EXEC SQL SELECT value INTO :initial FROM numvalues
5eaef520 648 WHERE name = :name;
649 if (sqlfail())
650 sqlexit();
651 if (sqlca.sqlerrd[2] != 1)
652 {
653 EXEC SQL ROLLBACK;
654 com_err(whoami, MR_INTERNAL, "values table inconsistancy");
655 exit(1);
469f80df 656 }
657
e5843fe8 658 value = initial;
5eaef520 659 flag = 0;
e5843fe8 660 EXEC SQL SELECT COUNT(unix_uid) INTO :flag
661 FROM users WHERE unix_uid = :value;
5eaef520 662 if (sqlfail())
663 sqlexit();
5eaef520 664 while (flag)
665 {
666 value++;
667 if (!high && value > MAX_ID_VALUE)
668 value = MIN_ID_VALUE;
e5843fe8 669 if (value == initial)
670 {
671 com_err(whoami, 0, "Out of uids!");
672 EXEC SQL ROLLBACK WORK;
673 exit(1);
674 }
02cd9ede 675 flag = 0;
e5843fe8 676 EXEC SQL SELECT COUNT(unix_uid) INTO :flag
677 FROM users WHERE unix_uid = :value;
5eaef520 678 if (sqlfail())
679 sqlexit();
469f80df 680 }
681
5eaef520 682 retval = value++;
683 if (!high && value > MAX_ID_VALUE)
684 value = MIN_ID_VALUE;
685 EXEC SQL UPDATE numvalues SET value = :value WHERE name = :name;
686 if (sqlca.sqlcode)
687 {
688 dbmserr("assigning ID", sqlca.sqlcode);
689 exit(1);
3e77c6a3 690 }
5eaef520 691 return retval;
3e77c6a3 692}
693
694
7ac48069 695void sqlexit(void)
3e77c6a3 696{
5eaef520 697 dbmserr(NULL, sqlca.sqlcode);
698 EXEC SQL ROLLBACK WORK;
699 exit(1);
02cd9ede 700}
9f5e5c05 701
7ac48069 702void dbmserr(char *where, int what)
9f5e5c05 703{
704 char err_msg[256];
5eaef520 705 int bufsize = 256, msglength = 0;
9f5e5c05 706
707 sqlglm(err_msg, &bufsize, &msglength);
5eaef520 708 err_msg[msglength] = '\0';
9f5e5c05 709
5eaef520 710 if (where)
9f5e5c05 711 com_err(whoami, 0, "DBMS error %swhile %s", err_msg, where);
712 else
713 com_err(whoami, 0, "DBMS error %s", err_msg);
714}
This page took 0.191953 seconds and 5 git commands to generate.