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 EXEC SQL OPEN csr101;
207 EXEC SQL FETCH csr101 INTO :id, :buf;
208 if (sqlca.sqlcode != 0) {
209 ingerr(&sqlca.sqlcode);
213 s = (struct string *) malloc(sizeof(struct string));
215 out_of_mem("storing strings");
216 s->name = strsave(strtrim(buf));
219 if (hash_store(strings, id, s)) {
220 sq_save_data(sq, hash_lookup(strings, id));
224 EXEC SQL CLOSE csr101;
225 generic_delete(sq, show_str_id, "strings", "string_id", 0);
228 dprintf("Loading users...\n");
230 users = create_hash(10000);
232 EXEC SQL DECLARE csr102 CURSOR FOR
233 SELECT users_id, login, last, first, status, potype, pop_id, box_id,
234 modby, fmodby, pmodby, comment, sigwho FROM users ORDER BY users_id;
235 EXEC SQL OPEN csr102;
237 EXEC SQL FETCH csr102 INTO :id, :name, :last, :first, :status,
238 :buf, :id2, :id3, :sid, :sid2, :sid3, :sid4, :sid5;
239 if (sqlca.sqlcode != 0) {
240 ingerr(&sqlca.sqlcode);
244 u = (struct user *) malloc(sizeof(struct user));
246 out_of_mem("storing users");
247 strcpy(u->login, strtrim(name));
249 sprintf(buf, "%s, %s", strtrim(last), strtrim(first));
250 u->fullname = strsave(buf);
263 if (hash_store(users, id, u)) {
264 sq_save_data(sq, hash_lookup(users, id));
278 EXEC SQL CLOSE csr102;
280 generic_fix(sq, show_user_id, "Change ID", fix_user_id, 0);
285 EXEC SQL DECLARE csr103 CURSOR FOR
286 SELECT u1.users_id FROM users u1, users u2
287 WHERE u1.login = u2.login and u1.tid != u2.tid;
288 EXEC SQL OPEN csr103;
290 EXEC SQL FETCH csr103 INTO :id;
291 if (sqlca.sqlcode != 0) {
292 ingerr(&sqlca.sqlcode);
295 sq_save_data(sq, hash_lookup(users, id));
297 EXEC SQL CLOSE csr103;
298 handle_duplicate_logins(sq);
301 dprintf("Loading machines...\n");
302 machines = create_hash(1000);
305 EXEC SQL DECLARE csr104 CURSOR FOR
306 SELECT mach_id, name, modby FROM machine ORDER BY mach_id;
307 EXEC SQL OPEN csr104;
309 EXEC SQL FETCH csr104 INTO :id, :name, :sid;
310 if (sqlca.sqlcode != 0) {
311 ingerr(&sqlca.sqlcode);
315 m = (struct machine *) malloc(sizeof(struct machine));
317 out_of_mem("storing machines");
318 strcpy(m->name, strtrim(name));
321 if (hash_store(machines, id, m)) {
322 sq_save_data(sq, hash_lookup(machines, id));
328 EXEC SQL CLOSE csr104;
329 generic_fix(sq, show_mach_id, "Change ID", fix_mach_id, 0);
334 EXEC SQL DECLARE csr105 CURSOR FOR
335 SELECT m1.mach_id FROM machine m1, machine m2
336 WHERE m1.name = m2.name AND m1.tid != m2.tid;
337 EXEC SQL OPEN csr105;
339 EXEC SQL FETCH csr105 INTO :id;
340 if (sqlca.sqlcode != 0) {
341 ingerr(&sqlca.sqlcode);
345 sq_save_data(sq, hash_lookup(machines, id));
347 EXEC SQL CLOSE csr105;
348 generic_fix(sq, show_mach_name, "Change name", cant_fix, 0);
351 dprintf("Loading clusters...\n");
353 clusters = create_hash(100);
355 EXEC SQL DECLARE csr106 CURSOR FOR
356 SELECT clu_id, name, modby FROM cluster;
357 EXEC SQL OPEN csr106;
359 EXEC SQL FETCH csr106 INTO :id, :name, :sid;
360 if (sqlca.sqlcode != 0) {
361 ingerr(&sqlca.sqlcode);
365 c = (struct cluster *) malloc(sizeof(struct cluster));
367 out_of_mem("storing clusters");
368 strcpy(c->name, strtrim(name));
370 if (hash_store(clusters, id, c)) {
371 sq_save_data(sq, hash_lookup(clusters, id));
377 EXEC SQL CLOSE csr106;
378 generic_fix(sq, show_clu_id, "Change ID", fix_clu_id, 0);
383 EXEC SQL DECLARE csr107 CURSOR FOR
384 SELECT c1.clu_id FROM cluster c1, cluster c2
385 WHERE c1.name=c2.name AND c1.tid != c2.tid;
386 EXEC SQL OPEN csr107;
388 EXEC SQL FETCH csr107 INTO :id;
389 if (sqlca.sqlcode != 0) {
390 ingerr(&sqlca.sqlcode);
394 sq_save_data(sq, hash_lookup(clusters, id));
396 EXEC SQL CLOSE csr107;
397 generic_fix(sq, show_clu_name, "Change name", cant_fix, 0);
400 dprintf("Loading lists...\n");
402 lists = create_hash(10000);
404 EXEC SQL DECLARE csr108 CURSOR FOR
405 SELECT list_id, name, acl_id, acl_type, modby FROM list
407 EXEC SQL OPEN csr108;
409 EXEC SQL FETCH csr108 INTO :id, :name, :aid, :buf, :sid;
410 if (sqlca.sqlcode != 0) {
411 ingerr(&sqlca.sqlcode);
414 l = (struct list *) malloc(sizeof(struct list));
416 out_of_mem("storing lists");
417 strcpy(l->name, strtrim(name));
418 l->acl_type = buf[0];
422 if (hash_store(lists, id, l)) {
423 sq_save_data(sq, hash_lookup(lists, id));
429 EXEC SQL CLOSE csr108;
430 generic_fix(sq, show_list_id, "Change ID", fix_list_id, 0);
435 EXEC SQL DECLARE csr109 CURSOR FOR
436 SELECT l1.list_id FROM list l1, list l2
437 WHERE l1.name=l2.name AND l1.tid != l2.tid;
438 EXEC SQL OPEN csr109;
440 EXEC SQL FETCH csr109 INTO :id;
441 if (sqlca.sqlcode != 0) {
442 ingerr(&sqlca.sqlcode);
446 sq_save_data(sq, hash_lookup(lists, id));
448 EXEC SQL CLOSE csr109;
449 generic_fix(sq, show_list_name, "Change name", cant_fix, 0);
452 dprintf("Loading filesys...\n");
454 filesys = create_hash(10000);
456 EXEC SQL DECLARE csr110 CURSOR FOR
457 SELECT filsys_id, label, owner, owners, phys_id, mach_id,
458 type, name, modby FROM filesys ORDER BY filsys_id;
459 EXEC SQL OPEN csr110;
461 EXEC SQL FETCH csr110 INTO :id, :name, :aid, :aid2, :id2, :id3,
463 if (sqlca.sqlcode != 0) {
464 ingerr(&sqlca.sqlcode);
468 f = (struct filesys *) malloc(sizeof(struct filesys));
470 out_of_mem("storing filesystems");
471 strcpy(f->name, strtrim(name));
472 strcpy(f->dir, strtrim(name1));
479 if (hash_store(filesys, id, f)) {
480 sq_save_data(sq, hash_lookup(filesys, id));
486 EXEC SQL CLOSE csr110;
488 generic_fix(sq, show_fs_id, "Change ID", fix_fs_id, 0);
490 dprintf("Loading nfsphys...\n");
492 nfsphys = create_hash(500);
494 EXEC SQL DECLARE csr111 CURSOR FOR
495 SELECT nfsphys_id, dir, mach_id, allocated, modby FROM nfsphys;
496 EXEC SQL OPEN csr111;
498 EXEC SQL FETCH csr111 INTO :id, :name, :id2, :id3, :sid;
499 if (sqlca.sqlcode != 0) {
500 ingerr(&sqlca.sqlcode);
504 n = (struct nfsphys *) malloc(sizeof(struct nfsphys));
506 out_of_mem("storing nfsphys");
507 strcpy(n->dir, strtrim(name));
512 if (hash_store(nfsphys, id, n)) {
513 sq_save_data(sq, hash_lookup(nfsphys, id));
519 EXEC SQL CLOSE csr111;
521 generic_fix(sq, show_np_id, "Change ID", fix_np_id, 0);
525 EXEC SQL DECLARE csr112 CURSOR FOR
526 SELECT s1.string_id, s1.string FROM strings s1, strings s2
527 WHERE s1.string=s2.string AND s1.tid != s2.tid;
528 EXEC SQL OPEN csr112;
530 EXEC SQL FETCH csr112 INTO :id, :buf;
531 if (sqlca.sqlcode != 0) {
532 ingerr(&sqlca.sqlcode);
536 printf("String %s(%d) is a duplicate!\n", strtrim(buf), id);
537 printf("Not fixing this error\n");
539 EXEC SQL CLOSE csr112;
543 dprintf("Scanning krbmap...\n");
545 EXEC SQL DECLARE csr113 CURSOR FOR
546 SELECT k1.users_id FROM krbmap k1, krbmap k2
547 WHERE k1.users_id = k2.users_id AND k1.tid != k2.tid;
548 EXEC SQL OPEN csr113;
550 EXEC SQL FETCH csr113 INTO :id;
551 if (sqlca.sqlcode != 0) {
552 ingerr(&sqlca.sqlcode);
556 printf("User %d is in the krbmap more than once!\n", id);
557 printf("Not fixing this error\n");
559 EXEC SQL CLOSE csr113;
561 EXEC SQL DECLARE csr114 CURSOR FOR
562 SELECT k1.string_id FROM krbmap k1, krbmap k2
563 WHERE k1.string_id = k2.string_id AND k1.tid != k2.tid;
564 EXEC SQL OPEN csr114;
566 EXEC SQL FETCH csr114 INTO :id;
567 if (sqlca.sqlcode != 0) {
568 ingerr(&sqlca.sqlcode);
572 printf("Principal %d is in the krbmap more than once!\n", id);
573 printf("Not fixing this error\n");
575 EXEC SQL CLOSE csr114;