agoo 2.5.5 → 2.5.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of agoo might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +1 -1
- data/ext/agoo/agoo.c +4 -3
- data/ext/agoo/atomic.h +120 -0
- data/ext/agoo/bind.c +52 -52
- data/ext/agoo/bind.h +13 -13
- data/ext/agoo/con.c +499 -481
- data/ext/agoo/con.h +47 -39
- data/ext/agoo/debug.c +42 -42
- data/ext/agoo/debug.h +1 -1
- data/ext/agoo/doc.c +17 -17
- data/ext/agoo/doc.h +12 -12
- data/ext/agoo/err.c +18 -18
- data/ext/agoo/err.h +27 -27
- data/ext/agoo/error_stream.c +9 -9
- data/ext/agoo/extconf.rb +3 -0
- data/ext/agoo/gqlintro.c +43 -43
- data/ext/agoo/gqlintro.h +1 -1
- data/ext/agoo/gqlvalue.c +131 -131
- data/ext/agoo/gqlvalue.h +32 -32
- data/ext/agoo/graphql.c +158 -158
- data/ext/agoo/graphql.h +34 -33
- data/ext/agoo/hook.c +15 -14
- data/ext/agoo/hook.h +18 -14
- data/ext/agoo/http.c +14 -14
- data/ext/agoo/http.h +4 -4
- data/ext/agoo/kinds.h +5 -5
- data/ext/agoo/log.c +232 -224
- data/ext/agoo/log.h +93 -93
- data/ext/agoo/method.h +17 -17
- data/ext/agoo/page.c +88 -86
- data/ext/agoo/page.h +21 -21
- data/ext/agoo/pub.c +36 -36
- data/ext/agoo/pub.h +23 -23
- data/ext/agoo/queue.c +37 -38
- data/ext/agoo/queue.h +20 -19
- data/ext/agoo/rack_logger.c +13 -13
- data/ext/agoo/ready.c +357 -0
- data/ext/agoo/ready.h +41 -0
- data/ext/agoo/req.c +11 -11
- data/ext/agoo/req.h +30 -31
- data/ext/agoo/request.c +46 -46
- data/ext/agoo/request.h +2 -2
- data/ext/agoo/res.c +40 -18
- data/ext/agoo/res.h +14 -14
- data/ext/agoo/response.c +6 -6
- data/ext/agoo/response.h +9 -9
- data/ext/agoo/rhook.c +3 -3
- data/ext/agoo/rhook.h +1 -1
- data/ext/agoo/rlog.c +47 -42
- data/ext/agoo/rlog.h +0 -1
- data/ext/agoo/rresponse.c +33 -33
- data/ext/agoo/rresponse.h +1 -1
- data/ext/agoo/rserver.c +184 -175
- data/ext/agoo/rserver.h +2 -2
- data/ext/agoo/rupgraded.c +41 -41
- data/ext/agoo/rupgraded.h +3 -3
- data/ext/agoo/sdl.c +80 -80
- data/ext/agoo/sdl.h +1 -1
- data/ext/agoo/seg.h +2 -2
- data/ext/agoo/server.c +143 -117
- data/ext/agoo/server.h +43 -42
- data/ext/agoo/sse.c +7 -7
- data/ext/agoo/sse.h +4 -4
- data/ext/agoo/subject.c +5 -5
- data/ext/agoo/subject.h +6 -6
- data/ext/agoo/text.c +21 -21
- data/ext/agoo/text.h +14 -13
- data/ext/agoo/upgraded.c +41 -40
- data/ext/agoo/upgraded.h +41 -40
- data/ext/agoo/websocket.c +42 -42
- data/ext/agoo/websocket.h +16 -16
- data/lib/agoo/version.rb +1 -1
- data/test/static_test.rb +2 -0
- metadata +5 -5
- data/ext/agoo/log_queue.h +0 -30
- data/ext/agoo/sub.c +0 -111
- data/ext/agoo/sub.h +0 -36
data/ext/agoo/rserver.h
CHANGED
@@ -7,13 +7,13 @@
|
|
7
7
|
|
8
8
|
#define MAX_WORKERS 32
|
9
9
|
|
10
|
-
typedef struct
|
10
|
+
typedef struct _rServer {
|
11
11
|
int worker_cnt;
|
12
12
|
int worker_pids[MAX_WORKERS];
|
13
13
|
VALUE *eval_threads; // Qnil terminated
|
14
14
|
} *RServer;
|
15
15
|
|
16
|
-
extern struct
|
16
|
+
extern struct _rServer the_rserver;
|
17
17
|
|
18
18
|
extern void server_init(VALUE mod);
|
19
19
|
extern VALUE rserver_shutdown(VALUE self);
|
data/ext/agoo/rupgraded.c
CHANGED
@@ -22,16 +22,16 @@ static VALUE websocket_sym;
|
|
22
22
|
static ID on_open_id = 0;
|
23
23
|
static ID to_s_id = 0;
|
24
24
|
|
25
|
-
static
|
25
|
+
static agooUpgraded
|
26
26
|
get_upgraded(VALUE self) {
|
27
|
-
|
27
|
+
agooUpgraded up = NULL;
|
28
28
|
|
29
|
-
if (
|
30
|
-
pthread_mutex_lock(&
|
29
|
+
if (agoo_server.active) {
|
30
|
+
pthread_mutex_lock(&agoo_server.up_lock);
|
31
31
|
if (NULL != (up = DATA_PTR(self))) {
|
32
32
|
atomic_fetch_add(&up->ref_cnt, 1);
|
33
33
|
}
|
34
|
-
pthread_mutex_unlock(&
|
34
|
+
pthread_mutex_unlock(&agoo_server.up_lock);
|
35
35
|
}
|
36
36
|
return up;
|
37
37
|
}
|
@@ -68,10 +68,10 @@ extract_subject(VALUE subject, int *slen) {
|
|
68
68
|
*/
|
69
69
|
static VALUE
|
70
70
|
rup_write(VALUE self, VALUE msg) {
|
71
|
-
|
72
|
-
const char
|
73
|
-
size_t
|
74
|
-
bool
|
71
|
+
agooUpgraded up = get_upgraded(self);
|
72
|
+
const char *message;
|
73
|
+
size_t mlen;
|
74
|
+
bool bin = false;
|
75
75
|
|
76
76
|
if (NULL == up) {
|
77
77
|
return Qfalse;
|
@@ -88,7 +88,7 @@ rup_write(VALUE self, VALUE msg) {
|
|
88
88
|
message = StringValuePtr(rs);
|
89
89
|
mlen = RSTRING_LEN(rs);
|
90
90
|
}
|
91
|
-
return
|
91
|
+
return agoo_upgraded_write(up, message, mlen, bin, false) ? Qtrue : Qfalse;
|
92
92
|
}
|
93
93
|
|
94
94
|
/* Document-method: subscribe
|
@@ -104,12 +104,12 @@ rup_write(VALUE self, VALUE msg) {
|
|
104
104
|
*/
|
105
105
|
static VALUE
|
106
106
|
rup_subscribe(VALUE self, VALUE subject) {
|
107
|
-
|
108
|
-
int
|
109
|
-
const char
|
107
|
+
agooUpgraded up;
|
108
|
+
int slen;
|
109
|
+
const char *subj = extract_subject(subject, &slen);
|
110
110
|
|
111
111
|
if (NULL != (up = get_upgraded(self))) {
|
112
|
-
|
112
|
+
agoo_upgraded_subscribe(up, subj, slen, false);
|
113
113
|
}
|
114
114
|
return Qnil;
|
115
115
|
}
|
@@ -125,15 +125,15 @@ rup_subscribe(VALUE self, VALUE subject) {
|
|
125
125
|
*/
|
126
126
|
static VALUE
|
127
127
|
rup_unsubscribe(int argc, VALUE *argv, VALUE self) {
|
128
|
-
|
129
|
-
const char
|
130
|
-
int
|
128
|
+
agooUpgraded up;
|
129
|
+
const char *subject = NULL;
|
130
|
+
int slen = 0;
|
131
131
|
|
132
132
|
if (0 < argc) {
|
133
133
|
subject = extract_subject(argv[0], &slen);
|
134
134
|
}
|
135
135
|
if (NULL != (up = get_upgraded(self))) {
|
136
|
-
|
136
|
+
agoo_upgraded_unsubscribe(up, subject, slen, false);
|
137
137
|
}
|
138
138
|
return Qnil;
|
139
139
|
}
|
@@ -146,10 +146,10 @@ rup_unsubscribe(int argc, VALUE *argv, VALUE self) {
|
|
146
146
|
*/
|
147
147
|
static VALUE
|
148
148
|
rup_close(VALUE self) {
|
149
|
-
|
149
|
+
agooUpgraded up = get_upgraded(self);
|
150
150
|
|
151
151
|
if (NULL != up) {
|
152
|
-
|
152
|
+
agoo_upgraded_close(up, false);
|
153
153
|
}
|
154
154
|
return Qnil;
|
155
155
|
}
|
@@ -163,11 +163,11 @@ rup_close(VALUE self) {
|
|
163
163
|
*/
|
164
164
|
static VALUE
|
165
165
|
rup_pending(VALUE self) {
|
166
|
-
|
167
|
-
int
|
166
|
+
agooUpgraded up = get_upgraded(self);
|
167
|
+
int pending = -1;
|
168
168
|
|
169
169
|
if (NULL != up) {
|
170
|
-
pending =
|
170
|
+
pending = agoo_upgraded_pending(up);
|
171
171
|
atomic_fetch_sub(&up->ref_cnt, 1);
|
172
172
|
}
|
173
173
|
return INT2NUM(pending);
|
@@ -181,11 +181,11 @@ rup_pending(VALUE self) {
|
|
181
181
|
*/
|
182
182
|
static VALUE
|
183
183
|
rup_open(VALUE self) {
|
184
|
-
|
185
|
-
int
|
184
|
+
agooUpgraded up = get_upgraded(self);
|
185
|
+
int pending = -1;
|
186
186
|
|
187
187
|
if (NULL != up) {
|
188
|
-
pending = atomic_load(&up->pending);
|
188
|
+
pending = (int)(long)atomic_load(&up->pending);
|
189
189
|
atomic_fetch_sub(&up->ref_cnt, 1);
|
190
190
|
}
|
191
191
|
return 0 <= pending ? Qtrue : Qfalse;
|
@@ -202,43 +202,43 @@ static VALUE
|
|
202
202
|
rup_protocol(VALUE self) {
|
203
203
|
VALUE pro = Qnil;
|
204
204
|
|
205
|
-
if (
|
206
|
-
|
205
|
+
if (agoo_server.active) {
|
206
|
+
agooUpgraded up;
|
207
207
|
|
208
|
-
pthread_mutex_lock(&
|
208
|
+
pthread_mutex_lock(&agoo_server.up_lock);
|
209
209
|
if (NULL != (up = DATA_PTR(self)) && NULL != up->con) {
|
210
210
|
switch (up->con->bind->kind) {
|
211
|
-
case
|
211
|
+
case AGOO_CON_WS:
|
212
212
|
pro = websocket_sym;
|
213
213
|
break;
|
214
|
-
case
|
214
|
+
case AGOO_CON_SSE:
|
215
215
|
pro = sse_sym;
|
216
216
|
break;
|
217
217
|
default:
|
218
218
|
break;
|
219
219
|
}
|
220
220
|
}
|
221
|
-
pthread_mutex_unlock(&
|
221
|
+
pthread_mutex_unlock(&agoo_server.up_lock);
|
222
222
|
}
|
223
223
|
return pro;
|
224
224
|
}
|
225
225
|
|
226
226
|
static void
|
227
|
-
on_destroy(
|
227
|
+
on_destroy(agooUpgraded up) {
|
228
228
|
if (Qnil != (VALUE)up->wrap) {
|
229
229
|
DATA_PTR((VALUE)up->wrap) = NULL;
|
230
230
|
up->wrap = (void*)Qnil;
|
231
231
|
}
|
232
232
|
}
|
233
233
|
|
234
|
-
|
235
|
-
rupgraded_create(
|
236
|
-
|
234
|
+
agooUpgraded
|
235
|
+
rupgraded_create(agooCon c, VALUE obj, VALUE env) {
|
236
|
+
agooUpgraded up;
|
237
237
|
|
238
|
-
if (!
|
238
|
+
if (!agoo_server.active) {
|
239
239
|
rb_raise(rb_eIOError, "Server shutdown.");
|
240
240
|
}
|
241
|
-
if (NULL != (up =
|
241
|
+
if (NULL != (up = agoo_upgraded_create(c, (void*)obj, (void*)env))) {
|
242
242
|
up->on_empty = rb_respond_to(obj, rb_intern("on_drained"));
|
243
243
|
up->on_close = rb_respond_to(obj, rb_intern("on_close"));
|
244
244
|
up->on_shut = rb_respond_to(obj, rb_intern("on_shutdown"));
|
@@ -248,7 +248,7 @@ rupgraded_create(Con c, VALUE obj, VALUE env) {
|
|
248
248
|
|
249
249
|
up->wrap = (void*)Data_Wrap_Struct(upgraded_class, NULL, NULL, up);
|
250
250
|
|
251
|
-
|
251
|
+
agoo_server_add_upgraded(up);
|
252
252
|
|
253
253
|
if (rb_respond_to(obj, on_open_id)) {
|
254
254
|
rb_funcall(obj, on_open_id, 1, (VALUE)up->wrap);
|
@@ -265,11 +265,11 @@ extern VALUE ragoo_publish(VALUE self, VALUE subject, VALUE message);
|
|
265
265
|
* call-seq: env()
|
266
266
|
*
|
267
267
|
* Returns the environment passed to the call method that initiated the
|
268
|
-
*
|
268
|
+
* agooUpgraded Object creation.
|
269
269
|
*/
|
270
270
|
static VALUE
|
271
271
|
env(VALUE self) {
|
272
|
-
|
272
|
+
agooUpgraded up = get_upgraded(self);
|
273
273
|
|
274
274
|
if (NULL != up) {
|
275
275
|
return (VALUE)up->env;
|
data/ext/agoo/rupgraded.h
CHANGED
@@ -7,10 +7,10 @@
|
|
7
7
|
|
8
8
|
#include "upgraded.h"
|
9
9
|
|
10
|
-
struct
|
10
|
+
struct _agooCon;
|
11
11
|
|
12
|
-
extern void
|
13
|
-
extern
|
12
|
+
extern void upgraded_init(VALUE mod);
|
13
|
+
extern agooUpgraded rupgraded_create(struct _agooCon *c, VALUE obj, VALUE env);
|
14
14
|
|
15
15
|
extern const char* extract_subject(VALUE subject, int *slen);
|
16
16
|
|
data/ext/agoo/sdl.c
CHANGED
@@ -9,56 +9,56 @@
|
|
9
9
|
#include "sdl.h"
|
10
10
|
|
11
11
|
static int
|
12
|
-
extract_name(
|
12
|
+
extract_name(agooErr err, agooDoc doc, const char *key, int klen, char *name, size_t max) {
|
13
13
|
const char *start;
|
14
14
|
size_t nlen;
|
15
15
|
|
16
16
|
if (0 != strncmp(doc->cur, key, klen)) {
|
17
|
-
return
|
17
|
+
return agoo_doc_err(doc, err, "Expected %s key word", key);
|
18
18
|
}
|
19
19
|
doc->cur += klen;
|
20
|
-
if (0 ==
|
21
|
-
return
|
20
|
+
if (0 == agoo_doc_skip_white(doc)) {
|
21
|
+
return agoo_doc_err(doc, err, "Expected %s key word", key);
|
22
22
|
}
|
23
23
|
start = doc->cur;
|
24
|
-
|
24
|
+
agoo_doc_read_token(doc);
|
25
25
|
if (doc->cur == start) {
|
26
|
-
return
|
26
|
+
return agoo_doc_err(doc, err, "Name not provided");
|
27
27
|
}
|
28
28
|
nlen = doc->cur - start;
|
29
29
|
if (max <= nlen) {
|
30
|
-
return
|
30
|
+
return agoo_doc_err(doc, err, "Name too long");
|
31
31
|
}
|
32
32
|
strncpy(name, start, nlen);
|
33
33
|
name[nlen] = '\0';
|
34
34
|
|
35
|
-
return
|
35
|
+
return AGOO_ERR_OK;
|
36
36
|
}
|
37
37
|
|
38
38
|
static int
|
39
|
-
make_scalar(
|
39
|
+
make_scalar(agooErr err, agooDoc doc, const char *desc, int len) {
|
40
40
|
char name[256];
|
41
41
|
|
42
|
-
if (
|
42
|
+
if (AGOO_ERR_OK != extract_name(err, doc, "scalar", 6, name, sizeof(name))) {
|
43
43
|
return err->code;
|
44
44
|
}
|
45
45
|
gql_scalar_create(err, name, desc, len, false);
|
46
46
|
|
47
|
-
return
|
47
|
+
return AGOO_ERR_OK;
|
48
48
|
}
|
49
49
|
|
50
50
|
static int
|
51
|
-
make_enum(
|
51
|
+
make_enum(agooErr err, agooDoc doc, const char *desc, int len) {
|
52
52
|
char name[256];
|
53
53
|
const char *start;
|
54
54
|
gqlType type;
|
55
55
|
|
56
|
-
if (
|
56
|
+
if (AGOO_ERR_OK != extract_name(err, doc, "enum", 4, name, sizeof(name))) {
|
57
57
|
return err->code;
|
58
58
|
}
|
59
|
-
|
59
|
+
agoo_doc_skip_white(doc);
|
60
60
|
if ('{' != *doc->cur) {
|
61
|
-
return
|
61
|
+
return agoo_doc_err(doc, err, "Expected '{'");
|
62
62
|
}
|
63
63
|
doc->cur++;
|
64
64
|
|
@@ -66,60 +66,60 @@ make_enum(Err err, Doc doc, const char *desc, int len) {
|
|
66
66
|
return err->code;
|
67
67
|
}
|
68
68
|
while (doc->cur < doc->end) {
|
69
|
-
|
69
|
+
agoo_doc_skip_white(doc);
|
70
70
|
start = doc->cur;
|
71
|
-
|
71
|
+
agoo_doc_read_token(doc);
|
72
72
|
if (doc->cur == start) {
|
73
73
|
if ('}' == *doc->cur) {
|
74
74
|
doc->cur++;
|
75
75
|
break;
|
76
76
|
}
|
77
|
-
return
|
77
|
+
return agoo_doc_err(doc, err, "Invalid Enum value");
|
78
78
|
}
|
79
|
-
if (
|
79
|
+
if (AGOO_ERR_OK != gql_enum_add(err, type, start, (int)(doc->cur - start))) {
|
80
80
|
return err->code;
|
81
81
|
}
|
82
82
|
}
|
83
|
-
return
|
83
|
+
return AGOO_ERR_OK;
|
84
84
|
}
|
85
85
|
|
86
86
|
static int
|
87
|
-
make_union(
|
87
|
+
make_union(agooErr err, agooDoc doc, const char *desc, int len) {
|
88
88
|
char name[256];
|
89
89
|
const char *start;
|
90
90
|
gqlType type;
|
91
91
|
|
92
|
-
if (
|
92
|
+
if (AGOO_ERR_OK != extract_name(err, doc, "union", 5, name, sizeof(name))) {
|
93
93
|
return err->code;
|
94
94
|
}
|
95
|
-
|
95
|
+
agoo_doc_skip_white(doc);
|
96
96
|
if ('=' != *doc->cur) {
|
97
|
-
return
|
97
|
+
return agoo_doc_err(doc, err, "Expected '='");
|
98
98
|
}
|
99
99
|
doc->cur++;
|
100
|
-
|
100
|
+
agoo_doc_skip_white(doc);
|
101
101
|
|
102
102
|
if (NULL == (type = gql_union_create(err, name, desc, len, false))) {
|
103
103
|
return err->code;
|
104
104
|
}
|
105
105
|
while (doc->cur < doc->end) {
|
106
|
-
|
106
|
+
agoo_doc_skip_white(doc);
|
107
107
|
start = doc->cur;
|
108
|
-
|
109
|
-
if (
|
108
|
+
agoo_doc_read_token(doc);
|
109
|
+
if (AGOO_ERR_OK != gql_union_add(err, type, start, (int)(doc->cur - start))) {
|
110
110
|
return err->code;
|
111
111
|
}
|
112
|
-
|
112
|
+
agoo_doc_skip_white(doc);
|
113
113
|
if ('|' != *doc->cur) {
|
114
114
|
break;
|
115
115
|
}
|
116
116
|
doc->cur++; // skip |
|
117
117
|
}
|
118
|
-
return
|
118
|
+
return AGOO_ERR_OK;
|
119
119
|
}
|
120
120
|
|
121
121
|
static int
|
122
|
-
make_arg(
|
122
|
+
make_arg(agooErr err, agooDoc doc, gqlDir dir) {
|
123
123
|
char name[256];
|
124
124
|
char type_name[256];
|
125
125
|
const char *start;
|
@@ -129,10 +129,10 @@ make_arg(Err err, Doc doc, gqlDir dir) {
|
|
129
129
|
bool required = false;
|
130
130
|
gqlValue dv = NULL;
|
131
131
|
|
132
|
-
|
132
|
+
agoo_doc_skip_white(doc);
|
133
133
|
if ('"' == *doc->cur) {
|
134
134
|
desc = doc->cur + 1;
|
135
|
-
if (
|
135
|
+
if (AGOO_ERR_OK != agoo_doc_read_string(err, doc)) {
|
136
136
|
return err->code;
|
137
137
|
}
|
138
138
|
if ('"' == *desc) { // must be a """
|
@@ -142,81 +142,81 @@ make_arg(Err err, Doc doc, gqlDir dir) {
|
|
142
142
|
desc_end = doc->cur - 1;
|
143
143
|
}
|
144
144
|
}
|
145
|
-
|
145
|
+
agoo_doc_skip_white(doc);
|
146
146
|
start = doc->cur;
|
147
|
-
|
147
|
+
agoo_doc_read_token(doc);
|
148
148
|
if (doc->cur == start) {
|
149
|
-
return
|
149
|
+
return agoo_doc_err(doc, err, "Argument name not provided");
|
150
150
|
}
|
151
151
|
if (':' != *doc->cur) {
|
152
|
-
return
|
152
|
+
return agoo_doc_err(doc, err, "Expected ':'");
|
153
153
|
}
|
154
154
|
nlen = doc->cur - start;
|
155
155
|
if (sizeof(name) <= nlen) {
|
156
|
-
return
|
156
|
+
return agoo_doc_err(doc, err, "Name too long");
|
157
157
|
}
|
158
158
|
strncpy(name, start, nlen);
|
159
159
|
name[nlen] = '\0';
|
160
160
|
doc->cur++;
|
161
161
|
|
162
162
|
// read type
|
163
|
-
|
163
|
+
agoo_doc_skip_white(doc);
|
164
164
|
start = doc->cur;
|
165
|
-
|
165
|
+
agoo_doc_read_token(doc);
|
166
166
|
if (doc->cur == start) {
|
167
|
-
return
|
167
|
+
return agoo_doc_err(doc, err, "Argument type not provided");
|
168
168
|
}
|
169
169
|
nlen = doc->cur - start;
|
170
170
|
if (sizeof(type_name) <= nlen) {
|
171
|
-
return
|
171
|
+
return agoo_doc_err(doc, err, "Type name too long");
|
172
172
|
}
|
173
173
|
strncpy(type_name, start, nlen);
|
174
174
|
type_name[nlen] = '\0';
|
175
175
|
|
176
|
-
|
176
|
+
agoo_doc_skip_white(doc);
|
177
177
|
if ('!' == *doc->cur) {
|
178
178
|
required = true;
|
179
179
|
} else if ('=' == *doc->cur) {
|
180
|
-
if (NULL == (dv =
|
180
|
+
if (NULL == (dv = agoo_doc_read_value(err, doc))) {
|
181
181
|
return err->code;
|
182
182
|
}
|
183
183
|
}
|
184
|
-
|
184
|
+
agoo_doc_skip_white(doc);
|
185
185
|
if ('@' == *doc->cur) {
|
186
186
|
// TBD directive
|
187
187
|
}
|
188
188
|
if (NULL == gql_dir_arg(err, dir, name, type_name, desc, (int)(desc_end - desc), dv, required)) {
|
189
189
|
return err->code;
|
190
190
|
}
|
191
|
-
return
|
191
|
+
return AGOO_ERR_OK;
|
192
192
|
}
|
193
193
|
|
194
194
|
static int
|
195
|
-
make_directive(
|
195
|
+
make_directive(agooErr err, agooDoc doc, const char *desc, int len) {
|
196
196
|
char name[256];
|
197
197
|
const char *start;
|
198
198
|
gqlDir dir;
|
199
199
|
size_t nlen;
|
200
200
|
|
201
201
|
if (0 != strncmp(doc->cur, "directive", 9)) {
|
202
|
-
return
|
202
|
+
return agoo_doc_err(doc, err, "Expected directive key word");
|
203
203
|
}
|
204
204
|
doc->cur += 9;
|
205
|
-
if (0 ==
|
206
|
-
return
|
205
|
+
if (0 == agoo_doc_skip_white(doc)) {
|
206
|
+
return agoo_doc_err(doc, err, "Expected directive key word");
|
207
207
|
}
|
208
208
|
if ('@' != *doc->cur) {
|
209
|
-
return
|
209
|
+
return agoo_doc_err(doc, err, "Expected '@'");
|
210
210
|
}
|
211
211
|
doc->cur++;
|
212
212
|
start = doc->cur;
|
213
|
-
|
213
|
+
agoo_doc_read_token(doc);
|
214
214
|
if (doc->cur == start) {
|
215
|
-
return
|
215
|
+
return agoo_doc_err(doc, err, "Name not provided");
|
216
216
|
}
|
217
217
|
nlen = doc->cur - start;
|
218
218
|
if (sizeof(name) <= nlen) {
|
219
|
-
return
|
219
|
+
return agoo_doc_err(doc, err, "Name too long");
|
220
220
|
}
|
221
221
|
strncpy(name, start, nlen);
|
222
222
|
name[nlen] = '\0';
|
@@ -225,53 +225,53 @@ make_directive(Err err, Doc doc, const char *desc, int len) {
|
|
225
225
|
}
|
226
226
|
if ('(' == *doc->cur) {
|
227
227
|
while (doc->cur < doc->end) {
|
228
|
-
if (
|
228
|
+
if (AGOO_ERR_OK != make_arg(err, doc, dir)) {
|
229
229
|
return err->code;
|
230
230
|
}
|
231
|
-
|
231
|
+
agoo_doc_skip_white(doc);
|
232
232
|
if (')' == *doc->cur) {
|
233
233
|
doc->cur++;
|
234
234
|
break;
|
235
235
|
}
|
236
236
|
}
|
237
237
|
}
|
238
|
-
|
238
|
+
agoo_doc_skip_white(doc);
|
239
239
|
start = doc->cur;
|
240
|
-
|
240
|
+
agoo_doc_read_token(doc);
|
241
241
|
|
242
242
|
if (2 != doc->cur - start || 0 != strncmp(start, "on", 2)) {
|
243
|
-
return
|
243
|
+
return agoo_doc_err(doc, err, "Expected 'on'");
|
244
244
|
}
|
245
245
|
while (doc->cur < doc->end) {
|
246
|
-
|
246
|
+
agoo_doc_skip_white(doc);
|
247
247
|
start = doc->cur;
|
248
|
-
|
249
|
-
if (
|
248
|
+
agoo_doc_read_token(doc);
|
249
|
+
if (AGOO_ERR_OK != gql_directive_on(err, dir, start, (int)(doc->cur - start))) {
|
250
250
|
return err->code;
|
251
251
|
}
|
252
|
-
|
252
|
+
agoo_doc_skip_white(doc);
|
253
253
|
if ('|' != *doc->cur) {
|
254
254
|
break;
|
255
255
|
}
|
256
256
|
doc->cur++; // skip |
|
257
257
|
}
|
258
|
-
return
|
258
|
+
return AGOO_ERR_OK;
|
259
259
|
}
|
260
260
|
|
261
261
|
int
|
262
|
-
sdl_parse(
|
263
|
-
struct
|
264
|
-
const char
|
265
|
-
const char
|
262
|
+
sdl_parse(agooErr err, const char *str, int len) {
|
263
|
+
struct _agooDoc doc;
|
264
|
+
const char *desc = NULL;
|
265
|
+
const char *desc_end = NULL;
|
266
266
|
|
267
|
-
|
267
|
+
agoo_doc_init(&doc, str, len);
|
268
268
|
|
269
269
|
while (doc.cur < doc.end) {
|
270
|
-
|
270
|
+
agoo_doc_next_token(&doc);
|
271
271
|
switch (*doc.cur) {
|
272
272
|
case '"':
|
273
273
|
desc = doc.cur + 1;
|
274
|
-
if (
|
274
|
+
if (AGOO_ERR_OK != agoo_doc_read_string(err, &doc)) {
|
275
275
|
return err->code;
|
276
276
|
}
|
277
277
|
if ('"' == *desc) { // must be a """
|
@@ -282,14 +282,14 @@ sdl_parse(Err err, const char *str, int len) {
|
|
282
282
|
}
|
283
283
|
break;
|
284
284
|
case 's': // scalar
|
285
|
-
if (
|
285
|
+
if (AGOO_ERR_OK != make_scalar(err, &doc, desc, (int)(desc_end - desc))) {
|
286
286
|
return err->code;
|
287
287
|
}
|
288
288
|
break;
|
289
289
|
case 'e': // enum, and extend interface or type
|
290
290
|
if (4 < (doc.end - doc.cur)) {
|
291
291
|
if ('n' == doc.cur[1]) {
|
292
|
-
if (
|
292
|
+
if (AGOO_ERR_OK != make_enum(err, &doc, desc, (int)(desc_end - desc))) {
|
293
293
|
return err->code;
|
294
294
|
}
|
295
295
|
break;
|
@@ -298,14 +298,14 @@ sdl_parse(Err err, const char *str, int len) {
|
|
298
298
|
break;
|
299
299
|
}
|
300
300
|
}
|
301
|
-
return
|
301
|
+
return agoo_doc_err(&doc, err, "Unknown directive");
|
302
302
|
case 'u': // union
|
303
|
-
if (
|
303
|
+
if (AGOO_ERR_OK != make_union(err, &doc, desc, (int)(desc_end - desc))) {
|
304
304
|
return err->code;
|
305
305
|
}
|
306
306
|
break;
|
307
307
|
case 'd': // directive
|
308
|
-
if (
|
308
|
+
if (AGOO_ERR_OK != make_directive(err, &doc, desc, (int)(desc_end - desc))) {
|
309
309
|
return err->code;
|
310
310
|
}
|
311
311
|
break;
|
@@ -321,14 +321,14 @@ sdl_parse(Err err, const char *str, int len) {
|
|
321
321
|
break;
|
322
322
|
}
|
323
323
|
}
|
324
|
-
return
|
324
|
+
return agoo_doc_err(&doc, err, "Unknown directive");
|
325
325
|
case 'f': // fragment
|
326
326
|
break;
|
327
327
|
case '\0':
|
328
|
-
return
|
328
|
+
return AGOO_ERR_OK;
|
329
329
|
default:
|
330
|
-
return
|
330
|
+
return agoo_doc_err(&doc, err, "Unknown directive");
|
331
331
|
}
|
332
332
|
}
|
333
|
-
return
|
333
|
+
return AGOO_ERR_OK;
|
334
334
|
}
|