I'm working on a new TDM column map exit routine written in C++/C for an installation of distributed Optim TDM, based on a codebase that was written for us several years ago by an IBM consultant. I have only a rough passing knowledge of C++ so I am kind of hacking my way through this code. Managed .NET C# is much more my forte.
The exit routine will process an XML document stored as a clob within a SQL Server varchar(MAX) column, using ODPP to mask specific nodes within the XML doc. I actually have the exit working as intended, with one problem.
My DLL crashes when trying to process rows where the clob size is > 400,000 bytes. I have a hard-coded limit so that my exit immediately bypasses rows where this clob size is too large; this limit-check was carried over from the older codebase I mentioned earlier. When I remove the limit check or increase the limit above 400,000 my DLL crashes; when I keep the limit at 400,000 it runs successfully but I reject/bypass about half the rows in the source table. It is a requirement for this particular application that I keep and process
all source rows.
We are running distributed TDM v11.3 on a Windows server. My exit code is using the various standard ODPP libraries, header files, etc. from our Optim installation. The farthest I can trace the problem to is struct s_PST_CMExitParm function pPSTGetLOBSegment, defined in PSTCMXIT.H. I'm passing in 400000 as the 3rd input parameter for the 'Length of the LOB data segment to be returned'.
Other than the pPSTGetLOBSegment input parameter for LOB length, I'm not seeing anything that I can change to increase the allowable size of the clob; no switch, config setting, etc.
Any guidance, tips, suggestions, etc would be much appreciated. Thanks.
Snippet of s_PST_CMExitParm from PSTCMXIT.H:
/* The following function may be used to get substrings from a LOB
source column. */
short(*pPSTGetLOBSegment)(short, /* Col Handle for the Source
LOB Col */
long, /* Zero based offset of the
1st byte of the LOB data
to be returned. */
long, /* Length of the LOB data
segment to be returned */
void *, /* Pointer to the output buffer
area. It is assumed this
buffer area is at least as
long as the requested segment
length. */
long *, /* Pointer to a return value
that will indicate how
long the full LOB data is */
long *, /* Pointer to a return value
that will indicate how
many bytes were actually
returned. This may be shorter
than the requested length
if the requested substring
exceeds the end LOB data or if
a Multi-byte char of NCHAR
character would not be fully
returned. */
short *); /* Pointer to a short Indicator
variable. After the call, this
field will contain -1 if the
column is NULL. Otherwise,
this field will be zero.
This parameter may be NULL */
------------------------------
Rob Searson
Application Developer
Progressive Insurance
Mayfield Village OH
------------------------------
#InfoSphereOptim#Optim