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

📄 hyconn.cpp

📁 《Oracle Spatial与OCI高级编程》相关配套源码。介绍了Oracle数据库中的两项关键开发技术Oracle Spatial以及OCI(Oracle Call Interface)。
💻 CPP
字号:
/*
* Copyright (c) OCI高级编程
* @File name: hyconn.cpp
* @Author   : He Xiong
* @Content  : HYConnection以及HYConnPool的实现
* @Date		: 2003-10
****/


#include "hyafx.h"
#include <string>
using namespace std;

HYConnection::HYConnection() 
{
	connected = FALSE;

	envhp = 0;
	errhp = 0;
	srvhp = 0;
	svchp = 0;
	usrhp = 0;
	dschp = 0;
	txnhp = 0;
}

bool HYConnection::connect(const char* dblink, 
						 const char* username, const char* password)
{
	sword status;

	int mode = OCI_THREADED|OCI_OBJECT;
	OCIInitialize((ub4)mode, (dvoid *)0, 
				      (dvoid*(*)(dvoid *ctxp, size_t size))0, 
				      (dvoid*(*)(dvoid *ctxp, dvoid *memptr, size_t newsize))0, 
				      (void (*)(dvoid *ctxp, dvoid *memptr))0);

	// 初始化环境句柄
	OCIEnvInit(&envhp, (ub4)OCI_DEFAULT, (size_t)0, (dvoid**)0);

	// 
	OCIHandleAlloc((dvoid*)envhp, (dvoid**)&errhp, (ub4)OCI_HTYPE_ERROR,
					   (size_t)0, (dvoid**)0);
	OCIHandleAlloc((dvoid*)envhp, (dvoid**)&srvhp, (ub4)OCI_HTYPE_SERVER,
					   (size_t)0, (dvoid**)0);
	status = OCIServerAttach(srvhp, errhp, (text*)dblink, 
								 (sb4)strlen(dblink), (ub4)OCI_DEFAULT);
	if (status != OCI_SUCCESS)
		return FALSE;

	// 
	OCIHandleAlloc((dvoid*)envhp, (dvoid**)&svchp, (ub4)OCI_HTYPE_SVCCTX, 
					   (size_t)0, (dvoid**)0);
	OCIAttrSet((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid*)srvhp, (ub4)0, 
				   (ub4)OCI_ATTR_SERVER, errhp);

	// 
	OCIHandleAlloc((dvoid*)envhp, (dvoid**)&usrhp, (ub4)OCI_HTYPE_SESSION, 
					   (size_t)0, (dvoid**)0);
	OCIAttrSet((dvoid*)usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid*)username, 
				   (ub4)strlen(username), (ub4)OCI_ATTR_USERNAME, errhp);
	OCIAttrSet((dvoid*)usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid*)password, 
				   (ub4)strlen(password), (ub4)OCI_ATTR_PASSWORD, errhp);

	// 初始化描述句柄
	OCIHandleAlloc((dvoid*)envhp, (dvoid**)&dschp, 
	    (ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0);
  
	// 开始会话
	status = OCISessionBegin(svchp, errhp, usrhp, OCI_CRED_RDBMS, 
								 OCI_DEFAULT);
	// 检查错误
	HYException::checkErr(errhp, status);
	if (status != OCI_SUCCESS)
		return FALSE;

	OCIAttrSet((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid*)usrhp, (ub4)0, 
				   (ub4)OCI_ATTR_SESSION, errhp);

	// 分配事务句柄
	OCIHandleAlloc((dvoid *)envhp, (dvoid **)&txnhp, OCI_HTYPE_TRANS, 0, 0);
	OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)txnhp, 0,
	OCI_ATTR_TRANS, errhp);

	connected = true;
	return true;
}


void HYConnection::disconnect()
{
	if (connected)
	{
		// 结束会话
		OCISessionEnd(svchp, errhp, usrhp, (ub4)OCI_DEFAULT);
		OCIServerDetach(srvhp, errhp, (ub4)OCI_DEFAULT);

		// 释放句柄
		OCIHandleFree((dvoid*)txnhp, (ub4)OCI_HTYPE_TRANS);
		OCIHandleFree((dvoid*)srvhp, (ub4)OCI_HTYPE_SERVER);
		OCIHandleFree((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX);
		OCIHandleFree((dvoid*)errhp, (ub4)OCI_HTYPE_ERROR);
		OCIHandleFree((dvoid *)dschp, (ub4)OCI_HTYPE_DESCRIBE);

		connected = false;		
		envhp = 0;
		errhp = 0;
		srvhp = 0;
		svchp = 0;
		usrhp = 0;
		dschp = 0;
		txnhp = 0;
	}
}

//HYConnPool的实现
//初始化静态成员
HYConnPool* HYConnPool::_pool = NULL;

HYConnPool::HYConnPool()
{
	conns.resize(MAX_CONN);
	for (int i=0; i<MAX_CONN; i++)
	{
		conns[i] = new HYConnection();
	}
}

HYConnPool::~HYConnPool()
{
	for (int i=0; i<conns.size(); i++)
	{
		if (conns[i]) delete conns[i];
		conns[i] = NULL;
	}
}

HYConnPool* HYConnPool::createPool()
{
	if (_pool == NULL)
	{
		_pool = new HYConnPool;
	}
	return _pool;
}

HYConnection* HYConnPool::getConn()
{
	for (int i=0; i<conns.size(); i++)
	{
		if (!conns[i]->isConnected())
		{
			return conns[i];
		}
	}
	return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -