📄 ocitype.cpp
字号:
#ifndef _COCIType
#include "ocitype.h"
#endif
#ifndef _COCISession
#include "ocisess.h"
#endif
#include <string.h>
COCIType::COCIType(const COCISession& Sess, char* type_name)
: m_Session(Sess)
, tdo(0)
, m_attr_count(0)
, m_deshp(0)
, m_list_attr(0)
{
CHECK (m_Session.get_error(), OCIHandleAlloc((dvoid *)m_Session.get_env(), (dvoid **)&m_deshp,
(ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0));
std::string uppercase_type_name = uppercase(type_name);
#define GET_TDO_METHOD2
#ifdef GET_TDO_METHOD1
OCIDescribe *dschp = (OCIDescribe*)0;
CHECK (m_Session.get_error(), OCIHandleAlloc((dvoid *)m_Session.get_env(), (dvoid **)&dschp,
(ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0));
CHECK(m_Session.get_error(), OCIDescribeAny(m_Session.get_svc(), m_Session.get_error(), (text *)uppercase_type_name.c_str(),
(ub4) strlen(type_name), OCI_OTYPE_NAME, (ub1)1,
(ub1) OCI_PTYPE_TYPE, dschp));
OCIParam* parmp = (OCIParam*)0;
CHECK(m_Session.get_error(), OCIAttrGet((dvoid *) dschp, (ub4) OCI_HTYPE_DESCRIBE,
(dvoid *)&parmp, (ub4 *)0, (ub4)OCI_ATTR_PARAM, m_Session.get_error()));
OCIRef *type_ref = (OCIRef *) 0;
CHECK(m_Session.get_error(), OCIAttrGet((dvoid*) parmp, (ub4) OCI_DTYPE_PARAM,
(dvoid*) &type_ref, (ub4 *) 0,
(ub4) OCI_ATTR_REF_TDO, (OCIError *) m_Session.get_error()));
CHECK(m_Session.get_error(), OCIObjectPin(m_Session.get_env(), m_Session.get_error(), type_ref, (OCIComplexObject *) 0,
OCI_PIN_ANY, OCI_DURATION_SESSION, OCI_LOCK_NONE,
(dvoid **)&tdo));
#endif // GET_TDO_METHOD1
#ifdef GET_TDO_METHOD2
char *type_name_array[1];
type_name_array[0] = (char*)uppercase_type_name.c_str();
ub4 type_name_lengths[1];
type_name_lengths[0] = strlen((const char *) type_name);
OCIType *tdo_array[1];
CHECK(m_Session.get_error(), OCITypeArrayByName(m_Session.get_env(), m_Session.get_error(), m_Session.get_svc(),1,
0, 0,
(const text **) type_name_array,
type_name_lengths,
(CONST text **) 0, 0,
OCI_DURATION_TRANS, OCI_TYPEGET_ALL, tdo_array));
tdo = tdo_array[0];
#endif // GET_TDO_METHOD2
#ifdef GET_TDO_METHOD3
CHECK( m_Session.get_error(), OCITypeByName(m_Session.get_env(), m_Session.get_error(), m_Session.get_svc(), 0,
0,
(const text *) uppercase_type_name.c_str(),
(ub4) strlen((const char *) type_name),
(CONST text *) 0, (ub4) 0,
OCI_DURATION_TRANS, OCI_TYPEGET_ALL, &tdo));
#endif // GET_TDO_METHOD3
m_attr_count = attr_count();
}
COCIType::COCIType(const COCISession& Sess, OCIType* _tdo)
: m_Session(Sess)
, tdo(_tdo)
, m_deshp(0)
, m_attr_count(0)
, m_list_attr(0)
{
CHECK (m_Session.get_error(), OCIHandleAlloc((dvoid *)m_Session.get_env(), (dvoid **)&m_deshp,
(ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0));
m_attr_count = attr_count();
}
COCIType::COCIType(const COCIType& src)
: m_Session(src.m_Session)
, tdo(src.tdo)
, m_deshp(0)
, m_attr_count(src.m_attr_count)
, m_list_attr(0)
{
// Have we a tdo?
if(src.tdo)
{
CHECK (m_Session.get_error(), OCIHandleAlloc((dvoid *)m_Session.get_env(), (dvoid **)&m_deshp,
(ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0));
}
}
// Fudge for now
COCIType::COCIType()
: m_Session(m_Session) // hacky
, tdo(0)
, m_deshp(0)
, m_attr_count(0)
, m_list_attr(0)
{
}
COCIType::~COCIType()
{
if(m_deshp)
{
CHECK(m_Session.get_error(),OCIHandleFree(m_deshp,OCI_HTYPE_DESCRIBE));
m_deshp = 0;
}
m_attr_count = 0;
m_list_attr = 0;
}
char* COCIType::get_name(void)
{
ub4 len;
return (char*)OCITypeName(m_Session.get_env(), m_Session.get_error(), tdo, &len);
}
ub2 COCIType::attr_count(void)
{
if(!m_attr_count)
{
OCIParam* parmhp = (OCIParam*)0;
//OCIDescribe *deshp = (OCIDescribe*)0;
/*CHECK (m_Session.get_error(), OCIHandleAlloc((dvoid *)m_Session.get_env(), (dvoid **)&deshp,
(ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0));*/
CHECK(m_Session.get_error(), OCIDescribeAny(m_Session.get_svc(), m_Session.get_error(), (dvoid *)tdo, (ub4)0,
OCI_OTYPE_PTR, (ub1)1, OCI_PTYPE_TYPE, m_deshp));
/* get the parameter descriptor */
CHECK(m_Session.get_error(), OCIAttrGet((dvoid *)m_deshp, (ub4)OCI_HTYPE_DESCRIBE,
(dvoid *)&parmhp, (ub4 *)0, (ub4)OCI_ATTR_PARAM,
(OCIError *)m_Session.get_error()));
//ub2 attr_count = 0;
CHECK(m_Session.get_error(), OCIAttrGet((dvoid*) parmhp, (ub4) OCI_DTYPE_PARAM,
(dvoid*) &m_attr_count, (ub4 *) 0,
(ub4) OCI_ATTR_NUM_TYPE_ATTRS, (OCIError *) m_Session.get_error()));
/*CHECK(m_Session.get_error(), OCIAttrGet((dvoid *)parmhp, (ub4)OCI_DTYPE_PARAM,
(dvoid *)&m_list_attr, (ub4 *)0,
(ub4)OCI_ATTR_LIST_TYPE_ATTRS, (OCIError *)m_Session.get_error()));*/
//CHECK(m_Session.get_error(),OCIHandleFree(deshp,OCI_HTYPE_DESCRIBE));
}
return m_attr_count;
}
void* COCIType::attr_list()
{
OCIParam* parmhp = (OCIParam*)0;
if(!m_list_attr)
{
CHECK(m_Session.get_error(), OCIDescribeAny(m_Session.get_svc(), m_Session.get_error(), (dvoid *)tdo, (ub4)0,
OCI_OTYPE_PTR, (ub1)1, OCI_PTYPE_TYPE, m_deshp));
/* get the parameter descriptor */
CHECK(m_Session.get_error(), OCIAttrGet((dvoid *)m_deshp, (ub4)OCI_HTYPE_DESCRIBE,
(dvoid *)&parmhp, (ub4 *)0, (ub4)OCI_ATTR_PARAM,
(OCIError *)m_Session.get_error()));
CHECK(m_Session.get_error(), OCIAttrGet((dvoid *)parmhp, (ub4)OCI_DTYPE_PARAM,
(dvoid *)&m_list_attr, (ub4 *)0,
(ub4)OCI_ATTR_LIST_TYPE_ATTRS, (OCIError *)m_Session.get_error()));
}
return m_list_attr;
}
COCIType& COCIType::operator = (const COCIType& src)
{
if(&src != this)
{
// m_Session = src.m_Session;
m_deshp = 0;
CHECK (src.m_Session.get_error(), OCIHandleAlloc((dvoid *)src.m_Session.get_env(), (dvoid **)&m_deshp,
(ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0));
tdo = src.tdo;
m_attr_count = src.m_attr_count;
//m_list_attr = src.m_list_attr;
}
return *this;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -