예제 #1
0
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);
}
예제 #2
0
/* 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	
}