agoo 2.6.1 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 | 
            -
             |