]> andersk Git - moira.git/blob - regtape/vote.dc
update name if necessary
[moira.git] / regtape / vote.dc
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 }
This page took 0.145217 seconds and 5 git commands to generate.