X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/e6cb8db944d36b3308cb9f1569049ac6110e9fbe..3adf4b2f0bdeeb5773607d707b7816983f93168e:/gen/letter.dc diff --git a/gen/letter.dc b/gen/letter.dc index 4e6d14e8..1ab107fd 100644 --- a/gen/letter.dc +++ b/gen/letter.dc @@ -35,15 +35,16 @@ char **argv; int flag; struct timeval tv; EXEC SQL BEGIN DECLARE SECTION; - char login[10], fullname[34], addr[84]; + char login[10], first[17], last[17], fullname[34], addr[84]; int lastrun, when; 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) { @@ -71,6 +72,10 @@ char **argv; init_letter(); + /* 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; EXEC SQL SELECT secure INTO :lastrun FROM users WHERE users_id = 0; @@ -78,14 +83,16 @@ char **argv; gettimeofday(&tv, NULL); EXEC SQL DECLARE x CURSOR FOR SELECT - login, fullname, xaddress, secure + login, first, last, xaddress, secure FROM users WHERE secure > :lastrun; EXEC SQL OPEN x; while (1) { - EXEC SQL FETCH x INTO :login, :fullname, :addr, :when; + EXEC SQL FETCH x INTO :login, :first, :last, :addr, :when; if (sqlca.sqlcode != 0) break; strtrim(login); - strtrim(fullname); + strtrim(first); + strtrim(last); + sprintf(fullname, "%s %s", first, last); print_letter(out, login, fullname, strtrim(addr), when); } @@ -107,6 +114,7 @@ char **argv; } if (outf) fix_file(outf); + exit(MR_SUCCESS); sqlerr: @@ -159,7 +167,7 @@ int when; { register char *p; char buf[256], *a1, *a2, *d; - char *rindex(); + char *rindex(), *index(); /* split address into two lines. * First determine if postal or interdepartmental address. @@ -168,26 +176,32 @@ int when; */ strcpy(buf, addr); a1 = buf; - a2 = rindex(buf, ' '); /* before state & zip */ - if (a2 && isupper(a2[1]) && isupper(a2[2]) && - isdigit(a2[3]) && isdigit(a2[4]) && isdigit(a2[5]) && - isdigit(a2[6]) && isdigit(a2[7])) { - /* Must be postal address. */ - /* missing space between state & zip, fix */ - for (p = a2; *p; p++); /* find end of string */ - for (p--; isdigit(*p); p--) - p[2] = p[1]; - p[1] = ' '; - /* Backup to previous space, start of state */ - for (; *a2 != ' '; a2--); - /* Backup to previous space, start of city */ - for (a2--; *a2 != ' '; a2--); - /* terminate first line, leave a2 pointing at second */ + if (a2 = index(buf, '|')) { *a2++ = 0; } else { - /* Must be interdepartmental */ - a2 = "MIT INTERDEPARTMENTAL MAIL"; + a2 = rindex(buf, ' '); /* before state & zip */ + if (a2 && isupper(a2[1]) && isupper(a2[2]) && + isdigit(a2[3]) && isdigit(a2[4]) && isdigit(a2[5]) && + isdigit(a2[6]) && isdigit(a2[7])) { + /* Must be postal address. */ + /* missing space between state & zip, fix */ + for (p = a2; *p; p++); /* find end of string */ + for (p--; isdigit(*p); p--) + p[2] = p[1]; + p[2] = p[1]; + p[1] = ' '; + /* Backup to previous space, start of state */ + for (; *a2 != ' '; a2--); + /* Backup to previous space, start of city */ + for (a2--; *a2 != ' '; a2--); + /* terminate first line, leave a2 pointing at second */ + *a2++ = 0; + } else { + /* Must be interdepartmental */ + a2 = "MIT INTERDEPARTMENTAL MAIL"; + } } + d = ctime(&when); d[strlen(d)-1] = 0;