agoo 2.6.1 → 2.7.0
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 +8 -0
- data/ext/agoo/agoo.c +5 -1
- data/ext/agoo/bind.c +17 -18
- data/ext/agoo/con.c +14 -7
- data/ext/agoo/debug.c +113 -63
- data/ext/agoo/debug.h +3 -0
- data/ext/agoo/err.c +7 -0
- data/ext/agoo/err.h +4 -0
- data/ext/agoo/error_stream.c +6 -0
- data/ext/agoo/gqleval.c +1 -1
- data/ext/agoo/gqlvalue.c +10 -11
- data/ext/agoo/graphql.c +181 -105
- data/ext/agoo/graphql.h +9 -0
- data/ext/agoo/hook.c +17 -7
- data/ext/agoo/log.c +8 -10
- data/ext/agoo/log.h +1 -1
- data/ext/agoo/page.c +242 -31
- data/ext/agoo/page.h +4 -3
- data/ext/agoo/queue.c +10 -7
- data/ext/agoo/queue.h +3 -2
- data/ext/agoo/ready.c +8 -7
- data/ext/agoo/rgraphql.c +29 -25
- data/ext/agoo/rlog.c +2 -2
- data/ext/agoo/rresponse.c +6 -0
- data/ext/agoo/rserver.c +49 -8
- data/ext/agoo/sdl.c +82 -35
- data/ext/agoo/sdl.h +3 -1
- data/ext/agoo/server.c +10 -6
- data/ext/agoo/server.h +2 -1
- data/ext/agoo/upgraded.c +2 -3
- data/lib/agoo/version.rb +1 -1
- data/test/static_test.rb +6 -1
- metadata +2 -2
data/ext/agoo/err.c
CHANGED
@@ -77,3 +77,10 @@ agoo_err_str(agooErrCode code) {
|
|
77
77
|
}
|
78
78
|
return str;
|
79
79
|
}
|
80
|
+
|
81
|
+
int
|
82
|
+
agoo_err_memory(agooErr err, const char *type, const char *file, int line) {
|
83
|
+
return agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a %s at %s:%d.", type, file, line);
|
84
|
+
}
|
85
|
+
|
86
|
+
|
data/ext/agoo/err.h
CHANGED
@@ -8,6 +8,8 @@
|
|
8
8
|
#define AGOO_ERR_START 300
|
9
9
|
#define AGOO_ERR_INIT { 0, { 0 } }
|
10
10
|
|
11
|
+
#define AGOO_ERR_MEM(err, type) agoo_err_memory(err, type, __FILE__, __LINE__)
|
12
|
+
|
11
13
|
typedef enum {
|
12
14
|
AGOO_ERR_OK = 0,
|
13
15
|
AGOO_ERR_MEMORY = ENOMEM,
|
@@ -43,4 +45,6 @@ extern int agoo_err_no(agooErr err, const char *fmt, ...);
|
|
43
45
|
extern const char* agoo_err_str(agooErrCode code);
|
44
46
|
extern void agoo_err_clear(agooErr err);
|
45
47
|
|
48
|
+
extern int agoo_err_memory(agooErr err, const char *type, const char *file, int line);
|
49
|
+
|
46
50
|
#endif /* AGOO_ERR_H */
|
data/ext/agoo/error_stream.c
CHANGED
@@ -24,6 +24,12 @@ VALUE
|
|
24
24
|
error_stream_new() {
|
25
25
|
ErrorStream es = (ErrorStream)AGOO_MALLOC(sizeof(struct _errorStream));
|
26
26
|
|
27
|
+
if (NULL == es) {
|
28
|
+
// Error stream is optional. If it is not there is still meets the
|
29
|
+
// specs. Better not to break everything if this fails.
|
30
|
+
return Qnil;
|
31
|
+
}
|
32
|
+
es->server = NULL;
|
27
33
|
es->text = agoo_text_allocate(1024);
|
28
34
|
|
29
35
|
return Data_Wrap_Struct(es_class, NULL, es_free, es);
|
data/ext/agoo/gqleval.c
CHANGED
@@ -64,7 +64,7 @@ value_resp(agooRes res, gqlValue result, int status, int indent) {
|
|
64
64
|
gqlValue msg = gql_object_create(&err);
|
65
65
|
|
66
66
|
if (NULL == msg) {
|
67
|
-
|
67
|
+
AGOO_ERR_MEM(&err, "response");
|
68
68
|
err_resp(res, &err, 500);
|
69
69
|
gql_value_destroy(result);
|
70
70
|
return;
|
data/ext/agoo/gqlvalue.c
CHANGED
@@ -824,7 +824,7 @@ gql_string_set(agooErr err, gqlValue value, const char *str, int len) {
|
|
824
824
|
} else {
|
825
825
|
value->str.alloced = true;
|
826
826
|
if (NULL == (value->str.ptr = AGOO_STRNDUP(str, len))) {
|
827
|
-
return
|
827
|
+
return AGOO_ERR_MEM(err, "strndup()");
|
828
828
|
}
|
829
829
|
}
|
830
830
|
}
|
@@ -847,7 +847,7 @@ gql_token_set(agooErr err, gqlValue value, const char *str, int len) {
|
|
847
847
|
} else {
|
848
848
|
value->str.alloced = true;
|
849
849
|
if (NULL == (value->str.ptr = AGOO_STRNDUP(str, len))) {
|
850
|
-
return
|
850
|
+
return AGOO_ERR_MEM(err, "strndup()");
|
851
851
|
}
|
852
852
|
}
|
853
853
|
}
|
@@ -912,13 +912,13 @@ gql_link_create(agooErr err, const char *key, gqlValue item) {
|
|
912
912
|
gqlLink link = (gqlLink)AGOO_MALLOC(sizeof(struct _gqlLink));
|
913
913
|
|
914
914
|
if (NULL == link) {
|
915
|
-
|
915
|
+
AGOO_ERR_MEM(err, "GraphQL List Link");
|
916
916
|
} else {
|
917
917
|
link->next = NULL;
|
918
918
|
link->key = NULL;
|
919
919
|
if (NULL != key) {
|
920
920
|
if (NULL == (link->key = AGOO_STRDUP(key))) {
|
921
|
-
|
921
|
+
AGOO_ERR_MEM(err, "strdup()");
|
922
922
|
return NULL;
|
923
923
|
}
|
924
924
|
}
|
@@ -988,10 +988,9 @@ gql_object_set(agooErr err, gqlValue obj, const char *key, gqlValue item) {
|
|
988
988
|
|
989
989
|
static gqlValue
|
990
990
|
value_create(gqlType type) {
|
991
|
-
gqlValue v = (gqlValue)
|
991
|
+
gqlValue v = (gqlValue)AGOO_CALLOC(1, sizeof(struct _gqlValue));
|
992
992
|
|
993
993
|
if (NULL != v) {
|
994
|
-
memset(v, 0, sizeof(struct _gqlValue));
|
995
994
|
v->type = type;
|
996
995
|
}
|
997
996
|
return v;
|
@@ -1028,7 +1027,7 @@ gql_string_create(agooErr err, const char *str, int len) {
|
|
1028
1027
|
if ((int)sizeof(v->str.a) <= len) {
|
1029
1028
|
v->str.alloced = true;
|
1030
1029
|
if (NULL == (v->str.ptr = AGOO_STRNDUP(str, len))) {
|
1031
|
-
|
1030
|
+
AGOO_ERR_MEM(err, "strdup()");
|
1032
1031
|
return NULL;
|
1033
1032
|
}
|
1034
1033
|
} else {
|
@@ -1054,7 +1053,7 @@ gql_token_create(agooErr err, const char *str, int len, gqlType type) {
|
|
1054
1053
|
if ((int)sizeof(v->str.a) <= len) {
|
1055
1054
|
v->str.alloced = true;
|
1056
1055
|
if (NULL == (v->str.ptr = AGOO_STRNDUP(str, len))) {
|
1057
|
-
|
1056
|
+
AGOO_ERR_MEM(err, "strdup()");
|
1058
1057
|
return NULL;
|
1059
1058
|
}
|
1060
1059
|
} else {
|
@@ -1077,7 +1076,7 @@ gql_var_create(agooErr err, const char *str, int len) {
|
|
1077
1076
|
if ((int)sizeof(v->str.a) <= len) {
|
1078
1077
|
v->str.alloced = true;
|
1079
1078
|
if (NULL == (v->str.ptr = AGOO_STRNDUP(str, len))) {
|
1080
|
-
|
1079
|
+
AGOO_ERR_MEM(err, "strdup()");
|
1081
1080
|
return NULL;
|
1082
1081
|
}
|
1083
1082
|
} else {
|
@@ -1547,7 +1546,7 @@ gql_value_dup(agooErr err, gqlValue value) {
|
|
1547
1546
|
gqlValue dup = value_create(value->type);
|
1548
1547
|
|
1549
1548
|
if (NULL == dup) {
|
1550
|
-
|
1549
|
+
AGOO_ERR_MEM(err, "GraphQL Value");
|
1551
1550
|
return NULL;
|
1552
1551
|
}
|
1553
1552
|
switch (value->type->scalar_kind) {
|
@@ -1567,7 +1566,7 @@ gql_value_dup(agooErr err, gqlValue value) {
|
|
1567
1566
|
case GQL_SCALAR_TOKEN:
|
1568
1567
|
if (value->str.alloced) {
|
1569
1568
|
if (NULL == (dup->str.ptr = strdup(value->str.ptr))) {
|
1570
|
-
|
1569
|
+
AGOO_ERR_MEM(err, "strdup()");
|
1571
1570
|
AGOO_FREE(dup);
|
1572
1571
|
dup = NULL;
|
1573
1572
|
}
|
data/ext/agoo/graphql.c
CHANGED
@@ -56,7 +56,7 @@ calc_hash(const char *name) {
|
|
56
56
|
uint64_t h = 0;
|
57
57
|
const uint8_t *k = (const uint8_t*)name;
|
58
58
|
uint64_t x;
|
59
|
-
|
59
|
+
|
60
60
|
for (; '\0' != *k; k++) {
|
61
61
|
if (0 == (x = name_chars[*k])) {
|
62
62
|
return BAD_NAME;
|
@@ -90,16 +90,16 @@ kind_string(gqlKind kind) {
|
|
90
90
|
static char*
|
91
91
|
alloc_string(agooErr err, const char *s, size_t len) {
|
92
92
|
char *a = NULL;
|
93
|
-
|
93
|
+
|
94
94
|
if (NULL != s) {
|
95
95
|
if (0 >= len) {
|
96
96
|
if (NULL == (a = AGOO_STRDUP(s))) {
|
97
|
-
|
97
|
+
AGOO_ERR_MEM(err, "strdup()");
|
98
98
|
}
|
99
99
|
len = strlen(a);
|
100
100
|
} else {
|
101
101
|
if (NULL == (a = AGOO_STRNDUP(s, len))) {
|
102
|
-
|
102
|
+
AGOO_ERR_MEM(err, "strndup()");
|
103
103
|
}
|
104
104
|
}
|
105
105
|
}
|
@@ -110,7 +110,7 @@ static void
|
|
110
110
|
free_dir_uses(gqlDirUse uses) {
|
111
111
|
gqlDirUse u;
|
112
112
|
gqlLink link;
|
113
|
-
|
113
|
+
|
114
114
|
while (NULL != (u = uses)) {
|
115
115
|
uses = u->next;
|
116
116
|
while (NULL != (link = u->args)) {
|
@@ -136,7 +136,7 @@ arg_destroy(gqlArg a) {
|
|
136
136
|
static void
|
137
137
|
field_destroy(gqlField f) {
|
138
138
|
gqlArg a;
|
139
|
-
|
139
|
+
|
140
140
|
AGOO_FREE((char*)f->name);
|
141
141
|
AGOO_FREE((char*)f->desc);
|
142
142
|
while (NULL != (a = f->args)) {
|
@@ -156,7 +156,7 @@ type_clean(gqlType type) {
|
|
156
156
|
type->desc = NULL;
|
157
157
|
free_dir_uses(type->dir);
|
158
158
|
type->dir = NULL;
|
159
|
-
|
159
|
+
|
160
160
|
switch (type->kind) {
|
161
161
|
case GQL_OBJECT:
|
162
162
|
case GQL_INTERFACE: {
|
@@ -175,7 +175,7 @@ type_clean(gqlType type) {
|
|
175
175
|
}
|
176
176
|
case GQL_INPUT: {
|
177
177
|
gqlArg a;
|
178
|
-
|
178
|
+
|
179
179
|
while (NULL != (a = type->args)) {
|
180
180
|
type->args = a->next;
|
181
181
|
arg_destroy(a);
|
@@ -231,7 +231,7 @@ static void
|
|
231
231
|
dir_clean(gqlDir dir) {
|
232
232
|
gqlArg a;
|
233
233
|
gqlStrLink link;
|
234
|
-
|
234
|
+
|
235
235
|
AGOO_FREE((char*)dir->desc);
|
236
236
|
while (NULL != (a = dir->args)) {
|
237
237
|
dir->args = a->next;
|
@@ -304,7 +304,7 @@ gql_type_set(agooErr err, gqlType type) {
|
|
304
304
|
} else {
|
305
305
|
Slot *bucket = get_bucketp(h);
|
306
306
|
Slot s;
|
307
|
-
|
307
|
+
|
308
308
|
for (s = *bucket; NULL != s; s = s->next) {
|
309
309
|
if (h == s->hash && 0 == strcmp(s->type->name, type->name)) {
|
310
310
|
type_destroy(s->type);
|
@@ -313,7 +313,7 @@ gql_type_set(agooErr err, gqlType type) {
|
|
313
313
|
}
|
314
314
|
}
|
315
315
|
if (NULL == (s = (Slot)AGOO_MALLOC(sizeof(struct _slot)))) {
|
316
|
-
return
|
316
|
+
return AGOO_ERR_MEM(err, "GraphQL Type");
|
317
317
|
}
|
318
318
|
s->hash = h;
|
319
319
|
s->type = type;
|
@@ -375,7 +375,7 @@ gql_init(agooErr err) {
|
|
375
375
|
return err->code;
|
376
376
|
}
|
377
377
|
inited = true;
|
378
|
-
|
378
|
+
|
379
379
|
return AGOO_ERR_OK;
|
380
380
|
}
|
381
381
|
|
@@ -389,7 +389,7 @@ gql_destroy() {
|
|
389
389
|
|
390
390
|
for (i = BUCKET_SIZE; 0 < i; i--, sp++) {
|
391
391
|
s = *sp;
|
392
|
-
|
392
|
+
|
393
393
|
*sp = NULL;
|
394
394
|
for (; NULL != s; s = n) {
|
395
395
|
n = s->next;
|
@@ -410,14 +410,17 @@ type_create(agooErr err, gqlKind kind, const char *name, const char *desc, size_
|
|
410
410
|
|
411
411
|
if (NULL == type) {
|
412
412
|
if (NULL == (type = (gqlType)AGOO_MALLOC(sizeof(struct _gqlType)))) {
|
413
|
-
|
414
|
-
return NULL
|
413
|
+
AGOO_ERR_MEM(err, "GraphQL Type");
|
414
|
+
return type; // type will always be NULL but C++ checker flags this as an error otherwise
|
415
415
|
}
|
416
416
|
if (NULL == (type->name = AGOO_STRDUP(name))) {
|
417
|
-
|
417
|
+
AGOO_ERR_MEM(err, "strndup()");
|
418
|
+
AGOO_FREE(type);
|
418
419
|
return NULL;
|
419
420
|
}
|
420
421
|
if (NULL == (type->desc = alloc_string(err, desc, dlen)) && AGOO_ERR_OK != err->code) {
|
422
|
+
AGOO_FREE((char*)type->name);
|
423
|
+
AGOO_FREE(type);
|
421
424
|
return NULL;
|
422
425
|
}
|
423
426
|
type->dir = NULL;
|
@@ -460,7 +463,7 @@ gql_object_to_graphql(agooText text, gqlValue value, int indent, int depth) {
|
|
460
463
|
gqlType
|
461
464
|
gql_assure_type(agooErr err, const char *name) {
|
462
465
|
gqlType type = NULL;
|
463
|
-
|
466
|
+
|
464
467
|
if (NULL != name) {
|
465
468
|
type = gql_type_get(name);
|
466
469
|
|
@@ -479,16 +482,20 @@ assure_directive(agooErr err, const char *name) {
|
|
479
482
|
|
480
483
|
if (NULL == dir) {
|
481
484
|
if (NULL == (dir = (gqlDir)AGOO_MALLOC(sizeof(struct _gqlDir)))) {
|
482
|
-
|
483
|
-
|
485
|
+
AGOO_ERR_MEM(err, "GraphQL Directive");
|
486
|
+
} else {
|
487
|
+
dir->next = gql_directives;
|
488
|
+
gql_directives = dir;
|
489
|
+
if (NULL == (dir->name = AGOO_STRDUP(name))) {
|
490
|
+
AGOO_ERR_MEM(err, "GraphQL Directive");
|
491
|
+
AGOO_FREE(dir);
|
492
|
+
return NULL;
|
493
|
+
}
|
494
|
+
dir->args = NULL;
|
495
|
+
dir->locs = NULL;
|
496
|
+
dir->defined = false;
|
497
|
+
dir->desc = NULL;
|
484
498
|
}
|
485
|
-
dir->next = gql_directives;
|
486
|
-
gql_directives = dir;
|
487
|
-
dir->name = AGOO_STRDUP(name);
|
488
|
-
dir->args = NULL;
|
489
|
-
dir->locs = NULL;
|
490
|
-
dir->defined = false;
|
491
|
-
dir->desc = NULL;
|
492
499
|
}
|
493
500
|
return dir;
|
494
501
|
}
|
@@ -514,14 +521,19 @@ gql_type_field(agooErr err,
|
|
514
521
|
size_t dlen,
|
515
522
|
bool required) {
|
516
523
|
gqlField f = (gqlField)AGOO_MALLOC(sizeof(struct _gqlField));
|
517
|
-
|
524
|
+
|
518
525
|
if (NULL == f) {
|
519
|
-
|
526
|
+
AGOO_ERR_MEM(err, "GraphQL Field");
|
520
527
|
} else {
|
521
528
|
f->next = NULL;
|
522
|
-
f->name = AGOO_STRDUP(name)
|
529
|
+
if (NULL == (f->name = AGOO_STRDUP(name))) {
|
530
|
+
AGOO_ERR_MEM(err, "strdup()");
|
531
|
+
AGOO_FREE(f);
|
532
|
+
return NULL;
|
533
|
+
}
|
523
534
|
f->type = return_type;
|
524
535
|
if (NULL == (f->desc = alloc_string(err, desc, dlen)) && AGOO_ERR_OK != err->code) {
|
536
|
+
AGOO_FREE(f);
|
525
537
|
return NULL;
|
526
538
|
}
|
527
539
|
f->args = NULL;
|
@@ -551,14 +563,19 @@ gql_field_arg(agooErr err,
|
|
551
563
|
struct _gqlValue *def_value,
|
552
564
|
bool required) {
|
553
565
|
gqlArg a = (gqlArg)AGOO_MALLOC(sizeof(struct _gqlArg));
|
554
|
-
|
566
|
+
|
555
567
|
if (NULL == a) {
|
556
|
-
|
568
|
+
AGOO_ERR_MEM(err, "GraphQL Field Argument");
|
557
569
|
} else {
|
558
570
|
a->next = NULL;
|
559
|
-
a->name = AGOO_STRDUP(name)
|
571
|
+
if (NULL == (a->name = AGOO_STRDUP(name))) {
|
572
|
+
AGOO_ERR_MEM(err, "strdup()");
|
573
|
+
AGOO_FREE(a);
|
574
|
+
return NULL;
|
575
|
+
}
|
560
576
|
a->type = type;
|
561
577
|
if (NULL == (a->desc = alloc_string(err, desc, dlen)) && AGOO_ERR_OK != err->code) {
|
578
|
+
AGOO_FREE(a);
|
562
579
|
return NULL;
|
563
580
|
}
|
564
581
|
a->default_value = def_value;
|
@@ -577,6 +594,47 @@ gql_field_arg(agooErr err,
|
|
577
594
|
return a;
|
578
595
|
}
|
579
596
|
|
597
|
+
gqlArg
|
598
|
+
gql_input_arg(agooErr err,
|
599
|
+
gqlType input,
|
600
|
+
const char *name,
|
601
|
+
gqlType type,
|
602
|
+
const char *desc,
|
603
|
+
size_t dlen,
|
604
|
+
struct _gqlValue *def_value,
|
605
|
+
bool required) {
|
606
|
+
gqlArg a = (gqlArg)AGOO_MALLOC(sizeof(struct _gqlArg));
|
607
|
+
|
608
|
+
if (NULL == a) {
|
609
|
+
AGOO_ERR_MEM(err, "GraphQL Input Argument");
|
610
|
+
} else {
|
611
|
+
a->next = NULL;
|
612
|
+
if (NULL == (a->name = AGOO_STRDUP(name))) {
|
613
|
+
AGOO_ERR_MEM(err, "strdup()");
|
614
|
+
AGOO_FREE(a);
|
615
|
+
return NULL;
|
616
|
+
}
|
617
|
+
a->type = type;
|
618
|
+
if (NULL == (a->desc = alloc_string(err, desc, dlen)) && AGOO_ERR_OK != err->code) {
|
619
|
+
AGOO_FREE(a);
|
620
|
+
return NULL;
|
621
|
+
}
|
622
|
+
a->default_value = def_value;
|
623
|
+
a->dir = NULL;
|
624
|
+
a->required = required;
|
625
|
+
if (NULL == input->args) {
|
626
|
+
input->args = a;
|
627
|
+
} else {
|
628
|
+
gqlArg end;
|
629
|
+
|
630
|
+
for (end = input->args; NULL != end->next; end = end->next) {
|
631
|
+
}
|
632
|
+
end->next = a;
|
633
|
+
}
|
634
|
+
}
|
635
|
+
return a;
|
636
|
+
}
|
637
|
+
|
580
638
|
gqlType
|
581
639
|
gql_union_create(agooErr err, const char *name, const char *desc, size_t dlen) {
|
582
640
|
gqlType type = type_create(err, GQL_UNION, name, desc, dlen);
|
@@ -592,7 +650,7 @@ gql_union_add(agooErr err, gqlType type, gqlType member) {
|
|
592
650
|
gqlTypeLink link = (gqlTypeLink)AGOO_MALLOC(sizeof(struct _gqlTypeLink));
|
593
651
|
|
594
652
|
if (NULL == link) {
|
595
|
-
return
|
653
|
+
return AGOO_ERR_MEM(err, "GraphQL Union Value");
|
596
654
|
}
|
597
655
|
link->type = member;
|
598
656
|
if (NULL == type->types) {
|
@@ -624,18 +682,20 @@ gql_enum_append(agooErr err, gqlType type, const char *value, size_t len, const
|
|
624
682
|
gqlEnumVal ev = (gqlEnumVal)AGOO_MALLOC(sizeof(struct _gqlEnumVal));
|
625
683
|
|
626
684
|
if (NULL == ev) {
|
627
|
-
|
685
|
+
AGOO_ERR_MEM(err, "GraphQL Enum Value");
|
628
686
|
return NULL;
|
629
687
|
}
|
630
688
|
if (0 >= len) {
|
631
689
|
len = strlen(value);
|
632
690
|
}
|
633
691
|
if (NULL == (ev->value = AGOO_STRNDUP(value, len))) {
|
634
|
-
|
692
|
+
AGOO_ERR_MEM(err, "strdup()");
|
693
|
+
AGOO_FREE(ev);
|
635
694
|
return NULL;
|
636
695
|
}
|
637
696
|
ev->dir = NULL;
|
638
697
|
if (NULL == (ev->desc = alloc_string(err, desc, dlen)) && AGOO_ERR_OK != err->code) {
|
698
|
+
AGOO_FREE(ev);
|
639
699
|
return NULL;
|
640
700
|
}
|
641
701
|
if (NULL == type->choices) {
|
@@ -673,21 +733,14 @@ gql_interface_create(agooErr err, const char *name, const char *desc, size_t dle
|
|
673
733
|
return type;
|
674
734
|
}
|
675
735
|
|
676
|
-
// TBD this is not correct. Is it used?
|
677
|
-
static agooText
|
678
|
-
scalar_to_text(agooText text, gqlValue value, int indent, int depth) {
|
679
|
-
printf("********** scalar_to_text\n");
|
680
|
-
return text;
|
681
|
-
}
|
682
|
-
|
683
736
|
// Create a scalar type that will be represented as a string.
|
684
737
|
gqlType
|
685
738
|
gql_scalar_create(agooErr err, const char *name, const char *desc, size_t dlen) {
|
686
739
|
gqlType type = type_create(err, GQL_SCALAR, name, desc, dlen);
|
687
740
|
|
688
741
|
if (NULL != type) {
|
689
|
-
type->to_json =
|
690
|
-
type->to_sdl =
|
742
|
+
type->to_json = NULL;
|
743
|
+
type->to_sdl = NULL;
|
691
744
|
type->destroy = NULL;
|
692
745
|
}
|
693
746
|
return type;
|
@@ -714,19 +767,24 @@ gql_directive_create(agooErr err, const char *name, const char *desc, size_t dle
|
|
714
767
|
}
|
715
768
|
} else {
|
716
769
|
if (NULL == (dir = (gqlDir)AGOO_MALLOC(sizeof(struct _gqlDir)))) {
|
717
|
-
|
770
|
+
AGOO_ERR_MEM(err, "GraphQL Directive");
|
771
|
+
return NULL;
|
772
|
+
}
|
773
|
+
if (NULL == (dir->name = AGOO_STRDUP(name))) {
|
774
|
+
AGOO_ERR_MEM(err, "strdup()");
|
775
|
+
AGOO_FREE(dir);
|
718
776
|
return NULL;
|
719
777
|
}
|
720
|
-
dir->next = gql_directives;
|
721
|
-
gql_directives = dir;
|
722
|
-
dir->name = AGOO_STRDUP(name);
|
723
778
|
dir->args = NULL;
|
724
779
|
dir->locs = NULL;
|
725
780
|
dir->defined = true;
|
726
781
|
dir->core = false;
|
727
782
|
if (NULL == (dir->desc = alloc_string(err, desc, dlen)) && AGOO_ERR_OK != err->code) {
|
783
|
+
AGOO_FREE(dir);
|
728
784
|
return NULL;
|
729
785
|
}
|
786
|
+
dir->next = gql_directives;
|
787
|
+
gql_directives = dir;
|
730
788
|
}
|
731
789
|
return dir;
|
732
790
|
}
|
@@ -742,14 +800,19 @@ gql_dir_arg(agooErr err,
|
|
742
800
|
bool required) {
|
743
801
|
|
744
802
|
gqlArg a = (gqlArg)AGOO_MALLOC(sizeof(struct _gqlArg));
|
745
|
-
|
803
|
+
|
746
804
|
if (NULL == a) {
|
747
|
-
|
805
|
+
AGOO_ERR_MEM(err, "GraphQL Directive Argument");
|
748
806
|
} else {
|
749
807
|
a->next = NULL;
|
750
|
-
a->name = AGOO_STRDUP(name)
|
808
|
+
if (NULL == (a->name = AGOO_STRDUP(name))) {
|
809
|
+
AGOO_ERR_MEM(err, "strdup()");
|
810
|
+
AGOO_FREE(a);
|
811
|
+
return NULL;
|
812
|
+
}
|
751
813
|
a->type = type;
|
752
814
|
if (NULL == (a->desc = alloc_string(err, desc, dlen)) && AGOO_ERR_OK != err->code) {
|
815
|
+
AGOO_FREE(a);
|
753
816
|
return NULL;
|
754
817
|
}
|
755
818
|
a->default_value = def_value;
|
@@ -774,7 +837,7 @@ gql_directive_on(agooErr err, gqlDir d, const char *on, int len) {
|
|
774
837
|
gqlStrLink loc;
|
775
838
|
|
776
839
|
if (NULL == link) {
|
777
|
-
|
840
|
+
AGOO_ERR_MEM(err, "GraphQL Directive Location");
|
778
841
|
}
|
779
842
|
if (0 >= len) {
|
780
843
|
len = (int)strlen(on);
|
@@ -789,7 +852,7 @@ gql_directive_on(agooErr err, gqlDir d, const char *on, int len) {
|
|
789
852
|
loc->next = link;
|
790
853
|
}
|
791
854
|
if (NULL == (link->str = AGOO_STRNDUP(on, len))) {
|
792
|
-
return
|
855
|
+
return AGOO_ERR_MEM(err, "strdup()");
|
793
856
|
}
|
794
857
|
return AGOO_ERR_OK;
|
795
858
|
}
|
@@ -850,7 +913,7 @@ desc_sdl(agooText text, const char *desc, int indent) {
|
|
850
913
|
if (0 < indent) {
|
851
914
|
const char *start = desc;
|
852
915
|
const char *d = desc;
|
853
|
-
|
916
|
+
|
854
917
|
for (; '\0' != *d; d++) {
|
855
918
|
if ('\r' == *d) {
|
856
919
|
int len = (int)(d - start);
|
@@ -887,27 +950,6 @@ desc_sdl(agooText text, const char *desc, int indent) {
|
|
887
950
|
return text;
|
888
951
|
}
|
889
952
|
|
890
|
-
static agooText
|
891
|
-
arg_sdl(agooText text, gqlArg a, bool with_desc, bool last) {
|
892
|
-
if (with_desc) {
|
893
|
-
text = desc_sdl(text, a->desc, 4);
|
894
|
-
}
|
895
|
-
text = agoo_text_append(text, a->name, -1);
|
896
|
-
text = agoo_text_append(text, ": ", 2);
|
897
|
-
text = agoo_text_append(text, a->type->name, -1);
|
898
|
-
if (a->required) {
|
899
|
-
text = agoo_text_append(text, "!", 1);
|
900
|
-
}
|
901
|
-
if (NULL != a->default_value) {
|
902
|
-
text = agoo_text_append(text, " = ", 3);
|
903
|
-
text = gql_value_sdl(text, a->default_value, 0, 0);
|
904
|
-
}
|
905
|
-
if (!last) {
|
906
|
-
text = agoo_text_append(text, ", ", 2);
|
907
|
-
}
|
908
|
-
return text;
|
909
|
-
}
|
910
|
-
|
911
953
|
static agooText
|
912
954
|
append_dir_use(agooText text, gqlDirUse use) {
|
913
955
|
for (; NULL != use; use = use->next) {
|
@@ -915,19 +957,50 @@ append_dir_use(agooText text, gqlDirUse use) {
|
|
915
957
|
text = agoo_text_append(text, use->dir->name, -1);
|
916
958
|
if (NULL != use->args) {
|
917
959
|
gqlLink link;
|
918
|
-
|
960
|
+
|
919
961
|
text = agoo_text_append(text, "(", 1);
|
920
962
|
for (link = use->args; NULL != link; link = link->next) {
|
921
963
|
text = agoo_text_append(text, link->key, -1);
|
922
964
|
text = agoo_text_append(text, ": ", 2);
|
923
965
|
text = gql_value_sdl(text, link->value, 0, 0);
|
924
966
|
}
|
925
|
-
text =
|
967
|
+
text = agoo_text_append_char(text, ')');
|
926
968
|
}
|
927
969
|
}
|
928
970
|
return text;
|
929
971
|
}
|
930
972
|
|
973
|
+
static agooText
|
974
|
+
arg_sdl(agooText text, gqlArg a, bool with_desc, bool same_line, bool last) {
|
975
|
+
if (with_desc) {
|
976
|
+
text = desc_sdl(text, a->desc, 4);
|
977
|
+
}
|
978
|
+
if (!same_line) {
|
979
|
+
text = agoo_text_append(text, " ", 2);
|
980
|
+
}
|
981
|
+
text = agoo_text_append(text, a->name, -1);
|
982
|
+
text = agoo_text_append(text, ": ", 2);
|
983
|
+
if (NULL != a->type) { // should always be true
|
984
|
+
text = agoo_text_append(text, a->type->name, -1);
|
985
|
+
}
|
986
|
+
if (a->required) {
|
987
|
+
text = agoo_text_append(text, "!", 1);
|
988
|
+
}
|
989
|
+
if (NULL != a->default_value) {
|
990
|
+
text = agoo_text_append(text, " = ", 3);
|
991
|
+
text = gql_value_sdl(text, a->default_value, 0, 0);
|
992
|
+
}
|
993
|
+
if (same_line) {
|
994
|
+
if (!last) {
|
995
|
+
text = agoo_text_append(text, ", ", 2);
|
996
|
+
}
|
997
|
+
} else {
|
998
|
+
text = append_dir_use(text, a->dir);
|
999
|
+
text = agoo_text_append_char(text, '\n');
|
1000
|
+
}
|
1001
|
+
return text;
|
1002
|
+
}
|
1003
|
+
|
931
1004
|
static agooText
|
932
1005
|
field_sdl(agooText text, gqlField f, bool with_desc) {
|
933
1006
|
if (with_desc) {
|
@@ -940,7 +1013,7 @@ field_sdl(agooText text, gqlField f, bool with_desc) {
|
|
940
1013
|
|
941
1014
|
text = agoo_text_append(text, "(", 1);
|
942
1015
|
for (a = f->args; NULL != a; a = a->next) {
|
943
|
-
text = arg_sdl(text, a, with_desc, NULL == a->next);
|
1016
|
+
text = arg_sdl(text, a, with_desc, true, NULL == a->next);
|
944
1017
|
}
|
945
1018
|
text = agoo_text_append(text, ")", 1);
|
946
1019
|
}
|
@@ -954,7 +1027,7 @@ field_sdl(agooText text, gqlField f, bool with_desc) {
|
|
954
1027
|
text = gql_value_sdl(text, f->default_value, 0, 0);
|
955
1028
|
}
|
956
1029
|
text = append_dir_use(text, f->dir);
|
957
|
-
text =
|
1030
|
+
text = agoo_text_append_char(text, '\n');
|
958
1031
|
|
959
1032
|
return text;
|
960
1033
|
}
|
@@ -1007,7 +1080,7 @@ gql_type_sdl(agooText text, gqlType type, bool with_desc) {
|
|
1007
1080
|
}
|
1008
1081
|
case GQL_ENUM: {
|
1009
1082
|
gqlEnumVal ev;
|
1010
|
-
|
1083
|
+
|
1011
1084
|
text = agoo_text_append(text, "enum ", 5);
|
1012
1085
|
text = agoo_text_append(text, type->name, -1);
|
1013
1086
|
text = append_dir_use(text, type->dir);
|
@@ -1052,7 +1125,8 @@ gql_type_sdl(agooText text, gqlType type, bool with_desc) {
|
|
1052
1125
|
text = append_dir_use(text, type->dir);
|
1053
1126
|
text = agoo_text_append(text, " {\n", 3);
|
1054
1127
|
for (a = type->args; NULL != a; a = a->next) {
|
1055
|
-
text = arg_sdl(text, a, with_desc, NULL == a->next);
|
1128
|
+
text = arg_sdl(text, a, with_desc, false, NULL == a->next);
|
1129
|
+
// TBD zzzzzz
|
1056
1130
|
}
|
1057
1131
|
text = agoo_text_append(text, "}\n", 2);
|
1058
1132
|
break;
|
@@ -1066,7 +1140,7 @@ gql_type_sdl(agooText text, gqlType type, bool with_desc) {
|
|
1066
1140
|
agooText
|
1067
1141
|
gql_directive_sdl(agooText text, gqlDir d, bool with_desc) {
|
1068
1142
|
gqlStrLink link;
|
1069
|
-
|
1143
|
+
|
1070
1144
|
if (with_desc) {
|
1071
1145
|
text = desc_sdl(text, d->desc, 0);
|
1072
1146
|
}
|
@@ -1077,7 +1151,7 @@ gql_directive_sdl(agooText text, gqlDir d, bool with_desc) {
|
|
1077
1151
|
|
1078
1152
|
text = agoo_text_append(text, "(", 1);
|
1079
1153
|
for (a = d->args; NULL != a; a = a->next) {
|
1080
|
-
text = arg_sdl(text, a, with_desc, NULL == a->next);
|
1154
|
+
text = arg_sdl(text, a, with_desc, true, NULL == a->next);
|
1081
1155
|
}
|
1082
1156
|
text = agoo_text_append(text, ")", 1);
|
1083
1157
|
}
|
@@ -1132,7 +1206,7 @@ gql_schema_sdl(agooText text, bool with_desc, bool all) {
|
|
1132
1206
|
if (0 < cnt) {
|
1133
1207
|
gqlType types[cnt];
|
1134
1208
|
gqlType *tp = types;
|
1135
|
-
|
1209
|
+
|
1136
1210
|
for (bucket = buckets, i = 0; i < BUCKET_SIZE; bucket++, i++) {
|
1137
1211
|
for (s = *bucket; NULL != s; s = s->next) {
|
1138
1212
|
type = s->type;
|
@@ -1169,9 +1243,10 @@ gql_dir_use_create(agooErr err, const char *name) {
|
|
1169
1243
|
gqlDirUse use;
|
1170
1244
|
|
1171
1245
|
if (NULL == (use = (gqlDirUse)AGOO_MALLOC(sizeof(struct _gqlDirUse)))) {
|
1172
|
-
|
1246
|
+
AGOO_ERR_MEM(err, "GraphQL Directive Usage");
|
1173
1247
|
} else {
|
1174
1248
|
if (NULL == (use->dir = assure_directive(err, name))) {
|
1249
|
+
AGOO_FREE(use);
|
1175
1250
|
return NULL;
|
1176
1251
|
}
|
1177
1252
|
use->next = NULL;
|
@@ -1189,7 +1264,7 @@ gql_dir_use_arg(agooErr err, gqlDirUse use, const char *key, gqlValue value) {
|
|
1189
1264
|
}
|
1190
1265
|
link->next = use->args;
|
1191
1266
|
use->args = link;
|
1192
|
-
|
1267
|
+
|
1193
1268
|
return AGOO_ERR_OK;
|
1194
1269
|
}
|
1195
1270
|
|
@@ -1209,14 +1284,15 @@ gql_type_directive_use(gqlType type, gqlDirUse use) {
|
|
1209
1284
|
gqlFrag
|
1210
1285
|
gql_fragment_create(agooErr err, const char *name, gqlType on) {
|
1211
1286
|
gqlFrag frag = (gqlFrag)AGOO_MALLOC(sizeof(struct _gqlFrag));
|
1212
|
-
|
1287
|
+
|
1213
1288
|
if (NULL == frag) {
|
1214
|
-
|
1289
|
+
AGOO_ERR_MEM(err, "GraphQL Fragment");
|
1215
1290
|
} else {
|
1216
1291
|
frag->next = NULL;
|
1217
1292
|
if (NULL != name) {
|
1218
1293
|
if (NULL == (frag->name = AGOO_STRDUP(name))) {
|
1219
|
-
|
1294
|
+
AGOO_ERR_MEM(err, "strdup()");
|
1295
|
+
AGOO_FREE(frag);
|
1220
1296
|
return NULL;
|
1221
1297
|
}
|
1222
1298
|
} else {
|
@@ -1244,9 +1320,9 @@ gql_validate(agooErr err) {
|
|
1244
1320
|
gqlDoc
|
1245
1321
|
gql_doc_create(agooErr err) {
|
1246
1322
|
gqlDoc doc = (gqlDoc)AGOO_MALLOC(sizeof(struct _gqlDoc));
|
1247
|
-
|
1323
|
+
|
1248
1324
|
if (NULL == doc) {
|
1249
|
-
|
1325
|
+
AGOO_ERR_MEM(err, "GraphQL Document");
|
1250
1326
|
} else {
|
1251
1327
|
doc->ops = NULL;
|
1252
1328
|
doc->vars = NULL;
|
@@ -1258,14 +1334,15 @@ gql_doc_create(agooErr err) {
|
|
1258
1334
|
gqlOp
|
1259
1335
|
gql_op_create(agooErr err, const char *name, gqlOpKind kind) {
|
1260
1336
|
gqlOp op = (gqlOp)AGOO_MALLOC(sizeof(struct _gqlOp));
|
1261
|
-
|
1337
|
+
|
1262
1338
|
if (NULL == op) {
|
1263
|
-
|
1339
|
+
AGOO_ERR_MEM(err, "GraphQL Operation");
|
1264
1340
|
} else {
|
1265
1341
|
op->next = NULL;
|
1266
1342
|
if (NULL != name && '\0' != *name) {
|
1267
1343
|
if (NULL == (op->name = AGOO_STRDUP(name))) {
|
1268
|
-
|
1344
|
+
AGOO_ERR_MEM(err, "strdup()");
|
1345
|
+
AGOO_FREE(op);
|
1269
1346
|
return NULL;
|
1270
1347
|
}
|
1271
1348
|
} else {
|
@@ -1301,7 +1378,7 @@ static void
|
|
1301
1378
|
sel_destroy(gqlSel sel) {
|
1302
1379
|
gqlSelArg arg;
|
1303
1380
|
gqlSel s;
|
1304
|
-
|
1381
|
+
|
1305
1382
|
AGOO_FREE((char*)sel->alias);
|
1306
1383
|
AGOO_FREE((char*)sel->name);
|
1307
1384
|
while (NULL != (arg = sel->args)) {
|
@@ -1356,7 +1433,7 @@ gql_doc_destroy(gqlDoc doc) {
|
|
1356
1433
|
gqlOp op;
|
1357
1434
|
gqlFrag frag;
|
1358
1435
|
gqlVar var;
|
1359
|
-
|
1436
|
+
|
1360
1437
|
while (NULL != (op = doc->ops)) {
|
1361
1438
|
doc->ops = op->next;
|
1362
1439
|
gql_op_destroy(op);
|
@@ -1380,7 +1457,7 @@ sel_sdl(agooText text, gqlSel sel, int depth) {
|
|
1380
1457
|
indent = sizeof(spaces) - 1;
|
1381
1458
|
}
|
1382
1459
|
text = agoo_text_append(text, spaces, indent);
|
1383
|
-
if (NULL != sel->frag) {
|
1460
|
+
if (NULL != sel->frag) {
|
1384
1461
|
text = agoo_text_append(text, "...", 3);
|
1385
1462
|
text = agoo_text_append(text, sel->frag, -1);
|
1386
1463
|
text = append_dir_use(text, sel->dir);
|
@@ -1391,7 +1468,7 @@ sel_sdl(agooText text, gqlSel sel, int depth) {
|
|
1391
1468
|
text = agoo_text_append(text, "... on ", 7);
|
1392
1469
|
text = agoo_text_append(text, sel->inline_frag->on->name, -1);
|
1393
1470
|
}
|
1394
|
-
text = append_dir_use(text, sel->dir);
|
1471
|
+
text = append_dir_use(text, sel->inline_frag->dir);
|
1395
1472
|
if (NULL != sel->inline_frag->sels) {
|
1396
1473
|
gqlSel s;
|
1397
1474
|
int d2 = depth + 1;
|
@@ -1411,7 +1488,7 @@ sel_sdl(agooText text, gqlSel sel, int depth) {
|
|
1411
1488
|
text = agoo_text_append(text, sel->name, -1);
|
1412
1489
|
if (NULL != sel->args) {
|
1413
1490
|
gqlSelArg arg;
|
1414
|
-
|
1491
|
+
|
1415
1492
|
text = agoo_text_append(text, "(", 1);
|
1416
1493
|
for (arg = sel->args; NULL != arg; arg = arg->next) {
|
1417
1494
|
text = agoo_text_append(text, arg->name, -1);
|
@@ -1434,7 +1511,7 @@ sel_sdl(agooText text, gqlSel sel, int depth) {
|
|
1434
1511
|
if (NULL != sel->sels) {
|
1435
1512
|
gqlSel s;
|
1436
1513
|
int d2 = depth + 1;
|
1437
|
-
|
1514
|
+
|
1438
1515
|
text = agoo_text_append(text, " {\n", 3);
|
1439
1516
|
for (s = sel->sels; NULL != s; s = s->next) {
|
1440
1517
|
text = sel_sdl(text, s, d2);
|
@@ -1451,7 +1528,7 @@ sel_sdl(agooText text, gqlSel sel, int depth) {
|
|
1451
1528
|
static agooText
|
1452
1529
|
op_sdl(agooText text, gqlOp op) {
|
1453
1530
|
gqlSel sel;
|
1454
|
-
|
1531
|
+
|
1455
1532
|
text = agoo_text_append(text, "query", 5);
|
1456
1533
|
if (NULL != op->name) {
|
1457
1534
|
text = agoo_text_append(text, " ", 1);
|
@@ -1459,7 +1536,7 @@ op_sdl(agooText text, gqlOp op) {
|
|
1459
1536
|
}
|
1460
1537
|
if (NULL != op->vars) {
|
1461
1538
|
gqlVar var;
|
1462
|
-
|
1539
|
+
|
1463
1540
|
text = agoo_text_append(text, "(", 1);
|
1464
1541
|
for (var = op->vars; NULL != var; var = var->next) {
|
1465
1542
|
text = agoo_text_append(text, "$", 1);
|
@@ -1491,7 +1568,7 @@ op_sdl(agooText text, gqlOp op) {
|
|
1491
1568
|
static agooText
|
1492
1569
|
frag_sdl(agooText text, gqlFrag frag) {
|
1493
1570
|
gqlSel sel;
|
1494
|
-
|
1571
|
+
|
1495
1572
|
text = agoo_text_append(text, "fragment ", 9);
|
1496
1573
|
text = agoo_text_append(text, frag->name, -1);
|
1497
1574
|
text = agoo_text_append(text, " on ", 4);
|
@@ -1510,7 +1587,7 @@ agooText
|
|
1510
1587
|
gql_doc_sdl(gqlDoc doc, agooText text) {
|
1511
1588
|
gqlOp op;
|
1512
1589
|
gqlFrag frag;
|
1513
|
-
|
1590
|
+
|
1514
1591
|
for (op = doc->ops; NULL != op; op = op->next) {
|
1515
1592
|
op_sdl(text, op);
|
1516
1593
|
}
|
@@ -1572,4 +1649,3 @@ gql_type_get_field(gqlType type, const char *field) {
|
|
1572
1649
|
}
|
1573
1650
|
return NULL;
|
1574
1651
|
}
|
1575
|
-
|