]> andersk Git - moira.git/blame - server/qrtn.qc
Initial revision
[moira.git] / server / qrtn.qc
CommitLineData
97479f6f 1#include "query.h"
2#include "sms_private.h"
3#include "sms_server.h"
4
5char *Argv[16];
6
7static int ingres_errno = 0;
8
9static ingerr(num)
10 int *num;
11{
12 ingres_errno = SMS_INGRES_ERR; /* "Process lacks permission to */
13 /* alter device status.." */
14 return *num;
15}
16
17sms_open_database()
18{
19 register int i;
20
21 /* initialize local argv */
22 for (i = 0; i < 16; i++)
23 Argv[i] = (char *)malloc(128);
24
25 IIseterr(ingerr);
26
27 ingres_errno = 0;
28
29 /* open the database */
30## ingres sms
31 return ingres_errno;
32}
33
34sms_close_database()
35{
36## exit
37}
38
39sms_process_query(name, argc, argv_ro, action, actarg)
40 char *name;
41 int argc;
42 char *argv_ro[];
43 int (*action)();
44 char *actarg;
45{
46 register struct query *q;
47 register int i;
48 struct query *get_query_by_name();
49 char qual[128];
50
51 /* copy the arguments into a local argv that we can modify */
52 for (i = 0; i < argc; i++)
53 strcpy(Argv[i], argv_ro[i]);
54
55 q = get_query_by_name(name);
56
57 switch (q->type) {
58 case RETRIEVE:
59 if (q->qual) {
60 build_qual(q->qual, q->argc, Argv, qual);
61 do_retrieve_with_qual(q, qual, action);
62 } else
63 do_retrieve(q, action);
64 break;
65
66 case UPDATE:
67 if (q->support_rtn) {
68 if ((*q->support_rtn)(Argv, action) == -1) break;
69 }
70 build_qual(q->qual, q->argc, &Argv[q->sargc], qual);
71 do_update(q, &Argv[q->sargc + q->argc], qual, action);
72 break;
73
74 case APPEND:
75 if (q->support_rtn) {
76 if ((*q->support_rtn)(Argv, action) == -1) break;
77 }
78 do_append(q, &Argv[q->sargc + q->argc], action);
79 break;
80
81 case DELETE:
82 if (q->support_rtn) {
83 if ((*q->support_rtn)(Argv, action) == -1) break;
84 }
85 build_qual(q->qual, q->argc, &Argv[q->sargc], qual);
86 do_delete(q, qual, action);
87 break;
88 }
89}
90
91build_qual(fmt, argc, argv, qual)
92 char *fmt;
93 int argc;
94 char *argv[];
95 char *qual;
96{
97 switch (argc) {
98 case 0:
99 strcpy(qual, fmt);
100 break;
101
102 case 1:
103 sprintf(qual, fmt, argv[0]);
104 break;
105
106 case 2:
107 sprintf(qual, fmt, argv[0], argv[1]);
108 break;
109
110 case 3:
111 sprintf(qual, fmt, argv[0], argv[1], argv[2]);
112 break;
113
114 case 4:
115 sprintf(qual, fmt, argv[0], argv[1], argv[2], argv[3]);
116 break;
117 }
118}
119
120do_retrieve(q, action)
121 register struct query *q;
122 int (*action)();
123## {
124## char *rvar;
125## char *rtable;
126## int rowcount;
127 char status[32];
128 char *sp = status;
129
130 if (q->rvar) {
131 rvar = q->rvar;
132 rtable = q->rtable;
133## range of rvar is rtable
134 }
135
136## retrieve (param (q->tlist, q->vaddr))
137## {
138 if (q->support_rtn)
139 /* save result */
140 (*q->support_rtn)(q->vcnt, q->vaddr, 0, 0);
141 else
142 (*action)(q->vcnt, q->vaddr, &q->vnames[q->argc]);
143## }
144
145## inquire_equel (rowcount = "rowcount")
146
147 if (q->support_rtn) {
148 /* process and send saved results */
149 (*q->support_rtn)(0, 0, &q->vnames[q->argc], action);
150 }
151
152 sprintf(status, "(%d row%s)", rowcount, (rowcount == 1)? "" : "s");
153 (*action)(1, &sp, 0);
154## }
155
156do_retrieve_with_qual(q, qual, action)
157 register struct query *q;
158 char *qual;
159 int (*action)();
160## {
161## char *rvar;
162## char *rtable;
163## char *cqual;
164## int rowcount;
165 char status[32];
166 char *sp = status;
167
168 if (q->rvar) {
169 rvar = q->rvar;
170 rtable = q->rtable;
171## range of rvar is rtable
172 }
173
174 cqual = qual;
175## retrieve (param (q->tlist, q->vaddr))
176## where cqual
177## {
178 if (q->support_rtn)
179 (*q->support_rtn)(q->vcnt, q->vaddr, 0, 0);
180 else
181 (*action)(q->vcnt, q->vaddr, &q->vnames[q->argc]);
182## }
183
184## inquire_equel (rowcount = "rowcount")
185
186 if (q->support_rtn) {
187 (*q->support_rtn)(0, 0, &q->vnames[q->argc], action);
188 }
189
190 sprintf(status, "(%d row%s)", rowcount, (rowcount == 1)? "" : "s");
191 (*action)(1, &sp, 0);
192## }
193
194do_update(q, argv, qual, action)
195 register struct query *q;
196 char *argv[];
197 char *qual;
198 int (*action)();
199## {
200## char *rvar;
201## char *rtable;
202## char *cqual;
203## int rowcount;
204 char status[32];
205 char *sp = status;
206
207 rvar = q->rvar;
208 rtable = q->rtable;
209## range of rvar is rtable
210
211 cqual = qual;
212## replace rvar (param (q->tlist, argv))
213## where cqual
214
215## inquire_equel (rowcount = "rowcount")
216 sprintf(status, "(%d row%s)", rowcount, (rowcount == 1)? "" : "s");
217 (*action)(1, &sp, 0);
218## }
219
220do_append(q, argv, action)
221 register struct query *q;
222 char *argv[];
223 int (*action)();
224## {
225## char *rvar;
226## char *rtable;
227## int rowcount;
228 char status[32];
229 char *sp = status;
230
231 rvar = q->rvar;
232 rtable = q->rtable;
233## range of rvar is rtable
234
235## append to rtable (param (q->tlist, argv))
236
237## inquire_equel (rowcount = "rowcount")
238 sprintf(status, "(%d row%s)", rowcount, (rowcount == 1)? "" : "s");
239 (*action)(1, &sp, 0);
240## }
241
242do_delete(q, qual, action)
243 register struct query *q;
244 char *qual;
245 int (*action)();
246## {
247## char *rvar;
248## char *rtable;
249## char *cqual;
250## int rowcount;
251 char status[32];
252 char *sp = status;
253
254 rvar = q->rvar;
255 rtable = q->rtable;
256## range of rvar is rtable
257
258 cqual = qual;
259## delete rvar where cqual
260
261## inquire_equel (rowcount = "rowcount")
262 sprintf(status, "(%d row%s)", rowcount, (rowcount == 1)? "" : "s");
263 (*action)(1, &sp, 0);
264## }
265
266/* Support Queries */
267
268support_alis(argv, action)
269 char *argv[];
270 int (*action)();
271## {
272## static int list_id;
273
274## range of tbi is tbinfo
275
276## repeat retrieve (list_id = tbi.value1) where tbi.table = "list"
277 list_id++;
278## repeat replace tbi (value1 = @list_id) where tbi.table = "list"
279
280 argv[0] = (char *)&list_id;
281## }
282
283/**
284 ** support_member():
285 **
286 ** support for ADD_MEMBER_TO_LIST
287 ** support for DELETE_MEMBER_FROM_LIST
288 ** support for UPDATE_MEMBER_STATUS
289 **
290 ** Input Output
291 ** argv[0] List Type argv[4] List ID
292 ** argv[1] List Name argv[5] Member ID
293 ** argv[2] Member Type argv[6] Member Type
294 ** argv[3] Member Name
295 **/
296
297support_member(argv, action)
298 char *argv[];
299 int (*action)();
300## {
301## char *list_name;
302## char *list_type;
303## char *member_name;
304## char *member_type;
305## int list_id;
306## int value;
307## int rowcount;
308 char errmsg[64];
309 char *p_errmsg = errmsg;
310
311 list_type = argv[0];
312 list_name = argv[1];
313 member_type = argv[2];
314 member_name = argv[3];
315
316## range of l is list
317## repeat retrieve (list_id = l.id)
318## where l.name = @list_name and l.type = @list_type
319 sprintf(argv[4], "%d", list_id);
320
321 if (!strcmp(member_type, "acl") || !strcmp(member_type, "group") ||
322 !strcmp(member_type, "mail")) {
323## repeat retrieve (value = l.id)
324## where l.name = @member_name and l.type = @member_type
325## inquire_equel (rowcount = "rowcount")
326 if (rowcount == 0) {
327 sprintf(errmsg, "(No such list: %s)", member_name);
328 (*action)(1, p_errmsg, 0);
329 return(-1);
330 }
331 } else if (!strcmp(member_type, "user")) {
332## range of u is users
333## repeat retrieve (value = u.id) where u.login = @member_name
334## inquire_equel (rowcount = "rowcount")
335 if (rowcount == 0) {
336 sprintf(errmsg, "(No such user: %s)", member_name);
337 (*action)(1, p_errmsg, 0);
338 return(-1);
339 }
340 } else if (!strcmp(member_type, "string")) {
341## range of s is strings
342## repeat retrieve (value = s.id) where s.string = @member_name
343## inquire_equel (rowcount = "rowcount")
344 if (rowcount == 0) {
345## range of tbi is tbinfo
346## retrieve (value = tbi.value1) where tbi.table = "strings"
347 value++;
348## replace tbi (value1 = value) where tbi.table = "strings"
349## append to strings (id = value, string = member_name)
350 }
351 } else {
352 sprintf(errmsg, "(Unknown member type: %s)", member_type);
353 (*action)(1, p_errmsg, 0);
354 return(-1);
355 }
356
357 sprintf(argv[5], "%d", value);
358 strcpy(argv[6], member_type);
359## }
360
361/**
362 ** support for GET_LIST_MEMBERS
363 **
364 ** Input Output
365 ** argv[0] Member Type Member Type
366 ** argv[1] Member Id Member Name (ACL, Group, Maillist, User, String)
367 ** argv[2] Member Status Member Status
368 **
369 ** This routine performs two functions:
370 ** When called with argc > 0, it copies and saves argv in a queue
371 ** When called with argc = 0, it does post-processing on the saved
372 ** data, and sends the data to the client using the supplied action
373 ** routine.
374 **/
375
376support_gmol(argc, argv, vnames, action)
377 int argc;
378 char *argv[];
379 char *vnames[];
380 int (*action)();
381## {
382## char *member_type;
383## int member_id;
384## char member_name[33];
385 char **sargv;
386 char *nargv[3];
387 register int n;
388 static struct save_queue *sq = (struct save_queue *)0;
389 struct save_queue *sq_create();
390
391 if (argc > 0) {
392 if (sq == (struct save_queue *)0) {
393 sq = sq_create();
394 }
395 sargv = (char **)malloc(3 * sizeof (char *));
396 /* copy member_type */
397 n = strlen(argv[0]) + 1;
398 sargv[0] = (char *)malloc(n);
399 bcopy(argv[0], sargv[0], n);
400 /* copy member_id */
401 sargv[1] = (char *)malloc(sizeof (int));
402 *(int *)sargv[1] = *(int *)argv[1];
403 /* copy member_status */
404 n = strlen(argv[2]) + 1;
405 sargv[2] = (char *)malloc(n);
406 bcopy(argv[2], sargv[2], n);
407 /* store data */
408 sq_save_data(sq, sargv);
409 return;
410 }
411
412 while (sq_get_data(sq, &sargv)) {
413 member_type = sargv[0];
414 member_id = *(int *)sargv[1];
415
416 nargv[0] = member_type;
417 nargv[1] = member_name;
418 nargv[2] = sargv[2];
419
420 if (!strcmp(member_type, "acl") ||
421 !strcmp(member_type, "group") ||
422 !strcmp(member_type, "mail")) {
423## range of l is list
424## repeat retrieve (member_name = l.name)
425## where l.id = @member_id
426 } else if (!strcmp(member_type, "user")) {
427## range of u is users
428## repeat retrieve (member_name = u.login) where u.id = @member_id
429 } else if (!strcmp(member_type, "string")) {
430## range of s is strings
431## repeat retrieve (member_name = s.string)
432## where s.id = @member_id
433 } else {
434 sprintf(member_name, "%d", member_id);
435 }
436
437 (*action)(3, nargv, vnames);
438 free(sargv[0]);
439 free(sargv[1]);
440 free(sargv[2]);
441 }
442
443 sq_destroy(sq);
444 sq = (struct save_queue *)0;
445## }
This page took 0.974669 seconds and 5 git commands to generate.