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/sdl.c
    CHANGED
    
    | 
         @@ -28,7 +28,7 @@ extract_desc(agooErr err, agooDoc doc, const char **descp, size_t *lenp) { 
     | 
|
| 
       28 
28 
     | 
    
         
             
                if ('"' == *doc->cur) {
         
     | 
| 
       29 
29 
     | 
    
         
             
            	const char	*desc_end = NULL;
         
     | 
| 
       30 
30 
     | 
    
         
             
            	const char	*desc = doc->cur + 1;
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
       32 
32 
     | 
    
         
             
                	if (AGOO_ERR_OK != agoo_doc_read_string(err, doc)) {
         
     | 
| 
       33 
33 
     | 
    
         
             
            	    return err->code;
         
     | 
| 
       34 
34 
     | 
    
         
             
            	}
         
     | 
| 
         @@ -88,7 +88,7 @@ make_scalar(agooErr err, agooDoc doc, const char *desc, int len) { 
     | 
|
| 
       88 
88 
     | 
    
         
             
            	return err->code;
         
     | 
| 
       89 
89 
     | 
    
         
             
                }
         
     | 
| 
       90 
90 
     | 
    
         
             
                gql_scalar_create(err, name, desc, len);
         
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
       92 
92 
     | 
    
         
             
                return AGOO_ERR_OK;
         
     | 
| 
       93 
93 
     | 
    
         
             
            }
         
     | 
| 
       94 
94 
     | 
    
         | 
| 
         @@ -202,7 +202,7 @@ make_enum(agooErr err, agooDoc doc, const char *desc, size_t dlen) { 
     | 
|
| 
       202 
202 
     | 
    
         
             
                gqlDirUse	uses = NULL;
         
     | 
| 
       203 
203 
     | 
    
         
             
                gqlEnumVal	ev;
         
     | 
| 
       204 
204 
     | 
    
         
             
                size_t	len;
         
     | 
| 
       205 
     | 
    
         
            -
             
     | 
| 
      
 205 
     | 
    
         
            +
             
     | 
| 
       206 
206 
     | 
    
         
             
                if (AGOO_ERR_OK != extract_name(err, doc, enum_str, sizeof(enum_str) - 1, name, sizeof(name))) {
         
     | 
| 
       207 
207 
     | 
    
         
             
            	return err->code;
         
     | 
| 
       208 
208 
     | 
    
         
             
                }
         
     | 
| 
         @@ -254,7 +254,7 @@ make_union(agooErr err, agooDoc doc, const char *desc, int len) { 
     | 
|
| 
       254 
254 
     | 
    
         
             
                gqlDirUse	uses = NULL;
         
     | 
| 
       255 
255 
     | 
    
         
             
                gqlType	member;
         
     | 
| 
       256 
256 
     | 
    
         
             
                bool	required;
         
     | 
| 
       257 
     | 
    
         
            -
             
     | 
| 
      
 257 
     | 
    
         
            +
             
     | 
| 
       258 
258 
     | 
    
         
             
                if (AGOO_ERR_OK != extract_name(err, doc, union_str, sizeof(union_str) - 1, name, sizeof(name))) {
         
     | 
| 
       259 
259 
     | 
    
         
             
            	return err->code;
         
     | 
| 
       260 
260 
     | 
    
         
             
                }
         
     | 
| 
         @@ -425,7 +425,7 @@ make_field_arg(agooErr err, agooDoc doc, gqlField field) { 
     | 
|
| 
       425 
425 
     | 
    
         
             
                size_t	dlen;
         
     | 
| 
       426 
426 
     | 
    
         
             
                bool 	required = false;
         
     | 
| 
       427 
427 
     | 
    
         
             
                gqlValue	dval = NULL;
         
     | 
| 
       428 
     | 
    
         
            -
             
     | 
| 
      
 428 
     | 
    
         
            +
             
     | 
| 
       429 
429 
     | 
    
         
             
                if (AGOO_ERR_OK != extract_desc(err, doc, &desc, &dlen)) {
         
     | 
| 
       430 
430 
     | 
    
         
             
            	return err->code;
         
     | 
| 
       431 
431 
     | 
    
         
             
                }
         
     | 
| 
         @@ -438,7 +438,7 @@ make_field_arg(agooErr err, agooDoc doc, gqlField field) { 
     | 
|
| 
       438 
438 
     | 
    
         
             
            	return agoo_doc_err(doc, err, "Expected :");
         
     | 
| 
       439 
439 
     | 
    
         
             
                }
         
     | 
| 
       440 
440 
     | 
    
         
             
                doc->cur++;
         
     | 
| 
       441 
     | 
    
         
            -
             
     | 
| 
      
 441 
     | 
    
         
            +
             
     | 
| 
       442 
442 
     | 
    
         
             
                if (AGOO_ERR_OK != read_type(err, doc, &type, &required)) {
         
     | 
| 
       443 
443 
     | 
    
         
             
            	return err->code;
         
     | 
| 
       444 
444 
     | 
    
         
             
                }
         
     | 
| 
         @@ -463,7 +463,7 @@ make_field_arg(agooErr err, agooDoc doc, gqlField field) { 
     | 
|
| 
       463 
463 
     | 
    
         
             
            }
         
     | 
| 
       464 
464 
     | 
    
         | 
| 
       465 
465 
     | 
    
         
             
            static int
         
     | 
| 
       466 
     | 
    
         
            -
            make_field(agooErr err, agooDoc doc, gqlType type 
     | 
| 
      
 466 
     | 
    
         
            +
            make_field(agooErr err, agooDoc doc, gqlType type) {
         
     | 
| 
       467 
467 
     | 
    
         
             
                char	name[256];
         
     | 
| 
       468 
468 
     | 
    
         
             
                gqlType	return_type;
         
     | 
| 
       469 
469 
     | 
    
         
             
                const char	*arg_start = NULL;
         
     | 
| 
         @@ -483,9 +483,6 @@ make_field(agooErr err, agooDoc doc, gqlType type, bool allow_args) { 
     | 
|
| 
       483 
483 
     | 
    
         
             
                agoo_doc_skip_white(doc);
         
     | 
| 
       484 
484 
     | 
    
         
             
                switch (*doc->cur) {
         
     | 
| 
       485 
485 
     | 
    
         
             
                case '(':
         
     | 
| 
       486 
     | 
    
         
            -
            	if (!allow_args) {
         
     | 
| 
       487 
     | 
    
         
            -
            	    return agoo_doc_err(doc, err, "Input fields can not have arguments.");
         
     | 
| 
       488 
     | 
    
         
            -
            	}
         
     | 
| 
       489 
486 
     | 
    
         
             
            	doc->cur++;
         
     | 
| 
       490 
487 
     | 
    
         
             
            	arg_start = doc->cur;
         
     | 
| 
       491 
488 
     | 
    
         
             
            	if (!agoo_doc_skip_to(doc, ')')) {
         
     | 
| 
         @@ -539,12 +536,56 @@ make_field(agooErr err, agooDoc doc, gqlType type, bool allow_args) { 
     | 
|
| 
       539 
536 
     | 
    
         
             
                return AGOO_ERR_OK;
         
     | 
| 
       540 
537 
     | 
    
         
             
            }
         
     | 
| 
       541 
538 
     | 
    
         | 
| 
      
 539 
     | 
    
         
            +
            static int
         
     | 
| 
      
 540 
     | 
    
         
            +
            make_input_arg(agooErr err, agooDoc doc, gqlType type) {
         
     | 
| 
      
 541 
     | 
    
         
            +
                char	name[256];
         
     | 
| 
      
 542 
     | 
    
         
            +
                gqlType	return_type;
         
     | 
| 
      
 543 
     | 
    
         
            +
                gqlArg	arg;
         
     | 
| 
      
 544 
     | 
    
         
            +
                gqlDirUse	uses = NULL;
         
     | 
| 
      
 545 
     | 
    
         
            +
                gqlValue	dval = NULL;
         
     | 
| 
      
 546 
     | 
    
         
            +
                const char	*desc = NULL;
         
     | 
| 
      
 547 
     | 
    
         
            +
                size_t	dlen;
         
     | 
| 
      
 548 
     | 
    
         
            +
                bool 	required = false;
         
     | 
| 
      
 549 
     | 
    
         
            +
             
     | 
| 
      
 550 
     | 
    
         
            +
                if (AGOO_ERR_OK != extract_desc(err, doc, &desc, &dlen)) {
         
     | 
| 
      
 551 
     | 
    
         
            +
            	return err->code;
         
     | 
| 
      
 552 
     | 
    
         
            +
                }
         
     | 
| 
      
 553 
     | 
    
         
            +
                if (0 == read_name(err, doc, name, sizeof(name))) {
         
     | 
| 
      
 554 
     | 
    
         
            +
            	return err->code;
         
     | 
| 
      
 555 
     | 
    
         
            +
                }
         
     | 
| 
      
 556 
     | 
    
         
            +
                agoo_doc_skip_white(doc);
         
     | 
| 
      
 557 
     | 
    
         
            +
                if (':' != *doc->cur) {
         
     | 
| 
      
 558 
     | 
    
         
            +
            	return agoo_doc_err(doc, err, "Expected :");
         
     | 
| 
      
 559 
     | 
    
         
            +
                }
         
     | 
| 
      
 560 
     | 
    
         
            +
                doc->cur++;
         
     | 
| 
      
 561 
     | 
    
         
            +
                if (AGOO_ERR_OK != read_type(err, doc, &return_type, &required)) {
         
     | 
| 
      
 562 
     | 
    
         
            +
            	return err->code;
         
     | 
| 
      
 563 
     | 
    
         
            +
                }
         
     | 
| 
      
 564 
     | 
    
         
            +
                if ('=' == *doc->cur) {
         
     | 
| 
      
 565 
     | 
    
         
            +
            	doc->cur++;
         
     | 
| 
      
 566 
     | 
    
         
            +
            	if (NULL == (dval = agoo_doc_read_value(err, doc, return_type))) {
         
     | 
| 
      
 567 
     | 
    
         
            +
            	    return err->code;
         
     | 
| 
      
 568 
     | 
    
         
            +
            	}
         
     | 
| 
      
 569 
     | 
    
         
            +
                }
         
     | 
| 
      
 570 
     | 
    
         
            +
                if (AGOO_ERR_OK != extract_dir_use(err, doc, &uses)) {
         
     | 
| 
      
 571 
     | 
    
         
            +
            	return err->code;
         
     | 
| 
      
 572 
     | 
    
         
            +
                }
         
     | 
| 
      
 573 
     | 
    
         
            +
                // TBD zzzzzzzz
         
     | 
| 
      
 574 
     | 
    
         
            +
             
     | 
| 
      
 575 
     | 
    
         
            +
                if (NULL == (arg = gql_input_arg(err, type, name, return_type, desc, dlen, dval, required))) {
         
     | 
| 
      
 576 
     | 
    
         
            +
            	return err->code;
         
     | 
| 
      
 577 
     | 
    
         
            +
                }
         
     | 
| 
      
 578 
     | 
    
         
            +
                arg->dir = uses;
         
     | 
| 
      
 579 
     | 
    
         
            +
             
     | 
| 
      
 580 
     | 
    
         
            +
                return AGOO_ERR_OK;
         
     | 
| 
      
 581 
     | 
    
         
            +
            }
         
     | 
| 
      
 582 
     | 
    
         
            +
             
     | 
| 
       542 
583 
     | 
    
         
             
            static int
         
     | 
| 
       543 
584 
     | 
    
         
             
            make_interface(agooErr err, agooDoc doc, const char *desc, int len) {
         
     | 
| 
       544 
585 
     | 
    
         
             
                char	name[256];
         
     | 
| 
       545 
586 
     | 
    
         
             
                gqlType	type;
         
     | 
| 
       546 
587 
     | 
    
         
             
                gqlDirUse	uses = NULL;
         
     | 
| 
       547 
     | 
    
         
            -
             
     | 
| 
      
 588 
     | 
    
         
            +
             
     | 
| 
       548 
589 
     | 
    
         
             
                if (AGOO_ERR_OK != extract_name(err, doc, interface_str, sizeof(interface_str) - 1, name, sizeof(name))) {
         
     | 
| 
       549 
590 
     | 
    
         
             
            	return err->code;
         
     | 
| 
       550 
591 
     | 
    
         
             
                }
         
     | 
| 
         @@ -567,7 +608,7 @@ make_interface(agooErr err, agooDoc doc, const char *desc, int len) { 
     | 
|
| 
       567 
608 
     | 
    
         
             
            	    doc->cur++; // skip }
         
     | 
| 
       568 
609 
     | 
    
         
             
            	    break;
         
     | 
| 
       569 
610 
     | 
    
         
             
            	}
         
     | 
| 
       570 
     | 
    
         
            -
            	if (AGOO_ERR_OK != make_field(err, doc, type 
     | 
| 
      
 611 
     | 
    
         
            +
            	if (AGOO_ERR_OK != make_field(err, doc, type)) {
         
     | 
| 
       571 
612 
     | 
    
         
             
            	    return err->code;
         
     | 
| 
       572 
613 
     | 
    
         
             
            	}
         
     | 
| 
       573 
614 
     | 
    
         
             
            	agoo_doc_skip_white(doc);
         
     | 
| 
         @@ -604,7 +645,8 @@ make_input(agooErr err, agooDoc doc, const char *desc, int len) { 
     | 
|
| 
       604 
645 
     | 
    
         
             
            	    doc->cur++; // skip }
         
     | 
| 
       605 
646 
     | 
    
         
             
            	    break;
         
     | 
| 
       606 
647 
     | 
    
         
             
            	}
         
     | 
| 
       607 
     | 
    
         
            -
            	 
     | 
| 
      
 648 
     | 
    
         
            +
            	// TBD zzzzzzzzzz make_arg
         
     | 
| 
      
 649 
     | 
    
         
            +
            	if (AGOO_ERR_OK != make_input_arg(err, doc, type)) {
         
     | 
| 
       608 
650 
     | 
    
         
             
            	    return err->code;
         
     | 
| 
       609 
651 
     | 
    
         
             
            	}
         
     | 
| 
       610 
652 
     | 
    
         
             
            	agoo_doc_skip_white(doc);
         
     | 
| 
         @@ -645,7 +687,7 @@ extract_interfaces(agooErr err, agooDoc doc, gqlTypeLink *interfacesp) { 
     | 
|
| 
       645 
687 
     | 
    
         
             
            	    return err->code;
         
     | 
| 
       646 
688 
     | 
    
         
             
            	}
         
     | 
| 
       647 
689 
     | 
    
         
             
            	if (NULL == (link = (gqlTypeLink)AGOO_MALLOC(sizeof(struct _gqlTypeLink)))) {
         
     | 
| 
       648 
     | 
    
         
            -
            	    return  
     | 
| 
      
 690 
     | 
    
         
            +
            	    return AGOO_ERR_MEM(err, "GraphQL Interface");
         
     | 
| 
       649 
691 
     | 
    
         
             
            	}
         
     | 
| 
       650 
692 
     | 
    
         
             
            	link->next = NULL;
         
     | 
| 
       651 
693 
     | 
    
         
             
            	link->type = type;
         
     | 
| 
         @@ -695,7 +737,7 @@ make_type(agooErr err, agooDoc doc, const char *desc, int len) { 
     | 
|
| 
       695 
737 
     | 
    
         
             
            	    doc->cur++; // skip }
         
     | 
| 
       696 
738 
     | 
    
         
             
            	    break;
         
     | 
| 
       697 
739 
     | 
    
         
             
            	}
         
     | 
| 
       698 
     | 
    
         
            -
            	if (AGOO_ERR_OK != make_field(err, doc, type 
     | 
| 
      
 740 
     | 
    
         
            +
            	if (AGOO_ERR_OK != make_field(err, doc, type)) {
         
     | 
| 
       699 
741 
     | 
    
         
             
            	    return err->code;
         
     | 
| 
       700 
742 
     | 
    
         
             
            	}
         
     | 
| 
       701 
743 
     | 
    
         
             
            	agoo_doc_skip_white(doc);
         
     | 
| 
         @@ -708,7 +750,7 @@ sdl_parse(agooErr err, const char *str, int len) { 
     | 
|
| 
       708 
750 
     | 
    
         
             
                struct _agooDoc	doc;
         
     | 
| 
       709 
751 
     | 
    
         
             
                const char		*desc = NULL;
         
     | 
| 
       710 
752 
     | 
    
         
             
                size_t		dlen = 0;
         
     | 
| 
       711 
     | 
    
         
            -
             
     | 
| 
      
 753 
     | 
    
         
            +
             
     | 
| 
       712 
754 
     | 
    
         
             
                agoo_doc_init(&doc, str, len);
         
     | 
| 
       713 
755 
     | 
    
         | 
| 
       714 
756 
     | 
    
         
             
                while (doc.cur < doc.end) {
         
     | 
| 
         @@ -769,7 +811,7 @@ sdl_parse(agooErr err, const char *str, int len) { 
     | 
|
| 
       769 
811 
     | 
    
         
             
            		if ('p' == doc.cur[2]) {
         
     | 
| 
       770 
812 
     | 
    
         
             
            		    if (AGOO_ERR_OK != make_input(err, &doc, desc, dlen)) {
         
     | 
| 
       771 
813 
     | 
    
         
             
            			return err->code;
         
     | 
| 
       772 
     | 
    
         
            -
            		    } 
     | 
| 
      
 814 
     | 
    
         
            +
            		    }
         
     | 
| 
       773 
815 
     | 
    
         
             
            		    desc = NULL;
         
     | 
| 
       774 
816 
     | 
    
         
             
            		    dlen = 0;
         
     | 
| 
       775 
817 
     | 
    
         
             
            		    break;
         
     | 
| 
         @@ -799,11 +841,12 @@ sel_arg_create(agooErr err, const char *name, gqlValue value, gqlVar var) { 
     | 
|
| 
       799 
841 
     | 
    
         
             
                gqlSelArg	arg;
         
     | 
| 
       800 
842 
     | 
    
         | 
| 
       801 
843 
     | 
    
         
             
                if (NULL == (arg = (gqlSelArg)AGOO_MALLOC(sizeof(struct _gqlSelArg)))) {
         
     | 
| 
       802 
     | 
    
         
            -
            	 
     | 
| 
      
 844 
     | 
    
         
            +
            	AGOO_ERR_MEM(err, "GraphQL Selection Field Argument");
         
     | 
| 
       803 
845 
     | 
    
         
             
                } else {
         
     | 
| 
       804 
846 
     | 
    
         
             
            	arg->next = NULL;
         
     | 
| 
       805 
847 
     | 
    
         
             
            	if (NULL == (arg->name = AGOO_STRDUP(name))) {
         
     | 
| 
       806 
     | 
    
         
            -
            	     
     | 
| 
      
 848 
     | 
    
         
            +
            	    AGOO_ERR_MEM(err, "strdup()");
         
     | 
| 
      
 849 
     | 
    
         
            +
            	    AGOO_FREE(arg);
         
     | 
| 
       807 
850 
     | 
    
         
             
            	    return NULL;
         
     | 
| 
       808 
851 
     | 
    
         
             
            	}
         
     | 
| 
       809 
852 
     | 
    
         
             
            	arg->var = var;
         
     | 
| 
         @@ -817,7 +860,7 @@ make_sel_arg(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOp op, gqlSel sel) { 
     | 
|
| 
       817 
860 
     | 
    
         
             
                gqlValue	value = NULL;
         
     | 
| 
       818 
861 
     | 
    
         
             
                gqlVar	var = NULL;
         
     | 
| 
       819 
862 
     | 
    
         
             
                gqlSelArg	arg;
         
     | 
| 
       820 
     | 
    
         
            -
             
     | 
| 
      
 863 
     | 
    
         
            +
             
     | 
| 
       821 
864 
     | 
    
         
             
                agoo_doc_skip_white(doc);
         
     | 
| 
       822 
865 
     | 
    
         
             
                if (0 == read_name(err, doc, name, sizeof(name))) {
         
     | 
| 
       823 
866 
     | 
    
         
             
            	return err->code;
         
     | 
| 
         @@ -830,7 +873,7 @@ make_sel_arg(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOp op, gqlSel sel) { 
     | 
|
| 
       830 
873 
     | 
    
         
             
                agoo_doc_skip_white(doc);
         
     | 
| 
       831 
874 
     | 
    
         
             
                if ('$' == *doc->cur && NULL != op) {
         
     | 
| 
       832 
875 
     | 
    
         
             
            	char	var_name[256];
         
     | 
| 
       833 
     | 
    
         
            -
             
     | 
| 
      
 876 
     | 
    
         
            +
             
     | 
| 
       834 
877 
     | 
    
         
             
            	doc->cur++;
         
     | 
| 
       835 
878 
     | 
    
         
             
            	if (0 == read_name(err, doc, var_name, sizeof(var_name))) {
         
     | 
| 
       836 
879 
     | 
    
         
             
            	    return err->code;
         
     | 
| 
         @@ -873,11 +916,12 @@ gql_op_var_create(agooErr err, const char *name, gqlType type, gqlValue value) { 
     | 
|
| 
       873 
916 
     | 
    
         
             
                gqlVar	var;
         
     | 
| 
       874 
917 
     | 
    
         | 
| 
       875 
918 
     | 
    
         
             
                if (NULL == (var = (gqlVar)AGOO_MALLOC(sizeof(struct _gqlVar)))) {
         
     | 
| 
       876 
     | 
    
         
            -
            	 
     | 
| 
      
 919 
     | 
    
         
            +
            	AGOO_ERR_MEM(err, "GraphQL Operations Variable");
         
     | 
| 
       877 
920 
     | 
    
         
             
                } else {
         
     | 
| 
       878 
921 
     | 
    
         
             
            	var->next = NULL;
         
     | 
| 
       879 
922 
     | 
    
         
             
            	if (NULL == (var->name = AGOO_STRDUP(name))) {
         
     | 
| 
       880 
     | 
    
         
            -
            	     
     | 
| 
      
 923 
     | 
    
         
            +
            	    AGOO_ERR_MEM(err, "strdup()");
         
     | 
| 
      
 924 
     | 
    
         
            +
            	    AGOO_FREE(var);
         
     | 
| 
       881 
925 
     | 
    
         
             
            	    return NULL;
         
     | 
| 
       882 
926 
     | 
    
         
             
            	}
         
     | 
| 
       883 
927 
     | 
    
         
             
            	var->type = type;
         
     | 
| 
         @@ -893,7 +937,7 @@ make_op_var(agooErr err, agooDoc doc, gqlOp op) { 
     | 
|
| 
       893 
937 
     | 
    
         
             
                bool	ignore;
         
     | 
| 
       894 
938 
     | 
    
         
             
                gqlValue	value = NULL;
         
     | 
| 
       895 
939 
     | 
    
         
             
                gqlVar	var;
         
     | 
| 
       896 
     | 
    
         
            -
             
     | 
| 
      
 940 
     | 
    
         
            +
             
     | 
| 
       897 
941 
     | 
    
         
             
                agoo_doc_skip_white(doc);
         
     | 
| 
       898 
942 
     | 
    
         
             
                if ('$' != *doc->cur) {
         
     | 
| 
       899 
943 
     | 
    
         
             
            	return agoo_doc_err(doc, err, "Expected $");
         
     | 
| 
         @@ -907,7 +951,7 @@ make_op_var(agooErr err, agooDoc doc, gqlOp op) { 
     | 
|
| 
       907 
951 
     | 
    
         
             
            	return agoo_doc_err(doc, err, "Expected :");
         
     | 
| 
       908 
952 
     | 
    
         
             
                }
         
     | 
| 
       909 
953 
     | 
    
         
             
                doc->cur++;
         
     | 
| 
       910 
     | 
    
         
            -
             
     | 
| 
      
 954 
     | 
    
         
            +
             
     | 
| 
       911 
955 
     | 
    
         
             
                if (AGOO_ERR_OK != read_type(err, doc, &type, &ignore)) {
         
     | 
| 
       912 
956 
     | 
    
         
             
            	return err->code;
         
     | 
| 
       913 
957 
     | 
    
         
             
                }
         
     | 
| 
         @@ -939,14 +983,15 @@ sel_create(agooErr err, const char *alias, const char *name, const char *frag) { 
     | 
|
| 
       939 
983 
     | 
    
         
             
                gqlSel	sel;
         
     | 
| 
       940 
984 
     | 
    
         | 
| 
       941 
985 
     | 
    
         
             
                if (NULL == (sel = (gqlSel)AGOO_MALLOC(sizeof(struct _gqlSel)))) {
         
     | 
| 
       942 
     | 
    
         
            -
            	 
     | 
| 
      
 986 
     | 
    
         
            +
            	AGOO_ERR_MEM(err, "GraphQL Selection Set");
         
     | 
| 
       943 
987 
     | 
    
         
             
                } else {
         
     | 
| 
       944 
988 
     | 
    
         
             
            	sel->next = NULL;
         
     | 
| 
       945 
989 
     | 
    
         
             
            	if (NULL == name) {
         
     | 
| 
       946 
990 
     | 
    
         
             
            	    sel->name = NULL;
         
     | 
| 
       947 
991 
     | 
    
         
             
            	} else {
         
     | 
| 
       948 
992 
     | 
    
         
             
            	    if (NULL == (sel->name = AGOO_STRDUP(name))) {
         
     | 
| 
       949 
     | 
    
         
            -
            		 
     | 
| 
      
 993 
     | 
    
         
            +
            		AGOO_ERR_MEM(err, "strdup()");
         
     | 
| 
      
 994 
     | 
    
         
            +
            		AGOO_FREE(sel);
         
     | 
| 
       950 
995 
     | 
    
         
             
            		return NULL;
         
     | 
| 
       951 
996 
     | 
    
         
             
            	    }
         
     | 
| 
       952 
997 
     | 
    
         
             
            	}
         
     | 
| 
         @@ -954,7 +999,8 @@ sel_create(agooErr err, const char *alias, const char *name, const char *frag) { 
     | 
|
| 
       954 
999 
     | 
    
         
             
            	    sel->alias = NULL;
         
     | 
| 
       955 
1000 
     | 
    
         
             
            	} else {
         
     | 
| 
       956 
1001 
     | 
    
         
             
            	    if (NULL == (sel->alias = AGOO_STRDUP(alias))) {
         
     | 
| 
       957 
     | 
    
         
            -
            		 
     | 
| 
      
 1002 
     | 
    
         
            +
            		AGOO_ERR_MEM(err, "strdup()");
         
     | 
| 
      
 1003 
     | 
    
         
            +
            		AGOO_FREE(sel);
         
     | 
| 
       958 
1004 
     | 
    
         
             
            		return NULL;
         
     | 
| 
       959 
1005 
     | 
    
         
             
            	    }
         
     | 
| 
       960 
1006 
     | 
    
         
             
            	}
         
     | 
| 
         @@ -962,7 +1008,8 @@ sel_create(agooErr err, const char *alias, const char *name, const char *frag) { 
     | 
|
| 
       962 
1008 
     | 
    
         
             
            	    sel->frag = NULL;
         
     | 
| 
       963 
1009 
     | 
    
         
             
            	} else {
         
     | 
| 
       964 
1010 
     | 
    
         
             
            	    if (NULL == (sel->frag = AGOO_STRDUP(frag))) {
         
     | 
| 
       965 
     | 
    
         
            -
            		 
     | 
| 
      
 1011 
     | 
    
         
            +
            		AGOO_ERR_MEM(err, "strdup()");
         
     | 
| 
      
 1012 
     | 
    
         
            +
            		AGOO_FREE(sel);
         
     | 
| 
       966 
1013 
     | 
    
         
             
            		return NULL;
         
     | 
| 
       967 
1014 
     | 
    
         
             
            	    }
         
     | 
| 
       968 
1015 
     | 
    
         
             
            	}
         
     | 
| 
         @@ -973,7 +1020,7 @@ sel_create(agooErr err, const char *alias, const char *name, const char *frag) { 
     | 
|
| 
       973 
1020 
     | 
    
         
             
            	sel->inline_frag = NULL;
         
     | 
| 
       974 
1021 
     | 
    
         
             
                }
         
     | 
| 
       975 
1022 
     | 
    
         
             
                return sel;
         
     | 
| 
       976 
     | 
    
         
            -
            } 
     | 
| 
      
 1023 
     | 
    
         
            +
            }
         
     | 
| 
       977 
1024 
     | 
    
         | 
| 
       978 
1025 
     | 
    
         
             
            static gqlSel
         
     | 
| 
       979 
1026 
     | 
    
         
             
            make_sel_inline(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOp op) {
         
     | 
| 
         @@ -983,7 +1030,7 @@ make_sel_inline(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOp op) { 
     | 
|
| 
       983 
1030 
     | 
    
         
             
                agoo_doc_skip_white(doc);
         
     | 
| 
       984 
1031 
     | 
    
         
             
                if ('o' == *doc->cur && 'n' == doc->cur[1]) { // inline fragment
         
     | 
| 
       985 
1032 
     | 
    
         
             
            	char	type_name[256];
         
     | 
| 
       986 
     | 
    
         
            -
             
     | 
| 
      
 1033 
     | 
    
         
            +
             
     | 
| 
       987 
1034 
     | 
    
         
             
            	doc->cur += 2;
         
     | 
| 
       988 
1035 
     | 
    
         
             
            	agoo_doc_skip_white(doc);
         
     | 
| 
       989 
1036 
     | 
    
         
             
            	if (0 == read_name(err, doc, type_name, sizeof(type_name))) {
         
     | 
| 
         @@ -1303,7 +1350,7 @@ make_fragment(agooErr err, agooDoc doc, gqlDoc gdoc) { 
     | 
|
| 
       1303 
1350 
     | 
    
         
             
            static gqlType
         
     | 
| 
       1304 
1351 
     | 
    
         
             
            lookup_field_type(gqlType type, const char *field, bool qroot) {
         
     | 
| 
       1305 
1352 
     | 
    
         
             
                gqlType	ftype = NULL;
         
     | 
| 
       1306 
     | 
    
         
            -
             
     | 
| 
      
 1353 
     | 
    
         
            +
             
     | 
| 
       1307 
1354 
     | 
    
         
             
                switch (type->kind) {
         
     | 
| 
       1308 
1355 
     | 
    
         
             
                case GQL_OBJECT:
         
     | 
| 
       1309 
1356 
     | 
    
         
             
                case GQL_INPUT:
         
     | 
| 
         @@ -1342,7 +1389,7 @@ lookup_field_type(gqlType type, const char *field, bool qroot) { 
     | 
|
| 
       1342 
1389 
     | 
    
         
             
            static int
         
     | 
| 
       1343 
1390 
     | 
    
         
             
            sel_set_type(agooErr err, gqlType type, gqlSel sels, bool qroot) {
         
     | 
| 
       1344 
1391 
     | 
    
         
             
                gqlSel	sel;
         
     | 
| 
       1345 
     | 
    
         
            -
             
     | 
| 
      
 1392 
     | 
    
         
            +
             
     | 
| 
       1346 
1393 
     | 
    
         
             
                for (sel = sels; NULL != sel; sel = sel->next) {
         
     | 
| 
       1347 
1394 
     | 
    
         
             
            	if (NULL == sel->name) { // inline or fragment
         
     | 
| 
       1348 
1395 
     | 
    
         
             
            	    sel->type = type;
         
     | 
| 
         @@ -1377,7 +1424,7 @@ validate_doc(agooErr err, gqlDoc doc) { 
     | 
|
| 
       1377 
1424 
     | 
    
         
             
                gqlType	type = NULL;
         
     | 
| 
       1378 
1425 
     | 
    
         
             
                gqlFrag	frag;
         
     | 
| 
       1379 
1426 
     | 
    
         
             
                int		cnt;
         
     | 
| 
       1380 
     | 
    
         
            -
             
     | 
| 
      
 1427 
     | 
    
         
            +
             
     | 
| 
       1381 
1428 
     | 
    
         
             
                if (NULL == (schema = gql_type_get("schema"))) {
         
     | 
| 
       1382 
1429 
     | 
    
         
             
            	return agoo_err_set(err, AGOO_ERR_EVAL, "No root (schema) type defined.");
         
     | 
| 
       1383 
1430 
     | 
    
         
             
                }
         
     | 
| 
         @@ -1395,7 +1442,7 @@ validate_doc(agooErr err, gqlDoc doc) { 
     | 
|
| 
       1395 
1442 
     | 
    
         
             
            	    }
         
     | 
| 
       1396 
1443 
     | 
    
         
             
            	} else {
         
     | 
| 
       1397 
1444 
     | 
    
         
             
            	    gqlOp	o2 = op->next;
         
     | 
| 
       1398 
     | 
    
         
            -
             
     | 
| 
      
 1445 
     | 
    
         
            +
             
     | 
| 
       1399 
1446 
     | 
    
         
             
            	    for (; NULL != o2; o2 = o2->next) {
         
     | 
| 
       1400 
1447 
     | 
    
         
             
            		if (NULL == o2->name) {
         
     | 
| 
       1401 
1448 
     | 
    
         
             
            		    continue;
         
     | 
    
        data/ext/agoo/sdl.h
    CHANGED
    
    | 
         @@ -5,13 +5,15 @@ 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            #include "err.h"
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
      
 8 
     | 
    
         
            +
            struct _gqlType;
         
     | 
| 
       8 
9 
     | 
    
         
             
            struct _gqlVar;
         
     | 
| 
      
 10 
     | 
    
         
            +
            struct _gqlValue;
         
     | 
| 
       9 
11 
     | 
    
         | 
| 
       10 
12 
     | 
    
         
             
            extern int		sdl_parse(agooErr err, const char *str, int len);
         
     | 
| 
       11 
13 
     | 
    
         | 
| 
       12 
14 
     | 
    
         
             
            // Parse a execution definition.
         
     | 
| 
       13 
15 
     | 
    
         
             
            extern struct _gqlDoc*	sdl_parse_doc(agooErr err, const char *str, int len, struct _gqlVar *vars);
         
     | 
| 
       14 
16 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
            extern gqlVar	gql_op_var_create(agooErr err, const char *name,  
     | 
| 
      
 17 
     | 
    
         
            +
            extern gqlVar	gql_op_var_create(agooErr err, const char *name, struct _gqlType *type, struct _gqlValue *value);
         
     | 
| 
       16 
18 
     | 
    
         | 
| 
       17 
19 
     | 
    
         
             
            #endif // AGOO_SDL_H
         
     | 
    
        data/ext/agoo/server.c
    CHANGED
    
    | 
         @@ -24,17 +24,20 @@ 
     | 
|
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
            struct _agooServer	agoo_server = {false};
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
            agoo_server_setup() {
         
     | 
| 
      
 27 
     | 
    
         
            +
            int
         
     | 
| 
      
 28 
     | 
    
         
            +
            agoo_server_setup(agooErr err) {
         
     | 
| 
       29 
29 
     | 
    
         
             
                long	i;
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
31 
     | 
    
         
             
                memset(&agoo_server, 0, sizeof(struct _agooServer));
         
     | 
| 
       32 
32 
     | 
    
         
             
                pthread_mutex_init(&agoo_server.up_lock, 0);
         
     | 
| 
       33 
33 
     | 
    
         
             
                agoo_server.up_list = NULL;
         
     | 
| 
       34 
34 
     | 
    
         
             
                agoo_server.max_push_pending = 32;
         
     | 
| 
       35 
     | 
    
         
            -
                 
     | 
| 
       36 
     | 
    
         
            -
                 
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
      
 35 
     | 
    
         
            +
                
         
     | 
| 
      
 36 
     | 
    
         
            +
                if (AGOO_ERR_OK != agoo_pages_init(err) ||
         
     | 
| 
      
 37 
     | 
    
         
            +
            	AGOO_ERR_OK != agoo_queue_multi_init(err, &agoo_server.con_queue, 1024, false, true) ||
         
     | 
| 
      
 38 
     | 
    
         
            +
            	AGOO_ERR_OK != agoo_queue_multi_init(err, &agoo_server.eval_queue, 1024, true, true)) {
         
     | 
| 
      
 39 
     | 
    
         
            +
            	return err->code;
         
     | 
| 
      
 40 
     | 
    
         
            +
                }
         
     | 
| 
       38 
41 
     | 
    
         
             
                agoo_server.loop_max = 4;
         
     | 
| 
       39 
42 
     | 
    
         
             
                if (0 < (i = sysconf(_SC_NPROCESSORS_ONLN))) {
         
     | 
| 
       40 
43 
     | 
    
         
             
            	i /= 2;
         
     | 
| 
         @@ -43,6 +46,7 @@ agoo_server_setup() { 
     | 
|
| 
       43 
46 
     | 
    
         
             
            	}
         
     | 
| 
       44 
47 
     | 
    
         
             
            	agoo_server.loop_max = (int)i;
         
     | 
| 
       45 
48 
     | 
    
         
             
                }
         
     | 
| 
      
 49 
     | 
    
         
            +
                return AGOO_ERR_OK;
         
     | 
| 
       46 
50 
     | 
    
         
             
            }
         
     | 
| 
       47 
51 
     | 
    
         | 
| 
       48 
52 
     | 
    
         
             
            static void
         
     | 
| 
         @@ -301,7 +305,7 @@ agoo_server_add_func_hook(agooErr	err, 
     | 
|
| 
       301 
305 
     | 
    
         
             
                agooHook	hook = agoo_hook_func_create(method, pattern, func, queue);
         
     | 
| 
       302 
306 
     | 
    
         | 
| 
       303 
307 
     | 
    
         
             
                if (NULL == hook) {
         
     | 
| 
       304 
     | 
    
         
            -
            	return  
     | 
| 
      
 308 
     | 
    
         
            +
            	return AGOO_ERR_MEM(err, "HTTP Server Hook");
         
     | 
| 
       305 
309 
     | 
    
         
             
                }
         
     | 
| 
       306 
310 
     | 
    
         
             
                hook->no_queue = quick;
         
     | 
| 
       307 
311 
     | 
    
         
             
                for (h = agoo_server.hooks; NULL != h; h = h->next) {
         
     | 
    
        data/ext/agoo/server.h
    CHANGED
    
    | 
         @@ -49,7 +49,8 @@ typedef struct _agooServer { 
     | 
|
| 
       49 
49 
     | 
    
         
             
            } *agooServer;
         
     | 
| 
       50 
50 
     | 
    
         | 
| 
       51 
51 
     | 
    
         
             
            extern struct _agooServer	agoo_server;
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            extern int	agoo_server_setup(agooErr err);
         
     | 
| 
       53 
54 
     | 
    
         
             
            extern void	agoo_server_shutdown(const char *app_name, void (*stop)());
         
     | 
| 
       54 
55 
     | 
    
         
             
            extern void	agoo_server_bind(agooBind b);
         
     | 
| 
       55 
56 
     | 
    
         | 
    
        data/ext/agoo/upgraded.c
    CHANGED
    
    | 
         @@ -55,7 +55,7 @@ agoo_upgraded_release_con(agooUpgraded up) { 
     | 
|
| 
       55 
55 
     | 
    
         
             
            }
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
       57 
57 
     | 
    
         
             
            // Called from the con_loop thread, no need to lock, this steals the subject
         
     | 
| 
       58 
     | 
    
         
            -
            // so the pub subject should set to NULL
         
     | 
| 
      
 58 
     | 
    
         
            +
            // so the pub subject should be set to NULL
         
     | 
| 
       59 
59 
     | 
    
         
             
            void
         
     | 
| 
       60 
60 
     | 
    
         
             
            agoo_upgraded_add_subject(agooUpgraded up, agooSubject subject) {
         
     | 
| 
       61 
61 
     | 
    
         
             
                agooSubject	s;
         
     | 
| 
         @@ -166,10 +166,9 @@ agoo_upgraded_pending(agooUpgraded up) { 
     | 
|
| 
       166 
166 
     | 
    
         | 
| 
       167 
167 
     | 
    
         
             
            agooUpgraded
         
     | 
| 
       168 
168 
     | 
    
         
             
            agoo_upgraded_create(agooCon c, void * ctx, void *env) {
         
     | 
| 
       169 
     | 
    
         
            -
                agooUpgraded	up = (agooUpgraded) 
     | 
| 
      
 169 
     | 
    
         
            +
                agooUpgraded	up = (agooUpgraded)AGOO_CALLOC(1, sizeof(struct _agooUpgraded));
         
     | 
| 
       170 
170 
     | 
    
         | 
| 
       171 
171 
     | 
    
         
             
                if (NULL != up) {
         
     | 
| 
       172 
     | 
    
         
            -
            	memset(up, 0, sizeof(struct _agooUpgraded));
         
     | 
| 
       173 
172 
     | 
    
         
             
            	up->con = c;
         
     | 
| 
       174 
173 
     | 
    
         
             
            	up->ctx = ctx;
         
     | 
| 
       175 
174 
     | 
    
         
             
            	up->env = env;
         
     | 
    
        data/lib/agoo/version.rb
    CHANGED
    
    
    
        data/test/static_test.rb
    CHANGED
    
    | 
         @@ -31,10 +31,13 @@ class StaticTest < Minitest::Test 
     | 
|
| 
       31 
31 
     | 
    
         | 
| 
       32 
32 
     | 
    
         
             
                Agoo::Server.init(6469, 'root', thread_count: 1)
         
     | 
| 
       33 
33 
     | 
    
         
             
                Agoo::Server.add_mime('odd', 'text/odd')
         
     | 
| 
      
 34 
     | 
    
         
            +
                #Agoo::Server.header_rule('odd.odd', 'text/odd', "Cookie", "fast=Agoo");
         
     | 
| 
      
 35 
     | 
    
         
            +
                Agoo::Server.header_rule('odd.odd', '*', "Cookie", "fast=Agoo");
         
     | 
| 
      
 36 
     | 
    
         
            +
                Agoo::Server.header_rule('**', 'odd', "Warning", "nothing wrong");
         
     | 
| 
       34 
37 
     | 
    
         
             
                Agoo::Server.start()
         
     | 
| 
       35 
38 
     | 
    
         | 
| 
       36 
39 
     | 
    
         
             
                @@server_started = true
         
     | 
| 
       37 
     | 
    
         
            -
              end 
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
       38 
41 
     | 
    
         | 
| 
       39 
42 
     | 
    
         
             
              def setup
         
     | 
| 
       40 
43 
     | 
    
         
             
                unless @@server_started
         
     | 
| 
         @@ -73,6 +76,8 @@ class StaticTest < Minitest::Test 
     | 
|
| 
       73 
76 
     | 
    
         
             
                  h.request(req)
         
     | 
| 
       74 
77 
     | 
    
         
             
                }
         
     | 
| 
       75 
78 
     | 
    
         
             
                assert_equal('text/odd', res['Content-Type'])
         
     | 
| 
      
 79 
     | 
    
         
            +
                assert_equal('fast=Agoo', res['Cookie'])
         
     | 
| 
      
 80 
     | 
    
         
            +
                assert_equal('nothing wrong', res['Warning'])
         
     | 
| 
       76 
81 
     | 
    
         
             
              end
         
     | 
| 
       77 
82 
     | 
    
         | 
| 
       78 
83 
     | 
    
         
             
              def test_fetch_auto_index
         
     |