From 58f64d3d76eea9da313398fe0eb06b7080fb54b2 Mon Sep 17 00:00:00 2001 From: Sander Mertens Date: Tue, 1 Dec 2015 21:16:35 -0500 Subject: [PATCH] #416 Added iteration over replicators to select --- packages/corto/lang/include/corto__api.h | 2 +- packages/corto/lang/include/corto_iter.h | 33 ++++--- packages/corto/lang/include/corto_object.h | 9 +- .../corto/lang/include/corto_replicator.h | 2 +- packages/corto/lang/src/corto.c | 2 +- packages/corto/lang/src/corto__api.c | 2 +- packages/corto/lang/src/corto__bootstrap.h | 2 +- packages/corto/lang/src/corto__wrapper.c | 4 +- packages/corto/lang/src/corto_iter.c | 19 ++-- packages/corto/lang/src/corto_replicator.c | 2 +- packages/corto/lang/src/corto_select.c | 97 ++++++++++++------- .../corto/lang/test/include/test_selectItem.h | 20 ++++ packages/corto/lang/test/src/test_Select.c | 46 ++++----- packages/corto/lang/test/test.cx | 10 +- tools/corto/src/cortotool_shell.c | 8 +- 15 files changed, 151 insertions(+), 107 deletions(-) create mode 100644 packages/corto/lang/test/include/test_selectItem.h diff --git a/packages/corto/lang/include/corto__api.h b/packages/corto/lang/include/corto__api.h index 147c3864..6305d49d 100644 --- a/packages/corto/lang/include/corto__api.h +++ b/packages/corto/lang/include/corto__api.h @@ -1759,7 +1759,7 @@ CORTO_LANG_EXPORT corto_int16 _corto_requestActionInit(corto_requestAction* valu CORTO_LANG_EXPORT corto_int16 _corto_requestActionDeinit(corto_requestAction* value); #define corto_requestActionDeinit(value) _corto_requestActionDeinit(value) -corto_int16 corto_requestActionCall(corto_requestAction *_delegate, corto_resultIter* _result, corto_string scope, corto_string expr); +corto_int16 corto_requestActionCall(corto_requestAction *_delegate, corto_resultIter* _result, corto_object scope, corto_string expr); /* /corto/lang/result */ CORTO_LANG_EXPORT corto_result* _corto_resultCreate(corto_string name, corto_string parent, corto_string type); #define corto_resultCreate(name, parent, type) _corto_resultCreate(name, parent, type) diff --git a/packages/corto/lang/include/corto_iter.h b/packages/corto/lang/include/corto_iter.h index 113b5f39..326082e7 100644 --- a/packages/corto/lang/include/corto_iter.h +++ b/packages/corto/lang/include/corto_iter.h @@ -12,21 +12,23 @@ extern "C" { #define CORTO_ITER_STACK_LIMIT (64) -#define CORTO_ITERATOR(_name)\ -typedef struct _name _name;\ -struct _name {\ - void *udata;\ - void (*moveFirst)(_name*);\ - void* (*move)(_name*, unsigned int);\ - int (*hasNext)(_name*);\ - void* (*next)(_name*);\ - void* (*nextPtr)(_name*);\ - void* (*remove)(_name*);\ - void (*insert)(_name*, void*);\ - void (*set)(_name*, void*);\ -}\ - -CORTO_ITERATOR(corto_iter); +/* Create a typedef, so generic iterator functions can be used with user + * defined iterator types */ +#define CORTO_ITERATOR(_name) typedef corto_iter _name + +typedef struct corto_iter corto_iter; +struct corto_iter { + void *udata; + void (*moveFirst)(corto_iter*); + void* (*move)(corto_iter*, unsigned int); + int (*hasNext)(corto_iter*); + void* (*next)(corto_iter*); + void* (*nextPtr)(corto_iter*); + void* (*remove)(corto_iter*); + void (*insert)(corto_iter*, void*); + void (*set)(corto_iter*, void*); + void (*release)(corto_iter*); +}; /* Generic iterator implementation */ void corto_iterMoveFirst(corto_iter* iter); @@ -37,6 +39,7 @@ void* corto_iterNextPtr(corto_iter* iter); void* corto_iterRemove(corto_iter* iter); void corto_iterInsert(corto_iter* iter, void* o); void corto_iterSet(corto_iter* iter, void* o); +void corto_iterRelease(corto_iter* iter); #ifdef __cplusplus } diff --git a/packages/corto/lang/include/corto_object.h b/packages/corto/lang/include/corto_object.h index c57b96ce..c8c3e89a 100644 --- a/packages/corto/lang/include/corto_object.h +++ b/packages/corto/lang/include/corto_object.h @@ -77,13 +77,8 @@ corto_object corto_ownerof(corto_object o); corto_object corto_lookup(corto_object scope, corto_string name); corto_object corto_resolve(corto_object scope, corto_string expr); -typedef struct corto_selectItem { - corto_string parent; - corto_string name; - corto_string type; -} corto_selectItem; - -corto_int16 corto_select(corto_object scope, corto_string expr, corto_iter *iter_out); +/* Iterate over object metadata matching a expression */ +corto_int16 corto_select(corto_object scope, corto_string expr, corto_resultIter *iter_out); /* Notifications */ corto_object corto_setOwner(corto_object owner); diff --git a/packages/corto/lang/include/corto_replicator.h b/packages/corto/lang/include/corto_replicator.h index 91c68832..aae3b955 100644 --- a/packages/corto/lang/include/corto_replicator.h +++ b/packages/corto/lang/include/corto_replicator.h @@ -34,7 +34,7 @@ CORTO_LANG_EXPORT corto_void _corto_replicator_on_update(corto_replicator _this, CORTO_LANG_EXPORT corto_void _corto_replicator_post(corto_replicator _this, corto_event e); #define corto_replicator_post(_this, e) _corto_replicator_post(corto_replicator(_this), corto_event(e)) -CORTO_LANG_EXPORT corto_resultIter _corto_replicator_request(corto_replicator _this, corto_string parent, corto_string expr); +CORTO_LANG_EXPORT corto_resultIter _corto_replicator_request(corto_replicator _this, corto_object parent, corto_string expr); #define corto_replicator_request(_this, parent, expr) _corto_replicator_request(corto_replicator(_this), parent, expr) #ifdef __cplusplus diff --git a/packages/corto/lang/src/corto.c b/packages/corto/lang/src/corto.c index 2f15d0dd..9ac2f01e 100644 --- a/packages/corto/lang/src/corto.c +++ b/packages/corto/lang/src/corto.c @@ -714,7 +714,7 @@ static void corto_patchSequences(void) { corto_requestAction_o->parameters.length = 2; corto_requestAction_o->parameters.buffer = corto_alloc(2 * sizeof(corto_parameter)); corto_requestAction_o->parameters.buffer[0].name = "scope"; - corto_requestAction_o->parameters.buffer[0].type = corto_type(corto_string_o); + corto_requestAction_o->parameters.buffer[0].type = corto_type(corto_object_o); corto_requestAction_o->parameters.buffer[0].passByReference = 0; corto_requestAction_o->parameters.buffer[1].name = "expr"; diff --git a/packages/corto/lang/src/corto__api.c b/packages/corto/lang/src/corto__api.c index a45dac49..9771229f 100644 --- a/packages/corto/lang/src/corto__api.c +++ b/packages/corto/lang/src/corto__api.c @@ -6677,7 +6677,7 @@ corto_int16 _corto_requestActionDeinit(corto_requestAction* value) { return result; } -corto_int16 corto_requestActionCall(corto_requestAction *_delegate, corto_resultIter* _result, corto_string scope, corto_string expr) { +corto_int16 corto_requestActionCall(corto_requestAction *_delegate, corto_resultIter* _result, corto_object scope, corto_string expr) { if (_delegate->_parent.procedure) { if (_delegate->_parent.instance) { corto_call(_delegate->_parent.procedure, _result, _delegate->_parent.instance, scope, expr); diff --git a/packages/corto/lang/src/corto__bootstrap.h b/packages/corto/lang/src/corto__bootstrap.h index e77a2503..21c42be0 100644 --- a/packages/corto/lang/src/corto__bootstrap.h +++ b/packages/corto/lang/src/corto__bootstrap.h @@ -1023,7 +1023,7 @@ CORTO_CLASS_NOBASE_O(replicator, NULL, CORTO_DECLARED | CORTO_DEFINED, NULL, NUL CORTO_METHOD_O(replicator, destruct, "()", void, FALSE, corto_replicator_destruct); CORTO_METHOD_O(replicator, post, "(event e)", void, FALSE, corto_replicator_post); CORTO_METHOD_O(replicator, invoke, "(object instance,function proc,octetseq args)", void, FALSE, corto_replicator_invoke); - CORTO_METHOD_O(replicator, request, "(string parent,string expr)", resultIter, FALSE, corto_replicator_request); + CORTO_METHOD_O(replicator, request, "(object parent,string expr)", resultIter, FALSE, corto_replicator_request); CORTO_MEMBER_O(replicator, onDeclare, notifyAction, CORTO_GLOBAL); CORTO_MEMBER_O(replicator, onUpdate, notifyAction, CORTO_GLOBAL); CORTO_MEMBER_O(replicator, onDelete, notifyAction, CORTO_GLOBAL); diff --git a/packages/corto/lang/src/corto__wrapper.c b/packages/corto/lang/src/corto__wrapper.c index 25dfdd76..fc39bae6 100644 --- a/packages/corto/lang/src/corto__wrapper.c +++ b/packages/corto/lang/src/corto__wrapper.c @@ -1078,8 +1078,8 @@ void __corto_replicator_request(corto_function f, void *result, void *args) { CORTO_UNUSED(f); *(corto_resultIter*)result = _corto_replicator_request( corto_replicator(*(void**)args), - *(corto_string*)((intptr_t)args + sizeof(void*)), - *(corto_string*)((intptr_t)args + sizeof(void*) + sizeof(corto_string))); + *(corto_object*)((intptr_t)args + sizeof(void*)), + *(corto_string*)((intptr_t)args + sizeof(void*) + sizeof(corto_object))); } void __corto_sequence_construct(corto_function f, void *result, void *args) { diff --git a/packages/corto/lang/src/corto_iter.c b/packages/corto/lang/src/corto_iter.c index 7eedee4b..97b2eb9e 100644 --- a/packages/corto/lang/src/corto_iter.c +++ b/packages/corto/lang/src/corto_iter.c @@ -2,34 +2,37 @@ #include "corto_iter.h" void corto_iterMoveFirst(corto_iter* iter) { - iter->moveFirst(iter); + iter->moveFirst(iter); } void* corto_iterMove(corto_iter* iter, unsigned int index) { - return iter->move(iter, index); + return iter->move(iter, index); } int corto_iterHasNext(corto_iter* iter) { - return iter->hasNext(iter); + return iter->hasNext(iter); } void* corto_iterNext(corto_iter* iter) { - return iter->next(iter); + return iter->next(iter); } void* corto_iterNextPtr(corto_iter* iter) { - return iter->nextPtr(iter); + return iter->nextPtr(iter); } void* corto_iterRemove(corto_iter* iter) { - return iter->remove(iter); + return iter->remove(iter); } void corto_iterInsert(corto_iter* iter, void* o) { - iter->insert(iter, o); + iter->insert(iter, o); } void corto_iterSet(corto_iter* iter, void* o) { - iter->set(iter, o); + iter->set(iter, o); } +void corto_iterRelease(corto_iter* iter) { + iter->release(iter); +} diff --git a/packages/corto/lang/src/corto_replicator.c b/packages/corto/lang/src/corto_replicator.c index 6bc5ba19..783d0625 100644 --- a/packages/corto/lang/src/corto_replicator.c +++ b/packages/corto/lang/src/corto_replicator.c @@ -136,7 +136,7 @@ corto_void _corto_replicator_post(corto_replicator this, corto_event e) { /* $end */ } -corto_resultIter _corto_replicator_request(corto_replicator this, corto_string parent, corto_string expr) { +corto_resultIter _corto_replicator_request(corto_replicator this, corto_object parent, corto_string expr) { /* $begin(corto/lang/replicator/request) */ corto_resultIter result; corto_requestActionCall(&this->onRequest, &result, parent, expr); diff --git a/packages/corto/lang/src/corto_select.c b/packages/corto/lang/src/corto_select.c index f2b1a416..8b9ce29d 100644 --- a/packages/corto/lang/src/corto_select.c +++ b/packages/corto/lang/src/corto_select.c @@ -56,8 +56,8 @@ typedef struct corto_selectData { corto_id parent; corto_id name; corto_id type; - corto_selectItem item; - corto_selectItem *next; + corto_result item; + corto_result *next; }corto_selectData; static corto_selectData* corto_selectDataGet(void) { @@ -270,7 +270,7 @@ static int corto_selectValidate(corto_selectData *data) { static void corto_setItemData( corto_object o, - corto_selectItem *item, + corto_result *item, corto_selectData *data) { if (o != root_o) { @@ -363,20 +363,47 @@ static corto_object corto_selectIterNext( static void corto_selectRequestReplicators( corto_selectData *data, corto_selectStack *frame, - corto_ll replicators) + corto__scope *scope) { - corto_iter iter = corto_llIter(replicators); - - while (corto_iterHasNext(&iter)) { - corto_id parentId; corto_fullname(frame->o, parentId); - corto_replicator_olsData_t *odata = corto_iterNext(&iter); - - /* Make select request to replicator */ - data->replicators[data->activeReplicators ++] = - corto_replicator_request( - odata->replicator, - parentId, - frame->filter ? frame->filter : "*"); + if (data->activeReplicators < 0) { + corto_ll replicators = corto_olsFind(scope, CORTO_OLS_REPLICATOR); + data->activeReplicators = 0; + + if (replicators) { + corto_iter iter = corto_llIter(replicators); + + while (corto_iterHasNext(&iter)) { + corto_replicator_olsData_t *odata = corto_iterNext(&iter); + + /* Make select request to replicator */ + data->replicators[data->activeReplicators ++] = + corto_replicator_request( + odata->replicator, + frame->o, + frame->filter ? frame->filter : "*"); + } + } + } +} + +static void corto_selectIterateReplicators(corto_selectData *data) { + if (data->activeReplicators) { + /* Walk over iterators until one with data available has been found */ + while ((++data->currentReplicator < data->activeReplicators)) { + corto_resultIter *iter = &data->replicators[data->currentReplicator]; + if (corto_iterHasNext(iter)) { + corto_result *result = corto_iterNext(iter); + data->next = &data->item; + + /* Copy data, so replicator can safely release it */ + strcpy(data->item.name, result->name); + strcpy(data->item.parent, result->parent); + strcpy(data->item.type, result->type); + + /* Return item */ + break; + } + } } } @@ -390,27 +417,28 @@ static void corto_selectScope( corto__scope *scope = corto__scopeClaim(frame->o); /* Request replicators once per scope, and do it before iterating over - * corto store objects so replicators have some time to make the - * request */ - if (data->activeReplicators < 0) { - corto_ll replicators = corto_olsFind(scope, CORTO_OLS_REPLICATOR); - data->activeReplicators = 0; - - if (replicators) { - corto_selectRequestReplicators(data, frame, replicators); - } - } + * corto store objects so replicators have more time to fetch data. */ + corto_selectRequestReplicators(data, frame, scope); data->next = NULL; - while ((o = corto_selectIterNext(frame, lastKey))) { - if (!frame->filter || corto_selectMatch(frame->filter, corto_nameof(o))) { - data->next = &data->item; - corto_setItemData(o, data->next, data); - break; + + /* If not iterating over a replicator, we're iterating over the store */ + if (data->currentReplicator == -1) { + while ((o = corto_selectIterNext(frame, lastKey))) { + if (!frame->filter || corto_selectMatch(frame->filter, corto_nameof(o))) { + data->next = &data->item; + corto_setItemData(o, data->next, data); + break; + } } } corto__scopeRelease(frame->o); + + /* Handle replicator iteration outside of scope lock */ + if (!data->next) { + corto_selectIterateReplicators(data); + } } /* Depth first search */ @@ -544,7 +572,7 @@ static int corto_selectRun(corto_selectData *data) { return -1; } -static int corto_selectHasNext(corto_iter *iter) { +static int corto_selectHasNext(corto_resultIter *iter) { corto_selectData *data = corto_selectDataGet(); corto_selectStack *frame = &data->stack[data->sp]; CORTO_UNUSED(iter); @@ -565,7 +593,7 @@ static int corto_selectHasNext(corto_iter *iter) { * to check for two values */ } -static void* corto_selectNext(corto_iter *iter) { +static void* corto_selectNext(corto_resultIter *iter) { corto_selectData *data = corto_selectDataGet(); CORTO_UNUSED(iter); @@ -576,7 +604,7 @@ static void* corto_selectNext(corto_iter *iter) { corto_int16 corto_select( corto_object scope, corto_string expr, - corto_iter *iter_out) + corto_resultIter *iter_out) { corto_selectData *data = corto_selectDataGet(); @@ -589,6 +617,7 @@ corto_int16 corto_select( data->sp = 0; data->next = NULL; data->activeReplicators = -1; + data->currentReplicator = -1; iter_out->hasNext = corto_selectHasNext; iter_out->next = corto_selectNext; diff --git a/packages/corto/lang/test/include/test_selectItem.h b/packages/corto/lang/test/include/test_selectItem.h new file mode 100644 index 00000000..ecff3c5c --- /dev/null +++ b/packages/corto/lang/test/include/test_selectItem.h @@ -0,0 +1,20 @@ +/* test_selectItem.h + * + * This file contains generated code. Do not modify! + */ + +#ifndef TEST_SELECTITEM_H +#define TEST_SELECTITEM_H + +#include "corto.h" +#include "test__interface.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/packages/corto/lang/test/src/test_Select.c b/packages/corto/lang/test/src/test_Select.c index e680c3b5..9fd357a2 100644 --- a/packages/corto/lang/test/src/test_Select.c +++ b/packages/corto/lang/test/src/test_Select.c @@ -8,15 +8,15 @@ #include "test.h" -test_selectItemList _test_Select_collect(corto_object scope, corto_string expr) { +corto_resultList _test_Select_collect(corto_object scope, corto_string expr) { /* $begin(test/Select/collect) */ corto_iter iter; corto_ll result = corto_llNew(); corto_select(scope, expr, &iter); while (corto_iterHasNext(&iter)) { - corto_selectItem *item = corto_iterNext(&iter); - test_selectItem *listItem = corto_alloc(sizeof(test_selectItem)); + corto_result *item = corto_iterNext(&iter); + corto_result *listItem = corto_alloc(sizeof(corto_result)); listItem->parent = corto_strdup(item->parent); listItem->name = corto_strdup(item->name); listItem->type = corto_strdup(item->type); @@ -27,12 +27,12 @@ test_selectItemList _test_Select_collect(corto_object scope, corto_string expr) /* $end */ } -corto_bool _test_Select_hasObject(test_selectItemList items, corto_string parent, corto_string name, corto_string type) { +corto_bool _test_Select_hasObject(corto_resultList items, corto_string parent, corto_string name, corto_string type) { /* $begin(test/Select/hasObject) */ corto_iter iter = corto_llIter(items); while (corto_iterHasNext(&iter)) { - test_selectItem *item = corto_iterNext(&iter); + corto_result *item = corto_iterNext(&iter); if (!strcmp(item->parent, parent)) { if (!strcmp(item->name, name)) { if (!strcmp(item->type, type)) { @@ -90,7 +90,7 @@ corto_void _test_Select_tc_selectDeleteCurrent(test_Select this) { /* $begin(test/Select/tc_selectDeleteCurrent) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a/ab_ab"); ret = corto_select(NULL, "/a/", &iter); @@ -121,7 +121,7 @@ corto_void _test_Select_tc_selectDeleteFirst(test_Select this) { /* $begin(test/Select/tc_selectDeleteFirst) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a/ab01234567890"); ret = corto_select(NULL, "/a/", &iter); @@ -148,7 +148,7 @@ corto_void _test_Select_tc_selectDeleteNext(test_Select this) { /* $begin(test/Select/tc_selectDeleteNext) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a/ab_ab"); ret = corto_select(NULL, "/a/", &iter); @@ -175,7 +175,7 @@ corto_void _test_Select_tc_selectDeleteParent(test_Select this) { /* $begin(test/Select/tc_selectDeleteParent) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a"); ret = corto_select(NULL, "/a/", &iter); @@ -199,7 +199,7 @@ corto_void _test_Select_tc_selectDeletePrevious(test_Select this) { /* $begin(test/Select/tc_selectDeletePrevious) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a/ab01234567890"); ret = corto_select(NULL, "/a/", &iter); @@ -318,7 +318,7 @@ corto_void _test_Select_tc_selectFilterWildcard(test_Select this) { corto_void _test_Select_tc_selectIdentifier(test_Select this) { /* $begin(test/Select/tc_selectIdentifier) */ corto_ll results = NULL; - test_selectItem *item; + corto_result *item; corto_object a = corto_resolve(NULL, "a"); test_assert(a != NULL); @@ -366,7 +366,7 @@ corto_void _test_Select_tc_selectNumeric(test_Select this) { corto_void _test_Select_tc_selectOrder(test_Select this) { /* $begin(test/Select/tc_selectOrder) */ - corto_selectItem *item; + corto_result *item; corto_iter iter; corto_int16 ret; @@ -499,7 +499,7 @@ corto_void _test_Select_tc_selectOrder(test_Select this) { corto_void _test_Select_tc_selectParent(test_Select this) { /* $begin(test/Select/tc_selectParent) */ corto_ll results = NULL; - test_selectItem *item; + corto_result *item; corto_object a = corto_resolve(NULL, "a"); test_assert(a != NULL); @@ -542,7 +542,7 @@ corto_void _test_Select_tc_selectScope(test_Select this) { corto_void _test_Select_tc_selectScopedIdentifier(test_Select this) { /* $begin(test/Select/tc_selectScopedIdentifier) */ corto_ll results = NULL; - test_selectItem *item; + corto_result *item; results = test_Select_collect(NULL, "a/b"); test_assert(results != NULL); @@ -560,7 +560,7 @@ corto_void _test_Select_tc_selectScopedIdentifier(test_Select this) { corto_void _test_Select_tc_selectScopedParent(test_Select this) { /* $begin(test/Select/tc_selectScopedParent) */ corto_ll results = NULL; - test_selectItem *item; + corto_result *item; results = test_Select_collect(NULL, "a/.."); test_assert(results != NULL); @@ -578,7 +578,7 @@ corto_void _test_Select_tc_selectScopedParent(test_Select this) { corto_void _test_Select_tc_selectScopedThis(test_Select this) { /* $begin(test/Select/tc_selectScopedThis) */ corto_ll results = NULL; - test_selectItem *item; + corto_result *item; results = test_Select_collect(NULL, "a/."); test_assert(results != NULL); @@ -662,7 +662,7 @@ corto_void _test_Select_tc_selectScopeWithWildcardFilter(test_Select this) { corto_void _test_Select_tc_selectThis(test_Select this) { /* $begin(test/Select/tc_selectThis) */ corto_ll results = NULL; - test_selectItem *item; + corto_result *item; corto_object a = corto_resolve(NULL, "a"); test_assert(a != NULL); @@ -723,7 +723,7 @@ corto_void _test_Select_tc_selectTreeDeleteCurrent(test_Select this) { /* $begin(test/Select/tc_selectTreeDeleteCurrent) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a/ab_ab"); ret = corto_select(NULL, "/a//", &iter); @@ -754,7 +754,7 @@ corto_void _test_Select_tc_selectTreeDeleteFirst(test_Select this) { /* $begin(test/Select/tc_selectTreeDeleteFirst) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a/ab01234567890"); ret = corto_select(NULL, "/a/", &iter); @@ -781,7 +781,7 @@ corto_void _test_Select_tc_selectTreeDeleteGrandparent(test_Select this) { /* $begin(test/Select/tc_selectTreeDeleteGrandparent) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a"); ret = corto_select(NULL, "/a//", &iter); @@ -852,7 +852,7 @@ corto_void _test_Select_tc_selectTreeDeleteNext(test_Select this) { /* $begin(test/Select/tc_selectTreeDeleteNext) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a/ab_ab"); ret = corto_select(NULL, "/a/", &iter); @@ -879,7 +879,7 @@ corto_void _test_Select_tc_selectTreeDeleteParent(test_Select this) { /* $begin(test/Select/tc_selectTreeDeleteParent) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a"); ret = corto_select(NULL, "/a/", &iter); @@ -904,7 +904,7 @@ corto_void _test_Select_tc_selectTreeDeletePrevious(test_Select this) { /* $begin(test/Select/tc_selectTreeDeletePrevious) */ corto_iter iter; corto_int16 ret; - corto_selectItem *item; + corto_result *item; corto_object o = corto_resolve(NULL, "a/ab01234567890"); ret = corto_select(NULL, "/a/", &iter); diff --git a/packages/corto/lang/test/test.cx b/packages/corto/lang/test/test.cx index 4b7ec7a1..a6467046 100644 --- a/packages/corto/lang/test/test.cx +++ b/packages/corto/lang/test/test.cx @@ -166,18 +166,12 @@ test::Suite Resolver:: void tc_resolveAll() -// Select testcases -struct selectItem:: - parent : string - name : string - type : string - test::Suite Select:: void setup() method void teardown() method - list{selectItem} collect(object @scope, string expr) function - bool hasObject(list{selectItem} items, string parent, string name, string type) function + list{result} collect(object @scope, string expr) function + bool hasObject(list{result} items, string parent, string name, string type) function void tc_selectErrParentTree() void tc_selectErrParentId() diff --git a/tools/corto/src/cortotool_shell.c b/tools/corto/src/cortotool_shell.c index c0567fd4..89723afc 100644 --- a/tools/corto/src/cortotool_shell.c +++ b/tools/corto/src/cortotool_shell.c @@ -232,7 +232,7 @@ static void cxsh_ls(char* arg) { corto_error("error: %s", corto_lasterr()); } else { while (corto_iterHasNext(&iter)) { - corto_selectItem *item = corto_iterNext(&iter); + corto_result *item = corto_iterNext(&iter); cxsh_printRow(item->parent, item->name, item->type); i ++; } @@ -809,7 +809,7 @@ corto_ll cxsh_shellExpand(int argc, const char* argv[], char *cmd) { corto_int32 i = 0; corto_select(scope, expr, &iter); while (corto_iterHasNext(&iter)) { - corto_selectItem *item = corto_iterNext(&iter); + corto_result *item = corto_iterNext(&iter); corto_id scopedItem; if (strcmp(item->parent, ".")) { sprintf(scopedItem, "%s/%s", item->parent, item->name); @@ -826,7 +826,7 @@ corto_ll cxsh_shellExpand(int argc, const char* argv[], char *cmd) { if (!i) { corto_select(corto_o, expr, &iter); while (corto_iterHasNext(&iter)) { - corto_selectItem *item = corto_iterNext(&iter); + corto_result *item = corto_iterNext(&iter); corto_id scopedItem; if (strcmp(item->parent, ".")) { sprintf(scopedItem, "corto/%s/%s", item->parent, item->name); @@ -844,7 +844,7 @@ corto_ll cxsh_shellExpand(int argc, const char* argv[], char *cmd) { if (!i) { corto_select(corto_lang_o, expr, &iter); while (corto_iterHasNext(&iter)) { - corto_selectItem *item = corto_iterNext(&iter); + corto_result *item = corto_iterNext(&iter); corto_id scopedItem; if (strcmp(item->parent, ".")) { sprintf(scopedItem, "corto/lang/%s/%s", item->parent, item->name);