]>
Commit | Line | Data |
---|---|---|
97479f6f | 1 | #include "query.h" |
2 | ||
3 | extern struct query Queries[]; | |
4 | extern int QueryCount; | |
5 | extern struct s_query S_Queries[]; | |
6 | extern int S_QueryCount; | |
7 | ||
8 | struct query * | |
9 | get_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 | ||
33 | get_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 | ||
44 | get_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 | ||
58 | char * | |
59 | get_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 | ||
80 | put_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 | ||
110 | struct save_queue * | |
111 | sq_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 | ||
122 | sq_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 | ||
136 | sq_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 | ||
151 | sq_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 | } |