]> andersk Git - moira.git/blame - regtape/staff.pc
Command line printer manipulation client, and build goo.
[moira.git] / regtape / staff.pc
CommitLineData
7ac48069 1/* $Id$
2 *
3 * Load data into Moira from Personnel Office data file
4 *
5 * Copyright (C) 1990-1998 by the Massachusetts Institute of Technology
6 * For copying and distribution information, please see the file
7 * <mit-copyright.h>.
469f80df 8 */
9
7ac48069 10#include <mit-copyright.h>
932028de 11#include <moira.h>
12#include <moira_site.h>
dfaf9b68 13#include <moira_schema.h>
f0df8832 14#include "common.h"
7ac48069 15
16#include <ctype.h>
17#include <stdio.h>
18#include <string.h>
19
02cd9ede 20EXEC SQL INCLUDE sqlca;
469f80df 21
7ac48069 22RCSID("$Header$");
469f80df 23
469f80df 24/* File format is:
f0df8832 25 *
26 * id number [9]
64a3f7c0 27 * last name [30]
28 * first name [30]
29 * middle name [30]
f0df8832 30 * office address [24]
31 * phone1 [12]
32 * phone2 [12]
33 * dept [50]
34 * title [50]
35 */
469f80df 36
37#define LOC_ID 0
469f80df 38#define LEN_ID 9
64a3f7c0 39#define LOC_LAST_NAME (LOC_ID + LEN_ID)
40#define LEN_LAST_NAME 30
41#define LOC_FIRST_NAME (LOC_LAST_NAME + LEN_LAST_NAME)
42#define LEN_FIRST_NAME 30
43#define LOC_MIDDLE_NAME (LOC_FIRST_NAME + LEN_FIRST_NAME)
44#define LEN_MIDDLE_NAME 30
45#define LOC_OFFICE (LOC_MIDDLE_NAME + LEN_MIDDLE_NAME)
a6e9fead 46#define LEN_OFFICE 24
f0df8832 47#define LOC_PHONE (LOC_OFFICE + LEN_OFFICE)
469f80df 48#define LEN_PHONE 12
f0df8832 49#define LOC_PHONE2 (LOC_PHONE + LEN_PHONE)
469f80df 50#define LEN_PHONE2 12
f0df8832 51#define LOC_DEPT (LOC_PHONE2 + LEN_PHONE2)
e5843fe8 52#define LEN_DEPT 50
f0df8832 53#define LOC_TITLE (LOC_DEPT + LEN_DEPT)
a6e9fead 54#define LEN_TITLE 50
469f80df 55
7ac48069 56struct entry *get_next_entry(FILE *in);
f0df8832 57void process_entry(struct entry *e, int secure);
469f80df 58
f0df8832 59EXEC SQL BEGIN DECLARE SECTION;
60int who;
61char *prog = "stafload";
62EXEC SQL END DECLARE SECTION;
3e77c6a3 63
f0df8832 64char *whoami;
469f80df 65
5eaef520 66int main(int argc, char **argv)
02cd9ede 67{
5eaef520 68 FILE *in;
7ac48069 69 struct entry *e;
5eaef520 70 int i, wait = 0;
dfaf9b68 71 char buf[80], *file = NULL;
5eaef520 72 EXEC SQL BEGIN DECLARE SECTION;
73 char *db = "moira";
74 EXEC SQL END DECLARE SECTION;
75
76 whoami = strrchr(argv[0], '/');
77 if (whoami)
78 whoami++;
79 else
80 whoami = argv[0];
81
82 setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
83 setvbuf(stderr, NULL, _IOLBF, BUFSIZ);
84
85 for (i = 1; i < argc; i++)
86 {
87 if (!strcmp(argv[i], "-w"))
88 wait++;
5eaef520 89 else if (file)
15e28a76 90 {
91 fprintf(stderr, "Usage: %s [-w] inputfile\n", whoami);
92 exit(1);
93 }
5eaef520 94 else
95 file = argv[i];
469f80df 96 }
97
15e28a76 98 if (!file)
99 {
100 fprintf(stderr, "Usage: %s [-w] inputfile\n", whoami);
101 exit(1);
102 }
103
5eaef520 104 in = fopen(file, "r");
105 if (!in)
106 {
107 fprintf(stderr, "Unable to open %s for input\n", file);
108 exit(1);
469f80df 109 }
110
5eaef520 111 initialize_sms_error_table();
325821e4 112
5eaef520 113 EXEC SQL CONNECT :db IDENTIFIED BY :db;
114 if (sqlca.sqlcode)
115 {
116 dbmserr("opening database", sqlca.sqlcode);
117 exit(1);
3e77c6a3 118 }
469f80df 119
f0df8832 120 EXEC SQL SELECT users_id INTO :who FROM users WHERE login = 'root';
121
5eaef520 122 while ((e = get_next_entry(in)))
123 {
f0df8832 124 process_entry(e, 0);
5eaef520 125 EXEC SQL COMMIT WORK;
126 if (sqlca.sqlcode)
127 {
9f5e5c05 128 dbmserr("committing work", sqlca.sqlcode);
129 exit(1);
3e77c6a3 130 }
5eaef520 131 if (wait)
132 {
133 printf("Next");
134 fflush(stdout);
dfaf9b68 135 fgets(buf, sizeof(buf), stdin);
469f80df 136 }
137 }
138
5eaef520 139 exit(0);
02cd9ede 140}
469f80df 141
5eaef520 142struct entry *get_next_entry(FILE *in)
469f80df 143{
5eaef520 144 static struct entry e;
0e5cfe5f 145 static char buf[BUFSIZ];
64a3f7c0 146 static char last_name[LEN_LAST_NAME + 1], id[LEN_ID + 1];
147 static char first_name[LEN_FIRST_NAME + 1], middle_name[LEN_MIDDLE_NAME + 1];
5eaef520 148 static char office[LEN_OFFICE + 1], phone[LEN_PHONE + 1];
149 static char phone2[LEN_PHONE2 + 1], dept[LEN_DEPT + 1], title[LEN_TITLE + 1];
5eaef520 150 int ends_sr, ends_jr, ends_iii, ends_iv, ends_ii, ends_v;
b92021f7 151 char *p, *q;
5eaef520 152
153 if (!fgets(buf, sizeof(buf), in))
154 return NULL;
155
f0df8832 156 strlcpy(id, &buf[LOC_ID], LEN_ID + 1);
64a3f7c0 157 strlcpy(last_name, &buf[LOC_LAST_NAME], LEN_LAST_NAME + 1);
158 strlcpy(first_name, &buf[LOC_FIRST_NAME], LEN_FIRST_NAME + 1);
159 strlcpy(middle_name, &buf[LOC_MIDDLE_NAME], LEN_MIDDLE_NAME + 1);
f0df8832 160 strlcpy(office, &buf[LOC_OFFICE], LEN_OFFICE + 1);
161 strlcpy(phone, &buf[LOC_PHONE], LEN_PHONE + 1);
162 strlcpy(phone2, &buf[LOC_PHONE2], LEN_PHONE2 + 1);
163 strlcpy(dept, &buf[LOC_DEPT], LEN_DEPT + 1);
164 strlcpy(title, &buf[LOC_TITLE], LEN_TITLE + 1);
5eaef520 165
64a3f7c0 166 e.last = strtrim(last_name);
167 e.first = strtrim(first_name);
168 e.middle = strtrim(middle_name);
169
5eaef520 170 ends_sr = ends_jr = ends_iii = ends_iv = ends_ii = ends_v = 0;
171 LookForSt(e.last);
172 LookForO(e.last);
7ac48069 173 LookForJrAndIII(e.last, &ends_jr, &ends_sr, &ends_ii, &ends_iii,
174 &ends_iv, &ends_v);
175 LookForJrAndIII(e.first, &ends_jr, &ends_sr, &ends_ii, &ends_iii,
176 &ends_iv, &ends_v);
5eaef520 177
a16e134b 178 e.name = buf;
179 if (*e.middle)
180 sprintf(e.name, "%s %s %s", e.first, e.middle, e.last);
181 else
182 sprintf(e.name, "%s %s", e.first, e.last);
183
5eaef520 184 e.id = id;
f0df8832 185 e.haddr = e.hphone = "";
5eaef520 186
b92021f7 187 /* The following is really gross, but it happens to successfully convert
188 * new-style Warehouse office descriptions into (more-readable) old-style
189 * Personnel Office office descriptions.
190 */
f0df8832 191 e.oaddr = p = strtrim(office);
b92021f7 192 while (*p && !isspace(*p))
193 p++;
194 q = p;
195 while (isspace(*q))
196 q++;
f0df8832 197 if (*q && q < e.oaddr + LEN_OFFICE / 2)
b92021f7 198 {
199 *p++ = '-';
f0df8832 200 while (*q && q < e.oaddr + LEN_OFFICE / 2)
b92021f7 201 {
202 if (*q != ' ' && *q != '-')
203 *p++ = *q;
204 if (q > p)
205 *q = ' ';
206 q++;
207 }
208 memset(p, ' ', q - p);
209 }
210
f0df8832 211 p = e.oaddr + LEN_OFFICE / 2;
b92021f7 212 while (*p && !isspace(*p))
213 p++;
214 q = p;
215 while (isspace(*q))
216 q++;
217 if (*q)
218 {
219 *p++ = '-';
220 while (*q)
221 {
222 if (*q != ' ' && *q != '-')
223 *p++ = *q;
224 if (q > p)
225 *q = ' ';
226 q++;
227 }
228 memset(p, ' ', q - p);
229 }
f0df8832 230 strtrim(e.oaddr);
231 fixaddress(e.oaddr);
232 e.xaddress = e.oaddr;
233
234 e.ophone = e.xphone1 = strtrim(phone);
235 fixphone(e.ophone);
236 e.xphone2 = strtrim(phone2);
237 fixphone(e.xphone2);
5eaef520 238 e.dept = strtrim(dept);
f0df8832 239 e.xtitle = strtrim(title);
5eaef520 240
f0df8832 241 e.type = "MITS";
f7e6d0f3 242 if (strstr(uppercase(e.xtitle), "PROF") ||
243 strstr(uppercase(e.xtitle), "LECTURE"))
f0df8832 244 e.type = "FACULTY";
5eaef520 245 if (!strcmp(e.dept, "LINCOLN LAB"))
f0df8832 246 e.type = "LINCOLN";
6c4dab06 247
f0df8832 248 FixCase(e.dept);
249 FixCase(e.xtitle);
6c4dab06 250
f0df8832 251 return &e;
9f5e5c05 252}
This page took 0.231446 seconds and 5 git commands to generate.