103 lines
4.1 KiB
C
103 lines
4.1 KiB
C
//-----------------------------------------------------------------------------
|
|
// Copyright 2018, Oracle and/or its affiliates. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoFuture.c
|
|
// Defines the object used for managing behavior changes. This object permits
|
|
// setting any attribute to any value but only tracks certain values.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "cxoModule.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// functions for the Python type "Object"
|
|
//-----------------------------------------------------------------------------
|
|
static void cxoFuture_free(cxoFuture*);
|
|
static PyObject *cxoFuture_getAttr(cxoFuture*, PyObject*);
|
|
static int cxoFuture_setAttr(cxoFuture*, PyObject*, PyObject*);
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Python type declaration
|
|
//-----------------------------------------------------------------------------
|
|
PyTypeObject cxoPyTypeFuture = {
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
"cx_Oracle.__future__", // tp_name
|
|
sizeof(cxoFuture), // tp_basicsize
|
|
0, // tp_itemsize
|
|
(destructor) cxoFuture_free, // tp_dealloc
|
|
0, // tp_print
|
|
0, // tp_getattr
|
|
0, // tp_setattr
|
|
0, // tp_compare
|
|
0, // tp_repr
|
|
0, // tp_as_number
|
|
0, // tp_as_sequence
|
|
0, // tp_as_mapping
|
|
0, // tp_hash
|
|
0, // tp_call
|
|
0, // tp_str
|
|
(getattrofunc) cxoFuture_getAttr, // tp_getattro
|
|
(setattrofunc) cxoFuture_setAttr, // tp_setattro
|
|
0, // tp_as_buffer
|
|
Py_TPFLAGS_DEFAULT // tp_flags
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoFuture_free()
|
|
// Free the future object and reset global.
|
|
//-----------------------------------------------------------------------------
|
|
static void cxoFuture_free(cxoFuture *obj)
|
|
{
|
|
Py_TYPE(obj)->tp_free((PyObject*) obj);
|
|
cxoFutureObj = NULL;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoFuture_getAttr()
|
|
// Retrieve an attribute on an object.
|
|
//-----------------------------------------------------------------------------
|
|
static PyObject *cxoFuture_getAttr(cxoFuture *obj, PyObject *nameObject)
|
|
{
|
|
cxoBuffer buffer;
|
|
PyObject *result;
|
|
|
|
if (cxoBuffer_fromObject(&buffer, nameObject, NULL) < 0)
|
|
return NULL;
|
|
if (strncmp(buffer.ptr, "ctx_mgr_close", buffer.size) == 0)
|
|
result = PyBool_FromLong(obj->contextManagerClose);
|
|
else if (strncmp(buffer.ptr, "dml_ret_array_val", buffer.size) == 0)
|
|
result = PyBool_FromLong(obj->dmlReturningArray);
|
|
else {
|
|
Py_INCREF(Py_None);
|
|
result = Py_None;
|
|
}
|
|
cxoBuffer_clear(&buffer);
|
|
return result;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoFuture_setAttr()
|
|
// Set an attribute on an object.
|
|
//-----------------------------------------------------------------------------
|
|
static int cxoFuture_setAttr(cxoFuture *obj, PyObject *nameObject,
|
|
PyObject *value)
|
|
{
|
|
cxoBuffer buffer;
|
|
int result = 0;
|
|
|
|
if (cxoBuffer_fromObject(&buffer, nameObject, NULL) < 0)
|
|
return -1;
|
|
if (strncmp(buffer.ptr, "ctx_mgr_close", buffer.size) == 0)
|
|
result = cxoUtils_getBooleanValue(value, 0, &obj->contextManagerClose);
|
|
else if (strncmp(buffer.ptr, "dml_ret_array_val", buffer.size) == 0)
|
|
result = cxoUtils_getBooleanValue(value, 0, &obj->dmlReturningArray);
|
|
cxoBuffer_clear(&buffer);
|
|
return result;
|
|
}
|
|
|