23,217
社区成员




Environment* g_pDBOEnv = NULL; // 共享的OCCI上下文环境变量
int g_iDBOOpenConnCount = 0; // 总连接个数
bool g_bDBORecordLog = false; // 日志标识
Connection* g_pDBOConnList[1024]; // 共享的连接数组, 每个DB接口的调用者只获取到这个数组的下标
pthread_mutex_t g_fDBOLock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t g_fDBOGetLogMarkLock = PTHREAD_MUTEX_INITIALIZER;
char g_szDBORootPath[256];
int SCTDBConnect(const char* pDBInfo, int* piResType, char* pResInfo)
{
memset(g_szDBORootPath, 0x00, 256);
DBOGetRootPath(g_szDBORootPath);
pthread_mutex_lock(&g_fDBOGetLogMarkLock); // 此处就是获取日志标识
g_bDBORecordLog = bDBOGetLogMark();
pthread_mutex_unlock(&g_fDBOGetLogMarkLock);
sprintf(pLog, "%s", "Into SCTDBConnect!"); // 写日志
DBOWriteLog(pLog);
// 解析参数中的pDBInfo,用户名,密码,连接字符串
// ...
sprintf(pLog, "UserName: %s, Password: %s, Connstr: %s", strUname.data(), strPasswd.data(), strConnstr.data());
DBOWriteLog(pLog);
// 第二个锁,防止多线程获取到同一个连接,这个锁一直Lock,直到创建连接成功之后解锁
pthread_mutex_lock(&g_fDBOLock);
if (g_pDBOEnv == NULL)
{
// 此处是判断如果全局变量Environment* g_pEnv为空,则表示当前发起的连接是第一个连接
// 就需要创建Environment
g_pEnv = Environment::createEnvironment();
if (创建失败)
goto ENDOFCONN;
sprintf(pLog, "%s", "Create Environment In Object|Metexed Mode Successed");
DBOWriteLog(pLog);
}
if (g_pDBOEnv != NULL)
{
// 此处开始创建连接Connection*并且存放于全局数组中
iConnNo = iDBOGetIdleConnection(); // 获取一个下标
g_pDBOConnList[iConnNo] = g_pDBOEnv->createConnection(strUname, strPasswd, strConnstr);
if (创建失败)
goto ENDOFCONN;
g_iDBOOpenConnCount++;
sprintf(pLog, "%s", "Create Connection Successed");
DBOWriteLog(pLog);
sprintf(pLog, "Connection Number: %d", iConnNo);
DBOWriteLog(pLog);
}
ENDOFCONN:
sprintf(pLog, "%s", "Out Of SCTDBConnect!\n");
DBOWriteLog(pLog);
pthread_mutex_unlock(&g_fDBOLock); // 解锁
return iConnNo;
}
void SCTDBDisConnect(int iConnNo, int* piResType, char* pResInfo)
{
char pLog[10240];
memset(pLog, 0x00, 10240);
sprintf(pLog, "%s", "Into SCTDBDisConnect!");
DBOWriteLog(pLog);
pthread_mutex_lock(&g_fDBOLock);
if (g_pDBOEnv == NULL)
{
*piResType = 0;
goto ENDOFDISCONN;
}
if (g_pDBOConnList[iConnNo] != NULL)
{
sprintf(pLog, "%s", "Release Connection...");
DBOWriteLog(pLog);
g_pDBOEnv->terminateConnection(g_pDBOConnList[iConnNo]);
g_iDBOOpenConnCount--;
g_pDBOConnList[iConnNo] = NULL;
sprintf(pLog, "%s", "Release Connection Successed");
DBOWriteLog(pLog);
}
else
{
*piResType = 0;
goto ENDOFDISCONN;
}
if (g_iDBOOpenConnCount > 0)
{
*piResType = 0
goto ENDOFDISCONN;
}
sprintf(pLog, "%s", "Release Environment...");
DBOWriteLog(pLog);
Environment::terminateEnvironment(g_pDBOEnv);
g_pDBOEnv = NULL;
sprintf(pLog, "%s", "Release Environment Successed");
DBOWriteLog(pLog);
sprintf(pLog, "%s", "DisConnect Database Successed");
DBOWriteLog(pLog);
*piResType = 0;
ENDOFDISCONN:
sprintf(pLog, "%s", "Out Of SCTDBDisConnect!\n");
DBOWriteLog(pLog);
pthread_mutex_unlock(&g_fDBOLock);
return;
}