2 #include "sms_private.h"
3 #include "sms_server.h"
7 static int ingres_errno = 0;
12 ingres_errno = SMS_INGRES_ERR; /* "Process lacks permission to */
13 /* alter device status.." */
21 /* initialize local argv */
22 for (i = 0; i < 16; i++)
23 Argv[i] = (char *)malloc(128);
29 /* open the database */
39 sms_process_query(name, argc, argv_ro, action, actarg)
46 register struct query *q;
48 struct query *get_query_by_name();
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]);
55 q = get_query_by_name(name);
60 build_qual(q->qual, q->argc, Argv, qual);
61 do_retrieve_with_qual(q, qual, action, actarg);
63 do_retrieve(q, action, actarg);
68 if ((*q->support_rtn)(Argv, action, actarg) == -1)
71 build_qual(q->qual, q->argc, &Argv[q->sargc], qual);
72 do_update(q, &Argv[q->sargc + q->argc], qual, action, actarg);
77 if ((*q->support_rtn)(Argv, action, actarg) == -1)
80 do_append(q, &Argv[q->sargc + q->argc], action, actarg);
85 if ((*q->support_rtn)(Argv, action, actarg) == -1)
88 build_qual(q->qual, q->argc, &Argv[q->sargc], qual);
89 do_delete(q, qual, action, actarg);
94 build_qual(fmt, argc, argv, qual)
106 sprintf(qual, fmt, argv[0]);
110 sprintf(qual, fmt, argv[0], argv[1]);
114 sprintf(qual, fmt, argv[0], argv[1], argv[2]);
118 sprintf(qual, fmt, argv[0], argv[1], argv[2], argv[3]);
123 do_retrieve(q, action, actarg)
124 register struct query *q;
137 ## range of rvar is rtable
140 ## retrieve (param (q->tlist, q->vaddr))
144 (*q->support_rtn)(q->vcnt, q->vaddr, 0, 0);
146 (*action)(q->vcnt, q->vaddr, actarg);
149 ## inquire_equel (rowcount = "rowcount")
151 if (q->support_rtn) {
152 /* process and send saved results */
153 (*q->support_rtn)(0, 0, &q->vnames[q->argc], action, actarg);
157 sprintf(status, "(%d row%s)", rowcount, (rowcount == 1)? "" : "s");
158 (*action)(1, &sp, actarg);
162 do_retrieve_with_qual(q, qual, action, actarg)
163 register struct query *q;
178 ## range of rvar is rtable
182 ## retrieve (param (q->tlist, q->vaddr))
186 (*q->support_rtn)(q->vcnt, q->vaddr, 0, 0);
188 (*action)(q->vcnt, q->vaddr, actarg);
191 ## inquire_equel (rowcount = "rowcount")
193 if (q->support_rtn) {
194 (*q->support_rtn)(0, 0, &q->vnames[q->argc], action, actarg);
198 sprintf(status, "(%d row%s)", rowcount, (rowcount == 1)? "" : "s");
199 (*action)(1, &sp, actarg);
203 do_update(q, argv, qual, action, actarg)
204 register struct query *q;
219 ## range of rvar is rtable
222 ## replace rvar (param (q->tlist, argv))
225 ## inquire_equel (rowcount = "rowcount")
226 sprintf(status, "(%d row%s)", rowcount, (rowcount == 1)? "" : "s");
227 (*action)(1, &sp, actarg);
230 do_append(q, argv, action, actarg)
231 register struct query *q;
244 ## range of rvar is rtable
246 ## append to rtable (param (q->tlist, argv))
249 ## inquire_equel (rowcount = "rowcount")
250 sprintf(status, "(%d row%s)", rowcount, (rowcount == 1)? "" : "s");
251 (*action)(1, &sp, actarg);
255 do_delete(q, qual, action, actarg)
256 register struct query *q;
270 ## range of rvar is rtable
273 ## delete rvar where cqual
276 ## inquire_equel (rowcount = "rowcount")
277 sprintf(status, "(%d row%s)", rowcount, (rowcount == 1)? "" : "s");
278 (*action)(1, &sp, actarg);
282 /* Support Queries */
284 support_alis(argv, action, actarg)
289 ## static int list_id;
291 ## range of tbi is tbinfo
293 ## repeat retrieve (list_id = tbi.value1) where tbi.table = "list"
295 ## repeat replace tbi (value1 = @list_id) where tbi.table = "list"
297 argv[0] = (char *)&list_id;
303 ** support for ADD_MEMBER_TO_LIST
304 ** support for DELETE_MEMBER_FROM_LIST
305 ** support for UPDATE_MEMBER_STATUS
308 ** argv[0] List Type argv[4] List ID
309 ** argv[1] List Name argv[5] Member ID
310 ** argv[2] Member Type argv[6] Member Type
311 ** argv[3] Member Name
314 support_member(argv, action, actarg)
321 ## char *member_name;
322 ## char *member_type;
327 char *p_errmsg = errmsg;
331 member_type = argv[2];
332 member_name = argv[3];
334 ## range of l is list
335 ## repeat retrieve (list_id = l.id)
336 ## where l.name = @list_name and l.type = @list_type
337 sprintf(argv[4], "%d", list_id);
339 if (!strcmp(member_type, "acl") || !strcmp(member_type, "group") ||
340 !strcmp(member_type, "mail")) {
341 ## repeat retrieve (value = l.id)
342 ## where l.name = @member_name and l.type = @member_type
343 ## inquire_equel (rowcount = "rowcount")
345 sprintf(errmsg, "(No such list: %s)", member_name);
346 (*action)(1, p_errmsg, actarg);
349 } else if (!strcmp(member_type, "user")) {
350 ## range of u is users
351 ## repeat retrieve (value = u.id) where u.login = @member_name
352 ## inquire_equel (rowcount = "rowcount")
354 sprintf(errmsg, "(No such user: %s)", member_name);
355 (*action)(1, p_errmsg, actarg);
358 } else if (!strcmp(member_type, "string")) {
359 ## range of s is strings
360 ## repeat retrieve (value = s.id) where s.string = @member_name
361 ## inquire_equel (rowcount = "rowcount")
363 ## range of tbi is tbinfo
364 ## retrieve (value = tbi.value1) where tbi.table = "strings"
366 ## replace tbi (value1 = value) where tbi.table = "strings"
367 ## append to strings (id = value, string = member_name)
370 sprintf(errmsg, "(Unknown member type: %s)", member_type);
371 (*action)(1, p_errmsg, actarg);
375 sprintf(argv[5], "%d", value);
376 strcpy(argv[6], member_type);
380 ** support for GET_LIST_MEMBERS
383 ** argv[0] Member Type Member Type
384 ** argv[1] Member Id Member Name (ACL, Group, Maillist, User, String)
385 ** argv[2] Member Status Member Status
387 ** This routine performs two functions:
388 ** When called with argc > 0, it copies and saves argv in a queue
389 ** When called with argc = 0, it does post-processing on the saved
390 ** data, and sends the data to the client using the supplied action
394 support_gmol(argc, argv, vnames, action, actarg)
401 ## char *member_type;
403 ## char member_name[33];
407 static struct save_queue *sq = (struct save_queue *)0;
408 struct save_queue *sq_create();
411 if (sq == (struct save_queue *)0) {
414 sargv = (char **)malloc(3 * sizeof (char *));
415 /* copy member_type */
416 n = strlen(argv[0]) + 1;
417 sargv[0] = (char *)malloc(n);
418 bcopy(argv[0], sargv[0], n);
420 sargv[1] = (char *)malloc(sizeof (int));
421 *(int *)sargv[1] = *(int *)argv[1];
422 /* copy member_status */
423 n = strlen(argv[2]) + 1;
424 sargv[2] = (char *)malloc(n);
425 bcopy(argv[2], sargv[2], n);
427 sq_save_data(sq, sargv);
431 while (sq_get_data(sq, &sargv)) {
432 member_type = sargv[0];
433 member_id = *(int *)sargv[1];
435 nargv[0] = member_type;
436 nargv[1] = member_name;
439 if (!strcmp(member_type, "acl") ||
440 !strcmp(member_type, "group") ||
441 !strcmp(member_type, "mail")) {
442 ## range of l is list
443 ## repeat retrieve (member_name = l.name)
444 ## where l.id = @member_id
445 } else if (!strcmp(member_type, "user")) {
446 ## range of u is users
447 ## repeat retrieve (member_name = u.login)
448 ## where u.id = @member_id
449 } else if (!strcmp(member_type, "string")) {
450 ## range of s is strings
451 ## repeat retrieve (member_name = s.string)
452 ## where s.id = @member_id
454 sprintf(member_name, "%d", member_id);
457 (*action)(3, nargv, vnames, actarg);
464 sq = (struct save_queue *)0;