]> andersk Git - moira.git/blame - server/qsubs.c
punt mrgdb
[moira.git] / server / qsubs.c
CommitLineData
7ac48069 1/* $Id$
3e10560e 2 *
7ac48069 3 * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
4 * For copying and distribution information, please see the file
5 * <mit-copyright.h>.
3e10560e 6 */
7
c801de4c 8#include <mit-copyright.h>
03c05291 9#include "mr_server.h"
97479f6f 10#include "query.h"
11
7ac48069 12#include <stdlib.h>
13
14RCSID("$Header$");
15
c5a0c32c 16extern struct query Queries2[];
17extern int QueryCount2;
97479f6f 18
7ac48069 19int qcmp(const void *q1, const void *q2);
20
85330553 21struct query *get_query_by_name(char *name)
97479f6f 22{
44d12d58 23 struct query *q;
24 int i;
5eaef520 25
26 q = Queries2;
27 i = QueryCount2;
28
29 if (strlen(name) == 4)
30 {
31 while (--i >= 0)
32 {
33 if (!strcmp(q->shortname, name))
34 return q;
35 q++;
97479f6f 36 }
5eaef520 37 }
38 else
39 {
40 while (--i >= 0)
41 {
42 if (!strcmp(q->name, name))
43 return q;
44 q++;
3e10560e 45 }
46 }
97479f6f 47
5eaef520 48 return NULL;
97479f6f 49}
50
85330553 51void list_queries(int (*action)(int, char *[], void *), void *actarg)
ab70c698 52{
44d12d58 53 struct query *q;
54 int i;
5eaef520 55 static struct query **squeries2 = NULL;
44d12d58 56 struct query **sq;
ab70c698 57 char qnames[80];
58 char *qnp;
c351960a 59 int count;
ab70c698 60
5eaef520 61 count = QueryCount2;
62 if (!squeries2)
63 {
64 sq = malloc(count * sizeof(struct query *));
65 squeries2 = sq;
66 q = Queries2;
67 for (i = count; --i >= 0; )
68 *sq++ = q++;
69 qsort(squeries2, count, sizeof(struct query *), qcmp);
70 }
71 sq = squeries2;
ab70c698 72
73 qnp = qnames;
5eaef520 74 for (i = count; --i >= 0; sq++)
75 {
ab70c698 76 sprintf(qnames, "%s (%s)", (*sq)->name, (*sq)->shortname);
77 (*action)(1, &qnp, actarg);
5eaef520 78 }
c351960a 79 strcpy(qnames, "_help");
80 (*action)(1, &qnp, actarg);
81 strcpy(qnames, "_list_queries");
82 (*action)(1, &qnp, actarg);
83 strcpy(qnames, "_list_users");
84 (*action)(1, &qnp, actarg);
ab70c698 85}
86
7ac48069 87void help_query(struct query *q, int (*action)(int, char *[], void *),
88 void *actarg)
ab70c698 89{
44d12d58 90 int argcount;
91 int i;
5eaef520 92 char argn[32];
93 char qname[512];
94 char argr[512];
95 char *argv[32];
ab70c698 96
5eaef520 97 argcount = q->argc;
98 if (q->type == UPDATE || q->type == APPEND)
99 argcount += q->vcnt;
ab70c698 100
5eaef520 101 switch (argcount)
102 {
ab70c698 103 case 0:
5eaef520 104 sprintf(qname, " %s, %s ()", q->name, q->shortname);
105 argv[0] = qname;
106 argcount = 1;
107 break;
ab70c698 108
109 case 1:
5eaef520 110 sprintf(qname, " %s, %s (%s)", q->name, q->shortname, q->fields[0]);
111 argv[0] = qname;
112 argcount = 1;
113 break;
ab70c698 114
115 case 2:
5eaef520 116 sprintf(qname, " %s, %s (%s, %s)", q->name, q->shortname,
117 q->fields[0], q->fields[1]);
118 argv[0] = qname;
119 argcount = 1;
120 break;
ab70c698 121
122 default:
5eaef520 123 sprintf(qname, " %s, %s (%s", q->name, q->shortname, q->fields[0]);
124 argv[0] = qname;
125 argcount--;
126 for (i = 1; i < argcount; i++)
127 argv[i] = q->fields[i];
128 sprintf(argn, "%s)", q->fields[argcount]);
129 argv[argcount++] = argn;
130 break;
ab70c698 131 }
5eaef520 132
133 if (q->type == RETRIEVE)
134 {
135 sprintf(argr, "%s => %s", argv[--argcount], q->fields[q->argc]);
136 argv[argcount++] = argr;
137 if (q->vcnt > 1)
138 {
139 for (i = q->argc + 1; i < q->vcnt + q->argc; i++)
140 argv[argcount++] = q->fields[i];
141 }
c351960a 142 }
5eaef520 143 (*action)(argcount, argv, actarg);
ab70c698 144}
145
7ac48069 146int qcmp(const void *q1, const void *q2)
ab70c698 147{
7ac48069 148 return strcmp((*(struct query **)q1)->name, (*(struct query **)q2)->name);
ab70c698 149}
This page took 0.528035 seconds and 5 git commands to generate.