/** * adapted from reHelpers2.c * input * typ: collection type * inPtr: collection value * inx: index of the element * output * value: element value (new on heap) * inx: index of the next element * outtyp: the type of the element (new on heap) * return * 0 * NO_VALUES_FOUND * USER_PARAM_TYPE_ERR */ Res* getValueFromCollection( char *typ, void *inPtr, int inx, Region *r ) { Res *res; int i, j; if ( !strcmp( typ, StrArray_MS_T ) ) { strArray_t *strA; /* ->size size of an element */ /* ->len length of the array */ strA = ( strArray_t * ) inPtr; if ( inx >= strA->len ) { return NULL; } res = newStringRes( r, strA->value + inx * strA->size ); return res; } else if ( !strcmp( typ, IntArray_MS_T ) ) { res = newRes( r ); res->exprType = newSimpType( T_INT, r ); intArray_t *intA; intA = ( intArray_t * ) inPtr; if ( inx >= intA->len ) { return NULL; } RES_INT_VAL_LVAL( res ) = intA->value[inx]; return res; } else if ( !strcmp( typ, GenQueryOut_MS_T ) ) { keyValPair_t *k; /* element value */ genQueryOut_t *g = ( genQueryOut_t * ) inPtr; /* the result set */ char *cname, *aval; /* key and value */ sqlResult_t *v; /* a result row */ if ( g->rowCnt == 0 || inx >= g->rowCnt ) { return NULL; } k = ( keyValPair_t * )malloc( sizeof( keyValPair_t ) ); k->len = 0; k->keyWord = NULL; k->value = NULL; for ( i = 0; i < g->attriCnt; i++ ) { v = g->sqlResult + i; cname = ( char * ) getAttrNameFromAttrId( v->attriInx ); aval = v->value + v->len * inx; j = addKeyVal( k, cname, aval ); /* addKeyVal duplicates the strings */ if ( j < 0 ) { return NULL; } } res = newUninterpretedRes( r, KeyValPair_MS_T, k, NULL ); return res; } else if ( strcmp( typ, KeyValPair_MS_T ) == 0 ) { return newStringRes( r, ( ( keyValPair_t * ) inPtr )->keyWord[inx] ); } else { return NULL; } }
execCmdOut_t *addCmdExecOutToEnv( Env *global, Region *r ) { execCmdOut_t *ruleExecOut = ( execCmdOut_t * )malloc( sizeof( execCmdOut_t ) ); memset( ruleExecOut, 0, sizeof( execCmdOut_t ) ); ruleExecOut->stdoutBuf.buf = strdup( "" ); ruleExecOut->stdoutBuf.len = 0; ruleExecOut->stderrBuf.buf = strdup( "" ); ruleExecOut->stderrBuf.len = 0; Res *execOutRes = newUninterpretedRes( r, ExecCmdOut_MS_T, ruleExecOut, NULL ); insertIntoHashTable( global->current, "ruleExecOut", execOutRes ); return ruleExecOut; }
int getPtrLeafValue( Res **varValue, void *leaf, bytesBuf_t *buf, char *irodsType, Region *r ) { *varValue = newUninterpretedRes( r, irodsType, leaf, buf ); return 0; }