]> andersk Git - moira.git/blame - server/qsubs.c
Initial revision
[moira.git] / server / qsubs.c
CommitLineData
97479f6f 1#include "query.h"
2
3extern struct query Queries[];
4extern int QueryCount;
5extern struct s_query S_Queries[];
6extern int S_QueryCount;
7
8struct query *
9get_query_by_name(name)
10 register char *name;
11{
12 register struct query *q;
13 register int i;
14
15 q = Queries;
16 i = QueryCount;
17
18 if (strlen(name) == 4) {
19 while (--i >= 0) {
20 if (!strcmp(q->shortname, name)) return(q);
21 q++;
22 }
23 } else {
24 while (--i >= 0) {
25 if (!strcmp(q->name, name)) return(q);
26 q++;
27 }
28 }
29
30 return((struct query *)0);
31}
32
33get_input_fields(q, argc, argv)
34 register struct query *q;
35 int *argc;
36 char ***argv;
37{
38 *argv = q->fields;
39 *argc = q->sargc + q->argc;
40 if (q->type == UPDATE || q->type == APPEND)
41 *argc += q->vcnt;
42}
43
44get_output_fields(q, argc, argv)
45 register struct query *q;
46 int *argc;
47 char ***argv;
48{
49 if (q->type == RETRIEVE) {
50 *argc = q->vcnt;
51 *argv = &q->fields[q->sargc + q->argc];
52 } else {
53 *argc = 0;
54 *argv = (char **)0;
55 }
56}
57
58char *
59get_field(q, argv, name)
60 register struct query *q;
61 char *argv[];
62 char *name;
63{
64 register char **fp;
65 register char *field;
66 register int i;
67
68 if (q->type != RETRIEVE) return((char *)0);
69
70 if (*name == '*') name++;
71 fp = &q->fields[q->sargc + q->argc];
72 for (i = 0; i < q->vcnt; i++) {
73 field = *fp++;
74 if (*field == '*') field++;
75 if (!strcmp(field, name)) return(argv[i]);
76 }
77 return((char *)0);
78}
79
80put_field(q, argv, name, value)
81 register struct query *q;
82 char *argv[];
83 char *name;
84 char *value;
85{
86 register char **fp;
87 register char *field;
88 register int i;
89 register int n;
90
91 n = q->sargc + q->argc;
92 if (q->type == UPDATE || q->type == APPEND) n += q->vcnt;
93
94 if (*name == '*') name++;
95 fp = q->fields;
96 for (i = 0; i < n; i++) {
97 field = *fp++;
98 if (*field == '*') field++;
99 if (!strcmp(field, name)) {
100 strcpy(argv[i], value);
101 return(0);
102 }
103 }
104 return(-1);
105}
106
107
108/* Generic Queue Routines */
109
110struct save_queue *
111sq_create()
112{
113 register struct save_queue *sq;
114
115 sq = (struct save_queue *)malloc(sizeof (struct save_queue));
116 sq->q_next = sq;
117 sq->q_prev = sq;
118 sq->q_lastget = 0;
119 return(sq);
120}
121
122sq_save_data(sq, data)
123 register struct save_queue *sq;
124 char *data;
125{
126 register struct save_queue *q;
127
128 q = (struct save_queue *)malloc(sizeof (struct save_queue));
129 q->q_next = sq;
130 q->q_prev = sq->q_prev;
131 sq->q_prev->q_next = q;
132 sq->q_prev = q;
133 q->q_data = data;
134}
135
136sq_get_data(sq, data)
137 register struct save_queue *sq;
138 register char **data;
139{
140 if (sq->q_lastget == (struct save_queue *)0) {
141 sq->q_lastget = sq->q_next;
142 } else {
143 sq->q_lastget = sq->q_lastget->q_next;
144 }
145
146 if (sq->q_lastget == sq) return(0);
147 *data = sq->q_lastget->q_data;
148 return(1);
149}
150
151sq_destroy(sq)
152 register struct save_queue *sq;
153{
154 register struct save_queue *q;
155
156 for (q = sq->q_next; q != sq; q = sq->q_next) {
157 sq->q_next = q->q_next;
158 free(q);
159 }
160 free(sq);
161}
This page took 0.069437 seconds and 5 git commands to generate.