3 * (c) Copyright 1988 by the Massachusetts Institute of Technology.
4 * For copying and distribution information, please see the file
8 #include <mit-copyright.h>
11 EXEC SQL INCLUDE sqlca;
14 static char phase1_qc_rcsid[] = "$Header$";
20 printf("User %s (%s, status %d) has duplicate ID\n",
21 u->login, u->fullname, u->status);
25 handle_duplicate_logins(sq)
26 struct save_queue *sq;
28 struct user *u, *uu, *tmp;
30 uu = (struct user *)0;
31 if(sq_get_data(sq,&uu)) {
32 while (sq_get_data(sq, &u)) {
33 if (!strcmp(u->login, uu->login)) {
34 if (uu->status == 1 || u->status == 0) {
39 printf("User %s (%s, status %d) and\n",
40 u->login, u->fullname, u->status);
41 printf("User %s (%s, status %d) have duplicate logins\n",
42 uu->login, uu->fullname, uu->status);
43 if (!strcmp(u->fullname, uu->fullname) &&
44 single_fix("Delete the second one")) {
45 single_delete("users", "users_id", uu->users_id);
46 } else if (single_fix("Unregister the second one"))
48 EXEC SQL BEGIN DECLARE SECTION;
49 int id = uu->users_id, rowcount;
50 EXEC SQL END DECLARE SECTION;
52 EXEC SQL UPDATE users SET login = '#'+CHAR(users.uid),
53 status=0 WHERE users_id = :id;
54 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
56 printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
58 printf("Not fixed\n");
71 u->users_id = generic_fix_id("users", "users_id", "login",
72 u->users_id, u->login);
79 printf("Sorry, don't know how to fix that\n");
85 printf("Machine %s has duplicate ID %d\n", m->name, m->mach_id);
92 printf("Machine %s (%d) has duplicate name\n", m->name, m->mach_id);
99 m->mach_id = generic_fix_id("machine", "mach_id", "name",
100 m->mach_id, m->name);
106 printf("Cluster %s has duplicate ID %d\n", c->name, c->clu_id);
113 printf("Cluster %s (%d) has duplicate name\n", c->name, c->clu_id);
120 c->clu_id = generic_fix_id("cluster", "clu_id", "name", c->clu_id, c->name);
126 printf("List %s has duplicate ID %d\n", l->name, l->list_id);
133 printf("List %s (%d) has duplicate name\n", l->name, l->list_id);
140 l->list_id = generic_fix_id("list", "list_id", "name", l->list_id, l->name);
146 printf("Filesys %s has duplicate ID %d\n", f->name, f->filsys_id);
153 f->filsys_id = generic_fix_id("filesys", "filsys_id", "label",
154 f->filsys_id, f->name);
161 printf("NfsPhys %s:%s has duplicate ID %d\n",
162 ((struct machine *)hash_lookup(machines, n->mach_id))->name,
163 n->dir, n->nfsphys_id);
170 n->nfsphys_id = generic_fix_id("nfsphys", "nfsphys_id", "dir",
171 n->nfsphys_id, n->dir);
177 printf("String %s has duplicate ID %d\n", s->name, s->string_id);
184 EXEC SQL BEGIN DECLARE SECTION;
185 char name[81], name1[81], last[17], first[17], buf[257];
186 int id, id2, id3, aid, aid2, status, sid, sid2, sid3, sid4, sid5;
187 EXEC SQL END DECLARE SECTION;
188 struct save_queue *sq;
197 printf("Phase 1 - Looking for duplicates\n");
199 dprintf("Loading strings...\n");
201 strings = create_hash(5000);
203 EXEC SQL DECLARE csr101 CURSOR FOR
204 SELECT string_id, string FROM strings ORDER BY string_id;
205 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
206 EXEC SQL OPEN csr101;
208 EXEC SQL FETCH csr101 INTO :id, :buf;
209 if (sqlca.sqlcode != 0) {
210 ingerr(&sqlca.sqlcode);
214 s = (struct string *) malloc(sizeof(struct string));
216 out_of_mem("storing strings");
217 s->name = strsave(strtrim(buf));
220 if (hash_store(strings, id, s)) {
221 sq_save_data(sq, hash_lookup(strings, id));
225 EXEC SQL CLOSE csr101;
226 generic_delete(sq, show_str_id, "strings", "string_id", 0);
229 dprintf("Loading users...\n");
231 users = create_hash(10000);
233 EXEC SQL DECLARE csr102 CURSOR FOR
234 SELECT users_id, login, last, first, status, potype, pop_id, box_id,
235 modby, fmodby, pmodby, comment, sigwho FROM users ORDER BY users_id;
236 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
237 EXEC SQL OPEN csr102;
239 EXEC SQL FETCH csr102 INTO :id, :name, :last, :first, :status,
240 :buf, :id2, :id3, :sid, :sid2, :sid3, :sid4, :sid5;
241 if (sqlca.sqlcode != 0) {
242 ingerr(&sqlca.sqlcode);
246 u = (struct user *) malloc(sizeof(struct user));
248 out_of_mem("storing users");
249 strcpy(u->login, strtrim(name));
251 sprintf(buf, "%s, %s", strtrim(last), strtrim(first));
252 u->fullname = strsave(buf);
265 if (hash_store(users, id, u)) {
266 sq_save_data(sq, hash_lookup(users, id));
280 EXEC SQL CLOSE csr102;
282 generic_fix(sq, show_user_id, "Change ID", fix_user_id, 0);
287 EXEC SQL DECLARE csr103 CURSOR FOR
288 SELECT u1.users_id FROM users u1, users u2
289 WHERE u1.login = u2.login and u1.tid != u2.tid;
290 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
291 EXEC SQL OPEN csr103;
293 EXEC SQL FETCH csr103 INTO :id;
294 if (sqlca.sqlcode != 0) {
295 ingerr(&sqlca.sqlcode);
298 sq_save_data(sq, hash_lookup(users, id));
300 EXEC SQL CLOSE csr103;
301 handle_duplicate_logins(sq);
304 dprintf("Loading machines...\n");
305 machines = create_hash(1000);
308 EXEC SQL DECLARE csr104 CURSOR FOR
309 SELECT mach_id, name, modby FROM machine ORDER BY mach_id;
310 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
311 EXEC SQL OPEN csr104;
313 EXEC SQL FETCH csr104 INTO :id, :name, :sid;
314 if (sqlca.sqlcode != 0) {
315 ingerr(&sqlca.sqlcode);
319 m = (struct machine *) malloc(sizeof(struct machine));
321 out_of_mem("storing machines");
322 strcpy(m->name, strtrim(name));
325 if (hash_store(machines, id, m)) {
326 sq_save_data(sq, hash_lookup(machines, id));
332 EXEC SQL CLOSE csr104;
333 generic_fix(sq, show_mach_id, "Change ID", fix_mach_id, 0);
338 EXEC SQL DECLARE csr105 CURSOR FOR
339 SELECT m1.mach_id FROM machine m1, machine m2
340 WHERE m1.name = m2.name AND m1.tid != m2.tid;
341 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
342 EXEC SQL OPEN csr105;
344 EXEC SQL FETCH csr105 INTO :id;
345 if (sqlca.sqlcode != 0) {
346 ingerr(&sqlca.sqlcode);
350 sq_save_data(sq, hash_lookup(machines, id));
352 EXEC SQL CLOSE csr105;
353 generic_fix(sq, show_mach_name, "Change name", cant_fix, 0);
356 dprintf("Loading clusters...\n");
358 clusters = create_hash(100);
360 EXEC SQL DECLARE csr106 CURSOR FOR
361 SELECT clu_id, name, modby FROM cluster;
362 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
363 EXEC SQL OPEN csr106;
365 EXEC SQL FETCH csr106 INTO :id, :name, :sid;
366 if (sqlca.sqlcode != 0) {
367 ingerr(&sqlca.sqlcode);
371 c = (struct cluster *) malloc(sizeof(struct cluster));
373 out_of_mem("storing clusters");
374 strcpy(c->name, strtrim(name));
376 if (hash_store(clusters, id, c)) {
377 sq_save_data(sq, hash_lookup(clusters, id));
383 EXEC SQL CLOSE csr106;
384 generic_fix(sq, show_clu_id, "Change ID", fix_clu_id, 0);
389 EXEC SQL DECLARE csr107 CURSOR FOR
390 SELECT c1.clu_id FROM cluster c1, cluster c2
391 WHERE c1.name=c2.name AND c1.tid != c2.tid;
392 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
393 EXEC SQL OPEN csr107;
395 EXEC SQL FETCH csr107 INTO :id;
396 if (sqlca.sqlcode != 0) {
397 ingerr(&sqlca.sqlcode);
401 sq_save_data(sq, hash_lookup(clusters, id));
403 EXEC SQL CLOSE csr107;
404 generic_fix(sq, show_clu_name, "Change name", cant_fix, 0);
407 dprintf("Loading lists...\n");
409 lists = create_hash(10000);
411 EXEC SQL DECLARE csr108 CURSOR FOR
412 SELECT list_id, name, acl_id, acl_type, modby FROM list
414 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
415 EXEC SQL OPEN csr108;
417 EXEC SQL FETCH csr108 INTO :id, :name, :aid, :buf, :sid;
418 if (sqlca.sqlcode != 0) {
419 ingerr(&sqlca.sqlcode);
422 l = (struct list *) malloc(sizeof(struct list));
424 out_of_mem("storing lists");
425 strcpy(l->name, strtrim(name));
426 l->acl_type = buf[0];
430 if (hash_store(lists, id, l)) {
431 sq_save_data(sq, hash_lookup(lists, id));
437 EXEC SQL CLOSE csr108;
438 generic_fix(sq, show_list_id, "Change ID", fix_list_id, 0);
443 EXEC SQL DECLARE csr109 CURSOR FOR
444 SELECT l1.list_id FROM list l1, list l2
445 WHERE l1.name=l2.name AND l1.tid != l2.tid;
446 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
447 EXEC SQL OPEN csr109;
449 EXEC SQL FETCH csr109 INTO :id;
450 if (sqlca.sqlcode != 0) {
451 ingerr(&sqlca.sqlcode);
455 sq_save_data(sq, hash_lookup(lists, id));
457 EXEC SQL CLOSE csr109;
458 generic_fix(sq, show_list_name, "Change name", cant_fix, 0);
461 dprintf("Loading filesys...\n");
463 filesys = create_hash(10000);
465 EXEC SQL DECLARE csr110 CURSOR FOR
466 SELECT filsys_id, label, owner, owners, phys_id, mach_id,
467 type, name, modby FROM filesys ORDER BY filsys_id;
468 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
469 EXEC SQL OPEN csr110;
471 EXEC SQL FETCH csr110 INTO :id, :name, :aid, :aid2, :id2, :id3,
473 if (sqlca.sqlcode != 0) {
474 ingerr(&sqlca.sqlcode);
478 f = (struct filesys *) malloc(sizeof(struct filesys));
480 out_of_mem("storing filesystems");
481 strcpy(f->name, strtrim(name));
482 strcpy(f->dir, strtrim(name1));
489 if (hash_store(filesys, id, f)) {
490 sq_save_data(sq, hash_lookup(filesys, id));
496 EXEC SQL CLOSE csr110;
498 generic_fix(sq, show_fs_id, "Change ID", fix_fs_id, 0);
500 dprintf("Loading nfsphys...\n");
502 nfsphys = create_hash(500);
504 EXEC SQL DECLARE csr111 CURSOR FOR
505 SELECT nfsphys_id, dir, mach_id, allocated, modby FROM nfsphys;
506 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
507 EXEC SQL OPEN csr111;
509 EXEC SQL FETCH csr111 INTO :id, :name, :id2, :id3, :sid;
510 if (sqlca.sqlcode != 0) {
511 ingerr(&sqlca.sqlcode);
515 n = (struct nfsphys *) malloc(sizeof(struct nfsphys));
517 out_of_mem("storing nfsphys");
518 strcpy(n->dir, strtrim(name));
523 if (hash_store(nfsphys, id, n)) {
524 sq_save_data(sq, hash_lookup(nfsphys, id));
530 EXEC SQL CLOSE csr111;
532 generic_fix(sq, show_np_id, "Change ID", fix_np_id, 0);
536 dprintf("Checking for duplicate strings...\n");
537 EXEC SQL DECLARE csr112 CURSOR FOR
538 SELECT s1.string_id, s1.string FROM strings s1, strings s2
539 WHERE s1.string=s2.string AND s1.tid != s2.tid;
540 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
541 EXEC SQL OPEN csr112;
543 EXEC SQL FETCH csr112 INTO :id, :buf;
544 if (sqlca.sqlcode != 0) {
545 ingerr(&sqlca.sqlcode);
549 printf("String %s(%d) is a duplicate!\n", strtrim(buf), id);
550 printf("Not fixing this error\n");
552 EXEC SQL CLOSE csr112;
556 dprintf("Scanning krbmap...\n");
558 EXEC SQL DECLARE csr113 CURSOR FOR
559 SELECT k1.users_id FROM krbmap k1, krbmap k2
560 WHERE k1.users_id = k2.users_id AND k1.tid != k2.tid;
561 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
562 EXEC SQL OPEN csr113;
564 EXEC SQL FETCH csr113 INTO :id;
565 if (sqlca.sqlcode != 0) {
566 ingerr(&sqlca.sqlcode);
570 printf("User %d is in the krbmap more than once!\n", id);
571 printf("Not fixing this error\n");
573 EXEC SQL CLOSE csr113;
575 EXEC SQL DECLARE csr114 CURSOR FOR
576 SELECT k1.string_id FROM krbmap k1, krbmap k2
577 WHERE k1.string_id = k2.string_id AND k1.tid != k2.tid;
578 if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
579 EXEC SQL OPEN csr114;
581 EXEC SQL FETCH csr114 INTO :id;
582 if (sqlca.sqlcode != 0) {
583 ingerr(&sqlca.sqlcode);
587 printf("Principal %d is in the krbmap more than once!\n", id);
588 printf("Not fixing this error\n");
590 EXEC SQL CLOSE csr114;