]>
Commit | Line | Data |
---|---|---|
2f791b66 | 1 | /* $Header$ |
2 | */ | |
3 | ||
4 | #include <stdio.h> | |
5 | #include <strings.h> | |
6 | #include <ctype.h> | |
7 | #include <sys/time.h> | |
8 | #include <moira.h> | |
9 | #include <moira_site.h> | |
10 | EXEC SQL INCLUDE sqlca; | |
11 | ||
12 | ||
13 | struct entry { | |
14 | char *line; | |
15 | char last[19]; | |
16 | char first[14]; | |
17 | char middle[11]; | |
18 | char class; | |
19 | char login[9]; | |
20 | }; | |
21 | ||
22 | char *whoami; | |
23 | int debug; | |
24 | ||
25 | ||
26 | main(argc, argv) | |
27 | int argc; | |
28 | char **argv; | |
29 | { | |
30 | FILE *in; | |
31 | struct entry *e, *get_next_entry(); | |
32 | int i, wait = 0; | |
33 | char buf[BUFSIZ], *file = NULL, *p, *p1; | |
34 | ||
35 | debug = 0; | |
36 | whoami = rindex(argv[0], '/'); | |
37 | if (whoami) | |
38 | whoami++; | |
39 | else | |
40 | whoami = argv[0]; | |
41 | ||
42 | for (i = 1; i < argc; i++) { | |
43 | if (!strcmp(argv[i], "-w")) | |
44 | wait++; | |
45 | else if (!strcmp(argv[i], "-D")) | |
46 | setenv("ING_SET", "set printqry"); | |
47 | else if (!strcmp(argv[i], "-d")) | |
48 | debug = 1; | |
49 | else if (file != NULL) | |
50 | fprintf(stderr, "Usage: %s [-w] [-D] [-n] inputfile\n", whoami); | |
51 | else | |
52 | file = argv[i]; | |
53 | } | |
54 | ||
55 | in = fopen(file, "r"); | |
56 | if (in == NULL) { | |
57 | fprintf(stderr, "Unable to open %s for input\n", file); | |
58 | exit(1); | |
59 | } | |
60 | ||
61 | setlinebuf(stdout); | |
62 | setlinebuf(stderr); | |
63 | ||
64 | EXEC SQL CONNECT moira; | |
65 | if (sqlca.sqlcode != 0) { | |
66 | com_err(whoami, 0, "ingres error %d", sqlca.sqlcode); | |
67 | exit(1); | |
68 | } | |
69 | ||
70 | while (e = get_next_entry(in)) { | |
71 | i = process_entry(e); | |
72 | EXEC SQL COMMIT WORK; | |
73 | if (i == 0) { | |
74 | p = &(e->line[46]); | |
75 | for (p1 = e->login; *p1; p1++) | |
76 | *p++ = *p1; | |
77 | for (; p < &(e->line[54]); p++) | |
78 | *p = ' '; | |
79 | fputs(e->line, stdout); | |
80 | } | |
81 | if (wait) { | |
82 | printf("Next"); | |
83 | fflush(stdout); | |
84 | gets(buf); | |
85 | } | |
86 | } | |
87 | ||
88 | exit(0); | |
89 | } | |
90 | ||
91 | ||
92 | ||
93 | struct entry *get_next_entry(in) | |
94 | FILE *in; | |
95 | { | |
96 | static struct entry e; | |
97 | static char buf[BUFSIZ]; | |
98 | ||
99 | if (fgets(buf, sizeof(buf), in) == NULL) | |
100 | return((struct entry *)NULL); | |
101 | ||
102 | e.line = &buf[0]; | |
103 | strncpy(e.last, &buf[4], 18); | |
104 | e.last[18] = 0; | |
105 | strncpy(e.first, &buf[22], 13); | |
106 | e.first[13] = 0; | |
107 | strncpy(e.middle, &buf[35], 10); | |
108 | e.middle[10] = 0; | |
109 | e.class = buf[45]; | |
110 | return(&e); | |
111 | } | |
112 | ||
113 | ||
114 | process_entry(e) | |
115 | struct entry *e; | |
116 | { | |
117 | int dummy; | |
118 | static int nyear = 0; | |
119 | EXEC SQL BEGIN DECLARE SECTION; | |
120 | char *last, *first, *middle, *login, class[10]; | |
121 | EXEC SQL END DECLARE SECTION; | |
122 | ||
123 | if (nyear == 0) { | |
124 | struct tm *tm; | |
125 | struct timeval tv; | |
126 | ||
127 | gettimeofday(&tv, NULL); | |
128 | tm = localtime(&tv.tv_sec); | |
129 | nyear = tm->tm_year; | |
130 | if (tm->tm_mon > 5) | |
131 | nyear++; | |
132 | } | |
133 | ||
134 | LookForSt(e->last); | |
135 | LookForO(e->last); | |
136 | LookForJrAndIII(e->last, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy); | |
137 | LookForJrAndIII(e->first, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy); | |
138 | FixCase(e->last); | |
139 | FixCase(e->first); | |
140 | FixCase(e->middle); | |
141 | ||
142 | last = e->last; | |
143 | first = e->first; | |
144 | middle = e->middle; | |
145 | login = e->login; | |
146 | ||
147 | if (debug) | |
148 | printf("Got last: %s, first %s, middle %s, class %c\n", | |
149 | last, first, middle, e->class); | |
150 | EXEC SQL REPEATED SELECT login INTO :login FROM users | |
151 | WHERE last = :last and first = :first and middle = :middle and | |
152 | status != 3; | |
153 | if (sqlca.sqlcode != 0) { | |
154 | if (sqlca.sqlcode == 100) { | |
155 | EXEC SQL REPEATED SELECT login INTO :login FROM users | |
156 | WHERE last = :last and first = :first and status != 3; | |
157 | if (sqlca.sqlcode != 0) { | |
158 | fprintf(stderr, "User %s %s not found.\n", strtrim(e->first), | |
159 | strtrim(e->last)); | |
160 | return(-1); | |
161 | } | |
162 | } else if (sqlca.sqlcode == -40100) { | |
163 | sprintf(class, "%d", nyear + 4 - e->class - '0' + 1900); | |
164 | EXEC SQL REPEATED SELECT login INTO :login FROM users | |
165 | WHERE last = :last and first = :first and middle = :middle | |
166 | and type = :class and status != 3; | |
167 | if (sqlca.sqlcode != 0) { | |
168 | fprintf(stderr, "Could not match class on %s %s %c (Error %d)\n", | |
169 | strtrim(e->first), strtrim(e->last), e->class, sqlca.sqlcode); | |
170 | return(-1); | |
171 | } | |
172 | } else { | |
173 | fprintf(stderr, "Error %d on %s\n", sqlca.sqlcode, e->line); | |
174 | return(-1); | |
175 | } | |
176 | } | |
177 | strncpy(e->login, login, 8); | |
178 | e->login[8] = 0; | |
179 | if (debug) | |
180 | printf("Got username %s\n", login); | |
181 | return(0); | |
182 | } |