//-------- a) SetColumns example -------------
HRESULT hRes;
LPMAPITABLE pTbl = .. //gotten from elsewhere
SizedSPropTagArray(5,sptCols) =
{5, PR_DISPLAY_TO,
PR_NORMALIZED_SUBJECT,
PR_CLIENT_SUBMIT_TIME,
PR_ENTRYID, PR_OBJECT_TYPE};
hRes = pTbl->SetColumns(
(LPSPropTagArray) &sptCols, TBL_BATCH);
//-------- b) SortTable example --------------
SizedSSortOrderSet(2, sSort) =
{2, 0, 0,
{{PR_DISPLAY_TO, TABLE_SORT_ASCEND},
{PR_CLIENT_SUBMIT_TIME,
TABLE_SORT_DESCEND}}};
hRes = pTbl->SortTable(
(LPSSortOrderSet)&sSort, TBL_BATCH);
//-------- c) Restrict example ---------------
SRestriction srRoot, srLevel1[2];
SPropValue spvSubj;
spvSubj.ulPropTag = PR_NORMALIZED_SUBJECT;
spvSubj.Value.lpszA = "C/C++ User's Journal";
// Root &&
srRoot.rt = RES_AND;
srRoot.res.resAnd.cRes = 2;
srRoot.res.resAnd.lpRes = srLevel1;
// Subject contains "C/C++ User's Journal"
srLevel1[0].rt = RES_CONTENT;
srLevel1[0].res.resProperty.relop =
FL_SUBSTRING;
srLevel1[0].res.resProperty.ulPropTag =
PR_SUBJECT;
srLevel1[0].res.resProperty.lpProp = &spvSubj;
// Body > 100
srLevel1[1].rt = RES_SIZE;
srLevel1[1].res.resSize.relop = RELOP_GT;
srLevel1[1].res.resSize.ulPropTag = PR_BODY;
srLevel1[1].res.resSize.cb = 100;
hRes = pTbl -> Restrict(&srRoot, TBL_BATCH);
//-------- d) Subrestriction example --------
SRestriction srRoot,srSub;
SpropValue spvName;
spvName.ulPropTag = PR_DISPLAY_NAME;
spvName.Value.lpszA = "Les Thaler";
srSub.rt =
RES_CONTENT;
srSub.res.resContent.ulFuzzyLevel =
FL_SUBSTRING;
srSub.res.resContent.ulPropTag =
PR_DISPLAY_NAME;
srSub.res.resContent.lpProp = &spvName;
srRoot.rt = RES_SUBRESTRICTION;
srRoot.res.resSub.ulSubObject =
PR_MESSAGE_RECIPIENTS;
srRoot.res.resSub.lpRes = &srSub;
hRes = pTbl -> Restrict(&srRoot,TBL_BATCH);
//-------- e) SeekRow and SeekRowApprox ------
// Seek to the first row in the view
hRes = pTbl -> SeekRow(
BOOKMARK_BEGINNING, 0, NULL);
// Seek to the halfway point
hRes = pTbl -> SeekRowApprox(500, 1000);
//-------- f) QueryRows example --------------
STDMETHODIMP HrQueryRows(
LPMAPITABLE pTbl, ULONG ulCnt,
LPSRowSet * pprs)
{
LPSRowSet prsTmp, prsTmp2;
HRESULT hRes =
pTbl -> QueryRows(ulCnt,0,pprs);
if (FAILED(hRes) ||
((*pprs) -> cRows == ulCnt))
return hRes;
// we're either at end of table, or
// implementation is lazy. Keep getting rows
// and merge into correct sized SRowSet
ulCnt -= (*pprs) -> cRows;
while (ulCnt)
{
prsTmp = NULL;
prsTmp2 = NULL;
if (FAILED(hRes =
pTbl -> QueryRows(ulCnt,0,&prsTmp)))
goto Quit;
if (prsTmp -> cRows)
{
if (SUCCEEDED(hRes =
MergeRows(*pprs,prsTmp,&prsTmp2)))
{
FreeProws(*pprs);
*pprs = prsTmp2;
ulCnt -= prsTmp -> cRows;
}
FreeProws(prsTmp);
if (FAILED(hRes)) goto Quit;
}
else
break; // yes, Gloria, we're really
// at the end
}
Quit:
if (FAILED(hRes)) *pprs = NULL;
return hRes;
}
//End of File