- use a prefix of cxo/CXO for all variables, methods and constants - create common include file and use separate compilation units - consolidate all transformations to/from Python objects
161 lines
6.1 KiB
C
161 lines
6.1 KiB
C
//-----------------------------------------------------------------------------
|
|
// Copyright 2018, Oracle and/or its affiliates. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoObjectAttr.c
|
|
// Defines the routines for handling attributes of Oracle types.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "cxoModule.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Declaration of functions
|
|
//-----------------------------------------------------------------------------
|
|
static void cxoObjectAttr_free(cxoObjectAttr*);
|
|
static PyObject *cxoObjectAttr_repr(cxoObjectAttr*);
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// declaration of members for Python type "ObjectAttribute"
|
|
//-----------------------------------------------------------------------------
|
|
static PyMemberDef cxoObjectAttrMembers[] = {
|
|
{ "name", T_OBJECT, offsetof(cxoObjectAttr, name), READONLY },
|
|
{ NULL }
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Python type declaration
|
|
//-----------------------------------------------------------------------------
|
|
PyTypeObject cxoPyTypeObjectAttr = {
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
"cx_Oracle.ObjectAttribute", // tp_name
|
|
sizeof(cxoObjectAttr), // tp_basicsize
|
|
0, // tp_itemsize
|
|
(destructor) cxoObjectAttr_free, // tp_dealloc
|
|
0, // tp_print
|
|
0, // tp_getattr
|
|
0, // tp_setattr
|
|
0, // tp_compare
|
|
(reprfunc) cxoObjectAttr_repr, // tp_repr
|
|
0, // tp_as_number
|
|
0, // tp_as_sequence
|
|
0, // tp_as_mapping
|
|
0, // tp_hash
|
|
0, // tp_call
|
|
0, // tp_str
|
|
0, // tp_getattro
|
|
0, // tp_setattro
|
|
0, // tp_as_buffer
|
|
Py_TPFLAGS_DEFAULT, // tp_flags
|
|
0, // tp_doc
|
|
0, // tp_traverse
|
|
0, // tp_clear
|
|
0, // tp_richcompare
|
|
0, // tp_weaklistoffset
|
|
0, // tp_iter
|
|
0, // tp_iternext
|
|
0, // tp_methods
|
|
cxoObjectAttrMembers, // tp_members
|
|
0, // tp_getset
|
|
0, // tp_base
|
|
0, // tp_dict
|
|
0, // tp_descr_get
|
|
0, // tp_descr_set
|
|
0, // tp_dictoffset
|
|
0, // tp_init
|
|
0, // tp_alloc
|
|
0, // tp_new
|
|
0, // tp_free
|
|
0, // tp_is_gc
|
|
0 // tp_bases
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoObjectAttr_initialize()
|
|
// Initialize the new object attribute.
|
|
//-----------------------------------------------------------------------------
|
|
static int cxoObjectAttr_initialize(cxoObjectAttr *attr,
|
|
cxoConnection *connection)
|
|
{
|
|
dpiObjectAttrInfo info;
|
|
|
|
if (dpiObjectAttr_getInfo(attr->handle, &info) < 0)
|
|
return cxoError_raiseAndReturnInt();
|
|
attr->transformNum = cxoTransform_getNumFromDataTypeInfo(&info.typeInfo);
|
|
attr->name = cxoPyString_fromEncodedString(info.name, info.nameLength,
|
|
connection->encodingInfo.encoding);
|
|
if (!attr->name)
|
|
return -1;
|
|
if (info.typeInfo.objectType) {
|
|
attr->type = cxoObjectType_new(connection,
|
|
info.typeInfo.objectType);
|
|
if (!attr->type)
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoObjectAttr_new()
|
|
// Allocate a new object attribute.
|
|
//-----------------------------------------------------------------------------
|
|
cxoObjectAttr *cxoObjectAttr_new(cxoConnection *connection,
|
|
dpiObjectAttr *handle)
|
|
{
|
|
cxoObjectAttr *attr;
|
|
|
|
attr = (cxoObjectAttr*)
|
|
cxoPyTypeObjectAttr.tp_alloc(&cxoPyTypeObjectAttr, 0);
|
|
if (!attr) {
|
|
dpiObjectAttr_release(handle);
|
|
return NULL;
|
|
}
|
|
attr->handle = handle;
|
|
if (cxoObjectAttr_initialize(attr, connection) < 0) {
|
|
Py_DECREF(attr);
|
|
return NULL;
|
|
}
|
|
|
|
return attr;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoObjectAttr_free()
|
|
// Free the memory associated with an object attribute.
|
|
//-----------------------------------------------------------------------------
|
|
static void cxoObjectAttr_free(cxoObjectAttr *attr)
|
|
{
|
|
if (attr->handle) {
|
|
dpiObjectAttr_release(attr->handle);
|
|
attr->handle = NULL;
|
|
}
|
|
Py_CLEAR(attr->name);
|
|
Py_CLEAR(attr->type);
|
|
Py_TYPE(attr)->tp_free((PyObject*) attr);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// cxoObjectAttr_repr()
|
|
// Return a string representation of the object attribute.
|
|
//-----------------------------------------------------------------------------
|
|
static PyObject *cxoObjectAttr_repr(cxoObjectAttr *attr)
|
|
{
|
|
PyObject *module, *name, *result;
|
|
|
|
if (cxoUtils_getModuleAndName(Py_TYPE(attr), &module, &name) < 0)
|
|
return NULL;
|
|
result = cxoUtils_formatString("<%s.%s %s>",
|
|
PyTuple_Pack(3, module, name, attr->name));
|
|
Py_DECREF(module);
|
|
Py_DECREF(name);
|
|
return result;
|
|
}
|
|
|