#include "dpiImpl.h"
static void dpiVector__clearDimensions(dpiVector *vector);
int dpiVector__allocate(dpiConn *conn, dpiVector **vector, dpiError *error)
{
dpiVector *tempVector;
if (dpiUtils__checkClientVersion(conn->env->versionInfo, 23, 4, error) < 0)
return DPI_FAILURE;
if (dpiGen__allocate(DPI_HTYPE_VECTOR, conn->env, (void**) &tempVector,
error) < 0)
return DPI_FAILURE;
dpiGen__setRefCount(conn, error, 1);
tempVector->conn = conn;
if (dpiOci__descriptorAlloc(conn->env->handle, &tempVector->handle,
DPI_OCI_DTYPE_VECTOR, "allocate vector descriptor", error) < 0) {
dpiVector__free(tempVector, error);
return DPI_FAILURE;
}
*vector = tempVector;
return DPI_SUCCESS;
}
static void dpiVector__clearDimensions(dpiVector *vector)
{
if (vector->dimensions) {
dpiUtils__freeMemory(vector->dimensions);
vector->dimensions = NULL;
}
}
void dpiVector__free(dpiVector *vector, dpiError *error)
{
if (vector->handle) {
dpiOci__descriptorFree(vector->handle, DPI_OCI_DTYPE_VECTOR);
vector->handle = NULL;
}
if (vector->conn) {
dpiGen__setRefCount(vector->conn, error, -1);
vector->conn = NULL;
}
dpiVector__clearDimensions(vector);
dpiUtils__freeMemory(vector);
}
int dpiVector__getValue(dpiVector *vector, dpiVectorInfo *info,
dpiError *error)
{
uint32_t numElements, flags;
if (!vector->dimensions) {
if (dpiOci__attrGet(vector->handle, DPI_OCI_DTYPE_VECTOR,
&vector->format, 0, DPI_OCI_ATTR_VECTOR_DATA_FORMAT,
"get vector format", error) < 0)
return DPI_FAILURE;
if (dpiOci__attrGet(vector->handle, DPI_OCI_DTYPE_VECTOR,
&vector->numDimensions, 0, DPI_OCI_ATTR_VECTOR_DIMENSION,
"get number of vector dimensions", error) < 0)
return DPI_FAILURE;
numElements = vector->numDimensions;
switch (vector->format) {
case DPI_VECTOR_FORMAT_BINARY:
vector->dimensionSize = sizeof(uint8_t);
numElements = (uint32_t) (vector->numDimensions / 8);
break;
case DPI_VECTOR_FORMAT_FLOAT32:
vector->dimensionSize = sizeof(float);
break;
case DPI_VECTOR_FORMAT_FLOAT64:
vector->dimensionSize = sizeof(double);
break;
case DPI_VECTOR_FORMAT_INT8:
vector->dimensionSize = sizeof(int8_t);
break;
default:
return dpiError__set(error, "check vector format",
DPI_ERR_UNSUPPORTED_VECTOR_FORMAT, vector->format);
}
if (dpiOci__attrGet(vector->handle, DPI_OCI_DTYPE_VECTOR, &flags, 0,
DPI_OCI_ATTR_VECTOR_PROPERTY, "get vector flags", error) < 0)
return DPI_FAILURE;
if (flags & DPI_OCI_ATTR_VECTOR_COL_PROPERTY_IS_SPARSE) {
if (dpiOci__attrGet(vector->handle, DPI_OCI_DTYPE_VECTOR,
&vector->numSparseValues, 0,
DPI_OCI_ATTR_VECTOR_SPARSE_DIMENSION,
"get number of sparse vector dimensions", error) < 0)
return DPI_FAILURE;
numElements = vector->numSparseValues;
if (dpiUtils__allocateMemory(numElements, sizeof(uint32_t), 0,
"allocate sparse vector indices",
(void**) &vector->sparseIndices, error) < 0)
return DPI_FAILURE;
} else {
vector->numSparseValues = 0;
vector->sparseIndices = NULL;
}
if (dpiUtils__allocateMemory(numElements, vector->dimensionSize, 0,
"allocate vector dimensions", &vector->dimensions, error) < 0)
return DPI_FAILURE;
if (vector->numSparseValues > 0) {
if (dpiOci__vectorToSparseArray(vector, error) < 0)
return DPI_FAILURE;
} else {
if (dpiOci__vectorToArray(vector, error) < 0)
return DPI_FAILURE;
}
}
info->format = vector->format;
info->numDimensions = vector->numDimensions;
info->dimensionSize = vector->dimensionSize;
info->dimensions.asPtr = vector->dimensions;
info->numSparseValues = vector->numSparseValues;
info->sparseIndices = vector->sparseIndices;
return DPI_SUCCESS;
}
int dpiVector_addRef(dpiVector *vector)
{
return dpiGen__addRef(vector, DPI_HTYPE_VECTOR, __func__);
}
int dpiVector_getValue(dpiVector *vector, dpiVectorInfo *info)
{
dpiError error;
int status;
if (dpiGen__startPublicFn(vector, DPI_HTYPE_VECTOR, __func__, &error) < 0)
return DPI_FAILURE;
DPI_CHECK_PTR_NOT_NULL(vector, info)
status = dpiVector__getValue(vector, info, &error);
return dpiGen__endPublicFn(vector, status, &error);
}
int dpiVector_release(dpiVector *vector)
{
return dpiGen__release(vector, DPI_HTYPE_VECTOR, __func__);
}
int dpiVector_setValue(dpiVector *vector, dpiVectorInfo *info)
{
dpiError error;
int status;
if (dpiGen__startPublicFn(vector, DPI_HTYPE_VECTOR, __func__, &error) < 0)
return DPI_FAILURE;
DPI_CHECK_PTR_NOT_NULL(vector, info)
if (info->numSparseValues > 0) {
status = dpiOci__vectorFromSparseArray(vector, info, &error);
} else {
status = dpiOci__vectorFromArray(vector, info, &error);
}
return dpiGen__endPublicFn(vector, status, &error);
}