Skip to content

Commit 8e71486

Browse files
Update ODPI-C (correct handling of NVARCHAR2 object attributes and collection
elements).
1 parent 6777ca9 commit 8e71486

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

odpi

src/Object.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,11 @@ static PyObject *Object_Repr(udt_Object *self)
186186
// Convert a Python value to an Oracle value.
187187
//-----------------------------------------------------------------------------
188188
static int Object_ConvertFromPython(udt_Object *obj, PyObject *value,
189-
dpiNativeTypeNum *nativeTypeNum, dpiData *data, udt_Buffer *buffer)
189+
dpiOracleTypeNum oracleTypeNum, dpiNativeTypeNum *nativeTypeNum,
190+
dpiData *data, udt_Buffer *buffer)
190191
{
191192
PyObject *textValue, *valueType;
193+
const char *encoding;
192194
udt_Object *otherObj;
193195
udt_LOB *lob;
194196
int status;
@@ -214,8 +216,12 @@ static int Object_ConvertFromPython(udt_Object *obj, PyObject *value,
214216
if (status < 0)
215217
return -1;
216218
} else {
217-
if (cxBuffer_FromObject(buffer, value,
218-
obj->objectType->connection->encodingInfo.encoding) < 0)
219+
if (oracleTypeNum == DPI_ORACLE_TYPE_NCHAR ||
220+
oracleTypeNum == DPI_ORACLE_TYPE_NVARCHAR ||
221+
oracleTypeNum == DPI_ORACLE_TYPE_NCLOB)
222+
encoding = obj->objectType->connection->encodingInfo.nencoding;
223+
else encoding = obj->objectType->connection->encodingInfo.encoding;
224+
if (cxBuffer_FromObject(buffer, value, encoding) < 0)
219225
return -1;
220226
}
221227
*nativeTypeNum = DPI_NATIVE_TYPE_BYTES;
@@ -362,8 +368,8 @@ static int Object_SetAttributeValue(udt_Object *self,
362368
int status;
363369

364370
cxBuffer_Init(&buffer);
365-
if (Object_ConvertFromPython(self, value, &nativeTypeNum, &data,
366-
&buffer) < 0)
371+
if (Object_ConvertFromPython(self, value, attribute->oracleTypeNum,
372+
&nativeTypeNum, &data, &buffer) < 0)
367373
return -1;
368374
status = dpiObject_setAttributeValue(self->handle, attribute->handle,
369375
nativeTypeNum, &data);
@@ -421,7 +427,8 @@ static int Object_InternalAppend(udt_Object *self, PyObject *value)
421427
int status;
422428

423429
cxBuffer_Init(&buffer);
424-
if (Object_ConvertFromPython(self, value, &nativeTypeNum, &data,
430+
if (Object_ConvertFromPython(self, value,
431+
self->objectType->elementOracleTypeNum, &nativeTypeNum, &data,
425432
&buffer) < 0)
426433
return -1;
427434
status = dpiObject_appendElement(self->handle, nativeTypeNum, &data);
@@ -718,7 +725,8 @@ static PyObject *Object_SetElement(udt_Object *self, PyObject *args)
718725
if (!PyArg_ParseTuple(args, "iO", &index, &value))
719726
return NULL;
720727
cxBuffer_Init(&buffer);
721-
if (Object_ConvertFromPython(self, value, &nativeTypeNum, &data,
728+
if (Object_ConvertFromPython(self, value,
729+
self->objectType->elementOracleTypeNum, &nativeTypeNum, &data,
722730
&buffer) < 0)
723731
return NULL;
724732
status = dpiObject_setElementValueByIndex(self->handle, index,

0 commit comments

Comments
 (0)