OCI Call resulting in core dump
Hi,
I have a C++ code that is resulting in segmentation fault when for a particular query define_by_position( ) (this calles OCI odefin()) is called. this function is running in loop and for other queries it successfully completes but for one particular query it always result in seg fault. Code was compiled for Solaris using following compiler with -m64 flag.
[nus825:sr54713] /opt/sfw/bin >> g++ -v
Reading specs from /usr/local/lib/gcc/sparc-sun-solaris2.8/3.4.2/specs
Configured with: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --disable-nls
Thread model: posix
gcc version 3.4.2
Here is the code.
[code]
bool OracleConduit::doSelect(string inputQuery)
{
if(m_cur_numfields!=0)
{
for (int a=0; a<m_cur_numfields;a++){
delete m_cur_info[a].col_data;
}
}
//m_SQL_SelFilesToDelete, colsinfo_3, 1
//doSelect(m_SQL_SelMaxCon,colsinfo_4,1
//doSelect(m_SQL_SelFileToProcess,colsinfo_2,5
if(inputQuery==m_SQL_SelFilesToDelete)
{
FullReplace(inputQuery,"DISP_END_TS","TO_CHAR(DISP_END_TS, 'YYYY-MM-DD HH24:MI:SS')");
m_cur_info = colsinfo_3;
m_cur_numfields =1;
}
else if(inputQuery==m_SQL_SelMaxCon || inputQuery==m_SQL_SelMinCon )
{
m_cur_info = colsinfo_4;
m_cur_numfields = 1;
}
else if(inputQuery==m_SQL_SelFileToProcess)
{
m_cur_info = colsinfo_2;
m_cur_numfields = 4;
}
else if(inputQuery==m_SQL_SelFromCon)
{
m_cur_info = colsinfo;
m_cur_numfields = 17;
}
int a;
oCur.close();
if (oCur.open(&oConn))
{
return false;
}
cout ><< inputQuery.c_str() << endl ;
if (oCur.parse((const unsigned char *)inputQuery.c_str()))
{
return false;
}
/* describe the select-list field "Event_TS" */
for (a=0; a<m_cur_numfields;a++){
m_cur_info[a].col_name_len = sizeof (m_cur_info[a].col_name_buf);
if (oCur.describe(a+1,
&(m_cur_info[a].col_data_len),
&(m_cur_info[a].db_type),
m_cur_info[a].col_name_buf,
&(m_cur_info[a].col_name_len),
&(m_cur_info[a].dsize),
(sb2 *) 0,
(sb2 *) 0,
(sb2 *) 0)
)
{
oCur.display_error(stderr);
return false;
}
/* allocate space for dept name now that you have length */
sword allocLen = m_cur_info[a].col_data_len + 1;
m_cur_info[a].col_data = new text[allocLen];
/* define the output variable for the select-list */
//ub2 rlen, rcode;
//text *datptr = m_cur_info[a].col_data;
//ub1 *cdatptr= (ub1 *)datptr;
cout ><< "oCur.define_by_position" << endl;
if (oCur.define_by_position(a+1,
m_cur_info[a].col_data,
allocLen,
STRING_TYPE,
-1,
&m_cur_info[a].indic,
&m_cur_info[a].rlen,
&m_cur_info[a].rcode)
)
{
oCur.display_error(stderr);
for (a=0; a<m_cur_numfields;a++){
delete m_cur_info[a].col_data;
}
return false;
}
cout ><< "oCur.define_by_position successed" << endl;
}
if (oCur.execute())
{
if (oCur.get_error_code() != NO_DATA_FOUND)
{
oCur.display_error(stderr);
for (a=0; a<m_cur_numfields;a++){
delete m_cur_info[a].col_data;
}
return false;
}
else
return true;
}
else
return true;
}
[/code]>

