#include "dpiImpl.h"
int dpiPool__acquireConnection(dpiPool *pool, const char *userName,
uint32_t userNameLength, const char *password, uint32_t passwordLength,
dpiConnCreateParams *params, dpiConn **conn, dpiError *error)
{
dpiConn *tempConn;
if (dpiGen__allocate(DPI_HTYPE_CONN, pool->env, (void**) &tempConn,
error) < 0)
return DPI_FAILURE;
error->env = pool->env;
if (dpiConn__create(tempConn, pool->env->context, userName, userNameLength,
password, passwordLength, pool->name, pool->nameLength, pool,
NULL, params, error) < 0) {
dpiConn__free(tempConn, error);
return DPI_FAILURE;
}
*conn = tempConn;
return DPI_SUCCESS;
}
static int dpiPool__checkConnected(dpiPool *pool, const char *fnName,
dpiError *error)
{
if (dpiGen__startPublicFn(pool, DPI_HTYPE_POOL, fnName, error) < 0)
return DPI_FAILURE;
if (!pool->handle)
return dpiError__set(error, "check pool", DPI_ERR_NOT_CONNECTED);
return DPI_SUCCESS;
}
int dpiPool__accessTokenCallback(dpiPool *pool, void *authInfo,
UNUSED uint32_t mode)
{
dpiAccessToken accessToken;
dpiError error;
if (dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
memset(&accessToken, 0, sizeof(dpiAccessToken));
if ((*pool->accessTokenCallback)(pool->accessTokenCallbackContext,
&accessToken) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
if (dpiUtils__setAccessTokenAttributes(authInfo, &accessToken,
pool->env->versionInfo, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
return dpiGen__endPublicFn(pool, DPI_SUCCESS, &error);
}
static int dpiPool__create(dpiPool *pool, const char *userName,
uint32_t userNameLength, const char *password, uint32_t passwordLength,
const char *connectString, uint32_t connectStringLength,
const dpiCommonCreateParams *commonParams,
dpiPoolCreateParams *createParams, dpiError *error)
{
int32_t pingInterval;
uint32_t poolMode;
uint8_t getMode;
void *authInfo;
if (createParams->externalAuth &&
((userName && userNameLength > 0) ||
(password && passwordLength > 0)))
return dpiError__set(error, "check mixed credentials",
DPI_ERR_EXT_AUTH_WITH_CREDENTIALS);
if (dpiOci__handleAlloc(pool->env->handle, &pool->handle,
DPI_OCI_HTYPE_SPOOL, "allocate pool handle", error) < 0)
return DPI_FAILURE;
poolMode = DPI_OCI_SPC_STMTCACHE;
if (createParams->homogeneous)
poolMode |= DPI_OCI_SPC_HOMOGENEOUS;
if (dpiOci__handleAlloc(pool->env->handle, &authInfo,
DPI_OCI_HTYPE_AUTHINFO, "allocate authinfo handle", error) < 0)
return DPI_FAILURE;
if (dpiUtils__setAttributesFromCommonCreateParams(authInfo,
DPI_OCI_HTYPE_AUTHINFO, commonParams, error) < 0)
return DPI_FAILURE;
if (commonParams->accessToken) {
if (!createParams->homogeneous || !createParams->externalAuth)
return dpiError__set(error, "check homogeneous and externalAuth",
DPI_ERR_POOL_TOKEN_BASED_AUTH);
if (dpiUtils__setAccessTokenAttributes(authInfo,
commonParams->accessToken, pool->env->versionInfo, error) < 0)
return DPI_FAILURE;
if (createParams->accessTokenCallback) {
if (dpiOci__attrSet(authInfo, DPI_OCI_HTYPE_SESSION,
(void*) pool, 0, DPI_OCI_ATTR_TOKEN_CBKCTX,
"set token callback context", error) < 0)
return DPI_FAILURE;
if (dpiOci__attrSet(authInfo, DPI_OCI_HTYPE_SESSION,
(void*) dpiPool__accessTokenCallback, 0,
DPI_OCI_ATTR_TOKEN_CBK, "set token callback", error) < 0)
return DPI_FAILURE;
}
}
if (createParams->plsqlFixupCallback &&
createParams->plsqlFixupCallbackLength > 0) {
if (dpiUtils__checkClientVersion(pool->env->versionInfo, 12, 2,
error) < 0)
return DPI_FAILURE;
if (dpiOci__attrSet(authInfo, DPI_OCI_HTYPE_AUTHINFO,
(void*) createParams->plsqlFixupCallback,
createParams->plsqlFixupCallbackLength,
DPI_OCI_ATTR_FIXUP_CALLBACK,
"set PL/SQL session state fixup callback", error) < 0)
return DPI_FAILURE;
}
if (dpiOci__attrSet(pool->handle, DPI_OCI_HTYPE_SPOOL, (void*) authInfo, 0,
DPI_OCI_ATTR_SPOOL_AUTH, "set auth info", error) < 0)
return DPI_FAILURE;
getMode = (uint8_t) createParams->getMode;
if (dpiOci__attrSet(pool->handle, DPI_OCI_HTYPE_SPOOL, (void*) &getMode, 0,
DPI_OCI_ATTR_SPOOL_GETMODE, "set get mode", error) < 0)
return DPI_FAILURE;
if (dpiOci__attrSet(pool->handle, DPI_OCI_HTYPE_SPOOL, (void*)
&createParams->timeout, 0, DPI_OCI_ATTR_SPOOL_TIMEOUT,
"set timeout", error) < 0)
return DPI_FAILURE;
if (pool->env->versionInfo->versionNum > 12 ||
(pool->env->versionInfo->versionNum == 12 &&
pool->env->versionInfo->releaseNum >= 2)) {
if (dpiOci__attrSet(pool->handle, DPI_OCI_HTYPE_SPOOL, (void*)
&createParams->waitTimeout, 0, DPI_OCI_ATTR_SPOOL_WAIT_TIMEOUT,
"set wait timeout", error) < 0)
return DPI_FAILURE;
}
if (pool->env->versionInfo->versionNum >= 12) {
if (dpiOci__attrSet(pool->handle, DPI_OCI_HTYPE_SPOOL, (void*)
&createParams->maxLifetimeSession, 0,
DPI_OCI_ATTR_SPOOL_MAX_LIFETIME_SESSION,
"set max lifetime session", error) < 0)
return DPI_FAILURE;
}
if (pool->env->versionInfo->versionNum > 18 ||
(pool->env->versionInfo->versionNum == 18 &&
pool->env->versionInfo->releaseNum >= 3)) {
if (dpiOci__attrSet(pool->handle, DPI_OCI_HTYPE_SPOOL, (void*)
&createParams->maxSessionsPerShard, 0,
DPI_OCI_ATTR_SPOOL_MAX_PER_SHARD,
"set max sessions per shard", error) < 0)
return DPI_FAILURE;
}
if (dpiOci__sessionPoolCreate(pool, connectString, connectStringLength,
createParams->minSessions, createParams->maxSessions,
createParams->sessionIncrement, userName, userNameLength, password,
passwordLength, poolMode, error) < 0)
return DPI_FAILURE;
if (dpiOci__attrSet(pool->handle, DPI_OCI_HTYPE_SPOOL,
(void*) &commonParams->stmtCacheSize, 0,
DPI_OCI_ATTR_SPOOL_STMTCACHESIZE, "set stmt cache size",
error) < 0)
return DPI_FAILURE;
if (pool->env->versionInfo->versionNum >= 23) {
pingInterval = -1;
if (dpiOci__attrSet(pool->handle, DPI_OCI_HTYPE_SPOOL,
(void*) &pingInterval, 0, DPI_OCI_ATTR_PING_INTERVAL,
"disable ping interval", error) < 0)
return DPI_FAILURE;
}
pool->homogeneous = createParams->homogeneous;
pool->externalAuth = createParams->externalAuth;
pool->pingInterval = createParams->pingInterval;
pool->pingTimeout = createParams->pingTimeout;
pool->stmtCacheSize = commonParams->stmtCacheSize;
if (commonParams->accessToken) {
pool->accessTokenCallback = createParams->accessTokenCallback;
pool->accessTokenCallbackContext =
createParams->accessTokenCallbackContext;
pool->externalAuth = 0;
}
return DPI_SUCCESS;
}
void dpiPool__free(dpiPool *pool, dpiError *error)
{
if (pool->handle) {
dpiOci__sessionPoolDestroy(pool, DPI_OCI_SPD_FORCE, 0, error);
pool->handle = NULL;
}
if (pool->env) {
dpiEnv__free(pool->env, error);
pool->env = NULL;
}
dpiUtils__freeMemory(pool);
}
static int dpiPool__getAttributeUint(dpiPool *pool, uint32_t attribute,
uint32_t *value, const char *fnName)
{
dpiError error;
int status;
if (dpiPool__checkConnected(pool, fnName, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(pool, value)
switch (attribute) {
case DPI_OCI_ATTR_SPOOL_MAX_LIFETIME_SESSION:
if (dpiUtils__checkClientVersion(pool->env->versionInfo, 12, 1,
&error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
break;
case DPI_OCI_ATTR_SPOOL_WAIT_TIMEOUT:
if (dpiUtils__checkClientVersion(pool->env->versionInfo, 12, 2,
&error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
break;
case DPI_OCI_ATTR_SPOOL_BUSY_COUNT:
case DPI_OCI_ATTR_SPOOL_OPEN_COUNT:
case DPI_OCI_ATTR_SPOOL_STMTCACHESIZE:
case DPI_OCI_ATTR_SPOOL_TIMEOUT:
break;
case DPI_OCI_ATTR_SPOOL_MAX_PER_SHARD:
if (dpiUtils__checkClientVersion(pool->env->versionInfo, 18, 3,
&error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
break;
default:
dpiError__set(&error, "get attribute value",
DPI_ERR_NOT_SUPPORTED);
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
}
status = dpiOci__attrGet(pool->handle, DPI_OCI_HTYPE_SPOOL, value,
NULL, attribute, "get attribute value", &error);
return dpiGen__endPublicFn(pool, status, &error);
}
static int dpiPool__setAttributeUint(dpiPool *pool, uint32_t attribute,
uint32_t value, const char *fnName)
{
void *ociValue = &value;
uint8_t shortValue;
dpiError error;
int status;
if (dpiPool__checkConnected(pool, fnName, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
switch (attribute) {
case DPI_OCI_ATTR_SPOOL_GETMODE:
shortValue = (uint8_t) value;
ociValue = &shortValue;
break;
case DPI_OCI_ATTR_SPOOL_MAX_LIFETIME_SESSION:
if (dpiUtils__checkClientVersion(pool->env->versionInfo, 12, 1,
&error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
break;
case DPI_OCI_ATTR_SPOOL_WAIT_TIMEOUT:
if (dpiUtils__checkClientVersion(pool->env->versionInfo, 12, 2,
&error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
break;
case DPI_OCI_ATTR_SPOOL_STMTCACHESIZE:
case DPI_OCI_ATTR_SPOOL_TIMEOUT:
break;
case DPI_OCI_ATTR_SPOOL_MAX_PER_SHARD:
if (dpiUtils__checkClientVersion(pool->env->versionInfo, 18, 3,
&error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
break;
default:
dpiError__set(&error, "set attribute value",
DPI_ERR_NOT_SUPPORTED);
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
}
status = dpiOci__attrSet(pool->handle, DPI_OCI_HTYPE_SPOOL, ociValue, 0,
attribute, "set attribute value", &error);
return dpiGen__endPublicFn(pool, status, &error);
}
int dpiPool_acquireConnection(dpiPool *pool, const char *userName,
uint32_t userNameLength, const char *password, uint32_t passwordLength,
dpiConnCreateParams *params, dpiConn **conn)
{
dpiConnCreateParams localParams;
dpiError error;
int status;
if (dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
DPI_CHECK_PTR_AND_LENGTH(pool, userName)
DPI_CHECK_PTR_AND_LENGTH(pool, password)
DPI_CHECK_PTR_NOT_NULL(pool, conn)
if (!params) {
dpiContext__initConnCreateParams(&localParams);
params = &localParams;
}
if (pool->externalAuth && userName && userNameLength > 0 &&
(userName[0] != '[' || userName[userNameLength - 1] != ']')) {
dpiError__set(&error, "verify proxy user name with external auth",
DPI_ERR_EXT_AUTH_INVALID_PROXY);
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error );
}
status = dpiPool__acquireConnection(pool, userName, userNameLength,
password, passwordLength, params, conn, &error);
return dpiGen__endPublicFn(pool, status, &error);
}
int dpiPool_addRef(dpiPool *pool)
{
return dpiGen__addRef(pool, DPI_HTYPE_POOL, __func__);
}
int dpiPool_close(dpiPool *pool, dpiPoolCloseMode mode)
{
dpiError error;
if (dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
if (dpiOci__sessionPoolDestroy(pool, mode, 1, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
return dpiGen__endPublicFn(pool, DPI_SUCCESS, &error);
}
int dpiPool_create(const dpiContext *context, const char *userName,
uint32_t userNameLength, const char *password, uint32_t passwordLength,
const char *connectString, uint32_t connectStringLength,
const dpiCommonCreateParams *commonParams,
dpiPoolCreateParams *createParams, dpiPool **pool)
{
dpiCommonCreateParams localCommonParams;
dpiPoolCreateParams localCreateParams;
dpiPool *tempPool;
dpiError error;
if (dpiGen__startPublicFn(context, DPI_HTYPE_CONTEXT, __func__,
&error) < 0)
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
DPI_CHECK_PTR_AND_LENGTH(context, userName)
DPI_CHECK_PTR_AND_LENGTH(context, password)
DPI_CHECK_PTR_AND_LENGTH(context, connectString)
DPI_CHECK_PTR_NOT_NULL(context, pool)
if (!commonParams) {
dpiContext__initCommonCreateParams(context, &localCommonParams);
commonParams = &localCommonParams;
}
if (!createParams) {
dpiContext__initPoolCreateParams(&localCreateParams);
createParams = &localCreateParams;
}
if (dpiGen__allocate(DPI_HTYPE_POOL, NULL, (void**) &tempPool, &error) < 0)
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
if (dpiEnv__init(tempPool->env, context, commonParams, NULL,
commonParams->createMode | DPI_MODE_CREATE_THREADED, &error) < 0) {
dpiPool__free(tempPool, &error);
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
}
if (dpiPool__create(tempPool, userName, userNameLength, password,
passwordLength, connectString, connectStringLength, commonParams,
createParams, &error) < 0) {
dpiPool__free(tempPool, &error);
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
}
createParams->outPoolName = tempPool->name;
createParams->outPoolNameLength = tempPool->nameLength;
*pool = tempPool;
dpiHandlePool__release(tempPool->env->errorHandles, &error.handle);
return dpiGen__endPublicFn(context, DPI_SUCCESS, &error);
}
int dpiPool_getBusyCount(dpiPool *pool, uint32_t *value)
{
return dpiPool__getAttributeUint(pool, DPI_OCI_ATTR_SPOOL_BUSY_COUNT,
value, __func__);
}
int dpiPool_getEncodingInfo(dpiPool *pool, dpiEncodingInfo *info)
{
dpiError error;
int status;
if (dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(pool, info)
status = dpiEnv__getEncodingInfo(pool->env, info);
return dpiGen__endPublicFn(pool, status, &error);
}
int dpiPool_getGetMode(dpiPool *pool, dpiPoolGetMode *value)
{
dpiError error;
if (dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(pool, value)
if (dpiOci__attrGet(pool->handle, DPI_OCI_HTYPE_SPOOL, value, NULL,
DPI_OCI_ATTR_SPOOL_GETMODE, "get attribute value", &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
return dpiGen__endPublicFn(pool, DPI_SUCCESS, &error);
}
int dpiPool_getMaxLifetimeSession(dpiPool *pool, uint32_t *value)
{
return dpiPool__getAttributeUint(pool,
DPI_OCI_ATTR_SPOOL_MAX_LIFETIME_SESSION, value, __func__);
}
int dpiPool_getMaxSessionsPerShard(dpiPool *pool, uint32_t *value)
{
return dpiPool__getAttributeUint(pool, DPI_OCI_ATTR_SPOOL_MAX_PER_SHARD,
value, __func__);
}
int dpiPool_getOpenCount(dpiPool *pool, uint32_t *value)
{
return dpiPool__getAttributeUint(pool, DPI_OCI_ATTR_SPOOL_OPEN_COUNT,
value, __func__);
}
int dpiPool_getSodaMetadataCache(dpiPool *pool, int *enabled)
{
dpiError error;
if (dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(pool, enabled)
if (dpiUtils__checkClientVersionMulti(pool->env->versionInfo, 19, 11, 21,
3, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
if (dpiOci__attrGet(pool->env->handle, DPI_OCI_HTYPE_ENV, enabled, NULL,
DPI_OCI_ATTR_SODA_METADATA_CACHE, "get SODA metadata cache",
&error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
return dpiGen__endPublicFn(pool, DPI_SUCCESS, &error);
}
int dpiPool_getStmtCacheSize(dpiPool *pool, uint32_t *value)
{
return dpiPool__getAttributeUint(pool, DPI_OCI_ATTR_SPOOL_STMTCACHESIZE,
value, __func__);
}
int dpiPool_getTimeout(dpiPool *pool, uint32_t *value)
{
return dpiPool__getAttributeUint(pool, DPI_OCI_ATTR_SPOOL_TIMEOUT, value,
__func__);
}
int dpiPool_getWaitTimeout(dpiPool *pool, uint32_t *value)
{
return dpiPool__getAttributeUint(pool, DPI_OCI_ATTR_SPOOL_WAIT_TIMEOUT,
value, __func__);
}
int dpiPool_getPingInterval(dpiPool *pool, int *value)
{
dpiError error;
if (dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(pool, value);
*value = pool->pingInterval;
return dpiGen__endPublicFn(pool, DPI_SUCCESS, &error);
}
int dpiPool_release(dpiPool *pool)
{
return dpiGen__release(pool, DPI_HTYPE_POOL, __func__);
}
int dpiPool_reconfigure(dpiPool *pool, uint32_t minSessions,
uint32_t maxSessions, uint32_t sessionIncrement)
{
dpiError error;
uint32_t mode = DPI_OCI_SPC_REINITIALIZE;
if (dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
if (dpiOci__sessionPoolCreate(pool, NULL, 0, minSessions, maxSessions,
sessionIncrement, NULL, 0, NULL, 0, mode, &error) < 0)
return DPI_FAILURE;
return dpiGen__endPublicFn(pool, DPI_SUCCESS, &error);
}
int dpiPool_setGetMode(dpiPool *pool, dpiPoolGetMode value)
{
return dpiPool__setAttributeUint(pool, DPI_OCI_ATTR_SPOOL_GETMODE, value,
__func__);
}
int dpiPool_setAccessToken(dpiPool *pool, dpiAccessToken *accessToken)
{
dpiError error;
void * authInfo;
if (dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(pool, accessToken)
if (dpiOci__attrGet(pool->handle, DPI_OCI_HTYPE_SPOOL, (void *)&authInfo,
NULL, DPI_OCI_ATTR_SPOOL_AUTH,
"get attribute value", &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
if (dpiUtils__setAccessTokenAttributes(authInfo, accessToken,
pool->env->versionInfo, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
return dpiGen__endPublicFn(pool, DPI_SUCCESS, &error);
}
int dpiPool_setMaxLifetimeSession(dpiPool *pool, uint32_t value)
{
return dpiPool__setAttributeUint(pool,
DPI_OCI_ATTR_SPOOL_MAX_LIFETIME_SESSION, value, __func__);
}
int dpiPool_setMaxSessionsPerShard(dpiPool *pool, uint32_t value)
{
return dpiPool__setAttributeUint(pool, DPI_OCI_ATTR_SPOOL_MAX_PER_SHARD,
value, __func__);
}
int dpiPool_setSodaMetadataCache(dpiPool *pool, int enabled)
{
dpiError error;
if (dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
if (dpiUtils__checkClientVersionMulti(pool->env->versionInfo, 19, 11, 21,
3, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
if (dpiOci__attrSet(pool->env->handle, DPI_OCI_HTYPE_ENV, &enabled, 0,
DPI_OCI_ATTR_SODA_METADATA_CACHE, "set SODA metadata cache",
&error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
return dpiGen__endPublicFn(pool, DPI_SUCCESS, &error);
}
int dpiPool_setStmtCacheSize(dpiPool *pool, uint32_t value)
{
pool->stmtCacheSize = value;
return dpiPool__setAttributeUint(pool, DPI_OCI_ATTR_SPOOL_STMTCACHESIZE,
value, __func__);
}
int dpiPool_setTimeout(dpiPool *pool, uint32_t value)
{
return dpiPool__setAttributeUint(pool, DPI_OCI_ATTR_SPOOL_TIMEOUT, value,
__func__);
}
int dpiPool_setWaitTimeout(dpiPool *pool, uint32_t value)
{
return dpiPool__setAttributeUint(pool, DPI_OCI_ATTR_SPOOL_WAIT_TIMEOUT,
value, __func__);
}
int dpiPool_setPingInterval(dpiPool *pool, int value)
{
dpiError error;
if(dpiPool__checkConnected(pool, __func__, &error) < 0)
return dpiGen__endPublicFn(pool, DPI_FAILURE, &error);
pool->pingInterval = value;
return dpiGen__endPublicFn(pool, DPI_SUCCESS, &error);
}