#include "dpiImpl.h"
static const dpiTypeDef dpiAllTypeDefs[DPI_HTYPE_MAX - DPI_HTYPE_NONE - 1] = {
{
"dpiConn", sizeof(dpiConn), 0x49DC600C, (dpiTypeFreeProc) dpiConn__free
},
{
"dpiPool", sizeof(dpiPool), 0x18E1AA4B, (dpiTypeFreeProc) dpiPool__free
},
{
"dpiStmt", sizeof(dpiStmt), 0x31B02B2E, (dpiTypeFreeProc) dpiStmt__free
},
{
"dpiVar", sizeof(dpiVar), 0x2AE8C6DC, (dpiTypeFreeProc) dpiVar__free
},
{
"dpiLob", sizeof(dpiLob), 0xD8F31746, (dpiTypeFreeProc) dpiLob__free
},
{
"dpiObject", sizeof(dpiObject), 0x38616080, (dpiTypeFreeProc) dpiObject__free
},
{
"dpiObjectType", sizeof(dpiObjectType), 0x86036059, (dpiTypeFreeProc) dpiObjectType__free
},
{
"dpiObjectAttr", sizeof(dpiObjectAttr), 0xea6d5dde, (dpiTypeFreeProc) dpiObjectAttr__free
},
{
"dpiSubscr", sizeof(dpiSubscr), 0xa415a1c0, (dpiTypeFreeProc) dpiSubscr__free
},
{
"dpiDeqOptions", sizeof(dpiDeqOptions), 0x70ee498d, (dpiTypeFreeProc) dpiDeqOptions__free
},
{
"dpiEnqOptions", sizeof(dpiEnqOptions), 0x682f3946, (dpiTypeFreeProc) dpiEnqOptions__free
},
{
"dpiMsgProps", sizeof(dpiMsgProps), 0xa2b75506, (dpiTypeFreeProc) dpiMsgProps__free
},
{
"dpiRowid", sizeof(dpiRowid), 0x6204fa04, (dpiTypeFreeProc) dpiRowid__free
},
{
"dpiContext", sizeof(dpiContext), 0xd81b9181, NULL
},
{
"dpiSodaColl", sizeof(dpiSodaColl), 0x3684db22, (dpiTypeFreeProc) dpiSodaColl__free
},
{
"dpiSodaCollCursor", sizeof(dpiSodaCollCursor), 0xcdc73b86, (dpiTypeFreeProc) dpiSodaCollCursor__free
},
{
"dpiSodaDb", sizeof(dpiSodaDb), 0x1f386121, (dpiTypeFreeProc) dpiSodaDb__free
},
{
"dpiSodaDoc", sizeof(dpiSodaDoc), 0xaffd950a, (dpiTypeFreeProc) dpiSodaDoc__free
},
{
"dpiSodaDocCursor", sizeof(dpiSodaDocCursor), 0x80ceb83b, (dpiTypeFreeProc) dpiSodaDocCursor__free
},
{
"dpiQueue", sizeof(dpiQueue), 0x54904ba2, (dpiTypeFreeProc) dpiQueue__free
},
{
"dpiJson", sizeof(dpiJson), 0xf6712bec, (dpiTypeFreeProc) dpiJson__free
},
{
"dpiVector", sizeof(dpiVector), 0x6c3dd6e9, (dpiTypeFreeProc) dpiVector__free
}
};
int dpiGen__addRef(void *ptr, dpiHandleTypeNum typeNum, const char *fnName)
{
dpiError error;
if (dpiGen__startPublicFn(ptr, typeNum, fnName, &error) < 0)
return dpiGen__endPublicFn(ptr, DPI_FAILURE, &error);
dpiGen__setRefCount(ptr, &error, 1);
return dpiGen__endPublicFn(ptr, DPI_SUCCESS, &error);
}
int dpiGen__allocate(dpiHandleTypeNum typeNum, dpiEnv *env, void **handle,
dpiError *error)
{
const dpiTypeDef *typeDef;
dpiBaseType *value;
typeDef = &dpiAllTypeDefs[typeNum - DPI_HTYPE_NONE - 1];
if (dpiUtils__allocateMemory(1, typeDef->size, 1, "allocate handle",
(void**) &value, error) < 0)
return DPI_FAILURE;
value->typeDef = typeDef;
value->checkInt = typeDef->checkInt;
value->refCount = 1;
if (!env && typeNum != DPI_HTYPE_CONTEXT) {
if (dpiUtils__allocateMemory(1, sizeof(dpiEnv), 1, "allocate env",
(void**) &env, error) < 0) {
dpiUtils__freeMemory(value);
return DPI_FAILURE;
}
}
value->env = env;
if (dpiDebugLevel & DPI_DEBUG_LEVEL_REFS)
dpiDebug__print("ref %p (%s) -> 1 [NEW]\n", value, typeDef->name);
*handle = value;
return DPI_SUCCESS;
}
int dpiGen__checkHandle(const void *ptr, dpiHandleTypeNum typeNum,
const char *action, dpiError *error)
{
dpiBaseType *value = (dpiBaseType*) ptr;
const dpiTypeDef *typeDef;
typeDef = &dpiAllTypeDefs[typeNum - DPI_HTYPE_NONE - 1];
if (!ptr || value->typeDef != typeDef ||
value->checkInt != typeDef->checkInt)
return dpiError__set(error, action, DPI_ERR_INVALID_HANDLE,
typeDef->name);
return DPI_SUCCESS;
}
int dpiGen__endPublicFn(const void *ptr, int returnValue, dpiError *error)
{
if (dpiDebugLevel & DPI_DEBUG_LEVEL_FNS)
dpiDebug__print("fn end %s(%p) -> %d\n", error->buffer->fnName, ptr,
returnValue);
if (error->handle)
dpiHandlePool__release(error->env->errorHandles, &error->handle);
return returnValue;
}
int dpiGen__release(void *ptr, dpiHandleTypeNum typeNum, const char *fnName)
{
dpiError error;
if (dpiGen__startPublicFn(ptr, typeNum, fnName, &error) < 0)
return dpiGen__endPublicFn(ptr, DPI_FAILURE, &error);
dpiGen__setRefCount(ptr, &error, -1);
return dpiGen__endPublicFn(ptr, DPI_SUCCESS, &error);
}
void dpiGen__setRefCount(void *ptr, dpiError *error, int increment)
{
dpiBaseType *value = (dpiBaseType*) ptr;
unsigned localRefCount;
if (value->env->threaded)
dpiMutex__acquire(value->env->mutex);
value->refCount += increment;
localRefCount = value->refCount;
if (localRefCount == 0)
dpiUtils__clearMemory(&value->checkInt, sizeof(value->checkInt));
if (value->env->threaded)
dpiMutex__release(value->env->mutex);
if (dpiDebugLevel & DPI_DEBUG_LEVEL_REFS)
dpiDebug__print("ref %p (%s) -> %d\n", ptr, value->typeDef->name,
localRefCount);
if (localRefCount == 0)
(*value->typeDef->freeProc)(value, error);
}
int dpiGen__startPublicFn(const void *ptr, dpiHandleTypeNum typeNum,
const char *fnName, dpiError *error)
{
dpiBaseType *value = (dpiBaseType*) ptr;
if (dpiDebugLevel & DPI_DEBUG_LEVEL_FNS)
dpiDebug__print("fn start %s(%p)\n", fnName, ptr);
if (dpiGlobal__initError(fnName, error) < 0)
return DPI_FAILURE;
if (dpiGen__checkHandle(ptr, typeNum, "check main handle", error) < 0)
return DPI_FAILURE;
error->env = value->env;
return DPI_SUCCESS;
}