]> andersk Git - moira.git/blame - server/qrtn.qc
Use unsigned char rather than char to prevent sign extension
[moira.git] / server / qrtn.qc
CommitLineData
d26cae4e 1/*
2 * $Source$
3 * $Author$
4 * $Header$
5 *
6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
7 *
8 * $Log$
faad6f39 9 * Revision 1.5 1987-06-21 16:37:58 wesommer
10 * Changed include files, reindented things.
d26cae4e 11 *
faad6f39 12 *
13 * Revision 1.4 87/06/08 05:03:27 wesommer
14 * Reindented; added header and trailer.
15 *
d26cae4e 16 */
17
18#ifndef lint
19static char *rcsid_qrtn_qc = "$Header$";
20#endif lint
21
97479f6f 22#include "query.h"
97479f6f 23#include "sms_server.h"
24
25char *Argv[16];
26
27static int ingres_errno = 0;
28
d26cae4e 29/*
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.
33 */
34
35static int ingerr(num)
36 int *num;
97479f6f 37{
d26cae4e 38 ingres_errno = SMS_INGRES_ERR;
39 return *num;
97479f6f 40}
41
d26cae4e 42int sms_open_database()
97479f6f 43{
d26cae4e 44 register int i;
97479f6f 45
d26cae4e 46 /* initialize local argv */
47 for (i = 0; i < 16; i++)
48 Argv[i] = (char *)malloc(128);
97479f6f 49
d26cae4e 50 IIseterr(ingerr);
97479f6f 51
d26cae4e 52 ingres_errno = 0;
97479f6f 53
d26cae4e 54 /* open the database */
55## ingres sms
56 return ingres_errno;
97479f6f 57}
58
d26cae4e 59int sms_close_database()
97479f6f 60{
d26cae4e 61## exit
62
97479f6f 63}
64
65sms_process_query(name, argc, argv_ro, action, actarg)
d26cae4e 66 char *name;
67 int argc;
68 char *argv_ro[];
69 int (*action)();
70 char *actarg;
97479f6f 71{
d26cae4e 72 register struct query *q;
73 register int i;
74 struct query *get_query_by_name();
75 char qual[128];
76
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]);
80
81 q = get_query_by_name(name);
82
83 switch (q->type) {
faad6f39 84 case RETRIEVE:
d26cae4e 85 if (q->qual) {
86 build_qual(q->qual, q->argc, Argv, qual);
87 do_retrieve_with_qual(q, qual, action, actarg);
88 } else
89 do_retrieve(q, action, actarg);
90 break;
91
faad6f39 92 case UPDATE:
d26cae4e 93 if (q->support_rtn) {
94 if ((*q->support_rtn)(Argv, action, actarg) == -1)
97479f6f 95 break;
d26cae4e 96 }
97 build_qual(q->qual, q->argc, &Argv[q->sargc], qual);
98 do_update(q, &Argv[q->sargc + q->argc], qual, action, actarg);
99 break;
97479f6f 100
faad6f39 101 case APPEND:
d26cae4e 102 if (q->support_rtn) {
103 if ((*q->support_rtn)(Argv, action, actarg) == -1)
97479f6f 104 break;
d26cae4e 105 }
106 do_append(q, &Argv[q->sargc + q->argc], action, actarg);
107 break;
97479f6f 108
faad6f39 109 case DELETE:
d26cae4e 110 if (q->support_rtn) {
111 if ((*q->support_rtn)(Argv, action, actarg) == -1)
97479f6f 112 break;
113 }
d26cae4e 114 build_qual(q->qual, q->argc, &Argv[q->sargc], qual);
115 do_delete(q, qual, action, actarg);
116 break;
117 }
97479f6f 118}
119
120build_qual(fmt, argc, argv, qual)
121 char *fmt;
122 int argc;
123 char *argv[];
124 char *qual;
125{
d26cae4e 126 switch (argc) {
127 case 0:
128 strcpy(qual, fmt);
129 break;
130
131 case 1:
132 sprintf(qual, fmt, argv[0]);
133 break;
134
135 case 2:
136 sprintf(qual, fmt, argv[0], argv[1]);
137 break;
138
139 case 3:
140 sprintf(qual, fmt, argv[0], argv[1], argv[2]);
141 break;
142
143 case 4:
144 sprintf(qual, fmt, argv[0], argv[1], argv[2], argv[3]);
145 break;
146 }
97479f6f 147}
148
e38c941b 149do_retrieve(q, action, actarg)
d26cae4e 150 register struct query *q;
151 int (*action)();
152 char *actarg;
153##{
154## char *rvar;
155## char *rtable;
156## int rowcount;
157
158 if (q->rvar) {
159 rvar = q->rvar;
160 rtable = q->rtable;
161## range of rvar is rtable
162 }
97479f6f 163
d26cae4e 164## retrieve (param (q->tlist, q->vaddr)) {
165 if (q->support_rtn)
166 /* save result */
167 (*q->support_rtn)(q->vcnt, q->vaddr, 0, 0);
168 else
169 (*action)(q->vcnt, q->vaddr, actarg);
170## }
97479f6f 171
d26cae4e 172## inquire_equel (rowcount = "rowcount")
97479f6f 173
d26cae4e 174 if (q->support_rtn) {
175 /* process and send saved results */
176 (*q->support_rtn)(0, 0, &q->vnames[q->argc], action, actarg);
177 }
97479f6f 178
d26cae4e 179##}
97479f6f 180
e38c941b 181do_retrieve_with_qual(q, qual, action, actarg)
d26cae4e 182 register struct query *q;
183 char *qual;
184 int (*action)();
185 char *actarg;
186##{
187## char *rvar;
188## char *rtable;
189## char *cqual;
190## int rowcount;
97479f6f 191
d26cae4e 192 if (q->rvar) {
193 rvar = q->rvar;
194 rtable = q->rtable;
195## range of rvar is rtable
196 }
97479f6f 197
d26cae4e 198 cqual = qual;
199## retrieve (param (q->tlist, q->vaddr))
200## where cqual {
201 if (q->support_rtn)
202 (*q->support_rtn)(q->vcnt, q->vaddr, 0, 0);
203 else
204 (*action)(q->vcnt, q->vaddr, actarg);
205## }
97479f6f 206
d26cae4e 207## inquire_equel (rowcount = "rowcount")
97479f6f 208
d26cae4e 209 if (q->support_rtn) {
210 (*q->support_rtn)(0, 0, &q->vnames[q->argc], action, actarg);
211 }
97479f6f 212
d26cae4e 213##}
97479f6f 214
e38c941b 215do_update(q, argv, qual, action, actarg)
d26cae4e 216 register struct query *q;
217 char *argv[];
218 char *qual;
219 int (*action)();
220 char *actarg;
221##{
222## char *rvar;
223## char *rtable;
224## char *cqual;
225## int rowcount;
97479f6f 226
d26cae4e 227 rvar = q->rvar;
228 rtable = q->rtable;
229## range of rvar is rtable
97479f6f 230
d26cae4e 231 cqual = qual;
232## replace rvar (param (q->tlist, argv))
233## where cqual
97479f6f 234
d26cae4e 235##}
97479f6f 236
e38c941b 237do_append(q, argv, action, actarg)
d26cae4e 238 register struct query *q;
239 char *argv[];
240 int (*action)();
241 char *actarg;
242##{
243## char *rvar;
244## char *rtable;
97479f6f 245
d26cae4e 246 rvar = q->rvar;
247 rtable = q->rtable;
248## range of rvar is rtable
97479f6f 249
d26cae4e 250## append to rtable (param (q->tlist, argv))
97479f6f 251
d26cae4e 252##}
97479f6f 253
e38c941b 254do_delete(q, qual, action, actarg)
d26cae4e 255 register struct query *q;
256 char *qual;
257 int (*action)();
258 char *actarg;
259##{
260## char *rvar;
261## char *rtable;
262## char *cqual;
97479f6f 263
d26cae4e 264 rvar = q->rvar;
265 rtable = q->rtable;
266## range of rvar is rtable
97479f6f 267
d26cae4e 268 cqual = qual;
269## delete rvar where cqual
97479f6f 270
d26cae4e 271##}
97479f6f 272
273/* Support Queries */
274
e38c941b 275support_alis(argv, action, actarg)
d26cae4e 276 char *argv[];
277 int (*action)();
278 char *actarg;
279##{
280## static int list_id;
97479f6f 281
d26cae4e 282## range of tbi is tbinfo
97479f6f 283
d26cae4e 284## repeat retrieve (list_id = tbi.value1) where tbi.table = "list"
285 list_id++;
286## repeat replace tbi (value1 = @list_id) where tbi.table = "list"
97479f6f 287
d26cae4e 288 argv[0] = (char *)&list_id;
289##}
97479f6f 290
291/**
292 ** support_member():
293 **
294 ** support for ADD_MEMBER_TO_LIST
295 ** support for DELETE_MEMBER_FROM_LIST
296 ** support for UPDATE_MEMBER_STATUS
297 **
298 ** Input Output
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
303 **/
304
e38c941b 305support_member(argv, action, actarg)
97479f6f 306 char *argv[];
307 int (*action)();
e38c941b 308 char *actarg;
d26cae4e 309##{
310## char *list_name;
311## char *list_type;
312## char *member_name;
313## char *member_type;
314## int list_id;
315## int value;
316## int rowcount;
317 char errmsg[64];
318 char *p_errmsg = errmsg;
319
320 list_type = argv[0];
321 list_name = argv[1];
322 member_type = argv[2];
323 member_name = argv[3];
324
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);
329
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")
335 if (rowcount == 0) {
336 sprintf(errmsg, "(No such list: %s)", member_name);
337 (*action)(1, p_errmsg, actarg);
338 return(-1);
339 }
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")
344 if (rowcount == 0) {
345 sprintf(errmsg, "(No such user: %s)", member_name);
346 (*action)(1, p_errmsg, actarg);
347 return(-1);
348 }
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")
353 if (rowcount == 0) {
354## range of tbi is tbinfo
355## retrieve (value = tbi.value1) where tbi.table = "strings"
356 value++;
357## replace tbi (value1 = value) where tbi.table = "strings"
358## append to strings (id = value, string = member_name)
97479f6f 359 }
d26cae4e 360 } else {
361 sprintf(errmsg, "(Unknown member type: %s)", member_type);
362 (*action)(1, p_errmsg, actarg);
363 return(-1);
364 }
97479f6f 365
d26cae4e 366 sprintf(argv[5], "%d", value);
367 strcpy(argv[6], member_type);
368 return(0);
369##}
97479f6f 370
371/**
372 ** support for GET_LIST_MEMBERS
373 **
374 ** Input Output
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
378 **
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
383 ** routine.
384 **/
385
e38c941b 386support_gmol(argc, argv, vnames, action, actarg)
d26cae4e 387 int argc;
388 char *argv[];
389 char *vnames[];
390 int (*action)();
391 char *actarg;
392##{
393## char *member_type;
394## int member_id;
395## char member_name[33];
396 char **sargv;
397 char *nargv[3];
398 register int n;
399 static struct save_queue *sq = (struct save_queue *)0;
400 struct save_queue *sq_create();
401
402 if (argc > 0) {
403 if (sq == (struct save_queue *)0) {
404 sq = sq_create();
97479f6f 405 }
d26cae4e 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);
411 /* copy member_id */
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);
418 /* store data */
419 sq_save_data(sq, sargv);
420 return;
421 }
422
423 while (sq_get_data(sq, &sargv)) {
424 member_type = sargv[0];
425 member_id = *(int *)sargv[1];
426
427 nargv[0] = member_type;
428 nargv[1] = member_name;
429 nargv[2] = sargv[2];
430
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
445 } else {
446 sprintf(member_name, "%d", member_id);
97479f6f 447 }
448
d26cae4e 449 (*action)(3, nargv, vnames, actarg);
450 free(sargv[0]);
451 free(sargv[1]);
452 free(sargv[2]);
453 }
454
455 sq_destroy(sq);
456 sq = (struct save_queue *)0;
457##}
458
459/*
460 * Local Variables:
461 * mode: c
462 * c-indent-level: 4
463 * c-continued-statement-offset: 4
464 * c-brace-offset: -4
465 * c-argdecl-indent: 4
466 * c-label-offset: -4
467 * End:
468 */
469
This page took 0.229997 seconds and 5 git commands to generate.