linux下OCI开发Oracle ,OCIServerAttach卡死问题
最近在研究linux下OCI接口,写了一个connect函数,结果不能用,每到OCIServerAttach就会卡死,用gdb调试还会报出
siglongjmp 信号错误 不知道是linux环境没配置正确 还是tnsnames.ora有问题
编译也能通过,程序也能跑起来不报错,就是会卡在OCIServerAttach函数,求大神啊!!!!
代码如下,应该不会是代码的问题T.T
void* __stdcall ictora_connect(char *dsn,char *user,char *pass, int flag)
{
ICTORA_ENV *l_env = NULL;
OCIEnv *myenvhp = NULL;
sword errno = 0;
sword retcode = 0;
char outmsg[512+1];
l_env = (ICTORA_ENV*)malloc(sizeof(ICTORA_ENV));
memset(l_env,0,sizeof(ICTORA_ENV));
//1。初始化OCI运行环境
retcode = OCIEnvCreate((OCIEnv **) &(l_env->l_envhp), (ub4) OCI_DEFAULT,(dvoid *) 0, (dvoid * (*)(dvoid *,size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t)) 0, (void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **) 0);
if(retcode != OCI_SUCCESS)
{
ictora_free_env(l_env);
return NULL;
}
retcode = OCIHandleAlloc( (dvoid *) l_env->l_envhp, (dvoid **) &(l_env->l_errhp), OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0);
if(retcode != OCI_SUCCESS)
{
ictora_free_env(l_env);
return NULL;
}
//2。初始化连接环境资源
retcode = OCIHandleAlloc( (dvoid *) l_env->l_envhp, (dvoid **) &(l_env->l_srvhp), OCI_HTYPE_SERVER,(size_t) 0, (dvoid **) 0);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
retcode = OCIHandleAlloc( (dvoid *) l_env->l_envhp, (dvoid **) &(l_env->l_svchp), OCI_HTYPE_SVCCTX,(size_t) 0, (dvoid **) 0);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
retcode = OCIAttrSet( (dvoid *) l_env->l_svchp, OCI_HTYPE_SVCCTX, (dvoid *)l_env->l_srvhp,(ub4) 0, OCI_ATTR_SERVER, (OCIError *) l_env->l_errhp);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
//3。设置连接属性
printf("Before OCIServerAttach\n");
retcode = OCIServerAttach( l_env->l_srvhp, l_env->l_errhp, (text *)dsn, strlen(dsn), OCI_DEFAULT);
printf("Pass OCIServerAttach\n");
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
retcode = OCIHandleAlloc((dvoid *) l_env->l_envhp,
(dvoid **)&(l_env->l_authp),(ub4) OCI_HTYPE_SESSION,
(size_t) 0, (dvoid **) 0);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
retcode = OCIAttrSet((dvoid*)l_env->l_svchp,(ub4)OCI_HTYPE_SVCCTX,
(dvoid*)l_env->l_authp,(ub4)0,(ub4)OCI_ATTR_SESSION,
(OCIError*)l_env->l_errhp);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
retcode = OCIAttrSet((dvoid *) l_env->l_authp, (ub4) OCI_HTYPE_SESSION,(dvoid *) user, (ub4) strlen((char *)user),(ub4) OCI_ATTR_USERNAME, l_env->l_errhp);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
retcode = OCIAttrSet((dvoid *) l_env->l_authp, (ub4) OCI_HTYPE_SESSION,(dvoid *) pass, (ub4) strlen((char *)pass),(ub4) OCI_ATTR_PASSWORD, l_env->l_errhp);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
//4。连接目标数据库
retcode = OCISessionBegin ( l_env->l_svchp, l_env->l_errhp, l_env->l_authp, OCI_CRED_RDBMS,(ub4) OCI_DEFAULT);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
return l_env;
}