source: trunk/third/moira/dbck/phase1.pc @ 24250

Revision 24250, 27.2 KB checked in by broder, 15 years ago (diff)
New Moira snapshot from subversion. Sorry for the large diff - looks like all of the keywords changed in the SVN import process.
Line 
1/* $Id: phase1.pc,v 1.17 2009-12-29 17:29:28 zacheiss Exp $
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>
15EXEC SQL INCLUDE sqlca;
16
17RCSID("$Header: /afs/.athena.mit.edu/astaff/project/moiradev/repository/moira/dbck/phase1.pc,v 1.17 2009-12-29 17:29:28 zacheiss Exp $");
18
19EXEC SQL WHENEVER SQLERROR DO dbmserr();
20int show_user_id(void *user);
21void handle_duplicate_logins(struct save_queue *sq);
22void fix_user_id(void *user);
23void cant_fix(void *id);
24int show_mach_id(void *machine);
25int show_mach_name(void *machine);
26void fix_mach_id(void *machine);
27int show_snet_name(void *subnet);
28int show_clu_id(void *cluster);
29int show_clu_name(void *cluster);
30void fix_clu_id(void *cluster);
31int show_list_id(void *list);
32int show_list_name(void *list);
33void fix_list_id(void *list);
34int show_fs_id(void *filesys);
35void fix_fs_id(void *filesys);
36int show_fs_name(void *fs);
37int show_np_id(void *nfsphys);
38void fix_np_id(void *nfsphys);
39int show_str_id(void *string);
40int print_str_id(void *id);
41void print_dup_map(int key, void *data, void *hint);
42int show_cnt_name(void *cnt);
43
44int 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
52void 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
102void 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
110void cant_fix(void *id)
111{
112  printf("Sorry, don't know how to fix that\n");
113}
114
115int 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
122int 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
129void 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
136int 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
143int 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
150int 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
157void 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
163int 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
170int 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
177void 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
183int 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
190void 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
197int 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
204int 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
213void 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
220int 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
227int print_str_id(void *id)
228{
229  printf("String %d is a duplicate\n", (int)(long)id);
230  return 0;
231}
232
233void print_dup_map(int key, void *data, void *hint)
234{
235  printf("String %d is a duplicate of string %d\n", key, (int)(long)data);
236}
237
238int 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
245void 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)(long)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)(long)hash_lookup(string_dups, id)) > 0)
301        id = tmp;
302      hash_store(string_dups, id2, (void *)(long)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}
Note: See TracBrowser for help on using the repository browser.