📄 hyconn.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 + -