]> andersk Git - moira.git/blobdiff - dbck/phase2.dc
DBMS=ORACLE
[moira.git] / dbck / phase2.dc
index c5b977bc3abf97529851f6e31e33cfe6908d3d51..f63fc56284958975366d102be5d5e1b3ab6a851d 100644 (file)
@@ -13,6 +13,7 @@ EXEC SQL INCLUDE sqlca;
 
 static char phase2_qc_rcsid[] = "$Header$";
 
+EXEC SQL WHENEVER SQLERROR DO dbmserr();
 
 show_mcm_mach(id)
 int id;
@@ -23,20 +24,16 @@ int id;
     EXEC SQL END DECLARE SECTION; 
 
     EXEC SQL DECLARE csr201 CURSOR FOR
-      SELECT cluster.name FROM cluster, mcmap
-        WHERE cluster.clu_id=mcmap.clu_id AND mcmap.mach_id = :iid;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT clusters.name FROM clusters, mcmap
+        WHERE clusters.clu_id=mcmap.clu_id AND mcmap.mach_id = :iid;
     EXEC SQL OPEN csr201;
     while(1) {
        EXEC SQL FETCH csr201 INTO :name;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        strtrim(name);
        found = 0;
-       printf("Clusqter %s, non-existant machine %d in cluster map\n", name, id);
+       printf("Cluster %s, non-existant machine %d in cluster map\n", name, id);
     }
     EXEC SQL CLOSE csr201; 
     return(found);
@@ -51,18 +48,15 @@ int id;
     EXEC SQL END DECLARE SECTION; 
 
     EXEC SQL DECLARE csr202 CURSOR FOR
-       SELECT machine.name FROM machine, mcmap
-           WHERE machine.mach_id=mcmap.mach_id AND mcmap.clu_id=:iid;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+        SELECT machine.name FROM machine, mcmap
+        WHERE machine.mach_id=mcmap.mach_id AND mcmap.clu_id=:iid;
     EXEC SQL OPEN csr202;
     while(1) {
        EXEC SQL FETCH csr202 INTO :name;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        strtrim(name);
+
        found = 0;
        printf("Machine %s, non-existant cluster %d in cluster map\n", name, id);
     }
@@ -70,35 +64,288 @@ int id;
     return(found);
 }
 
+show_hostalias(id)
+int id;
+{
+    EXEC SQL BEGIN DECLARE SECTION; 
+    int iid = id, found = 1;
+    char name[33];
+    EXEC SQL END DECLARE SECTION; 
+
+    EXEC SQL DECLARE csr234 CURSOR FOR
+      SELECT name FROM hostalias WHERE mach_id=:iid;
+    EXEC SQL OPEN csr234;
+    while(1) {
+       EXEC SQL FETCH csr234 INTO :name;
+       if (sqlca.sqlcode != 0) break; 
+
+       strtrim(name);
+
+       found = 0;
+       printf("Alias %s, non-existant machine %d in hostalias map\n", name, id);
+    }
+    EXEC SQL CLOSE csr234;
+    return(found);
+}
+
+show_pcap_mach(id)
+int id;
+{
+    EXEC SQL BEGIN DECLARE SECTION; 
+    int iid = id, found = 1;
+    char name[33];
+    EXEC SQL END DECLARE SECTION; 
+
+    EXEC SQL DECLARE csr235 CURSOR FOR
+      SELECT name FROM printcap WHERE mach_id=:iid;
+    EXEC SQL OPEN csr235;
+    while(1) {
+       EXEC SQL FETCH csr235 INTO :name;
+       if (sqlca.sqlcode != 0) break; 
+
+       strtrim(name);
+
+       found = 0;
+       printf("Printer %s, non-existant spool machine %d in printcap table\n", name, id);
+    }
+    EXEC SQL CLOSE csr235;
+    return(found);
+}
+
+show_pcap_quota(id)
+int id;
+{
+    EXEC SQL BEGIN DECLARE SECTION; 
+    int iid = id, found = 1;
+    char name[33];
+    EXEC SQL END DECLARE SECTION; 
+
+    EXEC SQL DECLARE csr236 CURSOR FOR
+      SELECT name FROM printcap WHERE quotaserver=:iid;
+    EXEC SQL OPEN csr236;
+    while(1) {
+       EXEC SQL FETCH csr236 INTO :name;
+       if (sqlca.sqlcode != 0) break; 
+
+       strtrim(name);
+
+       found = 0;
+       printf("Printer %s, non-existant quota server %d in printcap table\n", name, id);
+    }
+    EXEC SQL CLOSE csr236;
+    return(found);
+}
+
+user_check(id, u, hint)
+     int id;
+     struct user *u;
+     int hint;
+{
+  u->comment=maybe_fixup_unref_string(u->comment, id, u->login, "users",
+                                     "comments", "users_id");
+
+  u->modby=maybe_fixup_modby(u->modby, id, u->login, "users",
+                            "modby", "users_id");
+
+  u->fmodby=maybe_fixup_modby(u->fmodby, id, u->login, "users",
+                             "fmodby", "users_id");
+
+  u->pmodby=maybe_fixup_modby(u->pmodby, id, u->login, "users",
+                             "pmodby", "users_id");
+
+  u->sigwho=maybe_fixup_unref_string(u->sigwho, id, u->login, "users",
+                                    "sigwho", "users_id");
+  
+  pobox_check(id, u, hint);
+}
+
+maybe_fixup_unref_string(sid, oid, oname, table, field, idfield)
+     int sid, oid;
+     char *oname, *table;
+     char *field, *idfield;
+{
+  int ret=(sid<0)?-sid:sid, doit=0, newid;
+  EXEC SQL BEGIN DECLARE SECTION;
+  int rowcount;
+  char stmt_buf[500];
+  EXEC SQL END DECLARE SECTION;
+  
+  if(newid=int_hash_lookup(string_dups, ret)) {
+    printf("%s entry %s(%d) has a %s with duplicate string %d\n",
+          table, oname, oid, field, ret);
+    if(single_fix("Replace duplicate", 0)){
+      ret = newid;
+      string_check(newid);
+      doit=1;
+    }
+  } else if(!string_check(ret)) {
+    printf("%s entry %s(%d) has a %s with non-existant string %d\n",
+          table, oname, oid, field, ret);
+    if (single_fix("Delete", 1)) {
+      ret=0;
+      doit=1;
+    }
+  }
+
+  if(doit){
+    sprintf(stmt_buf, "UPDATE %s SET %s = %d WHERE %s = %d",
+           table, field, (sid<0)?-ret:ret, idfield, oid);
+    EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
+    rowcount = sqlca.sqlerrd[2];
+    if (rowcount == 1)
+      printf("Fixed\n");
+    else
+      printf("Not fixed, rowcount = %d\n", rowcount);
+    modified(table);
+  }
+
+  return((sid<0)?-ret:ret);
+
+}
+
+maybe_fixup_modby(sid, oid, oname, table, field, idfield)
+     int sid, oid;
+     char *oname, *table;
+     char *field, *idfield;
+{
+  EXEC SQL BEGIN DECLARE SECTION;
+  char stmt_buf[500];
+  int rowcount;
+  EXEC SQL END DECLARE SECTION;
+
+  if(sid<0)
+    return maybe_fixup_unref_string(sid, oid, oname, table, field, idfield);
+  else {
+    if(!hash_lookup(users, sid)) {
+      printf("%s entry %s(%d) has a %s with non-existant user %d\n",
+            table, oname, oid, field, sid);
+      if (single_fix("Delete", 1)) {
+       sprintf(stmt_buf, "UPDATE %s SET %s = %d WHERE %s=%d",
+               table, field, 0, idfield, oid);
+       EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
+       rowcount = sqlca.sqlerrd[2];
+       if (rowcount == 1)
+         printf("Fixed\n");
+       else
+         printf("Not fixed, rowcount = %d\n", rowcount);
+       modified(table);
+      }
+      return 0;
+    }
+  }
+  return sid;
+}
+
+maybe_fixup_unref_string2(table, field, cursor, sid)
+     int sid;
+     char *field, *table, *cursor;
+{
+  int ret=(sid<0)?-sid:sid, doit=0, newid;
+  EXEC SQL BEGIN DECLARE SECTION;
+  int rowcount;
+  char stmt_buf[500];
+  EXEC SQL END DECLARE SECTION;
+  
+  if(newid=int_hash_lookup(string_dups, ret)) {
+    printf("%s entry has a %s with duplicate string %d\n",
+          table, field, ret);
+    if(single_fix("Replace duplicate", 0)){
+      ret = newid;
+      string_check(newid);
+      doit=1;
+    }
+  } else if(!string_check(ret)) {
+    printf("%s entry has a %s with non-existant string %d\n",
+          table, field, ret);
+    if (single_fix("Delete", 1)) {
+      ret=0;
+      doit=1;
+    }
+  }
+
+  if(doit){
+    sprintf(stmt_buf, "UPDATE %s SET %s = %d WHERE CURRENT OF %s",
+           table, field, (sid<0)?-ret:ret, cursor);
+    EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
+    rowcount = sqlca.sqlerrd[2];
+    if (rowcount == 1)
+      printf("Fixed\n");
+    else
+      printf("Not fixed, rowcount = %d\n", rowcount);
+    modified(table);
+  }
+  return((sid<0)?-ret:ret);
+}
+
+maybe_fixup_modby2(table, field, cursor, id)
+{
+  EXEC SQL BEGIN DECLARE SECTION;
+  char stmt_buf[500];
+  int rowcount;
+  EXEC SQL END DECLARE SECTION;
+
+  if(id<0) return maybe_fixup_unref_string2(table, field, cursor, id);
+  else {
+    if(!hash_lookup(users, id)) {
+      printf("%s entry has a %s with non-existant user %d\n",
+            table, field, id);
+      if (single_fix("Delete", 1)) {
+       sprintf(stmt_buf, "UPDATE %s SET %s = %d WHERE CURRENT OF %s",
+               table, field, 0, cursor);
+       EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
+       rowcount = sqlca.sqlerrd[2];
+       if (rowcount == 1)
+         printf("Fixed\n");
+       else
+         printf("Not fixed, rowcount = %d\n", rowcount);
+       modified(table);
+      }
+      return 0;
+    }
+  }
+  return 1;
+}
+
 pobox_check(id, u, hint)
 int id;
 struct user *u;
 int hint;
 {
-    switch (u->potype) {
-    case 'P':
-       if (!hash_lookup(machines, u->pobox_id)) {
-           printf("User %s(%s) has P.O.Box on non-existant machine %d\n",
-                  u->login, u->fullname, u->pobox_id);
-           if (single_fix("Delete", 0)) {
-               remove_pobox(u->users_id);
-               u->potype = 'N';
-           }
-       }
-       break;
-    case 'S':
-       if (!string_check(u->pobox_id)) {
-           printf("User %s(%s) has P.O.Box with non-existant string %d\n",
-                  u->login, u->fullname, u->pobox_id);
-           if (single_fix("Delete", 0)) {
-               remove_pobox(u->users_id);
-               u->potype = 'N';
-           }
-       }
-       break;
-    default:
-       ;
+  switch (u->potype) {
+  case 'P':
+    if (!hash_lookup(machines, u->pobox_id)) {
+      printf("User %s(%s) has P.O.Box on non-existant machine %d\n",
+            u->login, u->fullname, u->pobox_id);
+      if (single_fix("Delete", 0)) {
+       remove_pobox(u->users_id);
+       u->potype = 'N';
+      }
+    }
+    break;
+  case 'S':
+    if( int_hash_lookup( string_dups, u->pobox_id ) ) {
+      printf("User %s(%s) has P.O.Box with duplicate string %d\n",
+            u->login, u->fullname, u->pobox_id);
+      if(single_fix("Update", 0)){
+       printf("Replacing box_id dup string ID %d with %d\n",
+              u->pobox_id,
+              int_hash_lookup(string_dups, u->pobox_id));
+       u->pobox_id = int_hash_lookup( string_dups, u->pobox_id );
+       fix_smtp_pobox(u->users_id, u->pobox_id);
+       string_check(u->pobox_id);
+      }
+    } else if (!string_check(u->pobox_id)) {
+      printf("User %s(%s) has P.O.Box with non-existant string %d\n",
+            u->login, u->fullname, u->pobox_id);
+      if (single_fix("Delete", 0)) {
+       remove_pobox(u->users_id);
+       u->potype = 'N';
+      }
     }
+    break;
+  default:
+    ;
+  }
 }
 
 
@@ -110,7 +357,7 @@ int id;
     EXEC SQL END DECLARE SECTION; 
 
     EXEC SQL UPDATE users SET potype='NONE' WHERE users.users_id = :iid;
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s removed\n", rowcount, rowcount==1?"y":"ies");
     else
@@ -118,6 +365,169 @@ int id;
     modified("users");
 }
 
+fix_smtp_pobox(id, sid)
+int id, sid;
+{
+    EXEC SQL BEGIN DECLARE SECTION; 
+    int rowcount, iid = id, isid=sid;
+    EXEC SQL END DECLARE SECTION; 
+
+    EXEC SQL UPDATE users SET box_id=:isid WHERE users.users_id = :iid;
+    rowcount = sqlca.sqlerrd[2];
+    if (rowcount > 0)
+      printf("%d entr%s updated\n", rowcount, rowcount==1?"y":"ies");
+    else
+      printf("Not updated\n");
+    modified("users");
+}
+
+mach_check(id, m, hint)
+int id;
+struct machine *m;
+int hint;
+{
+    if (!hash_lookup(subnets, m->snet_id)) {
+       printf("Machine %s is on a non-existant subnet %d\n",
+              m->name, m->snet_id);
+       if (single_fix("Move to null-subnet", 1)) {
+           EXEC SQL BEGIN DECLARE SECTION; 
+           int rowcount, iid = id;
+           EXEC SQL END DECLARE SECTION; 
+
+           EXEC SQL UPDATE machine SET snet_id=0 WHERE mach_id = :iid;
+           rowcount = sqlca.sqlerrd[2];
+           if (rowcount > 0)
+             printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
+           else
+             printf("Not fixed\n");
+           modified("machine");
+       }
+    }
+
+    switch (m->owner_type) {
+    case 'U':
+       if (!hash_lookup(users, m->owner_id)) {
+           printf("Machine %s has non-existant USER owner %d\n",
+                  m->name, m->owner_id);
+           if (single_fix("Set to no owner", 1)) {
+               clear_mach_owner(m);
+           }
+       }
+       break;
+    case 'L':
+       if (!hash_lookup(lists, m->owner_id)) {
+           printf("Machine %s has non-existant LIST owner %d\n",
+                  m->name, m->owner_id);
+           if (single_fix("Set to no owner", 1)) {
+               clear_mach_owner(m);
+           }
+       }
+       break;
+    case 'S':
+    case 'K':
+      if(m->owner_id)
+       m->owner_id=maybe_fixup_unref_string(m->owner_id, id, m->name,
+                                            "machine", "owner_id", "mach_id");
+      if(m->owner_id==0)
+       clear_mach_owner(m);
+    }
+
+    if(m->acomment)
+      m->acomment=maybe_fixup_unref_string(m->acomment, id, m->name,
+                                          "machine", "acomment", "mach_id");
+    if(m->ocomment)
+      m->ocomment=maybe_fixup_unref_string(m->ocomment, id, m->name,
+                                          "machine", "ocomment", "mach_id");
+    
+    m->creator=maybe_fixup_modby(m->creator, id, m->name, "machine",
+                                "creator", "mach_id");
+    m->modby=maybe_fixup_modby(m->modby, id, m->name, "machine",
+                              "modby", "mach_id");
+}
+
+subnet_check(id, s, hint)
+int id;
+struct subnet *s;
+int hint;
+{
+    switch (s->owner_type) {
+    case 'U':
+       if (!hash_lookup(users, s->owner_id)) {
+           printf("Subnet %s has non-existant USER owner %d\n",
+                  s->name, s->owner_id);
+           if (single_fix("Set to no owner", 1)) {
+               clear_subnet_owner(s);
+           }
+       }
+       break;
+    case 'L':
+       if (!hash_lookup(lists, s->owner_id)) {
+           printf("Machine %s has non-existant LIST owner %d\n",
+                  s->name, s->owner_id);
+           if (single_fix("Set to no owner", 1)) {
+               clear_subnet_owner(s);
+           }
+       }
+       break;
+    case 'S':
+    case 'K':
+      if(s->owner_id)
+       s->owner_id=maybe_fixup_unref_string(s->owner_id, id, s->name,
+                                            "machine", "owner_id", "mach_id");
+      if(s->owner_id==0)
+       clear_subnet_owner(s);
+    }
+
+    s->modby=maybe_fixup_modby(s->modby, id, s->name, "subnet",
+                              "modby", "snet_id");
+}
+
+
+clear_subnet_owner(s)
+struct subnet *s;
+{
+    EXEC SQL BEGIN DECLARE SECTION; 
+    int rowcount, id = s->snet_id;
+    EXEC SQL END DECLARE SECTION; 
+
+    EXEC SQL UPDATE subnet SET owner_type='NONE', owner_id=0
+      WHERE snet_id = :id;
+    rowcount = sqlca.sqlerrd[2];
+    if (rowcount > 0)
+      printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
+    else
+      printf("Not fixed\n");
+    modified("subnet");
+}
+
+clear_mach_owner(m)
+struct machine *m;
+{
+    EXEC SQL BEGIN DECLARE SECTION; 
+    int rowcount, id = m->mach_id;
+    EXEC SQL END DECLARE SECTION; 
+
+    EXEC SQL UPDATE machine SET owner_type='NONE', owner_id=0
+      WHERE mach_id = :id;
+    rowcount = sqlca.sqlerrd[2];
+    if (rowcount > 0)
+      printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
+    else
+      printf("Not fixed\n");
+    modified("machine");
+}
+
+cluster_check(id, c, hint)
+int id;
+struct cluster *c;
+int hint;
+{
+    c->modby=maybe_fixup_modby(c->modby, id, c->name, "clusters",
+                              "modby", "clu_id");
+}
+
+
+
 show_svc(id)
 int id;
 {
@@ -129,14 +539,10 @@ int id;
     EXEC SQL DECLARE csr203 CURSOR FOR
        SELECT serv_label, serv_cluster FROM svc
            WHERE clu_id = :iid;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr203;
     while(1) {
        EXEC SQL FETCH csr203 INTO :label, :data;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       }
+       if (sqlca.sqlcode != 0) break;
 
        strtrim(label);
        strtrim(data);
@@ -170,6 +576,16 @@ int hint;
            }
        }
        break;
+    case 'K':
+        l->acl_id = maybe_fixup_unref_string(l->acl_id, id, l->name,
+                                            "list", "acl_id", "list_id");
+        if (!l->acl_id) {
+           printf("List %s has bad KERBEROS acl %d\n", l->name, l->acl_id);
+           if(single_fix("Patch", 1)) {
+               fix_list_acl(l->list_id);
+           }
+       }
+       break;
     }
 }
 
@@ -182,7 +598,7 @@ int id;
 
     EXEC SQL UPDATE list SET acl_id = :iid, acl_type='LIST'
        WHERE list_id = :iid;
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
     else
@@ -202,14 +618,10 @@ int id;
     EXEC SQL DECLARE csr204 CURSOR FOR
        SELECT member_type, member_id FROM imembers
            WHERE list_id = :iid AND direct=1;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr204;
     while(1) {
        EXEC SQL FETCH csr204 INTO :mtype, :mid;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        strtrim(mtype);
        found = 0;
@@ -236,14 +648,10 @@ int id;
     EXEC SQL DECLARE csr205 CURSOR FOR
       SELECT list_id FROM imembers
        WHERE member_id = :iid AND member_type='USER' AND direct=1;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr205;
     while(1) {
        EXEC SQL FETCH csr205 INTO :lid;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       }       
+       if (sqlca.sqlcode != 0) break;  
        
        found = 0;
        printf("List %s has non-existant user member, id %d\n",
@@ -264,14 +672,10 @@ int id;
     EXEC SQL DECLARE csr206 CURSOR FOR
        SELECT list_id FROM imembers
            WHERE member_id = :iid AND member_type='LIST' AND direct=1;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr206;
     while(1) {
        EXEC SQL FETCH csr206 INTO :lid;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        found = 0;
        printf("List %s has non-existant list member, id %d\n",
@@ -292,14 +696,10 @@ int id;
     EXEC SQL DECLARE csr207 CURSOR FOR
        SELECT list_id FROM imembers
            WHERE member_id = :iid AND member_type='STRING' AND direct=1;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr207;
     while(1) {
        EXEC SQL FETCH csr207 INTO :lid;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
        
        found = 0;
        printf("List %s has non-existant string member, id %d\n",
@@ -321,14 +721,10 @@ int id;
     EXEC SQL DECLARE csr208 CURSOR FOR
        SELECT list_id FROM imembers
            WHERE member_id = :iid AND member_type='KERBEROS' AND direct=1;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr208;
     while(1) {
        EXEC SQL FETCH csr208 INTO :lid;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        found = 0;
        printf("List %s has non-existant kerberos member, id %d\n",
@@ -350,7 +746,7 @@ EXEC SQL END DECLARE SECTION;
 
     EXEC SQL DELETE FROM imembers WHERE member_type='USER' AND
        member_id = :id AND direct = 1;
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
     else
@@ -369,7 +765,7 @@ EXEC SQL END DECLARE SECTION;
 
     EXEC SQL DELETE FROM imembers WHERE member_type='LIST' AND
        member_id = :id AND direct=1;
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
     else
@@ -388,7 +784,7 @@ EXEC SQL END DECLARE SECTION;
 
     EXEC SQL DELETE FROM imembers WHERE member_type='STRING' AND
        member_id = :id AND direct=1;
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
     else
@@ -408,7 +804,7 @@ EXEC SQL END DECLARE SECTION;
 
     EXEC SQL DELETE FROM imembers WHERE member_type='KERBEROS' AND
        member_id = :id AND direct=1;
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
     else
@@ -430,14 +826,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr209 CURSOR FOR
        SELECT service FROM serverhosts
            WHERE mach_id = :id;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr209;
     while(1) {
        EXEC SQL FETCH csr209 INTO :name;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        found = 0;
        printf("ServerHost entry for service %s non-existant host %d\n",
@@ -457,7 +849,7 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL END DECLARE SECTION; 
 
     EXEC SQL DELETE FROM serverhosts WHERE mach_id = :id;
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
     else
@@ -500,7 +892,7 @@ int hint;
        printf("Filesys %s with bad machine %d\n", f->name, f->mach_id);
        if (single_fix("Fix", 0)) {
            EXEC SQL UPDATE filesys SET mach_id = 0 WHERE filsys_id = :id;
-           EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+           rowcount = sqlca.sqlerrd[2];
            if (rowcount > 0)
              printf("%d entr%s fixed\n",rowcount, rowcount==1?"y":"ies");
            else
@@ -537,7 +929,7 @@ int hint;
                  id2 = f->filsys_id;
                  id3 = f->mach_id;
                  EXEC SQL UPDATE filesys SET phys_id = :id1 WHERE filsys_id = :id2;
-                 EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+                 rowcount = sqlca.sqlerrd[2];
                  if (rowcount > 0)
                    printf("%d entr%s fixed\n",rowcount, rowcount==1?"y":"ies");
                  else
@@ -563,9 +955,9 @@ int hint;
                        }
                        EXEC SQL INSERT INTO mfsphys (mfsphys_id, mach_id,
                            device, dir, status, allocated, size, modtime,
-                           modby, modwith) VALUES (:id1, :id3, '???', :dir,
-                           0, 0, 0, 'now', 0, 'dbck');
-                       EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+                           modby, modwith) VALUES (:id1, :id3, '\?\?\?', :dir,
+                           0, 0, 0, SYSDATE, 0, 'dbck');
+                       rowcount = sqlca.sqlerrd[2];
                        if (rowcount > 0)
                          printf("%d entr%s created\n", rowcount,
                                 rowcount==1?"y":"ies");
@@ -580,10 +972,12 @@ int hint;
                        n->nfsphys_id = id1;
                        n->allocated = 0;
                        n->count = 0;
-                       hash_store(nfsphys, id1, n);
+                       if( hash_store(nfsphys, id1, n) == -1 ) {
+                         out_of_mem("storing nfsphys in hash table");
+                       }
                        EXEC SQL UPDATE filesys SET phys_id = :id1
                            WHERE filsys_id = :id2;
-                       EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+                       rowcount = sqlca.sqlerrd[2];
                        if (rowcount > 0)
                          printf("%d filesys entr%s fixed\n", rowcount,
                                 rowcount==1?"y":"ies");
@@ -624,14 +1018,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr210 CURSOR FOR
        SELECT filsys_id FROM fsgroup
            WHERE group_id = :id;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr210;
     while(1) {
        EXEC SQL FETCH csr210 INTO :id1;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        found = 0;
        if (f = (struct filesys *) hash_lookup(filesys, id1))
@@ -668,7 +1058,7 @@ struct filesys *f;
        t = "MUL";
        break;
     default:
-       t = "???";
+       t = "\?\?\?";
     }
     printf("FSGroup %s has type %s instead of FSGROUP\n", f->name, t);
     return(0);
@@ -682,7 +1072,7 @@ struct filesys *f;
     EXEC SQL END DECLARE SECTION; 
 
     EXEC SQL UPDATE filesys SET type='FSGROUP' WHERE filsys_id = :id;
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
     else
@@ -703,14 +1093,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr211 CURSOR FOR
        SELECT group_id FROM fsgroup
            WHERE filsys_id = :id;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr211;
     while(1) {
        EXEC SQL FETCH csr211 INTO :id1;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        found = 0;
        if (f = (struct filesys *) hash_lookup(filesys, id1))
@@ -734,14 +1120,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr212 CURSOR FOR
        SELECT filsys_id FROM quota
            WHERE entity_id = :id AND type='USER';
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr212;
     while(1) {
        EXEC SQL FETCH csr212 INTO :id1;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        found = 0;
        printf("Quota on fs %d for non-existant user %d\n", id1, id);
@@ -762,14 +1144,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr213 CURSOR FOR
        SELECT filsys_id FROM quota 
            WHERE entity_id = :id AND type='GROUP';
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr213;
     while(1) {
        EXEC SQL FETCH csr213 INTO :id1;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       }
+       if (sqlca.sqlcode != 0) break;
  
        found = 0;
        printf("Quota on fs %d for non-existant list %d\n", id1, id);
@@ -790,7 +1168,7 @@ EXEC SQL END DECLARE SECTION;
     id1 = ((struct filesys *)hash_lookup(filesys, id))->phys_id;
     EXEC SQL DELETE FROM quota 
        WHERE entity_id = :id AND type = 'USER';
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s deleted\n",rowcount, rowcount==1?"y":"ies");
     else
@@ -809,7 +1187,7 @@ EXEC SQL END DECLARE SECTION;
 
     id1 = ((struct filesys *)hash_lookup(filesys, id))->phys_id;
     EXEC SQL DELETE FROM quota WHERE entity_id = :id AND type='GROUP';
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s deleted\n",rowcount, rowcount==1?"y":"ies");
     else
@@ -830,14 +1208,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr214 CURSOR FOR
        SELECT entity_id, type FROM quota
            WHERE filsys_id = :id;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr214;
     while(1) {
        EXEC SQL FETCH csr214 INTO :id1, :type;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
        
        found = 0;
        printf("Quota for %s %d on non-existant filesys %d\n", type, id1, id);
@@ -867,14 +1241,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr215 CURSOR FOR
        SELECT entity_id, type FROM quota
            WHERE filsys_id = :id;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr215;
     while(1) {
        EXEC SQL FETCH csr215 INTO :id1, :type;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        found = 0;
        printf("Quota for %s %d on filesys %s has wrong phys_id %d\n",
@@ -896,7 +1266,7 @@ EXEC SQL END DECLARE SECTION;
     id1 = ((struct filesys *)hash_lookup(filesys, id))->phys_id;
     EXEC SQL UPDATE quota SET phys_id = :id1 
        WHERE filsys_id = :id AND phys_id != :id1;
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s fixed\n",rowcount, rowcount==1?"y":"ies");
     else
@@ -917,14 +1287,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr216 CURSOR FOR
        SELECT name FROM servers
            WHERE acl_type='USER' and acl_id = :id;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr216;
     while(1) {
        EXEC SQL FETCH csr216 INTO :name;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
        
        strtrim(name);
        printf("Service %s has acl non-existant user %d\n", name, id);
@@ -947,14 +1313,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr217 CURSOR FOR
        SELECT name FROM servers
            WHERE acl_type='LIST' AND acl_id = :id;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr217;
     while(1) {
        EXEC SQL FETCH csr217 INTO :name;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        strtrim(name);
        printf("Service %s has acl non-existant list %d\n", name, id);
@@ -975,7 +1337,7 @@ EXEC SQL END DECLARE SECTION;
 
     EXEC SQL UPDATE servers SET acl_id=0 WHERE acl_id = :id AND
        acl_type='USER';
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
     else
@@ -994,7 +1356,7 @@ EXEC SQL END DECLARE SECTION;
 
     EXEC SQL UPDATE servers SET acl_id=0 WHERE acl_id = :id AND
        acl_type='LIST';
-    EXEC SQL INQUIRE_SQL(:rowcount = rowcount); 
+    rowcount = sqlca.sqlerrd[2];
     if (rowcount > 0)
       printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
     else
@@ -1017,14 +1379,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr218 CURSOR FOR
        SELECT string_id FROM krbmap
            WHERE users_id = :id ;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr218;
     while(1) {
        EXEC SQL FETCH csr218 INTO :id1;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        if (s = ((struct string *)hash_lookup(strings, id1)))
            ss = s->name;
@@ -1053,19 +1411,15 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr219 CURSOR FOR
        SELECT users_id FROM krbmap
            WHERE string_id = :id;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr219;
     while(1) {
        EXEC SQL FETCH csr219 INTO :id1;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        if (u = ((struct user *)hash_lookup(users, id1)))
            s = u->login;
        else
-           s = "[???]";
+           s = "[\?\?\?]";
        found = 0;
        printf("Kerberos map for user %s (%d) to non-existant string %d\n",
               s, id1, id);
@@ -1088,14 +1442,10 @@ EXEC SQL END DECLARE SECTION;
     EXEC SQL DECLARE csr220 CURSOR FOR
        SELECT name FROM palladium
            WHERE mach_id = :id;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
     EXEC SQL OPEN csr220;
     while(1) {
        EXEC SQL FETCH csr220 INTO :name;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        strtrim(name);
         printf("Palladium server/supervisor %s is on non-existant machine %d\n",
@@ -1122,28 +1472,33 @@ phase2()
     printf("Phase 2 - Checking references\n");
 
     dprintf("Checking users...\n");
-    hash_step(users, pobox_check, NULL);
+    hash_step(users, user_check, NULL);
+
+    dprintf("Checking machines...\n");
+    hash_step(machines, mach_check, NULL);
+
+    dprintf("Checking subnets...\n");
+    hash_step(subnets, subnet_check, NULL);
+
+    dprintf("Checking clusters...\n");
+    hash_step(clusters, cluster_check, NULL);
 
     dprintf("Checking mcmap...\n");
     sq1 = sq_create();
     sq2 = sq_create();
     EXEC SQL DECLARE csr221 CURSOR FOR
-       SELECT mach_id, clu_id FROM mcmap;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT mach_id, clu_id FROM mcmap;
     EXEC SQL OPEN csr221;
     while(1) {
        EXEC SQL FETCH csr221 INTO :id1, :id2;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        if (!(m = (struct machine *)hash_lookup(machines, id1)))
            sq_save_unique_data(sq1, id1);
-       if (!hash_lookup(clusters, id2))
+       else if (!hash_lookup(clusters, id2))
            sq_save_unique_data(sq2, id2);
        if (m) m->clucount++;
-       }
+    }
     EXEC SQL CLOSE csr221; 
     generic_delete(sq1, show_mcm_mach, "mcmap", "mach_id", 1);
     generic_delete(sq2, show_mcm_clu, "mcmap", "clu_id", 1);
@@ -1151,15 +1506,11 @@ phase2()
     dprintf("Checking service clusters...\n");
     sq1 = sq_create();
     EXEC SQL DECLARE csr222 CURSOR FOR
-       SELECT clu_id FROM svc;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT clu_id FROM svc;
     EXEC SQL OPEN csr222;
     while(1) {
        EXEC SQL FETCH csr222 INTO :id1;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        if (!hash_lookup(clusters, id1))
          sq_save_unique_data(sq1, id1);
@@ -1178,16 +1529,12 @@ phase2()
     sq5 = sq_create();
 
     EXEC SQL DECLARE csr223 CURSOR FOR
-       SELECT list_id, member_type, member_id, ref_count, direct 
-       FROM imembers ORDER BY list_id;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT list_id, member_type, member_id, ref_count, direct
+      FROM imembers FOR UPDATE OF member_id;
     EXEC SQL OPEN csr223;
     while(1) {
        EXEC SQL FETCH csr223 INTO :id1, :type, :id2, :id3, :id4;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        if ((l = (struct list *) hash_lookup(lists, id1)) == NULL)
          sq_save_unique_data(sq1, id1);
@@ -1195,9 +1542,9 @@ phase2()
          sq_save_unique_data(sq2, id2);
        else if (type[0] == 'L' && !hash_lookup(lists, id2))
          sq_save_unique_data(sq3, id2);
-       else if (type[0] == 'S' && !string_check(id2))
+       else if (type[0] == 'S' && !maybe_fixup_unref_string2("imembers","member_id","csr223",id2))
          sq_save_unique_data(sq4, id2);
-       else if (type[0] == 'K' && !string_check(id2))
+       else if (type[0] == 'K' && !maybe_fixup_unref_string2("imembers","member_id","csr223",id2))
          sq_save_unique_data(sq5, id2);
        else
          l->members++;
@@ -1213,16 +1560,14 @@ phase2()
     sq1 = sq_create();
     sq2 = sq_create();
     EXEC SQL DECLARE csr224 CURSOR FOR
-       SELECT name, acl_type, acl_id FROM servers;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT name, acl_type, acl_id, modby FROM servers
+      FOR UPDATE of modby;
     EXEC SQL OPEN csr224;
     while(1) {
-       EXEC SQL FETCH csr224 INTO :name, :type, :id1;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       EXEC SQL FETCH csr224 INTO :name, :type, :id1, :id2;
+       if (sqlca.sqlcode != 0) break; 
 
+       maybe_fixup_modby2("servers","modby","csr224",id2);
        strtrim(type);
        if (!strcmp(type, "USER") && !hash_lookup(users, id1)) {
            sq_save_data(sq1, id1);
@@ -1237,16 +1582,14 @@ phase2()
     dprintf("Checking serverhosts...\n");
     sq = sq_create();
     EXEC SQL DECLARE csr225 CURSOR FOR
-       SELECT mach_id FROM serverhosts;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT mach_id, modby FROM serverhosts
+      FOR UPDATE OF modby;
     EXEC SQL OPEN csr225;
     while(1) {
-       EXEC SQL FETCH csr225 INTO :id1;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       EXEC SQL FETCH csr225 INTO :id1, :id2;
+       if (sqlca.sqlcode != 0) break; 
 
+       maybe_fixup_modby2("serverhosts", "modby", "csr225", id2);
        if (!hash_lookup(machines, id1))
          sq_save_data(sq, id1);
        }
@@ -1264,15 +1607,11 @@ phase2()
     sq2 = sq_create();
     sq3 = sq_create();
     EXEC SQL DECLARE csr226 CURSOR FOR
-       SELECT group_id, filsys_id FROM fsgroup;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT group_id, filsys_id FROM fsgroup;
     EXEC SQL OPEN csr226;
     while(1) {
        EXEC SQL FETCH csr226 INTO :id1, :id2;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        if (!(f = (struct filesys *) hash_lookup(filesys, id1)))
          sq_save_data(sq1, id1);
@@ -1289,16 +1628,14 @@ phase2()
     sq3 = sq_create();
     sq4 = sq_create();
     EXEC SQL DECLARE csr227 CURSOR FOR
-       SELECT entity_id, type, filsys_id, phys_id, quota FROM quota;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT entity_id, type, filsys_id, phys_id, quota, modby
+      FROM quota FOR UPDATE OF modby;
     EXEC SQL OPEN csr227;
     while(1) {
-       EXEC SQL FETCH csr227 INTO :id1, :type, :id2, :id3, :id4;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       EXEC SQL FETCH csr227 INTO :id1, :type, :id2, :id3, :id4, :id5;
+       if (sqlca.sqlcode != 0) break; 
 
+       maybe_fixup_modby2("quota", "modby", "csr227", id5);
        if (type[0] == 'U' && id1 != 0 && !hash_lookup(users, id1))
          sq_save_data(sq1, id1);
        else if (type[0] == 'G' && !hash_lookup(lists, id1))
@@ -1322,16 +1659,14 @@ phase2()
 
     dprintf("Checking hostaccess...\n");
     EXEC SQL DECLARE csr228 CURSOR FOR
-       SELECT mach_id, acl_type, acl_id FROM hostaccess;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT mach_id, acl_type, acl_id, modby FROM hostaccess
+      FOR UPDATE OF modby;
     EXEC SQL OPEN csr228;
     while(1) {
-       EXEC SQL FETCH csr228 INTO :id1, :type, :id2;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       EXEC SQL FETCH csr228 INTO :id1, :type, :id2, :id3;
+       if (sqlca.sqlcode != 0) break; 
 
+       maybe_fixup_modby2("hostaccess", "modby", "csr228", id3);
        strtrim(type);
        if (!hash_lookup(machines, id1)) {
            printf("Hostaccess for non-existant host %d\n", id1);
@@ -1350,16 +1685,14 @@ phase2()
     dprintf("Checking palladium...\n");
     sq1 = sq_create();
     EXEC SQL DECLARE csr229 CURSOR FOR
-       SELECT mach_id FROM palladium;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT mach_id, modby FROM palladium
+      FOR UPDATE OF modby;
     EXEC SQL OPEN csr229;
     while(1) {
-       EXEC SQL FETCH csr229 INTO :id1;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       EXEC SQL FETCH csr229 INTO :id1, :id2;
+       if (sqlca.sqlcode != 0) break; 
 
+       maybe_fixup_modby2("palladium", "modby", "csr229", id2);
        if (!hash_lookup(machines, id1)) {
            sq_save_unique_data(sq1, id1);
        }
@@ -1371,19 +1704,16 @@ phase2()
     sq1 = sq_create();
     sq2 = sq_create();
     EXEC SQL DECLARE csr230 CURSOR FOR
-       SELECT users_id, string_id FROM krbmap;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT users_id, string_id FROM krbmap
+      FOR UPDATE OF string_id;
     EXEC SQL OPEN csr230;
     while(1) {
        EXEC SQL FETCH csr230 INTO :id1, :id2;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        if (!hash_lookup(users, id1))
          sq_save_unique_data(sq1, id1);
-       if (!string_check(id2))
+       else if (!maybe_fixup_unref_string2("krbmap","string_id","csr230",id2))
          sq_save_unique_data(sq2, id2);
        }
     EXEC SQL CLOSE csr230; 
@@ -1392,22 +1722,51 @@ phase2()
 
     dprintf("Checking capacls...\n");
     EXEC SQL DECLARE csr231 CURSOR FOR
-       SELECT list_id, tag FROM capacls;
-    if (sqlca.sqlcode != 0) ingerr(&sqlca.sqlcode);
+      SELECT list_id, tag FROM capacls;
     EXEC SQL OPEN csr231;
     while(1) {
        EXEC SQL FETCH csr231 INTO :id1, :name;
-       if (sqlca.sqlcode != 0) {
-         ingerr(&sqlca.sqlcode);
-         break;
-       } 
+       if (sqlca.sqlcode != 0) break; 
 
        if (!hash_lookup(lists, id1)) {
            printf("Capacl for %s is non-existant list %d\n", name, id1);
            printf("Not fixing this error\n");
        }
     }
-    EXEC SQL CLOSE csr231; 
+    EXEC SQL CLOSE csr231;
 
-}
+    dprintf("Checking hostaliases\n");
+    sq1 = sq_create();
+    EXEC SQL DECLARE csr232 CURSOR FOR
+      SELECT mach_id FROM hostalias;
+    EXEC SQL OPEN csr232;
+    while(1) {
+       EXEC SQL FETCH csr232 INTO :id1;
+       if (sqlca.sqlcode != 0) break; 
 
+       if (!hash_lookup(machines, id1))
+         sq_save_unique_data(sq1, id1);
+    }
+    EXEC SQL CLOSE csr232;
+    generic_delete(sq1, show_hostalias, "hostalias", "mach_id", 1);
+    
+    dprintf("Checking printcaps\n");
+    sq1 = sq_create();
+    sq2 = sq_create();
+    EXEC SQL DECLARE csr233 CURSOR FOR
+      SELECT mach_id, quotaserver, modby FROM printcap;
+    EXEC SQL OPEN csr233;
+    while(1) {
+       EXEC SQL FETCH csr233 INTO :id1, :id2, :id3;
+       if (sqlca.sqlcode != 0) break; 
+
+       maybe_fixup_modby2("printcap", "modby", "csr233", id3);
+       if (!hash_lookup(machines, id1))
+         sq_save_unique_data(sq1, id1);
+       else if(!hash_lookup(machines, id2))
+         sq_save_unique_data(sq2, id2);
+    }
+    EXEC SQL CLOSE csr233;
+    generic_delete(sq1, show_pcap_mach, "printcap", "mach_id", 1);
+    generic_delete(sq2, show_pcap_quota, "printcap", "quotaserver", 1);
+}
This page took 0.086415 seconds and 4 git commands to generate.