]> andersk Git - moira.git/blob - dbck/phase1.pc
Remove `delete_user_by_uid' since it's never been used in any logs we have,
[moira.git] / dbck / phase1.pc
1 /* $Header$
2  *
3  *  (c) Copyright 1988 by the Massachusetts Institute of Technology.
4  *  For copying and distribution information, please see the file
5  *  <mit-copyright.h>.
6  */
7
8 #include <mit-copyright.h>
9 #include <moira.h>
10 #include <stdio.h>
11 #include "dbck.h"
12 EXEC SQL INCLUDE sqlca;
13
14 static char phase1_qc_rcsid[] = "$Header$";
15
16 EXEC SQL WHENEVER SQLERROR DO dbmserr();
17
18 show_user_id(u)
19 struct user *u;
20 {
21     printf("User %s (%s, status %d) has duplicate ID\n",
22            u->login, u->fullname, u->status);
23     return(0);
24 }
25
26 handle_duplicate_logins(sq)
27 struct save_queue *sq;
28 {
29     struct user *u, *uu, *tmp;
30
31     uu = (struct user *)0;
32     if(sq_get_data(sq,&uu)) {
33       while (sq_get_data(sq, &u)) {
34         if (!strcmp(u->login, uu->login)) {
35             if (uu->status == 1 || u->status == 0) {
36                 tmp = u;
37                 u = uu;
38                 uu = tmp;
39             }
40             printf("User %s (%s, status %d) and\n",
41                    u->login, u->fullname, u->status);
42             printf("User %s (%s, status %d) have duplicate logins\n",
43                    uu->login, uu->fullname, uu->status);
44             if (!strcmp(u->fullname, uu->fullname) &&
45                 single_fix("Delete the second one")) {
46                 single_delete("users", "users_id", uu->users_id);
47             } else if (single_fix("Unregister the second one"))
48               {
49                 EXEC SQL BEGIN DECLARE SECTION; 
50                 int id = uu->users_id, rowcount;
51                 EXEC SQL END DECLARE SECTION; 
52
53                 EXEC SQL UPDATE users SET login = '#' || CHAR(users.unix_uid),
54                     status=0 WHERE users_id = :id;
55                 rowcount = sqlca.sqlerrd[2];
56                 if (rowcount > 0)
57                   printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
58                 else
59                   printf("Not fixed\n");
60                 modified("users");
61               }
62         } else {
63             uu = u;
64         }
65       }
66     }
67 }
68
69 fix_user_id(u)
70 struct user *u;
71 {
72     u->users_id = generic_fix_id("users", "users_id", "login",
73                                  u->users_id, u->login);
74 }
75
76
77 cant_fix(id)
78 int id;
79 {
80     printf("Sorry, don't know how to fix that\n");
81 }
82
83 show_mach_id(m)
84 struct machine *m;
85 {
86     printf("Machine %s has duplicate ID %d\n", m->name, m->mach_id);
87     return(0);
88 }
89
90 show_mach_name(m)
91 struct machine *m;
92 {
93     printf("Machine %s (%d) has duplicate name\n", m->name, m->mach_id);
94     return(0);
95 }
96
97 fix_mach_id(m)
98 struct machine *m;
99 {
100     m->mach_id = generic_fix_id("machine", "mach_id", "name",
101                                 m->mach_id, m->name);
102 }
103
104 show_snet_name(s)
105 struct subnet *s;
106 {
107     printf("Subnet %s (%d) has duplicate name\n", s->name, s->snet_id);
108     return(0);
109 }
110
111 show_clu_id(c)
112 struct cluster *c;
113 {
114     printf("Cluster %s has duplicate ID %d\n", c->name, c->clu_id);
115     return(0);
116 }
117
118 show_clu_name(c)
119 struct cluster *c;
120 {
121     printf("Cluster %s (%d) has duplicate name\n", c->name, c->clu_id);
122     return(0);
123 }
124
125 fix_clu_id(c)
126 struct cluster *c;
127 {
128     c->clu_id = generic_fix_id("cluster", "clu_id", "name", c->clu_id, c->name);
129 }
130
131 show_list_id(l)
132 struct list *l;
133 {
134     printf("List %s has duplicate ID %d\n", l->name, l->list_id);
135     return(0);
136 }
137
138 show_list_name(l)
139 struct list *l;
140 {
141     printf("List %s (%d) has duplicate name\n", l->name, l->list_id);
142     return(0);
143 }
144
145 fix_list_id(l)
146 struct list *l;
147 {
148     l->list_id = generic_fix_id("list", "list_id", "name", l->list_id, l->name);
149 }
150
151 show_fs_id(f)
152 struct filesys *f;
153 {
154     printf("Filesys %s has duplicate ID %d\n", f->name, f->filsys_id);
155     return(0);
156 }
157
158 fix_fs_id(f)
159 struct filesys *f;
160 {
161     f->filsys_id = generic_fix_id("filesys", "filsys_id", "label",
162                                   f->filsys_id, f->name);
163 }
164
165 show_fs_name(fs)
166 struct filesys *fs;
167 {
168     printf("Filesys %s (%d) has duplicate name\n", fs->name, fs->filsys_id);
169     return(0);
170 }
171
172
173 show_np_id(n)
174 struct nfsphys *n;
175 {
176     printf("NfsPhys %s:%s has duplicate ID %d\n",
177            ((struct machine *)hash_lookup(machines, n->mach_id))->name,
178            n->dir, n->nfsphys_id);
179     return(0);
180 }
181
182 fix_np_id(n)
183 struct nfsphys *n;
184 {
185     n->nfsphys_id = generic_fix_id("nfsphys", "nfsphys_id", "dir",
186                                    n->nfsphys_id, n->dir);
187 }
188
189 show_str_id(s)
190 struct string *s;
191 {
192     printf("String %s has duplicate ID %d\n", s->name, s->string_id);
193     return(0);
194 }
195
196 print_str_id(id)
197      int id;
198 {
199   printf("String %d is a duplicate\n", id);
200   return(0);
201 }
202
203 print_dup_map(key, data, hint)
204         int key;
205         int data;
206         char *hint;
207 {
208         printf("String %d is a duplicate of string %d\n", key, data);
209
210 }
211
212 phase1()
213 {
214     EXEC SQL BEGIN DECLARE SECTION; 
215     char name[81], name1[81], last[17], first[17], buf[257];
216     int id, id1, id2, id3, aid, aid2, status;
217     int sid, sid2, sid3, sid4, sid5;
218     EXEC SQL END DECLARE SECTION; 
219     int i, q, retval, tmp;
220     struct save_queue *sq;
221     struct user *u;
222     struct machine *m;
223     struct subnet *sn;
224     struct list *l;
225     struct cluster *c;
226     struct string *s;
227     struct filesys *f;
228     struct nfsphys *n;
229
230     printf("Phase 1 - Looking for duplicates\n");
231
232     /* self-join strings table on "string" to get duplicate strings, then
233        build a duplicates table to merge them. */
234
235     dprintf("Looking for duplicate strings...\n");
236     string_dups = create_hash( 100 );
237     if(!string_dups) out_of_mem("storing duplicate strings");
238     
239     EXEC SQL DECLARE csr116 CURSOR FOR
240       SELECT s1.string_id, s2.string_id FROM strings s1, strings s2
241         where s1.string = s2.string and s1.string_id < s2.string_id;
242     EXEC SQL OPEN csr116;
243     /*  The SELECT gives us two columns, both with non-negative integers.
244      *  The number in the left column is always the smaller of the two,
245      *  and each row includes string IDs for identical strings.  We use
246      *  them to make a mapping from id-to-delete to id-to-keep for all
247      *  superflous IDs.
248      */
249     q=0;
250     while(1) {
251         EXEC SQL FETCH csr116 INTO :id1, :id2;
252         if (sqlca.sqlcode != 0) break;
253         q++;
254         /*  If id2 is already stored, skip this row. */
255         i = int_hash_lookup( string_dups, id2 );
256         if( i > 0 ) { continue; }
257         /*  Follow the chain of id1 equivalent IDs back to the lowest one. */
258         id=id1;
259         while((tmp=int_hash_lookup(string_dups, id))>0)
260           id=tmp;
261         int_hash_store( string_dups, id2, id );
262     }
263     EXEC SQL CLOSE csr116;
264     dprintf("found %d duplicates\n", q);
265     int_hash_step(string_dups, print_dup_map, NULL);
266     /* We don't want to delete the duplicates now because if the dbck
267        is cancelled, a LOT of state will be lost. So, we'll just let
268        them not get marked as used and then phase3 will clean them up */
269
270     dprintf("Loading strings...\n");
271     sq = sq_create();
272     strings = create_hash(75000);
273     if(!sq || !strings) out_of_mem("loading strings");
274
275     EXEC SQL DECLARE csr101 CURSOR FOR
276       SELECT string_id, string FROM strings ORDER BY string_id;
277     EXEC SQL OPEN csr101;
278     q=0;
279     while(1) {
280         EXEC SQL FETCH csr101 INTO :id, :buf;
281         if (sqlca.sqlcode != 0) break;
282         q++;
283         s = (struct string *) malloc(sizeof(struct string));
284         if (s == NULL)
285           out_of_mem("storing strings");
286         s->name = strsave(strtrim(buf));
287         s->string_id = id;
288         s->refc = 0;
289         retval = hash_store(strings, id, s);
290         if ( retval == -1 ) {
291           out_of_mem("storing strings in hash table");
292         } else if ( retval == 1 ) { /* duplicate string_id*/
293           sq_save_data(sq, hash_lookup(strings, id));
294           sq_save_data(sq, s);
295         }
296     }
297     EXEC SQL CLOSE csr101;
298     /* I'm not at all convinced this will work, so...
299        generic_delete(sq, show_str_id, "strings", "string_id", 0);
300     */
301     string_check(0);
302
303     printf("Loaded %d strings\n", q);
304
305     dprintf("Loading users...\n");
306     sq = sq_create();
307     users = create_hash(30000);
308     if(!sq || !users) out_of_mem("loading users");
309
310     EXEC SQL DECLARE csr102 CURSOR FOR 
311       SELECT users_id, login, last, first, status, potype, pop_id, box_id,
312           modby, fmodby, pmodby, comments, sigwho FROM users
313         ORDER BY users_id;
314     EXEC SQL OPEN csr102;
315     while(1) {
316         EXEC SQL FETCH csr102 INTO :id, :name, :last, :first, :status,
317             :buf, :id2, :id3, :sid, :sid2, :sid3, :sid4, :sid5;
318         if (sqlca.sqlcode != 0) break;
319
320         u = (struct user *) malloc(sizeof(struct user));
321         if (u == NULL)
322           out_of_mem("storing users");
323         strcpy(u->login, strtrim(name));
324         u->potype = buf[0];
325         sprintf(buf, "%s, %s", strtrim(last), strtrim(first));
326         u->fullname = strsave(buf);
327         u->status = status;
328         u->users_id = id;
329         u->modby = sid;
330         u->fmodby = sid2;
331         u->pmodby = sid3;
332         u->comment = sid4;
333         u->sigwho = sid5;
334         switch (u->potype) {
335         case 'P':
336             u->pobox_id = id2;
337             break;
338         case 'S':
339             /*  If potype is SMTP, box_id is a string_id for the strings tbl */
340             u->pobox_id = id3;
341             break;
342         default:
343             u->pobox_id = 0;
344         }
345         retval = hash_store(users, id, u);
346         if ( retval == -1 ) {
347             out_of_mem("storing users in hash table");
348         } else if ( retval == 1 ) {
349             sq_save_data(sq, hash_lookup(users, id));
350             sq_save_data(sq, u);
351         }
352     }
353     EXEC SQL CLOSE csr102; 
354
355     generic_fix(sq, show_user_id, "Change ID", fix_user_id, 0);
356
357     if (!fast) {
358         sq = sq_create();
359         if(!sq) out_of_mem("finding duplicate logins");
360
361         EXEC SQL DECLARE csr103 CURSOR FOR 
362             SELECT u1.users_id FROM users u1, users u2
363             WHERE u1.login = u2.login and u1.rowid != u2.rowid;
364         EXEC SQL OPEN csr103;
365         while(1) {
366             EXEC SQL FETCH csr103 INTO :id;
367             if (sqlca.sqlcode != 0) break;
368             sq_save_data(sq, hash_lookup(users, id));
369         }
370         EXEC SQL CLOSE csr103; 
371         handle_duplicate_logins(sq);
372     }
373
374     if (!fast) {
375         dprintf("Scanning krbmap...\n");
376
377         EXEC SQL DECLARE csr113 CURSOR FOR
378             SELECT k1.users_id FROM krbmap k1, krbmap k2
379                 WHERE k1.users_id = k2.users_id AND k1.rowid != k2.rowid;
380         EXEC SQL OPEN csr113;
381         while(1) {
382             EXEC SQL FETCH csr113 INTO :id;
383             if (sqlca.sqlcode != 0) break;
384
385             printf("User %d is in the krbmap more than once!\n", id);
386             printf("Not fixing this error\n");
387         }
388         EXEC SQL CLOSE csr113; 
389
390         EXEC SQL DECLARE csr114 CURSOR FOR
391             SELECT k1.string_id FROM krbmap k1, krbmap k2
392                 WHERE k1.string_id = k2.string_id AND k1.rowid != k2.rowid;
393         EXEC SQL OPEN csr114;
394         while(1) {
395             EXEC SQL FETCH csr114 INTO :id;
396             if (sqlca.sqlcode != 0) break; 
397
398             printf("Principal %d is in the krbmap more than once!\n", id);
399             printf("Not fixing this error\n");
400         }
401         EXEC SQL CLOSE csr114; 
402     }
403
404     dprintf("Loading machines...\n");
405     sq = sq_create();
406     machines = create_hash(20000);
407     if(!sq || !machines) out_of_mem("loading machines");
408
409     EXEC SQL DECLARE csr104 CURSOR FOR
410         SELECT mach_id, name, snet_id, owner_type, owner_id,
411                 acomment, ocomment, creator, modby
412         FROM machine ORDER BY mach_id;
413     EXEC SQL OPEN csr104;
414     while(1) {
415         EXEC SQL FETCH csr104 INTO :id, :name, :id2, :buf, :id3, :sid2,
416                 :sid3, :sid4, :sid;
417         if (sqlca.sqlcode != 0) break; 
418
419         m = (struct machine *) malloc(sizeof(struct machine));
420         if (m == NULL)
421           out_of_mem("storing machines");
422         strcpy(m->name, strtrim(name));
423         m->owner_type = buf[0];
424         m->owner_id = id3;
425         m->snet_id = id2;
426         m->mach_id = id;
427         m->clucount = 0;
428         m->acomment=sid2;
429         m->ocomment=sid3;
430         m->creator=sid4;
431         m->modby=sid;
432         retval = hash_store(machines, id, m);
433         if ( retval == -1 ) {
434             out_of_mem("storing machines in hash table");
435         } else if ( retval == 1 ) {
436             sq_save_data(sq, hash_lookup(machines, id));
437             sq_save_data(sq, m);
438         }
439     }
440     EXEC SQL CLOSE csr104; 
441     generic_fix(sq, show_mach_id, "Change ID", fix_mach_id, 0);
442
443     if (!fast) {
444         sq = sq_create();
445         if(!sq) out_of_mem("looking for duplicate machine names");
446
447         EXEC SQL DECLARE csr105 CURSOR FOR
448             SELECT m1.mach_id FROM machine m1, machine m2
449                 WHERE m1.name = m2.name AND m1.rowid != m2.rowid;
450         EXEC SQL OPEN csr105;
451         while(1) {
452             EXEC SQL FETCH csr105 INTO :id;
453             if (sqlca.sqlcode != 0) break; 
454
455             sq_save_data(sq, hash_lookup(machines, id));
456         }
457         EXEC SQL CLOSE csr105; 
458         generic_fix(sq, show_mach_name, "Change name", cant_fix, 0);
459
460         EXEC SQL DECLARE csr_hal1 CURSOR FOR
461           SELECT h1.name, m1.mach_id, m2.mach_id
462           FROM hostalias h1, machine m1, hostalias h2, machine m2
463           WHERE h1.name=h2.name AND h1.mach_id!=h2.mach_id
464           AND m1.mach_id=h1.mach_id AND m2.mach_id=h2.mach_id;
465         EXEC SQL OPEN csr_hal1;
466         while(1) {
467           EXEC SQL FETCH csr_hal1 INTO :name, :id1, :id2;
468           if(sqlca.sqlcode!=0) break;
469           printf("Aliases for machines %d and %d have duplicate name %s\n",
470                  id1, id2, strtrim(name));
471           cant_fix();
472         }
473         EXEC SQL CLOSE csr_hal1;
474
475         EXEC SQL DECLARE csr_hal2 CURSOR FOR
476           SELECT h1.name, m1.mach_id, m2.mach_id
477           FROM hostalias h1, machine m1, machine m2
478           WHERE h1.name=m1.name AND h1.mach_id=m2.mach_id;
479         EXEC SQL OPEN csr_hal2;
480         while(1) {
481           EXEC SQL FETCH csr_hal2 INTO :name, :id1, :id2;
482           if(sqlca.sqlcode!=0) break;
483           printf("Machine %d has alias `%s' that conflicts with machine %d\n",
484                  id2, strtrim(name), id1);
485           cant_fix();
486         }
487         EXEC SQL CLOSE csr_hal2;
488     }   
489
490     dprintf("Loading subnets...\n");
491     subnets = create_hash(254);
492     if(!subnets) out_of_mem("loading subnets");
493
494     EXEC SQL DECLARE csr115 CURSOR FOR
495       SELECT snet_id, name, owner_type, owner_id, modby from subnet;
496     EXEC SQL OPEN csr115;
497     while(1) {
498         EXEC SQL FETCH csr115 INTO :id, :name, :buf, :id2, :sid;
499         if (sqlca.sqlcode != 0) break;
500
501         sn = (struct subnet *) malloc(sizeof(struct machine));
502         if (sn == NULL)
503           out_of_mem("storing subnets");
504         strcpy(sn->name, strtrim(name));
505         sn->owner_type=buf[0];
506         sn->owner_id = id2;
507         sn->snet_id = id;
508         sn->modby = sid;
509         retval = hash_store(subnets, id, sn);
510         if ( retval == -1 ) {
511             out_of_mem("storing subnets in hash table");
512         } else if ( retval == 1 ) {
513             printf("Duplicate subnet ID: %d (%s)\n", id, name);
514             /* should add code to delete */
515         }
516     }
517     EXEC SQL CLOSE csr115;
518
519     if (!fast) {
520         sq = sq_create();
521         if(!sq) out_of_mem("looking for duplicate subnet names");
522
523         EXEC SQL DECLARE csr117 CURSOR FOR
524             SELECT s1.snet_id FROM subnet s1, subnet s2
525                 WHERE s1.name = s2.name AND s1.rowid != s2.rowid;
526         EXEC SQL OPEN csr117;
527         while(1) {
528             EXEC SQL FETCH csr117 INTO :id;
529             if (sqlca.sqlcode != 0) break; 
530
531             sq_save_data(sq, hash_lookup(subnets, id));
532         }
533         EXEC SQL CLOSE csr117;
534         generic_fix(sq, show_snet_name, "Change name", cant_fix, 0);
535     }
536     
537     dprintf("Loading clusters...\n");
538     sq = sq_create();
539     clusters = create_hash(100);
540     if(!sq || !clusters) out_of_mem("loading clusters");
541
542     EXEC SQL DECLARE csr106 CURSOR FOR
543         SELECT clu_id, name, modby FROM clusters;
544     EXEC SQL OPEN csr106;
545     while(1) {
546         EXEC SQL FETCH csr106 INTO :id, :name, :sid;
547         if (sqlca.sqlcode != 0) break; 
548
549         c = (struct cluster *) malloc(sizeof(struct cluster));
550         if (c == NULL)
551           out_of_mem("storing clusters");
552         strcpy(c->name, strtrim(name));
553         c->clu_id = id;
554         c->modby = sid;
555         retval = hash_store(clusters, id, c);
556         if ( retval == -1 ) {
557             out_of_mem("storing clusters in hash table");
558         } else if ( retval == 1 ) {
559             sq_save_data(sq, hash_lookup(clusters, id));
560             sq_save_data(sq, c);
561         }
562     }
563     EXEC SQL CLOSE csr106; 
564     generic_fix(sq, show_clu_id, "Change ID", fix_clu_id, 0);
565
566     if (!fast) {
567         sq = sq_create();
568         if(!sq) out_of_mem("looking for duplicate cluster names");
569
570         EXEC SQL DECLARE csr107 CURSOR FOR
571             SELECT c1.clu_id FROM clusters c1, clusters c2
572                 WHERE c1.name=c2.name AND c1.rowid != c2.rowid;
573         EXEC SQL OPEN csr107;
574         while(1) {
575             EXEC SQL FETCH csr107 INTO :id;
576             if (sqlca.sqlcode != 0) break; 
577
578             sq_save_data(sq, hash_lookup(clusters, id));
579         }
580         EXEC SQL CLOSE csr107; 
581         generic_fix(sq, show_clu_name, "Change name", cant_fix, 0);
582     }
583
584     dprintf("Loading lists...\n");
585     sq = sq_create();
586     lists = create_hash(50000);
587     if(!sq || !lists) out_of_mem("loading lists");
588
589     EXEC SQL DECLARE csr108 CURSOR FOR
590         SELECT list_id, name, acl_id, acl_type, modby  FROM list 
591         ORDER BY list_id;
592     EXEC SQL OPEN csr108;
593     while(1) {
594         EXEC SQL FETCH csr108 INTO :id, :name, :aid, :buf, :sid;
595         if (sqlca.sqlcode != 0) break;
596         l = (struct list *) malloc(sizeof(struct list));
597         if (l == NULL)
598           out_of_mem("storing lists");
599         strcpy(l->name, strtrim(name));
600         l->acl_type = buf[0];
601         l->acl_id = aid;
602         l->list_id = id;
603         l->members = 0;
604         retval = hash_store(lists, id, l);
605         if ( retval == -1 ) {
606             out_of_mem("storing lists in hash table");
607         } else if ( retval == 1 ) {
608             sq_save_data(sq, hash_lookup(lists, id));
609             sq_save_data(sq, l);
610         }
611     }
612     EXEC SQL CLOSE csr108; 
613     generic_fix(sq, show_list_id, "Change ID", fix_list_id, 0);
614
615     if (!fast) {
616         sq = sq_create();
617         if(!sq) out_of_mem("looking for duplicate list names");
618
619         EXEC SQL DECLARE csr109 CURSOR FOR
620             SELECT l1.list_id FROM list l1, list l2
621                 WHERE l1.name=l2.name AND l1.rowid != l2.rowid;
622         EXEC SQL OPEN csr109;
623         while(1) {
624             EXEC SQL FETCH csr109 INTO :id;
625             if (sqlca.sqlcode != 0) break; 
626             
627             sq_save_data(sq, hash_lookup(lists, id));
628         }
629         EXEC SQL CLOSE csr109;
630         generic_fix(sq, show_list_name, "Change name", cant_fix, 0);
631     }
632
633     dprintf("Loading filesys...\n");
634     sq = sq_create();
635     filesys = create_hash(30000);
636     if(!sq || !filesys) out_of_mem("loading filesys");
637
638     EXEC SQL DECLARE csr110 CURSOR FOR
639         SELECT filsys_id, label, owner, owners, phys_id, mach_id,
640                 type, name, modby FROM filesys ORDER BY filsys_id;
641     EXEC SQL OPEN csr110;
642     while(1) {
643         EXEC SQL FETCH csr110 INTO :id, :name, :aid, :aid2, :id2, :id3, 
644             :buf, :name1, :sid;
645         if (sqlca.sqlcode != 0) break;
646
647         f = (struct filesys *) malloc(sizeof(struct filesys));
648         if (f == NULL)
649           out_of_mem("storing filesystems");
650         strcpy(f->name, strtrim(name));
651         strcpy(f->dir, strtrim(name1));
652         f->filsys_id = id;
653         f->owner = aid;
654         f->owners = aid2;
655         f->phys_id = id2;
656         f->mach_id = id3;
657         f->type = buf[0];
658         retval = hash_store(filesys, id, f);
659         if ( retval == -1 ) {
660             out_of_mem("storing filesys in hash table");
661         } else if ( retval == 1 ) {
662             sq_save_data(sq, hash_lookup(filesys, id));
663             sq_save_data(sq, f);
664         }
665     }
666     EXEC SQL CLOSE csr110;
667
668     generic_fix(sq, show_fs_id, "Change ID", fix_fs_id, 0);
669
670     if (!fast) {
671         sq = sq_create();
672         if(!sq) out_of_mem("looking for duplicate filesys names");
673
674         EXEC SQL DECLARE csr118 CURSOR FOR
675             SELECT fs1.filsys_id FROM filesys fs1, filesys fs2
676                 WHERE fs1.label=fs2.label AND fs1.rowid != fs2.rowid;
677         EXEC SQL OPEN csr118;
678         while(1) {
679             EXEC SQL FETCH csr118 INTO :id;
680             if (sqlca.sqlcode != 0) break; 
681             
682             sq_save_data(sq, hash_lookup(filesys, id));
683         }
684         EXEC SQL CLOSE csr118;
685         generic_fix(sq, show_fs_name, "Change name", cant_fix, 0);
686     }
687
688     dprintf("Loading nfsphys...\n");
689     sq = sq_create();
690     nfsphys = create_hash(500);
691     if(!sq || !nfsphys) out_of_mem("loading nfsphs");
692
693     EXEC SQL DECLARE csr111 CURSOR FOR
694         SELECT nfsphys_id, dir, mach_id, allocated, modby FROM nfsphys;
695     EXEC SQL OPEN csr111;
696     while(1) {
697         EXEC SQL FETCH csr111 INTO :id, :name, :id2, :id3, :sid;
698         if (sqlca.sqlcode != 0) break; 
699         
700         n = (struct nfsphys *) malloc(sizeof(struct nfsphys));
701         if (n == NULL)
702           out_of_mem("storing nfsphys");
703         strcpy(n->dir, strtrim(name));
704         n->mach_id = id2;
705         n->nfsphys_id = id;
706         n->allocated = id3;
707         n->count = 0;
708         retval = hash_store(nfsphys, id, n);
709         if ( retval == -1 ) {
710             out_of_mem("storing nfsphys in hash table");
711         } else if ( retval == 1 ) {
712             sq_save_data(sq, hash_lookup(nfsphys, id));
713             sq_save_data(sq, n);
714         }
715     }
716     EXEC SQL CLOSE csr111;
717
718     generic_fix(sq, show_np_id, "Change ID", fix_np_id, 0);
719
720     dprintf("Checking printcap...\n");
721
722     EXEC SQL DECLARE csr119 CURSOR FOR
723         SELECT p1.name FROM printcap p1, printcap p2
724         WHERE p1.name=p2.name AND p1.rowid<p2.rowid;
725     EXEC SQL OPEN csr119;
726     while(1) {
727         EXEC SQL FETCH csr119 INTO :name;
728         if (sqlca.sqlcode != 0) break;
729
730         printf("Printer %s has duplicate name\n", name);
731         cant_fix(0);
732     }
733     EXEC SQL CLOSE csr119;
734 }
This page took 0.290038 seconds and 5 git commands to generate.