Re: sqlstm.sqharc What is it? And what does it do? It keeps getting corrupted on me.

From: <44dd44_at_gmail.com>
Date: Mon, 4 Feb 2008 08:02:28 -0800 (PST)
Message-ID: <aa0846c0-852b-4eb5-bb2e-3647e729c362@s8g2000prg.googlegroups.com>


Thanks for your reply, Mark.
So far all the research I've been doing has also pointed me to a memory error. I've checked my code, and all variables are memset w/ '\0' and sizeof().
I got as far as finding that the sqlstm.sqharc is sometimes either stepped on or not populated. That's why the question in the title. If I can find how how it gets populated, then maybe I can find out what's stepping on it.
Regards
Tom

On Feb 2, 8:53 pm, Mark D Powell <Mark.Pow..._at_eds.com> wrote:
> On Jan 31, 12:20 pm, 44d..._at_gmail.com wrote:
>
> > This is generated by a Pro*C compiler running on an AIX box.
> > It usually contains the proper data, but every once in a while, and
> > only on 2 certain record types, it gets populated w/ blanks. If I
> > process those record types separately, then there's no problem w/ any
> > of the record types (there are 7 of them for the record).
>
> > So, what is sqharc, and how does it get populated? The pre-compiler
> > generated code doesn't populate it anywhere. I've searched online, but
> > the only hits I get are copies of code from people asking for help w/
> > problems.
> > As for documentation, I haven't found any that help. I've searched
> > both IBM and Oracle sites. Nada e niente.
>
> > I copied the code below, but it's all generated by the pre-compiler,
> > and the original is very basic - initialize the necessary fields and
> > do a SELECT to return 1 row.
>
> > Can anybody help?
> > Regards
> > Tom
>
> > good value --
> > populated sqpind w/ sqindv - 0
> > populated sqpins w/ sqinds - 0
> > populated sqparm w/ sqharm - 0
> > getting sqharc - 9001000a0059bf0
> > populated sqparc w/ sqharc - 9001000a0059bf0
>
> > bad value --
> > populated sqpind w/ sqindv - 0
> > populated sqpins w/ sqinds - 0
> > populated sqparm w/ sqharm - 0
> > getting sqharc - 2020202020202020
> > populated sqparc w/ sqharc - 2020202020202020
>
> > Here's the original code, the generated code is below --
> > init();
>
> > sprintf(tmpSeqno, "%06d", numSeqno);
> > strncpy(tmpConnectionid,
> > retransmissionrequestStruct.cFromConnectionID,
> > sizeof(retransmissionrequestStruct.cFromConnectionID));
>
> > string stringCmd("SELECT NVL(OUT_EVENT_ID,
> > 0),NVL(TO_CHAR(BUS_DATE,'DD-MON-YYYY'),'
> > '),NVL(TO_CHAR(TIME_ON_OUTEVENT,'DD-MON-YYYY HH24:MI:SS'),'
> > '),NVL(TO_CHAR(TIME_OFF_OUTEVENT
> > ,'DD-MON-YYYY HH24:MI:SS'),' '),NVL(AS_IS_ID,
> > 0),NVL(TO_CHAR(T1_TIME,'DD-MON-YYYY HH24:MI:SS'),'
> > '),NVL(TO_CHAR(T1_5_TIME,'DD-MON-YYYY HH24:MI:SS'),'
> > '),NVL(TO_CHAR(T2_TIME,'DD-MON-
> > YYYY HH24:MI:SS'),' '),NVL(TO_CHAR(T3_TIME,'DD-MON-YYYY HH24:MI:SS'),'
> > '),NVL(TO_CHAR(T4_TIME,'DD-MON-YYYY HH24:MI:SS'),'
> > '),NVL(TO_CHAR(T5_TIME,'DD-MON-YYYY HH24:MI:SS'),' '),NVL(
> > TO_CHAR(T6_TIME,'DD-MON-YYYY HH24:MI:SS'),' '),NVL(MESSAGE_ID,'
> > '),NVL(MESSAGE_TYPE,' '),NVL(OUT_SEQ_NO,' '),NVL(OUT_VERSION_NO,'
> > '),NVL(SUBSCRIBER_ID,' '),NVL(OUT_CONNECTION_ID,'
> > '),NVL(OUT_ACCOUNT_ID,' '),NVL(STATUS_IND,'
> > '),NVL(TRAILING_OUT_MSG_DATA,' '),NVL(REJECT_CODE,' ')");
>
> > stringCmd.append(whereClause1);
> > stringCmd.append(tmpSeqno);
> > stringCmd.append(whereClause2);
> > stringCmd.append(tmpConnectionid);
> > stringCmd.append(whereClause3);
>
> > stringCmd.copy(cmd,stringCmd.size());
>
> > EXEC SQL EXECUTE
> > BEGIN
> > EXECUTE IMMEDIATE :cmd
> > INTO :sqliOutEventKey,
> > :sqlcBusinessDate,
> > :sqlcTimeOnOutEvent,
> > :sqlcTimeOffOutEvent,
> > :sqliAsIsKey,
> > :sqlcT1,
> > :sqlcT1_5,
> > :sqlcT2,
> > :sqlcT3,
> > :sqlcT4,
> > :sqlcT5,
> > :sqlcT6,
> > :sqlcMsgID,
> > :sqlcMsgType,
> > :sqlcMsgSeqno,
> > :sqlcVersion,
> > :sqlcSubscriberID,
> > :sqlcConnectionID,
> > :sqlcAccountID,
> > :sqlcStatus,
> > :sqlcOutTrailingMsgData,
> > :sqlcErrorCode;
> > END;
> > END-EXEC;
>
> > Here's the generated code --
> > struct sqlexd sqlstm;
> > sqlstm.sqlvsn = 12;
> > sqlstm.arrsiz = 23;
> > sqlstm.sqladtp = &sqladt;
> > sqlstm.sqltdsp = &sqltds;
> > sqlstm.stmt = "begin EXECUTE IMMEDIATE :cmd
> > INTO :sqliOutEventKey , :sqlc\
> > BusinessDate , :sqlcTimeOnOutEvent , :sqlcTimeOffOutEvent , :sqliAsIsKey , :sq
> > \
> > lcT1 , :sqlcT1_5 , :sqlcT2 , :sqlcT3 , :sqlcT4 , :sqlcT5 , :sqlcT6 , :sqlcMsgI
> > \
> > D , :sqlcMsgType , :sqlcMsgSeqno , :sqlcVersion , :sqlcSubscriberID , :sqlcCon
> > \
> > nectionID , :sqlcAccountID , :sqlcStatus , :sqlcOutTrailingMsgData , :sqlcErro
> > \
> > rCode ; END ;";
> > sqlstm.iters = (unsigned int )1;
> > sqlstm.offset = (unsigned int )5;
> > sqlstm.cud = sqlcud0;
> > sqlstm.sqlest = (unsigned char *)&sqlca;
> > sqlstm.sqlety = (unsigned short)256;
> > sqlstm.occurs = (unsigned int )0;
> > sqlstm.sqhstv[0] = (unsigned char *)cmd;
> > sqlstm.sqhstl[0] = (unsigned long )4096;
> > sqlstm.sqhsts[0] = ( int )0;
> > sqlstm.sqindv[0] = ( short *)0;
> > sqlstm.sqinds[0] = ( int )0;
> > sqlstm.sqharm[0] = (unsigned long )0;
> > sqlstm.sqadto[0] = (unsigned short )0;
> > sqlstm.sqtdso[0] = (unsigned short )0;
> > sqlstm.sqhstv[1] = (unsigned char *)&sqliOutEventKey;
> > sqlstm.sqhstl[1] = (unsigned long )sizeof(long);
> > sqlstm.sqhsts[1] = ( int )0;
> > sqlstm.sqindv[1] = ( short *)0;
> > sqlstm.sqinds[1] = ( int )0;
> > sqlstm.sqharm[1] = (unsigned long )0;
> > sqlstm.sqadto[1] = (unsigned short )0;
> > sqlstm.sqtdso[1] = (unsigned short )0;
> > sqlstm.sqhstv[2] = (unsigned char *)sqlcBusinessDate;
> > sqlstm.sqhstl[2] = (unsigned long )32;
> > sqlstm.sqhsts[2] = ( int )0;
> > sqlstm.sqindv[2] = ( short *)0;
> > sqlstm.sqinds[2] = ( int )0;
> > sqlstm.sqharm[2] = (unsigned long )0;
> > sqlstm.sqadto[2] = (unsigned short )0;
> > sqlstm.sqtdso[2] = (unsigned short )0;
> > sqlstm.sqhstv[3] = (unsigned char *)sqlcTimeOnOutEvent;
> > sqlstm.sqhstl[3] = (unsigned long )32;
> > sqlstm.sqhsts[3] = ( int )0;
> > sqlstm.sqindv[3] = ( short *)0;
> > sqlstm.sqinds[3] = ( int )0;
> > sqlstm.sqharm[3] = (unsigned long )0;
> > sqlstm.sqadto[3] = (unsigned short )0;
> > sqlstm.sqtdso[3] = (unsigned short )0;
> > sqlstm.sqhstv[4] = (unsigned char *)sqlcTimeOffOutEvent;
> > sqlstm.sqhstl[4] = (unsigned long )32;
> > sqlstm.sqhsts[4] = ( int )0;
> > sqlstm.sqindv[4] = ( short *)0;
> > sqlstm.sqinds[4] = ( int )0;
> > sqlstm.sqharm[4] = (unsigned long )0;
> > sqlstm.sqadto[4] = (unsigned short )0;
> > sqlstm.sqtdso[4] = (unsigned short )0;
> > sqlstm.sqhstv[5] = (unsigned char *)&sqliAsIsKey;
> > sqlstm.sqhstl[5] = (unsigned long )sizeof(long);
> > sqlstm.sqhsts[5] = ( int )0;
> > sqlstm.sqindv[5] = ( short *)0;
> > sqlstm.sqinds[5] = ( int )0;
> > sqlstm.sqharm[5] = (unsigned long )0;
> > sqlstm.sqadto[5] = (unsigned short )0;
> > sqlstm.sqtdso[5] = (unsigned short )0;
> > sqlstm.sqhstv[6] = (unsigned char *)sqlcT1;
> > sqlstm.sqhstl[6] = (unsigned long )32;
> > sqlstm.sqhsts[6] = ( int )0;
> > sqlstm.sqindv[6] = ( short *)0;
> > sqlstm.sqinds[6] = ( int )0;
> > sqlstm.sqharm[6] = (unsigned long )0;
> > sqlstm.sqadto[6] = (unsigned short )0;
> > sqlstm.sqtdso[6] = (unsigned short )0;
> > sqlstm.sqhstv[7] = (unsigned char *)sqlcT1_5;
> > sqlstm.sqhstl[7] = (unsigned long )32;
> > sqlstm.sqhsts[7] = ( int )0;
> > sqlstm.sqindv[7] = ( short *)0;
> > sqlstm.sqinds[7] = ( int )0;
> > sqlstm.sqharm[7] = (unsigned long )0;
> > sqlstm.sqadto[7] = (unsigned short )0;
> > sqlstm.sqtdso[7] = (unsigned short )0;
> > sqlstm.sqhstv[8] = (unsigned char *)sqlcT2;
> > sqlstm.sqhstl[8] = (unsigned long )32;
> > sqlstm.sqhsts[8] = ( int )0;
> > sqlstm.sqindv[8] = ( short *)0;
> > sqlstm.sqinds[8] = ( int )0;
> > sqlstm.sqharm[8] = (unsigned long )0;
> > sqlstm.sqadto[8] = (unsigned short )0;
> > sqlstm.sqtdso[8] = (unsigned short )0;
> > sqlstm.sqhstv[9] = (unsigned char *)sqlcT3;
> > sqlstm.sqhstl[9] = (unsigned long )32;
> > sqlstm.sqhsts[9] = ( int )0;
> > sqlstm.sqindv[9] = ( short *)0;
> > sqlstm.sqinds[9] = ( int )0;
> > sqlstm.sqharm[9] = (unsigned long )0;
> > sqlstm.sqadto[9] = (unsigned short )0;
> > sqlstm.sqtdso[9] = (unsigned short )0;
> > sqlstm.sqhstv[10] = (unsigned char *)sqlcT4;
> > sqlstm.sqhstl[10] = (unsigned long )32;
> > sqlstm.sqhsts[10] = ( int )0;
> > sqlstm.sqindv[10] = ( short *)0;
> > sqlstm.sqinds[10] = ( int )0;
> > sqlstm.sqharm[10] = (unsigned long )0;
> > sqlstm.sqadto[10] = (unsigned short )0;
> > sqlstm.sqtdso[10] = (unsigned short )0;
> > sqlstm.sqhstv[11] = (unsigned char *)sqlcT5;
> > sqlstm.sqhstl[11] = (unsigned long )32;
> > sqlstm.sqhsts[11] = ( int )0;
> > sqlstm.sqindv[11] = ( short *)0;
> > sqlstm.sqinds[11] = ( int )0;
> > sqlstm.sqharm[11] = (unsigned long )0;
> > sqlstm.sqadto[11] = (unsigned short )0;
> > sqlstm.sqtdso[11] = (unsigned short )0;
> > sqlstm.sqhstv[12] = (unsigned char *)sqlcT6;
> > sqlstm.sqhstl[12] = (unsigned long )32;
> > sqlstm.sqhsts[12] = ( int )0;
> > sqlstm.sqindv[12] = ( short *)0;
> > sqlstm.sqinds[12] = ( int )0;
> > sqlstm.sqharm[12] = (unsigned long )0;
> > sqlstm.sqadto[12] = (unsigned short )0;
> > sqlstm.sqtdso[12] = (unsigned short )0;
> > sqlstm.sqhstv[13] = (unsigned char *)sqlcMsgID;
> > sqlstm.sqhstl[13] = (unsigned long )15;
> > sqlstm.sqhsts[13] = ( int )0;
> > sqlstm.sqindv[13] = ( short *)0;
> > sqlstm.sqinds[13] = ( int )0;
> > sqlstm.sqharm[13] = (unsigned long )0;
> > sqlstm.sqadto[13] = (unsigned short )0;
> > sqlstm.sqtdso[13] = (unsigned short )0;
> > sqlstm.sqhstv[14] = (unsigned char *)sqlcMsgType;
> > sqlstm.sqhstl[14] = (unsigned long )2;
> > sqlstm.sqhsts[14] = ( int )0;
> > sqlstm.sqindv[14] = ( short *)0;
> > sqlstm.sqinds[14] = ( int )0;
> > sqlstm.sqharm[14] = (unsigned long )0;
> > sqlstm.sqadto[14] = (unsigned short )0;
> > sqlstm.sqtdso[14] = (unsigned short )0;
> > sqlstm.sqhstv[15] = (unsigned char *)sqlcMsgSeqno;
> > sqlstm.sqhstl[15] = (unsigned long )6;
> > sqlstm.sqhsts[15] = ( int )0;
> > sqlstm.sqindv[15] = ( short *)0;
> > sqlstm.sqinds[15] = ( int )0;
> > sqlstm.sqharm[15] = (unsigned long )0;
> > sqlstm.sqadto[15] = (unsigned short )0;
> > sqlstm.sqtdso[15] = (unsigned short )0;
> > sqlstm.sqhstv[16] = (unsigned char *)sqlcVersion;
> > sqlstm.sqhstl[16] = (unsigned long )3;
> > sqlstm.sqhsts[16] = ( int )0;
> > sqlstm.sqindv[16] = ( short *)0;
> > sqlstm.sqinds[16] = ( int )0;
> > sqlstm.sqharm[16] = (unsigned long )0;
> > sqlstm.sqadto[16] = (unsigned short )0;
> > sqlstm.sqtdso[16] = (unsigned short )0;
> > sqlstm.sqhstv[17] = (unsigned char *)sqlcSubscriberID;
> > sqlstm.sqhstl[17] = (unsigned long )4;
> > sqlstm.sqhsts[17] = ( int )0;
> > sqlstm.sqindv[17] = ( short *)0;
> > sqlstm.sqinds[17] = ( int )0;
> > sqlstm.sqharm[17] = (unsigned long )0;
> > sqlstm.sqadto[17] = (unsigned short )0;
> > sqlstm.sqtdso[17] = (unsigned short )0;
> > sqlstm.sqhstv[18] = (unsigned char *)sqlcConnectionID;
> > sqlstm.sqhstl[18] = (unsigned long )4;
> > sqlstm.sqhsts[18] = ( int )0;
> > sqlstm.sqindv[18] = ( short *)0;
> > sqlstm.sqinds[18] = ( int )0;
> > sqlstm.sqharm[18] = (unsigned long )0;
> > sqlstm.sqadto[18] = (unsigned short )0;
> > sqlstm.sqtdso[18] = (unsigned short )0;
> > sqlstm.sqhstv[19] = (unsigned char *)sqlcAccountID;
> > sqlstm.sqhstl[19] = (unsigned long )4;
> > sqlstm.sqhsts[19] = ( int )0;
> > sqlstm.sqindv[19] = ( short *)0;
> > sqlstm.sqinds[19] = ( int )0;
> > sqlstm.sqharm[19] = (unsigned long )0;
> > sqlstm.sqadto[19] = (unsigned short )0;
> > sqlstm.sqtdso[19] = (unsigned short )0;
> > sqlstm.sqhstv[20] = (unsigned char *)sqlcStatus;
> > sqlstm.sqhstl[20] = (unsigned long )1;
> > sqlstm.sqhsts[20] = ( int )0;
> > sqlstm.sqindv[20] = ( short *)0;
> > sqlstm.sqinds[20] = ( int )0;
> > sqlstm.sqharm[20] = (unsigned long )0;
> > sqlstm.sqadto[20] = (unsigned short )0;
> > sqlstm.sqtdso[20] = (unsigned short )0;
> > sqlstm.sqhstv[21] = (unsigned char *)sqlcOutTrailingMsgData;
> > sqlstm.sqhstl[21] = (unsigned long )256;
> > sqlstm.sqhsts[21] = ( int )0;
> > sqlstm.sqindv[21] = ( short *)0;
> > sqlstm.sqinds[21] = ( int )0;
> > sqlstm.sqharm[21] = (unsigned long )0;
> > sqlstm.sqadto[21] = (unsigned short )0;
> > sqlstm.sqtdso[21] = (unsigned short )0;
> > sqlstm.sqhstv[22] = (unsigned char *)sqlcErrorCode;
> > sqlstm.sqhstl[22] = (unsigned long )4;
> > sqlstm.sqhsts[22] = ( int )0;
> > sqlstm.sqindv[22] = ( short *)0;
> > sqlstm.sqinds[22] = ( int )0;
> > sqlstm.sqharm[22] = (unsigned long )0;
> > sqlstm.sqadto[22] = (unsigned short )0;
> > sqlstm.sqtdso[22] = (unsigned short )0;
> > sqlstm.sqphsv = sqlstm.sqhstv;
> > sqlstm.sqphsl = sqlstm.sqhstl;
> > sqlstm.sqphss = sqlstm.sqhsts;
> > sqlstm.sqpind = sqlstm.sqindv;
> > sqlstm.sqpins = sqlstm.sqinds;
> > sqlstm.sqparm = sqlstm.sqharm;
> > sqlstm.sqparc = sqlstm.sqharc;
> > sqlstm.sqpadto = sqlstm.sqadto;
> > sqlstm.sqptdso = sqlstm.sqtdso;
> > sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
>
> I did not read the code carefully because it the gererated code rather
> than just the original pro*c but normally most problems the developers
> I have worked with suffer come down to the following things: failure
> to properly terminate C strings, failure to set and check the length
> indicator, failure to declare and check null indicators for every
> nullable column, and failure to handle errors properly.
>
> Because you can get the data when you process the failing rows without
> the other data that implies that you are likely suffering from some
> type of overflow or data handling condition.
>
> HTH -- Mark D Powell --
Received on Mon Feb 04 2008 - 10:02:28 CST

Original text of this message