6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
9 * Revision 1.5 1987-06-21 16:37:58 wesommer
10 * Changed include files, reindented things.
13 * Revision 1.4 87/06/08 05:03:27 wesommer
14 * Reindented; added header and trailer.
19 static char *rcsid_qrtn_qc = "$Header$";
23 #include "sms_server.h"
27 static int ingres_errno = 0;
30 * ingerr: (supposedly) called when Ingres indicates an error.
31 * I have not yet been able to get this to work to intercept a
32 * database open error.
35 static int ingerr(num)
38 ingres_errno = SMS_INGRES_ERR;
42 int sms_open_database()
46 /* initialize local argv */
47 for (i = 0; i < 16; i++)
48 Argv[i] = (char *)malloc(128);
54 /* open the database */
59 int sms_close_database()
65 sms_process_query(name, argc, argv_ro, action, actarg)
72 register struct query *q;
74 struct query *get_query_by_name();
77 /* copy the arguments into a local argv that we can modify */
78 for (i = 0; i < argc; i++)
79 strcpy(Argv[i], argv_ro[i]);
81 q = get_query_by_name(name);
86 build_qual(q->qual, q->argc, Argv, qual);
87 do_retrieve_with_qual(q, qual, action, actarg);
89 do_retrieve(q, action, actarg);
94 if ((*q->support_rtn)(Argv, action, actarg) == -1)
97 build_qual(q->qual, q->argc, &Argv[q->sargc], qual);
98 do_update(q, &Argv[q->sargc + q->argc], qual, action, actarg);
102 if (q->support_rtn) {
103 if ((*q->support_rtn)(Argv, action, actarg) == -1)
106 do_append(q, &Argv[q->sargc + q->argc], action, actarg);
110 if (q->support_rtn) {
111 if ((*q->support_rtn)(Argv, action, actarg) == -1)
114 build_qual(q->qual, q->argc, &Argv[q->sargc], qual);
115 do_delete(q, qual, action, actarg);
120 build_qual(fmt, argc, argv, qual)
132 sprintf(qual, fmt, argv[0]);
136 sprintf(qual, fmt, argv[0], argv[1]);
140 sprintf(qual, fmt, argv[0], argv[1], argv[2]);
144 sprintf(qual, fmt, argv[0], argv[1], argv[2], argv[3]);
149 do_retrieve(q, action, actarg)
150 register struct query *q;
161 ## range of rvar is rtable
164 ## retrieve (param (q->tlist, q->vaddr)) {
167 (*q->support_rtn)(q->vcnt, q->vaddr, 0, 0);
169 (*action)(q->vcnt, q->vaddr, actarg);
172 ## inquire_equel (rowcount = "rowcount")
174 if (q->support_rtn) {
175 /* process and send saved results */
176 (*q->support_rtn)(0, 0, &q->vnames[q->argc], action, actarg);
181 do_retrieve_with_qual(q, qual, action, actarg)
182 register struct query *q;
195 ## range of rvar is rtable
199 ## retrieve (param (q->tlist, q->vaddr))
202 (*q->support_rtn)(q->vcnt, q->vaddr, 0, 0);
204 (*action)(q->vcnt, q->vaddr, actarg);
207 ## inquire_equel (rowcount = "rowcount")
209 if (q->support_rtn) {
210 (*q->support_rtn)(0, 0, &q->vnames[q->argc], action, actarg);
215 do_update(q, argv, qual, action, actarg)
216 register struct query *q;
229 ## range of rvar is rtable
232 ## replace rvar (param (q->tlist, argv))
237 do_append(q, argv, action, actarg)
238 register struct query *q;
248 ## range of rvar is rtable
250 ## append to rtable (param (q->tlist, argv))
254 do_delete(q, qual, action, actarg)
255 register struct query *q;
266 ## range of rvar is rtable
269 ## delete rvar where cqual
273 /* Support Queries */
275 support_alis(argv, action, actarg)
280 ## static int list_id;
282 ## range of tbi is tbinfo
284 ## repeat retrieve (list_id = tbi.value1) where tbi.table = "list"
286 ## repeat replace tbi (value1 = @list_id) where tbi.table = "list"
288 argv[0] = (char *)&list_id;
294 ** support for ADD_MEMBER_TO_LIST
295 ** support for DELETE_MEMBER_FROM_LIST
296 ** support for UPDATE_MEMBER_STATUS
299 ** argv[0] List Type argv[4] List ID
300 ** argv[1] List Name argv[5] Member ID
301 ** argv[2] Member Type argv[6] Member Type
302 ** argv[3] Member Name
305 support_member(argv, action, actarg)
312 ## char *member_name;
313 ## char *member_type;
318 char *p_errmsg = errmsg;
322 member_type = argv[2];
323 member_name = argv[3];
325 ## range of l is list
326 ## repeat retrieve (list_id = l.id)
327 ## where l.name = @list_name and l.type = @list_type
328 sprintf(argv[4], "%d", list_id);
330 if (!strcmp(member_type, "acl") || !strcmp(member_type, "group") ||
331 !strcmp(member_type, "mail")) {
332 ## repeat retrieve (value = l.id)
333 ## where l.name = @member_name and l.type = @member_type
334 ## inquire_equel (rowcount = "rowcount")
336 sprintf(errmsg, "(No such list: %s)", member_name);
337 (*action)(1, p_errmsg, actarg);
340 } else if (!strcmp(member_type, "user")) {
341 ## range of u is users
342 ## repeat retrieve (value = u.id) where u.login = @member_name
343 ## inquire_equel (rowcount = "rowcount")
345 sprintf(errmsg, "(No such user: %s)", member_name);
346 (*action)(1, p_errmsg, actarg);
349 } else if (!strcmp(member_type, "string")) {
350 ## range of s is strings
351 ## repeat retrieve (value = s.id) where s.string = @member_name
352 ## inquire_equel (rowcount = "rowcount")
354 ## range of tbi is tbinfo
355 ## retrieve (value = tbi.value1) where tbi.table = "strings"
357 ## replace tbi (value1 = value) where tbi.table = "strings"
358 ## append to strings (id = value, string = member_name)
361 sprintf(errmsg, "(Unknown member type: %s)", member_type);
362 (*action)(1, p_errmsg, actarg);
366 sprintf(argv[5], "%d", value);
367 strcpy(argv[6], member_type);
372 ** support for GET_LIST_MEMBERS
375 ** argv[0] Member Type Member Type
376 ** argv[1] Member Id Member Name (ACL, Group, Maillist, User, String)
377 ** argv[2] Member Status Member Status
379 ** This routine performs two functions:
380 ** When called with argc > 0, it copies and saves argv in a queue
381 ** When called with argc = 0, it does post-processing on the saved
382 ** data, and sends the data to the client using the supplied action
386 support_gmol(argc, argv, vnames, action, actarg)
393 ## char *member_type;
395 ## char member_name[33];
399 static struct save_queue *sq = (struct save_queue *)0;
400 struct save_queue *sq_create();
403 if (sq == (struct save_queue *)0) {
406 sargv = (char **)malloc(3 * sizeof (char *));
407 /* copy member_type */
408 n = strlen(argv[0]) + 1;
409 sargv[0] = (char *)malloc(n);
410 bcopy(argv[0], sargv[0], n);
412 sargv[1] = (char *)malloc(sizeof (int));
413 *(int *)sargv[1] = *(int *)argv[1];
414 /* copy member_status */
415 n = strlen(argv[2]) + 1;
416 sargv[2] = (char *)malloc(n);
417 bcopy(argv[2], sargv[2], n);
419 sq_save_data(sq, sargv);
423 while (sq_get_data(sq, &sargv)) {
424 member_type = sargv[0];
425 member_id = *(int *)sargv[1];
427 nargv[0] = member_type;
428 nargv[1] = member_name;
431 if (!strcmp(member_type, "acl") ||
432 !strcmp(member_type, "group") ||
433 !strcmp(member_type, "mail")) {
434 ## range of l is list
435 ## repeat retrieve (member_name = l.name)
436 ## where l.id = @member_id
437 } else if (!strcmp(member_type, "user")) {
438 ## range of u is users
439 ## repeat retrieve (member_name = u.login)
440 ## where u.id = @member_id
441 } else if (!strcmp(member_type, "string")) {
442 ## range of s is strings
443 ## repeat retrieve (member_name = s.string)
444 ## where s.id = @member_id
446 sprintf(member_name, "%d", member_id);
449 (*action)(3, nargv, vnames, actarg);
456 sq = (struct save_queue *)0;
463 * c-continued-statement-offset: 4
465 * c-argdecl-indent: 4