nxt_tstr.c (2246:5f4056478375) nxt_tstr.c (2247:baa6b9879267)
1
2/*
3 * Copyright (C) NGINX, Inc.
4 */
5
6#include <nxt_main.h>
7
8
9typedef enum {
10 NXT_TSTR_CONST = 0,
11 NXT_TSTR_VAR,
1
2/*
3 * Copyright (C) NGINX, Inc.
4 */
5
6#include <nxt_main.h>
7
8
9typedef enum {
10 NXT_TSTR_CONST = 0,
11 NXT_TSTR_VAR,
12#if (NXT_HAVE_NJS)
13 NXT_TSTR_JS,
14#endif
12} nxt_tstr_type_t;
13
14
15struct nxt_tstr_s {
16 nxt_str_t str;
15} nxt_tstr_type_t;
16
17
18struct nxt_tstr_s {
19 nxt_str_t str;
17 nxt_var_t *var;
20
21 union {
22 nxt_var_t *var;
23#if (NXT_HAVE_NJS)
24 nxt_js_t *js;
25#endif
26 } u;
27
18 nxt_tstr_flags_t flags;
19 nxt_tstr_type_t type;
20};
21
22
23struct nxt_tstr_query_s {
24 nxt_mp_t *pool;
25
26 nxt_tstr_state_t *state;
28 nxt_tstr_flags_t flags;
29 nxt_tstr_type_t type;
30};
31
32
33struct nxt_tstr_query_s {
34 nxt_mp_t *pool;
35
36 nxt_tstr_state_t *state;
27 nxt_var_cache_t *cache;
37 nxt_tstr_cache_t *cache;
28
29 nxt_uint_t waiting;
30 nxt_uint_t failed; /* 1 bit */
31
32 void *ctx;
33 void *data;
34
35 nxt_work_handler_t ready;
36 nxt_work_handler_t error;
37};
38
39
38
39 nxt_uint_t waiting;
40 nxt_uint_t failed; /* 1 bit */
41
42 void *ctx;
43 void *data;
44
45 nxt_work_handler_t ready;
46 nxt_work_handler_t error;
47};
48
49
50#define nxt_tstr_is_js(str) \
51 nxt_strchr_start(str, '`')
52
53
40nxt_tstr_state_t *
54nxt_tstr_state_t *
41nxt_tstr_state_new(nxt_mp_t *mp)
55nxt_tstr_state_new(nxt_mp_t *mp, nxt_bool_t test)
42{
43 nxt_tstr_state_t *state;
44
45 state = nxt_mp_get(mp, sizeof(nxt_tstr_state_t));
46 if (nxt_slow_path(state == NULL)) {
47 return NULL;
48 }
49
50 state->pool = mp;
56{
57 nxt_tstr_state_t *state;
58
59 state = nxt_mp_get(mp, sizeof(nxt_tstr_state_t));
60 if (nxt_slow_path(state == NULL)) {
61 return NULL;
62 }
63
64 state->pool = mp;
65 state->test = test;
51
52 state->var_fields = nxt_array_create(mp, 4, sizeof(nxt_var_field_t));
53 if (nxt_slow_path(state->var_fields == NULL)) {
54 return NULL;
55 }
56
66
67 state->var_fields = nxt_array_create(mp, 4, sizeof(nxt_var_field_t));
68 if (nxt_slow_path(state->var_fields == NULL)) {
69 return NULL;
70 }
71
72#if (NXT_HAVE_NJS)
73 state->jcf = nxt_js_conf_new(mp);
74 if (nxt_slow_path(state->jcf == NULL)) {
75 return NULL;
76 }
77#endif
78
57 return state;
58}
59
60
61nxt_tstr_t *
62nxt_tstr_compile(nxt_tstr_state_t *state, nxt_str_t *str,
63 nxt_tstr_flags_t flags)
64{

--- 18 unchanged lines hidden (view full) ---

83 p = nxt_cpymem(tstr->str.start, str->start, str->length);
84
85 if (strz) {
86 *p = '\0';
87 }
88
89 tstr->flags = flags;
90
79 return state;
80}
81
82
83nxt_tstr_t *
84nxt_tstr_compile(nxt_tstr_state_t *state, nxt_str_t *str,
85 nxt_tstr_flags_t flags)
86{

--- 18 unchanged lines hidden (view full) ---

105 p = nxt_cpymem(tstr->str.start, str->start, str->length);
106
107 if (strz) {
108 *p = '\0';
109 }
110
111 tstr->flags = flags;
112
91 p = nxt_memchr(str->start, '$', str->length);
113 if (nxt_tstr_is_js(str)) {
92
114
93 if (p != NULL) {
94 tstr->type = NXT_TSTR_VAR;
115#if (NXT_HAVE_NJS)
95
116
96 tstr->var = nxt_var_compile(&tstr->str, state->pool, state->var_fields);
97 if (nxt_slow_path(tstr->var == NULL)) {
117 nxt_str_t tpl;
118
119 tstr->type = NXT_TSTR_JS;
120
121 nxt_tstr_str(tstr, &tpl);
122
123 tstr->u.js = nxt_js_add_tpl(state->jcf, &tpl, strz);
124 if (nxt_slow_path(tstr->u.js == NULL)) {
98 return NULL;
99 }
100
125 return NULL;
126 }
127
128#endif
129
101 } else {
130 } else {
102 tstr->type = NXT_TSTR_CONST;
131 p = memchr(str->start, '$', str->length);
132
133 if (p != NULL) {
134 tstr->type = NXT_TSTR_VAR;
135
136 tstr->u.var = nxt_var_compile(&tstr->str, state->pool,
137 state->var_fields);
138 if (nxt_slow_path(tstr->u.var == NULL)) {
139 return NULL;
140 }
141
142 } else {
143 tstr->type = NXT_TSTR_CONST;
144 }
103 }
104
105 return tstr;
106}
107
108
109nxt_int_t
110nxt_tstr_test(nxt_tstr_state_t *state, nxt_str_t *str, u_char *error)
111{
145 }
146
147 return tstr;
148}
149
150
151nxt_int_t
152nxt_tstr_test(nxt_tstr_state_t *state, nxt_str_t *str, u_char *error)
153{
112 return nxt_var_test(str, state->var_fields, error);
154 u_char *p;
155
156 if (nxt_tstr_is_js(str)) {
157#if (NXT_HAVE_NJS)
158 return nxt_js_test(state->jcf, str, error);
159
160#else
161 nxt_sprintf(error, error + NXT_MAX_ERROR_STR,
162 "Unit is built without support of njs: "
163 "\"--njs\" ./configure option is missing.");
164 return NXT_ERROR;
165#endif
166
167 } else {
168 p = memchr(str->start, '$', str->length);
169
170 if (p != NULL) {
171 return nxt_var_test(str, state->var_fields, error);
172 }
173 }
174
175 return NXT_OK;
113}
114
115
176}
177
178
179nxt_int_t
180nxt_tstr_state_done(nxt_tstr_state_t *state, u_char *error)
181{
182#if (NXT_HAVE_NJS)
183 if (!state->test) {
184 nxt_int_t ret;
185
186 ret = nxt_js_compile(state->jcf);
187 if (nxt_slow_path(ret != NXT_OK)) {
188 return NXT_ERROR;
189 }
190 }
191#endif
192
193 return NXT_OK;
194}
195
196
116nxt_bool_t
117nxt_tstr_is_const(nxt_tstr_t *tstr)
118{
119 return (tstr->type == NXT_TSTR_CONST);
120}
121
122
123void

--- 4 unchanged lines hidden (view full) ---

128 if (tstr->flags & NXT_TSTR_STRZ) {
129 str->length--;
130 }
131}
132
133
134nxt_int_t
135nxt_tstr_query_init(nxt_tstr_query_t **query_p, nxt_tstr_state_t *state,
197nxt_bool_t
198nxt_tstr_is_const(nxt_tstr_t *tstr)
199{
200 return (tstr->type == NXT_TSTR_CONST);
201}
202
203
204void

--- 4 unchanged lines hidden (view full) ---

209 if (tstr->flags & NXT_TSTR_STRZ) {
210 str->length--;
211 }
212}
213
214
215nxt_int_t
216nxt_tstr_query_init(nxt_tstr_query_t **query_p, nxt_tstr_state_t *state,
136 nxt_var_cache_t *cache, void *ctx, nxt_mp_t *mp)
217 nxt_tstr_cache_t *cache, void *ctx, nxt_mp_t *mp)
137{
138 nxt_tstr_query_t *query;
139
140 query = *query_p;
141
142 if (*query_p == NULL) {
143 query = nxt_mp_zget(mp, sizeof(nxt_tstr_query_t));
144 if (nxt_slow_path(query == NULL)) {

--- 22 unchanged lines hidden (view full) ---

167 nxt_tstr_str(tstr, val);
168 return;
169 }
170
171 if (nxt_slow_path(query->failed)) {
172 return;
173 }
174
218{
219 nxt_tstr_query_t *query;
220
221 query = *query_p;
222
223 if (*query_p == NULL) {
224 query = nxt_mp_zget(mp, sizeof(nxt_tstr_query_t));
225 if (nxt_slow_path(query == NULL)) {

--- 22 unchanged lines hidden (view full) ---

248 nxt_tstr_str(tstr, val);
249 return;
250 }
251
252 if (nxt_slow_path(query->failed)) {
253 return;
254 }
255
175 ret = nxt_var_interpreter(task, query->cache, tstr->var, val, query->ctx,
176 tstr->flags & NXT_TSTR_LOGGING);
177 if (nxt_slow_path(ret != NXT_OK)) {
178 query->failed = 1;
179 return;
256 if (tstr->type == NXT_TSTR_VAR) {
257 ret = nxt_var_interpreter(task, &query->cache->var, tstr->u.var, val,
258 query->ctx, tstr->flags & NXT_TSTR_LOGGING);
259
260 if (nxt_slow_path(ret != NXT_OK)) {
261 query->failed = 1;
262 return;
263 }
264
265 } else {
266#if (NXT_HAVE_NJS)
267 ret = nxt_js_call(task, &query->cache->js, tstr->u.js, val, query->ctx);
268
269 if (nxt_slow_path(ret != NXT_OK)) {
270 query->failed = 1;
271 return;
272 }
273#endif
180 }
181
182 if (tstr->flags & NXT_TSTR_STRZ) {
183 val->length--;
184 }
185
186#if (NXT_DEBUG)
187 nxt_str_t str;
188
189 nxt_tstr_str(tstr, &str);
190
274 }
275
276 if (tstr->flags & NXT_TSTR_STRZ) {
277 val->length--;
278 }
279
280#if (NXT_DEBUG)
281 nxt_str_t str;
282
283 nxt_tstr_str(tstr, &str);
284
191 nxt_debug(task, "tstr: \"%V\" -> \"%V\"", &str, val);
285 nxt_debug(task, "tstr query: \"%V\", result: \"%V\"", &str, val);
192#endif
193}
194
195
196void
197nxt_tstr_query_resolve(nxt_task_t *task, nxt_tstr_query_t *query, void *data,
198 nxt_work_handler_t ready, nxt_work_handler_t error)
199{

--- 24 unchanged lines hidden ---
286#endif
287}
288
289
290void
291nxt_tstr_query_resolve(nxt_task_t *task, nxt_tstr_query_t *query, void *data,
292 nxt_work_handler_t ready, nxt_work_handler_t error)
293{

--- 24 unchanged lines hidden ---