Esempio n. 1
0
double OWStatement::GetElement( OCIArray** ppoData,
                               int nIndex, double* pdfResult )
{
    boolean        exists;
    OCINumber      *oci_number;
    double         element_type;

    *pdfResult = 0.0;

    if( CheckError( OCICollGetElem(
        poConnection->hEnv,
        hError,
        (OCIColl*) *ppoData,
        (sb4) nIndex,
        (boolean*) &exists,
        (dvoid**) (dvoid*) &oci_number, NULL ), hError ) )
    {
        return *pdfResult;
    }

    if( CheckError( OCINumberToReal(
        hError,
        oci_number,
        (uword) sizeof(double),
        (dvoid *) &element_type ), hError ) )
    {
        return *pdfResult;
    }

    *pdfResult = (double) element_type;

    return *pdfResult;
}
Esempio n. 2
0
int OWStatement::GetElement( OCIArray** ppoData, int nIndex, int* pnResult )
{
    boolean        exists;
    OCINumber      *oci_number;
    ub4            element_type;

    *pnResult = 0;

    if( CheckError( OCICollGetElem(
        poConnection->hEnv,
        hError,
        (OCIColl*) *ppoData,
        (sb4) nIndex,
        (boolean*) &exists,
        (dvoid**) (dvoid*) &oci_number,
        (dvoid**) NULL ), hError ) )
    {
        return *pnResult;
    }

    if( CheckError( OCINumberToInt(
        hError,
        oci_number,
        (uword) sizeof(ub4),
        OCI_NUMBER_UNSIGNED,
        (dvoid *) &element_type ), hError ) )
    {
        return *pnResult;
    }

    *pnResult = (int) element_type;

    return *pnResult;
}
Esempio n. 3
0
/* ODCIIndexInsert function */
OCINumber *qxiqtbspi(
OCIExtProcContext *ctx,
ODCIIndexInfo     *ix,
ODCIIndexInfo_ind *ix_ind,
char              *rid,
short             rid_ind,
char              *newval,
short             newval_ind,
ODCIEnv           *env,
ODCIEnv_ind       *env_ind)
{
  OCIEnv *envhp = (OCIEnv *) 0;             /* env. handle */
  OCISvcCtx *svchp = (OCISvcCtx *) 0;       /* service handle */
  OCIError *errhp = (OCIError *) 0;         /* error handle */
  OCIStmt *stmthp = (OCIStmt *) 0;          /* statement handle */
  OCIBind *bndp = (OCIBind *) 0;            /* bind handle */

  int retval = (int)ODCI_SUCCESS;           /* return from this function */
  OCINumber *rval = (OCINumber *)0;
  
  char insstmt[2000];                       /* sql insert statement */
  ODCIColInfo  *colinfo;                    /* column info */
  ODCIColInfo_ind  *colinfo_ind;
  boolean exists = TRUE;
  int partiden;                             /* table partition iden */ 


  /* allocate memory for OCINumber first */
  rval = (OCINumber *)OCIExtProcAllocCallMemory(ctx, sizeof(OCINumber));

  /* Get oci handles */
  if (qxiqtce(ctx, errhp, OCIExtProcGetEnv(ctx, &envhp, &svchp, &errhp)))
    return(rval);

  /* set up return code */
  if (qxiqtce(ctx, errhp, OCINumberFromInt(errhp, (dvoid *)&retval,
                                           sizeof(retval),
                                           OCI_NUMBER_SIGNED, rval)))
    return(rval);

  /******************************
   * Construct insert Statement *
   ******************************/
  if ( ix_ind->IndexPartitionIden == OCI_IND_NULL )
    (void)sprintf(insstmt,
                  "INSERT into %s.%s_sbtree values (:newval, :mrid)",
                  OCIStringPtr(envhp, ix->IndexSchema),
                  OCIStringPtr(envhp, ix->IndexName));
  else
  {
    if (qxiqtce(ctx, errhp, OCICollGetElem(envhp, errhp,
                           (OCIColl *)ix->IndexCols, (sb4)0, &exists, 
                           (void **) &colinfo, (void **) &colinfo_ind)))
      return(rval);

    (void)sprintf(insstmt,
                  "INSERT into %s.%s_sbtree partition (DATAOBJ_TO_PARTITION(%s, :partiden)) values (:newval, :mrid)",
                  OCIStringPtr(envhp, ix->IndexSchema),
                  OCIStringPtr(envhp, ix->IndexName),
                  OCIStringPtr(envhp, colinfo->TableName));
  }

  /****************************************
   * Parse and Execute Create Statement   *
   ****************************************/

  /* allocate stmt handle */
  if (qxiqtce(ctx, errhp, OCIHandleAlloc((dvoid *)envhp,
                                         (dvoid **)&stmthp,
                                         (ub4)OCI_HTYPE_STMT, (size_t)0,
                                         (dvoid **)0)))
    return(rval);

  /* prepare the statement */
  if (qxiqtce(ctx, errhp, OCIStmtPrepare(stmthp, errhp, 
                                         (text *)insstmt,
                                         (ub4)strlen(insstmt), 
                                         OCI_NTV_SYNTAX,
                                         OCI_DEFAULT)))
    return(rval);

  if (ix_ind->IndexPartitionIden != OCI_IND_NULL)
  {
    /* Convert partiden to integer from OCINumber */
    if (qxiqtce(ctx, errhp, OCINumberToInt(errhp, 
                                           &(colinfo->TablePartitionIden),
                                           sizeof(partiden),
                                           OCI_NUMBER_SIGNED,
                                           ( void *)&partiden)))
      return(rval);

    /* Set up bind for partiden */
    if (qxiqtce(ctx, errhp, OCIBindByName(stmthp, &bndp, errhp, 
                                          (text *)":partiden",
                                          sizeof(":partiden")-1,
                                          (dvoid *)&partiden,
                                          (sb4)(sizeof(partiden)),
                                          (ub2)SQLT_INT, 
                                          (dvoid *)0, (ub2 *)0,
                                          (ub2 *)0, (ub4)0, (ub4 *)0,
                                          (ub4)OCI_DEFAULT)))
      return(rval);
  }

  /* Set up bind for newval */
  if (qxiqtce(ctx, errhp, OCIBindByName(stmthp, &bndp, errhp, 
                                        (text *)":newval",
                                        sizeof(":newval")-1,
                                        (dvoid *)newval,
                                        (sb4)(strlen(newval)+1),
                                        (ub2)SQLT_STR, 
                                        (dvoid *)0, (ub2 *)0,
                                        (ub2 *)0, (ub4)0, (ub4 *)0,
                                        (ub4)OCI_DEFAULT)))
    return(rval);

  /* Set up bind for rid */
  if (qxiqtce(ctx, errhp, OCIBindByName(stmthp, &bndp, errhp,  
                                        (text *)":mrid",
                                        sizeof(":mrid")-1,
                                        (dvoid *)rid,
                                        (sb4)(strlen(rid)+1),
                                        (ub2)SQLT_STR, 
                                        (dvoid *)0, (ub2 *)0,
                                        (ub2 *)0, (ub4)0, (ub4 *)0,
                                        (ub4)OCI_DEFAULT)))
    return(rval);

  /* Execute statement */
  if (qxiqtce(ctx, errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1,
                                         (ub4)0, (OCISnapshot *)NULL,
                                         (OCISnapshot *)NULL,
                                         (ub4)OCI_DEFAULT)))
    return(rval);

  /* free stmt handle */
  if (qxiqtce(ctx, errhp, OCIHandleFree((dvoid *)stmthp,
                                        (ub4)OCI_HTYPE_STMT)))
    return(rval);

  return(rval);
}
Esempio n. 4
0
/* ODCIIndexStart function */
OCINumber *qxiqtbsps(
OCIExtProcContext *ctx,
qxiqtim           *sctx,
qxiqtin           *sctx_ind,
ODCIIndexInfo     *ix,
ODCIIndexInfo_ind *ix_ind,
ODCIPredInfo      *pr,
ODCIPredInfo_ind  *pr_ind,
ODCIQueryInfo     *qy,
ODCIQueryInfo_ind *qy_ind,
OCINumber         *strt,
short             strt_ind,
OCINumber         *stop,
short             stop_ind,
char              *cmpval,
short             cmpval_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 strtval;                   /* start bound */
  int stopval;                   /* stop bound */

  int errnum = 29400;            /* choose some oracle error number */
  char errmsg[512];              /* error message buffer */
  size_t errmsglen;              /* Length of error message */

  char relop[3];                 /* relational operator used in sql stmt */
  char selstmt[2000];            /* sql select statement */

  int retval = (int)ODCI_SUCCESS;       /* return from this function */
  OCINumber *rval = (OCINumber *)0;
  ub4 key;                              /* key value set in "sctx" */

  ub1 *rkey;                            /* key to retrieve context */
  ub4 rkeylen;                          /* length of key */
  ODCIColInfo  *colinfo;                /* column info */
  ODCIColInfo_ind  *colinfo_ind;
  boolean exists = TRUE;
  int partiden;                         /* table partition iden */ 

  /* 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);

  /**********************************************/
  /* Allocate memory to hold index scan context */
  /**********************************************/
  if (sctx_ind ->atomic_qxiqtin == OCI_IND_NULL ||
      sctx_ind ->scind_qxiqtin == OCI_IND_NULL)
  {
   if (qxiqtce(ctx, errhp, OCIMemoryAlloc((dvoid *)usrhp, errhp,
                                          (dvoid **)&icx,
                                          OCI_DURATION_STATEMENT,
                                          (ub4)(sizeof(qxiqtcx)),
                                          OCI_MEMORY_CLEARED)))
     return(rval);

   icx->stmthp = (OCIStmt *)0;
   icx->defnp = (OCIDefine *)0;
   icx->bndp = (OCIBind *)0;
  }
  else
  {
   /*************************/
   /* Retrieve scan context */
   /*************************/
   rkey = OCIRawPtr(envhp, sctx->sctx_qxiqtim);
   rkeylen = OCIRawSize(envhp, sctx->sctx_qxiqtim);

   if (qxiqtce(ctx, errhp, OCIContextGetValue((dvoid *)usrhp, errhp,
                                              rkey, (ub1)rkeylen,
                                              (dvoid **)&(icx))))
    return(rval);
  }

  /***********************************/
  /* Check that the bounds are valid */
  /***********************************/
  /* convert from oci numbers to native numbers */
  if (qxiqtce(ctx, errhp, OCINumberToInt(errhp, strt,
                                         sizeof(strtval), 
                                         OCI_NUMBER_SIGNED,
                                         (dvoid *)&strtval)))
    return(rval);

  if (qxiqtce(ctx, errhp, OCINumberToInt(errhp, stop,
                                        sizeof(stopval),
                                        OCI_NUMBER_SIGNED, 
                                        (dvoid *)&stopval)))
    return(rval);

  /* verify that strtval/stopval are both either 0 or 1 */
  if (!(((strtval == 0) && (stopval == 0)) ||
        ((strtval == 1) && (stopval == 1))))
    {
      strcpy(errmsg, (char *)"Incorrect predicate for sbtree operator");
      errmsglen = (size_t)strlen(errmsg);
      if (OCIExtProcRaiseExcpWithMsg(ctx, errnum, (text *)errmsg, errmsglen)
          != OCIEXTPROC_SUCCESS)
        /* Use cartridge error services here */;
      return(rval);
    }

  /*********************************************/
  /* Generate the SQL statement to be executed */
  /*********************************************/
  if (memcmp((dvoid *)OCIStringPtr(envhp, pr->ObjectName), (dvoid *)"EQ", 2)
      == 0)
    if (strtval == 1)
      strcpy(relop, (char *)"=");
    else
      strcpy(relop, (char *)"!=");
  else if (memcmp((dvoid *)OCIStringPtr(envhp, pr->ObjectName), (dvoid *)"LT",
                  2) == 0)
    if (strtval == 1)
      strcpy(relop, (char *)"<");
    else
      strcpy(relop, (char *)">=");
  else
    if (strtval == 1)
      strcpy(relop, (char *)">");
    else
      strcpy(relop, (char *)"<=");

  if (ix_ind->IndexPartitionIden == OCI_IND_NULL)
    (void)sprintf(selstmt, "select f2 from %s.%s_sbtree where f1 %s :val",
                  OCIStringPtr(envhp, ix->IndexSchema),
                  OCIStringPtr(envhp, ix->IndexName), relop);
  else
  {
    
    if (qxiqtce(ctx, errhp, OCICollGetElem(envhp, errhp,
                           (OCIColl *)ix->IndexCols, (sb4)0, &exists, 
                           (void **) &colinfo, (void **) &colinfo_ind)))
      return(rval);
    (void)sprintf(selstmt, "select f2 from %s.%s_sbtree partition (DATAOBJ_TO_PARTITION(%s, :partiden)) where f1 %s :val",
                  OCIStringPtr(envhp, ix->IndexSchema),
                  OCIStringPtr(envhp, ix->IndexName),
                   OCIStringPtr(envhp, colinfo->TableName), relop);
  }

  /***********************************/
  /* Parse, bind, define and execute */
  /***********************************/
  if (sctx_ind ->atomic_qxiqtin == OCI_IND_NULL ||
      sctx_ind ->scind_qxiqtin == OCI_IND_NULL)
  {
    /* allocate stmt handle */
    if (qxiqtce(ctx, errhp, OCIHandleAlloc((dvoid *)envhp,  
                                           (dvoid **)&(icx->stmthp),
                                           (ub4)OCI_HTYPE_STMT, 
                                           (size_t)0, (dvoid **)0)))  
      return(rval);
  }

  /* prepare the statement */
  if (qxiqtce(ctx, errhp, OCIStmtPrepare(icx->stmthp, errhp, 
                                         (text *)selstmt,
                                         (ub4)strlen(selstmt), 
                                         OCI_NTV_SYNTAX,
                                          OCI_DEFAULT)))
    return(rval);


  if (ix_ind->IndexPartitionIden != OCI_IND_NULL)
  {
    /* Convert partiden to integer from OCINumber */
    if (qxiqtce(ctx, errhp, OCINumberToInt(errhp, 
                                           &(colinfo->TablePartitionIden),
                                           sizeof(partiden),
                                           OCI_NUMBER_SIGNED,
                                           ( void *)&partiden)))
      return(rval);

    /* Set up bind for partiden */
    if (qxiqtce(ctx, errhp, OCIBindByName(icx->stmthp, &(icx->bndp), errhp, 
                                          (text *)":partiden",
                                          sizeof(":partiden")-1,
                                          (dvoid *)&partiden,
                                          (sb4)(sizeof(partiden)),
                                          (ub2)SQLT_INT, 
                                          (dvoid *)0, (ub2 *)0,
                                          (ub2 *)0, (ub4)0, (ub4 *)0,
                                          (ub4)OCI_DEFAULT)))
      return(rval);
  }

  /* Set up bind for compare value */
  if (qxiqtce(ctx, errhp, OCIBindByName(icx->stmthp, &(icx->bndp),errhp, 
                                        (text *)":val",
                                        sizeof(":val")-1,
                                       (dvoid *)cmpval,
                                       (sb4)(strlen(cmpval)+1),
                                       (ub2)SQLT_STR, 
                                       (dvoid *)0, (ub2 *)0,
                                       (ub2 *)0, (ub4)0, (ub4 *)0,
                                       (ub4)OCI_DEFAULT)))
    return(rval);

  /* Set up define */
  if (qxiqtce(ctx, errhp, OCIDefineByPos(icx->stmthp, &(icx->defnp), 
                                         errhp, (ub4)1,  
                                         (dvoid *)(icx->ridp),
                                         (sb4) sizeof(icx->ridp),
                                         (ub2)SQLT_STR, 
                                         (dvoid *)0, (ub2 *)0,
                                         (ub2 *)0, (ub4)OCI_DEFAULT)))
    return(rval);

  /* execute */
  if (qxiqtce(ctx, errhp, OCIStmtExecute(svchp, icx->stmthp, 
                                         errhp, (ub4)0,
                                         (ub4)0, (OCISnapshot *)NULL,
                                         (OCISnapshot *)NULL,
                                         (ub4)OCI_DEFAULT)))
    return(rval);

  /************************************/
  /* Set index context to be returned */
  /************************************/
  if (sctx_ind ->atomic_qxiqtin == OCI_IND_NULL ||
      sctx_ind ->scind_qxiqtin == OCI_IND_NULL)
   {
    /* generate a key */
    if (qxiqtce(ctx, errhp, OCIContextGenerateKey((dvoid *)usrhp, 
                                                  errhp, &key)))
      return(rval);

    /* set the memory address of the struct to be saved in the context */
    if (qxiqtce(ctx, errhp, OCIContextSetValue((dvoid *)usrhp, errhp,
                                               OCI_DURATION_STATEMENT,
                                               (ub1 *)&key, 
                                               (ub1)sizeof(key),
                                               (dvoid *)icx)))
      return(rval);

    /* set the key as the member of "sctx" */
    if (qxiqtce(ctx, errhp, OCIRawAssignBytes(envhp, errhp, 
                                              (ub1 *)&key,
                                              (ub4)sizeof(key),
                                              &(sctx->sctx_qxiqtim))))
      return(rval);

    sctx_ind->atomic_qxiqtin = OCI_IND_NOTNULL;
    sctx_ind->scind_qxiqtin = OCI_IND_NOTNULL;

    return(rval);
   }

  return(rval);
}
Esempio n. 5
0
/* Function to display the attributes of the object */
static void display (i_manager *sub_obj)
{
  ub4 sizeUB4 = sizeof (ub4);
  ub4 ssn = 0; /* Variable to fetch ssn */
  ub4 addr_hno = 0; /*Variable to fetch hno of addr */
  text *name; /*Variable to fetch name */
  ub4 name_len = 0;
  text *addr_street; /*Variable to fetch street of addr */
  ub4 addr_streetLen = 0;
  ub4 altadrs_hno = 0; /*Variable to fetch hno of altadrs */
  text *altadrs_street; /*Variable to fetch street of altadrs */
  ub4 altadrs_streetLen = 0;
  ub4 empno = 0; /* Variable to fetch empno */
  ub4 workadd_hno = 0; /*Variable to fetch hno of workadd */
  text *workadd_street; /*Variable to fetch street of workadd */
  ub4 workadd_streetLen = 0;

  sb4 size = 111;
  sb4 index1 = 0; /* Index for the starting point of the scan */
  sb4 index2 = 0; /* Index of the next existing element */
  boolean eoc = TRUE; /* For getting the status for the availability of
                         the next index */
  ub4 count = 0;
  i_residence *elem = (i_residence *)0; /* To get the element from the 
                                           nested table */
  i_residence_ref *elemref = (i_residence_ref *)0;
  i_residence *objptr = (i_residence *)0;

  name = OCIStringPtr(envhp, sub_obj->_super.name);
  name_len =  OCIStringSize (envhp, sub_obj->_super.name);
  printf("name is : %.*s\n", name_len, name);
  OCINumberToInt (errhp, &(sub_obj->_super.ssn), sizeof(ub4),
    OCI_NUMBER_UNSIGNED, (dvoid *)&ssn);
  printf("SSN: %d\n", ssn);
  OCINumberToInt (errhp, &(sub_obj->_super.addr.hno), sizeof(ub4),
    OCI_NUMBER_UNSIGNED, (dvoid *)&addr_hno);
  addr_street = OCIStringPtr(envhp, sub_obj->_super.addr.street);
  addr_streetLen =  OCIStringSize (envhp, sub_obj->_super.addr.street);
  printf("Primary address:   %d %.*s\n", addr_hno,addr_streetLen, addr_street);

  OCITableSize(envhp, errhp, (CONST OCITable*)(sub_obj->_super.altadrs), &size);
  OCITableFirst(envhp, errhp,(CONST OCITable*)sub_obj->_super.altadrs, &index1);
  status = OCICollGetElem(envhp, errhp, (OCIColl *)sub_obj->_super.altadrs, 
    index1, (boolean *)&eoc, (dvoid **)&elem, (dvoid **)0);
  OCINumberToInt (errhp, &(elem->hno), sizeof(ub4),
    OCI_NUMBER_UNSIGNED, (dvoid *)&altadrs_hno);
  altadrs_street = OCIStringPtr(envhp, elem->street);
  altadrs_streetLen = OCIStringSize (envhp, elem->street);
  printf("Other addresses:\n");
  printf("   %d %.*s\n", altadrs_hno, altadrs_streetLen, 
           altadrs_street);
  for (count = 1; count < size; count++)
  {
     OCITableNext(envhp, errhp, index1, 
      (CONST OCITable*)sub_obj->_super.altadrs, &index2, &eoc);
     OCICollGetElem(envhp, errhp,(OCIColl *)sub_obj->_super.altadrs, index2,
       (boolean *)&eoc, (dvoid **)&elem, (dvoid **)0);
     OCINumberToInt (errhp, &(elem->hno), sizeof(ub4), OCI_NUMBER_UNSIGNED, 
       (dvoid *)&altadrs_hno);
     altadrs_street = OCIStringPtr(envhp, elem->street);
     altadrs_streetLen = OCIStringSize (envhp, elem->street);
     printf("   %d %.*s\n", altadrs_hno, altadrs_streetLen, 
           altadrs_street);
     index1 = index2;
  }

  OCINumberToInt (errhp, &(sub_obj->empno), sizeof(ub4),
    OCI_NUMBER_UNSIGNED, (dvoid *)&empno);
  printf("EMPNO: %d\n", empno);

  index1 = 1;
  eoc = TRUE;
  OCITableSize(envhp, errhp, (CONST OCITable*) sub_obj->workadd, &size);
  OCITableFirst(envhp, errhp,(CONST OCITable*) sub_obj->workadd, &index1);
  status = OCICollGetElem(envhp, errhp, (OCIColl *)(sub_obj->workadd),
    index1, (boolean *)&eoc, (dvoid **)&elemref, (dvoid **)0);
  if (status != OCI_SUCCESS)
  {
    printf("OCICollGetElem - Failure \n");
  }
  elemref = *( OCIRef **)elemref;
  
  if ((status = OCIObjectPin(envhp, errhp, elemref, 
    (OCIComplexObject *)0,
    OCI_PIN_ANY, OCI_DURATION_SESSION, OCI_LOCK_NONE, 
    (dvoid **) &objptr)) != OCI_SUCCESS)
  {
    printf("OCIObjectPin - Failure \n");
  }

  OCINumberToInt (errhp, &(objptr->hno), sizeof(ub4), OCI_NUMBER_UNSIGNED,
       (dvoid *)&workadd_hno);

  workadd_street = OCIStringPtr(envhp, objptr->street);
  workadd_streetLen = OCIStringSize (envhp, objptr->street);
  printf("Work Addresses:\n");
  printf("   %d %.*s\n", workadd_hno,workadd_streetLen,
              workadd_street);
  for (count = 1; count < size; count++)
  {
    OCITableNext(envhp, errhp, index1, 
       (CONST OCITable*)sub_obj->workadd, &index2, &eoc);
    status = OCICollGetElem(envhp, errhp, (OCIColl *)(sub_obj->workadd),
    index2, (boolean *)&eoc, (dvoid **)&elemref, (dvoid **)0);
    if (status != OCI_SUCCESS)
    {
      printf("OCICollGetElem - Failure \n");
    }
    elemref = *( OCIRef **)elemref;
    
    if ((status = OCIObjectPin(envhp, errhp, elemref, 
      (OCIComplexObject *)0,
      OCI_PIN_ANY, OCI_DURATION_SESSION, OCI_LOCK_NONE,
      (dvoid **) &objptr)) != OCI_SUCCESS)
    {
      printf("OCIObjectPin - Failure \n");
    }
    OCINumberToInt (errhp, &(objptr->hno), sizeof(ub4), OCI_NUMBER_UNSIGNED,
       (dvoid *)&workadd_hno);

    workadd_street = OCIStringPtr(envhp, objptr->street);
    workadd_streetLen = OCIStringSize (envhp, objptr->street);
    printf("   %d %.*s\n", workadd_hno,workadd_streetLen,
              workadd_street);
    index1 = index2;
  } 
} /* end of display ((i_manager *) */
Esempio n. 6
0
/* Function to modify the data of an inherited object */
static void modifyFunction ()
{ 
  OCIDefine *defhp = (OCIDefine *)0; 
  OCIRef *sub_ref = (OCIRef *)0;
  i_residence elem;
  i_residence *elemptr = (i_residence *)0;
  i_manager *sub_obj = (i_manager *)0;
  ub4 subSize = 0;
  ub4 sizeUB4 = sizeof (ub4);
  OCIType *mtype = (OCIType *)0;

  text *name = (text*)"JENNY";
  ub4 name_len=(ub4)strlen( (char * ) name);
  ub4 ssn = 808; /* Data for ssn */
  ub4 addr_hno = 800; /*Data for  hno of addr */
  text *addr_street = (text *)"Laurel Road"; /*Data for street of addr */
  ub4 addr_streetLen = (ub4)strlen( (char *)addr_street);
  ub4 altadrs_hno = 800; /*data for hno of altadrs */
  text *altadrs_street = (text *)"Shoreline Street"; /*Data for street of altadrs */
  ub4 altadrs_streetLen = (ub4)strlen( (char *)altadrs_street);
  ub4 empno = 8888; /* data for empno */

  sb4 index1 = 0; /* Index for the starting point of the scan */
  sb4 index2 = 0; /* Index of the next existing element */
  boolean eoc = TRUE; /* For getting the status for the availability of
                         the next index */
  ub4 count = 0; /* Loop counter */
  OCIHandleAlloc (envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, (size_t)0,
    (dvoid **)0);

  if ((status = OCIStmtPrepare (stmthp, errhp, (text *)updateSql, 
    (ub4)strlen((char *)updateSql),OCI_NTV_SYNTAX, OCI_DEFAULT)) != OCI_SUCCESS)
  {
    printf ("OCIStmtPrepare - Fail\n");
  }

  if (( status = OCIObjectNew(envhp, errhp, svchp, OCI_TYPECODE_REF,
    (OCIType *)0, (dvoid *)0, OCI_DURATION_DEFAULT, FALSE, 
    (dvoid **) &sub_ref)) != OCI_SUCCESS)
  {
    printf ("OCIObjectNew - Failure\n");
  }

  if ((status = OCIDefineByPos(stmthp, &defhp, errhp, (ub4) 1,
    (dvoid *) 0, (sb4) 0, SQLT_REF, (dvoid *) 0,
    (ub2 *)0, (ub2 *)0, (ub4) OCI_DEFAULT)) != OCI_SUCCESS)
  {
    printf ("OCIDefineByPos - Failure \n");
  }

  if ((status = OCIDefineObject(defhp, errhp, (OCIType *)0,
    (dvoid **)&sub_ref, (ub4 *)&subSize, (dvoid **) 0, (ub4 *) 0))
    != OCI_SUCCESS)
  {
    printf ("OCIDefineObject - Failure \n");
  }
 
  printf ("\nExecuting the statement:%s\n", updateSql); 
  if (OCIStmtExecute (svchp, stmthp, errhp, (ub4)1, (ub4)0,
    (OCISnapshot *)0, (OCISnapshot *)0, OCI_COMMIT_ON_SUCCESS ) != OCI_SUCCESS)
  {
    printf("OCIStmtExecute - Failure \n");
  }
  else
  {
    printf("OCIStmtExecute - Success\n");
    if ((status = OCIObjectPin(envhp, errhp, sub_ref, (OCIComplexObject *)0,
      OCI_PIN_ANY, OCI_DURATION_SESSION, OCI_LOCK_NONE, 
      (dvoid **) &sub_obj)) != OCI_SUCCESS)
    {
      printf("OCIObjectPin - Failure \n");
    }
    else
    {
      printf ("\nDisplaying the original data from the employee table \n");
      display (sub_obj);
      printf ("\nModifying the data present in the object\n");
      if ((status = OCIObjectMarkUpdate (envhp, errhp, (dvoid *)sub_obj))
        != OCI_SUCCESS)
      {
        printf ("OCIObjectMarkUpdate - Fail\n");
      }
      else
      {
        printf ("OCIObjectMarkUpdate - Success\n");
      } 
      OCINumberFromInt (errhp, (dvoid *)&ssn, sizeof(ssn), OCI_NUMBER_UNSIGNED,
        &(sub_obj->_super.ssn));
      OCINumberFromInt (errhp, (dvoid *)&empno, sizeof(empno), 
                       OCI_NUMBER_UNSIGNED, &(sub_obj->empno));
      OCINumberFromInt (errhp, (dvoid *)&addr_hno, sizeof(addr_hno),
               OCI_NUMBER_UNSIGNED, &(sub_obj->_super.addr.hno));
      OCIStringAssignText (envhp, errhp, (text *)name, (ub2)name_len,
        &(sub_obj->_super.name));
      OCIStringAssignText (envhp, errhp, (text *)addr_street, (ub2)addr_streetLen,
        &(sub_obj->_super.addr.street));
      OCITableFirst(envhp, errhp, (CONST OCITable*)sub_obj->_super.altadrs, 
         &index1);
      OCICollGetElem(envhp, errhp, (OCIColl *)sub_obj->_super.altadrs, 
        index1, (boolean *)&eoc, (dvoid **)&elemptr, (dvoid **)0);
      OCINumberFromInt (errhp, (dvoid *)&altadrs_hno, sizeof(altadrs_hno),
        OCI_NUMBER_UNSIGNED, &(elemptr->hno));
      OCIStringAssignText (envhp, errhp, (text *)altadrs_street, (ub2)altadrs_streetLen,
        &(elemptr->street));
      for (count = 0; count < NUMREC-1; ++count)
      {
        altadrs_hno += count;
        OCITableNext(envhp, errhp, index1,
         (CONST OCITable*) sub_obj->_super.altadrs, &index2, &eoc);
        OCICollGetElem(envhp, errhp, (OCIColl *)sub_obj->_super.altadrs, 
          index2, (boolean *)&eoc, (dvoid **)&elemptr, (dvoid **)0);
        OCINumberFromInt (errhp, (dvoid *)&altadrs_hno, sizeof(altadrs_hno),
          OCI_NUMBER_UNSIGNED, &(elemptr->hno));
        OCIStringAssignText (envhp, errhp, (text *)altadrs_street, (ub2)altadrs_streetLen,
          &(elemptr->street));
        index1 = index2;
      } 
      index1 = 0;
      index2 = 0;
      
      OCITableFirst(envhp, errhp, (CONST OCITable*)sub_obj->workadd, &index1);
      OCICollAssignElem (envhp, errhp, index1, (dvoid *)workadd[count],
       (dvoid *)0, (OCIColl *)sub_obj->workadd);
      for (count = 0; count < NUMREC; ++count)
      {
        OCITableNext(envhp, errhp, index1,(CONST OCITable*) sub_obj->workadd,
          &index2, &eoc);
        OCICollAssignElem (envhp, errhp, index1, (dvoid *)workadd[count],
          (dvoid *)0, (OCIColl *)sub_obj->workadd);
        index1 = index2;
      } 
      
      if ((status = OCIObjectFlush(envhp, errhp, sub_obj)) != OCI_SUCCESS)
      {
        printf ("OCIObjectFlush - Fail\n");
      }
      else
      {
        printf ("OCIObjectFlush - Success\n");
      }
      printf ("Refreshing the object\n");
      if ((status = OCIObjectRefresh(envhp, errhp, (dvoid *)sub_obj))
        != OCI_SUCCESS)
      {
        printf ("OCIObjectRefresh - Fail\n");
      }
      else
      {
        printf ("OCIObjectRefresh - Success\n");
      }
      printf ("\nDisplaying the data in the employee table after the refresh\n");
      display (sub_obj);

      printf ("\nModifying the data present in the object once again\n");
      ssn = 606; /* Data for ssn */
      addr_hno = 200; /*Data for  hno of addr */
      addr_street = (text *)"Main Street"; /*Data for street of addr */
      addr_streetLen = (ub4)strlen( (char *)addr_street);
      altadrs_hno = 600; /*data for hno of altadrs */
      altadrs_street = (text *)"Shell Blvd";/*Data for street of altadrs*/
      altadrs_streetLen = (ub4)strlen( (char *)altadrs_street);
      empno = 6666; /* data for empno */

      if ((status = OCIObjectMarkUpdate (envhp, errhp, (dvoid *)sub_obj))
        != OCI_SUCCESS)
      {
        printf ("OCIObjectMarkUpdate - Fail\n");
      }
      else
      {
        printf ("OCIObjectMarkUpdate - Success\n");
      }
      index1 = 0;
      index2 = 0;
      OCINumberFromInt (errhp, (dvoid *)&ssn, sizeof(ssn), OCI_NUMBER_UNSIGNED,
        &(sub_obj->_super.ssn));
      OCINumberFromInt (errhp, (dvoid *)&empno, sizeof(empno), OCI_NUMBER_UNSIGNED,
        &(sub_obj->empno));
      OCINumberFromInt (errhp, (dvoid *)&addr_hno, sizeof(addr_hno),
        OCI_NUMBER_UNSIGNED, &(sub_obj->_super.addr.hno));
      OCIStringAssignText (envhp, errhp, (text *)addr_street, 
         (ub2)addr_streetLen, &(sub_obj->_super.addr.street));
      OCITableFirst(envhp, errhp,(CONST OCITable*)sub_obj->_super.altadrs,
          &index1);
      OCICollGetElem(envhp, errhp, (OCIColl *)sub_obj->_super.altadrs, 
        index1, (boolean *)&eoc, (dvoid **)&elemptr, (dvoid **)0);
      OCINumberFromInt (errhp, (dvoid *)&altadrs_hno, sizeof(altadrs_hno),
        OCI_NUMBER_UNSIGNED, &(elemptr->hno));
      OCIStringAssignText (envhp, errhp, (text *)altadrs_street, (ub2)altadrs_streetLen,
        &(elemptr->street));
      for (count = 0; count < NUMREC-1; ++count)
      {
        altadrs_hno += count;
        OCITableNext(envhp, errhp, index1,(CONST OCITable*) sub_obj->_super.altadrs, &index2, 
          &eoc);
        OCICollGetElem(envhp, errhp, (OCIColl *)sub_obj->_super.altadrs, 
          index2, (boolean *)&eoc, (dvoid **)&elemptr, (dvoid **)0);
        OCINumberFromInt (errhp, (dvoid *)&altadrs_hno, sizeof(altadrs_hno),
          OCI_NUMBER_UNSIGNED, &(elemptr->hno));
        OCIStringAssignText (envhp, errhp, (text *)altadrs_street, (ub2)altadrs_streetLen,
          &(elemptr->street));
        index1 = index2;
      } 
      index1 = 0;
      index2 = 0;
      
      OCITableFirst(envhp, errhp, (CONST OCITable*)sub_obj->workadd, &index1);
      OCICollAssignElem (envhp, errhp, index1, (dvoid *)workadd[count],
       (dvoid *)0, (OCIColl *)sub_obj->workadd);
      for (count = 0; count < NUMREC; ++count)
      {
        OCITableNext(envhp, errhp, index1, (CONST OCITable*)sub_obj->workadd,
          &index2, &eoc);
        OCICollAssignElem (envhp, errhp, index1, (dvoid *)workadd[count],
          (dvoid *)0, (OCIColl *)sub_obj->workadd);
        index1 = index2;
      } 
      if ((status = OCICacheFlush (envhp, errhp, svchp, NULL, NULL, &sub_ref))
        != OCI_SUCCESS)
      {
        printf ("OCICacheFlush - Fail\n");
      }
      else
      {
        printf ("OCICacheFlush - Success\n");
      }
    }
        
    if ((status = OCITransCommit (svchp, errhp, OCI_DEFAULT)) != OCI_SUCCESS)
    {
      printf ("OCITransCommit - Fail\n");
    }
    else
      printf ("OCITransCommit - Success\n");
  }
  OCIHandleFree((dvoid *) stmthp, OCI_HTYPE_STMT);

} /* end of modifyFunction() */