mirror of
https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git
synced 2025-07-14 02:27:40 -04:00
Kill pnOraLib.
This commit is contained in:
@ -22,7 +22,6 @@ add_subdirectory(pnNetCli)
|
|||||||
add_subdirectory(pnNetCommon)
|
add_subdirectory(pnNetCommon)
|
||||||
add_subdirectory(pnNetDiag)
|
add_subdirectory(pnNetDiag)
|
||||||
add_subdirectory(pnNetProtocol)
|
add_subdirectory(pnNetProtocol)
|
||||||
#add_subdirectory(pnOraLib) # Not being used in any current sln
|
|
||||||
add_subdirectory(pnProduct)
|
add_subdirectory(pnProduct)
|
||||||
add_subdirectory(pnSceneObject)
|
add_subdirectory(pnSceneObject)
|
||||||
add_subdirectory(pnSimpleNet)
|
add_subdirectory(pnSimpleNet)
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
/*==LICENSE==*
|
|
||||||
|
|
||||||
CyanWorlds.com Engine - MMOG client, server and tools
|
|
||||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Additional permissions under GNU GPL version 3 section 7
|
|
||||||
|
|
||||||
If you modify this Program, or any covered work, by linking or
|
|
||||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
|
||||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
|
||||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
|
||||||
(or a modified version of those libraries),
|
|
||||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
|
||||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
|
||||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
|
||||||
licensors of this Program grant you additional
|
|
||||||
permission to convey the resulting work. Corresponding Source for a
|
|
||||||
non-source form of such a combination shall include the source code for
|
|
||||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
|
||||||
work.
|
|
||||||
|
|
||||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
|
||||||
or by snail mail at:
|
|
||||||
Cyan Worlds, Inc.
|
|
||||||
14617 N Newport Hwy
|
|
||||||
Mead, WA 99021
|
|
||||||
|
|
||||||
*==LICENSE==*/
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnOraLib/Intern.h
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
#ifdef PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNORALIB_INTERN_H
|
|
||||||
#error "Header $/Plasma20/Sources/Plasma/NucleusLib/pnOraLib/Intern.h included more than once"
|
|
||||||
#endif
|
|
||||||
#define PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNORALIB_INTERN_H
|
|
@ -1,72 +0,0 @@
|
|||||||
/*==LICENSE==*
|
|
||||||
|
|
||||||
CyanWorlds.com Engine - MMOG client, server and tools
|
|
||||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Additional permissions under GNU GPL version 3 section 7
|
|
||||||
|
|
||||||
If you modify this Program, or any covered work, by linking or
|
|
||||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
|
||||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
|
||||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
|
||||||
(or a modified version of those libraries),
|
|
||||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
|
||||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
|
||||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
|
||||||
licensors of this Program grant you additional
|
|
||||||
permission to convey the resulting work. Corresponding Source for a
|
|
||||||
non-source form of such a combination shall include the source code for
|
|
||||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
|
||||||
work.
|
|
||||||
|
|
||||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
|
||||||
or by snail mail at:
|
|
||||||
Cyan Worlds, Inc.
|
|
||||||
14617 N Newport Hwy
|
|
||||||
Mead, WA 99021
|
|
||||||
|
|
||||||
*==LICENSE==*/
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnOraLib/Pch.h
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
#ifdef PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNORALIB_PCH_H
|
|
||||||
#error "Header $/Plasma20/Sources/Plasma/NucleusLib/pnOraLib/Pch.h included more than once"
|
|
||||||
#endif
|
|
||||||
#define PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNORALIB_PCH_H
|
|
||||||
|
|
||||||
|
|
||||||
// NucleusLib
|
|
||||||
#include "pnUtils/pnUtils.h"
|
|
||||||
#include "pnProduct/pnProduct.h"
|
|
||||||
#include "pnNetBase/pnNetBase.h"
|
|
||||||
#include "pnAsyncCore/pnAsyncCore.h"
|
|
||||||
#include "pnNetCli/pnNetCli.h"
|
|
||||||
#include "pnIni/pnIni.h"
|
|
||||||
|
|
||||||
// OCCI
|
|
||||||
#define WIN32COMMON
|
|
||||||
#include "occi.h"
|
|
||||||
|
|
||||||
// Local
|
|
||||||
#include "pnOraLib.h"
|
|
||||||
#include "Intern.h"
|
|
||||||
|
|
||||||
// System
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <process.h>
|
|
@ -1,566 +0,0 @@
|
|||||||
/*==LICENSE==*
|
|
||||||
|
|
||||||
CyanWorlds.com Engine - MMOG client, server and tools
|
|
||||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Additional permissions under GNU GPL version 3 section 7
|
|
||||||
|
|
||||||
If you modify this Program, or any covered work, by linking or
|
|
||||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
|
||||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
|
||||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
|
||||||
(or a modified version of those libraries),
|
|
||||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
|
||||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
|
||||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
|
||||||
licensors of this Program grant you additional
|
|
||||||
permission to convey the resulting work. Corresponding Source for a
|
|
||||||
non-source form of such a combination shall include the source code for
|
|
||||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
|
||||||
work.
|
|
||||||
|
|
||||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
|
||||||
or by snail mail at:
|
|
||||||
Cyan Worlds, Inc.
|
|
||||||
14617 N Newport Hwy
|
|
||||||
Mead, WA 99021
|
|
||||||
|
|
||||||
*==LICENSE==*/
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnOraLib/pnOraLib.cpp
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
#include "Pch.h"
|
|
||||||
#pragma hdrstop
|
|
||||||
|
|
||||||
|
|
||||||
//#define ORACONN_TRACKING
|
|
||||||
//#define ORASTMT_TRACKING
|
|
||||||
|
|
||||||
#ifdef ORACONN_TRACKING
|
|
||||||
#pragma message("pnOraLib: Compiling with ORACONN_TRACKING")
|
|
||||||
#endif
|
|
||||||
#ifdef ORASTMT_TRACKING
|
|
||||||
#pragma message("pnOraLib: Compiling with ORASTMT_TRACKING")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* Private
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
struct OraInitData {
|
|
||||||
unsigned OraStmtCacheSize;
|
|
||||||
wchar_t OraUsername[128];
|
|
||||||
wchar_t OraPassword[128];
|
|
||||||
wchar_t OraConnectString[256];
|
|
||||||
|
|
||||||
OraInitData(
|
|
||||||
unsigned stmtCacheSize,
|
|
||||||
const wchar_t username[],
|
|
||||||
const wchar_t password[],
|
|
||||||
const wchar_t connectString[]
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct OraEnv {
|
|
||||||
occi::Environment * occiEnv;
|
|
||||||
occi::StatelessConnectionPool * occiPool;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct OraConnPool {
|
|
||||||
bool needReinit;
|
|
||||||
long perf[kOcciNumPerf];
|
|
||||||
CCritSect critsect;
|
|
||||||
OraEnv oraEnv;
|
|
||||||
OraInitData * data;
|
|
||||||
|
|
||||||
void Initialize_CS ();
|
|
||||||
void Shutdown_CS ();
|
|
||||||
void ReInitialize_CS ();
|
|
||||||
|
|
||||||
void Initialize (
|
|
||||||
const wchar_t username[],
|
|
||||||
const wchar_t password[],
|
|
||||||
const wchar_t connectString[],
|
|
||||||
unsigned stmtCacheSize
|
|
||||||
);
|
|
||||||
void Shutdown ();
|
|
||||||
OraConn * GetConn (const wchar_t tag[]);
|
|
||||||
void FreeConn (OraConn *& conn);
|
|
||||||
|
|
||||||
long GetPerf (long index);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* Private Data
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
static const unsigned kDefaultConnTimeoutSecs = 60 * 30; // half-hour
|
|
||||||
static const unsigned kDefaultConnsPerEnv = 10;
|
|
||||||
|
|
||||||
enum {
|
|
||||||
kPerfOraConnCount,
|
|
||||||
kPerfOraStmtCount,
|
|
||||||
kNumPerf
|
|
||||||
};
|
|
||||||
|
|
||||||
static OraConnPool s_connPool;
|
|
||||||
static long s_perf[kNumPerf];
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* Local functions
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* OraInitData
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
OraInitData::OraInitData (
|
|
||||||
unsigned stmtCacheSize,
|
|
||||||
const wchar_t username[],
|
|
||||||
const wchar_t password[],
|
|
||||||
const wchar_t connectString[]
|
|
||||||
) {
|
|
||||||
OraStmtCacheSize = stmtCacheSize;
|
|
||||||
StrCopy(OraUsername, username, arrsize(OraUsername));
|
|
||||||
StrCopy(OraPassword, password, arrsize(OraPassword));
|
|
||||||
StrCopy(OraConnectString, connectString, arrsize(OraConnectString));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* OraConnPool
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraConnPool::ReInitialize_CS () {
|
|
||||||
|
|
||||||
Shutdown_CS();
|
|
||||||
Initialize_CS();
|
|
||||||
|
|
||||||
needReinit = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraConnPool::Initialize_CS () {
|
|
||||||
|
|
||||||
ASSERT(data);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const unsigned threads = AsyncThreadTaskGetThreadCount();
|
|
||||||
const unsigned maxConns = threads;
|
|
||||||
const unsigned minConns = 0;
|
|
||||||
const unsigned incConns = max(1, maxConns - 1);
|
|
||||||
|
|
||||||
oraEnv.occiEnv = occi::Environment::createEnvironment(
|
|
||||||
"OCCIUTF16",
|
|
||||||
"OCCIUTF16",
|
|
||||||
occi::Environment::THREADED_MUTEXED,
|
|
||||||
nil
|
|
||||||
);
|
|
||||||
|
|
||||||
// Create the connection pool
|
|
||||||
oraEnv.occiPool = oraEnv.occiEnv->createStatelessConnectionPool(
|
|
||||||
data->OraUsername,
|
|
||||||
data->OraPassword,
|
|
||||||
data->OraConnectString,
|
|
||||||
maxConns,
|
|
||||||
minConns,
|
|
||||||
incConns,
|
|
||||||
occi::StatelessConnectionPool::HOMOGENEOUS
|
|
||||||
);
|
|
||||||
|
|
||||||
// Turn on statement caching
|
|
||||||
oraEnv.occiPool->setStmtCacheSize(data->OraStmtCacheSize);
|
|
||||||
oraEnv.occiPool->setTimeOut(kDefaultConnTimeoutSecs);
|
|
||||||
// If no connections are available, block until one becomes available
|
|
||||||
oraEnv.occiPool->setBusyOption(occi::StatelessConnectionPool::WAIT);
|
|
||||||
}
|
|
||||||
catch (exception & e) {
|
|
||||||
OraLogError(L"OraConnPool::Initialize", e);
|
|
||||||
ErrorFatal(__LINE__, __FILE__, "Failed to initialize occi connection pool");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraConnPool::Shutdown_CS () {
|
|
||||||
|
|
||||||
if (oraEnv.occiEnv) {
|
|
||||||
try {
|
|
||||||
// If we aren't connected to oracle, then closing the connection
|
|
||||||
// pool causes oracle to make a pure virtual function call when
|
|
||||||
// closing the environment.
|
|
||||||
if (!needReinit)
|
|
||||||
oraEnv.occiEnv->terminateStatelessConnectionPool(oraEnv.occiPool, occi::StatelessConnectionPool::SPD_FORCE);
|
|
||||||
occi::Environment::terminateEnvironment(oraEnv.occiEnv);
|
|
||||||
}
|
|
||||||
catch (exception & e) {
|
|
||||||
OraLogError(L"OraConnPool::Shutdown", e);
|
|
||||||
}
|
|
||||||
oraEnv.occiEnv = nil;
|
|
||||||
oraEnv.occiPool = nil;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraConnPool::Initialize (
|
|
||||||
const wchar_t username[],
|
|
||||||
const wchar_t password[],
|
|
||||||
const wchar_t connectString[],
|
|
||||||
unsigned stmtCacheSize
|
|
||||||
) {
|
|
||||||
data = new OraInitData(stmtCacheSize, username, password, connectString);
|
|
||||||
|
|
||||||
critsect.Enter();
|
|
||||||
{
|
|
||||||
Initialize_CS();
|
|
||||||
}
|
|
||||||
critsect.Leave();
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraConnPool::Shutdown () {
|
|
||||||
|
|
||||||
critsect.Enter();
|
|
||||||
{
|
|
||||||
Shutdown_CS();
|
|
||||||
}
|
|
||||||
critsect.Leave();
|
|
||||||
|
|
||||||
delete data;
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
OraConn * OraConnPool::GetConn (const wchar_t tag[]) {
|
|
||||||
|
|
||||||
OraConn * oraConn = NEWZERO(OraConn);
|
|
||||||
if (tag)
|
|
||||||
StrCopy(oraConn->tag, tag, arrsize(oraConn->tag));
|
|
||||||
|
|
||||||
critsect.Enter();
|
|
||||||
for (;;) try {
|
|
||||||
if (needReinit) {
|
|
||||||
if (GetPerf(kOcciPerfBusyConns))
|
|
||||||
// Wait for all connections to be freed by the app
|
|
||||||
// before environment reinitialization.
|
|
||||||
break;
|
|
||||||
|
|
||||||
ReInitialize_CS();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!oraEnv.occiEnv)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (nil != (oraConn->occiConn = oraEnv.occiPool->getConnection()))
|
|
||||||
oraConn->oraEnv = &oraEnv;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
catch (exception & e) {
|
|
||||||
OraLogError(L"OraConnPool::GetConn", e);
|
|
||||||
oraConn = nil;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
critsect.Leave();
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
if (!oraConn || !oraConn->occiConn) {
|
|
||||||
delete oraConn;
|
|
||||||
oraConn = nil;
|
|
||||||
LogMsg(kLogError, L"OraConnPool::GetConn: Failed to aquire a database connection");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
const unsigned connCount = AtomicAdd(&s_perf[kPerfOraConnCount], 1) + 1;
|
|
||||||
ref(connCount);
|
|
||||||
|
|
||||||
#ifdef ORACONN_TRACKING
|
|
||||||
LogMsg(kLogPerf, L"OraGetConn: %u, %p, %s", connCount, oraConn, oraConn->tag);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return oraConn;
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraConnPool::FreeConn (OraConn *& oraConn) {
|
|
||||||
|
|
||||||
if (oraConn) try {
|
|
||||||
occi::Connection * occiConn = oraConn->occiConn;
|
|
||||||
occi::StatelessConnectionPool * occiPool = oraConn->oraEnv->occiPool;
|
|
||||||
|
|
||||||
const unsigned connCount = AtomicAdd(&s_perf[kPerfOraConnCount], -1) - 1;
|
|
||||||
ref(connCount);
|
|
||||||
|
|
||||||
#ifdef ORACONN_TRACKING
|
|
||||||
LogMsg(kLogPerf, L"OraFreeConn: %u, %p, %s", connCount, oraConn, oraConn->tag);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
delete oraConn;
|
|
||||||
|
|
||||||
try {
|
|
||||||
occiConn->commit();
|
|
||||||
}
|
|
||||||
catch (exception & e) {
|
|
||||||
OraLogError(L"OraConnPool::FreeConn [commit]", e);
|
|
||||||
needReinit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
occiPool->releaseConnection(occiConn);
|
|
||||||
}
|
|
||||||
catch (exception & e) {
|
|
||||||
OraLogError(L"OraConnPool::FreeConn [release]", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
oraConn = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
long OraConnPool::GetPerf (long index) {
|
|
||||||
|
|
||||||
if (!oraEnv.occiEnv)
|
|
||||||
return 0;
|
|
||||||
if (!oraEnv.occiPool)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
switch (index) {
|
|
||||||
case kOcciPerfOpenConns: return oraEnv.occiPool->getOpenConnections();
|
|
||||||
case kOcciPerfBusyConns: return oraEnv.occiPool->getBusyConnections();
|
|
||||||
DEFAULT_FATAL(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* Exports
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraLogError (const wchar_t sql[], const exception & e) {
|
|
||||||
|
|
||||||
wchar_t buffer[1024];
|
|
||||||
const char * tmp = e.what();
|
|
||||||
|
|
||||||
// Some exceptions we catch are actually unicode strings in a char buffer, but others aren't.
|
|
||||||
if (tmp[0] && !tmp[1]) {
|
|
||||||
const wchar_t * wtmp = (const wchar_t *)tmp;
|
|
||||||
StrCopy(buffer, wtmp, arrsize(buffer));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
StrToUnicode(buffer, tmp, arrsize(buffer));
|
|
||||||
}
|
|
||||||
LogMsg(kLogError, L"%s, %s", sql, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraGetShaDigest (
|
|
||||||
occi::Statement * oraStmt,
|
|
||||||
unsigned index,
|
|
||||||
ShaDigest * digest
|
|
||||||
) {
|
|
||||||
occi::Bytes bytes = oraStmt->getBytes(index);
|
|
||||||
const unsigned length = bytes.length();
|
|
||||||
ASSERT(length == msizeof(ShaDigest, data));
|
|
||||||
bytes.getBytes((uint8_t *)digest->data, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraSetShaDigest (
|
|
||||||
occi::Statement * oraStmt,
|
|
||||||
unsigned index,
|
|
||||||
const ShaDigest & digest
|
|
||||||
) {
|
|
||||||
occi::Bytes bytes((uint8_t *)&digest, sizeof(digest));
|
|
||||||
oraStmt->setBytes(index, bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraBindString (
|
|
||||||
occi::Statement * oraStmt,
|
|
||||||
unsigned index,
|
|
||||||
wchar_t * buffer,
|
|
||||||
unsigned chars,
|
|
||||||
ub2 * length,
|
|
||||||
sb2 * indicator
|
|
||||||
) {
|
|
||||||
oraStmt->setDataBuffer(
|
|
||||||
index,
|
|
||||||
buffer,
|
|
||||||
occi::OCCI_SQLT_STR,
|
|
||||||
chars * sizeof(buffer[0]),
|
|
||||||
length,
|
|
||||||
indicator
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraBindString (
|
|
||||||
occi::ResultSet * rs,
|
|
||||||
unsigned index,
|
|
||||||
wchar_t * buffer,
|
|
||||||
unsigned chars,
|
|
||||||
ub2 * length,
|
|
||||||
sb2 * indicator
|
|
||||||
) {
|
|
||||||
rs->setDataBuffer(
|
|
||||||
index,
|
|
||||||
buffer,
|
|
||||||
occi::OCCI_SQLT_STR,
|
|
||||||
chars * sizeof(buffer[0]),
|
|
||||||
length,
|
|
||||||
indicator
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraGetUuid (
|
|
||||||
occi::Statement * oraStmt,
|
|
||||||
unsigned index,
|
|
||||||
Uuid * uuid
|
|
||||||
) {
|
|
||||||
occi::Bytes bytes = oraStmt->getBytes(index);
|
|
||||||
if (const unsigned length = bytes.length()) {
|
|
||||||
ASSERT(length == msizeof(Uuid, data));
|
|
||||||
uint8_t * buf = malloc(length);
|
|
||||||
bytes.getBytes(buf, length);
|
|
||||||
GuidFromHex(buf, length, uuid);
|
|
||||||
|
|
||||||
free(buf)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
GuidClear(uuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraSetUuid (
|
|
||||||
occi::Statement * oraStmt,
|
|
||||||
unsigned index,
|
|
||||||
const Uuid & uuid
|
|
||||||
) {
|
|
||||||
occi::Bytes bytes((uint8_t *)&uuid, sizeof(uuid));
|
|
||||||
oraStmt->setBytes(index, bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
OraConn * OraGetConn (const wchar_t tag[]) {
|
|
||||||
|
|
||||||
// grabs a cached connection if available, otherwise creates a new one on-the-fly
|
|
||||||
return s_connPool.GetConn(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraFreeConn (OraConn *& oraConn) {
|
|
||||||
|
|
||||||
s_connPool.FreeConn(oraConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
occi::Statement * OraGetStmt (
|
|
||||||
OraConn * oraConn,
|
|
||||||
const wchar_t sql[]
|
|
||||||
) {
|
|
||||||
occi::Statement * oraStmt = nil;
|
|
||||||
try {
|
|
||||||
// grabs a matching cached statement if available, otherwise creates a new one
|
|
||||||
oraStmt = oraConn->occiConn->createStatement(sql);
|
|
||||||
// auto-commit causes an exception to be thrown when writing blobs: "ORA-01002: fetch out of sequence"
|
|
||||||
oraStmt->setAutoCommit(false);
|
|
||||||
|
|
||||||
const unsigned stmtCount = AtomicAdd(&s_perf[kPerfOraStmtCount], 1) + 1;
|
|
||||||
ref(stmtCount);
|
|
||||||
|
|
||||||
#ifdef ORASTMT_TRACKING
|
|
||||||
LogMsg(kLogPerf, L"OraGetStmt: %u, %p, %s", stmtCount, oraStmt, sql);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
catch (exception & e) {
|
|
||||||
OraLogError(L"OraGetStmt", e);
|
|
||||||
}
|
|
||||||
return oraStmt;
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraFreeStmt (occi::Statement *& oraStmt) {
|
|
||||||
if (oraStmt) {
|
|
||||||
try {
|
|
||||||
// caches the statement
|
|
||||||
oraStmt->getConnection()->terminateStatement(oraStmt);
|
|
||||||
|
|
||||||
const unsigned stmtCount = AtomicAdd(&s_perf[kPerfOraStmtCount], -1) - 1;
|
|
||||||
ref(stmtCount);
|
|
||||||
|
|
||||||
#ifdef ORASTMT_TRACKING
|
|
||||||
LogMsg(kLogPerf, L"OraFreeStmt: %u, %p", stmtCount, oraStmt);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
catch (exception & e) {
|
|
||||||
OraLogError(L"OraFreeStmt", e);
|
|
||||||
}
|
|
||||||
oraStmt = nil;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraInitialize (
|
|
||||||
const wchar_t username[],
|
|
||||||
const wchar_t password[],
|
|
||||||
const wchar_t connectString[],
|
|
||||||
unsigned stmtCacheSize
|
|
||||||
) {
|
|
||||||
// Connect to the database
|
|
||||||
s_connPool.Initialize(
|
|
||||||
username,
|
|
||||||
password,
|
|
||||||
connectString,
|
|
||||||
stmtCacheSize
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraShutdown () {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
void OraDestroy () {
|
|
||||||
s_connPool.Shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
long OraLibGetOcciPerf (unsigned index) {
|
|
||||||
return s_connPool.GetPerf(index);
|
|
||||||
}
|
|
@ -1,144 +0,0 @@
|
|||||||
/*==LICENSE==*
|
|
||||||
|
|
||||||
CyanWorlds.com Engine - MMOG client, server and tools
|
|
||||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Additional permissions under GNU GPL version 3 section 7
|
|
||||||
|
|
||||||
If you modify this Program, or any covered work, by linking or
|
|
||||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
|
||||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
|
||||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
|
||||||
(or a modified version of those libraries),
|
|
||||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
|
||||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
|
||||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
|
||||||
licensors of this Program grant you additional
|
|
||||||
permission to convey the resulting work. Corresponding Source for a
|
|
||||||
non-source form of such a combination shall include the source code for
|
|
||||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
|
||||||
work.
|
|
||||||
|
|
||||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
|
||||||
or by snail mail at:
|
|
||||||
Cyan Worlds, Inc.
|
|
||||||
14617 N Newport Hwy
|
|
||||||
Mead, WA 99021
|
|
||||||
|
|
||||||
*==LICENSE==*/
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnOraLib/pnOraLib.h
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
#ifndef PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNORALIB_PNORALIB_H
|
|
||||||
#define PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNORALIB_PNORALIB_H
|
|
||||||
|
|
||||||
// OCCI
|
|
||||||
#define WIN32COMMON
|
|
||||||
#include "occi.h"
|
|
||||||
using namespace oracle;
|
|
||||||
struct OraEnv;
|
|
||||||
|
|
||||||
enum {
|
|
||||||
kOcciPerfOpenConns,
|
|
||||||
kOcciPerfBusyConns,
|
|
||||||
kOcciNumPerf
|
|
||||||
};
|
|
||||||
|
|
||||||
long OraLibGetOcciPerf (unsigned index);
|
|
||||||
|
|
||||||
|
|
||||||
struct OraConn {
|
|
||||||
// treat all fields as read-only
|
|
||||||
OraEnv * oraEnv;
|
|
||||||
occi::Connection * occiConn;
|
|
||||||
wchar_t tag[128];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* OraLib
|
|
||||||
*
|
|
||||||
***/
|
|
||||||
|
|
||||||
void OraLogError (const wchar_t sql[], const exception & e);
|
|
||||||
|
|
||||||
void OraGetShaDigest (
|
|
||||||
occi::Statement * oraStmt,
|
|
||||||
unsigned index,
|
|
||||||
ShaDigest * digest
|
|
||||||
);
|
|
||||||
|
|
||||||
void OraSetShaDigest (
|
|
||||||
occi::Statement * oraStmt,
|
|
||||||
unsigned index,
|
|
||||||
const ShaDigest & digest
|
|
||||||
);
|
|
||||||
|
|
||||||
void OraBindString (
|
|
||||||
occi::Statement * oraStmt,
|
|
||||||
unsigned index,
|
|
||||||
wchar_t * buffer,
|
|
||||||
unsigned chars,
|
|
||||||
ub2 * length,
|
|
||||||
sb2 * indicator
|
|
||||||
);
|
|
||||||
|
|
||||||
void OraBindString (
|
|
||||||
occi::ResultSet * rs,
|
|
||||||
unsigned index,
|
|
||||||
wchar_t * buffer,
|
|
||||||
unsigned chars,
|
|
||||||
ub2 * length,
|
|
||||||
sb2 * indicator
|
|
||||||
);
|
|
||||||
|
|
||||||
void OraGetUuid (
|
|
||||||
occi::Statement * oraStmt,
|
|
||||||
unsigned index,
|
|
||||||
Uuid * uuid
|
|
||||||
);
|
|
||||||
|
|
||||||
void OraSetUuid (
|
|
||||||
occi::Statement * oraStmt,
|
|
||||||
unsigned index,
|
|
||||||
const Uuid & uuid
|
|
||||||
);
|
|
||||||
|
|
||||||
OraConn * OraGetConn (const wchar_t tag[] = nil);
|
|
||||||
|
|
||||||
void OraFreeConn (OraConn *& oraConn);
|
|
||||||
|
|
||||||
occi::Statement * OraGetStmt (
|
|
||||||
OraConn * oraConn,
|
|
||||||
const wchar_t sql[]
|
|
||||||
);
|
|
||||||
|
|
||||||
void OraFreeStmt (occi::Statement *& oraStmt);
|
|
||||||
|
|
||||||
void OraInitialize (
|
|
||||||
const wchar_t username[],
|
|
||||||
const wchar_t password[],
|
|
||||||
const wchar_t connectString[],
|
|
||||||
unsigned stmtCacheSize
|
|
||||||
);
|
|
||||||
void OraShutdown ();
|
|
||||||
void OraDestroy ();
|
|
||||||
|
|
||||||
#endif // PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNORALIB_PNORALIB_H
|
|
Reference in New Issue
Block a user