⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ocitype.cpp

📁 一个通用的oracle OCI开发程序包
💻 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 + -