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.

@@ -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
+
@@ -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 */
@@ -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);
@@ -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
- agoo_err_set(&err, AGOO_ERR_MEMORY, "Out of memory.");
67
+ AGOO_ERR_MEM(&err, "response");
68
68
  err_resp(res, &err, 500);
69
69
  gql_value_destroy(result);
70
70
  return;
@@ -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 agoo_err_set(err, AGOO_ERR_MEMORY, "strndup of length %d failed.", len);
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 agoo_err_set(err, AGOO_ERR_MEMORY, "strndup of length %d failed.", len);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocation memory for a list link.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup() failed.");
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)AGOO_MALLOC(sizeof(struct _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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strndup of length %d failed.", len);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strndup of length %d failed.", len);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strndup of length %d failed.", len);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "failed to duplicate a value.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup of length %d failed.", strlen(value->str.ptr));
1569
+ AGOO_ERR_MEM(err, "strdup()");
1571
1570
  AGOO_FREE(dup);
1572
1571
  dup = NULL;
1573
1572
  }
@@ -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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup() failed.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strndup() of length %d failed.", len);
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 agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a GraphQL type.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a GraphQL Type.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup of type name failed. %s:%d", __FILE__, __LINE__);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a GraphQL directive.");
483
- return NULL;
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a GraphQL field.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a GraphQL field argument.");
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 agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a GraphQL Union value.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a GraphQL Enum value.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strndup of length %d failed. %s:%d", len, __FILE__, __LINE__);
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 = scalar_to_text;
690
- type->to_sdl = scalar_to_text;
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a GraphQL directive.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a GraphQL directive argument.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a GraphQL directive location.");
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 agoo_err_set(err, AGOO_ERR_MEMORY, "strndup of length %d failed. %s:%d", len, __FILE__, __LINE__);
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 = agoo_text_append(text, ")", 1);
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 = agoo_text_append(text, "\n", 1);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocate memory for a directive useage.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "fragment creation failed. %s:%d", __FILE__, __LINE__);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup of fragment name failed. %s:%d", __FILE__, __LINE__);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "GraphQL Document creation failed. %s:%d", __FILE__, __LINE__);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "GraphQL Operation creation failed. %s:%d", __FILE__, __LINE__);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup of operation name failed. %s:%d", __FILE__, __LINE__);
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
-