[24319] | 1 | /* $Id: phase1.pc 3956 2010-01-05 20:56:56Z zacheiss $ |
---|
[23095] | 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 | |
---|
[24319] | 17 | RCSID("$HeadURL: svn+ssh://svn.mit.edu/moira/trunk/moira/dbck/phase1.pc $ $Id: phase1.pc 3956 2010-01-05 20:56:56Z zacheiss $"); |
---|
[23095] | 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 | { |
---|
[24250] | 229 | printf("String %d is a duplicate\n", (int)(long)id); |
---|
[23095] | 230 | return 0; |
---|
| 231 | } |
---|
| 232 | |
---|
| 233 | void print_dup_map(int key, void *data, void *hint) |
---|
| 234 | { |
---|
[24250] | 235 | printf("String %d is a duplicate of string %d\n", key, (int)(long)data); |
---|
[23095] | 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. */ |
---|
[24250] | 295 | i = (int)(long)hash_lookup(string_dups, id2); |
---|
[23095] | 296 | if (i > 0) |
---|
| 297 | continue; |
---|
| 298 | /* Follow the chain of id1 equivalent IDs back to the lowest one. */ |
---|
| 299 | id = id1; |
---|
[24250] | 300 | while ((tmp = (int)(long)hash_lookup(string_dups, id)) > 0) |
---|
[23095] | 301 | id = tmp; |
---|
[24250] | 302 | hash_store(string_dups, id2, (void *)(long)id); |
---|
[23095] | 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, |
---|
[23178] | 361 | imap_id, exchange_id, modby, fmodby, pmodby, comments, sigwho, |
---|
| 362 | sponsor_type, sponsor_id |
---|
[23095] | 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]; |
---|
[23178] | 371 | int users_id, status, pop_id, box_id, imap_id, exchange_id, modby; |
---|
| 372 | int fmodby, pmodby, comments, sigwho, sponsor_id; |
---|
[23095] | 373 | EXEC SQL END DECLARE SECTION; |
---|
| 374 | |
---|
| 375 | EXEC SQL FETCH csr102 INTO :users_id, :login, :last, :first, |
---|
[23178] | 376 | :status, :potype, :pop_id, :box_id, :imap_id, :exchange_id, :modby, |
---|
| 377 | :fmodby, :pmodby, :comments, :sigwho, :sponsor_type, :sponsor_id; |
---|
[23095] | 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; |
---|
[23178] | 409 | case 'E': |
---|
| 410 | u->pobox_id = exchange_id; |
---|
[23095] | 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 | } |
---|