static OCIAnyData * to_return_value(plruby_context_t *ctx, VALUE val) { OCIAnyData *sdata = NULL; OCIInd ind = OCI_IND_NOTNULL; if (NIL_P(val)) { return NULL; } switch (ctx->rettype) { case OCI_TYPECODE_VARCHAR2: { OCIString *str = NULL; VALUE sval = rb_String(val); sval = rb_str_export_to_enc(sval, oracle_encoding); chk(OCIStringAssignText(ctx->envhp, ctx->errhp, (text*)RSTRING_PTR(sval), RSTRING_LEN(sval), &str)); chk(OCIAnyDataConvert(ctx->svchp, ctx->errhp, ctx->rettype, NULL, OCI_DURATION_SESSION, &ind, str, 0, &sdata)); chk(OCIStringResize(ctx->envhp, ctx->errhp, 0, &str)); return sdata; } case OCI_TYPECODE_NUMBER: { OCINumber num; double dval = rb_num2dbl(val); chk(OCINumberFromReal(ctx->errhp, &dval, sizeof(dval), &num)); chk(OCIAnyDataConvert(ctx->svchp, ctx->errhp, ctx->rettype, NULL, OCI_DURATION_SESSION, &ind, &num, 0, &sdata)); return sdata; } case OCI_TYPECODE_BDOUBLE: { double dval = rb_num2dbl(val); chk(OCIAnyDataConvert(ctx->svchp, ctx->errhp, ctx->rettype, NULL, OCI_DURATION_SESSION, &ind, &dval, 0, &sdata)); return sdata; } } rb_raise(rb_eRuntimeError, "Unsupported Typecode %d", ctx->rettype); }
/* ODCIIndexFetch function */ OCINumber *qxiqtbspf( OCIExtProcContext *ctx, qxiqtim *self, qxiqtin *self_ind, OCINumber *nrows, short nrows_ind, OCIArray **rids, short *rids_ind, ODCIEnv *env, ODCIEnv_ind *env_ind) { sword status; OCIEnv *envhp = (OCIEnv *) 0; /* env. handle */ OCISvcCtx *svchp = (OCISvcCtx *) 0; /* service handle */ OCIError *errhp = (OCIError *) 0; /* error handle */ OCISession *usrhp = (OCISession *) 0; /* user handle */ qxiqtcx *icx = (qxiqtcx *) 0; /* state to be saved for later calls */ int idx = 1; int nrowsval; OCIArray *ridarrp = *rids; /* rowid collection */ OCIString *ridstr = (OCIString *)0; int done = 0; int retval = (int)ODCI_SUCCESS; OCINumber *rval = (OCINumber *)0; ub1 *key; /* key to retrieve context */ ub4 keylen; /* length of key */ /*******************/ /* Get OCI handles */ /*******************/ if (qxiqtce(ctx, errhp, OCIExtProcGetEnv(ctx, &envhp, &svchp, &errhp))) return(rval); /* set up return code */ rval = (OCINumber *)OCIExtProcAllocCallMemory(ctx, sizeof(OCINumber)); if (qxiqtce(ctx, errhp, OCINumberFromInt(errhp, (dvoid *)&retval, sizeof(retval), OCI_NUMBER_SIGNED, rval))) return(rval); /* get the user handle */ if (qxiqtce(ctx, errhp, OCIAttrGet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)&usrhp, (ub4 *)0, (ub4)OCI_ATTR_SESSION, errhp))) return(rval); /********************************/ /* Retrieve context from key */ /********************************/ key = OCIRawPtr(envhp, self->sctx_qxiqtim); keylen = OCIRawSize(envhp, self->sctx_qxiqtim); if (qxiqtce(ctx, errhp, OCIContextGetValue((dvoid *)usrhp, errhp, key, (ub1)keylen, (dvoid **)&(icx)))) return(rval); /* get value of nrows */ if (qxiqtce(ctx, errhp, OCINumberToInt(errhp, nrows, sizeof(nrowsval), OCI_NUMBER_SIGNED, (dvoid *)&nrowsval))) return(rval); /****************/ /* Fetch rowids */ /****************/ while (!done) { if (idx > nrowsval) done = 1; else { status = OCIStmtFetch(icx->stmthp, errhp, (ub4)1, (ub2) 0, (ub4)OCI_DEFAULT); if (status == OCI_NO_DATA) { short col_ind = OCI_IND_NULL; /* have to create dummy oci string */ OCIStringAssignText(envhp, errhp, (text *)"dummy", (ub2)5, &ridstr); /* append null element to collection */ if (qxiqtce(ctx, errhp, OCICollAppend(envhp, errhp, (dvoid *)ridstr, (dvoid *)&col_ind, (OCIColl *)ridarrp))) return(rval); done = 1; } else if (status == OCI_SUCCESS) { OCIStringAssignText(envhp, errhp, (text *)icx->ridp, (ub2)18, (OCIString **)&ridstr); /* append rowid to collection */ if (qxiqtce(ctx, errhp, OCICollAppend(envhp, errhp, (dvoid *)ridstr, (dvoid *)0, (OCIColl *)ridarrp))) return(rval); idx++; } else if (qxiqtce(ctx, errhp, status)) return(rval); } } /* free ridstr finally */ if (ridstr && (qxiqtce(ctx, errhp, OCIStringResize(envhp, errhp, (ub4)0, &ridstr)))) return(rval); *rids_ind = OCI_IND_NOTNULL; return(rval); }
sword _bindTextArrayTowards4D(ORACLE_SQL_CURSOR *cursor, unsigned int pos) { cursor->defines.at(pos) = 0; cursor->isObjectValid.at(pos) = false; cursor->arrayOfTexts.at(pos).resize(cursor->itemCount); cursor->indicatorLists.at(pos).resize(cursor->itemCount); cursor->lengths.at(pos).resize(cursor->itemCount); cursor->isObjectElementValid.at(pos).resize(cursor->itemCount); sessionInfo *session = _sessionGet(cursor->sessionId); for(unsigned int i = 0; i < cursor->itemCount; ++i) { PA_YieldAbsolute(); cursor->arrayOfTexts.at(pos).at(i) = 0; cursor->isObjectElementValid.at(pos).at(i) = false; sword err = 0; err = OCIObjectNew(session->envhp, session->errhp, session->svchp, OCI_TYPECODE_VARCHAR2, 0, 0, OCI_DURATION_SESSION, true, (dvoid **)&cursor->arrayOfTexts.at(pos).at(i)); if(!err) { err = OCIStringResize(session->envhp, session->errhp, BUFFER_SIZE_TEXT_ARRAY_ELEMENT, &cursor->arrayOfTexts.at(pos).at(i)); if(!err) { memset(OCIStringPtr(session->envhp, cursor->arrayOfTexts.at(pos).at(i)), 0, BUFFER_SIZE_TEXT_ARRAY_ELEMENT); cursor->isObjectElementValid.at(pos).at(i) = true; cursor->isObjectValid.at(pos) = true; cursor->lengths.at(pos).at(i) = BUFFER_SIZE_TEXT_ARRAY_ELEMENT; } } } OCIDefineByPos(cursor->stmtp, &cursor->defines.at(pos), cursor->errhp, pos + 1, &cursor->arrayOfTexts.at(pos).at(0), BUFFER_SIZE_TEXT_ARRAY_ELEMENT, SQLT_VST, &cursor->indicatorLists.at(pos).at(0), &cursor->lengths.at(pos).at(0), 0, OCI_DEFAULT); //http://docs.oracle.com/cd/A97630_01/appdev.920/a96584/oci15r34.htm return OCIDefineArrayOfStruct(cursor->defines.at(pos), cursor->errhp, sizeof(cursor->arrayOfTexts.at(pos).at(0)), sizeof(cursor->indicatorLists.at(pos).at(0)), sizeof(cursor->lengths.at(pos).at(0)), 0); //http://docs.oracle.com/cd/A97630_01/appdev.920/a96584/oci15r33.htm#498629 }