int convertResToIntReturnValue(Res *res) { int retVal; if(getNodeType(res) == N_ERROR) { retVal = RES_ERR_CODE(res); } else { retVal = RES_INT_VAL(res); } return retVal; }
/************************ Res to Microservice parameter ***********************/ int convertResToMsParam(msParam_t *var, Res *res, rError_t *errmsg) { strArray_t *arr = NULL; intArray_t *arr2 = NULL; int i = 0; int maxlen = 0; var->inpOutBuf = NULL; var->label = NULL; switch(TYPE(res)) { case T_ERROR: /* error message */ var->inOutStruct = (int *)malloc(sizeof(int)); *((int *)var->inOutStruct) = RES_ERR_CODE(res); var->type = strdup(INT_MS_T); break; case T_DOUBLE: /* number */ var->inOutStruct = (double *)malloc(sizeof(double)); *((double *)var->inOutStruct) = RES_DOUBLE_VAL(res); var->type = strdup(DOUBLE_MS_T); break; case T_INT: /* number */ var->inOutStruct = (int *)malloc(sizeof(int)); *((int *)var->inOutStruct) = RES_INT_VAL(res); var->type = strdup(INT_MS_T); break; case T_STRING: /* string */ var->inOutStruct = res->text == NULL? NULL : strdup(res->text); var->type = strdup(STR_MS_T); break; case T_PATH: /* path */ var->inOutStruct = res->text == NULL? NULL : strdup(res->text); var->type = strdup(STR_MS_T); break; case T_DATETIME: /* date time */ /*var->inOutStruct = (time_t *)malloc(sizeof(time_t)); */ /**((time_t *)var->inOutStruct) = res->value.t; */ /*var->type = strdup(DATETIME_MS_T); */ /* Here we pass datatime as an integer to reuse exiting packing instructions. Need to change to long int. */ var->inOutStruct = (rodsLong_t *)malloc(sizeof(int)); *((rodsLong_t *)var->inOutStruct) = RES_TIME_VAL(res); var->type = strdup(INT_MS_T); break; case T_CONS: if(strcmp(T_CONS_TYPE_NAME(res->exprType), LIST) == 0) { switch(getNodeType(T_CONS_TYPE_ARG(res->exprType, 0))) { case T_STRING: arr = (strArray_t *)malloc(sizeof(strArray_t)); arr->len = res->degree; maxlen = 0; for(i=0;i<res->degree;i++) { int slen = RES_STRING_STR_LEN(res->subtrees[i]); maxlen = maxlen < slen? slen: maxlen; } arr->size = maxlen; arr->value = (char *)malloc(sizeof(char)*maxlen*(arr->len)); for(i=0;i<res->degree;i++) { strcpy(arr->value + maxlen*i, res->subtrees[i]->text); } var->inOutStruct = arr; var->type = strdup(StrArray_MS_T); break; case T_INT: arr2 = (intArray_t *)malloc(sizeof(intArray_t)); arr2->len = res->degree; arr2->value = (int *)malloc(sizeof(int)*(arr2->len)); for(i=0;i<res->degree;i++) { arr2->value[i] = RES_INT_VAL(res); } var->inOutStruct = arr2; var->type = strdup(IntArray_MS_T); break; /*case T_IRODS: var->inOutStruct = res->value.uninterpreted.inOutStruct; var->inpOutBuf = res->value.uninterpreted.inOutBuffer; var->type = strdup(KeyValPair_MS_T); break;*/ default: /* current there is no existing packing instructions for arbitrary collection */ /* report error */ addRErrorMsg(errmsg, RE_PACKING_ERROR, "no packing instruction for arbitrary collection type"); return RE_PACKING_ERROR; } } else { addRErrorMsg(errmsg, RE_PACKING_ERROR, "no packing instruction for arbitrary constructed type"); return RE_PACKING_ERROR; } break; case T_IRODS: var->inOutStruct = RES_UNINTER_STRUCT(res); var->inpOutBuf = RES_UNINTER_BUFFER(res); var->type = strdup(res->exprType->text); break; case T_UNSPECED: var->inOutStruct = NULL; var->type = NULL; break; default: /*error */ addRErrorMsg(errmsg, RE_PACKING_ERROR, "no packing instruction for arbitrary type"); return RE_PACKING_ERROR; } return 0; }
int setIntLeafValue( int *leafPtr, Res *newVarValue ) { *leafPtr = RES_INT_VAL( newVarValue ); return 0; }