//----------------------------------------------------------------------------- // dpiDeqOptions__create() [INTERNAL] // Create a new subscription structure and return it. In case of error NULL // is returned. //----------------------------------------------------------------------------- int dpiDeqOptions__create(dpiDeqOptions *options, dpiConn *conn, dpiError *error) { dpiGen__setRefCount(conn, error, 1); options->conn = conn; return dpiOci__descriptorAlloc(conn->env->handle, &options->handle, DPI_OCI_DTYPE_AQDEQ_OPTIONS, "allocate descriptor", error); }
//----------------------------------------------------------------------------- // dpiObject__toOracleValue() [INTERNAL] // Convert value from external type to the OCI data type required. //----------------------------------------------------------------------------- static int dpiObject__toOracleValue(dpiObject *obj, dpiError *error, const dpiDataTypeInfo *dataTypeInfo, dpiOracleDataBuffer *buffer, void **ociValue, int16_t *valueIndicator, void **objectIndicator, dpiNativeTypeNum nativeTypeNum, dpiData *data) { dpiOracleTypeNum valueOracleTypeNum; uint32_t handleType; dpiObject *otherObj; dpiBytes *bytes; // nulls are handled easily *objectIndicator = NULL; if (data->isNull) { *ociValue = NULL; *valueIndicator = DPI_OCI_IND_NULL; buffer->asRaw = NULL; return DPI_SUCCESS; } // convert all other values *valueIndicator = DPI_OCI_IND_NOTNULL; valueOracleTypeNum = dataTypeInfo->oracleTypeNum; switch (valueOracleTypeNum) { case DPI_ORACLE_TYPE_CHAR: case DPI_ORACLE_TYPE_NCHAR: case DPI_ORACLE_TYPE_VARCHAR: case DPI_ORACLE_TYPE_NVARCHAR: buffer->asString = NULL; if (nativeTypeNum == DPI_NATIVE_TYPE_BYTES) { bytes = &data->value.asBytes; if (dpiOci__stringAssignText(obj->env->handle, bytes->ptr, bytes->length, &buffer->asString, error) < 0) return DPI_FAILURE; *ociValue = buffer->asString; return DPI_SUCCESS; } break; case DPI_ORACLE_TYPE_NATIVE_INT: case DPI_ORACLE_TYPE_NUMBER: *ociValue = &buffer->asNumber; if (nativeTypeNum == DPI_NATIVE_TYPE_INT64) return dpiDataBuffer__toOracleNumberFromInteger(&data->value, error, &buffer->asNumber); if (nativeTypeNum == DPI_NATIVE_TYPE_DOUBLE) return dpiDataBuffer__toOracleNumberFromDouble(&data->value, error, &buffer->asNumber); if (nativeTypeNum == DPI_NATIVE_TYPE_BYTES) return dpiDataBuffer__toOracleNumberFromText(&data->value, obj->env, error, &buffer->asNumber); break; case DPI_ORACLE_TYPE_NATIVE_FLOAT: if (nativeTypeNum == DPI_NATIVE_TYPE_FLOAT) { buffer->asFloat = data->value.asFloat; *ociValue = &buffer->asFloat; return DPI_SUCCESS; } else if (nativeTypeNum == DPI_NATIVE_TYPE_DOUBLE) { buffer->asFloat = (float) data->value.asDouble; *ociValue = &buffer->asFloat; return DPI_SUCCESS; } break; case DPI_ORACLE_TYPE_NATIVE_DOUBLE: if (nativeTypeNum == DPI_NATIVE_TYPE_DOUBLE) { buffer->asDouble = data->value.asDouble; *ociValue = &buffer->asDouble; return DPI_SUCCESS; } break; case DPI_ORACLE_TYPE_DATE: *ociValue = &buffer->asDate; if (nativeTypeNum == DPI_NATIVE_TYPE_TIMESTAMP) return dpiDataBuffer__toOracleDate(&data->value, &buffer->asDate); break; case DPI_ORACLE_TYPE_TIMESTAMP: case DPI_ORACLE_TYPE_TIMESTAMP_TZ: case DPI_ORACLE_TYPE_TIMESTAMP_LTZ: buffer->asTimestamp = NULL; if (nativeTypeNum == DPI_NATIVE_TYPE_TIMESTAMP) { if (valueOracleTypeNum == DPI_ORACLE_TYPE_TIMESTAMP) handleType = DPI_OCI_DTYPE_TIMESTAMP; else if (valueOracleTypeNum == DPI_ORACLE_TYPE_TIMESTAMP_TZ) handleType = DPI_OCI_DTYPE_TIMESTAMP_TZ; else handleType = DPI_OCI_DTYPE_TIMESTAMP_LTZ; if (dpiOci__descriptorAlloc(obj->env->handle, &buffer->asTimestamp, handleType, "allocate timestamp", error) < 0) return DPI_FAILURE; *ociValue = buffer->asTimestamp; return dpiDataBuffer__toOracleTimestamp(&data->value, obj->env, error, buffer->asTimestamp, (valueOracleTypeNum != DPI_ORACLE_TYPE_TIMESTAMP)); } break; case DPI_ORACLE_TYPE_OBJECT: otherObj = data->value.asObject; if (nativeTypeNum == DPI_NATIVE_TYPE_OBJECT) { if (otherObj->type->tdo != dataTypeInfo->objectType->tdo) return dpiError__set(error, "check type", DPI_ERR_WRONG_TYPE, otherObj->type->schemaLength, otherObj->type->schema, otherObj->type->nameLength, otherObj->type->name, dataTypeInfo->objectType->schemaLength, dataTypeInfo->objectType->schema, dataTypeInfo->objectType->nameLength, dataTypeInfo->objectType->name); *ociValue = otherObj->instance; *objectIndicator = otherObj->indicator; return DPI_SUCCESS; } break; case DPI_ORACLE_TYPE_BOOLEAN: if (nativeTypeNum == DPI_NATIVE_TYPE_BOOLEAN) { buffer->asBoolean = data->value.asBoolean; *ociValue = &buffer->asBoolean; return DPI_SUCCESS; } break; case DPI_ORACLE_TYPE_CLOB: case DPI_ORACLE_TYPE_NCLOB: case DPI_ORACLE_TYPE_BLOB: case DPI_ORACLE_TYPE_BFILE: buffer->asLobLocator = NULL; if (nativeTypeNum == DPI_NATIVE_TYPE_LOB) { *ociValue = data->value.asLOB->locator; return DPI_SUCCESS; } else if (nativeTypeNum == DPI_NATIVE_TYPE_BYTES) { const dpiOracleType *lobType; dpiLob *tempLob; lobType = dpiOracleType__getFromNum(valueOracleTypeNum, error); if (dpiLob__allocate(obj->type->conn, lobType, &tempLob, error) < 0) return DPI_FAILURE; bytes = &data->value.asBytes; if (dpiLob__setFromBytes(tempLob, bytes->ptr, bytes->length, error) < 0) { dpiLob__free(tempLob, error); return DPI_FAILURE; } buffer->asLobLocator = tempLob->locator; *ociValue = tempLob->locator; tempLob->locator = NULL; dpiLob__free(tempLob, error); return DPI_SUCCESS; } break; default: break; } return dpiError__set(error, "to Oracle value", DPI_ERR_UNHANDLED_CONVERSION, valueOracleTypeNum, nativeTypeNum); }