X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/566f04995bedcc417b278af37a196284602e615c..2796e83d397f9351ee28ccaf9db28ef2e4ac2510:/gen/mailhub.dc diff --git a/gen/mailhub.dc b/gen/mailhub.dc index fe8e5773..86987d24 100644 --- a/gen/mailhub.dc +++ b/gen/mailhub.dc @@ -27,7 +27,7 @@ char *pstrsave(); char *divide = "##############################################################"; #define ML_WID 72 -#define AL_MAX_WID 896 +#define AL_MAX_WID 592 #define FALSE 0 #define TRUE (!FALSE) @@ -47,10 +47,11 @@ char **argv; EXEC SQL END DECLARE SECTION; #ifsql INGRES - EXEC SQL CONNECT sms; + EXEC SQL CONNECT moira; + EXEC SQL SET LOCKMODE SESSION WHERE LEVEL=TABLE, READLOCK=SHARED; #endsql #ifsql INFORMIX - EXEC SQL DATABASE sms; + EXEC SQL DATABASE moira; #endsql if (argc == 2) { @@ -122,6 +123,7 @@ struct member { struct list { char *name; char maillist; + char *description; char acl_t; int acl_id; struct member *m; @@ -145,18 +147,25 @@ get_info() struct list *l, *memberlist; register struct member *m; + /* The following is declarative, not executed, + * and so is dependent on where it is in the file, + * not in the order of execution of statements. + */ EXEC SQL WHENEVER SQLERROR GOTO sqlerr; + /* Get Locks */ + EXEC SQL SELECT modtime INTO :buf FROM users WHERE users_id = 0; EXEC SQL SELECT modtime INTO :buf FROM list WHERE list_id = 0; cnt = 0; - machines = create_hash(10); + machines = create_hash(1000); EXEC SQL DECLARE m_cursor CURSOR FOR - SELECT m.mach_id, m.name - FROM machine m, users u - WHERE m.mach_id = u.pop_id; + SELECT mach_id, name + FROM machine + WHERE status=1 + ORDER BY mach_id; EXEC SQL OPEN m_cursor; while (1) { EXEC SQL FETCH m_cursor INTO :id, :name; @@ -179,16 +188,17 @@ get_info() fprintf(stderr, "Loaded %d machines\n", cnt); cnt = 0; - strings = create_hash(4000); + strings = create_hash(11001); EXEC SQL DECLARE s_cursor CURSOR FOR - SELECT string_id, string - FROM strings; + SELECT string_id, trim(string) + FROM strings + ORDER BY string_id; EXEC SQL OPEN s_cursor; while (1) { EXEC SQL FETCH s_cursor INTO :id, :name; if (sqlca.sqlcode != 0) break; - if (hash_store(strings, id, pstrsave(strtrim(name))) < 0) { + if (hash_store(strings, id, pstrsave(name)) < 0) { fprintf(stderr, "Out of memory!\n"); exit(MR_NO_MEM); } @@ -199,12 +209,13 @@ get_info() fprintf(stderr, "Loaded %d strings\n", cnt); cnt = 0; - users = create_hash(12001); + users = create_hash(13001); EXEC SQL DECLARE u_cursor CURSOR FOR SELECT users_id, login, first, middle, last, potype, pop_id, box_id FROM users - WHERE status != 3; + WHERE status != 3 + ORDER BY users_id; EXEC SQL OPEN u_cursor; while (1) { EXEC SQL FETCH u_cursor INTO :id, :name, :fname, :mname, :lname, @@ -233,22 +244,25 @@ get_info() cnt++; } EXEC SQL CLOSE u_cursor; + EXEC SQL COMMIT; fprintf(stderr, "Loaded %d users\n", cnt); cnt = 0; lists = create_hash(15000); EXEC SQL DECLARE l_cursor CURSOR FOR - SELECT list_id, name, maillist, acl_type, acl_id + SELECT list_id, name, maillist, description, acl_type, acl_id FROM list - WHERE active != 0; + WHERE active != 0 + ORDER BY list_id; EXEC SQL OPEN l_cursor; while (1) { - EXEC SQL FETCH l_cursor INTO :id, :name, :maillistp, :type, :acl; + EXEC SQL FETCH l_cursor INTO :id, :name, :maillistp, :buf, :type, :acl; if (sqlca.sqlcode != 0) break; l = (struct list *) perm_malloc(sizeof(struct list)); l->name = pstrsave(strtrim(name)); l->maillist = maillistp; + l->description = pstrsave(strtrim(buf)); l->acl_t = type[0]; l->acl_id = acl; l->m = (struct member *) NULL; @@ -259,6 +273,7 @@ get_info() cnt++; } EXEC SQL CLOSE l_cursor; + EXEC SQL COMMIT; fprintf(stderr, "Loaded %d lists\n", cnt); cnt = 0; @@ -266,7 +281,8 @@ get_info() EXEC SQL DECLARE m_cursor2 CURSOR FOR SELECT list_id, member_type, member_id FROM imembers - WHERE direct = 1; + WHERE direct = 1 + ORDER BY list_id; EXEC SQL OPEN m_cursor2; while (1) { EXEC SQL FETCH m_cursor2 INTO :id, :type, :mid; @@ -300,7 +316,7 @@ get_info() return; sqlerr: com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode); - critical_alert("DCM", "Hesiod build encountered DATABASE ERROR %d", + critical_alert("DCM", "Mailhub build encountered DATABASE ERROR %d", sqlca.sqlcode); exit(MR_INGRES_ERR); } @@ -324,8 +340,8 @@ int force; return; } l->maillist = 2; - output_mlist(id, l); insert_name(l->name, -1, TRUE, FALSE); + output_mlist(id, l); if (l->acl_t == 'L' && (l1 = (struct list *)hash_lookup(lists, l->acl_id))) save_mlist(0, l1, TRUE); @@ -427,12 +443,12 @@ int copy; } -/* Illegal chars: ! " % ( ) , . / : ; < = > @ [ \ ] ^ { | } */ +/* Illegal chars: ! " % ( ) , / : ; < = > @ [ \ ] ^ { | } */ static int illegalchars[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^@ - ^O */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^P - ^_ */ - 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, /* SPACE - / */ + 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, /* SPACE - / */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, /* 0 - ? */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ - O */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, /* P - _ */ @@ -524,6 +540,7 @@ register struct list *l; register struct member *m; register struct user *u; + put_fill(out, l->description); if (l->acl_t == 'L' && (l1 = (struct list *) hash_lookup(lists, l->acl_id))) fprintf(out, "owner-%s: %s\n%s: ", l->name, l1->name, l->name); @@ -554,11 +571,16 @@ register char *s; { register wwid; static int cont = 1; + char str[8]; wwid = strlen(s); if (!bol && awid + wwid + 2 > AL_MAX_WID) { - fprintf(out, ",\n\tcontinuation-%d\ncontinuation-%d: ", cont, cont); + sprintf(str, "%c%c%c%c%c%c", random() % 26 + 97, random() % 26 + 97, + random() % 26 + 97, random() % 26 + 97, + random() % 26 + 97, random() % 26 + 97); + str[6] = '\0'; + fprintf(out, ",\n\tcont%d-%s\ncont%d-%s: ", cont, str, cont, str); cont++; awid = lwid = 17 + wwid; fputs(s, out); @@ -583,6 +605,53 @@ register char *s; } +put_fill(aliases, string) +FILE *aliases; +register char *string; +{ + register char *c; + register int lwid; + register int wwid; + + if (string == 0 || *string == 0) return; + fputs("# ", aliases); + lwid = 3; + + while (1) { + while (*string && *string == ' ') string++; + c = (char *)index(string, ' '); + if (c == 0) { + wwid = strlen(string); + } else { + wwid = c - string; + *c = 0; + } + + if ((lwid + wwid) > ML_WID) { + fputs("\n# ", aliases); + lwid = 3; + fputs(string, aliases); + } else { + fputs(string, aliases); + } + + if (c == (char *)0) break; + /* add a space after the word */ + (void) fputc(' ', aliases); + wwid++; + lwid += wwid; + string += wwid; + /* add another if after a period */ + if (*--c == '.') { + (void) fputc(' ', aliases); + lwid++; + } + } + + (void) fputc('\n', aliases); +} + + do_people() { incount = 0; @@ -607,7 +676,7 @@ unsigned size; } ret = pool; pool += size; - pool = (char *)(((unsigned) (pool + 1)) & ~1); + pool = (char *)(((unsigned) (pool + 3)) & ~3); pool_size -= (pool - ret); return(ret); }