OCIType* OWConnection::DescribeType( const char *pszTypeName ) { OCIParam* hParam = NULL; OCIRef* hRef = NULL; OCIType* hType = NULL; CheckError( OCIDescribeAny( hSvcCtx, hError, (text*) pszTypeName, (ub4) strlen( pszTypeName ), (ub1) OCI_OTYPE_NAME, (ub1) OCI_DEFAULT, (ub1) OCI_PTYPE_TYPE, hDescribe ), hError ); CheckError( OCIAttrGet( hDescribe, (ub4) OCI_HTYPE_DESCRIBE, (dvoid*) &hParam, (ub4*) NULL, (ub4) OCI_ATTR_PARAM, hError ), hError ); CheckError( OCIAttrGet( hParam, (ub4) OCI_DTYPE_PARAM, (dvoid*) &hRef, (ub4*) NULL, (ub4) OCI_ATTR_REF_TDO, hError ), hError ); CheckError( OCIObjectPin( hEnv, hError, hRef, (OCIComplexObject*) NULL, (OCIPinOpt) OCI_PIN_ANY, (OCIDuration) OCI_DURATION_SESSION, (OCILockOpt) OCI_LOCK_NONE, (dvoid**) (dvoid*) &hType ), hError ); return hType; }
OCIType *OGROCISession::PinTDO( const char *pszType ) { OCIParam *hGeomParam = NULL; OCIRef *hGeomTypeRef = NULL; OCIType *hPinnedTDO = NULL; if( Failed( OCIDescribeAny(hSvcCtx, hError, (text *) pszType, (ub4) strlen(pszType), OCI_OTYPE_NAME, (ub1)1, (ub1)OCI_PTYPE_TYPE, hDescribe ), "GetTDO()->OCIDescribeAny()" ) ) return NULL; if( Failed( OCIAttrGet((dvoid *)hDescribe, (ub4)OCI_HTYPE_DESCRIBE, (dvoid *)&hGeomParam, (ub4 *)0, (ub4)OCI_ATTR_PARAM, hError), "GetTDO()->OCIGetAttr(ATTR_PARAM)") ) return NULL; if( Failed( OCIAttrGet((dvoid *)hGeomParam, (ub4)OCI_DTYPE_PARAM, (dvoid *)&hGeomTypeRef, (ub4 *)0, (ub4)OCI_ATTR_REF_TDO, hError), "GetTDO()->OCIAttrGet(ATTR_REF_TDO)" ) ) return NULL; if( Failed( OCIObjectPin(hEnv, hError, hGeomTypeRef, (OCIComplexObject *)0, OCI_PIN_ANY, OCI_DURATION_SESSION, OCI_LOCK_NONE, (dvoid **)&hPinnedTDO ), "GetTDO()->OCIObjectPin()" ) ) return NULL; return hPinnedTDO; }
/* 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 *) */
/* Function to display data from the table */ static void selectFunction () { OCIDefine *defhp = (OCIDefine *)0; OCIRef *sub_ref = (OCIRef *)0; i_manager *sub_obj = (i_manager *)0; ub4 subSize = 0; ub4 sizeUB4 = sizeof (ub4); OCIType *mtype = (OCIType *)0; OCIHandleAlloc (envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0); if ((status = OCIStmtPrepare (stmthp, errhp, (text *)selectSql, (ub4)strlen((char *)selectSql),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", selectSql); if (OCIStmtExecute (svchp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)0, (OCISnapshot *)0, OCI_DEFAULT ) != 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 contents of the object\n"); display (sub_obj); } } } /* end of selectFunction() */
/* 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() */