#include "dpiImpl.h"
static void dpiContext__free(dpiContext *context);
static int dpiContext__create(const char *fnName, unsigned int majorVersion,
unsigned int minorVersion, dpiContextCreateParams *params,
dpiContext **context, dpiError *error)
{
dpiVersionInfo *versionInfo;
dpiContext *tempContext;
if (dpiGlobal__ensureInitialized(fnName, params, &versionInfo, error) < 0)
return DPI_FAILURE;
if (!context)
return dpiError__set(error, "check context handle",
DPI_ERR_NULL_POINTER_PARAMETER, "context");
if (majorVersion != DPI_MAJOR_VERSION || minorVersion > DPI_MINOR_VERSION)
return dpiError__set(error, "check version",
DPI_ERR_VERSION_NOT_SUPPORTED, majorVersion, majorVersion,
minorVersion, DPI_MAJOR_VERSION, DPI_MINOR_VERSION);
if (dpiGen__allocate(DPI_HTYPE_CONTEXT, NULL, (void**) &tempContext,
error) < 0)
return DPI_FAILURE;
tempContext->dpiMinorVersion = (uint8_t) minorVersion;
tempContext->versionInfo = versionInfo;
if (versionInfo->versionNum > 23 ||
(versionInfo->versionNum == 23 && versionInfo->releaseNum >= 4)) {
tempContext->sodaUseJsonDesc = params->sodaUseJsonDesc;
tempContext->useJsonId = params->useJsonId;
} else {
params->sodaUseJsonDesc = 0;
}
if (params->defaultEncoding) {
if (dpiUtils__allocateMemory(1, strlen(params->defaultEncoding) + 1, 0,
"allocate default encoding",
(void**) &tempContext->defaultEncoding, error) < 0) {
dpiContext__free(tempContext);
return DPI_FAILURE;
}
strcpy(tempContext->defaultEncoding, params->defaultEncoding);
}
if (params->defaultDriverName) {
if (dpiUtils__allocateMemory(1, strlen(params->defaultDriverName) + 1,
0, "allocate default driver name",
(void**) &tempContext->defaultDriverName, error) < 0) {
dpiContext__free(tempContext);
return DPI_FAILURE;
}
strcpy(tempContext->defaultDriverName, params->defaultDriverName);
}
*context = tempContext;
return DPI_SUCCESS;
}
static void dpiContext__free(dpiContext *context)
{
if (context->defaultDriverName) {
dpiUtils__freeMemory((void*) context->defaultDriverName);
context->defaultDriverName = NULL;
}
if (context->defaultEncoding) {
dpiUtils__freeMemory((void*) context->defaultEncoding);
context->defaultEncoding = NULL;
}
dpiUtils__freeMemory(context);
}
void dpiContext__initCommonCreateParams(const dpiContext *context,
dpiCommonCreateParams *params)
{
memset(params, 0, sizeof(dpiCommonCreateParams));
if (context->defaultEncoding) {
params->encoding = context->defaultEncoding;
params->nencoding = context->defaultEncoding;
} else {
params->encoding = DPI_CHARSET_NAME_UTF8;
params->nencoding = DPI_CHARSET_NAME_UTF8;
}
if (context->defaultDriverName) {
params->driverName = context->defaultDriverName;
params->driverNameLength =
(uint32_t) strlen(context->defaultDriverName);
} else {
params->driverName = DPI_DEFAULT_DRIVER_NAME;
params->driverNameLength = (uint32_t) strlen(params->driverName);
}
params->stmtCacheSize = DPI_DEFAULT_STMT_CACHE_SIZE;
}
void dpiContext__initConnCreateParams(dpiConnCreateParams *params)
{
memset(params, 0, sizeof(dpiConnCreateParams));
}
void dpiContext__initPoolCreateParams(dpiPoolCreateParams *params)
{
memset(params, 0, sizeof(dpiPoolCreateParams));
params->minSessions = 1;
params->maxSessions = 1;
params->sessionIncrement = 0;
params->homogeneous = 1;
params->getMode = DPI_MODE_POOL_GET_NOWAIT;
params->pingInterval = DPI_DEFAULT_PING_INTERVAL;
params->pingTimeout = DPI_DEFAULT_PING_TIMEOUT;
}
void dpiContext__initSodaOperOptions(dpiSodaOperOptions *options)
{
memset(options, 0, sizeof(dpiSodaOperOptions));
}
void dpiContext__initSubscrCreateParams(dpiSubscrCreateParams *params)
{
memset(params, 0, sizeof(dpiSubscrCreateParams));
params->subscrNamespace = DPI_SUBSCR_NAMESPACE_DBCHANGE;
params->groupingType = DPI_SUBSCR_GROUPING_TYPE_SUMMARY;
}
int dpiContext_createWithParams(unsigned int majorVersion,
unsigned int minorVersion, dpiContextCreateParams *params,
dpiContext **context, dpiErrorInfo *errorInfo)
{
int status, update_use_soda_json_desc = 0;
dpiContextCreateParams localParams;
dpiErrorInfo localErrorInfo;
dpiError error;
if (params) {
if (majorVersion < 5 || (majorVersion == 5 && minorVersion < 2)) {
memcpy(&localParams, params, sizeof(dpiContextCreateParams__v51));
} else {
memcpy(&localParams, params, sizeof(localParams));
update_use_soda_json_desc = 1;
}
} else {
memset(&localParams, 0, sizeof(localParams));
}
if (!localParams.loadErrorUrl)
localParams.loadErrorUrl = DPI_DEFAULT_LOAD_ERROR_URL;
status = dpiContext__create(__func__, majorVersion, minorVersion,
&localParams, context, &error);
if (status < 0) {
dpiError__getInfo(&error, &localErrorInfo);
memcpy(errorInfo, &localErrorInfo, sizeof(dpiErrorInfo__v33));
}
if (update_use_soda_json_desc)
params->sodaUseJsonDesc = localParams.sodaUseJsonDesc;
if (params && !params->oracleClientConfigDir &&
localParams.oracleClientConfigDir)
params->oracleClientConfigDir = localParams.oracleClientConfigDir;
if (dpiDebugLevel & DPI_DEBUG_LEVEL_FNS)
dpiDebug__print("fn end %s -> %d\n", __func__, status);
return status;
}
int dpiContext_destroy(dpiContext *context)
{
char message[80];
dpiError error;
if (dpiGen__startPublicFn(context, DPI_HTYPE_CONTEXT, __func__,
&error) < 0)
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
dpiUtils__clearMemory(&context->checkInt, sizeof(context->checkInt));
if (dpiDebugLevel & DPI_DEBUG_LEVEL_REFS)
dpiDebug__print("ref %p (%s) -> 0\n", context, context->typeDef->name);
if (dpiDebugLevel & DPI_DEBUG_LEVEL_FNS)
(void) sprintf(message, "fn end %s(%p) -> %d", __func__, context,
DPI_SUCCESS);
dpiContext__free(context);
if (dpiDebugLevel & DPI_DEBUG_LEVEL_FNS)
dpiDebug__print("%s\n", message);
return DPI_SUCCESS;
}
int dpiContext_freeStringList(dpiContext *context, dpiStringList *list)
{
dpiError error;
if (dpiGen__startPublicFn(context, DPI_HTYPE_CONTEXT, __func__,
&error) < 0)
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(context, list)
dpiStringList__free(list);
return dpiGen__endPublicFn(context, DPI_SUCCESS, &error);
}
int dpiContext_getClientVersion(const dpiContext *context,
dpiVersionInfo *versionInfo)
{
dpiError error;
if (dpiGen__startPublicFn(context, DPI_HTYPE_CONTEXT, __func__,
&error) < 0)
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(context, versionInfo)
memcpy(versionInfo, context->versionInfo, sizeof(dpiVersionInfo));
return dpiGen__endPublicFn(context, DPI_SUCCESS, &error);
}
void dpiContext_getError(const dpiContext *context, dpiErrorInfo *info)
{
dpiError error;
dpiGlobal__initError(NULL, &error);
dpiGen__checkHandle(context, DPI_HTYPE_CONTEXT, "check handle", &error);
dpiError__getInfo(&error, info);
}
int dpiContext_initCommonCreateParams(const dpiContext *context,
dpiCommonCreateParams *params)
{
dpiError error;
if (dpiGen__startPublicFn(context, DPI_HTYPE_CONTEXT, __func__,
&error) < 0)
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(context, params)
dpiContext__initCommonCreateParams(context, params);
return dpiGen__endPublicFn(context, DPI_SUCCESS, &error);
}
int dpiContext_initConnCreateParams(const dpiContext *context,
dpiConnCreateParams *params)
{
dpiError error;
if (dpiGen__startPublicFn(context, DPI_HTYPE_CONTEXT, __func__,
&error) < 0)
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(context, params)
dpiContext__initConnCreateParams(params);
return dpiGen__endPublicFn(context, DPI_SUCCESS, &error);
}
int dpiContext_initPoolCreateParams(const dpiContext *context,
dpiPoolCreateParams *params)
{
dpiError error;
if (dpiGen__startPublicFn(context, DPI_HTYPE_CONTEXT, __func__,
&error) < 0)
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(context, params)
dpiContext__initPoolCreateParams(params);
return dpiGen__endPublicFn(context, DPI_SUCCESS, &error);
}
int dpiContext_initSodaOperOptions(const dpiContext *context,
dpiSodaOperOptions *options)
{
dpiError error;
if (dpiGen__startPublicFn(context, DPI_HTYPE_CONTEXT, __func__,
&error) < 0)
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(context, options)
dpiContext__initSodaOperOptions(options);
return dpiGen__endPublicFn(context, DPI_SUCCESS, &error);
}
int dpiContext_initSubscrCreateParams(const dpiContext *context,
dpiSubscrCreateParams *params)
{
dpiError error;
if (dpiGen__startPublicFn(context, DPI_HTYPE_CONTEXT, __func__,
&error) < 0)
return dpiGen__endPublicFn(context, DPI_FAILURE, &error);
DPI_CHECK_PTR_NOT_NULL(context, params)
dpiContext__initSubscrCreateParams(params);
return dpiGen__endPublicFn(context, DPI_SUCCESS, &error);
}