]> andersk Git - moira.git/blame - regtape/employee.dc
Oracle and Solaris/POSIX changes
[moira.git] / regtape / employee.dc
CommitLineData
469f80df 1/* $Header$
2 */
3
4#include <stdio.h>
9f5e5c05 5#include <string.h>
469f80df 6#include <ctype.h>
7#include <sys/time.h>
932028de 8#include <moira.h>
9#include <moira_site.h>
02cd9ede 10EXEC SQL INCLUDE sqlca;
469f80df 11
12
02cd9ede 13#define WHO 11859 /* root */
14#define PROG "emp-tape"
469f80df 15
397e9044 16#define MAX_ID_VALUE 31999
469f80df 17#define MIN_ID_VALUE 101
18
19/* File format is:
20
210-8 id number
229-38 name
2339-62 office address
2463-74 phone1
2575-86 phone2
2687-106 dept
27107-156 title
28157-186 username
29187-241 host
30
31*/
32
33#define LOC_ID 0
34#define LOC_NAME 9
35#define LOC_OFFICE 39
36#define LOC_PHONE 63
37#define LOC_PHONE2 75
38#define LOC_DEPT 87
39#define LOC_TITLE 107
40#define LOC_USERNAME 157
41#define LOC_HOST 187
42
43#define LEN_ID 9
a6e9fead 44#define LEN_NAME 30
45#define LEN_OFFICE 24
469f80df 46#define LEN_PHONE 12
47#define LEN_PHONE2 12
a6e9fead 48#define LEN_DEPT 20
49#define LEN_TITLE 50
50#define LEN_USERNAME 30
469f80df 51#define LEN_HOST 55
52
53
54struct entry {
a6e9fead 55 char *name;
469f80df 56 char *last;
57 char *first;
58 char *middle;
59 char *title;
60 char *class;
61 char *id;
62 char *eid;
63 char *dept;
64 char *address;
65 char *phone;
a6e9fead 66 char *phone2;
469f80df 67 char *email;
68};
69
70
71char *whoami;
72int newfinger = 0;
73
9f5e5c05 74#define sqlfail() (sqlca.sqlcode && sqlca.sqlcode != 1403)
75#define SQL_DUPLICATE 1422
3e77c6a3 76
469f80df 77
78main(argc, argv)
79int argc;
80char **argv;
02cd9ede 81{
469f80df 82 FILE *in;
83 struct entry *e, *get_next_entry();
84 int i, wait = 0;
85 char buf[BUFSIZ], *file = NULL;
9f5e5c05 86EXEC SQL BEGIN DECLARE SECTION;
87 char *db="moira";
88EXEC SQL END DECLARE SECTION;
469f80df 89
9f5e5c05 90 whoami = strrchr(argv[0], '/');
469f80df 91 if (whoami)
92 whoami++;
93 else
94 whoami = argv[0];
95
9f5e5c05 96 setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
97 setvbuf(stderr, NULL, _IOLBF, BUFSIZ);
98
469f80df 99 for (i = 1; i < argc; i++) {
100 if (!strcmp(argv[i], "-w"))
101 wait++;
102 else if (!strcmp(argv[i], "-D"))
103 setenv("ING_SET", "set printqry");
104 else if (!strcmp(argv[i], "-n"))
105 newfinger++;
106 else if (file != NULL)
325821e4 107 fprintf(stderr, "Usage: %s [-w] [-D] [-n] inputfile\n", whoami);
469f80df 108 else
109 file = argv[i];
110 }
111
112 in = fopen(file, "r");
113 if (in == NULL) {
114 fprintf(stderr, "Unable to open %s for input\n", file);
115 exit(1);
116 }
117
2168fb4b 118 initialize_sms_error_table();
325821e4 119
9f5e5c05 120 EXEC SQL CONNECT :db IDENTIFIED BY :db;
3e77c6a3 121 if (sqlca.sqlcode != 0) {
9f5e5c05 122 dbmserr("opening database", sqlca.sqlcode);
3e77c6a3 123 exit(1);
124 }
469f80df 125
126 while (e = get_next_entry(in)) {
9b2c129e 127 again:
469f80df 128 process_entry(e);
3e77c6a3 129 EXEC SQL COMMIT WORK;
130 if (sqlca.sqlcode != 0) {
9f5e5c05 131 dbmserr("committing work", sqlca.sqlcode);
132 exit(1);
3e77c6a3 133 }
469f80df 134 if (wait) {
135 printf("Next");
136 fflush(stdout);
137 gets(buf);
138 }
139 }
140
469f80df 141 exit(0);
02cd9ede 142}
469f80df 143
144
145char *substr(buf, key)
146char *buf;
147char *key;
148{
149 int l;
150
151 for (l = strlen(key); *buf; buf++)
152 if (!strncmp(buf, key, l))
153 return(buf);
154 return(NULL);
155}
156
157
158struct entry *get_next_entry(in)
159FILE *in;
160{
161 static struct entry e;
a6e9fead 162 static char buf[BUFSIZ], mid[16], eid[16], email[256];
163 static char name[LEN_NAME+1], sname[LEN_NAME+1], id[LEN_ID+1];
164 static char office[LEN_OFFICE+1], phone[LEN_PHONE+1], phone2[LEN_PHONE2+1];
165 static char dept[LEN_DEPT+1], title[LEN_TITLE+1], username[LEN_USERNAME+1];
166 static char host[LEN_HOST+1];
039f9637 167 int ends_sr, ends_jr, ends_iii, ends_iv, ends_ii, ends_v;
469f80df 168 char *p;
169
4763be9c 170 if (fgets(buf, sizeof(buf), in) == NULL)
171 return((struct entry *)NULL);
a6e9fead 172
173 strncpy(id, &buf[LOC_ID], LEN_ID); id[LEN_ID] = 0;
174 strncpy(name, &buf[LOC_NAME], LEN_NAME); name[LEN_NAME] = 0;
175 strncpy(office, &buf[LOC_OFFICE], LEN_OFFICE); office[LEN_OFFICE] = 0;
176 strncpy(phone, &buf[LOC_PHONE], LEN_PHONE); phone[LEN_PHONE] = 0;
177 strncpy(phone2, &buf[LOC_PHONE2], LEN_PHONE2); phone2[LEN_PHONE2] = 0;
178 strncpy(dept, &buf[LOC_DEPT], LEN_DEPT); dept[LEN_DEPT] = 0;
179 strncpy(title, &buf[LOC_TITLE], LEN_TITLE); title[LEN_TITLE] = 0;
180 strncpy(username, &buf[LOC_USERNAME], LEN_USERNAME); username[LEN_USERNAME] = 0;
181 strncpy(host, &buf[LOC_HOST], LEN_HOST); host[LEN_HOST] = 0;
182
183 strcpy(sname, name);
184 e.name = strtrim(sname);
9f5e5c05 185 p = strchr(name, ',');
469f80df 186 if (p)
187 *p = 0;
a6e9fead 188 e.last = strtrim(name);
469f80df 189 if (p) {
a6e9fead 190 p++;
191 while (isspace(*p))
192 p++;
193 e.first = p;
9f5e5c05 194 if (p = strchr(e.first, ' ')) {
469f80df 195 *p = 0;
a6e9fead 196 e.first = strtrim(e.first);
469f80df 197 e.middle = strtrim(p + 1);
a6e9fead 198 } else {
199 e.first = strtrim(e.first);
200 e.middle = "";
201 }
202 } else {
203 e.first = "";
204 e.middle = "";
205 }
039f9637 206 ends_sr = ends_jr = ends_iii = ends_iv = ends_ii = ends_v = 0;
469f80df 207 LookForSt(e.last);
208 LookForO(e.last);
039f9637 209 LookForJrAndIII(e.last, &ends_sr, &ends_jr, &ends_iii, &ends_iv,
210 &ends_ii, &ends_v);
211 LookForJrAndIII(e.first, &ends_sr, &ends_jr, &ends_iii, &ends_iv,
212 &ends_ii, &ends_v);
469f80df 213 FixCase(e.last);
214 FixCase(e.first);
215 FixCase(e.middle);
216
a6e9fead 217 e.id = id;
469f80df 218 e.eid = eid;
219 EncryptID(e.eid, e.id, e.first, e.last);
220
a6e9fead 221 e.address = strtrim(office);
222 e.phone = strtrim(phone);
223 e.phone2 = strtrim(phone2);
224 e.dept = strtrim(dept);
225 e.title = strtrim(title);
469f80df 226
227 e.class = "MITS";
41dd7d99 228 if (substr(e.title, "PROF") || substr(e.title, "LECTURE"))
469f80df 229 e.class = "FACULTY";
469f80df 230
a6e9fead 231 strcpy(email, strtrim(username));
232 if (host[0] == '@')
233 strncat(email, strtrim(host));
234 e.email = email;
469f80df 235
236 return(&e);
237}
238
239
240process_entry(e)
241struct entry *e;
02cd9ede 242{
3e77c6a3 243 int changed, nochange, encrypted;
469f80df 244 char buf[BUFSIZ], *from, *to;
02cd9ede 245 EXEC SQL BEGIN DECLARE SECTION;
3e77c6a3 246 char *first, *last, *middle, *eid, *sid, *name, *title, *phone2, *rdept, *rtitle;
247 char *raddr, *rhphone, *rophone, *prog;
248 char class[9], oaddr[25], ophone[17], dept[128], dfirst[17], dlast[17], dmiddle[17];
249 int id, status, who;
02cd9ede 250 EXEC SQL END DECLARE SECTION;
469f80df 251
41dd7d99 252 /* Don't process Lincoln Labs */
253 if (!strncmp(e->address, "LL", 2))
254 return;
255
3e77c6a3 256 who = WHO;
257 prog = PROG;
469f80df 258 first = e->first;
9e4455c2 259 if (strlen(first) > 16)
260 first[16] = 0;
469f80df 261 last = e->last;
9e4455c2 262 if (strlen(last) > 16)
263 last[16] = 0;
3e77c6a3 264 middle = e->middle;
469f80df 265 eid = e->eid;
325821e4 266 sid = e->id;
469f80df 267 id = 0;
3e77c6a3 268 encrypted = 0;
325821e4 269
270 /* Get user info */
3e77c6a3 271 EXEC SQL SELECT users_id, first, last, middle, type, office_addr, office_phone, department, status
272 INTO :id, :dfirst, :dlast, :dmiddle, :class, :oaddr, :ophone, :dept, :status
02cd9ede 273 FROM users
3e77c6a3 274 WHERE clearid = :sid;
275 if (sqlfail()) {
276 if (sqlca.sqlcode == SQL_DUPLICATE) {
277 com_err(whoami, 0, "duplicate ID number %s on user %s %s", sid, first, last);
278 return;
279 } else
280 sqlexit();
281 }
469f80df 282 if (id == 0) {
3e77c6a3 283 EXEC SQL SELECT users_id, first, last, middle, type, office_addr, office_phone, department, status
284 INTO :id, :dfirst, :dlast, :dmiddle, :class, :oaddr, :ophone, :dept, :status
02cd9ede 285 FROM users
286 WHERE last = :last and first = :first and clearid = :eid;
9f5e5c05 287 if (sqlfail() && sqlca.sqlcode != SQL_DUPLICATE) {
6f1556b3 288 sqlexit();
289 }
3e77c6a3 290 encrypted++;
325821e4 291 if (id == 0) {
292 newuser(e);
293 return;
294 }
469f80df 295 }
325821e4 296
2168fb4b 297 /* Update class/state if necessary. (Exclude several spacial cases.) */
e1695a1c 298 if (strcmp(e->class, strtrim(class)) &&
2168fb4b 299 strcmp(class, "STAFF") && strcmp(class, "SIPBMEM") &&
300 strcmp(class, "KNIGHT")) {
469f80df 301 com_err(whoami, 0, "updating class for %s %s from %s to %s",
302 first, last, class, e->class);
2168fb4b 303 if (status == US_NOT_ALLOWED)
a6e9fead 304 status = US_NO_LOGIN_YET;
2168fb4b 305 if (status == US_ENROLL_NOT_ALLOWED)
a6e9fead 306 status = US_ENROLLED;
469f80df 307 strcpy(class, e->class);
02cd9ede 308 EXEC SQL UPDATE users
9f5e5c05 309 SET type = NVL(:class,CHR(0)), status = :status, modtime = SYSDATE,
3e77c6a3 310 modby = :who, modwith = :prog
02cd9ede 311 WHERE users_id = :id;
3e77c6a3 312 if (sqlca.sqlcode != 0) {
9f5e5c05 313 dbmserr("updating user", sqlca.sqlcode);
314 exit(1);
3e77c6a3 315 }
316 }
317
318 /* Update name if necessary */
319 if (strcmp(first, strtrim(dfirst)) ||
320 strcmp(last, strtrim(dlast)) ||
321 strcmp(middle, strtrim(dmiddle))) {
322 com_err(whoami, 0, "updating real name for %s %s", first, last);
323 EXEC SQL UPDATE users
9f5e5c05 324 SET first = NVL(:first,CHR(0)), last = NVL(:last,CHR(0)),
325 middle = NVL(:middle,CHR(0)), modby = :who, modwith = :prog,
326 modtime = SYSDATE
3e77c6a3 327 WHERE users_id = :id;
328 if (sqlca.sqlcode != 0) {
9f5e5c05 329 dbmserr("updating name", sqlca.sqlcode);
330 exit(1);
3e77c6a3 331 }
469f80df 332 }
325821e4 333
469f80df 334 changed = nochange = 0;
3e77c6a3 335 if (encrypted) changed++;
469f80df 336 strcpy(buf, e->address);
9f5e5c05 337 while (to = strchr(buf, ','))
469f80df 338 *to = ';';
9f5e5c05 339 while (to = strchr(buf, ':'))
469f80df 340 *to = ';';
341 if (newfinger) {
a6e9fead 342 if (oaddr[0] == ' ' && buf[0]) {
469f80df 343 strncpy(oaddr, buf, 16);
344 oaddr[16] = 0;
345 changed++;
6eb764c5 346 } else if (strncmp(strtrim(oaddr), buf, 15))
469f80df 347 nochange++;
348 } else {
349 if (strncmp(strtrim(oaddr), buf, 15))
350 changed++;
351 strncpy(oaddr, buf, 16);
352 oaddr[16] = 0;
353 }
354 from = e->phone;
355 to = buf;
356 while (*from) {
357 if (isdigit(*from))
358 *to++ = *from;
359 from++;
360 }
361 *to = 0;
362 if (newfinger) {
363 if (ophone[0] == ' ') {
364 strncpy(ophone, buf, 16);
365 ophone[16] = 0;
6eb764c5 366 } else if (strncmp(strtrim(ophone), buf, 11))
469f80df 367 nochange++;
368 } else {
369 if (strncmp(strtrim(ophone), buf, 11))
370 changed++;
371 strncpy(ophone, buf, 16);
372 ophone[16] = 0;
373 }
374 FixCase(e->dept);
a6e9fead 375 FixCase(e->title);
469f80df 376 if (newfinger) {
377 if (dept[0] == ' ') {
378 strncpy(dept, e->dept, 12);
379 dept[12] = 0;
6eb764c5 380 } else if (strncmp(strtrim(dept), e->dept, 11))
469f80df 381 nochange++;
382 } else {
383 if (strncmp(strtrim(dept), e->dept, 11))
384 changed++;
385 strncpy(dept, e->dept, 12);
386 dept[12] = 0;
387 }
325821e4 388 sid = e->id;
389 name = e->name;
390 rdept = e->dept;
391 rtitle = e->title;
392 raddr = e->address;
393 rhphone = e->phone;
394 rophone = e->phone2;
469f80df 395 if (changed) {
396 com_err(whoami, 0, "updating finger for %s %s", first, last);
9f5e5c05 397 EXEC SQL UPDATE users
398 SET office_addr = NVL(:oaddr,CHR(0)),
399 office_phone = NVL(:ophone,CHR(0)), department = NVL(:dept,CHR(0)),
400 fmodtime = SYSDATE, fmodby = :who, fmodwith = :prog,
401 xname = NVL(:name,CHR(0)), xdept = NVL(:rdept,CHR(0)),
402 xtitle = NVL(:rtitle,CHR(0)), xaddress = NVL(:raddr,CHR(0)),
403 xphone1 = NVL(:rhphone,CHR(0)), xphone2 = NVL(:rophone,CHR(0)),
404 xmodtime = SYSDATE, clearid = NVL(:sid,CHR(0))
02cd9ede 405 WHERE users_id = :id;
3e77c6a3 406 if (sqlca.sqlcode != 0) {
9f5e5c05 407 dbmserr(NULL, sqlca.sqlcode);
408 exit(1);
3e77c6a3 409 }
325821e4 410 } else {
9f5e5c05 411 EXEC SQL UPDATE users
412 SET xname = NVL(:name,CHR(0)), xdept = NVL(:rdept,CHR(0)),
413 xtitle = NVL(:rtitle,CHR(0)), xaddress = NVL(:raddr,CHR(0)),
414 xphone1 = NVL(:rhphone,CHR(0)), xphone2 = NVL(:rophone,CHR(0)),
415 xmodtime = SYSDATE, clearid = NVL(:sid,CHR(0))
02cd9ede 416 WHERE users_id = :id;
3e77c6a3 417 if (sqlca.sqlcode != 0) {
9f5e5c05 418 dbmserr(NULL, sqlca.sqlcode);
419 exit(1);
3e77c6a3 420 }
a6e9fead 421 }
02cd9ede 422}
469f80df 423
424
425newuser(e)
426struct entry *e;
02cd9ede 427{
469f80df 428 char *from, *to;
02cd9ede 429 EXEC SQL BEGIN DECLARE SECTION;
430 int id, uid, st, who;
431 char *last, *first, *class, *middle, login[9], *sid, fullname[65], *prog;
432 char oaddr[81], ophone[17], dept[128], *name, *title, phone2[17];
433 char *rdept, *rhphone, *rophone;
434 EXEC SQL END DECLARE SECTION;
435
436 who = WHO;
437 prog = PROG;
469f80df 438 strncpy(oaddr, e->address, 16);
a6e9fead 439 oaddr[16] = 0;
9f5e5c05 440 while (to = strchr(oaddr, ','))
469f80df 441 *to = ';';
9f5e5c05 442 while (to = strchr(oaddr, ':'))
469f80df 443 *to = ';';
444 from = e->phone;
445 to = ophone;
446 while (*from) {
447 if (isdigit(*from))
448 *to++ = *from;
449 from++;
450 }
451 *to = 0;
a6e9fead 452 FixCase(e->dept);
469f80df 453 strncpy(dept, e->dept, 12);
a6e9fead 454 dept[12] = 0;
469f80df 455
3e77c6a3 456 id = set_next_users_id(0);
457 uid = set_next_uid(1);
469f80df 458 sprintf(login, "#%d", uid);
459 last = e->last;
460 first = e->first;
461 middle = e->middle;
469f80df 462 class = e->class;
463 if (*middle)
464 sprintf(fullname, "%s %s %s", first, middle, last);
465 else
466 sprintf(fullname, "%s %s", first, last);
2168fb4b 467 st = US_NO_LOGIN_YET;
325821e4 468
469 sid = e->id;
470 name = e->name;
471 rdept = e->dept;
472 title = e->title;
473 rhphone = e->phone;
474 rophone = e->phone2;
475
9f5e5c05 476 EXEC SQL INSERT INTO users
477 (login, users_id, unix_uid, shell, last, first, middle, status,
02cd9ede 478 clearid, type, modtime, modby, modwith, fullname, office_addr,
479 office_phone, department, fmodtime, fmodby, fmodwith,
480 potype, xname, xdept, xtitle, xaddress, xphone1, xphone2, xmodtime)
9f5e5c05 481 VALUES (:login, :id, :uid, '/bin/athena/tcsh',
482 NVL(:last,CHR(0)), NVL(:first,CHR(0)), NVL(:middle,CHR(0)),
483 :st, NVL(:sid,CHR(0)), NVL(:class,CHR(0)), SYSDATE, :who, :prog,
484 NVL(:fullname,CHR(0)), NVL(:oaddr,CHR(0)), NVL(:ophone,CHR(0)),
485 NVL(:dept,CHR(0)), SYSDATE, :who, :prog, 'NONE',
486 NVL(:name,CHR(0)), NVL(:rdept,CHR(0)), NVL(:title,CHR(0)),
487 NVL(:oaddr,CHR(0)), NVL(:rhphone,CHR(0)), NVL(:rophone,CHR(0)),
488 SYSDATE);
3e77c6a3 489 if (sqlca.sqlcode != 0) {
9f5e5c05 490 dbmserr("adding user", sqlca.sqlcode);
491 exit(1);
3e77c6a3 492 } else
493 com_err(whoami, 0, "adding user %s %s", e->first, e->last);
02cd9ede 494}
469f80df 495
496
3e77c6a3 497set_next_users_id(limit)
27736587 498 int limit;
02cd9ede 499{
500 EXEC SQL BEGIN DECLARE SECTION;
3e77c6a3 501 int rowcount, flag, value, retval;
502 EXEC SQL END DECLARE SECTION;
503
9f5e5c05 504 EXEC SQL SELECT value INTO :value FROM numvalues
3e77c6a3 505 WHERE name = 'users_id';
506 if (sqlfail()) sqlexit();
507 if (sqlca.sqlerrd[2] != 1) {
508 EXEC SQL ROLLBACK;
509 com_err(whoami, MR_INTERNAL, "values table inconsistancy");
510 exit(1);
511 }
512
513 flag = 0;
9f5e5c05 514 EXEC SQL SELECT users_id INTO :flag FROM users
3e77c6a3 515 WHERE users_id = :value;
516 if (sqlfail()) sqlexit();
517 if (sqlca.sqlerrd[2] == 0)
518 flag = 0;
519 while (flag) {
520 value++;
521 if (limit && value > MAX_ID_VALUE)
522 value = MIN_ID_VALUE;
523 flag = 0;
9f5e5c05 524 EXEC SQL SELECT users_id INTO :flag FROM users
3e77c6a3 525 WHERE users_id = :value;
526 if (sqlfail()) sqlexit();
527 if (sqlca.sqlerrd[2] == 0)
528 flag = 0;
529 }
530
531 retval = value++;
532 if (limit && value > MAX_ID_VALUE)
533 value = MIN_ID_VALUE;
9f5e5c05 534 EXEC SQL UPDATE numvalues SET value = :value
3e77c6a3 535 WHERE name = 'users_id';
536 if (sqlca.sqlcode != 0) {
9f5e5c05 537 dbmserr("assigning ID", sqlca.sqlcode);
9b2c129e 538 exit(1);
3e77c6a3 539 }
540 return(retval);
541}
542
543set_next_uid(limit)
544 int limit;
545{
546 EXEC SQL BEGIN DECLARE SECTION;
547 int rowcount, flag, value, retval;
02cd9ede 548 EXEC SQL END DECLARE SECTION;
469f80df 549
9f5e5c05 550 EXEC SQL SELECT value INTO :value FROM numvalues
551 WHERE name = 'unix_uid';
3e77c6a3 552 if (sqlfail()) sqlexit();
02cd9ede 553 if (sqlca.sqlerrd[2] != 1) {
554 EXEC SQL ROLLBACK;
555 com_err(whoami, MR_INTERNAL, "values table inconsistancy");
556 exit(1);
469f80df 557 }
558
02cd9ede 559 flag = 0;
9f5e5c05 560 EXEC SQL SELECT unix_uid INTO :flag FROM users WHERE unix_uid = :value;
3e77c6a3 561 if (sqlfail()) sqlexit();
02cd9ede 562 if (sqlca.sqlerrd[2] == 0)
563 flag = 0;
564 while (flag) {
469f80df 565 value++;
27736587 566 if (limit && value > MAX_ID_VALUE)
469f80df 567 value = MIN_ID_VALUE;
02cd9ede 568 flag = 0;
9f5e5c05 569 EXEC SQL SELECT unix_uid INTO :flag FROM users WHERE unix_uid = :value;
3e77c6a3 570 if (sqlfail()) sqlexit();
02cd9ede 571 if (sqlca.sqlerrd[2] == 0)
572 flag = 0;
469f80df 573 }
574
3e77c6a3 575 retval = value++;
02cd9ede 576 if (limit && value > MAX_ID_VALUE)
577 value = MIN_ID_VALUE;
9f5e5c05 578 EXEC SQL UPDATE numvalues SET value = :value WHERE name = 'unix_uid';
3e77c6a3 579 if (sqlca.sqlcode != 0) {
9f5e5c05 580 dbmserr("assigning ID", sqlca.sqlcode);
3e77c6a3 581 exit(1);
582 }
583 return(retval);
584}
585
586
587sqlexit()
588{
9f5e5c05 589 dbmserr(NULL, sqlca.sqlcode);
3e77c6a3 590 EXEC SQL ROLLBACK WORK;
591 exit(1);
02cd9ede 592}
9f5e5c05 593
594dbmserr(char *where, int what)
595{
596 char err_msg[256];
597 int bufsize=256, msglength=0;
598
599 sqlglm(err_msg, &bufsize, &msglength);
600 err_msg[msglength]=0;
601
602 if(where)
603 com_err(whoami, 0, "DBMS error %swhile %s", err_msg, where);
604 else
605 com_err(whoami, 0, "DBMS error %s", err_msg);
606}
This page took 0.169028 seconds and 5 git commands to generate.