]> andersk Git - moira.git/blob - server/increment.qc
Initial revision
[moira.git] / server / increment.qc
1 /*
2  *      $Source$
3  *      $Author$
4  *      $Header$
5  *
6  *      Copyright (C) 1989 by the Massachusetts Institute of Technology
7  *      For copying and distribution information, please see the file
8  *      <mit-copyright.h>.
9  * 
10  */
11
12 #ifndef lint
13 static char *rcsid_qrtn_qc = "$Header$";
14 #endif lint
15
16 #include <mit-copyright.h>
17 #include <sms.h>
18 #include "query.h"
19 #include "sms_server.h"
20
21 extern char *whoami;
22
23 #define MAXARGC 15
24
25 /* structures to save before args */
26 static char beforeb[MAXARGC][ARGLEN];
27 static char *before[MAXARGC];
28 ##char *barg0, *barg1, *barg2, *barg3, *barg4;
29 ##char *barg5, *barg6, *barg7, *barg8, *barg9;
30 ##char *barg10, *barg11, *barg12, *barg13, *barg14;
31 static int beforec;
32 static char *beforetable;
33
34 /* structures to save after args */
35 static char afterb[MAXARGC][ARGLEN];
36 static char *after[MAXARGC];
37 ##char *aarg0, *aarg1, *aarg2, *aarg3, *aarg4;
38 ##char *aarg5, *aarg6, *aarg7, *aarg8, *aarg9;
39 ##char *aarg10, *aarg11, *aarg12, *aarg13, *aarg14;
40 static int afterc;
41
42 /* structures to save entire sets of incremental changes */
43 struct save_queue *incremental_sq;
44 struct iupdate {
45     char *table;
46     int beforec;
47     char **before;
48     int afterc;
49     char **after;
50 };
51
52
53 incremental_init()
54 {
55     int i;
56
57     for (i = 0; i < MAXARGC; i++) {
58         before[i] = &beforeb[i][0];
59         after[i] = &afterb[i][0];
60     }
61     barg0 = before[0];
62     barg1 = before[1];
63     barg2 = before[2];
64     barg3 = before[3];
65     barg4 = before[4];
66     barg5 = before[5];
67     barg6 = before[6];
68     barg7 = before[7];
69     barg8 = before[8];
70     barg9 = before[9];
71     barg10 = before[10];
72     barg11 = before[11];
73     barg12 = before[12];
74     barg13 = before[13];
75     barg14 = before[14];
76     aarg0 = after[0];
77     aarg1 = after[1];
78     aarg2 = after[2];
79     aarg3 = after[3];
80     aarg4 = after[4];
81     aarg5 = after[5];
82     aarg6 = after[6];
83     aarg7 = after[7];
84     aarg8 = after[8];
85     aarg9 = after[9];
86     aarg10 = after[10];
87     aarg11 = after[11];
88     aarg12 = after[12];
89     aarg13 = after[13];
90     aarg14 = after[14];
91     incremental_sq = sq_create();
92 }
93
94
95 ##incremental_before(table, qual, argv)
96 ##char *table;
97 ##char *qual;
98 char **argv;
99 ##{
100 ##  int id;
101     char buffer[512];
102
103     beforetable = table;
104
105     if (!strcmp(table, "users")) {
106 ##      retrieve (barg0 = u.login, barg1 = text(u.uid),
107 ##                barg2 = u.shell, barg3 = u.last, barg4 = u.first,
108 ##                barg5 = u.middle, barg6 = text(u.status),
109 ##                barg7 = u.mit_id, barg8 = u.mit_year)
110 ##              where qual
111         beforec = 9;
112     } else if (!strcmp(table, "machine")) {
113 ##      retrieve (barg0 = m.name, barg1 = m.type) where qual
114         beforec = 2;
115     } else if (!strcmp(table, "cluster")) {
116 ##      retrieve (barg0 = c.name, barg1 = c.desc, barg2 = c.location)
117 ##              where qual
118         beforec = 3;
119     } else if (!strcmp(table, "mcmap")) {
120         strcpy(barg0, argv[0]);
121         strcpy(barg1, argv[1]);
122         beforec = 2;
123     } else if (!strcmp(table, "svc")) {
124         strcpy(barg0, argv[0]);
125         strcpy(barg1, argv[1]);
126         strcpy(barg2, argv[2]);
127         beforec = 3;
128     } else if (!strcmp(table, "filesys")) {
129 ##      range of fs is filesys
130 ##      retrieve (barg0 = fs.label, barg1 = fs.type, barg2 = text(fs.mach_id),
131 ##                barg3 = fs.name, barg4 = fs.mount, barg5 = fs.access,
132 ##                barg6 = fs.comments, barg7 = text(fs.owner),
133 ##                barg8 = text(fs.owners), barg9 = text(fs.createflg),
134 ##                barg10 = fs.lockertype)
135 ##        where qual
136         beforec = 11;
137     } else if (!strcmp(table, "nfsquota")) {
138         strcpy(barg0, argv[0]);
139         strcpy(barg1, argv[1]);
140         sprintf(buffer, "%s and filesys.filsys_id = nq.filsys_id", qual);
141         qual = buffer;
142 ##      range of nq is nfsquota
143 ##      retrieve (barg2 = text(nq.quota), barg3 = filesys.name) where qual
144         beforec = 4;
145     } else if (!strcmp(table, "list")) {
146 ##      retrieve (barg0 = l.name, barg1 = text(l.active),
147 ##                barg2 = text(l.public), barg3 = text(l.hidden),
148 ##                barg4 = text(l.maillist), barg5 = text(l.group),
149 ##                barg6 = text(l.gid), barg7 = l.acl_type,
150 ##                barg8 = text(l.acl_id), barg9 = l.desc)
151 ##        where qual
152         beforec = 10;
153     } else if (!strcmp(table, "members")) {
154         id = (int) argv[0];
155 ##      repeat retrieve (barg0 = list.name) where list.list_id = @id
156         strcpy(barg1, argv[1]);
157         id = (int) argv[2];
158         if (!strcmp(barg1, "USER")) {
159 ##          repeat retrieve (barg2 = users.login) where users.users_id = @id
160         } else if (!strcmp(barg1, "LIST")) {
161 ##          repeat retrieve (barg2 = list.name) where list.list_id = @id
162         } else if (!strcmp(barg1, "STRING")) {
163 ##          repeat retrieve (barg2 = strings.string)
164 ##              where strings.string_id = @id
165         } else if (!strcmp(barg1, "KERBEROS")) {
166 ##          repeat retrieve (barg2 = strings.string)
167 ##              where strings.string_id = @id
168         }
169         beforec = 3;
170     } /* else
171       com_err(whoami, 0, "unknown table in incremental_before"); */
172 ##}
173
174
175 incremental_clear_before()
176 {
177     beforec = 0;
178 }
179
180 incremental_clear_after()
181 {
182     incremental_after("clear", 0);
183 }
184
185
186
187 ##incremental_after(table, qual, argv)
188 ##char *table;
189 ##char *qual;
190 char **argv;
191 ##{
192     char buffer[2048];
193 ##  int id, i;
194     struct iupdate *iu;
195     char **copy_argv();
196
197     if (!strcmp(table, "users")) {
198 ##      retrieve (aarg0 = u.login, aarg1 = text(u.uid),
199 ##                aarg2 = u.shell, aarg3 = u.last, aarg4 = u.first,
200 ##                aarg5 = u.middle, aarg6 = text(u.status),
201 ##                aarg7 = u.mit_id, aarg8 = u.mit_year)
202 ##              where qual
203         afterc = 9;
204     } else if (!strcmp(table, "machine")) {
205 ##      retrieve (aarg0 = m.name, aarg1 = m.type) where qual
206         afterc = 2;
207     } else if (!strcmp(table, "cluster")) {
208 ##      retrieve (aarg0 = c.name, aarg1 = c.desc, aarg2 = c.location)
209 ##              where qual
210         afterc = 3;
211     } else if (!strcmp(table, "mcmap")) {
212         strcpy(aarg0, argv[0]);
213         strcpy(aarg1, argv[1]);
214         afterc = 2;
215     } else if (!strcmp(table, "svc")) {
216         strcpy(aarg0, argv[0]);
217         strcpy(aarg1, argv[1]);
218         strcpy(aarg2, argv[2]);
219         afterc = 3;
220     } else if (!strcmp(table, "filesys")) {
221 ##      range of fs is filesys
222 ##      retrieve (aarg0 = fs.label, aarg1 = fs.type,
223 ##                aarg2 = text(fs.mach_id),
224 ##                aarg3 = fs.name, aarg4 = fs.mount, aarg5 = fs.access,
225 ##                aarg6 = fs.comments, aarg7 = text(fs.owner),
226 ##                aarg8 = text(fs.owners), aarg9 = text(fs.createflg),
227 ##                aarg10 = fs.lockertype)
228 ##        where qual
229         afterc = 11;
230     } else if (!strcmp(table, "nfsquota")) {
231         strcpy(aarg0, argv[0]);
232         strcpy(aarg1, argv[1]);
233         sprintf(buffer, "%s and filesys.filsys_id = nq.filsys_id", qual);
234         qual = buffer;
235 ##      range of nq is nfsquota
236 ##      retrieve (aarg2 = text(nq.quota), aarg3 = filesys.name) where qual
237         afterc = 4;
238     } else if (!strcmp(table, "list")) {
239 ##      retrieve (aarg0 = l.name, aarg1 = text(l.active),
240 ##                aarg2 = text(l.public), aarg3 = text(l.hidden),
241 ##                aarg4 = text(l.maillist), aarg5 = text(l.group),
242 ##                aarg6 = text(l.gid), aarg7 = l.acl_type,
243 ##                aarg8 = text(l.acl_id), aarg9 = l.desc)
244 ##        where qual
245         afterc = 10;
246     } else if (!strcmp(table, "members")) {
247         id = (int) argv[0];
248 ##      repeat retrieve (aarg0 = list.name) where list.list_id = @id
249         strcpy(aarg1, argv[1]);
250         id = (int) argv[2];
251         if (!strcmp(aarg1, "USER")) {
252 ##          repeat retrieve (aarg2 = users.login) where users.users_id = @id
253         } else if (!strcmp(aarg1, "LIST")) {
254 ##          repeat retrieve (aarg2 = list.name) where list.list_id = @id
255         } else if (!strcmp(aarg1, "STRING")) {
256 ##          repeat retrieve (aarg2 = strings.string)
257 ##              where strings.string_id = @id
258         } else if (!strcmp(aarg1, "KERBEROS")) {
259 ##          repeat retrieve (aarg2 = strings.string)
260 ##              where strings.string_id = @id
261         }
262         afterc = 3;
263     } else if (!strcmp(table, "clear")) {
264         afterc = 0;
265         table = beforetable;
266     } /* else
267       com_err(whoami, 0, "unknown table in incremental_after"); */
268
269     iu = (struct iupdate *) malloc(sizeof(struct iupdate));
270     iu->table = table;
271     iu->beforec = beforec;
272     iu->before = copy_argv(before, beforec);
273     iu->afterc = afterc;
274     iu->after = copy_argv(after, afterc);
275     sq_save_data(incremental_sq, iu);
276
277 #ifdef DEBUG
278     sprintf(buffer, "INCREMENTAL(%s, [", table);
279     for (i = 0; i < beforec; i++) {
280         if (i == 0)
281           strcat(buffer, strtrim(before[0]));
282         else {
283             strcat(buffer, ", ");
284             strcat(buffer, strtrim(before[i]));
285         }
286     }
287     strcat(buffer, "], [");
288     for (i = 0; i < afterc; i++) {
289         if (i == 0)
290           strcat(buffer, strtrim(after[0]));
291         else {
292             strcat(buffer, ", ");
293             strcat(buffer, strtrim(after[i]));
294         }
295     }
296     strcat(buffer, "])");
297     com_err(whoami, 0, buffer);
298 #endif DEBUG
299 ##}
300
301
302 /* Called when the current transaction is committed to start any queued
303  * incremental updates
304  */
305
306 incremental_update()
307 {
308     struct iupdate *iu;
309     char *argv[MAXARGC * 2 + 4], cafter[3], cbefore[3];
310     int i;
311
312     while (sq_get_data(incremental_sq, &iu)) {
313         argv[1] = iu->table;
314         sprintf(cbefore, "%d", iu->beforec);
315         argv[2] = cbefore;
316         sprintf(cafter, "%d", iu->afterc);
317         argv[3] = cafter;
318         for (i = 0; i < iu->beforec; i++)
319           argv[4 + i] = before[i];
320         for (i = 0; i < iu->afterc; i++)
321           argv[4 + iu->beforec + i] = after[i];
322         invoke_updates(argv, 4 + iu->beforec + iu->afterc);
323         free_argv(iu->before, iu->beforec);
324         free_argv(iu->after, iu->afterc);
325         free(iu);
326     }
327     sq_destroy(incremental_sq);
328     incremental_sq = sq_create();
329 }
330
331
332 /* THIS IS WRONG.  We should keep a table of services getting incremental
333  * updates.  But for now, just assume AFS
334  */
335
336 invoke_updates(argv, argc)
337 char **argv;
338 int argc;
339 {
340     int pid, i;
341     char *prog;
342
343     prog = "/u1/sms/bin/afs.incr";
344     argv[0] = prog;
345     argv[argc] = 0;
346     pid = vfork();
347     switch (pid) {
348     case 0:
349         for (i = getdtablesize() - 1; i > 2; i--)
350           close(i);
351         execv(prog, argv);
352         exit(1);
353     case -1:
354         com_err(whoami, 0, "Failed to start incremental update");
355         return;
356     default:
357         return;
358     }
359 }
360
361
362 /* Called when the current transaction is aborted to throw away any queued
363  * incremental updates
364  */
365
366 incremental_flush()
367 {
368     struct iupdate *iu;
369
370     while (sq_get_data(incremental_sq, &iu)) {
371         free_argv(iu->before, iu->beforec);
372         free_argv(iu->after, iu->afterc);
373         free(iu);
374     }
375     sq_destroy(incremental_sq);
376     incremental_sq = sq_create();
377 }
378
379
380 char **copy_argv(argv, argc)
381 char **argv;
382 int argc;
383 {
384     char **ret = (char **)malloc(sizeof(char *) * argc);
385     while (--argc >= 0)
386       ret[argc] = strsave(strtrim(argv[argc]));
387     return(ret);
388 }
389
390 free_argv(argv, argc)
391 char **argv;
392 int argc;
393 {
394     while (--argc >= 0)
395       free(argv[argc]);
396     free(argv);
397 }
This page took 0.073504 seconds and 5 git commands to generate.