]> andersk Git - moira.git/blob - dbck/phase1.pc
Add rp to generated file; don't use "restart" init option.
[moira.git] / dbck / phase1.pc
1 /* $Id$
2  *
3  * (c) Copyright 1988-1998 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 "dbck.h"
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 EXEC SQL INCLUDE sqlca;
16
17 RCSID("$Header$");
18
19 EXEC SQL WHENEVER SQLERROR DO dbmserr();
20 int show_user_id(void *user);
21 void handle_duplicate_logins(struct save_queue *sq);
22 void fix_user_id(void *user);
23 void cant_fix(void *id);
24 int show_mach_id(void *machine);
25 int show_mach_name(void *machine);
26 void fix_mach_id(void *machine);
27 int show_snet_name(void *subnet);
28 int show_clu_id(void *cluster);
29 int show_clu_name(void *cluster);
30 void fix_clu_id(void *cluster);
31 int show_list_id(void *list);
32 int show_list_name(void *list);
33 void fix_list_id(void *list);
34 int show_fs_id(void *filesys);
35 void fix_fs_id(void *filesys);
36 int show_fs_name(void *fs);
37 int show_np_id(void *nfsphys);
38 void fix_np_id(void *nfsphys);
39 int show_str_id(void *string);
40 int print_str_id(void *id);
41 void print_dup_map(int key, void *data, void *hint);
42 int show_cnt_name(void *cnt);
43
44 int show_user_id(void *user)
45 {
46   struct user *u = user;
47   printf("User %s (%s, status %d) has duplicate ID\n",
48          u->login, u->fullname, u->status);
49   return 0;
50 }
51
52 void handle_duplicate_logins(struct save_queue *sq)
53 {
54   struct user *u, *uu, *tmp;
55
56   uu = NULL;
57   if (sq_get_data(sq, &uu))
58     {
59       while (sq_get_data(sq, &u))
60         {
61           if (!strcmp(u->login, uu->login))
62             {
63               if (uu->status == 1 || u->status == 0)
64                 {
65                   tmp = u;
66                   u = uu;
67                   uu = tmp;
68                 }
69               printf("User %s (%s, status %d) and\n",
70                      u->login, u->fullname, u->status);
71               printf("User %s (%s, status %d) have duplicate logins\n",
72                      uu->login, uu->fullname, uu->status);
73               if (!strcmp(u->fullname, uu->fullname) &&
74                   single_fix("Delete the second one", 0))
75                 single_delete("users", "users_id", uu->users_id);
76               else if (single_fix("Unregister the second one", 0))
77                 {
78                   EXEC SQL BEGIN DECLARE SECTION;
79                   int id = uu->users_id, rowcount;
80                   EXEC SQL END DECLARE SECTION;
81
82                   EXEC SQL UPDATE users
83                     SET login = '#' || CHAR(users.unix_uid), status = 0
84                     WHERE users_id = :id;
85                   rowcount = sqlca.sqlerrd[2];
86                   if (rowcount > 0)
87                     {
88                       printf("%d entr%s fixed\n", rowcount,
89                              rowcount == 1 ? "y" : "ies");
90                     }
91                   else
92                     printf("Not fixed\n");
93                   modified("users");
94                 }
95             }
96           else
97             uu = u;
98         }
99     }
100 }
101
102 void fix_user_id(void *user)
103 {
104   struct user *u = user;
105   u->users_id = generic_fix_id("users", "users_id", "login",
106                                u->users_id, u->login);
107 }
108
109
110 void cant_fix(void *id)
111 {
112   printf("Sorry, don't know how to fix that\n");
113 }
114
115 int show_mach_id(void *machine)
116 {
117   struct machine *m = machine;
118   printf("Machine %s has duplicate ID %d\n", m->name, m->mach_id);
119   return 0;
120 }
121
122 int show_mach_name(void *machine)
123 {
124   struct machine *m = machine;
125   printf("Machine %s (%d) has duplicate name\n", m->name, m->mach_id);
126   return 0;
127 }
128
129 void fix_mach_id(void *machine)
130 {
131   struct machine *m = machine;
132   m->mach_id = generic_fix_id("machine", "mach_id", "name",
133                               m->mach_id, m->name);
134 }
135
136 int show_snet_name(void *subnet)
137 {
138   struct subnet *s = subnet;
139   printf("Subnet %s (%d) has duplicate name\n", s->name, s->snet_id);
140   return 0;
141 }
142
143 int show_clu_id(void *cluster)
144 {
145   struct cluster *c = cluster;
146   printf("Cluster %s has duplicate ID %d\n", c->name, c->clu_id);
147   return 0;
148 }
149
150 int show_clu_name(void *cluster)
151 {
152   struct cluster *c = cluster;
153   printf("Cluster %s (%d) has duplicate name\n", c->name, c->clu_id);
154   return 0;
155 }
156
157 void fix_clu_id(void *cluster)
158 {
159   struct cluster *c = cluster;
160   c->clu_id = generic_fix_id("cluster", "clu_id", "name", c->clu_id, c->name);
161 }
162
163 int show_list_id(void *list)
164 {
165   struct list *l = list;
166   printf("List %s has duplicate ID %d\n", l->name, l->list_id);
167   return 0;
168 }
169
170 int show_list_name(void *list)
171 {
172   struct list *l = list;
173   printf("List %s (%d) has duplicate name\n", l->name, l->list_id);
174   return 0;
175 }
176
177 void fix_list_id(void *list)
178 {
179   struct list *l = list;
180   l->list_id = generic_fix_id("list", "list_id", "name", l->list_id, l->name);
181 }
182
183 int show_fs_id(void *filesys)
184 {
185   struct filesys *f = filesys;
186   printf("Filesys %s has duplicate ID %d\n", f->name, f->filsys_id);
187   return 0;
188 }
189
190 void fix_fs_id(void *filesys)
191 {
192   struct filesys *f = filesys;
193   f->filsys_id = generic_fix_id("filesys", "filsys_id", "label",
194                                 f->filsys_id, f->name);
195 }
196
197 int show_fs_name(void *filesys)
198 {
199   struct filesys *fs = filesys;
200   printf("Filesys %s (%d) has duplicate name\n", fs->name, fs->filsys_id);
201   return 0;
202 }
203
204 int show_np_id(void *nfsphys)
205 {
206   struct nfsphys *n = nfsphys;
207   printf("NfsPhys %s:%s has duplicate ID %d\n",
208          ((struct machine *)hash_lookup(machines, n->mach_id))->name,
209          n->dir, n->nfsphys_id);
210   return 0;
211 }
212
213 void fix_np_id(void *nfsphys)
214 {
215   struct nfsphys *n = nfsphys;
216   n->nfsphys_id = generic_fix_id("nfsphys", "nfsphys_id", "dir",
217                                  n->nfsphys_id, n->dir);
218 }
219
220 int show_str_id(void *string)
221 {
222   struct string *s = string;
223   printf("String %s has duplicate ID %d\n", s->name, s->string_id);
224   return 0;
225 }
226
227 int print_str_id(void *id)
228 {
229   printf("String %d is a duplicate\n", (int)id);
230   return 0;
231 }
232
233 void print_dup_map(int key, void *data, void *hint)
234 {
235   printf("String %d is a duplicate of string %d\n", key, (int)data);
236 }
237
238 int show_cnt_name(void *container)
239 {
240   struct container *cnt = container;
241   printf("Container %s (%d) has duplicate name\n", cnt->name, cnt->cnt_id);
242   return 0;
243 }
244
245 void phase1(void)
246 {
247   EXEC SQL BEGIN DECLARE SECTION;
248   int id;
249   EXEC SQL END DECLARE SECTION;
250   int i, q, retval, tmp;
251   struct save_queue *sq;
252   struct user *u;
253   struct machine *m;
254   struct subnet *sn;
255   struct list *l;
256   struct cluster *c;
257   struct string *s;
258   struct filesys *f;
259   struct nfsphys *n;
260   struct printserver *ps;
261   struct container *cnt;
262
263   printf("Phase 1 - Looking for duplicates\n");
264
265   /* self-join strings table on "string" to get duplicate strings, then
266      build a duplicates table to merge them. */
267
268   dprintf("Looking for duplicate strings...\n");
269   string_dups = create_hash(100);
270   if (!string_dups)
271     out_of_mem("storing duplicate strings");
272
273   EXEC SQL DECLARE csr116 CURSOR FOR
274     SELECT s1.string_id, s2.string_id FROM strings s1, strings s2
275     WHERE s1.string = s2.string and s1.string_id < s2.string_id;
276   EXEC SQL OPEN csr116;
277   /*  The SELECT gives us two columns, both with non-negative integers.
278    *  The number in the left column is always the smaller of the two,
279    *  and each row includes string IDs for identical strings.  We use
280    *  them to make a mapping from id-to-delete to id-to-keep for all
281    *  superflous IDs.
282    */
283   q = 0;
284   while (1)
285     {
286       EXEC SQL BEGIN DECLARE SECTION;
287       int id1, id2;
288       EXEC SQL END DECLARE SECTION;
289
290       EXEC SQL FETCH csr116 INTO :id1, :id2;
291       if (sqlca.sqlcode)
292         break;
293       q++;
294       /*  If id2 is already stored, skip this row. */
295       i = (int)hash_lookup(string_dups, id2);
296       if (i > 0)
297         continue;
298       /*  Follow the chain of id1 equivalent IDs back to the lowest one. */
299       id = id1;
300       while ((tmp = (int)hash_lookup(string_dups, id)) > 0)
301         id = tmp;
302       hash_store(string_dups, id2, (void *)id);
303     }
304   EXEC SQL CLOSE csr116;
305   dprintf("found %d duplicates\n", q);
306   hash_step(string_dups, print_dup_map, NULL);
307   /* We don't want to delete the duplicates now because if the dbck
308      is cancelled, a LOT of state will be lost. So, we'll just let
309      them not get marked as used and then phase3 will clean them up */
310
311   dprintf("Loading strings...\n");
312   sq = sq_create();
313   strings = create_hash(75000);
314   if (!sq || !strings)
315     out_of_mem("loading strings");
316
317   EXEC SQL DECLARE csr101 CURSOR FOR
318     SELECT string_id, string FROM strings ORDER BY string_id;
319   EXEC SQL OPEN csr101;
320   q = 0;
321   while (1)
322     {
323       EXEC SQL BEGIN DECLARE SECTION;
324       int id;
325       char buf[STRINGS_STRING_SIZE];
326       EXEC SQL END DECLARE SECTION;
327
328       EXEC SQL FETCH csr101 INTO :id, :buf;
329       if (sqlca.sqlcode)
330         break;
331       q++;
332       s = malloc(sizeof(struct string));
333       if (!s)
334         out_of_mem("storing strings");
335       s->name = strdup(strtrim(buf));
336       s->string_id = id;
337       s->refc = 0;
338       retval = hash_store(strings, id, s);
339       if (retval == -1)
340         out_of_mem("storing strings in hash table");
341       else if (retval == 1) /* duplicate string_id */
342         {
343           sq_save_data(sq, hash_lookup(strings, id));
344           sq_save_data(sq, s);
345         }
346     }
347   EXEC SQL CLOSE csr101;
348   /* keep string id 0 (the empty string) even if unreferenced */
349   string_check(0);
350
351   printf("Loaded %d strings\n", q);
352
353   dprintf("Loading users...\n");
354   sq = sq_create();
355   users = create_hash(65000);
356   if (!sq || !users)
357     out_of_mem("loading users");
358
359   EXEC SQL DECLARE csr102 CURSOR FOR
360     SELECT users_id, login, last, first, status, potype, pop_id, box_id,
361     imap_id, exchange_id, modby, fmodby, pmodby, comments, sigwho, 
362     sponsor_type, sponsor_id
363     FROM users ORDER BY users_id;
364   EXEC SQL OPEN csr102;
365   while (1)
366     {
367       EXEC SQL BEGIN DECLARE SECTION;
368       char login[USERS_LOGIN_SIZE], nbuf[USERS_FIRST_SIZE + USERS_LAST_SIZE];
369       char last[USERS_LAST_SIZE], first[USERS_FIRST_SIZE];
370       char potype[USERS_POTYPE_SIZE], sponsor_type[USERS_SPONSOR_TYPE_SIZE];
371       int users_id, status, pop_id, box_id, imap_id, exchange_id, modby;
372       int fmodby, pmodby, comments, sigwho, sponsor_id;
373       EXEC SQL END DECLARE SECTION;
374
375       EXEC SQL FETCH csr102 INTO :users_id, :login, :last, :first,
376         :status, :potype, :pop_id, :box_id, :imap_id, :exchange_id, :modby, 
377         :fmodby, :pmodby, :comments, :sigwho, :sponsor_type, :sponsor_id;
378       if (sqlca.sqlcode)
379         break;
380
381       u = malloc(sizeof(struct user));
382       if (!u)
383         out_of_mem("storing users");
384       strcpy(u->login, strtrim(login));
385       u->potype = potype[0];
386       sprintf(nbuf, "%s, %s", strtrim(last), strtrim(first));
387       u->fullname = strdup(nbuf);
388       u->status = status;
389       u->users_id = users_id;
390       u->modby = modby;
391       u->fmodby = fmodby;
392       u->pmodby = pmodby;
393       u->comment = comments;
394       u->sigwho = sigwho;
395       u->sponsor_type = sponsor_type[0];
396       u->sponsor_id = sponsor_id;
397       switch (u->potype)
398         {
399         case 'P':
400           u->pobox_id = pop_id;
401           break;
402         case 'S':
403           /*  If potype is SMTP, box_id is a string_id for the strings tbl */
404           u->pobox_id = box_id;
405           break;
406         case 'I':
407           u->pobox_id = imap_id;
408           break;
409         case 'E':
410           u->pobox_id = exchange_id;
411         default:
412           u->pobox_id = 0;
413         }
414       retval = hash_store(users, users_id, u);
415       if (retval == -1)
416         out_of_mem("storing users in hash table");
417       else if (retval == 1)
418         {
419           sq_save_data(sq, hash_lookup(users, users_id));
420           sq_save_data(sq, u);
421         }
422     }
423   EXEC SQL CLOSE csr102;
424
425   generic_fix(sq, show_user_id, "Change ID", fix_user_id, 0);
426
427   if (!fast)
428     {
429       sq = sq_create();
430       if (!sq)
431         out_of_mem("finding duplicate logins");
432
433       EXEC SQL DECLARE csr103 CURSOR FOR
434         SELECT u1.users_id FROM users u1, users u2
435         WHERE u1.login = u2.login and u1.rowid != u2.rowid;
436       EXEC SQL OPEN csr103;
437       while (1)
438         {
439           EXEC SQL FETCH csr103 INTO :id;
440           if (sqlca.sqlcode)
441             break;
442           sq_save_data(sq, hash_lookup(users, id));
443         }
444       EXEC SQL CLOSE csr103;
445       handle_duplicate_logins(sq);
446     }
447
448   if (!fast)
449     {
450       dprintf("Scanning krbmap...\n");
451
452       EXEC SQL DECLARE csr113 CURSOR FOR
453         SELECT k1.users_id FROM krbmap k1, krbmap k2
454         WHERE k1.users_id = k2.users_id AND k1.rowid != k2.rowid;
455       EXEC SQL OPEN csr113;
456       while (1)
457         {
458           EXEC SQL FETCH csr113 INTO :id;
459           if (sqlca.sqlcode)
460             break;
461
462           printf("User %d is in the krbmap more than once!\n", id);
463           printf("Not fixing this error\n");
464         }
465       EXEC SQL CLOSE csr113;
466
467       EXEC SQL DECLARE csr114 CURSOR FOR
468         SELECT k1.string_id FROM krbmap k1, krbmap k2
469         WHERE k1.string_id = k2.string_id AND k1.rowid != k2.rowid;
470       EXEC SQL OPEN csr114;
471       while (1)
472         {
473           EXEC SQL FETCH csr114 INTO :id;
474           if (sqlca.sqlcode)
475             break;
476
477           printf("Principal %d is in the krbmap more than once!\n", id);
478           printf("Not fixing this error\n");
479         }
480       EXEC SQL CLOSE csr114;
481     }
482
483   dprintf("Loading machines...\n");
484   sq = sq_create();
485   machines = create_hash(20000);
486   if (!sq || !machines)
487     out_of_mem("loading machines");
488
489   EXEC SQL DECLARE csr104 CURSOR FOR
490     SELECT mach_id, name, snet_id, owner_type, owner_id,
491     acomment, ocomment, creator, modby
492     FROM machine ORDER BY mach_id;
493   EXEC SQL OPEN csr104;
494   while (1)
495     {
496       EXEC SQL BEGIN DECLARE SECTION;
497       int mach_id, snet_id, owner_id, acomment, ocomment, creator, modby;
498       char name[MACHINE_NAME_SIZE], owner_type[MACHINE_OWNER_TYPE_SIZE];
499       EXEC SQL END DECLARE SECTION;
500
501       EXEC SQL FETCH csr104 INTO :mach_id, :name, :snet_id,
502         :owner_type, :owner_id, :acomment, :ocomment, :creator, :modby;
503       if (sqlca.sqlcode)
504         break;
505
506       m = malloc(sizeof(struct machine));
507       if (!m)
508         out_of_mem("storing machines");
509       strcpy(m->name, strtrim(name));
510       m->owner_type = owner_type[0];
511       m->owner_id = owner_id;
512       m->snet_id = snet_id;
513       m->mach_id = mach_id;
514       m->clucount = 0;
515       m->acomment = acomment;
516       m->ocomment = ocomment;
517       m->creator = creator;
518       m->modby = modby;
519       retval = hash_store(machines, mach_id, m);
520       if (retval == -1)
521         out_of_mem("storing machines in hash table");
522       else if (retval == 1)
523         {
524           sq_save_data(sq, hash_lookup(machines, mach_id));
525           sq_save_data(sq, m);
526         }
527     }
528   EXEC SQL CLOSE csr104;
529   generic_fix(sq, show_mach_id, "Change ID", fix_mach_id, 0);
530
531   if (!fast)
532     {
533       EXEC SQL BEGIN DECLARE SECTION;
534       char name[HOSTALIAS_NAME_SIZE];
535       int id1, id2;
536       EXEC SQL END DECLARE SECTION;
537
538       sq = sq_create();
539       if (!sq)
540         out_of_mem("looking for duplicate machine names");
541
542       EXEC SQL DECLARE csr105 CURSOR FOR
543         SELECT m1.mach_id FROM machine m1, machine m2
544         WHERE m1.name = m2.name AND m1.rowid != m2.rowid;
545       EXEC SQL OPEN csr105;
546       while (1)
547         {
548           EXEC SQL FETCH csr105 INTO :id;
549           if (sqlca.sqlcode)
550             break;
551
552           sq_save_data(sq, hash_lookup(machines, id));
553         }
554       EXEC SQL CLOSE csr105;
555       generic_fix(sq, show_mach_name, "Change name", cant_fix, 0);
556
557       EXEC SQL DECLARE csr_hal1 CURSOR FOR
558         SELECT h1.name, m1.mach_id, m2.mach_id
559         FROM hostalias h1, machine m1, hostalias h2, machine m2
560         WHERE h1.name = h2.name AND h1.mach_id != h2.mach_id
561         AND m1.mach_id = h1.mach_id AND m2.mach_id = h2.mach_id;
562       EXEC SQL OPEN csr_hal1;
563       while (1)
564         {
565           EXEC SQL FETCH csr_hal1 INTO :name, :id1, :id2;
566           if (sqlca.sqlcode)
567             break;
568           printf("Aliases for machines %d and %d have duplicate name %s\n",
569                  id1, id2, strtrim(name));
570           cant_fix(0);
571         }
572       EXEC SQL CLOSE csr_hal1;
573
574       EXEC SQL DECLARE csr_hal2 CURSOR FOR
575         SELECT h1.name, m1.mach_id, m2.mach_id
576         FROM hostalias h1, machine m1, machine m2
577         WHERE h1.name = m1.name AND h1.mach_id = m2.mach_id;
578       EXEC SQL OPEN csr_hal2;
579         while (1)
580           {
581             EXEC SQL FETCH csr_hal2 INTO :name, :id1, :id2;
582             if (sqlca.sqlcode)
583               break;
584             printf("Machine %d has alias %s that conflicts with machine %d\n",
585                    id2, strtrim(name), id1);
586             cant_fix(0);
587           }
588         EXEC SQL CLOSE csr_hal2;
589     }
590
591   dprintf("Loading subnets...\n");
592   subnets = create_hash(254);
593   if (!subnets)
594     out_of_mem("loading subnets");
595
596   EXEC SQL DECLARE csr115 CURSOR FOR
597     SELECT snet_id, name, owner_type, owner_id, modby from subnet;
598   EXEC SQL OPEN csr115;
599   while (1)
600     {
601       EXEC SQL BEGIN DECLARE SECTION;
602       char name[SUBNET_NAME_SIZE], owner_type[SUBNET_OWNER_TYPE_SIZE];
603       int snet_id, owner_id, modby;
604       EXEC SQL END DECLARE SECTION;
605
606       EXEC SQL FETCH csr115 INTO :snet_id, :name, :owner_type,
607         :owner_id, :modby;
608       if (sqlca.sqlcode)
609         break;
610
611       sn = malloc(sizeof(struct machine));
612       if (!sn)
613         out_of_mem("storing subnets");
614       strcpy(sn->name, strtrim(name));
615       sn->owner_type = owner_type[0];
616       sn->owner_id = owner_id;
617       sn->snet_id = snet_id;
618       sn->modby = modby;
619       retval = hash_store(subnets, snet_id, sn);
620       if (retval == -1)
621         out_of_mem("storing subnets in hash table");
622       else if (retval == 1)
623         {
624           printf("Duplicate subnet ID: %d (%s)\n", id, name);
625           /* should add code to delete */
626           cant_fix(0);
627         }
628     }
629   EXEC SQL CLOSE csr115;
630
631   if (!fast)
632     {
633       sq = sq_create();
634       if (!sq)
635         out_of_mem("looking for duplicate subnet names");
636
637       EXEC SQL DECLARE csr117 CURSOR FOR
638         SELECT s1.snet_id FROM subnet s1, subnet s2
639         WHERE s1.name = s2.name AND s1.rowid != s2.rowid;
640       EXEC SQL OPEN csr117;
641       while (1)
642         {
643           EXEC SQL FETCH csr117 INTO :id;
644           if (sqlca.sqlcode)
645             break;
646
647           sq_save_data(sq, hash_lookup(subnets, id));
648         }
649       EXEC SQL CLOSE csr117;
650       generic_fix(sq, show_snet_name, "Change name", cant_fix, 0);
651     }
652
653   dprintf("Loading clusters...\n");
654   sq = sq_create();
655   clusters = create_hash(100);
656   if (!sq || !clusters)
657     out_of_mem("loading clusters");
658
659   EXEC SQL DECLARE csr106 CURSOR FOR
660     SELECT clu_id, name, modby FROM clusters;
661   EXEC SQL OPEN csr106;
662   while (1)
663     {
664       EXEC SQL BEGIN DECLARE SECTION;
665       int clu_id, modby;
666       char name[CLUSTERS_NAME_SIZE];
667       EXEC SQL END DECLARE SECTION;
668
669       EXEC SQL FETCH csr106 INTO :clu_id, :name, :modby;
670       if (sqlca.sqlcode)
671         break;
672
673       c = malloc(sizeof(struct cluster));
674       if (!c)
675         out_of_mem("storing clusters");
676       strcpy(c->name, strtrim(name));
677       c->clu_id = clu_id;
678       c->modby = modby;
679       retval = hash_store(clusters, clu_id, c);
680       if (retval == -1)
681         out_of_mem("storing clusters in hash table");
682       else if (retval == 1)
683         {
684           sq_save_data(sq, hash_lookup(clusters, clu_id));
685           sq_save_data(sq, c);
686         }
687     }
688   EXEC SQL CLOSE csr106;
689   generic_fix(sq, show_clu_id, "Change ID", fix_clu_id, 0);
690
691   if (!fast)
692     {
693       sq = sq_create();
694       if (!sq)
695         out_of_mem("looking for duplicate cluster names");
696
697       EXEC SQL DECLARE csr107 CURSOR FOR
698         SELECT c1.clu_id FROM clusters c1, clusters c2
699         WHERE c1.name = c2.name AND c1.rowid != c2.rowid;
700       EXEC SQL OPEN csr107;
701       while (1)
702         {
703           EXEC SQL FETCH csr107 INTO :id;
704           if (sqlca.sqlcode)
705             break;
706
707           sq_save_data(sq, hash_lookup(clusters, id));
708         }
709       EXEC SQL CLOSE csr107;
710       generic_fix(sq, show_clu_name, "Change name", cant_fix, 0);
711     }
712
713   dprintf("Loading lists...\n");
714   sq = sq_create();
715   lists = create_hash(50000);
716   if (!sq || !lists)
717     out_of_mem("loading lists");
718
719   EXEC SQL DECLARE csr108 CURSOR FOR
720     SELECT list_id, name, acl_id, acl_type, memacl_id, memacl_type, modby
721     FROM list
722     ORDER BY list_id;
723   EXEC SQL OPEN csr108;
724   while (1)
725     {
726       EXEC SQL BEGIN DECLARE SECTION;
727       int list_id, acl_id, memacl_id, modby;
728       char name[LIST_NAME_SIZE], acl_type[LIST_ACL_TYPE_SIZE];
729       char memacl_type[LIST_ACL_TYPE_SIZE];
730       EXEC SQL END DECLARE SECTION;
731
732       EXEC SQL FETCH csr108 INTO :list_id, :name, :acl_id, :acl_type, 
733         :memacl_id, :memacl_type, :modby;
734       if (sqlca.sqlcode)
735         break;
736       l = malloc(sizeof(struct list));
737       if (!l)
738         out_of_mem("storing lists");
739       strcpy(l->name, strtrim(name));
740       l->acl_type = acl_type[0];
741       l->acl_id = acl_id;
742       l->memacl_type = memacl_type[0];
743       l->memacl_id = memacl_id;
744       l->list_id = list_id;
745       l->modby = modby;
746       l->members = 0;
747       retval = hash_store(lists, list_id, l);
748       if (retval == -1)
749         out_of_mem("storing lists in hash table");
750       else if (retval == 1)
751         {
752           sq_save_data(sq, hash_lookup(lists, list_id));
753           sq_save_data(sq, l);
754         }
755     }
756   EXEC SQL CLOSE csr108;
757   generic_fix(sq, show_list_id, "Change ID", fix_list_id, 0);
758
759   if (!fast)
760     {
761       sq = sq_create();
762       if (!sq)
763         out_of_mem("looking for duplicate list names");
764
765       EXEC SQL DECLARE csr109 CURSOR FOR
766         SELECT l1.list_id FROM list l1, list l2
767         WHERE l1.name = l2.name AND l1.rowid != l2.rowid;
768       EXEC SQL OPEN csr109;
769       while (1)
770         {
771           EXEC SQL FETCH csr109 INTO :id;
772           if (sqlca.sqlcode)
773             break;
774
775           sq_save_data(sq, hash_lookup(lists, id));
776         }
777       EXEC SQL CLOSE csr109;
778       generic_fix(sq, show_list_name, "Change name", cant_fix, 0);
779     }
780
781   dprintf("Loading filesys...\n");
782   sq = sq_create();
783   filesys = create_hash(30000);
784   if (!sq || !filesys)
785     out_of_mem("loading filesys");
786
787   EXEC SQL DECLARE csr110 CURSOR FOR
788     SELECT filsys_id, label, owner, owners, phys_id, mach_id,
789     type, name, modby FROM filesys ORDER BY filsys_id;
790   EXEC SQL OPEN csr110;
791   while (1)
792     {
793       EXEC SQL BEGIN DECLARE SECTION;
794       int filsys_id, owner, owners, phys_id, mach_id, modby;
795       char label[FILESYS_LABEL_SIZE], type[FILESYS_TYPE_SIZE];
796       char name[FILESYS_NAME_SIZE];
797       EXEC SQL END DECLARE SECTION;
798
799       EXEC SQL FETCH csr110 INTO :filsys_id, :label, :owner, :owners,
800         :phys_id, :mach_id, :type, :name, :modby;
801       if (sqlca.sqlcode)
802         break;
803
804       f = malloc(sizeof(struct filesys));
805       if (!f)
806         out_of_mem("storing filesystems");
807       strcpy(f->name, strtrim(label));
808       strcpy(f->dir, strtrim(name));
809       f->filsys_id = filsys_id;
810       f->owner = owner;
811       f->owners = owners;
812       f->phys_id = phys_id;
813       f->mach_id = mach_id;
814       f->type = type[0];
815       retval = hash_store(filesys, filsys_id, f);
816       if (retval == -1)
817         out_of_mem("storing filesys in hash table");
818       else if (retval == 1)
819         {
820           sq_save_data(sq, hash_lookup(filesys, filsys_id));
821           sq_save_data(sq, f);
822         }
823     }
824   EXEC SQL CLOSE csr110;
825
826   generic_fix(sq, show_fs_id, "Change ID", fix_fs_id, 0);
827
828   if (!fast)
829     {
830       sq = sq_create();
831       if (!sq)
832         out_of_mem("looking for duplicate filesys names");
833
834       EXEC SQL DECLARE csr118 CURSOR FOR
835         SELECT fs1.filsys_id FROM filesys fs1, filesys fs2
836         WHERE fs1.label = fs2.label AND fs1.rowid != fs2.rowid;
837       EXEC SQL OPEN csr118;
838       while (1)
839         {
840           EXEC SQL FETCH csr118 INTO :id;
841           if (sqlca.sqlcode)
842             break;
843
844           sq_save_data(sq, hash_lookup(filesys, id));
845         }
846       EXEC SQL CLOSE csr118;
847       generic_fix(sq, show_fs_name, "Change name", cant_fix, 0);
848     }
849
850   dprintf("Loading nfsphys...\n");
851   sq = sq_create();
852   nfsphys = create_hash(500);
853   if (!sq || !nfsphys)
854     out_of_mem("loading nfsphs");
855
856   EXEC SQL DECLARE csr111 CURSOR FOR
857     SELECT nfsphys_id, dir, mach_id, TO_CHAR(allocated), modby FROM nfsphys;
858   EXEC SQL OPEN csr111;
859   while (1)
860     {
861       EXEC SQL BEGIN DECLARE SECTION;
862       int nfsphys_id, mach_id, modby;
863       char dir[NFSPHYS_DIR_SIZE];
864       char allocated[39];
865       EXEC SQL END DECLARE SECTION;
866
867       EXEC SQL FETCH csr111 INTO :nfsphys_id, :dir, :mach_id,
868         :allocated, :modby;
869       if (sqlca.sqlcode)
870         break;
871
872       n = malloc(sizeof(struct nfsphys));
873       if (!n)
874         out_of_mem("storing nfsphys");
875       strcpy(n->dir, strtrim(dir));
876       n->mach_id = mach_id;
877       n->nfsphys_id = nfsphys_id;
878       n->allocated = strtoull(allocated, NULL, 0);
879       n->modby = modby;
880       n->count = 0;
881       retval = hash_store(nfsphys, nfsphys_id, n);
882       if (retval == -1)
883         out_of_mem("storing nfsphys in hash table");
884       else if (retval == 1)
885         {
886           sq_save_data(sq, hash_lookup(nfsphys, nfsphys_id));
887           sq_save_data(sq, n);
888         }
889     }
890   EXEC SQL CLOSE csr111;
891
892   generic_fix(sq, show_np_id, "Change ID", fix_np_id, 0);
893
894   if (!fast)
895     {
896       dprintf("Checking printers...\n");
897
898       EXEC SQL DECLARE csr119 CURSOR FOR
899         SELECT p1.name FROM printers p1, printers p2
900         WHERE ( p1.name = p2.name AND p1.rowid < p2.rowid )
901         OR ( p1.name = p2.duplexname );
902       EXEC SQL OPEN csr119;
903       while (1)
904         {
905           EXEC SQL BEGIN DECLARE SECTION;
906           char name[PRINTERS_NAME_SIZE];
907           EXEC SQL END DECLARE SECTION;
908
909           EXEC SQL FETCH csr119 INTO :name;
910           if (sqlca.sqlcode)
911             break;
912
913           printf("Printer %s has duplicate name\n", name);
914           cant_fix(0);
915         }
916       EXEC SQL CLOSE csr119;
917     }
918
919   dprintf("Loading printservers...\n");
920   printservers = create_hash(100);
921   if (!printservers)
922     out_of_mem("loading printservers");
923
924   EXEC SQL DECLARE csr_ps CURSOR FOR
925     SELECT mach_id, printer_types, owner_type, owner_id, lpc_acl, modby
926     FROM printservers;
927   EXEC SQL OPEN csr_ps;
928   while (1)
929     {
930       EXEC SQL BEGIN DECLARE SECTION;
931       int mach_id, printer_types, owner_id, lpc_acl, modby;
932       char owner_type[PRINTSERVERS_OWNER_TYPE_SIZE];
933       EXEC SQL END DECLARE SECTION;
934
935       EXEC SQL FETCH csr_ps INTO :mach_id, :printer_types, :owner_type,
936         :owner_id, :lpc_acl, :modby;
937       if (sqlca.sqlcode)
938         break;
939
940       ps = malloc(sizeof(struct printserver));
941       if (!ps)
942         out_of_mem("storing printserver");
943       ps->mach_id = mach_id;
944       ps->printer_types = printer_types;
945       ps->owner_type = owner_type[0];
946       ps->owner_id = owner_id;
947       ps->lpc_acl = lpc_acl;
948       ps->modby = modby;
949       retval = hash_store(printservers, mach_id, ps);
950       if (retval == -1)
951         out_of_mem("storing printserver in hash table");
952       else if (retval == 1)
953         {
954           printf("Duplicate printserver mach_id %d\n", mach_id);
955           cant_fix(0);
956         }
957     }
958   EXEC SQL CLOSE csr_ps;
959
960   if (!fast)
961     {
962       dprintf("Checking zephyr...\n");
963       
964       EXEC SQL DECLARE csr120 CURSOR FOR
965         SELECT z1.class FROM zephyr z1, zephyr z2
966         WHERE (z1.class = z2.class AND z1.rowid < z1.rowid);
967       EXEC SQL OPEN csr120;
968       while (1)
969         {
970           EXEC SQL BEGIN DECLARE SECTION;
971           char class[ZEPHYR_CLASS_SIZE];
972           EXEC SQL END DECLARE SECTION;
973
974           EXEC SQL FETCH csr120 INTO :class;
975           if (sqlca.sqlcode)
976             break;
977
978           printf("Zephyr class %s has duplicate name\n", class);
979           cant_fix(0);
980         }
981       EXEC SQL CLOSE csr120;
982     }
983
984   dprintf("Loading containers...\n");
985   containers = create_hash(1000);
986   if (!containers)
987     out_of_mem("loading containers");
988
989   EXEC SQL DECLARE csr_cnts CURSOR FOR
990     SELECT name, cnt_id, list_id, acl_type, acl_id, memacl_type, memacl_id,
991     modby FROM containers;
992   EXEC SQL OPEN csr_cnts;
993   while (1)
994     {
995       EXEC SQL BEGIN DECLARE SECTION;
996       int cnt_id, list_id, acl_id, memacl_id, modby;
997       char name[CONTAINERS_NAME_SIZE];
998       char acl_type[CONTAINERS_ACL_TYPE_SIZE];
999       char memacl_type[CONTAINERS_MEMACL_TYPE_SIZE];
1000       EXEC SQL END DECLARE SECTION;
1001
1002       EXEC SQL FETCH csr_cnts INTO :name, :cnt_id, :list_id, :acl_type,
1003         :acl_id, :memacl_type, :memacl_id, :modby;
1004       if (sqlca.sqlcode)
1005         break;
1006
1007       cnt = malloc(sizeof(struct container));
1008       if (!cnt)
1009         out_of_mem("storing container");
1010       strcpy(cnt->name, strtrim(name));
1011       cnt->cnt_id = cnt_id;
1012       cnt->list_id = list_id;
1013       cnt->acl_type = acl_type[0];
1014       cnt->acl_id = acl_id;
1015       cnt->memacl_type = memacl_type[0];
1016       cnt->memacl_id = memacl_id;
1017       cnt->modby = modby;
1018       retval = hash_store(containers, cnt_id, cnt);
1019       if (retval == -1)
1020         out_of_mem("storing container in hash table");
1021       else if (retval == 1)
1022         {
1023           printf("Duplicate container cnt_id %d\n", cnt_id);
1024           cant_fix(0);
1025         }
1026     }
1027   EXEC SQL CLOSE csr_cnts;
1028
1029   if (!fast)
1030     {
1031       sq = sq_create();
1032       if (!sq)
1033         out_of_mem("looking for duplicate container names");
1034
1035       EXEC SQL DECLARE csr121 CURSOR FOR
1036         SELECT cnt1.cnt_id FROM containers cnt1, containers cnt2
1037         WHERE cnt1.name = cnt2.name AND cnt1.cnt_id != cnt2.cnt_id;
1038       EXEC SQL OPEN csr121;
1039       while (1)
1040         {
1041           EXEC SQL FETCH csr121 INTO :id;
1042           if (sqlca.sqlcode)
1043             break;
1044
1045           sq_save_data(sq, hash_lookup(containers, id));
1046         }
1047       EXEC SQL CLOSE csr121;
1048       generic_fix(sq, show_cnt_name, "Change name", cant_fix, 0);
1049     }
1050 }
This page took 0.228024 seconds and 5 git commands to generate.