In the following example, the Service Provider is initialized.
ODPP_WCHAR *pDestColName = NULL;
DP_MYCTRL_DEF *pMyCtrlBlk = NULL;
short sPrmCount = 0;
short sFldCnt = 0;
short sDstColType = 0;
pMyCtrlBlk = (DP_MYCTRL_DEF *) malloc(sizeof(DP_MYCTRL_DEF));
if(NULL == pMyCtrlBlk)
{
retval = MY_ERR_CTRLBLK_MALLOC_FAILED;
goto OnErrorClean;
}
memset(pMyCtrlBlk, 0, sizeof(DP_MYCTRL_DEF));
pParams = pSvcDef->pParams;
for(sPrmCount = 0; sPrmCount < pSvcDef->sParamCount; sPrmCount ++)
{
{
case PARAM_SRC1_COLINDEX:
{
pMyCtrlBlk->sSrc1ColIndex = (short)pParams->
uiVal;
}
break;
case PARAM_SRC2_COLINDEX:
{
pMyCtrlBlk->sSrc2ColIndex = (short)pParams->
uiVal;
}
break;
case PARAM_DEST_COLINDEX:
{
pMyCtrlBlk->sDestColIndex = (short)pParams->
uiVal;
sDstColType = DEST_COL_TYPE_INDEX;
}
break;
case PARAM_DEST_COLNAME:
{
pDestColName = pParams->
pVal;
sDstColType = DEST_COL_TYPE_NAME;
}
break;
case PARAM_OPERATOR:
{
pMyCtrlBlk->iOperator = (int) pParams->
uiVal;
}
break;
}
MOVENEXT(pParams)
}
if((pMyCtrlBlk->sSrc1ColIndex > pCtrlBlk->sSrcColCount) ||
(pMyCtrlBlk->sSrc2ColIndex > pCtrlBlk->sSrcColCount) ||
(pMyCtrlBlk->sSrc1ColIndex < 0)||
(pMyCtrlBlk->sSrc2ColIndex < 0))
{
retval = MY_ERR_SRC_INDEX_OUT_OF_RANGE;
goto OnErrorClean;
}
switch(sDstColType)
{
case DEST_COL_TYPE_NAME:
{
if(pDestColName == NULL)
{
retval = MY_ERR_DESTCOL_NULL;
goto OnErrorClean;
}
pFieldDef = pCtrlBlk->pFldDef;
for(sFldCnt = 0; sFldCnt < pSvcDef->sFldCount; sFldCnt++)
{
break;
MOVENEXT(pFieldDef)
}
if(sFldCnt >= pSvcDef->sFldCount)
{
retval = MY_ERR_INVALID_DEST_COLNAME;
goto OnErrorClean;
}
pMyCtrlBlk->sDestColIndex = sFldCnt;
}
break;
case DEST_COL_TYPE_INDEX :
{
pFieldDef = pCtrlBlk-> pFldDef;
if((pMyCtrlBlk->sDestColIndex > pSvcDef->sFldCount) ||
(pMyCtrlBlk->sDestColIndex < 0))
{
retval = MY_ERR_DST_INDEX_OUT_OF_RANGE;
goto OnErrorClean;
}
for(sFldCnt = 0; sFldCnt < pMyCtrlBlk->sDestColIndex ; sFldCnt++)
{
MOVENEXT(pFieldDef)
}
}
break;
default :
retval = MY_ERR_INVALID_DEST_COLUMN;
goto OnErrorClean;
}
pMyCtrlBlk->pDstCol = pFieldDef;
pSrcCols = &pCtrlBlk->SrcCol;
while(NULL != pSrcCols)
{
{
break;
default:
retval = MY_ERR_SRC_COL_DATATYPE_NOTSUPPORTED;
goto OnErrorClean;
}
pSrcCols = pSrcCols->
pNext;
}
switch(pMyCtrlBlk->pDstCol->sDatatype)
{
break;
default:
retval = MY_ERR_DST_COL_DATATYPE_NOTSUPPORTED;
goto OnErrorClean;
}
pCtrlBlk->pExt = (void *)pMyCtrlBlk;
return ODPPSUCCESS;
OnErrorClean:
if(NULL != pMyCtrlBlk)
{
free(pMyCtrlBlk);
pMyCtrlBlk = NULL;
}
return retval;
}