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) {
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;
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);
}
}
if (outf)
fix_file(outf);
+
exit(MR_SUCCESS);
sqlerr:
int when;
{
register char *p;
- char buf[256], *a1, *a2;
- char *rindex();
+ char buf[256], *a1, *a2, *d;
+ char *rindex(), *index();
/* split address into two lines.
* First determine if postal or interdepartmental address.
*/
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;
+
for (p = letter_text; *p; p++) {
if (*p == '%') {
p++;
}
break;
case 'd':
- fputs(ctime(&when), out);
- break;
- case '%':
- putc('%', out);
+ fputs(d, out);
break;
default:
putc('%', out);