//----------------------------------------------------------------------------- // dpiObjectType__describe() [INTERNAL] // Describe the object type and store information about it. Note that a // separate call to OCIDescribeAny() is made in order to support nested types; // an illegal attribute value is returned if this is not done. //----------------------------------------------------------------------------- static int dpiObjectType__describe(dpiObjectType *objType, void *describeHandle, dpiError *error) { void *collectionParam, *param; uint16_t typeCode; // describe the type if (dpiOci__describeAny(objType->conn, objType->tdo, 0, DPI_OCI_OTYPE_PTR, describeHandle, error) < 0) return DPI_FAILURE; // get top level parameter descriptor if (dpiOci__attrGet(describeHandle, DPI_OCI_HTYPE_DESCRIBE, ¶m, 0, DPI_OCI_ATTR_PARAM, "get top level parameter", error) < 0) return DPI_FAILURE; // determine type code if (dpiOci__attrGet(param, DPI_OCI_DTYPE_PARAM, &typeCode, 0, DPI_OCI_ATTR_TYPECODE, "get type code", error) < 0) return DPI_FAILURE; objType->typeCode = typeCode; // determine the number of attributes if (dpiOci__attrGet(param, DPI_OCI_DTYPE_PARAM, (void*) &objType->numAttributes, 0, DPI_OCI_ATTR_NUM_TYPE_ATTRS, "get number of attributes", error) < 0) return DPI_FAILURE; // if a collection, need to determine the element type if (typeCode == DPI_SQLT_NCO) { objType->isCollection = 1; // acquire collection parameter descriptor if (dpiOci__attrGet(param, DPI_OCI_DTYPE_PARAM, &collectionParam, 0, DPI_OCI_ATTR_COLLECTION_ELEMENT, "get collection descriptor", error) < 0) return DPI_FAILURE; // determine type of element if (dpiOracleType__populateTypeInfo(objType->conn, collectionParam, DPI_OCI_DTYPE_PARAM, &objType->elementTypeInfo, error) < 0) return DPI_FAILURE; } return DPI_SUCCESS; }
//----------------------------------------------------------------------------- // dpiDeqOptions__getAttrValue() [INTERNAL] // Get the attribute value in OCI. //----------------------------------------------------------------------------- static int dpiDeqOptions__getAttrValue(dpiDeqOptions *options, uint32_t attribute, const char *fnName, void *value, uint32_t *valueLength) { dpiError error; int status; if (dpiGen__startPublicFn(options, DPI_HTYPE_DEQ_OPTIONS, fnName, 1, &error) < 0) return dpiGen__endPublicFn(options, DPI_FAILURE, &error); DPI_CHECK_PTR_NOT_NULL(options, value) DPI_CHECK_PTR_NOT_NULL(options, valueLength) status = dpiOci__attrGet(options->handle, DPI_OCI_DTYPE_AQDEQ_OPTIONS, value, valueLength, attribute, "get attribute value", &error); return dpiGen__endPublicFn(options, status, &error); }
//----------------------------------------------------------------------------- // dpiDeqOptions_getVisibility() [PUBLIC] // Return visibility associated with dequeue options. //----------------------------------------------------------------------------- int dpiDeqOptions_getVisibility(dpiDeqOptions *options, dpiVisibility *value) { uint32_t ociValue; dpiError error; if (dpiGen__startPublicFn(options, DPI_HTYPE_DEQ_OPTIONS, __func__, 1, &error) < 0) return dpiGen__endPublicFn(options, DPI_FAILURE, &error); DPI_CHECK_PTR_NOT_NULL(options, value) if (dpiOci__attrGet(options->handle, DPI_OCI_DTYPE_AQDEQ_OPTIONS, &ociValue, NULL, DPI_OCI_ATTR_VISIBILITY, "get attribute value", &error) < 0) return dpiGen__endPublicFn(options, DPI_FAILURE, &error); *value = (dpiVisibility) ociValue; return dpiGen__endPublicFn(options, DPI_SUCCESS, &error); }
//----------------------------------------------------------------------------- // dpiDeqOptions_getMsgId() [PUBLIC] // Return message id associated with dequeue options. //----------------------------------------------------------------------------- int dpiDeqOptions_getMsgId(dpiDeqOptions *options, const char **value, uint32_t *valueLength) { dpiError error; void *rawValue; if (dpiGen__startPublicFn(options, DPI_HTYPE_DEQ_OPTIONS, __func__, 1, &error) < 0) return dpiGen__endPublicFn(options, DPI_FAILURE, &error); DPI_CHECK_PTR_NOT_NULL(options, value) DPI_CHECK_PTR_NOT_NULL(options, valueLength) if (dpiOci__attrGet(options->handle, DPI_OCI_DTYPE_AQDEQ_OPTIONS, &rawValue, NULL, DPI_OCI_ATTR_DEQ_MSGID, "get attribute value", &error) < 0) return dpiGen__endPublicFn(options, DPI_FAILURE, &error); dpiOci__rawPtr(options->env->handle, rawValue, (void**) value); dpiOci__rawSize(options->env->handle, rawValue, valueLength); return dpiGen__endPublicFn(options, DPI_SUCCESS, &error); }
//----------------------------------------------------------------------------- // dpiObjectType__init() [INTERNAL] // Initialize the object type. //----------------------------------------------------------------------------- static int dpiObjectType__init(dpiObjectType *objType, void *param, uint32_t nameAttribute, dpiError *error) { void *describeHandle; void *tdoReference; // determine the schema of the type if (dpiUtils__getAttrStringWithDup("get schema", param, DPI_OCI_DTYPE_PARAM, DPI_OCI_ATTR_SCHEMA_NAME, &objType->schema, &objType->schemaLength, error) < 0) return DPI_FAILURE; // determine the name of the type if (dpiUtils__getAttrStringWithDup("get name", param, DPI_OCI_DTYPE_PARAM, nameAttribute, &objType->name, &objType->nameLength, error) < 0) return DPI_FAILURE; // retrieve TDO of the parameter and pin it in the cache if (dpiOci__attrGet(param, DPI_OCI_DTYPE_PARAM, (void*) &tdoReference, 0, DPI_OCI_ATTR_REF_TDO, "get TDO reference", error) < 0) return DPI_FAILURE; if (dpiOci__objectPin(objType->env->handle, tdoReference, &objType->tdo, error) < 0) return DPI_FAILURE; // acquire a describe handle if (dpiOci__handleAlloc(objType->env->handle, &describeHandle, DPI_OCI_HTYPE_DESCRIBE, "allocate describe handle", error) < 0) return DPI_FAILURE; // describe the type if (dpiObjectType__describe(objType, describeHandle, error) < 0) { dpiOci__handleFree(describeHandle, DPI_OCI_HTYPE_DESCRIBE); return DPI_FAILURE; } // free the describe handle dpiOci__handleFree(describeHandle, DPI_OCI_HTYPE_DESCRIBE); return DPI_SUCCESS; }
//----------------------------------------------------------------------------- // dpiObjectType_getAttributes() [PUBLIC] // Get the attributes for the object type in the provided array. //----------------------------------------------------------------------------- int dpiObjectType_getAttributes(dpiObjectType *objType, uint16_t numAttributes, dpiObjectAttr **attributes) { void *topLevelParam, *attrListParam, *attrParam, *describeHandle; dpiError error; uint16_t i; // validate object type and the number of attributes if (dpiObjectType__check(objType, __func__, &error) < 0) return dpiGen__endPublicFn(objType, DPI_FAILURE, &error); DPI_CHECK_PTR_NOT_NULL(objType, attributes) if (numAttributes < objType->numAttributes) { dpiError__set(&error, "get attributes", DPI_ERR_ARRAY_SIZE_TOO_SMALL, numAttributes); return dpiGen__endPublicFn(objType, DPI_FAILURE, &error); } if (numAttributes == 0) return dpiGen__endPublicFn(objType, DPI_SUCCESS, &error); // acquire a describe handle if (dpiOci__handleAlloc(objType->env->handle, &describeHandle, DPI_OCI_HTYPE_DESCRIBE, "allocate describe handle", &error) < 0) return dpiGen__endPublicFn(objType, DPI_FAILURE, &error); // describe the type if (dpiOci__describeAny(objType->conn, objType->tdo, 0, DPI_OCI_OTYPE_PTR, describeHandle, &error) < 0) { dpiOci__handleFree(describeHandle, DPI_OCI_HTYPE_DESCRIBE); return dpiGen__endPublicFn(objType, DPI_FAILURE, &error); } // get the top level parameter descriptor if (dpiOci__attrGet(describeHandle, DPI_OCI_HTYPE_DESCRIBE, &topLevelParam, 0, DPI_OCI_ATTR_PARAM, "get top level param", &error) < 0) { dpiOci__handleFree(describeHandle, DPI_OCI_HTYPE_DESCRIBE); return dpiGen__endPublicFn(objType, DPI_FAILURE, &error); } // get the attribute list parameter descriptor if (dpiOci__attrGet(topLevelParam, DPI_OCI_DTYPE_PARAM, (void*) &attrListParam, 0, DPI_OCI_ATTR_LIST_TYPE_ATTRS, "get attr list param", &error) < 0) { dpiOci__handleFree(describeHandle, DPI_OCI_HTYPE_DESCRIBE); return dpiGen__endPublicFn(objType, DPI_FAILURE, &error); } // create attribute structure for each attribute for (i = 0; i < objType->numAttributes; i++) { if (dpiOci__paramGet(attrListParam, DPI_OCI_DTYPE_PARAM, &attrParam, (uint32_t) i + 1, "get attribute param", &error) < 0) { dpiOci__handleFree(describeHandle, DPI_OCI_HTYPE_DESCRIBE); return dpiGen__endPublicFn(objType, DPI_FAILURE, &error); } if (dpiObjectAttr__allocate(objType, attrParam, &attributes[i], &error) < 0) { dpiOci__handleFree(describeHandle, DPI_OCI_HTYPE_DESCRIBE); return dpiGen__endPublicFn(objType, DPI_FAILURE, &error); } } // free the describe handle dpiOci__handleFree(describeHandle, DPI_OCI_HTYPE_DESCRIBE); return dpiGen__endPublicFn(objType, DPI_SUCCESS, &error); }