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