2025-11-28 00:35:46 +09:00

14014 lines
389 KiB
C++

//--------------------------------------------------------------------
// Microsoft OLE DB Test
//
// Copyright 1995-2000 Microsoft Corporation.
//
// @doc
//
// @module IROWFIND.CPP | Template source file for all test modules.
//
#include "modstandard.hpp"
#define DBINITCONSTANTS // Must be defined to initialize constants in OLEDB.H
#define INITGUID
#include "irowfind.h"
#include <float.h>
#include <msdaguid.h> // CLSID_OLEDB_CONVERSIONLIBRARY
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Module Values
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// {{ TCW_MODULE_GLOBALS
DECLARE_MODULE_CLSID = { 0x9eb41234, 0x15cc, 0x11d1, { 0xa8, 0x7f, 0x00, 0xc0, 0x4f, 0xd7, 0xa0, 0xf5 }};
DECLARE_MODULE_NAME("IRowsetFind");
DECLARE_MODULE_OWNER("Microsoft");
DECLARE_MODULE_DESCRIP("Tests the IRowsetFind interface");
DECLARE_MODULE_VERSION(795921705);
// TCW_WizardVersion(2)
// TCW_Automation(True)
// }} TCW_MODULE_GLOBALS_END
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Globals
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CTable * g_pCTable=NULL; //Global table
CTable * g_pEmptyTable = NULL; //Empty table
CTable * g_p1RowTable = NULL; //One row table
IDBCreateSession * g_pIDBCreateSession = NULL; //pointer to IDBCreateSession interface
IDBCreateCommand * g_pIDBCreateCommand = NULL; //pointer to IDBCreateComand interface
DBORDINAL g_ulColNum; // Column number to test FindValue match on.
DBTYPE g_wColType; // DBTYPE of that column
DBROWCOUNT g_lRowLast; // the index of last row in g_pCTable.
LONG_PTR g_lNullCollation; // contains the value of the NULL_COLLATION property
ULONG g_ulDCVer = 0x200;
// Interface for IDataConvert, gotten by CoCreateInstance
IDataConvert * g_pIDataConvert=NULL;
enum ePrptIdx
{
IDX_Bookmarks=0,
IDX_OrderedBookmarks,
IDX_LiteralBookmarks,
IDX_FetchBackwards,
IDX_ScrollBackwards,
IDX_CanHoldRows,
IDX_RemoveDeleted,
IDX_BookmarkSkipped,
IDX_OtherUpdateDelete,
IDX_OtherInsert,
IDX_BookmarkType,
IDX_IRowsetDeleteBookmarks,
IDX_IRowsetChange,
IDX_IRowsetLocate
};
enum eSUBCOMPAREOP
{
SUBOP_EMPTY,
SUBOP_ALWAYS_EQ,
SUBOP_CONTAINS_BEGIN,
SUBOP_CONTAINS_MIDDLE,
SUBOP_CONTAINS_END,
SUBOP_CASESENSITIVE,
SUBOP_CASEINSENSITIVE,
SUBOP_ALWAYS_NULL
};
#define PROPERTY_COUNT IDX_IRowsetLocate+1
//record the properties default values
struct DBPrptRecord
{
BOOL fSupported;
BOOL fDefault;
} g_rgDBPrpt[PROPERTY_COUNT];
struct FindValueInfo
{
DBSTATUS dbsStatus;
DBLENGTH cbLength;
void *pValue;
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Defines
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#define RESTART TRUE
#define USE_STREAM TRUE
#define USE_DBTYPE_EMPTY TRUE
#define TESTC_DRIVER(exp) { if((exp)==FALSE) { odtLog << L"NotSupported by Driver, skipping Variation\n"; fTestPass=TEST_SKIPPED; goto CLEANUP; } }
inline ULONG MYABS(short s)
{
return ( s >= 0 ? s : -s );
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// prototypes
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static BOOL IsDBTYPEFindable(DBTYPE wType);
static void FindVariantTypes(IRowset *pIRowset, CTable *pTable);
// Return TRUE for only DBTYPEs that match an OLE VARIANT TYPE.
static BOOL IsOleVarEnumType( DBTYPE wdbType )
{
switch ( wdbType )
{
case DBTYPE_STR:
case DBTYPE_WSTR:
case DBTYPE_BYTES:
case DBTYPE_NUMERIC:
case DBTYPE_DBTIME:
case DBTYPE_DBDATE:
case DBTYPE_DBTIMESTAMP:
case DBTYPE_GUID:
case DBTYPE_VARNUMERIC:
case DBTYPE_FILETIME:
case DBTYPE_PROPVARIANT:
return FALSE;
default:
return TRUE;
}
};
// Used for creating tables where test variations have different results for different compare operators,
// on different data types, on different providers, etc.
struct VariationResults
{
WCHAR szProviderName[256];
HRESULT expHR1;
HRESULT expHR2;
int expRows;
BOOL bVerifyData;
BOOL bSQLOLEDB;
BOOL bMSDASQL;
ULONG minCompareOp;
ULONG maxCompareOp;
};
static DBLENGTH GetDataLength(void *pMakeData, DBTYPE wColType, DBLENGTH cbBytesLen)
{
DBLENGTH cbLength;
switch ( wColType )
{
case DBTYPE_WSTR:
cbLength = (wcslen((WCHAR *)pMakeData)+1)*sizeof(WCHAR);
break;
case DBTYPE_STR:
cbLength = strlen((char *)pMakeData)+sizeof(char);
break;
case DBTYPE_BYTES:
case DBTYPE_VARNUMERIC:
case DBTYPE_UDT:
cbLength = cbBytesLen;
break;
default:
cbLength = GetDBTypeSize(wColType);
break;
}
return cbLength;
}
static BOOL ValidateCompareOp ( DWORD dwFindCompareOps, DBCOMPAREOP CompareOp )
{
if ((CompareOp & DBCOMPAREOPS_CASESENSITIVE) &&
!(dwFindCompareOps & DBPROPVAL_CO_CASESENSITIVE))
return FALSE;
if ((CompareOp & DBCOMPAREOPS_CASEINSENSITIVE) &&
!(dwFindCompareOps & DBPROPVAL_CO_CASEINSENSITIVE))
return FALSE;
switch ( CompareOp & ~(DBCOMPAREOPS_CASESENSITIVE | DBCOMPAREOPS_CASEINSENSITIVE) )
{
case DBCOMPAREOPS_EQ:
case DBCOMPAREOPS_NE:
case DBCOMPAREOPS_LE:
case DBCOMPAREOPS_LT:
case DBCOMPAREOPS_GE:
case DBCOMPAREOPS_GT:
return ( dwFindCompareOps & DBPROPVAL_CO_EQUALITY );
case DBCOMPAREOPS_BEGINSWITH:
return ( dwFindCompareOps & DBPROPVAL_CO_STRING || dwFindCompareOps & DBPROPVAL_CO_BEGINSWITH );
case DBCOMPAREOPS_IGNORE:
return TRUE;
case DBCOMPAREOPS_NOTBEGINSWITH:
return ( dwFindCompareOps & DBPROPVAL_CO_BEGINSWITH );
case DBCOMPAREOPS_NOTCONTAINS:
case DBCOMPAREOPS_CONTAINS:
return (dwFindCompareOps & DBPROPVAL_CO_CONTAINS);
default:
return FALSE;
}
}
static DWORD GetFindCompareOps(IUnknown *pIUnknown, DBID *pColDBID)
{
IRowsetInfo * pIRowsetInfo = NULL;
DBPROPIDSET DBPropIDSet;
ULONG cPropertySets;
ULONG cProperties;
ULONG i;
DBPROPSET * prgProperties = NULL;
DWORD iFindOps = 0;
if(!VerifyInterface(pIUnknown, IID_IRowsetInfo, ROWSET_INTERFACE, (IUnknown**)&pIRowsetInfo))
return 0;
DBPropIDSet.rgPropertyIDs = NULL;
DBPropIDSet.cPropertyIDs = 1;
DBPropIDSet.guidPropertySet = DBPROPSET_ROWSET;
DBPropIDSet.rgPropertyIDs=(DBPROPID *)PROVIDER_ALLOC(sizeof(DBPROPID));
DBPropIDSet.rgPropertyIDs[0]= DBPROP_FINDCOMPAREOPS;
//get property
TESTC(SUCCEEDED(pIRowsetInfo->GetProperties(1,&DBPropIDSet, &cPropertySets, &prgProperties)));
TESTC(cPropertySets == 1);
cProperties = prgProperties[0].cProperties;
for ( i = 0; i < cProperties; i++ )
{
if ( CompareDBID(prgProperties[0].rgProperties[i].colid, DB_NULLID) )
{
iFindOps = V_I4(&prgProperties[0].rgProperties[i].vValue);
break;
}
if ( CompareDBID(*pColDBID, prgProperties[0].rgProperties[i].colid) )
iFindOps = V_I4(&prgProperties[0].rgProperties[i].vValue);
}
CLEANUP:
if(prgProperties)
{
if(prgProperties->rgProperties)
PROVIDER_FREE(prgProperties->rgProperties);
PROVIDER_FREE(prgProperties);
}
if(DBPropIDSet.rgPropertyIDs)
PROVIDER_FREE(DBPropIDSet.rgPropertyIDs);
SAFE_RELEASE(pIRowsetInfo);
return iFindOps;
}
// Some DBTYPE we can't use with this test because
// we require the values in the column to be unique.
static BOOL IsDBTYPEFindable(DBTYPE wType)
{
switch ( wType )
{
case DBTYPE_EMPTY:
case DBTYPE_NULL:
case DBTYPE_BOOL:
case DBTYPE_IDISPATCH:
case DBTYPE_IUNKNOWN:
return FALSE;
default:
return TRUE;
}
}
static BOOL AddShortToNumeric(DB_NUMERIC * pNumeric, short sNum)
{
ASSERT(pNumeric);
// Check parameters
if (!pNumeric)
return FALSE;
if (pNumeric->sign == 0)
{
sNum = -sNum; // if the numeric is negative, negate sNum
}
// If operation won't overflow
if (pNumeric->precision <= sizeof(DWORDLONG) - 1)
{
BYTE PrevSign = pNumeric->sign;
// check for sign change.
if (*(UNALIGNED DWORDLONG *)pNumeric->val < sNum)
{
if ( (sNum > 0 && PrevSign == 0) ||
(sNum < 0 && PrevSign == 1) )
{
pNumeric->sign = ( pNumeric->sign == 1 ? 0 : 1 ); // flip-flop the sign
*(UNALIGNED DWORDLONG *)pNumeric->val = MYABS(sNum) - *(UNALIGNED DWORDLONG *)pNumeric->val ;
}
}
else
*(UNALIGNED DWORDLONG *)pNumeric->val += sNum;
}
else
{
DWORDLONG dwlAccum = sNum;
// Assume 64 bit math.
for(ULONG ul = 0; ul < sizeof(pNumeric->val) / sizeof(ULONG); ul++ )
{
dwlAccum +=(DWORDLONG)(*(((UNALIGNED ULONG *)pNumeric->val) + ul));
*(((UNALIGNED ULONG *)pNumeric->val) + ul) = (ULONG)dwlAccum;
dwlAccum >>= sizeof(ULONG) * 8;
}
}
// Adjust length if overflow into next byte
if (pNumeric->precision < sizeof(pNumeric->val) &&
*(pNumeric->val + pNumeric->precision) != 0)
pNumeric->precision++;
return TRUE;
}
static BOOL AddShortToDecimal(DECIMAL * pDecimal, short sNum)
{
ASSERT(pDecimal);
// Check parameters
if (!pDecimal)
return FALSE;
// If operation won't overflow
if (pDecimal->Hi32 == 0 && pDecimal->Mid32 == 0)
{
// check for sign change.
if ( (pDecimal->sign == 0 && sNum >= 0) || (pDecimal->sign == 0x080 && sNum <= 0) )
{
pDecimal->Lo32 += MYABS(sNum);
}
else if (pDecimal->Lo32 < MYABS(sNum))
{ // possible sign change
if ( (sNum > 0 && pDecimal->sign == 0x80) ||
(sNum < 0 && pDecimal->sign == 0) )
{
pDecimal->sign = ( pDecimal->sign = 0 ? 0x80 : 0 ); // flip-flop the sign
pDecimal->Lo32 = MYABS(sNum) - pDecimal->Lo32;
}
else
pDecimal->Lo32 += MYABS(sNum);
}
else if ( (pDecimal->sign == 0 && sNum < 0) || (pDecimal->sign == 0x80 && sNum > 0) )
{
pDecimal->Lo32 -= MYABS(sNum);
}
}
else
{
DWORDLONG dwlAccum = ( pDecimal->sign == 0x80 ? -sNum : sNum );
dwlAccum += pDecimal->Lo32;
pDecimal->Lo32 = (ULONG)dwlAccum;
dwlAccum >>= sizeof(ULONG) * 8;
dwlAccum += pDecimal->Mid32;
pDecimal->Mid32 = (ULONG)dwlAccum;
dwlAccum >>= sizeof(ULONG) * 8;
dwlAccum += pDecimal->Hi32;
pDecimal->Hi32 = (ULONG)dwlAccum;
}
return TRUE;
}
void FindNullCollationProperty(IDBCreateSession *pIDBCreateSession)
{
HRESULT hr;
ULONG cProperties;
DBPROPSET * prgProperties=NULL;
DBPROPIDSET DBPropIDSet;
DBPROPID PropID = DBPROP_NULLCOLLATION;
IDBProperties * pIDBProperties = NULL;
//Initialize
DBPropIDSet.rgPropertyIDs = NULL;
DBPropIDSet.cPropertyIDs = 1;
DBPropIDSet.guidPropertySet = DBPROPSET_DATASOURCE;
DBPropIDSet.rgPropertyIDs=&PropID;
//get properties
if(!VerifyInterface(pIDBCreateSession, IID_IDBProperties, DATASOURCE_INTERFACE, (IUnknown**)&pIDBProperties))
return;
hr = pIDBProperties->GetProperties(1,&DBPropIDSet,&cProperties,&prgProperties);
if(prgProperties[0].rgProperties[cProperties-1].dwStatus==DBPROPSTATUS_NOTSUPPORTED)
{
// check for conformance violation
//ASSERT(FALSE==IsReqProperty(DBPROPSET_DATASOURCE, DBPROP_NULLCOLLATION));
g_lNullCollation = 0;
}
else
{
g_lNullCollation = V_I4(&prgProperties[0].rgProperties[0].vValue);
}
FreeProperties(&cProperties,&prgProperties);
SAFE_RELEASE(pIDBProperties);
}
static void FindVariantTypes(IUnknown *pIUnknown, CTable *pTable)
{
IAccessor * pIAccessor;
IRowset * pIRowset;
HACCESSOR hAccessor;
DBPART dwPart=DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH;
DBCOUNTITEM cBinding = 0;
DBCOUNTITEM cCount = 0;
DBCOUNTITEM i = 0;
DBLENGTH cRowSize = 0;
DBBINDING * rgBinding = NULL;
HROW * pHRow = NULL;
BYTE * pData = NULL;
VARIANT * pVar = NULL;
TESTC(VerifyInterface(pIUnknown, IID_IRowset, ROWSET_INTERFACE, (IUnknown**)&pIRowset));
TESTC(VerifyInterface(pIRowset, IID_IAccessor, ROWSET_INTERFACE, (IUnknown**)&pIAccessor));
//create an accessor on the rowset
TESTC_(GetAccessorAndBindings(pIRowset,DBACCESSOR_ROWDATA,&hAccessor,
&rgBinding,&cBinding,&cRowSize,dwPart,ALL_COLS_BOUND,FORWARD,
NO_COLS_BY_REF,NULL,NULL,NULL,DBTYPE_EMPTY,0,NULL,NULL,
NO_COLS_OWNED_BY_PROV,DBPARAMIO_NOTPARAM,TRUE), S_OK);
pData = (BYTE *)PROVIDER_ALLOC(cRowSize);
TESTC(pData != NULL);
//get the data
TESTC_(pIRowset->GetNextRows(NULL,0,1,&cCount,&pHRow), S_OK);
TESTC_(pIRowset->GetData(*pHRow, hAccessor, pData), S_OK);
for ( i = 0; i<cBinding; i++)
{
// Check for value binding
if ((rgBinding[i].dwPart) & DBPART_VALUE)
{
// Skip checking the value binding for BOOKMARKS
if (rgBinding[i].iOrdinal!=0)
{
if ( rgBinding[i].wType == DBTYPE_VARIANT )
{
// Get the data in the consumer's buffer
pVar=(VARIANT *)(pData + rgBinding[i].obValue);
CCol &NewCol = pTable->GetColInfoForUpdate(rgBinding[i].iOrdinal);
NewCol.SetSubType(pVar->vt);
}
}
}
}
CLEANUP:
if(pIRowset)
pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL);
if(pIAccessor)
pIAccessor->ReleaseAccessor(hAccessor,NULL);
PROVIDER_FREE(rgBinding);
PROVIDER_FREE(pData);
PROVIDER_FREE(pHRow);
SAFE_RELEASE(pIAccessor);
SAFE_RELEASE(pIRowset);
return;
}
//--------------------------------------------------------------------
// @func Module level initialization routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleInit(CThisTestModule * pThisTestModule)
{
HRESULT hr;
IUnknown * pIRowset=NULL;
IRowsetInfo * pIRowsetInfo=NULL;
DBCOLUMNINFO * rgInfo=NULL;
ULONG cProperties;
DBPROPSET * prgProperties=NULL;
DBPROPIDSET DBPropIDSet;
ULONG cPropertyCount=PROPERTY_COUNT;
CCol TempCol;
SYSTEMTIME SystemTime;
BOOL fFound = FALSE, fInit = FALSE;
DBORDINAL ulStart = 0;
DATE dOleDate = 0;
WCHAR * pwszSeedValue =NULL;
if(!ModuleCreateDBSession(pThisTestModule))
return FALSE;
// When used with an .ini file, this test performs destructive variations that alter the data
// of non-updateable columns. Hence the test notifies PrivLib that read only column data
// should not be validated
if (GetModInfo())
GetModInfo()->SetCompReadOnlyCols(FALSE);
//store IDBCreateSession and IDBCreateCommand pointer
//IDBCreateSession
if(!VerifyInterface(pThisTestModule->m_pIUnknown, IID_IDBCreateSession, DATASOURCE_INTERFACE, (IUnknown**)&g_pIDBCreateSession))
return FALSE;
//IDBCreateCommand
if(!VerifyInterface(pThisTestModule->m_pIUnknown2, IID_IDBCreateCommand, SESSION_INTERFACE, (IUnknown**)&g_pIDBCreateCommand))
{
// Note the limitation and continue.
odtLog << L"IDBCreateCommand is not supported by Provider." << ENDL;
}
// Find NULL COLLATION property
FindNullCollationProperty(g_pIDBCreateSession);
//create the table
g_pCTable = new CTable(pThisTestModule->m_pIUnknown2, (WCHAR *)g_wszModuleName, USENULLS);
g_pEmptyTable = new CTable(pThisTestModule->m_pIUnknown2, (WCHAR *)g_wszModuleName, USENULLS);
g_p1RowTable = new CTable(pThisTestModule->m_pIUnknown2, (WCHAR *)g_wszModuleName, USENULLS);
if(!g_pCTable || !SUCCEEDED(g_pCTable->CreateTable(20,1,NULL,PRIMARY,TRUE))
)
{
odtLog<<L"Create Table failed, test cannot proceed\n";
return FALSE;
}
g_lRowLast = g_pCTable->GetRowsOnCTable();
if ( g_lRowLast < 8 )
{
odtLog<<L"Need at least an 8 row table for this test!\n";
return FALSE;
}
if(!g_pEmptyTable || !SUCCEEDED(g_pEmptyTable->CreateTable(0,1,NULL,PRIMARY,TRUE)))
{
odtLog<<L"Create Table failed, test cannot proceed\n";
return FALSE;
}
if ( g_pEmptyTable->GetRowsOnCTable() != 0 )
{
delete g_pEmptyTable;
g_pEmptyTable = NULL;
}
if(!g_p1RowTable || !SUCCEEDED(g_p1RowTable->CreateTable(1,1,NULL,PRIMARY,TRUE)))
{
odtLog<<L"Create Table failed, test cannot proceed\n";
return FALSE;
}
if ( g_p1RowTable->GetRowsOnCTable() != 1 )
{
delete g_p1RowTable;
g_p1RowTable = NULL;
}
//make sure IRowsetFind interface is supported by opening a rowset
//to open a rowset
hr = g_pCTable->CreateRowset( USE_OPENROWSET, IID_IRowsetFind, 0, NULL, &pIRowset,
NULL, NULL);
//if E_NOINTERFACE is returned, IRowsetFind is not supported by the provider
if(hr==ResultFromScode(E_NOINTERFACE))
{
odtLog<<L"IRowsetFind is not supported by the provider!\n";
return TEST_SKIPPED;
}
if(hr!=ResultFromScode(S_OK))
{
odtLog<<L"CTable::ExcuteCommand failed!\n";
return FALSE;
}
FindVariantTypes(pIRowset, g_pCTable);
if(GetModInfo()->GetInitStringValue(L"FINDSEED", &pwszSeedValue))
{
g_ulColNum = _wtoi(pwszSeedValue);
odtLog << "Trying to use specified seed: " << g_ulColNum << ENDL;
}
else
{
// Determine a Column seed to use for the other finds.
GetSystemTime(&SystemTime);
SystemTimeToVariantTime(&SystemTime, &dOleDate);
ulStart = ( ULONG(dOleDate) % g_pCTable->CountColumnsOnTable() ) + 1;
g_ulColNum = ulStart;
odtLog << "Using seed : " << g_ulColNum << ENDL;
}
do
{
g_pCTable->GetColInfo(g_ulColNum, TempCol);
// choose a column seed to verify correct cursor behavior
// Vary the column seed but avoid small type (I1/UI1) and
// avoid complicated types such as BLOBS and VARNUMERIC
if (ValidateCompareOp ( GetFindCompareOps(pIRowset, TempCol.GetColID()), DBCOMPAREOPS_EQ ) &&
TempCol.GetUpdateable() &&
!TempCol.GetIsLong() &&
TempCol.GetProviderType() != DBTYPE_UI1 &&
TempCol.GetProviderType() != DBTYPE_I1 &&
TempCol.GetProviderType() != DBTYPE_BOOL &&
TempCol.GetProviderType() != DBTYPE_BYTES)
{
if ( TempCol.GetProviderType() == DBTYPE_VARIANT )
{
if ( IsDBTYPEFindable(TempCol.GetSubType()) )
{
g_wColType = DBTYPE_VARIANT;
fFound = TRUE;
}
}
else if ( IsDBTYPEFindable(TempCol.GetProviderType()) )
{
g_wColType = TempCol.GetProviderType();
fFound = TRUE;
}
}
if ( !fFound )
{
if ( ++g_ulColNum > g_pCTable->CountColumnsOnTable() )
g_ulColNum = 1;
}
} while ( !fFound && ulStart != g_ulColNum );
if ( fFound )
odtLog << "Column to find value on is " << g_ulColNum << " of type " << g_wColType << ".\n";
else
{
odtLog << "No searchable columns found on target table. No testing will proceed.\n";
goto CLEANUP;
}
// IRowsetFind is supported, now retrieve information about all the properties we
// will use....
//if properites are supported
//init all the properties
//check if properites are supported
//Initialize
DBPropIDSet.rgPropertyIDs = NULL;
DBPropIDSet.cPropertyIDs = PROPERTY_COUNT;
DBPropIDSet.guidPropertySet = DBPROPSET_ROWSET;
cPropertyCount=IDX_IRowsetLocate+1;
DBPropIDSet.rgPropertyIDs=(DBPROPID *)PROVIDER_ALLOC(cPropertyCount *
sizeof(DBPROPID));
DBPropIDSet.rgPropertyIDs[IDX_Bookmarks] = DBPROP_BOOKMARKS;
DBPropIDSet.rgPropertyIDs[IDX_OrderedBookmarks] = DBPROP_ORDEREDBOOKMARKS;
DBPropIDSet.rgPropertyIDs[IDX_LiteralBookmarks] = DBPROP_LITERALBOOKMARKS;
DBPropIDSet.rgPropertyIDs[IDX_FetchBackwards] = DBPROP_CANFETCHBACKWARDS;
DBPropIDSet.rgPropertyIDs[IDX_ScrollBackwards] = DBPROP_CANSCROLLBACKWARDS;
DBPropIDSet.rgPropertyIDs[IDX_CanHoldRows] = DBPROP_CANHOLDROWS;
DBPropIDSet.rgPropertyIDs[IDX_RemoveDeleted] = DBPROP_REMOVEDELETED;
DBPropIDSet.rgPropertyIDs[IDX_BookmarkSkipped] = DBPROP_BOOKMARKSKIPPED;
DBPropIDSet.rgPropertyIDs[IDX_OtherUpdateDelete] = DBPROP_OTHERUPDATEDELETE;
DBPropIDSet.rgPropertyIDs[IDX_OtherInsert] = DBPROP_OTHERINSERT;
DBPropIDSet.rgPropertyIDs[IDX_IRowsetDeleteBookmarks] = DBPROP_IRowsetChange;
DBPropIDSet.rgPropertyIDs[IDX_BookmarkType] = DBPROP_BOOKMARKTYPE;
DBPropIDSet.rgPropertyIDs[IDX_IRowsetChange] = DBPROP_IRowsetChange;
DBPropIDSet.rgPropertyIDs[IDX_IRowsetLocate] = DBPROP_IRowsetLocate;
//Get Rowset Info
if(!VerifyInterface(pIRowset, IID_IRowsetInfo, ROWSET_INTERFACE, (IUnknown**)&pIRowsetInfo))
goto CLEANUP;
//mark everything as supported
for(cProperties=0;cProperties<PROPERTY_COUNT;cProperties++)
{
g_rgDBPrpt[cProperties].fSupported=TRUE;
g_rgDBPrpt[cProperties].fDefault=FALSE;
}
//get properties
if(!SUCCEEDED(hr=pIRowsetInfo->GetProperties(1,&DBPropIDSet, &cProperties, &prgProperties)))
goto CLEANUP;
//mark the properties
for(cProperties=0;cProperties<PROPERTY_COUNT;cProperties++)
{
//mark the not supported properties
if(prgProperties[0].rgProperties[cProperties].dwStatus==DBPROPSTATUS_NOTSUPPORTED)
{
// check for conformance violation
//ASSERT(FALSE==IsReqProperty(DBPropIDSet.rgPropertyIDs[cProperties], DBPropIDSet.guidPropertySet));
g_rgDBPrpt[cProperties].fSupported=FALSE;
g_rgDBPrpt[cProperties].fDefault=FALSE;
}
else
{
if(prgProperties[0].rgProperties[cProperties].dwStatus!=DBPROPSTATUS_OK)
odtLog<<L"Error: default value failed for properties indexed at "<<cProperties<<L".\n";
//mark as supported properties
g_rgDBPrpt[cProperties].fSupported=TRUE;
if(cProperties==IDX_BookmarkType)
{
if(prgProperties[0].rgProperties[cProperties].vValue.lVal
!=DBPROPVAL_BMK_NUMERIC)
{
odtLog<<L"ERROR: The bookmark is not based on numeric!\n";
if(prgProperties[0].rgProperties[cProperties].vValue.lVal
!=DBPROPVAL_BMK_KEY)
odtLog<<L"ERROR: The bookmark type returned false information!\n";
}
}
else
{
g_rgDBPrpt[cProperties].fDefault=
V_BOOL(&prgProperties[0].rgProperties[cProperties].vValue);
}
}
}
fInit = TRUE;
CLEANUP:
//release rowset objects
SAFE_RELEASE(pIRowsetInfo);
SAFE_RELEASE(pIRowset);
PROVIDER_FREE(pwszSeedValue);
//free the memory
if(prgProperties)
{
if(prgProperties->rgProperties)
PROVIDER_FREE(prgProperties->rgProperties);
PROVIDER_FREE(prgProperties);
}
if(DBPropIDSet.rgPropertyIDs)
PROVIDER_FREE(DBPropIDSet.rgPropertyIDs);
return fInit;
}
//--------------------------------------------------------------------
// @func Module level termination routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleTerminate(CThisTestModule * pThisTestModule)
{
//drop tables
if(g_pCTable)
{
g_pCTable->DropTable();
delete g_pCTable;
g_pCTable = NULL;
}
if(g_p1RowTable)
{
g_p1RowTable->DropTable();
delete g_p1RowTable;
g_p1RowTable = NULL;
}
if(g_pEmptyTable)
{
g_pEmptyTable->DropTable();
delete g_pEmptyTable;
g_pEmptyTable = NULL;
}
SAFE_RELEASE(g_pIDBCreateSession);
SAFE_RELEASE(g_pIDBCreateCommand);
SAFE_RELEASE(g_pIDataConvert);
return (ModuleReleaseDBSession(pThisTestModule));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Base Test Case Section
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
// TCIRowsetFind: the base class for the rest of test cases in this
// test module.
//
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class TCIRowsetFind : public CRowsetObject
{
private:
protected:
//@cmember: interface pointer for IRowsetFind
IRowsetFind * m_pIRowsetFind;
//@cmember: interface pointer for IRowset
IRowset * m_pIRowset;
//@cmember: interface pointer for IConvertType
IConvertType * m_pIConvertType;
//@cmember: accessory handle
HACCESSOR m_hAccessor;
//@cmember: accessory handle that will only be used as argument to IRowsetFind
HACCESSOR m_hRowsetFindAccessor;
//@cmember: the size of a row
DBLENGTH m_cRowSize;
//@cmember: the count of binding structure
DBCOUNTITEM m_cBinding;
//@cmember: the array of binding strucuture
DBBINDING * m_rgBinding;
//@cmember: the pointer to the row buffer
void * m_pData;
//@cmember: the pointer to the pFindValue buffer
BYTE * m_pFindValue;
//@cmember: wherther Privlib FillInputBindings was used to fill m_pFindValue
BOOL m_fUsePrivlibFillInputBindings;
//@cmember: the pointers Bindings arrays
DBCOUNTITEM m_cFindBindings;
DBBINDING * m_rgFindBindings;
HROW * m_rghRowsFound;
DBCOUNTITEM m_cRowsFound;
//@cmember: the pointer to the ISequentialStream interface
ISequentialStream * m_pISeqStream;
//@mfunc: initialialize interface pointers
BOOL Init();
//@mfunc: Terminate
BOOL Terminate();
//@mfunc: Create a command object and set properties, execute a sql statement,
// and create a rowset object. Create an accessor on the rowset
BOOL GetRowsetAndAccessor
(
CTable *pCTable,
EQUERY eSQLStmt,
IID riid,
ULONG cProperties=0,
const DBPROPID *rgProperties=NULL,
DBACCESSORFLAGS dwAccessorFlags=DBACCESSOR_ROWDATA,
DBPART dwPart=DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,
ECOLS_BOUND eColsToBind=ALL_COLS_BOUND,
ECOLUMNORDER eBindingOrder=FORWARD,
ECOLS_BY_REF eColsByRef=NO_COLS_BY_REF,
WCHAR *pwszTableName=NULL,
EEXECUTE eExecute=EXECUTE_IFNOERROR,
DBTYPE dbTypeModifier=DBTYPE_EMPTY,
BOOL fBindLongColumns=FALSE
);
//@mfun: create an accessor on the rowset.
BOOL GetAccessorOnRowset
(
DBACCESSORFLAGS dwAccessorFlags=DBACCESSOR_ROWDATA,
DBPART dwPart=DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,
ECOLS_BOUND eColsToBind=ALL_COLS_BOUND,
ECOLUMNORDER eBindingOrder=FORWARD,
ECOLS_BY_REF eColsByRef=NO_COLS_BY_REF,
DBTYPE dbTypeModifier=DBTYPE_EMPTY,
BOOL fBindLongColumns=TRUE
);
//@mfun: Get the bookmark for the row
BOOL GetBookmark
(
DBCOUNTITEM ulRow,
ULONG_PTR * pcbBookmark,
BYTE ** ppBookmark
);
BOOL BookmarkSkipped();
BOOL RemoveDeleted();
BOOL GetProp
(
DBPROPID DBPropID
);
//@mfunc: release the memory referenced by the consumer's buffer
void FreeMemory
(
CTable * pCTable=g_pCTable
);
//@mfunc: release a rowset object and accessor created on it
BOOL ReleaseRowsetAndAccessor();
//@mfunc: release a accessor created on it
BOOL ReleaseAccessorOnRowset();
//mfunc: populate the table after delete some rows
BOOL PopulateTable();
//@mfunc: verify the position of the row handle in the row set
BOOL VerifyRowPosition
(
HROW hRow, //row handle
DBCOUNTITEM cRow, //potision expected
CTable * pCTable, //pointer to the CTable
EVALUE eValue=PRIMARY //eValue for MakeData
);
//@mfunc: verify the position of the cursor in the row set
BOOL VerifyCursorPosition
(
DBCOUNTITEM cRow, //the cursor potision expected
CTable * pCTable, //pointer to the CTable
BOOL fMoveBack=FALSE,//whether move the cursor back to its original postion
//if fMoveBack==FALSE; the cursor will be positioned one row
//after the original position. If fMoveBack==TRUE,
//DBPROP_CANSCROLLBACKWARDS needs to be set.
EVALUE eValue=PRIMARY //eValue for MakeData
);
BOOL CreateCoerceFindValueAccessor
(
DBCOMPAREOP CompareOp,
CTable * pCTable,
DBCOUNTITEM ulRowNum,
DBCOUNTITEM ulColToFind,
DBTYPE wBindType
);
BOOL CreateFindValueAccessor
(
DBCOMPAREOP CompareOp,
CTable * pCTable,
DBCOUNTITEM ulRowNum,
DBORDINAL ulColNum,
DBTYPE wColType,
eSUBCOMPAREOP eSubCompare,
BOOL fUseStream = FALSE,
DBCOMPAREOP * pwNewCompareOp = NULL,
DBPART dbPart = DBPART_INVALID,
HRESULT * phrExpected = NULL
);
BOOL ReleaseFindValueAccessor
(
DBTYPE wColType
);
BOOL CallFindNextRows
(
CTable * pCTable, // pointer to CTable object
BYTE * pBookmark, // Bookmark to fetch from, if any
ULONG_PTR cbBookmark, // Length of bookmark.
DBROWCOUNT lRowsToFetch, // maps to cRows
DBROWOFFSET lOffset, // maps to lOffset
DBORDINAL ulColToMatch, // Which column to match
DBCOUNTITEM ulRowToMatch, // Is there a row where the find should happen? 0 - no match
HRESULT hrExpAccessor, // Expected HRESULT for Create Accessor Step
DBCOUNTITEM ulRowsExpected, // Expected count of rows
BOOL fReleaseRows=TRUE, // Flag to Release Rows.
DBCOMPAREOP CompareOp=DBCOMPAREOPS_EQ, // Any particular preference for comparing?
eSUBCOMPAREOP eSubCompare=SUBOP_EMPTY, // Some comparision are rich enough to deserve a sub comparision
HROW * rghRows = NULL, // Use client or provider memory, default=provider
BOOL fCheckRows = TRUE, // verify rows by comparing data ?
BOOL fUseStream = FALSE, // Use ISeqStream ?
HRESULT hrExpFind = -1 // Second expected HRESULT for the FindNextRow step
);
BOOL AlterData
(
BYTE ** ppMakeData,
DBCOMPAREOP CompareOp,
DBTYPE wColType,
DBLENGTH * pcbDataLength,
eSUBCOMPAREOP eSubCompare
);
BOOL AlterNumericData
(
BYTE ** ppMakeData,
DBCOMPAREOP CompareOp,
DBTYPE wColType,
DBLENGTH * pcbDataLength
);
BOOL AlterCharacterData
(
void ** ppMakeData,
DBCOMPAREOP CompareOp,
DBTYPE wColType,
DBLENGTH * pcbDataLength,
eSUBCOMPAREOP eSubCompare
);
BOOL AlterVarnumericData
(
BYTE ** ppMakeData,
DBCOMPAREOP CompareOp,
DBLENGTH * pcbDataLength
);
BOOL BindingTypeTest
(
CTable * pCTable,
DBTYPE wBindingType
);
BOOL CompareOpTest
(
CTable * pCTable,
DBCOMPAREOP CompareOp,
eSUBCOMPAREOP eSubCompare,
BOOL fUseStream=FALSE
);
BOOL DeleteRow
(
CTable * pCTable,
DBCOUNTITEM ulRowToDelete
);
DWORD TC_FindCompareOps
(
DBID * pColDBID
);
BOOL AlteringRowsIsOK();
BOOL IsColumnMinimumFindable
(
CCol * pCol,
DBCOMPAREOP CompareOp
);
BOOL IsTypeFindable
(
DBTYPE wType,
DBCOMPAREOP CompareOp,
DBTYPE wSubType = DBTYPE_EMPTY
);
BOOL IsStringType
(
DBTYPE wType
);
BOOL IsStringCompareOp
(
DBCOMPAREOP CompareOp
);
BOOL IsColumnFindable
(
CCol * pCol,
DBCOMPAREOP CompareOp
);
HRESULT RestartRowPosition();
BOOL GetVariableLengthStrAndUpdatable
(
DBORDINAL * pulColNum,
DBCOMPAREOP CompareOp,
BOOL fGetLongStr = FALSE,
DBTYPE * pwType = NULL
);
BOOL GetNonNullableCol
(
DBORDINAL * pulColNum,
DBCOMPAREOP CompareOp,
BOOL fGetLongStr,
DBTYPE * pwType
);
public:
//constructor and destructor
TCIRowsetFind(WCHAR *wstrTestCaseName);
~TCIRowsetFind();
};
//--------------------------------------------------------------------
// @mfunc base class TCIRowsetFind constructor, must take testcase name
// as parameter.
//
TCIRowsetFind::TCIRowsetFind
(
WCHAR * wstrTestCaseName //Takes TestCase Class name as parameter
) : CRowsetObject (wstrTestCaseName)
{
//initialize member data
m_pIRowsetFind = NULL;
m_pIRowset = NULL;
m_pIConvertType = NULL;
m_pFindValue = NULL;
m_pIAccessor = NULL;
m_pISeqStream = NULL;
m_hAccessor = NULL;
m_hRowsetFindAccessor = NULL;
m_cRowSize = 0;
m_cBinding = 0;
m_rgBinding = NULL;
m_pData = NULL;
m_hr = S_OK;
m_cFindBindings =0;
m_rgFindBindings = NULL;
m_cRowsFound = 0;
m_rghRowsFound = NULL;
}
//--------------------------------------------------------------------
// @mfunc base class TCIRowsetFind destructor
//
TCIRowsetFind::~TCIRowsetFind()
{
}
//--------------------------------------------------------------------
//@mfunc: Init creates a Data Source object, a DB Session object,
//and a command object and initialize corresponding interface pointers.
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::Init()
{
return (COLEDB::Init());
}
//--------------------------------------------------------------------
//@mfunc: Terminate release the data source object, DB Session object, Command object
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::Terminate()
{
return (COLEDB::Terminate());
}
//--------------------------------------------------------------------
//@mfunc: Create a command object and set properties, execute a sql statement,
// and create a rowset object. Create an accessor on the rowset
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::GetRowsetAndAccessor
(
CTable * pCTable, //the pointer to the table object
EQUERY eSQLStmt, //the SQL Statement to create
IID riid, //the interface pointer to return
ULONG cProperties, //the count of properties
const DBPROPID * rgProperties, //the array of properties to be set
DBACCESSORFLAGS dwAccessorFlags, //the accessor flags
DBPART dwPart, //the type of binding
ECOLS_BOUND eColsToBind, //the columns in accessor
ECOLUMNORDER eBindingOrder, //the order to bind columns
ECOLS_BY_REF eColsByRef, //which columns to bind by reference
WCHAR * pwszTableName, //the table name for the join statement
EEXECUTE eExecute, //execute only if all properties are set
DBTYPE dbTypeModifier, //the type modifier used for accessor
BOOL fBindLongColumns //whether to long columns
)
{
HRESULT hr;
ULONG cProp = 0, i = 0;
DBPROPSET rgPropSets[1];
BOOL bReturn = FALSE;
BLOBTYPE blobType;
BOOL bIsOrderedBookMarkProperty = FALSE;
//init rgPropSets[0]
rgPropSets[0].rgProperties = NULL;
rgPropSets[0].cProperties = cProperties;
rgPropSets[0].guidPropertySet= DBPROPSET_ROWSET;
rgPropSets[0].rgProperties=(DBPROP *)PROVIDER_ALLOC
(sizeof(DBPROP) * (cProperties + 1));
memset(rgPropSets[0].rgProperties, 0, sizeof(DBPROP) * (cProperties + 1));
TESTC(rgPropSets[0].rgProperties != NULL);
//go through the loop to set every DB Property required
for(i=0; i<cProperties; i++)
{
VariantInit(&(rgPropSets[0].rgProperties[cProp].vValue));
//Set KAGPROP_QUERYBASEDUPDATES if need be
switch(rgProperties[i])
{
case DBPROP_UPDATABILITY:
rgPropSets[0].rgProperties[cProp].dwPropertyID=DBPROP_UPDATABILITY;
rgPropSets[0].rgProperties[cProp].dwOptions=DBPROPOPTIONS_REQUIRED;
rgPropSets[0].rgProperties[cProp].vValue.vt=VT_I4;
rgPropSets[0].rgProperties[cProp].vValue.lVal=
DBPROPVAL_UP_CHANGE|DBPROPVAL_UP_DELETE|DBPROPVAL_UP_INSERT;
cProp++;
break;
case DBPROP_IRowsetLocate:
fBindLongColumns = BLOB_LONG;
// intentional fallthru
default:
if (rgProperties[i]== DBPROP_ORDEREDBOOKMARKS)
{
bIsOrderedBookMarkProperty = TRUE;
}
rgPropSets[0].rgProperties[cProp].dwPropertyID = rgProperties[i];
rgPropSets[0].rgProperties[cProp].dwOptions = DBPROPOPTIONS_REQUIRED;
rgPropSets[0].rgProperties[cProp].vValue.vt = VT_BOOL;
V_BOOL(&rgPropSets[0].rgProperties[cProp].vValue)= VARIANT_TRUE;
cProp++;
break;
}
}
//Set properties and execute the SQL statement
//May fail due to combinations of properties
ASSERT(SUCCEEDED(SetRowsetProperties(rgPropSets, 1)));
if(fBindLongColumns)
blobType=BLOB_LONG;
else
blobType=NO_BLOB_COLS;
//Set CTable object
SetTable(pCTable, DELETETABLE_NO);
hr = CreateRowsetObject(eSQLStmt, riid, EXECUTE_IFNOERROR);
if(hr==DB_S_ERRORSOCCURRED || hr==DB_E_ERRORSOCCURRED)
goto CLEANUP;
TESTC_(hr,S_OK);
//queryinterface for IRowsetFind, IRowset, and IConvertType
TESTC(VerifyInterface(m_pIAccessor, IID_IRowset, ROWSET_INTERFACE,
(IUnknown **)&m_pIRowset));
TESTC(VerifyInterface(m_pIRowset, IID_IRowsetFind, ROWSET_INTERFACE,
(IUnknown **)&m_pIRowsetFind));
TESTC(VerifyInterface(m_pIRowset, IID_IConvertType, ROWSET_INTERFACE,
(IUnknown **)&m_pIConvertType));
//if dwAccessorFlags=DBACCESSOR_PASSBYREF, no need to create an accessor
if(dwAccessorFlags == DBACCESSOR_PASSBYREF)
{
bReturn = TRUE;
goto CLEANUP;
}
//create an accessor on the rowset
TESTC_(GetAccessorAndBindings(m_pIRowset,dwAccessorFlags,&m_hAccessor,
&m_rgBinding,&m_cBinding,&m_cRowSize,dwPart,eColsToBind,eBindingOrder,
eColsByRef,NULL,NULL,NULL,dbTypeModifier,0,NULL,NULL,
NO_COLS_OWNED_BY_PROV,DBPARAMIO_NOTPARAM,blobType),S_OK);
//allocate memory for the row
m_pData = PROVIDER_ALLOC(m_cRowSize);
if(m_pData)
bReturn = TRUE;
CLEANUP:
//free the memory
PROVIDER_FREE(rgPropSets[0].rgProperties);
return bReturn;
}
BOOL TCIRowsetFind::GetAccessorOnRowset
(
DBACCESSORFLAGS dwAccessorFlags,
DBPART dwPart,
ECOLS_BOUND eColsToBind,
ECOLUMNORDER eBindingOrder,
ECOLS_BY_REF eColsByRef,
DBTYPE dbTypeModifier,
BOOL fBindLongColumns
)
{
BLOBTYPE blobType;
if(fBindLongColumns)
blobType=BLOB_LONG;
else
blobType=NO_BLOB_COLS;
//create an accessor on the rowset
if(!CHECK(GetAccessorAndBindings(m_pIRowset,dwAccessorFlags,&m_hAccessor,
&m_rgBinding,&m_cBinding,&m_cRowSize,dwPart,eColsToBind,eBindingOrder,
eColsByRef,NULL,NULL,NULL,dbTypeModifier,blobType),S_OK))
return FALSE;
//allocate memory for the row
m_pData=PROVIDER_ALLOC(m_cRowSize);
if(!m_pData)
return FALSE;
return TRUE;
}
//--------------------------------------------------------------------
//@mfun: Get the bookmark for the row. The function has to be called
// after the GetRowsetAndAccessor that creates an accessor on the
// rowset.
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::GetBookmark
(
DBCOUNTITEM ulRow,
ULONG_PTR * pcbBookmark,
BYTE ** ppBookmark
)
{
BOOL fPass=FALSE;
HROW * pHRow=NULL;
DBCOUNTITEM cCount;
//ulRow has to start with 1
if(!pcbBookmark || !ppBookmark || !ulRow)
return FALSE;
//restart the cursor position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
return FALSE;
//fetch the row
TESTC_(m_pIRowset->GetNextRows(NULL,(ulRow-1),1,&cCount,&pHRow),S_OK);
//only one row handle is retrieved
COMPARE(cCount, 1);
//get the data
TESTC_(m_pIRowset->GetData(*pHRow, m_hAccessor, m_pData),S_OK);
//make sure the 0 column is for bookmark
if(!COMPARE(m_rgBinding[0].iOrdinal, 0))
{
FreeMemory();
goto CLEANUP;
}
//get the length of the bookmark
*pcbBookmark= *((DBLENGTH *)((BYTE *)m_pData+m_rgBinding[0].obLength));
//allocate memory for bookmark
*ppBookmark=(BYTE *)PROVIDER_ALLOC(*pcbBookmark);
TESTC(*ppBookmark != NULL);
//copy the value of the bookmark into the consumer's buffer
memcpy(*ppBookmark, (void *)((BYTE *)m_pData+m_rgBinding[0].obValue), *pcbBookmark);
//free the memory referenced by the consumer's buffer
FreeMemory();
fPass=TRUE;
CLEANUP:
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//restart the cursor position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
return FALSE;
return fPass;
}
//--------------------------------------------------------------
//
// Get information about properties
//
//-----------------------------------------------------------------
BOOL TCIRowsetFind::GetProp(DBPROPID DBPropID)
{
IRowsetInfo * pIRowsetInfo=NULL;
ULONG cProperty;
DBPROPIDSET DBPropIDSet;
DBPROPSET * pDBPropSet=NULL;
BOOL fSupported=FALSE;
//initialize
DBPropIDSet.guidPropertySet = DBPROPSET_ROWSET;
DBPropIDSet.cPropertyIDs = 1;
DBPropIDSet.rgPropertyIDs = &DBPropID;
//QI for IRowsetInfo interface
TESTC_(m_pIRowset->QueryInterface(IID_IRowsetInfo,(LPVOID *)&pIRowsetInfo),S_OK);
TESTC(SUCCEEDED(pIRowsetInfo->GetProperties(1,&DBPropIDSet,&cProperty,&pDBPropSet)));
if(V_BOOL(&pDBPropSet->rgProperties->vValue) == VARIANT_TRUE)
fSupported=TRUE;
CLEANUP:
for(ULONG i=0;i<cProperty;i++)
PRVTRACE(L"[%d] status == %d \n",pDBPropSet[0].rgProperties[i].dwPropertyID,pDBPropSet[0].rgProperties[i].dwStatus);
if(pDBPropSet)
{
if(pDBPropSet->rgProperties)
PROVIDER_FREE(pDBPropSet->rgProperties);
PROVIDER_FREE(pDBPropSet);
}
SAFE_RELEASE(pIRowsetInfo);
return fSupported;
}
//--------------------------------------------------------------------
//@mfunc: If BookmarkSkipped is supported on the rowset
//--------------------------------------------------------------------
BOOL TCIRowsetFind::BookmarkSkipped()
{
IRowsetInfo * pIRowsetInfo=NULL;
ULONG cProperty;
DBPROPID DBPropID=DBPROP_BOOKMARKSKIPPED;
DBPROPIDSET DBPropIDSet;
DBPROPSET * pDBPropSet=NULL;
BOOL fSupported=FALSE;
if(!g_rgDBPrpt[IDX_BookmarkSkipped].fSupported)
return FALSE;
//initialize
DBPropIDSet.guidPropertySet = DBPROPSET_ROWSET;
DBPropIDSet.cPropertyIDs = 1;
DBPropIDSet.rgPropertyIDs = &DBPropID;
//QI for IRowsetInfo interface
TESTC_(m_pIRowset->QueryInterface(IID_IRowsetInfo,(LPVOID *)&pIRowsetInfo),S_OK);
//ask for DBPROP_BOOKMARKSKIPPED
TESTC_(pIRowsetInfo->GetProperties(1,&DBPropIDSet,&cProperty,
&pDBPropSet),S_OK);
if(V_BOOL(&pDBPropSet->rgProperties->vValue)==VARIANT_TRUE)
fSupported=TRUE;
CLEANUP:
if(pDBPropSet)
{
if(pDBPropSet->rgProperties)
PROVIDER_FREE(pDBPropSet->rgProperties);
PROVIDER_FREE(pDBPropSet);
}
SAFE_RELEASE(pIRowsetInfo);
return fSupported;
}
//--------------------------------------------------------------------
// Populate the table after some rows are deleted
//--------------------------------------------------------------------
BOOL TCIRowsetFind::PopulateTable()
{
long cCnt;
//delete all rows in the table.
if(!CHECK(g_pCTable->DeleteRows(ALLROWS),S_OK))
return FALSE;
// freshly populate
for(cCnt=1; cCnt<=g_lRowLast; cCnt++)
if(!CHECK(g_pCTable->Insert(cCnt, PRIMARY),S_OK))
return FALSE;
return TRUE;
}
//--------------------------------------------------------------------
//@mfunc: If RemoveDeleted is supported on the rowset
//--------------------------------------------------------------------
BOOL TCIRowsetFind::RemoveDeleted()
{
IRowsetInfo * pIRowsetInfo=NULL;
ULONG cProperty;
DBPROPID DBPropID=DBPROP_REMOVEDELETED;
DBPROPIDSET DBPropIDSet;
DBPROPSET * pDBPropSet=NULL;
BOOL fSupported=FALSE;
if(!g_rgDBPrpt[IDX_RemoveDeleted].fSupported)
return FALSE;
//initialize
DBPropIDSet.guidPropertySet = DBPROPSET_ROWSET;
DBPropIDSet.cPropertyIDs = 1;
DBPropIDSet.rgPropertyIDs = &DBPropID;
//QI for IRowsetInfo interface
TESTC_(m_pIRowset->QueryInterface(IID_IRowsetInfo,(LPVOID *)&pIRowsetInfo),S_OK);
//ask for DBPROP_BOOKMARKSKIPPED
TESTC_(pIRowsetInfo->GetProperties(1,&DBPropIDSet,&cProperty,
&pDBPropSet),S_OK);
if(V_BOOL(&pDBPropSet->rgProperties->vValue)==VARIANT_TRUE)
fSupported=TRUE;
CLEANUP:
if(pDBPropSet)
{
if(pDBPropSet->rgProperties)
PROVIDER_FREE(pDBPropSet->rgProperties);
PROVIDER_FREE(pDBPropSet);
}
SAFE_RELEASE(pIRowsetInfo);
return fSupported;
}
//--------------------------------------------------------------------
//@mfunc: free the memory referenced by the consumer's buffer
// The function has to be called after IRowset::GetData()
//
//--------------------------------------------------------------------
void TCIRowsetFind::FreeMemory(CTable *pCTable)
{
//make sure m_pData is not NULL
if(!COMPARE(!m_pData, NULL))
return;
//make sure the columns are bound
if(!m_rgTableColOrds)
return;
//call compareData with the option to free the memory referenced by the consumer's
//buffer without comparing data
CompareData(m_cRowsetCols,m_rgTableColOrds,1,m_pData,m_cBinding,m_rgBinding,pCTable,
NULL,PRIMARY,FREE_ONLY);
}
//--------------------------------------------------------------------
//@mfunc: release a rowset object and accessor created on it
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::ReleaseRowsetAndAccessor()
{
BOOL fPass = TRUE;
//free the consumer buffer
PROVIDER_FREE(m_pData);
PROVIDER_FREE(m_rgBinding);
PROVIDER_FREE(m_rgTableColOrds);
//free accessor handle
if(m_hAccessor)
{
if(!CHECK(m_pIAccessor->ReleaseAccessor(m_hAccessor,NULL), S_OK))
fPass=FALSE;
m_hAccessor=NULL;
}
SAFE_RELEASE(m_pIRowset);
SAFE_RELEASE(m_pIRowsetFind);
SAFE_RELEASE(m_pIConvertType);
ReleaseRowsetObject(); //releases m_pIAccessor
ReleaseCommandObject(); //releases m_pICommand
ReleaseDBSession();
ReleaseDataSourceObject();
return fPass;
}
BOOL TCIRowsetFind::ReleaseAccessorOnRowset()
{
BOOL fPass=TRUE;
//free the consumer buffer
PROVIDER_FREE(m_pData);
PROVIDER_FREE(m_rgBinding);
//free accessor handle
if(m_hAccessor)
{
if(!CHECK(m_pIAccessor->ReleaseAccessor(m_hAccessor,NULL), S_OK))
fPass=FALSE;
m_hAccessor=NULL;
}
return fPass;
}
//--------------------------------------------------------------------
//
//@mfunc: verify the position of the row handle in the row set
//
// Precondition: The function has to be called after GetRowsetAndAccessor that
// creates a rowset and an accessor
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::VerifyRowPosition
(
HROW hRow, //row handle
DBCOUNTITEM cRow, //position expected
CTable * pCTable, //pointer to the CTable
EVALUE eValue //if the accessor is ReadColumnsByRef
)
{
//input validation
if(!pCTable || !m_pIRowset || !m_pData)
return FALSE;
//Get Data for the row
if(!CHECK(m_pIRowset->GetData(hRow,m_hAccessor,m_pData),S_OK))
return FALSE;
//compare the data with the row expected in the rowset
if(!CompareData(m_cRowsetCols,m_rgTableColOrds,cRow,m_pData,m_cBinding,m_rgBinding,pCTable,
NULL,eValue))
return FALSE;
return TRUE;
}
//--------------------------------------------------------------------
//
//@mfunc: verify the position of the cursor in the row set
//
// Precondition: The function has to be called after GetRowsetAndAccessor that
// creates a rowset and an accessor.
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::VerifyCursorPosition
(
DBCOUNTITEM cRow, //the cursor potision expected
CTable * pCTable, //pointer to the CTable
BOOL fMoveBack, //whether move the cursor back to its original postion
//if fMoveBack==FALSE; the cursor will be positioned one row
//after the original position. If fMoveBack==TRUE,
//DBPROP_CANSCROLLBACKWARDS needs to be set.
EVALUE eValue //eValue for MakeData
)
{
HROW hRow[1];
HROW * pHRow = hRow;
DBCOUNTITEM cRows;
BOOL fTestPass=TRUE;
//input validation
if(!pCTable || !m_pIRowset || !m_pData)
return FALSE;
//Get a row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRows,&pHRow),S_OK))
return FALSE;
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(hRow[0],cRow,pCTable,eValue),TRUE))
fTestPass=FALSE;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(1,hRow,NULL,NULL,NULL),S_OK);
//reposition the cursor to its original position
if(fMoveBack)
{
if(!CHECK(m_pIRowset->GetNextRows(NULL,-1,0,&cRows,&pHRow),S_OK))
fTestPass=FALSE;
}
return (fTestPass);
}
//--------------------------------------------------------------------
//
//@mfunc: Create Accessor for the pFindValue argument to IRowsetFind::FindNextRows
// Bind to a type other than the native type to test coercion
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::CreateCoerceFindValueAccessor
(
DBCOMPAREOP CompareOp,
CTable * pCTable,
DBCOUNTITEM ulRowNum,
DBORDINAL ulColToFind,
DBTYPE wBindType
)
{
BOOL fChanged = FALSE;
BOOL fRet = FALSE;
WCHAR wszData[2000];
CCol TempCol;
USHORT ulsize;
DBLENGTH cbDataLength = 0;
BYTE * pMakeData;
DBTYPE wVariantType = DBTYPE_EMPTY, wColType, wByRefType = DBTYPE_EMPTY;
HRESULT hr;
pCTable->GetColInfo(ulColToFind, TempCol);
wColType = TempCol.GetProviderType();
wByRefType = wBindType & DBTYPE_BYREF;
wBindType &= (~DBTYPE_BYREF);
// This only has support for these major types
if ( wBindType != DBTYPE_WSTR && wBindType != DBTYPE_STR && wBindType != DBTYPE_BSTR && wBindType != DBTYPE_VARIANT )
return FALSE;
// Only supports EQ; may add more support
if ( CompareOp != DBCOMPAREOPS_EQ )
return FALSE;
if ( !IsColumnMinimumFindable(&TempCol, CompareOp) )
return FALSE;
if ( ulRowNum == 0 )
{
// create data that won't match by creating data for a row that doesn't exist yet.
ulRowNum = pCTable->GetNextRowNumber();
}
if (!SUCCEEDED(hr = pCTable->MakeData( wszData,
ulRowNum,
ulColToFind,
PRIMARY,
( wColType == DBTYPE_VARIANT && ulRowNum > ULONG(g_lRowLast) ? DBTYPE_BSTR : wColType ),
FALSE,
&wVariantType)) )
goto CLEANUP;
if ( ulRowNum > ULONG(g_lRowLast) )
wVariantType = DBTYPE_BSTR;
if ( hr == S_OK && wVariantType != DBTYPE_NULL )
{
if ( CompareOp & DBCOMPAREOPS_CASEINSENSITIVE )
{
// Change first char to lowercase.
char szAnsi[3], szDest[3];
WCHAR wszDest[2];
DWORD cbWritten;
cbWritten = WideCharToMultiByte(CP_ACP, 0, wszData, 1, szAnsi, 3, NULL, NULL);
szAnsi[cbWritten] = '\0';
LCMapStringA(GetUserDefaultLCID(),LCMAP_LOWERCASE,szAnsi,-1,szDest,3);
cbWritten = MultiByteToWideChar(CP_ACP, 0, szDest, -1, wszDest, 2);
wszData[0] = wszDest[0];
}
if ( wBindType == DBTYPE_VARIANT )
{
BSTR bstr = SysAllocString(wszData);
pMakeData = (BYTE *)DBTYPE2VARIANT(&bstr, VT_BSTR);
SysFreeString(bstr);
}
else
{
pMakeData = (BYTE *)WSTR2DBTYPE(wszData, wBindType , &ulsize);
}
cbDataLength = GetDataLength(pMakeData, wBindType, ulsize);
m_pFindValue = (BYTE *)PROVIDER_ALLOC(cbDataLength+sizeof(FindValueInfo));
// Set up our m_pFindValue struct to match offsets we give to our Binding.
switch ( wBindType | wByRefType )
{
case DBTYPE_BSTR | DBTYPE_BYREF:
case DBTYPE_STR | DBTYPE_BYREF:
case DBTYPE_WSTR | DBTYPE_BYREF:
case DBTYPE_VARIANT | DBTYPE_BYREF:
memcpy(m_pFindValue+offsetof(FindValueInfo, pValue), &pMakeData, cbDataLength);
break;
default:
memcpy(m_pFindValue+offsetof(FindValueInfo, pValue), pMakeData, cbDataLength);
}
}
if ( hr == S_FALSE || wVariantType == DBTYPE_NULL)
{
m_pFindValue = (BYTE *)PROVIDER_ALLOC(sizeof(DBSTATUS)+2*sizeof(DBLENGTH));
*(DBSTATUS *)(m_pFindValue+offsetof(FindValueInfo, dbsStatus)) = DBSTATUS_S_ISNULL;
// bogus length shouldn't matter since NULL status was set
*(DBLENGTH *)(m_pFindValue+offsetof(FindValueInfo, cbLength)) = MAXDBCOUNTITEM;
}
else
{
*(DBSTATUS *)(m_pFindValue+offsetof(FindValueInfo, dbsStatus)) = DBSTATUS_S_OK;
switch ( wBindType )
{
case DBTYPE_WSTR:
*(DBLENGTH *)(m_pFindValue+offsetof(FindValueInfo, cbLength)) = cbDataLength-sizeof(WCHAR);
break;
case DBTYPE_STR:
*(DBLENGTH *)(m_pFindValue+offsetof(FindValueInfo, cbLength)) = cbDataLength-sizeof(char);
break;
default:
*(DBLENGTH *)(m_pFindValue+offsetof(FindValueInfo, cbLength)) = cbDataLength;
break;
}
}
// Create the binding
DBBINDING Binding;
Binding.iOrdinal = ulColToFind;
Binding.dwPart = DBPART_VALUE | DBPART_STATUS | DBPART_LENGTH;
Binding.eParamIO = DBPARAMIO_INPUT;
Binding.pTypeInfo = NULL;
Binding.obValue = offsetof(FindValueInfo, pValue);
Binding.cbMaxLen = cbDataLength;
Binding.obLength = offsetof(FindValueInfo, cbLength);
Binding.obStatus = offsetof(FindValueInfo, dbsStatus);
Binding.dwMemOwner = DBMEMOWNER_CLIENTOWNED;
Binding.wType = wBindType | wByRefType;
Binding.pBindExt = NULL;
Binding.bPrecision = BYTE(TempCol.GetPrecision());
Binding.bScale = BYTE(TempCol.GetScale());
// Lets create the accessor.
if ( FAILED( m_pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA, 1, &Binding, sizeof(FindValueInfo)+cbDataLength,
&m_hRowsetFindAccessor, NULL)) )
goto CLEANUP;
fRet = TRUE;
CLEANUP:
if( !wByRefType )
{
PROVIDER_FREE(pMakeData);
}
return fRet;
}
//--------------------------------------------------------------------
//
//@mfunc: Create Accessor for the pFindValue argument to IRowsetFind::FindNextRows
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::CreateFindValueAccessor
(
DBCOMPAREOP CompareOp,
CTable * pCTable,
DBLENGTH ulRowNum,
DBORDINAL ulColNum,
DBTYPE wColType,
eSUBCOMPAREOP eSubCompare,
BOOL fUseStream,
DBCOMPAREOP * pwNewCompareOp,
DBPART dbPart,
HRESULT * phrExpected
)
{
BOOL fChanged = FALSE;
BOOL fRet = FALSE;
WCHAR wszData[2000];
CCol TempCol;
USHORT ulsize;
DBLENGTH cbDataLength = 0;
BYTE * pMakeData;
DBTYPE wVariantType = DBTYPE_EMPTY;
HRESULT hr = S_FALSE;
void * pvData=NULL;
pCTable->GetColInfo(ulColNum, TempCol);
if(!IsColumnMinimumFindable(&TempCol, CompareOp))
return FALSE;
if(eSubCompare != SUBOP_ALWAYS_NULL)
{
if(ulRowNum == 0)
{
// create data that won't match by creating data for a row that doesn't exist yet.
ulRowNum = pCTable->GetNextRowNumber();
}
TESTC(SUCCEEDED(hr = pCTable->MakeData(
wszData,
ulRowNum,
ulColNum,
PRIMARY,
wColType,
FALSE,
&wVariantType)));
}
if(hr == S_OK && wVariantType != DBTYPE_NULL)
{
if ( CompareOp & DBCOMPAREOPS_CASEINSENSITIVE )
{
// Change all the characters to lower case
WCHAR * pwsz = NULL;
for (pwsz=wszData; *pwsz; pwsz++)
*pwsz = MapWCHAR(*pwsz, LCMAP_LOWERCASE);
}
pMakeData = (BYTE *)WSTR2DBTYPE(wszData, ( wColType == DBTYPE_VARIANT ? wVariantType : wColType ) , &ulsize );
cbDataLength = GetDataLength(pMakeData, wColType, ulsize);
if ( !AlterData(&pMakeData, CompareOp, ( wColType == DBTYPE_VARIANT ? wVariantType : wColType ), &cbDataLength, eSubCompare))
{
if ( pwNewCompareOp )
*pwNewCompareOp = DBCOMPAREOPS_EQ;
}
if ( !fUseStream )
m_pFindValue = (BYTE *)PROVIDER_ALLOC(cbDataLength+sizeof(FindValueInfo));
if ( wColType == DBTYPE_VARIANT )
{
pvData = DBTYPE2VARIANT(pMakeData, wVariantType);
}
else
pvData = pMakeData;
if ( fUseStream )
{
ULONG cbTmp = 0;
ASSERT(cbDataLength <= ULONG_MAX);
m_pISeqStream = new CStorage();
m_pISeqStream->Write(pMakeData, (ULONG)cbDataLength, &cbTmp);
m_pFindValue = (BYTE *)m_pISeqStream;
}
else
{
// Set up our m_pFindValue struct to match offsets we give to our Binding.
switch ( wColType )
{
case DBTYPE_STR | DBTYPE_BYREF:
case DBTYPE_WSTR | DBTYPE_BYREF:
memcpy(m_pFindValue+offsetof(FindValueInfo, pValue), &pvData, cbDataLength);
break;
default:
memcpy(m_pFindValue+offsetof(FindValueInfo, pValue), pvData, cbDataLength);
}
}
}
if ( hr == S_FALSE || wVariantType == DBTYPE_NULL)
{
// The cell the test is trying to match contains a NULL.
// In most cases, this means the original CompareOp cannot be used
if (CompareOp != DBCOMPAREOPS_IGNORE)
{
// If the CompareOp is not IGNORE
if ( pwNewCompareOp )
*pwNewCompareOp = DBCOMPAREOPS_EQ;
if ( !fUseStream )
m_pFindValue = (BYTE *)PROVIDER_ALLOC(sizeof(DBSTATUS)+2*sizeof(DBLENGTH));
*(DBSTATUS *)(m_pFindValue+offsetof(FindValueInfo, dbsStatus)) = DBSTATUS_S_ISNULL;
// bogus length shouldn't matter since NULL status was set
*(DBLENGTH *)(m_pFindValue+offsetof(FindValueInfo, cbLength)) = MAXDBCOUNTITEM-1;
}
}
else
{
*(DBSTATUS *)(m_pFindValue+offsetof(FindValueInfo, dbsStatus)) = DBSTATUS_S_OK;
switch ( wColType )
{
case DBTYPE_WSTR:
*(DBLENGTH *)(m_pFindValue+offsetof(FindValueInfo, cbLength)) = cbDataLength-sizeof(WCHAR);
break;
case DBTYPE_STR:
*(DBLENGTH *)(m_pFindValue+offsetof(FindValueInfo, cbLength)) = cbDataLength-sizeof(char);
break;
default:
*(DBLENGTH *)(m_pFindValue+offsetof(FindValueInfo, cbLength)) = cbDataLength;
break;
}
}
// Create the binding
DBBINDING Binding;
DBOBJECT ObjectStruct;
if ( !fUseStream )
{
Binding.iOrdinal = ulColNum;
Binding.dwPart = DBPART_VALUE | DBPART_STATUS | DBPART_LENGTH;
Binding.eParamIO = DBPARAMIO_INPUT;
Binding.pTypeInfo = NULL;
Binding.pObject = NULL;
Binding.obValue = offsetof(FindValueInfo, pValue);
Binding.cbMaxLen = cbDataLength;
Binding.obLength = offsetof(FindValueInfo, cbLength);
Binding.obStatus = offsetof(FindValueInfo, dbsStatus);
Binding.dwMemOwner = DBMEMOWNER_CLIENTOWNED;
Binding.wType = wColType;
Binding.pBindExt = NULL;
Binding.bPrecision = BYTE(TempCol.GetPrecision());
Binding.bScale = BYTE(TempCol.GetScale());
}
else
{
ObjectStruct.dwFlags = STGM_WRITE;
ObjectStruct.iid = IID_ISequentialStream;
Binding.iOrdinal = ulColNum;
Binding.dwPart = DBPART_VALUE;
Binding.eParamIO = DBPARAMIO_INPUT;
Binding.pTypeInfo = NULL;
Binding.pObject = &ObjectStruct;
Binding.obValue = 0;
Binding.cbMaxLen = 0;
Binding.obLength = 0;
Binding.obStatus = 0;
Binding.dwMemOwner = DBMEMOWNER_CLIENTOWNED;
Binding.wType = DBTYPE_IUNKNOWN;
Binding.pBindExt = NULL;
Binding.bPrecision = 0;
Binding.bScale = 0;
}
// Lets create the accessor.
TESTC(SUCCEEDED(m_pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA, 1, &Binding,
sizeof(FindValueInfo)+cbDataLength, &m_hRowsetFindAccessor, NULL)))
goto CLEANUP;
fRet = TRUE;
CLEANUP:
PROVIDER_FREE(pvData);
return fRet;
}
BOOL TCIRowsetFind::ReleaseFindValueAccessor
(
DBTYPE wdbType
)
{
DBREFCOUNT cRefCount;
if(!m_pIAccessor)
return FALSE;
if( m_hRowsetFindAccessor )
{
m_pIAccessor->ReleaseAccessor(m_hRowsetFindAccessor, &cRefCount);
m_hRowsetFindAccessor = NULL;
}
//Release pData, accessor and bindings using privlib helpers because we used FillInputBindings
if (m_pFindValue)
{
TESTC(SUCCEEDED(ReleaseInputBindingsMemory(m_cFindBindings, m_rgFindBindings, m_pFindValue, TRUE))) ;
m_pFindValue = NULL;
}
CLEANUP:
SAFE_DELETE(m_pISeqStream);
if (m_rgFindBindings)
{
//FreeAccessorBindings(m_cFindBindings, m_rgFindBindings);
for(DBCOUNTITEM i=0; i<m_cFindBindings; i++)
{
PROVIDER_FREE(m_rgFindBindings[i].pObject);
}
PROVIDER_FREE(m_rgFindBindings);
}
m_cFindBindings = 0;
return (cRefCount == 0);
}
//--------------------------------------------------------------------
//
//@mfunc: Sets up accessor, pFindValue information and calls
// IRowsetFind::FindNextRows
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::CallFindNextRows
(
CTable * pCTable, // Table to find from
BYTE * pBookmark, // Bookmark to fetch from, if any
ULONG_PTR cbBookmark, // Length of bookmark
DBROWCOUNT lRowsToFetch, // maps to cRows
DBROWOFFSET lOffset, // maps to lOffset
DBORDINAL ulColToMatch, // Column to match
DBCOUNTITEM ulRowToMatch, // Is there a row where the find should happen? 0 - no match
HRESULT hrExpAccessor, // Expected HRESULT for Create Accessor Step
DBCOUNTITEM ulRowsExpected, // Expected count of rows
BOOL fReleaseRows, // flag to Release rows (optional)
DBCOMPAREOP CompareOp, // Any particular preference for comparing? (optional)
eSUBCOMPAREOP eSubCompare, // Some comparisions are rich enough to deserve a mulitple comparision operations
HROW * phRows, // optional arg if client wants to control row handle mem
BOOL fCheckRows, // verify rows by comparing data ?
BOOL fUseStream, // Use ISeqStream in the test
HRESULT hrExpFind // Second expected HRESULT for the FindNextRow step
)
{
m_rghRowsFound = ( phRows ? phRows : NULL );
BOOL fClientOwnedRowsMemory = phRows!=NULL;
BOOL fTestPass = TEST_PASS;
CCol TempCol;
DBTYPE wColType = DBTYPE_EMPTY;
DBCOMPAREOP wNewCompareOp = -1;
pCTable->GetColInfo(ulColToMatch, TempCol);
wColType = TempCol.GetProviderType();
// Not all test variations provide the same HRESULT for both operations.
// Default case is to expect they are the same unless otherwise specified
if( hrExpFind == -1 ) hrExpFind = hrExpAccessor;
//setup find value: note - DBPART_INVALID resolves to valid default value
fTestPass = CreateFindValueAccessor(CompareOp, pCTable, ulRowToMatch, ulColToMatch, wColType, eSubCompare, fUseStream, &wNewCompareOp, DBPART_INVALID, &hrExpAccessor);
TESTC(fTestPass);
if(wNewCompareOp != - 1)
CompareOp = wNewCompareOp;
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
CompareOp, cbBookmark, pBookmark, lOffset,
lRowsToFetch, &m_cRowsFound, &m_rghRowsFound);
// Verify HRESULT
if ( !CHECK(m_hr,hrExpFind) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
// if FindNextRow failed, no need to validate returned rows
if (FAILED(m_hr))
{
goto CLEANUP;
}
// Verify m_cRowsFound
if ( !COMPARE(ulRowsExpected,m_cRowsFound) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
// Verify row positions of rows in m_rghRows.
if ( fCheckRows )
{
for ( ULONG i=0; i < ulRowsExpected; i ++ )
{
fTestPass = VerifyRowPosition(m_rghRowsFound[i],
(lRowsToFetch > 0 ? ulRowToMatch+i : ulRowToMatch-i),
pCTable);
if ( !COMPARE(fTestPass, TEST_PASS) )
goto CLEANUP;
}
}
// Cleanup
CLEANUP:
if ( fReleaseRows && m_cRowsFound > 0 && m_rghRowsFound)
{
m_pIRowset->ReleaseRows(m_cRowsFound, m_rghRowsFound, NULL, NULL, NULL);
m_cRowsFound = 0;
//free memory only if provider allocated it
if (!fClientOwnedRowsMemory)
PROVIDER_FREE(m_rghRowsFound);
}
ReleaseFindValueAccessor(wColType);
return fTestPass;
}
//--------------------------------------------------------------------
//
//@mfunc: Alters the data to according to the CompareOp
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::AlterData
(
BYTE ** ppMakeData,
DBCOMPAREOP TestCompareOp,
DBTYPE wColType,
DBLENGTH * pcbDataLength,
eSUBCOMPAREOP eSubCompare
)
{
DBCOMPAREOP CompareOp = TestCompareOp & ~(DBCOMPAREOPS_CASESENSITIVE | DBCOMPAREOPS_CASEINSENSITIVE);
if ( (CompareOp == DBCOMPAREOPS_GE || CompareOp == DBCOMPAREOPS_LE ||
CompareOp == DBCOMPAREOPS_BEGINSWITH || CompareOp == DBCOMPAREOPS_CONTAINS) &&
eSubCompare == SUBOP_ALWAYS_EQ )
return TRUE;
switch ( CompareOp )
{
case DBCOMPAREOPS_EQ:
{
switch ( wColType )
{
// Because multiple varnumerics can
// map to the same value
case DBTYPE_VARNUMERIC:
if(!AlterVarnumericData((BYTE **)ppMakeData, DBCOMPAREOPS_EQ, pcbDataLength))
return FALSE;
}
break;
}
case DBCOMPAREOPS_BEGINSWITH:
case DBCOMPAREOPS_CONTAINS:
{
switch ( wColType )
{
case DBTYPE_WSTR:
case DBTYPE_STR:
case DBTYPE_BSTR:
if(!AlterCharacterData((void **)ppMakeData, CompareOp, wColType, pcbDataLength, eSubCompare))
return FALSE;
break;
case DBTYPE_NULL:
return FALSE;
default:
odtLog << L"Unexpected Type for CONTAINS: "<< wColType << ENDL;
return FALSE;
}
break;
}
case DBCOMPAREOPS_NOTBEGINSWITH:
case DBCOMPAREOPS_NOTCONTAINS:
{
switch ( wColType )
{
case DBTYPE_WSTR:
case DBTYPE_STR:
case DBTYPE_BSTR:
if(!AlterCharacterData((void **)ppMakeData, CompareOp, wColType, pcbDataLength, eSubCompare))
return FALSE;
break;
case DBTYPE_NULL:
return FALSE;
default:
odtLog << L"Unexpected Type for NOTCONTAINS or NOTBEGINSWITH: "<<wColType<< ENDL;
return FALSE;
}
break;
}
case DBCOMPAREOPS_GE:
case DBCOMPAREOPS_GT:
switch ( wColType )
{
case DBTYPE_WSTR:
case DBTYPE_STR:
case DBTYPE_BSTR:
if(!AlterCharacterData((void **)ppMakeData, CompareOp, wColType, pcbDataLength, eSubCompare))
return FALSE;
break;
case DBTYPE_I1:
case DBTYPE_I2:
case DBTYPE_I4:
case DBTYPE_I8:
case DBTYPE_UI1:
case DBTYPE_UI2:
case DBTYPE_UI4:
case DBTYPE_UI8:
case DBTYPE_R4:
case DBTYPE_R8:
case DBTYPE_NUMERIC:
case DBTYPE_DECIMAL:
case DBTYPE_CY:
case DBTYPE_DATE:
case DBTYPE_DBTIME:
case DBTYPE_DBDATE:
case DBTYPE_DBTIMESTAMP:
case DBTYPE_ERROR:
case DBTYPE_VARNUMERIC:
AlterNumericData(ppMakeData, CompareOp, wColType, pcbDataLength);
break;
case DBTYPE_NULL:
return FALSE;
default:
odtLog << L"Unexpected Type for GT/GE: " << wColType << ENDL;
return FALSE;
}
break;
case DBCOMPAREOPS_LT:
case DBCOMPAREOPS_LE:
switch ( wColType )
{
case DBTYPE_WSTR:
case DBTYPE_STR:
case DBTYPE_BSTR:
if(!AlterCharacterData((void **)ppMakeData, CompareOp, wColType, pcbDataLength, eSubCompare))
return FALSE;
break;
case DBTYPE_I1:
case DBTYPE_I2:
case DBTYPE_I4:
case DBTYPE_I8:
case DBTYPE_UI1:
case DBTYPE_UI2:
case DBTYPE_UI4:
case DBTYPE_UI8:
case DBTYPE_R4:
case DBTYPE_R8:
case DBTYPE_NUMERIC:
case DBTYPE_DECIMAL:
case DBTYPE_CY:
case DBTYPE_DATE:
case DBTYPE_DBTIME:
case DBTYPE_DBDATE:
case DBTYPE_DBTIMESTAMP:
case DBTYPE_ERROR:
case DBTYPE_VARNUMERIC:
if(!AlterNumericData(ppMakeData, CompareOp, wColType, pcbDataLength))
return FALSE;
break;
case DBTYPE_NULL:
return FALSE;
default:
odtLog << L"Unexpected Type for LT/LE: " << wColType << ENDL;
return FALSE;
}
break;
case DBCOMPAREOPS_NE:
// Alter the data
switch ( wColType )
{
case DBTYPE_BYTES:
((BYTE *)*ppMakeData)[0] = ~(*(BYTE *)*ppMakeData);
break;
case DBTYPE_WSTR:
case DBTYPE_BSTR:
case DBTYPE_STR:
if(!AlterCharacterData((void **)ppMakeData, DBCOMPAREOPS_LT, wColType, pcbDataLength, SUBOP_EMPTY))
return FALSE;
break;
case DBTYPE_BOOL:
if ( *(VARIANT_BOOL *)*ppMakeData == VARIANT_TRUE )
*(VARIANT_BOOL *)*ppMakeData = VARIANT_FALSE;
else
*(VARIANT_BOOL *)*ppMakeData = VARIANT_TRUE;
break;
case DBTYPE_NULL:
return FALSE;
case DBTYPE_GUID:
memset(*ppMakeData, 0xCA, sizeof(GUID));
break;
case DBTYPE_UDT:
odtLog << L"!!! AlterData NOT IMPLEMENTED for DBTYPE_UDT !!!" << ENDL;
return FALSE;
default:
if(!AlterNumericData(ppMakeData, DBCOMPAREOPS_LT, wColType, pcbDataLength))
return FALSE;
break;
}
break;
case DBCOMPAREOPS_IGNORE:
if( wColType == DBTYPE_BSTR )
{
BSTR bstrVal = *((BSTR*)(*ppMakeData));
// Jumble the first byte of data to test that it is actually ignored.
memset(bstrVal, 0xCA, 1);
}
else
{
// Jumble the first byte of data to test that it is actually ignored.
memset(*ppMakeData, 0xCA, 1);
}
break;
default:
break;
}
return TRUE;
}
BOOL TCIRowsetFind::AlterCharacterData
(
void ** ppMakeData,
DBCOMPAREOP CompareOp,
DBTYPE wColType,
DBLENGTH * pcbDataLength,
eSUBCOMPAREOP eSubCompare
)
{
ASSERT(ppMakeData && *ppMakeData);
void * pMakeData = *ppMakeData;
DBLENGTH cchDataLength = 0;
DBLENGTH cbDataLength = *pcbDataLength;
if ( wColType == DBTYPE_WSTR )
cchDataLength = (cbDataLength - sizeof(WCHAR))/sizeof(WCHAR);
else if ( wColType == DBTYPE_BSTR )
cchDataLength = SysStringLen( *(BSTR *)(pMakeData) );
else if ( wColType == DBTYPE_STR )
cchDataLength = cbDataLength - sizeof(char);
switch ( CompareOp )
{
case DBCOMPAREOPS_NOTCONTAINS:
case DBCOMPAREOPS_NOTBEGINSWITH:
// all MakeData Strings begin with a digit or the letter 'H'
// use 'Q' to cause a match for NOTCONTAINS or NOTBEGINSWITH
switch ( wColType )
{
case DBTYPE_WSTR:
((WCHAR *)pMakeData)[0] = L'Q';
((WCHAR *)pMakeData)[1] = L'\0';
break;
case DBTYPE_STR:
((char *)pMakeData)[0] = 'Q';
((char *)pMakeData)[1] = '\0';
break;
case DBTYPE_BSTR:
{
(*(BSTR *)pMakeData)[0] = L'Q';
(*(BSTR *)pMakeData)[1] = L'\0';
SysReAllocString((BSTR *)pMakeData, *(BSTR *)pMakeData);
break;
}
default:
odtLog << L"Unexpected Type for NOTBEGINSWITH/NOTCONTAINS: " << wColType << ENDL;
return FALSE;
}
break;
case DBCOMPAREOPS_BEGINSWITH:
// blank out some of the last characters
switch ( wColType )
{
case DBTYPE_WSTR:
((WCHAR *)pMakeData)[cchDataLength-3] = L'\0';
break;
case DBTYPE_STR:
{
char *szTmp = CharPrevExA(CP_ACP, (char *)pMakeData, (char *)pMakeData+cchDataLength, 0);
*szTmp = '\0';
}
break;
case DBTYPE_BSTR:
{
(*(BSTR *)pMakeData)[cchDataLength-3] = L'\0';
SysReAllocString((BSTR *)pMakeData, *(BSTR *)pMakeData);
break;
}
default:
odtLog << L"Unexpected Type for BEGINSWITH: " << wColType << ENDL;
return FALSE;
}
break;
case DBCOMPAREOPS_CONTAINS:
switch ( eSubCompare )
{
case SUBOP_CONTAINS_BEGIN:
// Reduces to previous case
switch ( wColType )
{
case DBTYPE_WSTR:
((WCHAR *)pMakeData)[cchDataLength-3] = L'\0';
break;
case DBTYPE_STR:
{
char *szTmp = CharPrevExA(CP_ACP, (char *)pMakeData, (char *)pMakeData+cchDataLength, 0);
*szTmp = '\0';
}
break;
case DBTYPE_BSTR:
{
(*(BSTR *)pMakeData)[cchDataLength-3] = L'\0';
SysReAllocString((BSTR *)pMakeData, *(BSTR *)pMakeData);
break;
}
default:
odtLog << L"Unexpected Type for CONTAINS: " << wColType << ENDL;
return FALSE;
}
break;
case SUBOP_CONTAINS_MIDDLE:
case SUBOP_CONTAINS_END:
{
const int cchTrim = 2; // characters to trim
BYTE *pTmpBuf = (BYTE *)PROVIDER_ALLOC( (cchDataLength+1) * sizeof(WCHAR) );
switch ( wColType )
{
case DBTYPE_WSTR:
memcpy(pTmpBuf, (BYTE *)pMakeData+(cchTrim*sizeof(WCHAR)), (cchDataLength-cchTrim)*sizeof(WCHAR));
memcpy(pMakeData, pTmpBuf, (cchDataLength-cchTrim)*sizeof(WCHAR));
if ( eSubCompare == SUBOP_CONTAINS_END )
((WCHAR *)pMakeData)[cchDataLength-cchTrim] = L'\0';
else
((WCHAR *)pMakeData)[cchDataLength-(2*cchTrim)] = L'\0';
break;
case DBTYPE_STR:
{
char *szTmp = (char *)pMakeData;
szTmp = CharNextA((char *)pMakeData);
szTmp = CharNextA(szTmp);
ULONG_PTR cbTrim = szTmp - (char *)pMakeData ;
memcpy(pTmpBuf, (BYTE *)szTmp, cchDataLength-cbTrim);
memcpy(pMakeData, pTmpBuf, cchDataLength-cbTrim);
((char *)pMakeData)[cchDataLength-cbTrim] = '\0';
if ( eSubCompare == SUBOP_CONTAINS_END )
{
((char *)pMakeData)[cchDataLength-cbTrim] = '\0';
}
else
{
((char *)pMakeData)[cchDataLength-cbTrim] = '\0';
char *szTmp = CharPrevExA(CP_ACP, (char *)pMakeData, (char *)pMakeData+(cchDataLength-cbTrim), 0);
*szTmp = '\0';
}
}
break;
case DBTYPE_BSTR:
{
WCHAR * wsz = *(BSTR *)pMakeData;
memcpy(pTmpBuf, (BYTE *)wsz+(cchTrim*sizeof(WCHAR)), (cchDataLength-cchTrim)*sizeof(WCHAR));
memcpy(wsz, pTmpBuf, (cchDataLength-cchTrim)*sizeof(WCHAR));
if ( eSubCompare == SUBOP_CONTAINS_END )
((WCHAR *)wsz)[cchDataLength-cchTrim] = L'\0';
else
((WCHAR *)wsz)[cchDataLength-(2*cchTrim)] = L'\0';
SysReAllocString((BSTR *)pMakeData, *(BSTR *)pMakeData);
break;
}
default:
odtLog << L"Unexpected Type for CONTAINS: " << wColType << ENDL;
return FALSE;
}
PROVIDER_FREE(pTmpBuf);
break;
}
default:
ASSERT(!"Illegal Sub Compare Op");
}
break;
case DBCOMPAREOPS_GT:
case DBCOMPAREOPS_GE:
// truncate a character.
switch ( wColType )
{
case DBTYPE_WSTR:
cbDataLength -= sizeof(WCHAR);
((WCHAR *)pMakeData)[cchDataLength-1] = L'\0';
break;
case DBTYPE_STR:
{
char *szTmp = CharPrevExA(CP_ACP, (char *)pMakeData, (char *)pMakeData+cchDataLength, 0);
cbDataLength = (szTmp-(char *)pMakeData)+sizeof(char);
*szTmp = '\0';
break;
}
case DBTYPE_BSTR:
{
(*(BSTR *)pMakeData)[cchDataLength-1] = L'\0';
break;
}
default:
odtLog << L"Unexpected Type for GT/GE: " << wColType << ENDL;
return FALSE;
}
*pcbDataLength = cbDataLength;
break;
case DBCOMPAREOPS_LT:
case DBCOMPAREOPS_LE:
{
// add a character 'a'
void * pReAllocData = NULL;
switch ( wColType )
{
case DBTYPE_WSTR:
cbDataLength += sizeof(WCHAR);
pReAllocData = PROVIDER_ALLOC(cbDataLength);
wcscpy((WCHAR *)pReAllocData, (WCHAR *)pMakeData);
((WCHAR *)pReAllocData)[cchDataLength] = L'a';
((WCHAR *)pReAllocData)[cchDataLength+1] = L'\0';
PROVIDER_FREE(*ppMakeData);
*ppMakeData = pReAllocData;
break;
case DBTYPE_STR:
cbDataLength += sizeof(char);
pReAllocData = PROVIDER_ALLOC(cbDataLength);
strcpy((char *)pReAllocData, (char *)pMakeData);
((char *)pReAllocData)[cchDataLength] = 'a';
((char *)pReAllocData)[cchDataLength+1] = '\0';
PROVIDER_FREE(*ppMakeData);
*ppMakeData = pReAllocData;
break;
case DBTYPE_BSTR:
if( (cchDataLength+1) > ULONG_MAX )
return FALSE;
pReAllocData = SysAllocStringLen(NULL, (ULONG)(cchDataLength+1));
wcscpy((WCHAR *)pReAllocData, *(BSTR *)pMakeData);
((WCHAR *)pReAllocData)[cchDataLength] = L'a';
((WCHAR *)pReAllocData)[cchDataLength+1] = L'\0';
SysFreeString(*(BSTR *)pMakeData);
*(BSTR *)pMakeData = (BSTR)pReAllocData;
break;
default:
odtLog << L"Unexpected Type for LT/LE: " << wColType << ENDL;
return FALSE;
}
*pcbDataLength = cbDataLength;
}
break;
default:
ASSERT(!"Illegal Compare Op");
break;
}
switch ( wColType )
{
case DBTYPE_WSTR:
*pcbDataLength=(wcslen((WCHAR*)(*ppMakeData))+1)*sizeof(WCHAR);
break;
case DBTYPE_STR:
*pcbDataLength=(strlen((char*)(*ppMakeData))+1)*sizeof(char);
break;
}
return TRUE;
}
BOOL TCIRowsetFind::AlterNumericData
(
BYTE ** ppMakeData,
DBCOMPAREOP CompareOp,
DBTYPE wColType,
DBLENGTH * pcbDataLength
)
{
// Find value to increment, decrement by.
// If CompareOps = GT or GE, we set the find value to the backend value decremented so that
// the match will pick up the backend value
double dblChangeVal;
BYTE * pMakeData = *ppMakeData;
switch ( wColType )
{
case DBTYPE_I1:
case DBTYPE_I2:
case DBTYPE_I4:
case DBTYPE_I8:
case DBTYPE_UI1:
case DBTYPE_UI2:
case DBTYPE_UI4:
case DBTYPE_UI8:
case DBTYPE_CY:
case DBTYPE_NUMERIC:
case DBTYPE_DECIMAL:
case DBTYPE_ERROR:
if ( CompareOp == DBCOMPAREOPS_GT || CompareOp == DBCOMPAREOPS_GE )
dblChangeVal = -1;
else if ( CompareOp == DBCOMPAREOPS_LT || CompareOp == DBCOMPAREOPS_LE )
dblChangeVal = 1;
break;
case DBTYPE_R4:
if ( CompareOp == DBCOMPAREOPS_GT || CompareOp == DBCOMPAREOPS_GE )
dblChangeVal = -0.5;
else if ( CompareOp == DBCOMPAREOPS_LT || CompareOp == DBCOMPAREOPS_LE )
dblChangeVal = 0.5;
break;
case DBTYPE_R8:
if ( CompareOp == DBCOMPAREOPS_GT || CompareOp == DBCOMPAREOPS_GE )
dblChangeVal = -0.1;
else if ( CompareOp == DBCOMPAREOPS_LT || CompareOp == DBCOMPAREOPS_LE )
dblChangeVal = 0.1;
break;
case DBTYPE_VARNUMERIC:
break; // nothing to do - the test has only special cases for varnumeric
case DBTYPE_DATE:
case DBTYPE_DBTIME:
case DBTYPE_DBTIMESTAMP:
if ( CompareOp == DBCOMPAREOPS_GT || CompareOp == DBCOMPAREOPS_GE )
dblChangeVal = -1.0/1440.0; // one minute in OLE Date format
else if ( CompareOp == DBCOMPAREOPS_LT || CompareOp == DBCOMPAREOPS_LE )
dblChangeVal = 1.0/1440.0;
break;
case DBTYPE_DBDATE:
if ( CompareOp == DBCOMPAREOPS_GT || CompareOp == DBCOMPAREOPS_GE )
dblChangeVal = -1.0; // one day in OLE Date format
else if ( CompareOp == DBCOMPAREOPS_LT || CompareOp == DBCOMPAREOPS_LE )
dblChangeVal = 1.0;
break;
default:
ASSERT(!"Shouldn't get here");
}
double dblValue = dblChangeVal;
// Perform data change
switch ( wColType )
{
case DBTYPE_I1:
*(signed char *)pMakeData += (signed char)(dblValue);
break;
case DBTYPE_I2:
*(short *)pMakeData += short(dblValue);
break;
case DBTYPE_I4:
*(long *)pMakeData += long(dblValue);
break;
case DBTYPE_I8:
*(__int64 *)pMakeData += (__int64)(dblValue);
break;
case DBTYPE_UI1:
*(unsigned char *)pMakeData += (char)(dblValue);
break;
case DBTYPE_UI2:
*(unsigned short *)pMakeData += (short)(dblValue);
break;
case DBTYPE_UI4:
*(unsigned long *)pMakeData += (long)(dblValue);
break;
case DBTYPE_UI8:
*(__int64 *)pMakeData += (__int64)(dblValue);
break;
case DBTYPE_CY:
*(__int64 *)pMakeData += (__int64)(dblValue);
break;
case DBTYPE_NUMERIC:
AddShortToNumeric((DB_NUMERIC *)pMakeData, short(dblValue));
break;
case DBTYPE_DECIMAL:
AddShortToDecimal((DECIMAL *)pMakeData, short(dblValue));
break;
case DBTYPE_ERROR:
*(long *)pMakeData += long(dblValue);
break;
case DBTYPE_R4:
*(float *)pMakeData += float(dblValue);
break;
case DBTYPE_R8:
*(double *)pMakeData += double(dblValue);
break;
case DBTYPE_DATE:
*(double *)pMakeData += double(dblValue);
break;
case DBTYPE_VARNUMERIC:
if(!AlterVarnumericData(ppMakeData, CompareOp, pcbDataLength))
return FALSE;
break;
case DBTYPE_DBTIME:
{
LONG lSeconds;
DBTIME *time = (DBTIME *)pMakeData;
lSeconds = time->hour * 3600 + time->minute * 60 + time->second + LONG(dblValue);
ASSERT(lSeconds < 86400 );
time->hour = (USHORT)(lSeconds / 3600);
time->minute = (USHORT)((lSeconds % 3600) / 60);
time->second = (USHORT)(lSeconds % 60);
break;
}
case DBTYPE_DBTIMESTAMP:
{
SYSTEMTIME SystemTime;
DATE dOleDate;
SystemTime.wYear = ((DBTIMESTAMP *)pMakeData)->year;
SystemTime.wMonth = ((DBTIMESTAMP *)pMakeData)->month;
SystemTime.wDay = ((DBTIMESTAMP *)pMakeData)->day;
SystemTime.wHour = ((DBTIMESTAMP *)pMakeData)->hour;
SystemTime.wMinute = ((DBTIMESTAMP *)pMakeData)->minute;
SystemTime.wSecond = ((DBTIMESTAMP *)pMakeData)->second;
SystemTimeToVariantTime(&SystemTime, &dOleDate);
dOleDate += dblValue;
VariantTimeToSystemTime(dOleDate, &SystemTime);
((DBTIMESTAMP *)pMakeData)->year = SystemTime.wYear;
((DBTIMESTAMP *)pMakeData)->month = SystemTime.wMonth;
((DBTIMESTAMP *)pMakeData)->day = SystemTime.wDay;
((DBTIMESTAMP *)pMakeData)->hour = SystemTime.wHour;
((DBTIMESTAMP *)pMakeData)->minute = SystemTime.wMinute;
((DBTIMESTAMP *)pMakeData)->second = SystemTime.wSecond;
}
break;
case DBTYPE_DBDATE:
{
SYSTEMTIME SystemTime;
DATE dOleDate;
SystemTime.wYear = ((DBDATE *)pMakeData)->year;
SystemTime.wMonth = ((DBDATE *)pMakeData)->month;
SystemTime.wDay = ((DBDATE *)pMakeData)->day;
SystemTimeToVariantTime(&SystemTime, &dOleDate);
dOleDate += dblValue;
VariantTimeToSystemTime(dOleDate, &SystemTime);
((DBDATE *)pMakeData)->year = SystemTime.wYear;
((DBDATE *)pMakeData)->month = SystemTime.wMonth;
((DBDATE *)pMakeData)->day = SystemTime.wDay;
}
break;
default:
ASSERT(!"Shouldn't get here");
}
return TRUE;
}
BOOL TCIRowsetFind::AlterVarnumericData
(
BYTE ** ppMakeData,
DBCOMPAREOP CompareOp,
DBLENGTH * pcbDataLength
)
{
// 3 "Equal" options
// a) s_VarNumEqOption=0 => leave the varnum alone
// b) s_VarNumEqOption=1 => inc. scale, mult by 10
// c) s_VarNumEqOption=2 => dec. scale, div by 10
static long s_VarNumEqOption = 0;
static SBYTE s_MaxScale = 127; // max possible VarNum scale
static SBYTE s_MinScale = -128;// min possible VarNum scale
BYTE bRemainder=0;
DB_VARNUMERIC * pVarNum = (DB_VARNUMERIC *)*ppMakeData;
DB_VARNUMERIC * pNewVarNum = NULL;
ULONG cbVarNumeric;
ASSERT(ppMakeData && *ppMakeData && pcbDataLength);
ASSERT(*pcbDataLength <= MAX_VARNUM_BYTE_SIZE); // max varnumeric byte length is 111.
cbVarNumeric = (ULONG) *pcbDataLength;
if (pVarNum->sign==0) // if negative
{
if (CompareOp==DBCOMPAREOPS_GT || CompareOp==DBCOMPAREOPS_GE)
CompareOp=DBCOMPAREOPS_LT;
else if (CompareOp==DBCOMPAREOPS_LT || CompareOp==DBCOMPAREOPS_LE)
CompareOp=DBCOMPAREOPS_GT;
}
switch (CompareOp)
{
case DBCOMPAREOPS_EQ:
switch (s_VarNumEqOption)
{
case 0:
break;
case 1:
{
DB_VARNUMERIC *pNewVarNum=NULL;
if(pVarNum->scale==s_MaxScale || pVarNum->precision==255)
return FALSE;
pNewVarNum = (DB_VARNUMERIC *)PROVIDER_ALLOC(cbVarNumeric+1);
if (!pNewVarNum)
return FALSE;
memset(pNewVarNum, 0, cbVarNumeric+1);
memcpy(pNewVarNum, pVarNum, cbVarNumeric);
AddCharToVarNumericVal(L'0',pNewVarNum, USHORT(cbVarNumeric+1)-sizeof(DB_VARNUMERIC)+1);
pNewVarNum->precision++; // inc to compensate for new digit
pNewVarNum->scale++; // inc to the scale to compensate for mult by 10
PROVIDER_FREE(pVarNum);
*ppMakeData = (BYTE *)pNewVarNum;
(*pcbDataLength)++;
}
break;
case 2:
{
DB_VARNUMERIC *pTempVar=NULL;
pTempVar = (DB_VARNUMERIC *)PROVIDER_ALLOC(cbVarNumeric);
if (!pTempVar)
return FALSE;
memcpy(pTempVar, pVarNum, cbVarNumeric);
if (pVarNum->scale==s_MinScale)
return FALSE;
VarNumericDiv10Rem(pTempVar, pTempVar, (cbVarNumeric)-sizeof(DB_VARNUMERIC)+1, &bRemainder);
if(bRemainder!=0)
return FALSE; // not able to guarantee unchanged value
// this can work, so copy the contents
memcpy(pVarNum, pTempVar, cbVarNumeric);
PROVIDER_FREE(pTempVar);
pVarNum->precision--; // decrement the precision to compensate for div by 10
break;
}
default:
ASSERT(!"Bad Eq option");
break;
}
s_VarNumEqOption = (s_VarNumEqOption+1)%3;
break;
case DBCOMPAREOPS_GT:
case DBCOMPAREOPS_GE:
// make value smaller.
if (pVarNum->scale==s_MaxScale)
{
VarNumericDiv10Rem(pVarNum, pVarNum, cbVarNumeric, &bRemainder);
pVarNum->precision--; // decrement the precision to compensate for div by 10
// it's possible that the value remains unchanged.
// force it to be less
if (bRemainder==0)
pVarNum->scale++; // incrementing the scale is safe even though pVarNum->scale == s_MaxScale
} // because the scale is decremented by the call to VarNumericDiv10Rem.
else
pVarNum->scale++; // just increment the scale
break;
case DBCOMPAREOPS_LT:
case DBCOMPAREOPS_LE:
// make value larger
if (pVarNum->scale==s_MinScale)
{
// Add a digit to the number as long as it doesn't overflow
// a varnum's max precision = 255
if (pVarNum->precision==255)
return FALSE;
pNewVarNum = (DB_VARNUMERIC *)PROVIDER_ALLOC(cbVarNumeric+1);
if (!pNewVarNum)
return FALSE;
memset(pNewVarNum, 0, cbVarNumeric+1);
memcpy(pNewVarNum, pVarNum, cbVarNumeric);
AddCharToVarNumericVal(L'1', pNewVarNum, USHORT(cbVarNumeric)-sizeof(DB_VARNUMERIC)+1);
PROVIDER_FREE(pVarNum);
pNewVarNum->precision++; // inc to compensate for new digit
*ppMakeData = (BYTE *)pNewVarNum;
(*pcbDataLength)++;
}
else
pVarNum->scale--; // just decrement the scale
break;
default:
ASSERT(!"Bad compare option to AlterVarnumericData");
}
return TRUE;
}
BOOL TCIRowsetFind::BindingTypeTest
(
CTable * pCTable,
DBTYPE wBindingType
)
{
HRESULT hr = E_FAIL;
BOOL fTestPass = TEST_SKIPPED;
DBPROPID guidProperty[1];
HROW * phrow = NULL;
DBCOUNTITEM cRowsObtained;
DBORDINAL ulColToFind;
DBTYPE wColType = DBTYPE_EMPTY;
CCol TempCol;
DBORDINAL ulColNum = pCTable->CountColumnsOnTable();
TESTC_DRIVER(g_rgDBPrpt[IDX_IRowsetLocate].fSupported);
guidProperty[0] = DBPROP_IRowsetLocate;
//open rowset, and accessor.
TESTC(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
1,guidProperty,DBACCESSOR_ROWDATA, DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,
ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, NULL, EXECUTE_IFNOERROR, DBTYPE_EMPTY,
TRUE));
TESTC(GetVariableLengthStrAndUpdatable(&ulColToFind, DBCOMPAREOPS_EQ, FALSE, &wColType));
TESTC_(m_pIConvertType->CanConvert(wBindingType, wColType, DBCONVERTFLAGS_COLUMN), S_OK);
for(DBORDINAL ulColIndex = 1; ulColIndex <= ulColNum; ulColIndex++)
{
m_pIRowset->RestartPosition(DB_NULL_HCHAPTER);
pCTable->GetColInfo(ulColIndex, TempCol);
wColType = TempCol.GetProviderType();
TEST2C_(hr=m_pIConvertType->CanConvert(wBindingType, wColType, DBCONVERTFLAGS_COLUMN), S_OK, S_FALSE);
if (hr==S_FALSE)
continue;
TESTC(fTestPass = CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, ulColToFind, wBindingType, SUBOP_EMPTY, false, NULL));
fTestPass = TEST_FAIL;
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor,
m_pFindValue, DBCOMPAREOPS_EQ, 0, NULL, 0,
1, &cRowsObtained, &phrow);
if (m_hr != S_OK)
{
odtLog<<L"Error at ColIndex "<<ulColToFind<<L" Binding type = "<<wBindingType<<L"; column type = "<<wColType<< ENDL;
odtLog<<L"-------------------------------------------------------------"<< ENDL;
}
TESTC_(m_hr, S_OK);
TESTC(cRowsObtained==1);
TESTC(VerifyRowPosition(phrow[0], 1, g_pCTable));
if ( cRowsObtained > 0 && phrow)
{
m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL);
cRowsObtained = 0;
if (phrow)
PROVIDER_FREE(phrow);
}
}
fTestPass = TEST_PASS;
CLEANUP:
if ( cRowsObtained > 0 && phrow)
{
m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL);
cRowsObtained = 0;
if (phrow)
PROVIDER_FREE(phrow);
}
ReleaseFindValueAccessor(wBindingType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
BOOL TCIRowsetFind::CompareOpTest
(
CTable * pCTable,
DBCOMPAREOP CompareOp,
eSUBCOMPAREOP eSubCompare,
BOOL fUseStream
)
{
if(!pCTable || !m_pIRowset)
{
odtLog << L"ASSERT (pCTable && m_pIRowset)" <<ENDL;
return TEST_FAIL;
}
// Service components do not support conversion to streams
if (fUseStream && ((GetModInfo()->UseServiceComponents() & SERVICECOMP_INVOKE) == SERVICECOMP_INVOKE))
{
return TEST_SKIPPED;
}
BOOL fTestPass = TEST_PASS, fSubTestPass = TEST_FAIL;
CCol TempCol;
DBORDINAL ulColNum = pCTable->CountColumnsOnTable();
DBCOUNTITEM ulRowCount = pCTable->GetRowsOnCTable();
//CLEANUP from previous variations: need this for RestartPosition to succeed
if( m_rghRowsFound && m_cRowsFound >0 && m_rghRowsFound)
{
m_pIRowset->ReleaseRows(m_cRowsFound, m_rghRowsFound, NULL, NULL, NULL);
PROVIDER_FREE(m_rghRowsFound);
m_cRowsFound = 0;
}
for(DBORDINAL ulColIndex = 1; ulColIndex <= ulColNum; ulColIndex++)
{
m_pIRowset->RestartPosition(DB_NULL_HCHAPTER);
g_pCTable->GetColInfo(ulColIndex, TempCol);
// Make Sure it's updateable and searchable, otherwise it may be an
// autoinc column that we don't know the value of.
if (!IsColumnMinimumFindable(&TempCol, CompareOp) || (fUseStream && (!TempCol.GetIsLong() ||
(TempCol.GetProviderType() != DBTYPE_STR &&
TempCol.GetProviderType() != DBTYPE_WSTR &&
TempCol.GetProviderType() != DBTYPE_BYTES))))
continue;
for ( ULONG ulRowIndex = 1; ulRowIndex <= ulRowCount+1; ulRowIndex++ )
{
HRESULT hrExp1 = ulRowIndex <= ulRowCount ? S_OK : DB_S_ENDOFROWSET;
ULONG ulRow = ulRowIndex <= ulRowCount ? 1 : 0;
BOOL bVerify = TRUE;
WCHAR wszName[256];
wcscpy(wszName, TempCol.GetProviderTypeName());
// Expect DB_E_BADCOMPAREOP when the data type is "image" and the compare operator is not DBCOMPAREOPS_IGNORE
// Basically this is the only workaround not related to DBCOMPAREOPS_IGNORE. Everything else is.
if( wcscmp(wszName, L"image") == 0 && CompareOp != DBCOMPAREOPS_IGNORE )
hrExp1 = DB_E_BADCOMPAREOP;
// Dont bother to verify data of returned rows when compare operator is DBCOMPAREOPS_IGNORE. Too many errors on specific
// row / column combinations. Trying to make a table and check pass / fail for each would be difficult. So were just skipping.
// Note all other compare operators are working fine.
if( CompareOp == DBCOMPAREOPS_IGNORE )
bVerify = FALSE;
// It was explained that the data in the tables is generated with NULLs in the spots where the row / column numbers
// intersect. IE r1c1, r2c2, etc. It would appear to be an issue with NULL data and DBCOMPAREOPS_IGNORE. Does not
// which data type is used in the "pFindValue" field, or whether we use SQLOLEDB or MSDASQL/SQL. Its always the
// case where ColumnIndex = RowIndex.
// NOTE There are 3 specific exceptions below.
if( CompareOp == DBCOMPAREOPS_IGNORE && ulColIndex == ulRowIndex )
hrExp1 = E_INVALIDARG;
HRESULT hrExp2 = hrExp1;
fSubTestPass =
CallFindNextRows
(
pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
ulColIndex, // Which column to match
ulRowIndex, // row to match
hrExp1, // HRESULT to verify
ulRow, // How many rows to expect.
TRUE, // Release Rows
CompareOp, // Specifically ask for a compare Op
eSubCompare, // Sub Comparision option
NULL, // Use client or provider memory, default=provider
bVerify, // verify rows by comparing data ?
fUseStream, // use fstream
hrExp2 // HRESULT for actual operation
);
if ( fSubTestPass == TEST_FAIL )
{
fTestPass = TEST_FAIL;
odtLog<<"Error at ColName "<< TempCol.GetColName()<<L", ColIndex "<<ulColIndex<<" and at RowIndex "<<ulRowIndex<< ENDL;
odtLog<<"-------------------------------------------------------------"<< ENDL;
break;
}
}
}
return fTestPass;
}
BOOL TCIRowsetFind::DeleteRow
(
CTable * pCTable,
DBCOUNTITEM ulRowToDelete
)
{
ASSERT(pCTable && ulRowToDelete >0 && ULONG(g_lRowLast) >= ulRowToDelete);
DBCOUNTITEM cRowsObtained = 0;
HROW * pHRow = NULL;
IRowsetChange * pIRowsetChange = NULL;
//get the row handle for row to delete
TESTC_(m_pIRowset->GetNextRows(NULL, ulRowToDelete-1,1,&cRowsObtained,&pHRow),S_OK);
COMPARE(cRowsObtained, 1);
//QI for IRowsetChange pointer
TESTC_(m_pIRowsetFind->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange),S_OK);
//delete the row
TESTC_(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK);
CLEANUP:
SAFE_RELEASE(pIRowsetChange);
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//restart the cursor position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
return FALSE;
return TRUE;
}
DWORD TCIRowsetFind::TC_FindCompareOps
(
DBID * pColDBID
)
{
return GetFindCompareOps(m_pIRowset, pColDBID);
}
//--------------------------------------------------------------------
//
//@mfunc: verify that updating / deleting rows is OK against this provider.
//
// The result of this particular function is independant of whether the provider
// allows updates/deletes. The focus is rather whether deleting a row will
// cause the table to fall into an "unknown" state.
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::AlteringRowsIsOK()
{
// If a specific table was set on the backend, assume we cannot alter it
// unless we have a file telling us how to regenerate the table.
if ( GetModInfo()->GetTableName() && !GetModInfo()->GetFileName() )
return FALSE;
else
return TRUE;
}
BOOL TCIRowsetFind::IsColumnMinimumFindable(CCol *pCol, DBCOMPAREOP CompareOp)
{
DBTYPE wTargetType;
if(!ValidateCompareOp ( TC_FindCompareOps(pCol->GetColID()), CompareOp ))
return FALSE;
CompareOp &= ~( DBCOMPAREOPS_CASESENSITIVE | DBCOMPAREOPS_CASEINSENSITIVE );
if ( !pCol->GetUpdateable())
return FALSE; // autoinc column we don't know the value of
wTargetType = pCol->GetProviderType();
if(wTargetType == DBTYPE_VARIANT)
return FALSE;
return IsTypeFindable(wTargetType, CompareOp);
}
BOOL TCIRowsetFind::IsTypeFindable(DBTYPE wType, DBCOMPAREOP CompareOp, DBTYPE wSubType)
{
CompareOp &= ~( DBCOMPAREOPS_CASESENSITIVE | DBCOMPAREOPS_CASEINSENSITIVE );
if ( wType == DBTYPE_EMPTY || wType == DBTYPE_NULL || wType == DBTYPE_UDT)
return FALSE;
else if(wType == DBTYPE_VARIANT)
return FALSE;
if (IsStringCompareOp(CompareOp) && !IsStringType(wType))
return FALSE;
if ((wType == DBTYPE_BOOL ||
wType == DBTYPE_ERROR ||
wType == DBTYPE_GUID ||
wType == DBTYPE_BYTES ) &&
(CompareOp == DBCOMPAREOPS_GE ||
CompareOp == DBCOMPAREOPS_GT ||
CompareOp == DBCOMPAREOPS_LE ||
CompareOp == DBCOMPAREOPS_LT ))
return FALSE;
return TRUE;
}
BOOL TCIRowsetFind::IsStringType(DBTYPE wType)
{
return (wType == DBTYPE_STR || wType == DBTYPE_WSTR || wType == DBTYPE_BSTR);
}
BOOL TCIRowsetFind::IsStringCompareOp(DBCOMPAREOP CompareOp)
{
CompareOp &= ~( DBCOMPAREOPS_CASESENSITIVE | DBCOMPAREOPS_CASEINSENSITIVE );
return (CompareOp == DBCOMPAREOPS_CONTAINS ||
CompareOp == DBCOMPAREOPS_NOTCONTAINS ||
CompareOp == DBCOMPAREOPS_BEGINSWITH ||
CompareOp == DBCOMPAREOPS_NOTBEGINSWITH );
}
BOOL TCIRowsetFind::IsColumnFindable
(
CCol * pCol,
DBCOMPAREOP CompareOp
)
{
CompareOp &= ~( DBCOMPAREOPS_CASESENSITIVE | DBCOMPAREOPS_CASEINSENSITIVE );
// If the column is autoinc then we don't know the row values
if(!pCol->GetUpdateable())
return FALSE;
// Some types like DBTYPE_BOOL, DBTYPE_NULL can't guarantee a uniqueness property that the
// test needs.
if(!IsDBTYPEFindable(pCol->GetProviderType()))
return FALSE;
if(pCol->GetProviderType() == DBTYPE_VARIANT)
{
if(!IsDBTYPEFindable(pCol->GetSubType()))
return FALSE;
if( (CompareOp == DBCOMPAREOPS_CONTAINS || CompareOp == DBCOMPAREOPS_BEGINSWITH ) &&
pCol->GetSubType() != DBTYPE_BSTR)
return FALSE;
else
return ValidateCompareOp(TC_FindCompareOps(pCol->GetColID()), CompareOp);
}
return ValidateCompareOp (TC_FindCompareOps(pCol->GetColID()), CompareOp);
}
HRESULT TCIRowsetFind::RestartRowPosition()
{
HRESULT hr = m_pIRowset->RestartPosition(NULL);
if ( hr == S_OK || hr == DB_S_COMMANDREEXECUTED )
return S_OK;
else
return E_FAIL;
}
//--------------------------------------------------------------------
//
//@mfunc: Get the Variable Length and Updatable column
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::GetVariableLengthStrAndUpdatable
(
DBORDINAL * pulColNum,
DBCOMPAREOP CompareOp,
BOOL fGetLongStr,
DBTYPE * pwType
)
{
DBCOUNTITEM cColsCount;
DBCOUNTITEM cColsInTable = 0;
CCol TempCol;
//make sure a Rowset has been opened on the table
if(!m_pTable)
return FALSE;
//initialization
*pulColNum=0;
cColsInTable = m_pTable->CountColumnsOnTable();
for(cColsCount=1;cColsCount<=cColsInTable;cColsCount++)
{
DBTYPE TargetType = DBTYPE_EMPTY;
m_pTable->GetColInfo(cColsCount, TempCol);
if ( TempCol.GetProviderType() == DBTYPE_VARIANT )
TargetType = TempCol.GetSubType();
else
TargetType = TempCol.GetProviderType();
if( ( DBTYPE_STR == TargetType || DBTYPE_WSTR == TargetType || DBTYPE_BSTR == TargetType )
&&
(TempCol.GetUpdateable())
&&
(IsColumnMinimumFindable(&TempCol, CompareOp))
&&
(fGetLongStr == TempCol.GetIsLong())
)
{
(*pulColNum)=TempCol.GetColNum();
if (pwType)
(*pwType)=TempCol.GetProviderType();
break;
}
}
return (*pulColNum != 0 );
}
//--------------------------------------------------------------------
//
//@mfunc: Get first Non-Nullable column
//
//--------------------------------------------------------------------
BOOL TCIRowsetFind::GetNonNullableCol
(
DBORDINAL * pulColNum,
DBCOMPAREOP CompareOp,
BOOL fGetLongStr,
DBTYPE * pwType
)
{
DBORDINAL cColsCount;
DBORDINAL cColsInTable = 0;
CCol TempCol;
//make sure a Rowset has been opened on the table
if(!m_pTable)
return FALSE;
//initialization
*pulColNum=0;
cColsInTable = m_pTable->CountColumnsOnTable();
for(cColsCount=1;cColsCount<=cColsInTable;cColsCount++)
{
DBTYPE TargetType = DBTYPE_EMPTY;
m_pTable->GetColInfo(cColsCount, TempCol);
if (!TempCol.GetNullable() && IsColumnMinimumFindable(&TempCol, CompareOp))
{
(*pulColNum)=TempCol.GetColNum();
if (pwType)
(*pwType)=TempCol.GetProviderType();
break;
}
}
return (*pulColNum != 0 );
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Test Case Section
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// {{ TCW_TEST_CASE_MAP(No_Properties)
//--------------------------------------------------------------------
// @class no properties set
//
class No_Properties : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(No_Properties,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookmark=NULL,cRows=1,fSkip=1. Traverse rowset by matching current row until DB_S_ENDOF_ROWSET
int Variation_1();
// @cmember pBookmark=NULL, cRows=1, match middle. Again, pBookmark=NULL, cRows=1 and Verify DB_S_ENDOFROWSET
int Variation_2();
// @cmember pBookmark=NULL, cRows=1, and match 2nd. Again pBookmark=NULL, cRows=3, match 4th. S_OK and 3 row handles
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(No_Properties)
#define THE_CLASS No_Properties
BEG_TEST_CASE(No_Properties, TCIRowsetFind, L"no properties set")
TEST_VARIATION(1, L"pBookmark=NULL,cRows=1,fSkip=1. Traverse rowset by matching current row until DB_S_ENDOF_ROWSET")
TEST_VARIATION(2, L"pBookmark=NULL, cRows=1, match middle. Again, pBookmark=NULL, cRows=1 and Verify DB_S_ENDOFROWSET")
TEST_VARIATION(3, L"pBookmark=NULL, cRows=1, and match 2nd. Again pBookmark=NULL, cRows=3, match 4th. S_OK and 3 row handles")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(FetchBackwards)
//--------------------------------------------------------------------
// @class Test FetchBackwards property
//
class FetchBackwards : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(FetchBackwards,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookMark=NULL,cRows=1 and match 1st row. FindNext, cRows=-1 matching same row. Verify S_OK
int Variation_1();
// @cmember pBookMark=NULL, cRows=3 and Match 1st row. FindNext, cRows=-2 and match 3rd row. Verify S_OK and 3rd and 2nd rows
int Variation_2();
// @cmember pBookmark=NULL,cRows=1 nd match last row. FindNext wiht cRows=-2,fSkip=0 and match 3rd row. Verify S_OK and hrows.
int Variation_3();
// @cmember pBookMark=NULL,cRows=1 and match last row. FindNext, cRows=-6, match last row. Verify DB_S_ENDOFROWSET and hrows
int Variation_4();
// @cmember pBookmark=NULL, cRows=1, and match last. pBookmark=NULL, cRows=3. Offset=1 and mattch 2nd row. Verify DB_S_ENDOFROWSET.
int Variation_5();
// @cmember pBookmark=NULL, cRows=1 and match last. Loop with cRows=-1 until DB_S_ENDOFROWSET.
int Variation_6();
// @cmember pBookmark=NULL, Match next to last. FindNext with cRows=-1 and Offset=2. Verify DB_S_ENDOFROWSET
int Variation_7();
// @cmember Test that cRows=0 doesn't affect find direction
int Variation_8();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(FetchBackwards)
#define THE_CLASS FetchBackwards
BEG_TEST_CASE(FetchBackwards, TCIRowsetFind, L"Test FetchBackwards property")
TEST_VARIATION(1, L"pBookMark=NULL,cRows=1 and match 1st row. FindNext, cRows=-1 matching same row. Verify S_OK")
TEST_VARIATION(2, L"pBookMark=NULL, cRows=3 and Match 1st row. FindNext, cRows=-2 and match 3rd row. Verify S_OK and 3rd and 2nd rows")
TEST_VARIATION(3, L"pBookmark=NULL,cRows=1 nd match last row. FindNext wiht cRows=-2,fSkip=0 and match 3rd row. Verify S_OK and hrows.")
TEST_VARIATION(4, L"pBookMark=NULL,cRows=1 and match last row. FindNext, cRows=-6, match last row. Verify DB_S_ENDOFROWSET and hrows")
TEST_VARIATION(5, L"pBookmark=NULL, cRows=1, and match last. pBookmark=NULL, cRows=3. Offset=1 and mattch 2nd row. Verify DB_S_ENDOFROWSET.")
TEST_VARIATION(6, L"pBookmark=NULL, cRows=1 and match last. Loop with cRows=-1 until DB_S_ENDOFROWSET.")
TEST_VARIATION(7, L"pBookmark=NULL, Match next to last. FindNext with cRows=-1 and Offset=2. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(8, L"Test that cRows=0 doesn't affect find direction")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(ScrollBackwards)
//--------------------------------------------------------------------
// @class Test ScrollBackwards property
//
class ScrollBackwards : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ScrollBackwards,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookMark=DBBMK_FIRST,cRows=1 and match 2nd row. Verify S_OK and one row handle
int Variation_1();
// @cmember pBookMark=DBBMK_LAST,cRows=1 and Match last row. Verify S_OK and one row handle.
int Variation_2();
// @cmember pBookmark=DBBMK_LAST, cRows=1, and match last. Verify S_OK
int Variation_3();
// @cmember *pBookmark=DBBMK_FIRST, cRows=1, Offset=1. Verify DB_S_ENDOFROWSET
int Variation_4();
// @cmember pBookmark=NULL, cRows=1, and match middle. FindNext with Offset=-3, cRows=3 and match row preceding middle row.
int Variation_5();
// @cmember pBookmark=NULL, cRows=1, and match last. FindNext with cRows=1, Offset=-1 and match last. Verify S_OK
int Variation_6();
// @cmember pBookmark=NULL, cRows=1, Loffset=-# of rows. Verify DB_S_ENDOFROWSET
int Variation_7();
// @cmember pBookmark=NULL,cRows=1, Offset=-2. Verify #of rows-1 row fetched. Cursor is after next to last row
int Variation_8();
// @cmember pBookmark=NULL, cRows=1, Loffset=-#of rows+1
int Variation_9();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ScrollBackwards)
#define THE_CLASS ScrollBackwards
BEG_TEST_CASE(ScrollBackwards, TCIRowsetFind, L"Test ScrollBackwards property")
TEST_VARIATION(1, L"pBookMark=DBBMK_FIRST,cRows=1 and match 2nd row. Verify S_OK and one row handle")
TEST_VARIATION(2, L"pBookMark=DBBMK_LAST,cRows=1 and Match last row. Verify S_OK and one row handle.")
TEST_VARIATION(3, L"pBookmark=DBBMK_LAST, cRows=1, and match last. Verify S_OK")
TEST_VARIATION(4, L"*pBookmark=DBBMK_FIRST, cRows=1, Offset=1. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(5, L"pBookmark=NULL, cRows=1, and match middle. FindNext with Offset=-3, cRows=3 and match row preceding middle row.")
TEST_VARIATION(6, L"pBookmark=NULL, cRows=1, and match last. FindNext with cRows=1, Offset=-1 and match last. Verify S_OK")
TEST_VARIATION(7, L"pBookmark=NULL, cRows=1, Loffset=-# of rows. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(8, L"pBookmark=NULL,cRows=1, Offset=-2. Verify #of rows-1 row fetched. Cursor is after next to last row")
TEST_VARIATION(9, L"pBookmark=NULL, cRows=1, Loffset=-#of rows+1")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(CanHoldRows)
//--------------------------------------------------------------------
// @class Test DBPROP can hold row property
//
class CanHoldRows : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanHoldRows,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Get 1,2 row. Get 2,3,4 rows. S_OK
int Variation_1();
// @cmember Get 1,2 rows. Get 3 row.
int Variation_2();
// @cmember Get all rows with GetNextRows. RestartPosition. FindNext with pBookmark=NULL, Offset=1, cRows=1 and match 2nd. Verify S_OK
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(CanHoldRows)
#define THE_CLASS CanHoldRows
BEG_TEST_CASE(CanHoldRows, TCIRowsetFind, L"Test DBPROP can hold row property")
TEST_VARIATION(1, L"Get 1,2 row. Get 2,3,4 rows. S_OK")
TEST_VARIATION(2, L"Get 1,2 rows. Get 3 row.")
TEST_VARIATION(3, L"Get all rows with GetNextRows. RestartPosition. FindNext with pBookmark=NULL, Offset=1, cRows=1 and match 2nd. Verify S_OK")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Scroll_and_Fetch)
//--------------------------------------------------------------------
// @class Test in context of CANSCROLLBACKWARDS and CANFETCHBACKWARDS
//
class Scroll_and_Fetch : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Scroll_and_Fetch,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookmark=DBBMK_FIRST,cRows=-1. Verify DB_S_ENDOFROWSET and no hrows.
int Variation_1();
// @cmember pBookMark=DBBMK_FIRST,cRows=2 Match 3rd row. Verify S_OK and hrows
int Variation_2();
// @cmember pBookMark=DBBMK_LAST,cRows=-2. Match 3rd row. Verify S_OK and 3rd and 2nd hrows
int Variation_3();
// @cmember pBookMark=DBBMK_LAST,cRows=-# rows. Match last row. Verify DB_S_ENDOFROWSET and all rows
int Variation_4();
// @cmember pBookMark=DBBMK_FIRST, cRows=-1. Match first row. Verify S_OK and one row handle.
int Variation_5();
// @cmember pBookMark=DBBMK_FIRST,cRows=1. Match last row. FindNext, cRows=1, Offset=1 and match last. then cRows=-3, match 4th
int Variation_6();
// @cmember pBookmark=DBBMK_LAST,cRows=1. Match last row. Call FindNext, cRows=-3, pBookmark=NULL. Match 4th row, S_OK.
int Variation_7();
// @cmember *pBookmark=DBBMK_LAST, Offset=-2, cRows=-3. Verify row starting with N-4 fetched in traversal order
int Variation_8();
// @cmember pBookmark=NULL, Offset=-2, cRows=-1. Verify N-2 row is fetched and fetch position is after N-3 row
int Variation_9();
// @cmember pBookmark=NULL, Offset=-4, cRows=2 and match last. Verify DB_S_END. Again cRows=-1 and no match. Again cRows=1 and match 1st.
int Variation_10();
// @cmember pBookmark=NULL, cRows=3 and match last. DB_S_END. Again with cRows=2, verify DB_S_END.
int Variation_11();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Scroll_and_Fetch)
#define THE_CLASS Scroll_and_Fetch
BEG_TEST_CASE(Scroll_and_Fetch, TCIRowsetFind, L"Test in context of CANSCROLLBACKWARDS and CANFETCHBACKWARDS")
TEST_VARIATION(1, L"pBookmark=DBBMK_FIRST,cRows=-1. Verify DB_S_ENDOFROWSET and no hrows.")
TEST_VARIATION(2, L"pBookMark=DBBMK_FIRST,cRows=2 Match 3rd row. Verify S_OK and hrows")
TEST_VARIATION(3, L"pBookMark=DBBMK_LAST,cRows=-2. Match 3rd row. Verify S_OK and 3rd and 2nd hrows")
TEST_VARIATION(4, L"pBookMark=DBBMK_LAST,cRows=-# rows. Match last row. Verify DB_S_ENDOFROWSET and all rows")
TEST_VARIATION(5, L"pBookMark=DBBMK_FIRST, cRows=-1. Match first row. Verify S_OK and one row handle.")
TEST_VARIATION(6, L"pBookMark=DBBMK_FIRST,cRows=1. Match last row. FindNext, cRows=1, Offset=1 and match last. then cRows=-3, match 4th")
TEST_VARIATION(7, L"pBookmark=DBBMK_LAST,cRows=1. Match last row. Call FindNext, cRows=-3, pBookmark=NULL. Match 4th row, S_OK.")
TEST_VARIATION(8, L"*pBookmark=DBBMK_LAST, Offset=-2, cRows=-3. Verify row starting with N-4 fetched in traversal order")
TEST_VARIATION(9, L"pBookmark=NULL, Offset=-2, cRows=-1. Verify N-2 row is fetched and fetch position is after N-3 row")
TEST_VARIATION(10, L"pBookmark=NULL, Offset=-4, cRows=2 and match last. Verify DB_S_END. Again cRows=-1 and no match. Again cRows=1 and match 1st.")
TEST_VARIATION(11, L"pBookmark=NULL, cRows=3 and match last. DB_S_END. Again with cRows=2, verify DB_S_END.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Boundary)
//--------------------------------------------------------------------
// @class Test invalid arguments
//
class Boundary : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember DB_E_BADCHAPTER
int Variation_1();
// @cmember E_INVALIDARG, cbBookmark != 0, pBookmark = NULL
int Variation_2();
// @cmember E_INVALIDARG, pcRowsObtained = NULL
int Variation_3();
// @cmember E_INVALIDARG prghRows = NULL
int Variation_4();
// @cmember DB_E_COMPAREOPS, CompareOp = -1 (<min
int Variation_5();
// @cmember DB_E_BADCOMPAREOP, CompareOp > max
int Variation_6();
// @cmember DB_E_BADCOMPAREOP, unsupported
int Variation_7();
// @cmember DB_E_BADBINDINFO, NULL hAccessor
int Variation_8();
// @cmember DB_E_BADBINDINFO, 2 columns bound
int Variation_9();
// @cmember DB_E_BADBINDINFO, many columns bound
int Variation_10();
// @cmember DB_E_CANTSCROLLBACKWARDS. cRows > 1
int Variation_11();
// @cmember DB_E_CANTSCROLLBACKWARDS
int Variation_12();
// @cmember DB_E_CANTSCROLLBACKWARDS, pBookmark = DBBMK_FIRST
int Variation_13();
// @cmember DB_E_CANTSCROLLBACKWARDS, pBokmark = DBBMK_LAST
int Variation_14();
// @cmember DB_E_CANTFETCHBACKWARDS
int Variation_15();
// @cmember DB_E_BADCOMPAREOP, IGNORE and CASESENSITIVE
int Variation_16();
// @cmember DB_E_BADCOMPAREOP, just CASESENSITIVE
int Variation_17();
// @cmember DB_E_BADCOMPAREOP, just caseinsensitive
int Variation_18();
// @cmember DB_E_BADCOMPAREOP, both case sensitive and insensitive
int Variation_19();
// @cmember DB_S_ENDOFROWSET, search for null on non-nullable column
int Variation_20();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Boundary)
#define THE_CLASS Boundary
BEG_TEST_CASE(Boundary, TCIRowsetFind, L"Test invalid arguments")
TEST_VARIATION(1, L"DB_E_BADCHAPTER")
TEST_VARIATION(2, L"E_INVALIDARG, cbBookmark != 0, pBookmark = NULL")
TEST_VARIATION(3, L"E_INVALIDARG, pcRowsObtained = NULL")
TEST_VARIATION(4, L"E_INVALIDARG prghRows = NULL")
TEST_VARIATION(5, L"DB_E_COMPAREOPS, CompareOp = -1 (<min")
TEST_VARIATION(6, L"DB_E_BADCOMPAREOP, CompareOp > max")
TEST_VARIATION(7, L"DB_E_BADCOMPAREOP, unsupported")
TEST_VARIATION(8, L"DB_E_BADBINDINFO, NULL hAccessor")
TEST_VARIATION(9, L"DB_E_BADBINDINFO, 2 columns bound")
TEST_VARIATION(10, L"DB_E_BADBINDINFO, many columns bound")
TEST_VARIATION(11, L"DB_E_CANTSCROLLBACKWARDS. cRows > 1")
TEST_VARIATION(12, L"DB_E_CANTSCROLLBACKWARDS")
TEST_VARIATION(13, L"DB_E_CANTSCROLLBACKWARDS, pBookmark = DBBMK_FIRST")
TEST_VARIATION(14, L"DB_E_CANTSCROLLBACKWARDS, pBokmark = DBBMK_LAST")
TEST_VARIATION(15, L"DB_E_CANTFETCHBACKWARDS")
TEST_VARIATION(16, L"DB_E_BADCOMPAREOP, IGNORE and CASESENSITIVE")
TEST_VARIATION(17, L"DB_E_BADCOMPAREOP, just CASESENSITIVE")
TEST_VARIATION(18, L"DB_E_BADCOMPAREOP, just caseinsensitive")
TEST_VARIATION(19, L"DB_E_BADCOMPAREOP, both case sensitive and insensitive")
TEST_VARIATION(20, L"DB_S_ENDOFROWSET, search for null on non-nullable column")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(OutputRowHandleAllocation)
//--------------------------------------------------------------------
// @class Test cRows, prghRows, pcRowsObtained parameters
//
class OutputRowHandleAllocation : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(OutputRowHandleAllocation,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember cRows==0, *prghRows != NULL, Verify *prghRows != NULL on output
int Variation_1();
// @cmember *pcRowsObtained = 0, *prghRows = NULL. Verify *prghRows = NULL on output
int Variation_2();
// @cmember pBookmark=NULL, cRows=0, Match last. Verify S_OK. Set fSkip=1, cRows = 1, pBookmark = NULL, match last. DB_S_ENDOFROWSET
int Variation_3();
// @cmember pBookmark=NULL, cRows=LONG_MAX. fSkip=0. Match first row. Verify DB_S_ENDOFROWSET and all rows in rowset
int Variation_4();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(OutputRowHandleAllocation)
#define THE_CLASS OutputRowHandleAllocation
BEG_TEST_CASE(OutputRowHandleAllocation, TCIRowsetFind, L"Test cRows, prghRows, pcRowsObtained parameters")
TEST_VARIATION(1, L"cRows==0, *prghRows != NULL, Verify *prghRows != NULL on output")
TEST_VARIATION(2, L"*pcRowsObtained = 0, *prghRows = NULL. Verify *prghRows = NULL on output")
TEST_VARIATION(3, L"pBookmark=NULL, cRows=0, Match last. Verify S_OK. Set fSkip=1, cRows = 1, pBookmark = NULL, match last. DB_S_ENDOFROWSET")
TEST_VARIATION(4, L"pBookmark=NULL, cRows=LONG_MAX. fSkip=0. Match first row. Verify DB_S_ENDOFROWSET and all rows in rowset")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(CompareOp)
//--------------------------------------------------------------------
// @class Test the various compare operations
//
class CompareOp : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CompareOp,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember COMPAREOPS_EQ
int Variation_1();
// @cmember COMPAREOPS_LT
int Variation_2();
// @cmember COMPAREOPS_LE, Use Equal case
int Variation_3();
// @cmember COMPAREOPS_LE, Use Less Than case
int Variation_4();
// @cmember COMPAREOPS_GT
int Variation_5();
// @cmember COMPAREOPS_GE, Use Equal case
int Variation_6();
// @cmember COMPAREOPS_GE, Use Greater than case
int Variation_7();
// @cmember COMPAREOPS_BEGINSWITH
int Variation_8();
// @cmember COMPAREOPS_CONTAINS, match start of string
int Variation_9();
// @cmember COMPAREOPS_CONTAINS, match middle of string
int Variation_10();
// @cmember COMPAREOPS_CONTAINS, match end of string
int Variation_11();
// @cmember COMPAREOPS_NE
int Variation_12();
// @cmember COMPAREOPS_IGNORE
int Variation_13();
// @cmember COMPAREOPS_NOTBEGINSWITH
int Variation_14();
// @cmember COMPAREOPS_NOTCONTAINS
int Variation_15();
// @cmember COMPAREOPS_CONTAINS, use Equal case
int Variation_16();
// @cmember COMPAREOPS_BEGINSWITH, Use Equal case
int Variation_17();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(CompareOp)
#define THE_CLASS CompareOp
BEG_TEST_CASE(CompareOp, TCIRowsetFind, L"Test the various compare operations")
TEST_VARIATION(1, L"COMPAREOPS_EQ")
TEST_VARIATION(2, L"COMPAREOPS_LT")
TEST_VARIATION(3, L"COMPAREOPS_LE, Use Equal case")
TEST_VARIATION(4, L"COMPAREOPS_LE, Use Less Than case")
TEST_VARIATION(5, L"COMPAREOPS_GT")
TEST_VARIATION(6, L"COMPAREOPS_GE, Use Equal case")
TEST_VARIATION(7, L"COMPAREOPS_GE, Use Greater than case")
TEST_VARIATION(8, L"COMPAREOPS_BEGINSWITH")
TEST_VARIATION(9, L"COMPAREOPS_CONTAINS, match start of string")
TEST_VARIATION(10, L"COMPAREOPS_CONTAINS, match middle of string")
TEST_VARIATION(11, L"COMPAREOPS_CONTAINS, match end of string")
TEST_VARIATION(12, L"COMPAREOPS_NE")
TEST_VARIATION(13, L"COMPAREOPS_IGNORE")
TEST_VARIATION(14, L"COMPAREOPS_NOTBEGINSWITH")
TEST_VARIATION(15, L"COMPAREOPS_NOTCONTAINS")
TEST_VARIATION(16, L"COMPAREOPS_CONTAINS, use Equal case")
TEST_VARIATION(17, L"COMPAREOPS_BEGINSWITH, Use Equal case")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(fSkipCurrent)
//--------------------------------------------------------------------
// @class Test for correct behavior with fSkipCurrent flag
//
class fSkipCurrent : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(fSkipCurrent,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember fSkip=0, cRows=1. Match 1st. Verify S_OK and one row handle
int Variation_1();
// @cmember Match 1st row. pBookMark=NULL, fSkip=TRUE. Match 1st row. DB_S_ENDOFROWSET and no row handles.
int Variation_2();
// @cmember Match 5th row. pBookMark=NULL, fSkip=FALSE. Match 5th row. S_OK and no row handles.
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(fSkipCurrent)
#define THE_CLASS fSkipCurrent
BEG_TEST_CASE(fSkipCurrent, TCIRowsetFind, L"Test for correct behavior with fSkipCurrent flag")
TEST_VARIATION(1, L"fSkip=0, cRows=1. Match 1st. Verify S_OK and one row handle")
TEST_VARIATION(2, L"Match 1st row. pBookMark=NULL, fSkip=TRUE. Match 1st row. DB_S_ENDOFROWSET and no row handles.")
TEST_VARIATION(3, L"Match 5th row. pBookMark=NULL, fSkip=FALSE. Match 5th row. S_OK and no row handles.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(pFindValue)
//--------------------------------------------------------------------
// @class Test the various coercions possible
//
class pFindValue : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(pFindValue,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember IStorage compares, DBCOMPAREOPS_EQ
int Variation_1();
// @cmember IStorage, DBCOMPAREOPS_BEGINSWITH
int Variation_2();
// @cmember IStorage, DBCOMPAREOPS_GT
int Variation_3();
// @cmember IStorage, DBCOMPAREOPS_GE (EQUAL
int Variation_4();
// @cmember IStorage, DBCOMPAREOPS_GE (Greater
int Variation_5();
// @cmember IStorage, DBCOMPAREOPS_LT
int Variation_6();
// @cmember IStorage, DBCOMPAREOPS_LE (EQUAL
int Variation_7();
// @cmember IStorage, DBCOMPAREOPS_LE (Less
int Variation_8();
// @cmember IStorage, DBCOMPAREOPS_CONTAINS, beginning
int Variation_9();
// @cmember IStorage, DBCOMPAREOPS_CONTAINS, middle
int Variation_10();
// @cmember IStorage, DBCOMPAREOPS_CONTAINS, end
int Variation_11();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(pFindValue)
#define THE_CLASS pFindValue
BEG_TEST_CASE(pFindValue, TCIRowsetFind, L"Test the various coercions possible")
TEST_VARIATION(1, L"IStorage compares, DBCOMPAREOPS_EQ")
TEST_VARIATION(2, L"IStorage, DBCOMPAREOPS_BEGINSWITH")
TEST_VARIATION(3, L"IStorage, DBCOMPAREOPS_GT")
TEST_VARIATION(4, L"IStorage, DBCOMPAREOPS_GE (EQUAL")
TEST_VARIATION(5, L"IStorage, DBCOMPAREOPS_GE (Greater")
TEST_VARIATION(6, L"IStorage, DBCOMPAREOPS_LT")
TEST_VARIATION(7, L"IStorage, DBCOMPAREOPS_LE (EQUAL")
TEST_VARIATION(8, L"IStorage, DBCOMPAREOPS_LE (Less")
TEST_VARIATION(9, L"IStorage, DBCOMPAREOPS_CONTAINS, beginning")
TEST_VARIATION(10, L"IStorage, DBCOMPAREOPS_CONTAINS, middle")
TEST_VARIATION(11, L"IStorage, DBCOMPAREOPS_CONTAINS, end")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(SingleRowRowset)
//--------------------------------------------------------------------
// @class Test on a one row rowset
//
class SingleRowRowset : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(SingleRowRowset,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Match 1st. pBookMark = DBBMK_FIRST, cRows=1, fSkip=TRUE. DB_S_ENDOFROWSET
int Variation_1();
// @cmember Match 1st. pBookMark = DBBMK_FIRST, cRows=1, fSkipCurrent = FALSE. S_OK and one row.
int Variation_2();
// @cmember Match First. pBookmark = DBBMK_LAST. cRows=-1, fSkip=TRUE. DB_S_ENDOFROWSET
int Variation_3();
// @cmember Match first. pBookMark=DBBMK_LAST. cRows=-1. fSkip=-1. fSkip=FALSE. S_OK and 1 hrow
int Variation_4();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(SingleRowRowset)
#define THE_CLASS SingleRowRowset
BEG_TEST_CASE(SingleRowRowset, TCIRowsetFind, L"Test on a one row rowset")
TEST_VARIATION(1, L"Match 1st. pBookMark = DBBMK_FIRST, cRows=1, fSkip=TRUE. DB_S_ENDOFROWSET")
TEST_VARIATION(2, L"Match 1st. pBookMark = DBBMK_FIRST, cRows=1, fSkipCurrent = FALSE. S_OK and one row.")
TEST_VARIATION(3, L"Match First. pBookmark = DBBMK_LAST. cRows=-1, fSkip=TRUE. DB_S_ENDOFROWSET")
TEST_VARIATION(4, L"Match first. pBookMark=DBBMK_LAST. cRows=-1. fSkip=-1. fSkip=FALSE. S_OK and 1 hrow")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Related_RestartPosition)
//--------------------------------------------------------------------
// @class Test in conjunction with RestartPosition
//
class Related_RestartPosition : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Related_RestartPosition,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Match 5th. Restart. Call Find, cRows=1, fSkip=TRUE, match 5th. Verify DB_S_ENDOFROWSET (because of restart
int Variation_1();
// @cmember Match 5th. Restart. Call Find, cRows=1, fSkip=FALSE, match 4th. Verify DB_S_ENDOFROWSET
int Variation_2();
// @cmember Match Last. Restart. Call Find, cRows=1, fSkip=TRUE. Verify DB_S_ENDOFROWSET
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Related_RestartPosition)
#define THE_CLASS Related_RestartPosition
BEG_TEST_CASE(Related_RestartPosition, TCIRowsetFind, L"Test in conjunction with RestartPosition")
TEST_VARIATION(1, L"Match 5th. Restart. Call Find, cRows=1, fSkip=TRUE, match 5th. Verify DB_S_ENDOFROWSET (because of restart")
TEST_VARIATION(2, L"Match 5th. Restart. Call Find, cRows=1, fSkip=FALSE, match 4th. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(3, L"Match Last. Restart. Call Find, cRows=1, fSkip=TRUE. Verify DB_S_ENDOFROWSET")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Related_GetNextRows)
//--------------------------------------------------------------------
// @class Test in conjunction with GetNextRows
//
class Related_GetNextRows : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Related_GetNextRows,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookmark=DBBMK_FIRST, Verify GetNextRows pos not changed
int Variation_1();
// @cmember Use pBookmark=middle bmk. Verify GetNextRows pos not changed
int Variation_2();
// @cmember Use pBookMark = DBBMK_LAST, Verify GetNextRows pos not changed
int Variation_3();
// @cmember use pBookmark=NULL, match 1st row. Verify GetNextRows pos is after 1st row.
int Variation_4();
// @cmember Use pBookmark=NULL, match last row. Verify GetNextRows with cRows=1 returns DB_S_ENDOFROWSET
int Variation_5();
// @cmember Use pBookmark=NULL, match middle row. Use pBookmark=2nd bmk and match 2nd. Verify GetNextRows is still after middle row
int Variation_6();
// @cmember Call GetNextRows with last row fetched = 3. Call FindNextRows, pBookmark=NULL,cRows=-1 to match 4th. Verify DB_S_ENDOFROWSET
int Variation_7();
// @cmember GetNextRows, cRows=1, Offset=0. Verify S_OK. FindNext with pBookmark=NULL, cRows=1 and match 1st. Verify DB_S_ENDOFROWSET
int Variation_8();
// @cmember FindNext with pBookmark=NULL, cRows=2 and match 4th. GetNextRows with cRows=-3. Verify 5,4,3 row handles.
int Variation_9();
// @cmember FindNext, pBookmark=NULL, match last. FindNext, pBmk=NULL, cRows=-1, match last. GetNext. cRows=-1 and verify next to last
int Variation_10();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Related_GetNextRows)
#define THE_CLASS Related_GetNextRows
BEG_TEST_CASE(Related_GetNextRows, TCIRowsetFind, L"Test in conjunction with GetNextRows")
TEST_VARIATION(1, L"pBookmark=DBBMK_FIRST, Verify GetNextRows pos not changed")
TEST_VARIATION(2, L"Use pBookmark=middle bmk. Verify GetNextRows pos not changed")
TEST_VARIATION(3, L"Use pBookMark = DBBMK_LAST, Verify GetNextRows pos not changed")
TEST_VARIATION(4, L"use pBookmark=NULL, match 1st row. Verify GetNextRows pos is after 1st row.")
TEST_VARIATION(5, L"Use pBookmark=NULL, match last row. Verify GetNextRows with cRows=1 returns DB_S_ENDOFROWSET")
TEST_VARIATION(6, L"Use pBookmark=NULL, match middle row. Use pBookmark=2nd bmk and match 2nd. Verify GetNextRows is still after middle row")
TEST_VARIATION(7, L"Call GetNextRows with last row fetched = 3. Call FindNextRows, pBookmark=NULL,cRows=-1 to match 4th. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(8, L"GetNextRows, cRows=1, Offset=0. Verify S_OK. FindNext with pBookmark=NULL, cRows=1 and match 1st. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(9, L"FindNext with pBookmark=NULL, cRows=2 and match 4th. GetNextRows with cRows=-3. Verify 5,4,3 row handles.")
TEST_VARIATION(10, L"FindNext, pBookmark=NULL, match last. FindNext, pBmk=NULL, cRows=-1, match last. GetNext. cRows=-1 and verify next to last")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Scroll_BookMark)
//--------------------------------------------------------------------
// @class CanScrollBackwards with bookmarks
//
class Scroll_BookMark : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Scroll_BookMark,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookMark=DBBMK_FIRST, cRows=1. Match first row. Verify S_OK and one row handle
int Variation_1();
// @cmember pBookMark=DBBMK_LAST,cRows=1. Match last row. Verify S_OK and last row
int Variation_2();
// @cmember pBookMark=DBBMK_INVALID. Verify DB_E_BADBOOKMARK
int Variation_3();
// @cmember pBookMark=one bookmark for each row, cRows=1. Always match current row.
int Variation_4();
// @cmember pBookmark=random value. Verify DB_E_BADBOOKMARK (warning-could get a provider specific error
int Variation_5();
// @cmember *pBookmark=2nd row and offset=-1, cRows=1. Verify first row matched.
int Variation_6();
// @cmember *pBookmark=4th row, Offset=2, cRows=1 and match 5th row. Verify DB_S_ENDOFROWSET
int Variation_7();
// @cmember *pBookmark=5th row. Offset=0, cRows=1 and match 5th. Again with pBookmark=NULL, Offset=0, cRows=1 and match 2nd. Verify S_OK
int Variation_8();
// @cmember *pBookmark=2nd row and offset = -2, cRows=1, Verify DB_S_ENDOFROWSET
int Variation_9();
// @cmember pBookmark=DBBMK_FIRST, cRows=0 Should be no-op
int Variation_10();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Scroll_BookMark)
#define THE_CLASS Scroll_BookMark
BEG_TEST_CASE(Scroll_BookMark, TCIRowsetFind, L"CanScrollBackwards with bookmarks")
TEST_VARIATION(1, L"pBookMark=DBBMK_FIRST, cRows=1. Match first row. Verify S_OK and one row handle")
TEST_VARIATION(2, L"pBookMark=DBBMK_LAST,cRows=1. Match last row. Verify S_OK and last row")
TEST_VARIATION(3, L"pBookMark=DBBMK_INVALID. Verify DB_E_BADBOOKMARK")
TEST_VARIATION(4, L"pBookMark=one bookmark for each row, cRows=1. Always match current row.")
TEST_VARIATION(5, L"pBookmark=random value. Verify DB_E_BADBOOKMARK (warning-could get a provider specific error")
TEST_VARIATION(6, L"*pBookmark=2nd row and offset=-1, cRows=1. Verify first row matched.")
TEST_VARIATION(7, L"*pBookmark=4th row, Offset=2, cRows=1 and match 5th row. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(8, L"*pBookmark=5th row. Offset=0, cRows=1 and match 5th. Again with pBookmark=NULL, Offset=0, cRows=1 and match 2nd. Verify S_OK")
TEST_VARIATION(9, L"*pBookmark=2nd row and offset = -2, cRows=1, Verify DB_S_ENDOFROWSET")
TEST_VARIATION(10, L"pBookmark=DBBMK_FIRST, cRows=0 Should be no-op")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Scroll_Fetch_Bookmarks)
//--------------------------------------------------------------------
// @class CanScrollBackwards and CanFetchBackwards with Bookmarks
//
class Scroll_Fetch_Bookmarks : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Scroll_Fetch_Bookmarks,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookMark=DBBMK_FIRST, cRows=5 and match 1st row. Verify S_OK and 5 hrows
int Variation_1();
// @cmember pBookMarks=DBBMK_LAST,cRows=-5 match last row. Verify S_OK and 5 hrows
int Variation_2();
// @cmember pBookmark=2nd row, cRows=2, Offset=1. Match 4th row. Verify S_OK and 2 hrows
int Variation_3();
// @cmember pBookMark=5th row, cRows=-2. Match3rd row. Verify S_OK and 2 hrows
int Variation_4();
// @cmember pBookmark=Last row, cRows=1, Offset=1. Verify DB_S_ENDOFROWSET
int Variation_5();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Scroll_Fetch_Bookmarks)
#define THE_CLASS Scroll_Fetch_Bookmarks
BEG_TEST_CASE(Scroll_Fetch_Bookmarks, TCIRowsetFind, L"CanScrollBackwards and CanFetchBackwards with Bookmarks")
TEST_VARIATION(1, L"pBookMark=DBBMK_FIRST, cRows=5 and match 1st row. Verify S_OK and 5 hrows")
TEST_VARIATION(2, L"pBookMarks=DBBMK_LAST,cRows=-5 match last row. Verify S_OK and 5 hrows")
TEST_VARIATION(3, L"pBookmark=2nd row, cRows=2, Offset=1. Match 4th row. Verify S_OK and 2 hrows")
TEST_VARIATION(4, L"pBookMark=5th row, cRows=-2. Match3rd row. Verify S_OK and 2 hrows")
TEST_VARIATION(5, L"pBookmark=Last row, cRows=1, Offset=1. Verify DB_S_ENDOFROWSET")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(CaseSensitive_Compares)
//--------------------------------------------------------------------
// @class Test the case sensitive property
//
class CaseSensitive_Compares : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CaseSensitive_Compares,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember EQ, sensitive
int Variation_1();
// @cmember EQ, insensitive
int Variation_2();
// @cmember LT, sensitive
int Variation_3();
// @cmember LT, insensitve
int Variation_4();
// @cmember LE, sensitive
int Variation_5();
// @cmember LE, insensitive
int Variation_6();
// @cmember GT, sensitive
int Variation_7();
// @cmember GT, insensitive
int Variation_8();
// @cmember GE, sensitive
int Variation_9();
// @cmember GE, insensitve
int Variation_10();
// @cmember NE, sensitive
int Variation_11();
// @cmember NE, insensitive
int Variation_12();
// @cmember BEGINSWITH, sensitve
int Variation_13();
// @cmember BEGINSWITH, insensitive
int Variation_14();
// @cmember BEGINSWITH, sensitive negative match
int Variation_15();
// @cmember CONTAINS, sensitive
int Variation_16();
// @cmember CONTAINS, insensitive
int Variation_17();
// @cmember CONTAINS, sensitive negative match
int Variation_18();
// @cmember NOTBEGINSWITH, sensitive
int Variation_19();
// @cmember NOTBEGINSWITH, insensitive
int Variation_20();
// @cmember NOTBEGINSWITH, sensitive negative match
int Variation_21();
// @cmember NOTCONTAINS, sensitive
int Variation_22();
// @cmember NOCONTAINS, insensitive
int Variation_23();
// @cmember NOCONTAINS, sensitive negative match
int Variation_24();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(CaseSensitive_Compares)
#define THE_CLASS CaseSensitive_Compares
BEG_TEST_CASE(CaseSensitive_Compares, TCIRowsetFind, L"Test the case sensitive property")
TEST_VARIATION(1, L"EQ, sensitive")
TEST_VARIATION(2, L"EQ, insensitive")
TEST_VARIATION(3, L"LT, sensitive")
TEST_VARIATION(4, L"LT, insensitve")
TEST_VARIATION(5, L"LE, sensitive")
TEST_VARIATION(6, L"LE, insensitive")
TEST_VARIATION(7, L"GT, sensitive")
TEST_VARIATION(8, L"GT, insensitive")
TEST_VARIATION(9, L"GE, sensitive")
TEST_VARIATION(10, L"GE, insensitve")
TEST_VARIATION(11, L"NE, sensitive")
TEST_VARIATION(12, L"NE, insensitive")
TEST_VARIATION(13, L"BEGINSWITH, sensitve")
TEST_VARIATION(14, L"BEGINSWITH, insensitive")
TEST_VARIATION(15, L"BEGINSWITH, sensitive negative match")
TEST_VARIATION(16, L"CONTAINS, sensitive")
TEST_VARIATION(17, L"CONTAINS, insensitive")
TEST_VARIATION(18, L"CONTAINS, sensitive negative match")
TEST_VARIATION(19, L"NOTBEGINSWITH, sensitive")
TEST_VARIATION(20, L"NOTBEGINSWITH, insensitive")
TEST_VARIATION(21, L"NOTBEGINSWITH, sensitive negative match")
TEST_VARIATION(22, L"NOTCONTAINS, sensitive")
TEST_VARIATION(23, L"NOCONTAINS, insensitive")
TEST_VARIATION(24, L"NOCONTAINS, sensitive negative match")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Scroll_Fetch_Hold)
//--------------------------------------------------------------------
// @class Test with CanScrollBack, CanFetchBack, and CanHoldRows
//
class Scroll_Fetch_Hold : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Scroll_Fetch_Hold,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookmark=2nd row, cRows=-1. Verify S_OK and one row handle
int Variation_1();
// @cmember pBookmark=3rd row. cRows=3. Match 3rd row. Do not release. pBookmark=4th row, cRows=2, match 4th. Release 1st 3, ver last 2
int Variation_2();
// @cmember pBookmark=5th,cRows=-5, match 5th. S_OK,5 hrows. pBookmark=4th,cRows=-5. DB_S_ENDOFROWSET and 4 hrows. Release last 4, check 5
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Scroll_Fetch_Hold)
#define THE_CLASS Scroll_Fetch_Hold
BEG_TEST_CASE(Scroll_Fetch_Hold, TCIRowsetFind, L"Test with CanScrollBack, CanFetchBack, and CanHoldRows")
TEST_VARIATION(1, L"pBookmark=2nd row, cRows=-1. Verify S_OK and one row handle")
TEST_VARIATION(2, L"pBookmark=3rd row. cRows=3. Match 3rd row. Do not release. pBookmark=4th row, cRows=2, match 4th. Release 1st 3, ver last 2")
TEST_VARIATION(3, L"pBookmark=5th,cRows=-5, match 5th. S_OK,5 hrows. pBookmark=4th,cRows=-5. DB_S_ENDOFROWSET and 4 hrows. Release last 4, check 5")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Dynamic)
//--------------------------------------------------------------------
// @class Test with OTHERINSERT and OTHERUPDATE properties
//
class Dynamic : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Dynamic,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Insert a new row at end. pBookmark=NULL,cRows=1. Match new row. Verify S_OK and one row handle
int Variation_1();
// @cmember Insert a new row at the end. pBookmark=DBBMK_LAST,cRows=1. DBCOMPAREOPS_IGNORE. Verify S_OK and new row matched.
int Variation_2();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Dynamic)
#define THE_CLASS Dynamic
BEG_TEST_CASE(Dynamic, TCIRowsetFind, L"Test with OTHERINSERT and OTHERUPDATE properties")
TEST_VARIATION(1, L"Insert a new row at end. pBookmark=NULL,cRows=1. Match new row. Verify S_OK and one row handle")
TEST_VARIATION(2, L"Insert a new row at the end. pBookmark=DBBMK_LAST,cRows=1. DBCOMPAREOPS_IGNORE. Verify S_OK and new row matched.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(MaxRows)
//--------------------------------------------------------------------
// @class Test MaxRows property
//
class MaxRows : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(MaxRows,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Set MAXROWS=3. pBookmark=2nd row. cRows=4. Match 3rd row. DB_S_ENDOFROWSET and 3 hrows
int Variation_1();
// @cmember Set MAXROWS=2. pBookmark=3rd row,cRows=3. Match 3rd row. DB_S_ROWLIMITEXECEEDED and 2 hrows
int Variation_2();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(MaxRows)
#define THE_CLASS MaxRows
BEG_TEST_CASE(MaxRows, TCIRowsetFind, L"Test MaxRows property")
TEST_VARIATION(1, L"Set MAXROWS=3. pBookmark=2nd row. cRows=4. Match 3rd row. DB_S_ENDOFROWSET and 3 hrows")
TEST_VARIATION(2, L"Set MAXROWS=2. pBookmark=3rd row,cRows=3. Match 3rd row. DB_S_ROWLIMITEXECEEDED and 2 hrows")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(EmptyRowset)
//--------------------------------------------------------------------
// @class EmptyRowset
//
class EmptyRowset : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(EmptyRowset,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookmark=NULL, cRows=0. DBCOMPAREOPS_IGNORE. Verify DB_S_ENDOFROWSET
int Variation_1();
// @cmember pBookmark=NULL, cRows=1. DB_S_ENDOFROWSET
int Variation_2();
// @cmember pBookmark=NULL, cRows=-1. DB_S_ENDOFROWSET
int Variation_3();
// @cmember pBookmark=NULL,cRows=0,fSkip=TRUE. Verify DB_S_ENDOFROWSET
int Variation_4();
// @cmember pBookMark=DBBMK_FIRST,cRows=1. Verify DB_S_ENDOFROWSET
int Variation_5();
// @cmember pBookmark=DBBMK_FIRST, cRows=0, DBCOMPAREOPS_IGNORE. Verify DB_S_ENDOFROWSET
int Variation_6();
// @cmember pBookmark=DBBMK_LAST,cRows=1. Verify DB_S_ENDOFROWSET
int Variation_7();
// @cmember pBookmark=DBBMK_FIRST,cRows=-1. Verify DB_S_ENDOFROWSET
int Variation_8();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(EmptyRowset)
#define THE_CLASS EmptyRowset
BEG_TEST_CASE(EmptyRowset, TCIRowsetFind, L"EmptyRowset")
TEST_VARIATION(1, L"pBookmark=NULL, cRows=0. DBCOMPAREOPS_IGNORE. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(2, L"pBookmark=NULL, cRows=1. DB_S_ENDOFROWSET")
TEST_VARIATION(3, L"pBookmark=NULL, cRows=-1. DB_S_ENDOFROWSET")
TEST_VARIATION(4, L"pBookmark=NULL,cRows=0,fSkip=TRUE. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(5, L"pBookMark=DBBMK_FIRST,cRows=1. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(6, L"pBookmark=DBBMK_FIRST, cRows=0, DBCOMPAREOPS_IGNORE. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(7, L"pBookmark=DBBMK_LAST,cRows=1. Verify DB_S_ENDOFROWSET")
TEST_VARIATION(8, L"pBookmark=DBBMK_FIRST,cRows=-1. Verify DB_S_ENDOFROWSET")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(NULL_Collation)
//--------------------------------------------------------------------
// @class Test Null collatioans
//
class NULL_Collation : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(NULL_Collation,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember NE operator with NULL status
int Variation_1();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(NULL_Collation)
#define THE_CLASS NULL_Collation
BEG_TEST_CASE(NULL_Collation, TCIRowsetFind, L"Test Null collations")
TEST_VARIATION(1, L"NE operator with NULL status")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Prop_FINDCOMPAREOPS)
//--------------------------------------------------------------------
// @class Check DBPROP_FINDCOMAPREOPS
//
class Prop_FINDCOMPAREOPS : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Prop_FINDCOMPAREOPS,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Check CO_EQUALITY and CO_STRING
int Variation_1();
// @cmember Check Case Sensitivity
int Variation_2();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Prop_FINDCOMPAREOPS)
#define THE_CLASS Prop_FINDCOMPAREOPS
BEG_TEST_CASE(Prop_FINDCOMPAREOPS, TCIRowsetFind, L"Check DBPROP_FINDCOMAPREOPS")
TEST_VARIATION(1, L"Check CO_EQUALITY and CO_STRING")
TEST_VARIATION(2, L"Check Case Sensitivity")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(QueryInt)
//--------------------------------------------------------------------
// @class test queryinterfaces
//
class QueryInt : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(QueryInt,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember IRowset
int Variation_1();
// @cmember IAccessor
int Variation_2();
// @cmember Use ICmdText
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(QueryInt)
#define THE_CLASS QueryInt
BEG_TEST_CASE(QueryInt, TCIRowsetFind, L"test queryinterfaces")
TEST_VARIATION(1, L"IRowset")
TEST_VARIATION(2, L"IAccessor")
TEST_VARIATION(3, L"Use ICmdText")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCCompareOps_Ignore)
//--------------------------------------------------------------------
// @class Test specific IGNORE cases
//
class TCCompareOps_Ignore : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCCompareOps_Ignore,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember IGNORE w/pBookmark=NULL
int Variation_1();
// @cmember IGNORE w/ pBookmark = STD_BOOKMARK
int Variation_2();
// @cmember IGNORE w/real bookmark
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(TCCompareOps_Ignore)
#define THE_CLASS TCCompareOps_Ignore
BEG_TEST_CASE(TCCompareOps_Ignore, TCIRowsetFind, L"Test specific IGNORE cases")
TEST_VARIATION(1, L"IGNORE w/pBookmark=NULL")
TEST_VARIATION(2, L"IGNORE w/ pBookmark = STD_BOOKMARK")
TEST_VARIATION(3, L"IGNORE w/real bookmark")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(AccessorTests)
//--------------------------------------------------------------------
// @class Test various accessor variations
//
class AccessorTests : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(AccessorTests,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember obValue = 0
int Variation_1();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(AccessorTests)
#define THE_CLASS AccessorTests
BEG_TEST_CASE(AccessorTests, TCIRowsetFind, L"Test various accessor variations")
TEST_VARIATION(1, L"obValue = 0")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(BindingType)
//--------------------------------------------------------------------
// @class Test interesting Find coercions
//
class BindingType : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(BindingType,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Normal BSTR
int Variation_1();
// @cmember WSTR
int Variation_2();
// @cmember STR
int Variation_3();
// @cmember VARIANT
int Variation_4();
// @cmember WSTR | BYREF
int Variation_5();
// @cmember STR | BYREF
int Variation_6();
// @cmember BSTR | BYREF
int Variation_7();
// @cmember VARIANT BYREF
int Variation_8();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(BindingType)
#define THE_CLASS BindingType
BEG_TEST_CASE(BindingType, TCIRowsetFind, L"Test interesting Find coercions")
TEST_VARIATION(1, L"Normal BSTR")
TEST_VARIATION(2, L"WSTR")
TEST_VARIATION(3, L"STR")
TEST_VARIATION(4, L"VARIANT")
TEST_VARIATION(5, L"WSTR | BYREF")
TEST_VARIATION(6, L"STR | BYREF")
TEST_VARIATION(7, L"BSTR | BYREF")
TEST_VARIATION(8, L"VARIANT BYREF")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Deleted_Rows)
//--------------------------------------------------------------------
// @class Test with deleted rows
//
class Deleted_Rows : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Deleted_Rows,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookMark=DBBMK_LAST. Delete last row. Expect DB_E_BADBOOKMARK
int Variation_1();
// @cmember pBookMark = 2, cRows=1. Delete 4th row. Match on what was in 4th row. DB_S_ENDOFROWSET and 0 row
int Variation_2();
// @cmember pBookMark=4, cRows=-1. Delete 1st row. Match on what was in 1st row. DB_S_ENDOFROWSET and 0 row
int Variation_3();
// @cmember pBookMark=NULL,cRows=1 Match 3rd row. Delete third row. pBookmark=NULL, cRows=1, fSkip=0. Match 4th. S_OK, 1 hrow
int Variation_4();
// @cmember pBookmark=NULL, cRows=-2, match 3rd row. Delete 3rd. Match 2nd
int Variation_5();
// @cmember Delete RowLast-1 row. pBookmark=RowLast-2 row,cRows=3. Match RowLast-2 row.
// Verify S_OK, 3 hrows and DB_E_DELETEDROW when accessing deleted one
int Variation_6();
// @cmember Delete last row. pBookmark=DBBMK_LAST, cRows=1. Verify DB_E_BADBOOKMARK, 0 rows returned
int Variation_7();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Deleted_Rows)
#define THE_CLASS Deleted_Rows
BEG_TEST_CASE(Deleted_Rows, TCIRowsetFind, L"Test with deleted rows")
TEST_VARIATION(1, L"pBookMark=DBBMK_LAST. Delete last row. Expect DB_E_BADBOOKMARK")
TEST_VARIATION(2, L"pBookMark = 2, cRows=1. Delete 4th row. Match on what was in 4th row. DB_S_ENDOFROWSET and 0 row")
TEST_VARIATION(3, L"pBookMark=4, cRows=-1. Delete 1st row. Match on what was in 1st row. DB_S_ENDOFROWSET and 0 row")
TEST_VARIATION(4, L"pBookMark=NULL,cRows=1 Match 3rd row. Delete third row. pBookmark=NULL, cRows=1, fSkip=0. Match 4th. S_OK, 1 hrow")
TEST_VARIATION(5, L"pBookmark=NULL, cRows=-2, match 3rd row. Delete 3rd. Match 2nd")
TEST_VARIATION(6, L"Delete RowLast-1 row.pBookmark=RowLast-2 row, cRows=3.Match RowLast-2 row.Verify DB_S_ENDOFROWSET and return 3 rows")
TEST_VARIATION(7, L"Delete last row. pBookmark=DBBMK_LAST, cRows=1. Verify DB_E_BADBOOKMARK, 0 rows returned")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(RemoveDeleted)
//--------------------------------------------------------------------
// @class Test in context of RemoveDeleted
//
class RemoveDeleted : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(RemoveDeleted,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Delete a row. pBookmark=deleted row. Verify DB_E_BADBOOKMARK.
int Variation_1();
// @cmember Delete 3rd row. pBookmark=2nd row with cRows=3. Verify S_OK and 2,4,5 hrows
int Variation_2();
// @cmember Delete g_lRowLast-1 row. pBookmark=g_lRowLast-2 row,cRows=3. Match g_lRowLast-2 row.
// Verify DB_S_ENDOFROWSET and return RowLast-2, RowLast hrows.
int Variation_3();
// @cmember Delete last row. pBookmark=DBBMK_LAST,cRows=-1. DBCOMPAREOPS_IGNORE.
int Variation_4();
// @cmember pBookmark=NULL, cRows = 2. match 3rd. Delete 2nd and 5th rows. Find with cRows= -1 and match third
int Variation_5();
// @cmember pBookMark=NULL, cRows=1.Delete 4th row.Match on what was in 4th row.DB_S_ENDOFROWSET and 0 rows
int Variation_6();
// @cmember pBookMark=DBBMK_LAST,cRows=-1.Delete 1st row.Match on what was in 1st row.DB_S_ENDOFROWSET and 0 rows
int Variation_7();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(RemoveDeleted)
#define THE_CLASS RemoveDeleted
BEG_TEST_CASE(RemoveDeleted, TCIRowsetFind, L"Test in context of RemoveDeleted")
TEST_VARIATION(1, L"Delete a row. pBookmark=deleted row. Verify DB_E_BADBOOKMARK")
TEST_VARIATION(2, L"Delete 3rd row. pBookmark=2nd row with cRows=3. Verify S_OK and 2,4,5 hrows")
TEST_VARIATION(3, L"Delete Last-1 row.pBookmark=Last-2 row,cRows=3.Match Last-2 row.Verify DB_S_ENDOFROWSET,2 rows")
TEST_VARIATION(4, L"Delete last row. pBookmark=DBBMK_LAST,cRows=-1. ")
TEST_VARIATION(5, L"pBookmark=NULL, cRows = 2. match 3rd. Delete 2nd and 5th rows. Find with cRows= -1")
TEST_VARIATION(6, L"pBookMark =NULL,cRows=1.Delete 4th row.Match on what was in 4th row.DB_S_ENDOFROWSET and 0 rows")
TEST_VARIATION(7, L"pBookMark=DBBMK_LAST,cRows=-1.Delete 1st row.Match on what was in 1st row.DB_S_ENDOFROWSET and 0 rows")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(BookmarkSkipped)
//--------------------------------------------------------------------
// @class Test in the context of DBPROP_BOOKMARKSKIPPED
//
class BookmarkSkipped : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(BookmarkSkipped,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Delete 1st row. pBookmark=1st row,cRows=5. Match 2nd row. DB_S_ENDOFROWSET(overrides S_BOOKMARKSKIPPED
int Variation_1();
// @cmember Delete last row. pBookmark=last row, cRows=1. Match what was in last row. DB_S_BOOKMARKSKIPPED and no rows retrieved.
int Variation_2();
// @cmember Delete the first row. pBookmark=1st row,cRows=1. Match 2nd row. DB_S_BOOKMARKSKIPED and 2nd hrow returned.
int Variation_3();
// @cmember Delete 3rd row. pBookmark=3rd row,cRows=1. Match 5th row. DB_S_BOOKMARKSKIPPED and one hrow.
int Variation_4();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(BookmarkSkipped)
#define THE_CLASS BookmarkSkipped
BEG_TEST_CASE(BookmarkSkipped, TCIRowsetFind, L"Test in the context of DBPROP_BOOKMARKSKIPPED")
TEST_VARIATION(1, L"Delete 1st row. pBookmark=1st row,cRows=5. Match 2nd row. DB_S_ENDOFROWSET(overrides S_BOOKMARKSKIPPED")
TEST_VARIATION(2, L"Delete last row. pBookmark=last row, cRows=1. Match what was in last row. DB_S_BOOKMARKSKIPPED and no rows retrieved.")
TEST_VARIATION(3, L"Delete the first row. pBookmark=1st row,cRows=1. Match 2nd row. DB_S_BOOKMARKSKIPED and 2nd hrow returned.")
TEST_VARIATION(4, L"Delete 3rd row. pBookmark=3rd row,cRows=1. Match 5th row. DB_S_BOOKMARKSKIPPED and one hrow.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(TCJapanese)
//*-----------------------------------------------------------------------
// @class Test scenarios relevant to the JPN locale
//
class TCJapanese : public TCIRowsetFind {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(TCJapanese,TCIRowsetFind);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Test case sensitivity and CONTAINS
int Variation_1();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(TCJapanese)
#define THE_CLASS TCJapanese
BEG_TEST_CASE(TCJapanese, TCIRowsetFind, L"Test scenarios relevant to the JPN locale")
TEST_VARIATION(1, L"Test case sensitivity and CONTAINS")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// }} END_DECLARE_TEST_CASES()
// {{ TCW_TESTMODULE(ThisModule)
TEST_MODULE(30, ThisModule, gwszModuleDescrip)
TEST_CASE(1, No_Properties)
TEST_CASE(2, FetchBackwards)
TEST_CASE(3, ScrollBackwards)
TEST_CASE(4, CanHoldRows)
TEST_CASE(5, Scroll_and_Fetch)
TEST_CASE(6, Boundary)
TEST_CASE(7, OutputRowHandleAllocation)
TEST_CASE(8, CompareOp)
TEST_CASE(9, fSkipCurrent)
TEST_CASE(10, pFindValue)
TEST_CASE(11, SingleRowRowset)
TEST_CASE(12, Related_RestartPosition)
TEST_CASE(13, Related_GetNextRows)
TEST_CASE(14, Scroll_BookMark)
TEST_CASE(15, Scroll_Fetch_Bookmarks)
TEST_CASE(16, CaseSensitive_Compares)
TEST_CASE(17, Scroll_Fetch_Hold)
TEST_CASE(18, Dynamic)
TEST_CASE(19, MaxRows)
TEST_CASE(20, EmptyRowset)
TEST_CASE(21, NULL_Collation)
TEST_CASE(22, Prop_FINDCOMPAREOPS)
TEST_CASE(23, QueryInt)
TEST_CASE(24, TCCompareOps_Ignore)
TEST_CASE(25, AccessorTests)
TEST_CASE(26, BindingType)
TEST_CASE(27, Deleted_Rows)
TEST_CASE(28, RemoveDeleted)
TEST_CASE(29, BookmarkSkipped)
TEST_CASE(30, TCJapanese)
END_TEST_MODULE()
// }} TCW_TESTMODULE_END
// {{ TCW_TC_PROTOTYPE(No_Properties)
//*-----------------------------------------------------------------------
//| Test Case: No_Properties - no properties set
//| Created: 06/24/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL No_Properties::Init()
{
DBPROPID guidPropertySet;
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidPropertySet));
CLEANUP:
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL,cRows=1,fSkip=1. Traverse rowset by matching current row until DB_S_ENDOF_ROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int No_Properties::Variation_1()
{
BOOL fTestPass = TEST_PASS;
for ( LONG i = 1; i <= (g_lRowLast+1); i++ )
{
fTestPass =
CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
i, // row to match
( i <= g_lRowLast ? S_OK : DB_S_ENDOFROWSET ), // HRESULT to verify
( i <= g_lRowLast ? 1 : 0 ) // How many rows to expect.
);
if ( fTestPass == TEST_FAIL )
break;
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=1, match middle. Again, pBookmark=NULL, cRows=1 and Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int No_Properties::Variation_2()
{
BOOL fTestPass = FALSE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast/2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
2, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast/2, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
CLEANUP:
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=1, and match 2nd. Again pBookmark=NULL, cRows=3, match 4th. S_OK and 3 row handles
//
// @rdesc TEST_PASS or TEST_FAIL
//
int No_Properties::Variation_3()
{
BOOL fTestPass = FALSE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
2, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
2, // row to match
S_OK, // HRESULT to verify
2 // How many rows to expect.
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
3, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
4, // row to match
S_OK, // HRESULT to verify
3 // How many rows to expect.
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
CLEANUP:
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL No_Properties::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(FetchBackwards)
//*-----------------------------------------------------------------------
//| Test Case: FetchBackwards - Test FetchBackwards property
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL FetchBackwards::Init()
{
DBPROPID guidProperty;
ULONG cPrptSet = 0;
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
TESTC_DRIVER(g_rgDBPrpt[IDX_FetchBackwards].fSupported);
if(!g_rgDBPrpt[IDX_FetchBackwards].fDefault)
{
guidProperty=DBPROP_CANFETCHBACKWARDS;
cPrptSet++;
}
//create a rowset and accessor
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidProperty));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=NULL,cRows=1 and match 1st row. FindNext, cRows=-1 matching same row. Verify S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_1()
{
BOOL fTestPass=TEST_FAIL;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( !COMPARE(fTestPass,TRUE ) )
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
0, // skip current row
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=NULL, cRows=3 and Match 1st row. FindNext, cRows=-2 and match 3rd row. Verify S_OK and 3rd and 2nd rows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_2()
{
BOOL fTestPass = FALSE;
BYTE *pBookmark=NULL;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
0, // Length of bookmark
3, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
3 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
0, // Length of bookmark
-2, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
3, // row to match
S_OK, // HRESULT to verify
2 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL,cRows=1 nd match last row. FindNext wiht cRows=-2,fSkip=0 and match 3rd row. Verify S_OK and hrows.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_3()
{
BOOL fTestPass = FALSE;
BYTE *pBookmark=NULL;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
0, // Length of bookmark
-2, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
3, // row to match
S_OK, // HRESULT to verify
2 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=NULL,cRows=1 and match last row. FindNext, cRows=-6, match last row. Verify DB_S_ENDOFROWSET and hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_4()
{
BOOL fTestPass = FALSE;
BYTE *pBookmark=NULL;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
0, // Length of bookmark
-(g_lRowLast+1), // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
g_lRowLast // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=1, and match last. pBookmark=NULL, cRows=3. Offset=1 and mattch 2nd row. Verify DB_S_ENDOFROWSET.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_5()
{
BOOL fTestPass = FALSE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-3, // # rows to fetch
1, // offset
g_ulColNum, // Which column to match
2, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
2 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=1 and match last. Loop with cRows=-1 until DB_S_ENDOFROWSET.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_6()
{
BOOL fTestPass = FALSE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
for ( DBROWCOUNT i=g_lRowLast; i>=0 ; i-- )
{
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
0, // lOffset
g_ulColNum, // Which column to match
i, // row to match
(i==0 ? DB_S_ENDOFROWSET : S_OK ), // HRESULT to verify
(i==0 ? 0 : 1) // How many rows to expect.
);
if (!COMPARE(fTestPass, TEST_PASS))
return TEST_FAIL;
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, Match next to last. FindNext with cRows=-1 and Offset=2. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_7()
{
BOOL fTestPass = FALSE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast-1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
2, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Test that cRows=0 doesn't affect find direction
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_8()
{
BOOL fTestPass = FALSE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
0, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast-1, // row to match
S_OK, // HRESULT to verify
0 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
//cursor is now after g_lRowLast-1
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast-2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL FetchBackwards::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(ScrollBackwards)
//*-----------------------------------------------------------------------
//| Test Case: ScrollBackwards - Test ScrollBackwards property
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ScrollBackwards::Init()
{
DBPROPID guidPropertySet[1];
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
TESTC_DRIVER(g_rgDBPrpt[IDX_ScrollBackwards].fSupported);
if(!g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
{
guidPropertySet[cPrptSet++]=DBPROP_CANSCROLLBACKWARDS;
}
//create a rowset and an accessor.
//DBPROP_CANSCROLLBACKWARDS is requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_FIRST,cRows=1 and match 2nd row. Verify S_OK and one row handle
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_LAST,cRows=1 and Match last row. Verify S_OK and one row handle.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=DBBMK_LAST, cRows=1, and match last. Verify S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_3()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
1, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_FIRST, cRows=1, Offset=1. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_4()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
g_lRowLast, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=1, and match middle. FindNext with Offset=-3, cRows=3 and match row preceding middle row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_5()
{
BOOL fTestPass = FALSE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast/2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
3, // # rows to fetch
-3, // offset
g_ulColNum, // Which column to match
(g_lRowLast/2)-1, // row to match
S_OK, // HRESULT to verify
3 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=1, and match last. FindNext with cRows=1, Offset=-1 and match last. Verify S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_6()
{
BOOL fTestPass = FALSE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
-1, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=1, Loffset=-# of rows. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_7()
{
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
return CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
-g_lRowLast, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL,cRows=1, Offset=-2. Verify #of rows-1 row fetched. Cursor is after next to last row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_8()
{
BOOL fTestPass;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
-2, // offset
g_ulColNum, // Which column to match
g_lRowLast-1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast-1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=1, Loffset=-#of rows+1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_9()
{
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
return CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
-(g_lRowLast+1), // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ScrollBackwards::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(CanHoldRows)
//*-----------------------------------------------------------------------
//| Test Case: CanHoldRows - Test DBPROP can hold row property
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows::Init()
{
DBPROPID guidProperty;
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
TESTC_DRIVER(g_rgDBPrpt[IDX_CanHoldRows].fSupported);
if(!g_rgDBPrpt[IDX_CanHoldRows].fDefault)
{
guidProperty=DBPROP_CANHOLDROWS;
cPrptSet++;
}
//create a rowset and accessor
//DBPROP_CANHOLDROWS
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidProperty));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Get 1,2 row. Get 2,3,4 rows. S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanHoldRows::Variation_1()
{
HROW *phRows1, *phRows2;
BOOL fTestPass = TRUE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
phRows1 = (HROW *) PROVIDER_ALLOC( 2 * sizeof(HROW) );
phRows2 = (HROW *) PROVIDER_ALLOC( 3 * sizeof(HROW) );
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
NULL, // Bookmark to fetch from, if any
0, // Length of bookmark
2, // maps to cRows
0, // maps to Offset
g_ulColNum, // Column to match
1, // Is there a row where the find should happen? 0 - no match
S_OK, // Expected HRESULT
2, // Expected count of rows
FALSE, // flag to Release rows (optional)
DBCOMPAREOPS_EQ, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
phRows1 // optional arg if client wants to control row handle mem
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
NULL, // Bookmark to fetch from, if any
0, // Length of bookmark
3, // maps to cRows
0, // maps to Offset
g_ulColNum, // Column to match
3, // Is there a row where the find should happen? 0 - no match
S_OK, // Expected HRESULT
3, // Expected count of rows
FALSE, // flag to Release rows (optional)
DBCOMPAREOPS_EQ, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
phRows2 // optional arg if client wants to control row handle mem
);
COMPARE(VerifyRowPosition(phRows1[0], 1, g_pCTable), TRUE);
COMPARE(VerifyRowPosition(phRows1[1], 2, g_pCTable), TRUE);
COMPARE(VerifyRowPosition(phRows2[0], 3, g_pCTable), TRUE);
COMPARE(VerifyRowPosition(phRows2[1], 4, g_pCTable), TRUE);
COMPARE(VerifyRowPosition(phRows2[2], 5, g_pCTable), TRUE);
m_pIRowset->ReleaseRows(2, phRows1, NULL, NULL, NULL);
m_pIRowset->ReleaseRows(3, phRows2, NULL, NULL, NULL);
CLEANUP:
PROVIDER_FREE(phRows1);
PROVIDER_FREE(phRows2);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Get 1,2 rows. Get 3 row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanHoldRows::Variation_2()
{
HROW *phRows1, *phRows2;
BOOL fTestPass = TRUE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
phRows1 = (HROW *) PROVIDER_ALLOC( 2 * sizeof(HROW) );
phRows2 = (HROW *) PROVIDER_ALLOC( sizeof(HROW) );
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
NULL, // Bookmark to fetch from, if any
0, // Length of bookmark
2, // maps to cRows
0, // maps to Offset
g_ulColNum, // Column to match
1, // Is there a row where the find should happen? 0 - no match
S_OK, // Expected HRESULT
2, // Expected count of rows
FALSE, // flag to Release rows (optional)
DBCOMPAREOPS_EQ, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
phRows1 // optional arg if client wants to control row handle mem
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
NULL, // Bookmark to fetch from, if any
0, // Length of bookmark
1, // maps to cRows
0, // maps to Offset
g_ulColNum, // Column to match
3, // Is there a row where the find should happen? 0 - no match
S_OK, // Expected HRESULT
1, // Expected count of rows
FALSE, // flag to Release rows (optional)
DBCOMPAREOPS_EQ, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
phRows2 // optional arg if client wants to control row handle mem
);
COMPARE(VerifyRowPosition(phRows1[0], 1, g_pCTable), TRUE);
COMPARE(VerifyRowPosition(phRows1[1], 2, g_pCTable),TRUE);
COMPARE(VerifyRowPosition(phRows2[0], 3, g_pCTable),TRUE);
m_pIRowset->ReleaseRows(2, phRows1, NULL, NULL, NULL);
m_pIRowset->ReleaseRows(1, phRows2, NULL, NULL, NULL);
CLEANUP:
PROVIDER_FREE(phRows1);
PROVIDER_FREE(phRows2);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Get all rows with GetNextRows. RestartPosition. FindNext with pBookmark=NULL, Offset=1, cRows=1 and match 2nd. Verify S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanHoldRows::Variation_3()
{
BOOL fTestPass = FALSE;
HROW * phrow = NULL;
DBCOUNTITEM cRowsObtained = 0;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, g_lRowLast, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!COMPARE(cRowsObtained, ULONG(g_lRowLast)))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phrow[0], 1, g_pCTable), TRUE))
goto CLEANUP;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
CLEANUP:
PROVIDER_FREE(phrow);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Scroll_and_Fetch)
//*-----------------------------------------------------------------------
//| Test Case: Scroll_and_Fetch - Test in context of CANSCROLLBACKWARDS and CANFETCHBACKWARDS
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_and_Fetch::Init()
{
DBPROPID guidPropertySet[2];
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
TESTC_DRIVER(g_rgDBPrpt[IDX_FetchBackwards].fSupported &&
g_rgDBPrpt[IDX_ScrollBackwards].fSupported );
if(!g_rgDBPrpt[IDX_FetchBackwards].fDefault)
{
guidPropertySet[cPrptSet]=DBPROP_CANFETCHBACKWARDS;
cPrptSet++;
}
if(!g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
{
guidPropertySet[cPrptSet]=DBPROP_CANSCROLLBACKWARDS;
cPrptSet++;
}
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS and DBPROP_CANSCROLLBACKWARDS
//are requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=DBBMK_FIRST,cRows=-1. Verify DB_S_ENDOFROWSET and no hrows.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
-1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
0, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_FIRST,cRows=2 Match 3rd row. Verify S_OK and hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
2, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
3, // row to match
S_OK, // HRESULT to verify
2 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_LAST,cRows=-2. Match 3rd row. Verify S_OK and 3rd and 2nd hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_3()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
-2, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
3, // row to match
S_OK, // HRESULT to verify
2 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_LAST,cRows=-# rows. Match last row. Verify DB_S_ENDOFROWSET and all rows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_4()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
-(g_lRowLast+1), // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
g_lRowLast // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_FIRST, cRows=-1. Match first row. Verify S_OK and one row handle.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_5()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
-1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_FIRST,cRows=1. Match last row. FindNext, cRows=1, Offset=1 and match last. then cRows=-3, match 4th
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_6()
{
BOOL fTestPass = TRUE;
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
// next fetch position is still at start of rowset.
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-3, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
4, // row to match
S_OK, // HRESULT to verify
3 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=DBBMK_LAST,cRows=1. Match last row. Call FindNext, cRows=-3, pBookmark=NULL. Match 4th row, S_OK.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_7()
{
BOOL fTestPass = TRUE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-3, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
4, // row to match
S_OK, // HRESULT to verify
3 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST, Offset=-2, cRows=-3. Verify row starting with N-4 fetched in traversal order
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_8()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
-1, // # rows to fetch
-2, // offset
g_ulColNum, // Which column to match
g_lRowLast-4, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, Offset=-2, cRows=-1. Verify N-2 row is fetched and fetch position is after N-3 row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_9()
{
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
return CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
-2, // offset
g_ulColNum, // Which column to match
g_lRowLast-2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, Offset=-4, cRows=2 and match last. Verify DB_S_END. Again cRows=-1 and no match. Again cRows=1 and match 1st.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_10()
{
BOOL fTestPass;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
2, // # rows to fetch
-4, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
1 // How many rows to expect.
);
if ( !COMPARE(fTestPass, TRUE) )
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
0, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
if ( !COMPARE(fTestPass, TRUE) )
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( !COMPARE(fTestPass, TRUE) )
goto CLEANUP;
CLEANUP:
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=3 and match last. DB_S_END. Again with cRows=2, verify DB_S_END.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_and_Fetch::Variation_11()
{
BOOL fTestPass;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
3, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
1 // How many rows to expect.
);
if ( !COMPARE(fTestPass, TRUE) )
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
2, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
if ( !COMPARE(fTestPass, TRUE) )
goto CLEANUP;
CLEANUP:
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_and_Fetch::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Boundary)
//*-----------------------------------------------------------------------
//| Test Case: Boundary - Test invalid arguments
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
// TO DO: Add your own code here
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADCHAPTER
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_1()
{
return TEST_SKIPPED;
#if 0
BOOL fTestPass = TRUE;
DBCOUNTITEM cRowsObtained;
HROW *rghRows = NULL;
HCHAPTER hBadChapter;
memset(&hBadChapter, 0xCA, sizeof(HCHAPTER));
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0,NULL));
//setup
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(hBadChapter, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_EQ, 0, NULL, FALSE,
1, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( !COMPARE(m_hr,DB_E_BADCHAPTER) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
CLEANUP:
PROVIDER_FREE(rghRows);
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
#endif
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG, cbBookmark != 0, pBookmark = NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_2()
{
BOOL fTestPass = TRUE;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
MAXDBCOUNTITEM, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast, // row to match
E_INVALIDARG, // HRESULT to verify
0 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG, pcRowsObtained = NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_3()
{
BOOL fTestPass = TRUE;
HROW *rghRows = NULL;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
//setup
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_EQ, 0, NULL, FALSE,
1, NULL, &rghRows);
// Verify HRESULT
if ( !COMPARE(m_hr,E_INVALIDARG) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
CLEANUP:
PROVIDER_FREE(rghRows);
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG prghRows = NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_4()
{
BOOL fTestPass = TRUE;
DBCOUNTITEM cRowsObtained = 0;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
//setup
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_EQ, 0, NULL, FALSE,
1, &cRowsObtained, NULL);
// Verify HRESULT
if ( !COMPARE(m_hr,E_INVALIDARG) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
CLEANUP:
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc DB_E_COMPAREOPS, CompareOp = -1 (<min
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_5()
{
BOOL fTestPass = TEST_PASS;
DBCOUNTITEM cRowsObtained = 0;
HROW * rghRows = NULL;
DBROWCOUNT lRowsToFetch = 0;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
//setup
TESTC(fTestPass=CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
-1, 0, NULL, FALSE,
lRowsToFetch, &cRowsObtained, &rghRows);
if (!CHECK(m_hr, DB_E_BADCOMPAREOP))
fTestPass = TEST_FAIL;
CLEANUP:
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADCOMPAREOP, CompareOp > max
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_6()
{
BOOL fTestPass = TEST_PASS;
DBCOUNTITEM cRowsObtained = 0;
HROW * rghRows = NULL;
DBROWCOUNT lRowsToFetch = 0;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
//setup
TESTC(fTestPass==CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_NOTCONTAINS+1, 0, NULL, FALSE,
lRowsToFetch, &cRowsObtained, &rghRows);
if (!CHECK(m_hr, DB_E_BADCOMPAREOP))
fTestPass = TEST_FAIL;
CLEANUP:
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADCOMPAREOP, unsupported
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_7()
{
BOOL fTestPass=TRUE;
CCol TempCol;
DBORDINAL ulColNum = g_pCTable->CountColumnsOnTable();
DBCOUNTITEM ulRowCount = g_pCTable->GetRowsOnCTable();
DBORDINAL ulColIndex;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
for (ulColIndex = 1; ulColIndex <= ulColNum; ulColIndex++ )
{
g_pCTable->GetColInfo(ulColIndex, TempCol);
for ( DWORD CompareOp = 0; CompareOp <= DBCOMPAREOPS_IGNORE; CompareOp++ )
{
//skip non-updable columns as we ca not call MakeData for them
if (TempCol.GetUpdateable() && !IsColumnMinimumFindable(&TempCol, CompareOp) )
{
fTestPass =
CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
TRUE, // skip current row
ulColIndex, // Which column to match
1, // row to match
DB_E_BADCOMPAREOP, // HRESULT to verify
0, // How many rows to expect.
TRUE, //fReleaseRows
CompareOp // Specifically ask for a compare Op
);
if ( fTestPass == TEST_FAIL )
{
odtLog<<"Error at ColName "<< TempCol.GetColName()<<L", ColIndex "<<ulColIndex<<L"; column type: "<<TempCol.GetProviderType()<<L"; CompareOp: "<<CompareOp<< ENDL;
odtLog<<"-------------------------------------------------------------"<< ENDL;
break;
}
}
}
}
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADBINDINFO, NULL hAccessor
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_8()
{
BOOL fTestPass = TRUE;
DBCOUNTITEM cRowsObtained = 0;
HROW *rghRows = NULL;
HRESULT hr = 0;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
// Lets create the accessor.
if ( FAILED(hr= m_pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA, 0, NULL, sizeof(DBLENGTH)+sizeof(DBSTATUS),
&m_hRowsetFindAccessor, NULL)) )
{
if(hr==DB_E_NULLACCESSORNOTSUPPORTED)
TESTC_DRIVER(FALSE); //skip if null accessor is not supported
fTestPass = TEST_FAIL;
goto CLEANUP;
}
// Check that for DBCOMPAREOPS_IGNORE the accessor and pData are ignored.
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, NULL,
DBCOMPAREOPS_IGNORE, 0, NULL, FALSE,
1, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( !CHECK(m_hr,S_OK) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!COMPARE(cRowsObtained,1))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADBINDINFO, 2 columns bound
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_9()
{
// Not an interesting test.
return TEST_SKIPPED;
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADBINDINFO, many columns bound
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_10()
{
BOOL fTestPass = TEST_FAIL;
DBCOUNTITEM cRowsObtained = 0;
HROW *rghRows = NULL;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
// use accessor from GetRowsetAndAccessor
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hAccessor, m_pData,
DBCOMPAREOPS_EQ, 0, NULL, FALSE,
1, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( !CHECK(m_hr,DB_E_BADBINDINFO) )
goto CLEANUP;
if ( !COMPARE(cRowsObtained, 0) )
goto CLEANUP;
if ( !COMPARE(rghRows, NULL) )
goto CLEANUP;
fTestPass = TEST_PASS;
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc DB_E_CANTSCROLLBACKWARDS. lRowsOffset<0
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_11()
{
BOOL fTestPass = TRUE;
if(g_rgDBPrpt[IDX_ScrollBackwards].fSupported && g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
{
return TEST_SKIPPED;
}
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
2, // # rows to fetch
-1, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_E_CANTSCROLLBACKWARDS, // HRESULT to verify
0 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc DB_E_CANTSCROLLBACKWARDS
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_12()
{
BOOL fTestPass = TRUE;
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
if(g_rgDBPrpt[IDX_ScrollBackwards].fSupported && g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
{
return TEST_SKIPPED;
}
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_E_CANTSCROLLBACKWARDS, // HRESULT to verify
0 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc DB_E_CANTSCROLLBACKWARDS, pBookmark = DBBMK_FIRST
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_13()
{
BOOL fTestPass = TRUE;
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
if(g_rgDBPrpt[IDX_ScrollBackwards].fSupported && g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
{
return TEST_SKIPPED;
}
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_E_CANTSCROLLBACKWARDS, // HRESULT to verify
0 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc DB_E_CANTSCROLLBACKWARDS, pBokmark = DBBMK_LAST
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_14()
{
BOOL fTestPass = TRUE;
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
if(g_rgDBPrpt[IDX_ScrollBackwards].fSupported && g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
{
return TEST_SKIPPED;
}
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_E_CANTSCROLLBACKWARDS, // HRESULT to verify
0 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(15)
//*-----------------------------------------------------------------------
// @mfunc DB_E_CANTFETCHBACKWARDS
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_15()
{
BOOL fTestPass = TRUE;
if(g_rgDBPrpt[IDX_FetchBackwards].fSupported && g_rgDBPrpt[IDX_FetchBackwards].fDefault)
{
return TEST_SKIPPED;
}
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_E_CANTFETCHBACKWARDS, // HRESULT to verify
0 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(16)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADCOMPAREOP, IGNORE and CASESENSITIVE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_16()
{
BOOL fTestPass = TRUE;
DBCOUNTITEM cRowsObtained = 0;
HROW * rghRows = NULL;
DBROWCOUNT lRowsToFetch = 1;
CCol TempCol;
g_pCTable->GetColInfo(g_ulColNum, TempCol);
if(!IsColumnMinimumFindable(&TempCol, DBCOMPAREOPS_IGNORE | DBCOMPAREOPS_CASESENSITIVE))
return TEST_SKIPPED;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
//setup
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_IGNORE | DBCOMPAREOPS_CASESENSITIVE, 0, NULL, FALSE,
lRowsToFetch, &cRowsObtained, &rghRows);
// should be treated as an DBCOMPAREOPS_IGNORE
if (!CHECK(m_hr, S_OK))
fTestPass = TEST_FAIL;
// Verify cRowsObtained
if ( !COMPARE(cRowsObtained,1) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(rghRows[0],1,g_pCTable),TRUE))
fTestPass=TEST_FAIL;
CLEANUP:
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(17)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADCOMPAREOP, just CASESENSITIVE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_17()
{
BOOL fTestPass = TRUE;
DBCOUNTITEM cRowsObtained = 0;
HROW * rghRows = NULL;
DBROWCOUNT lRowsToFetch = 0;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
//setup
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_CASESENSITIVE | (DBCOMPAREOPS_NOTCONTAINS+1), 0, NULL, FALSE,
lRowsToFetch, &cRowsObtained, &rghRows);
if (!CHECK(m_hr, DB_E_BADCOMPAREOP))
fTestPass = TEST_FAIL;
CLEANUP:
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(18)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADCOMPAREOP, just caseinsensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_18()
{
BOOL fTestPass = TRUE;
DBCOUNTITEM cRowsObtained = 0;
HROW * rghRows = NULL;
DBROWCOUNT lRowsToFetch = 0;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
//setup
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_CASEINSENSITIVE | -1 , 0, NULL, FALSE,
lRowsToFetch, &cRowsObtained, &rghRows);
if (!CHECK(m_hr, DB_E_BADCOMPAREOP))
fTestPass = TEST_FAIL;
CLEANUP:
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(19)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADCOMPAREOP, both case sensitive and insensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_19()
{
BOOL fTestPass = TRUE;
DBCOUNTITEM cRowsObtained = 0;
HROW * rghRows = NULL;
DBROWCOUNT lRowsToFetch = 0;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
0,NULL));
//setup
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_EQ | DBCOMPAREOPS_CASESENSITIVE | DBCOMPAREOPS_CASEINSENSITIVE,
0, NULL, FALSE, lRowsToFetch, &cRowsObtained, &rghRows);
if (!CHECK(m_hr, DB_E_BADCOMPAREOP))
fTestPass = TEST_FAIL;
CLEANUP:
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(20)
//*-----------------------------------------------------------------------
// @mfunc DB_S_ENDOFROWSET, search for null on non-nullable column
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary::Variation_20()
{
BOOL fTestPass = TRUE;
DBCOUNTITEM cRowsObtained;
HROW* rghRows = NULL;
DBORDINAL ulColToFind = 0;
DBTYPE wColType;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0,NULL));
if (!GetNonNullableCol(&ulColToFind, DBCOMPAREOPS_EQ, FALSE, &wColType))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
//setup
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, ulColToFind, wColType, SUBOP_EMPTY));
// Overwrite the status to search for NULL
ASSERT(DBSTATUS_S_OK == *(DBSTATUS *)(m_pFindValue+offsetof(DATA,sStatus)));
*(DBSTATUS *)(m_pFindValue+offsetof(DATA,sStatus)) = DBSTATUS_S_ISNULL;
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_EQ, 0, NULL, FALSE,
1, &cRowsObtained, &rghRows);
// reset status so that ReleaseFindValueAccessor
// can clean any embedded pointers
*(DBSTATUS *)(m_pFindValue+offsetof(DATA,sStatus)) = DBSTATUS_S_OK;
TESTC_(m_hr,DB_S_ENDOFROWSET);
TESTC(cRowsObtained==0);
TESTC(rghRows==NULL);
CLEANUP:
PROVIDER_FREE(rghRows);
ReleaseFindValueAccessor(wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(OutputRowHandleAllocation)
//*-----------------------------------------------------------------------
//| Test Case: OutputRowHandleAllocation - Test cRows, prghRows, pcRowsObtained parameters
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL OutputRowHandleAllocation::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
// TO DO: Add your own code here
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc cRows==0, *prghRows != NULL, Verify *prghRows != NULL on output
//
// @rdesc TEST_PASS or TEST_FAIL
//
int OutputRowHandleAllocation::Variation_1()
{
BOOL fTestPass = TRUE;
DBCOUNTITEM cRowsObtained = 0;
HROW * rghRows = NULL;
DBROWCOUNT lRowsToFetch = 0;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0,NULL));
//setup
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_EQ, 0, NULL, FALSE,
lRowsToFetch, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( !COMPARE(m_hr,S_OK) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
// Verify rghRows
if ( !COMPARE(rghRows,NULL) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
// Verify cRowsObtained
if ( !COMPARE(cRowsObtained,0) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
CLEANUP:
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc *pcRowsObtained = 0, *prghRows = NULL. Verify *prghRows = NULL on output
//
// @rdesc TEST_PASS or TEST_FAIL
//
int OutputRowHandleAllocation::Variation_2()
{
BOOL fTestPass = TRUE;
DBCOUNTITEM cRowsObtained = 0;
HROW * rghRows = NULL;
DBROWCOUNT lRowsToFetch = 1;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0,NULL));
//setup - make sure no match occurs by matching to row #0
TESTC(fTestPass=CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 0, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_EQ, 0, NULL, FALSE,
lRowsToFetch, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( !COMPARE(m_hr,DB_S_ENDOFROWSET) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
// Verify rghRows
if ( !COMPARE(rghRows,NULL) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
// Verify cRowsObtained
if ( !COMPARE(cRowsObtained,0) )
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
CLEANUP:
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=0, Match last. Verify S_OK. Set fSkip=1, cRows = 1, pBookmark = NULL, match last. DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int OutputRowHandleAllocation::Variation_3()
{
// TO DO: Add your own code here
return TEST_SKIPPED;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=LONG_MAX. fSkip=0. Match first row. Verify DB_S_ENDOFROWSET and all rows in rowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int OutputRowHandleAllocation::Variation_4()
{
BOOL fTestPass = TEST_FAIL;
HROW * rghRows = NULL;
DBCOUNTITEM cRowsObtained = 0;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0,NULL));
//setup
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, g_ulColNum, g_wColType, SUBOP_EMPTY));
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_EQ, 0, NULL, 0,
MAXDBROWCOUNT, &cRowsObtained, &rghRows);
if (m_hr == E_OUTOFMEMORY)
{
if (!COMPARE(cRowsObtained, 0))
goto CLEANUP;
if (!COMPARE(rghRows, NULL))
goto CLEANUP;
}
else if (m_hr == DB_S_ENDOFROWSET)
{
if (!COMPARE(cRowsObtained, ULONG(g_lRowLast)))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(rghRows[0],1,g_pCTable),TRUE))
goto CLEANUP;
}
else
{
CHECK(m_hr, DB_S_ENDOFROWSET); // generate a error
goto CLEANUP; // always a test failure at this point
}
fTestPass = TEST_PASS;
CLEANUP:
PROVIDER_FREE(rghRows);
ReleaseFindValueAccessor(g_wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL OutputRowHandleAllocation::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(CompareOp)
//*-----------------------------------------------------------------------
//| Test Case: CompareOp - Test the various compare operations
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CompareOp::Init()
{
BOOL fTestPass = TEST_PASS;
if(!TCIRowsetFind::Init())
return FALSE;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0, NULL));
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_EQ
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_1()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_EQ, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_LT
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_2()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_LT, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_LE, Use Equal case
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_3()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_LE, SUBOP_ALWAYS_EQ);
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_LE, Use Less Than case
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_4()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_LE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_GT
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_5()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_GT, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_GE, Use Equal case
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_6()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_GE, SUBOP_ALWAYS_EQ);
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_GE, Use Greater than case
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_7()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_GE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_BEGINSWITH
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_8()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_BEGINSWITH, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_CONTAINS, match start of string
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_9()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_CONTAINS, SUBOP_CONTAINS_BEGIN);
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_CONTAINS, match middle of string
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_10()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_CONTAINS, SUBOP_CONTAINS_MIDDLE);
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_CONTAINS, match end of string
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_11()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_CONTAINS, SUBOP_CONTAINS_END);
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_NE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_12()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_NE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_IGNORE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_13()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_IGNORE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_NOTBEGINSWITH
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_14()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_NOTBEGINSWITH, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(15)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_NOTCONTAINS
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_15()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_NOTCONTAINS, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(16)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_CONTAINS, use Equal case
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_16()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_CONTAINS, SUBOP_ALWAYS_EQ);
}
// }}
// {{ TCW_VAR_PROTOTYPE(17)
//*-----------------------------------------------------------------------
// @mfunc COMPAREOPS_BEGINSWITH, Use Equal case
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CompareOp::Variation_17()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_BEGINSWITH, SUBOP_ALWAYS_EQ);
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CompareOp::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(fSkipCurrent)
//*-----------------------------------------------------------------------
//| Test Case: fSkipCurrent - Test for correct behavior with fSkipCurrent flag
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL fSkipCurrent::Init()
{
BOOL fTestPass = FALSE;
DBPROPID guidPropertySet;
ULONG cPrptSet=0;
if(!TCIRowsetFind::Init())
return FALSE;
TESTC_DRIVER(g_rgDBPrpt[IDX_ScrollBackwards].fSupported);
if(!g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
{
guidPropertySet=DBPROP_CANSCROLLBACKWARDS;
cPrptSet++;
}
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidPropertySet));
CLEANUP:
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc fSkip=0, cRows=1. Match 1st. Verify S_OK and one row handle
//
// @rdesc TEST_PASS or TEST_FAIL
//
int fSkipCurrent::Variation_1()
{
BOOL fTestPass = FALSE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
1, // offset
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Match 1st row. pBookMark=NULL, fSkip=TRUE. Match 1st row. DB_S_ENDOFROWSET and no row handles.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int fSkipCurrent::Variation_2()
{
BOOL fTestPass = FALSE;
DBBOOKMARK dbBookmark = DBBMK_FIRST;
BYTE *pBookmark = (BYTE *)&dbBookmark;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
1, // Offset
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
-1, // offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Match 5th row. pBookMark=NULL, fSkip=FALSE. Match 5th row. S_OK and no row handles.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int fSkipCurrent::Variation_3()
{
BOOL fTestPass = FALSE;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
5, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
1, // offset
g_ulColNum, // Which column to match
5, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL fSkipCurrent::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(pFindValue)
//*-----------------------------------------------------------------------
//| Test Case: pFindValue - Test the various coercions possible
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL pFindValue::Init()
{
DBPROPID guidPropertySet;
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidPropertySet));
CLEANUP:
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc IStorage compares, DBCOMPAREOPS_EQ
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_1()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_EQ, SUBOP_EMPTY, TRUE);
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc IStorage, DBCOMPAREOPS_BEGINSWITH
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_2()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_BEGINSWITH, SUBOP_EMPTY, TRUE);
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc IStorage, DBCOMPAREOPS_GT
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_3()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_GT, SUBOP_EMPTY, TRUE);
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc IStorage, DBCOMPAREOPS_GE (EQUAL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_4()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_EQ, SUBOP_ALWAYS_EQ, TRUE);
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc IStorage, DBCOMPAREOPS_GE (Greater
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_5()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_GE, SUBOP_EMPTY, TRUE);
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc IStorage, DBCOMPAREOPS_LT
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_6()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_LT, SUBOP_EMPTY, TRUE) ;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc IStorage, DBCOMPAREOPS_LE (EQUAL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_7()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_LE, SUBOP_ALWAYS_EQ, TRUE);
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc IStorage, DBCOMPAREOPS_LE (Less
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_8()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_LE, SUBOP_EMPTY, TRUE);
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc IStorage, DBCOMPAREOPS_CONTAINS, beginning
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_9()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_CONTAINS, SUBOP_CONTAINS_BEGIN, TRUE);
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc IStorage, DBCOMPAREOPS_CONTAINS, middle
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_10()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_CONTAINS, SUBOP_CONTAINS_MIDDLE, TRUE);
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc IStorage, DBCOMPAREOPS_CONTAINS, end
//
// @rdesc TEST_PASS or TEST_FAIL
//
int pFindValue::Variation_11()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_CONTAINS, SUBOP_CONTAINS_END, TRUE);
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL pFindValue::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(SingleRowRowset)
//*-----------------------------------------------------------------------
//| Test Case: SingleRowRowset - Test on a one row rowset
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL SingleRowRowset::Init()
{
if (!g_p1RowTable)
return TEST_SKIPPED;
if(!TCIRowsetFind::Init())
return FALSE;
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Match 1st. pBookMark = DBBMK_FIRST, cRows=1, fSkip=TRUE. DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int SingleRowRowset::Variation_1()
{
BOOL fTestPass;
DBPROPID guidProperty[1];
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
guidProperty[0]=DBPROP_CANSCROLLBACKWARDS;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_p1RowTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
1,guidProperty))
{
fTestPass = TEST_PASS; // OK to pass if properties aren't supported
goto CLEANUP;
}
fTestPass = CallFindNextRows( g_p1RowTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // skip current row
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
fTestPass = CallFindNextRows( g_p1RowTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
1, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Match 1st. pBookMark = DBBMK_FIRST, cRows=1, fSkipCurrent = FALSE. S_OK and one row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int SingleRowRowset::Variation_2()
{
BOOL fTestPass;
DBPROPID guidProperty[1];
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
guidProperty[0]=DBPROP_CANSCROLLBACKWARDS;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_p1RowTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
1,guidProperty))
{
fTestPass = TEST_PASS; // OK to pass if properties aren't supported
goto CLEANUP;
}
fTestPass = CallFindNextRows( g_p1RowTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
fTestPass = CallFindNextRows( g_p1RowTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Match First. pBookmark = DBBMK_LAST. cRows=-1, fSkip=TRUE. DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int SingleRowRowset::Variation_3()
{
BOOL fTestPass;
DBPROPID guidProperty[2];
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
guidProperty[0]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[1]=DBPROP_CANFETCHBACKWARDS;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_p1RowTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
1,guidProperty))
{
fTestPass = TEST_PASS; // OK to pass if properties aren't supported
goto CLEANUP;
}
fTestPass = CallFindNextRows( g_p1RowTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // skip current row
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
fTestPass = CallFindNextRows( g_p1RowTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
-1, // # rows to fetch
1, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Match first. pBookMark=DBBMK_LAST. cRows=-1. fSkip=-1. fSkip=FALSE. S_OK and 1 hrow
//
// @rdesc TEST_PASS or TEST_FAIL
//
int SingleRowRowset::Variation_4()
{
BOOL fTestPass;
DBPROPID guidProperty[2];
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
guidProperty[0]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[1]=DBPROP_CANFETCHBACKWARDS;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_p1RowTable, SELECT_ALLFROMTBL, IID_IRowsetFind,
1,guidProperty))
{
fTestPass = TEST_PASS; // OK to pass if properties aren't supported
goto CLEANUP;
}
fTestPass = CallFindNextRows( g_p1RowTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // skip current row
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
fTestPass = CallFindNextRows( g_p1RowTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
-1, // # rows to fetch
0, // lOffset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL SingleRowRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Related_RestartPosition)
//*-----------------------------------------------------------------------
//| Test Case: Related_RestartPosition - Test in conjunction with RestartPosition
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_RestartPosition::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
// TO DO: Add your own code here
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Match 5th. Restart. Call Find, cRows=1, fSkip=TRUE, match 5th. Verify DB_S_ENDOFROWSET (because of restart
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_RestartPosition::Variation_1()
{
return TRUE;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Match 5th. Restart. Call Find, cRows=1, fSkip=FALSE, match 4th. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_RestartPosition::Variation_2()
{
return TRUE;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Match Last. Restart. Call Find, cRows=1, fSkip=TRUE. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_RestartPosition::Variation_3()
{
return TRUE;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_RestartPosition::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Related_GetNextRows)
//*-----------------------------------------------------------------------
//| Test Case: Related_GetNextRows - Test in conjunction with GetNextRows
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_GetNextRows::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
// TO DO: Add your own code here
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=DBBMK_FIRST, Verify GetNextRows pos not changed
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_GetNextRows::Variation_1()
{
BOOL fTestPass = FALSE;
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE * pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained = 0;
HROW * phrow = NULL;
DBPROPID guidPropertySet[1];
ULONG cPrptSet=0;
TESTC_DRIVER(g_rgDBPrpt[IDX_ScrollBackwards].fSupported);
if(!g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
{
guidPropertySet[cPrptSet++]=DBPROP_CANSCROLLBACKWARDS;
}
//create a rowset and an accessor.
//DBPROP_CANSCROLLBACKWARDS is requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,guidPropertySet));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
// using pBookmark = DBBMK_LAST should not affect GetNextRows position
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(phrow[0],1,g_pCTable),TRUE))
goto CLEANUP;
if (!CHECK(m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL), S_OK))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phrow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Use pBookmark=middle bmk. Verify GetNextRows pos not changed
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_GetNextRows::Variation_2()
{
BOOL fTestPass = FALSE;
BYTE * pBookmark=NULL;
DBCOUNTITEM cRowsObtained = 0;
ULONG_PTR cbBookmark = 0;
HROW * phrow = NULL;
IRowsetLocate * pIRowsetLocate = NULL;
DBPROPID guidProperty[1];
guidProperty[0]=DBPROP_IRowsetLocate;
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty), guidProperty));
if ( !VerifyInterface(m_pIRowset, IID_IRowsetLocate, ROWSET_INTERFACE, (IUnknown **)&pIRowsetLocate))
goto CLEANUP;
GetBookmark(g_lRowLast/2, &cbBookmark, &pBookmark);
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast-2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
// using pBookmark = g_lRowLast/2 should not affect GetNextRows position
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(phrow[0],1,g_pCTable),TRUE))
goto CLEANUP;
if (!CHECK(m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL), S_OK))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(pBookmark);
PROVIDER_FREE(phrow);
SAFE_RELEASE(pIRowsetLocate);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Use pBookMark = DBBMK_LAST, Verify GetNextRows pos not changed
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_GetNextRows::Variation_3()
{
BOOL fTestPass = FALSE;
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE * pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained = 0;
HROW * phrow = NULL;
DBPROPID guidPropertySet[1];
ULONG cPrptSet=0;
TESTC_DRIVER(g_rgDBPrpt[IDX_ScrollBackwards].fSupported);
if(!g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
{
guidPropertySet[cPrptSet++]=DBPROP_CANSCROLLBACKWARDS;
}
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,guidPropertySet));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
// using pBookmark = DBBMK_LAST should not affect GetNextRows position
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(phrow[0],1,g_pCTable),TRUE))
goto CLEANUP;
if (!CHECK(m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL), S_OK))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phrow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc use pBookmark=NULL, match 1st row. Verify GetNextRows pos is after 1st row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_GetNextRows::Variation_4()
{
BOOL fTestPass = FALSE;
DBCOUNTITEM cRowsObtained = 0;
HROW *phrow = NULL;
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0,NULL));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
// using pBookmark = NULL should affect GetNextRows position
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(phrow[0],2,g_pCTable),TRUE))
goto CLEANUP;
if (!CHECK(m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL), S_OK))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phrow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Use pBookmark=NULL, match last row. Verify GetNextRows with cRows=1 returns DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_GetNextRows::Variation_5()
{
BOOL fTestPass = FALSE;
DBCOUNTITEM cRowsObtained = 0;
HROW *phrow = NULL;
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0,NULL));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
// using pBookmark = NULL should affect GetNextRows position
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), DB_S_ENDOFROWSET) )
goto CLEANUP;
if (!COMPARE(cRowsObtained, 0))
goto CLEANUP;
//call VerifyRowPosition
if(!COMPARE(phrow,NULL))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phrow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Use pBookmark=NULL, match middle row. Use pBookmark=2nd bmk and match 2nd. Verify GetNextRows is still after middle row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_GetNextRows::Variation_6()
{
BOOL fTestPass = FALSE;
BYTE *pBookmark=NULL;
DBCOUNTITEM cRowsObtained = 0;
ULONG_PTR cbBookmark = 0;
HROW *phrow = NULL;
IRowsetLocate *pIRowsetLocate = NULL;
DBPROPID PropID = DBPROP_IRowsetFind;
ULONG cPrptSet=1;
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
cPrptSet,&PropID));
if ( !VerifyInterface(m_pIRowset, IID_IRowsetLocate, ROWSET_INTERFACE, (IUnknown **)&pIRowsetLocate))
goto CLEANUP;
GetBookmark(2, &cbBookmark, &pBookmark);
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast/2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(phrow[0],(g_lRowLast/2)+1,g_pCTable),TRUE))
goto CLEANUP;
if (!CHECK(m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL), S_OK))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phrow);
PROVIDER_FREE(pBookmark);
SAFE_RELEASE(pIRowsetLocate);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Call GetNextRows with last row fetched = 3. Call FindNextRows, pBookmark=NULL,cRows=-1 to match 4th. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_GetNextRows::Variation_7()
{
BOOL fTestPass = FALSE;
DBCOUNTITEM cRowsObtained = 0;
HROW *phrow = NULL;
DBPROPID guidProperty;
ULONG cPrptSet = 0;
TESTC_DRIVER(g_rgDBPrpt[IDX_FetchBackwards].fSupported &&
g_rgDBPrpt[IDX_ScrollBackwards].fSupported );
if(!g_rgDBPrpt[IDX_FetchBackwards].fDefault)
{
guidProperty=DBPROP_CANFETCHBACKWARDS;
cPrptSet++;
}
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS is requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidProperty));
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 3, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!CHECK(m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL), S_OK))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
4, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc GetNextRows, cRows=1, Offset=0. Verify S_OK. FindNext with pBookmark=NULL, cRows=1 and match 1st. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_GetNextRows::Variation_8()
{
BOOL fTestPass = FALSE;
DBCOUNTITEM cRowsObtained = 0;
HROW *phrow = NULL;
DBPROPID guidProperty;
ULONG cPrptSet = 0;
TESTC_DRIVER(g_rgDBPrpt[IDX_FetchBackwards].fSupported &&
g_rgDBPrpt[IDX_ScrollBackwards].fSupported );
if(!g_rgDBPrpt[IDX_FetchBackwards].fDefault)
{
guidProperty=DBPROP_CANFETCHBACKWARDS;
cPrptSet++;
}
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS is requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidProperty));
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!CHECK(m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL), S_OK))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phrow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc FindNext with pBookmark=NULL, cRows=2 and match 4th. GetNextRows with cRows=-3. Verify 5,4,3 row handles.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_GetNextRows::Variation_9()
{
BOOL fTestPass = FALSE;
DBCOUNTITEM cRowsObtained = 0;
HROW *phrow = NULL;
DBPROPID guidProperty;
ULONG cPrptSet = 0;
TESTC_DRIVER(g_rgDBPrpt[IDX_FetchBackwards].fSupported &&
g_rgDBPrpt[IDX_ScrollBackwards].fSupported );
if(!g_rgDBPrpt[IDX_FetchBackwards].fDefault)
{
guidProperty=DBPROP_CANFETCHBACKWARDS;
cPrptSet++;
}
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS is requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidProperty));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
2, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
4, // row to match
S_OK, // HRESULT to verify
2 // How many rows to expect.
);
if ( !COMPARE(fTestPass,TRUE) )
goto CLEANUP;
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, -3, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(phrow[0],5,g_pCTable),TRUE))
goto CLEANUP;
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(phrow[1],4,g_pCTable),TRUE))
goto CLEANUP;
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(phrow[2],3,g_pCTable),TRUE))
goto CLEANUP;
if (!CHECK(m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL), S_OK))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phrow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc FindNext, pBookmark=NULL, match last. FindNext, pBmk=NULL, cRows=-1, match last. GetNext. cRows=-1 and verify next to last
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_GetNextRows::Variation_10()
{
BOOL fTestPass = FALSE;
DBCOUNTITEM cRowsObtained = 0;
HROW *phrow = NULL;
DBPROPID guidProperty;
ULONG cPrptSet = 0;
TESTC_DRIVER(g_rgDBPrpt[IDX_FetchBackwards].fSupported &&
g_rgDBPrpt[IDX_ScrollBackwards].fSupported );
if(!g_rgDBPrpt[IDX_FetchBackwards].fDefault)
{
guidProperty=DBPROP_CANFETCHBACKWARDS;
cPrptSet++;
}
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS is requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidProperty));
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( !COMPARE(fTestPass,TRUE) )
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( !COMPARE(fTestPass,TRUE) )
goto CLEANUP;
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, -1, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
//call VerifyRowPosition
if(!COMPARE(VerifyRowPosition(phrow[0],g_lRowLast-1,g_pCTable),TRUE))
goto CLEANUP;
if (!CHECK(m_pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL), S_OK))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phrow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_GetNextRows::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Scroll_BookMark)
//*-----------------------------------------------------------------------
//| Test Case: Scroll_BookMark - CanScrollBackwards with bookmarks
//| Created: 06/24/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_BookMark::Init()
{
BOOL fTestPass = FALSE;
DBPROPID guidPropertySet[2];
ULONG cPrptSet=0;
if(!TCIRowsetFind::Init())
return FALSE;
TESTC_DRIVER(g_rgDBPrpt[IDX_OrderedBookmarks].fSupported &&
g_rgDBPrpt[IDX_IRowsetLocate].fSupported);
if(!g_rgDBPrpt[IDX_IRowsetLocate].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_IRowsetLocate;
if(!g_rgDBPrpt[IDX_OrderedBookmarks].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_ORDEREDBOOKMARKS;
//DBPROP_ORDEREDBOOKMARKS and DBPROP_IRowsetLocate
//are requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_FIRST, cRows=1. Match first row. Verify S_OK and one row handle
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_BookMark::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_LAST,cRows=1. Match last row. Verify S_OK and last row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_BookMark::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_INVALID. Verify DB_E_BADBOOKMARK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_BookMark::Variation_3()
{
DBBOOKMARK DBBookmark=DBBMK_INVALID;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
1, // row to match
DB_E_BADBOOKMARK, // HRESULT to verify
0 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=one bookmark for each row, cRows=1. Always match current row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_BookMark::Variation_4()
{
BOOL fTestPass;
ULONG_PTR cbBookmark;
BYTE *pBookmark;
for ( LONG i = 1; i <= g_lRowLast; i++ )
{
GetBookmark(i, &cbBookmark, &pBookmark);
fTestPass = CallFindNextRows(
g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
i, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( fTestPass == TEST_FAIL ) break;
PROVIDER_FREE(pBookmark);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=random value. Verify DB_E_BADBOOKMARK (warning-could get a provider specific error
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_BookMark::Variation_5()
{
BYTE pBookmark[4];
memset(pBookmark, 0xCA, 4);
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
4, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
1, // row to match
DB_E_BADBOOKMARK, // HRESULT to verify
0 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=2nd row and offset=-1, cRows=1. Verify first row matched.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_BookMark::Variation_6()
{
BOOL fTestPass = FALSE;
ULONG_PTR cbBookmark;
BYTE *pBookmark;
GetBookmark(2, &cbBookmark, &pBookmark);
fTestPass= CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
-1, // Offset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
PROVIDER_FREE(pBookmark);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=4th row, Offset=2, cRows=1 and match 5th row. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_BookMark::Variation_7()
{
BOOL fTestPass = FALSE;
ULONG_PTR cbBookmark;
BYTE *pBookmark;
GetBookmark(4, &cbBookmark, &pBookmark);
fTestPass= CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
2, // Offset
g_ulColNum, // Which column to match
5, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
PROVIDER_FREE(pBookmark);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=5th row. Offset=0, cRows=1 and match 5th. Again with pBookmark=NULL, Offset=0, cRows=1 and match 2nd. Verify S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_BookMark::Variation_8()
{
BOOL fTestPass = FALSE;
ULONG_PTR cbBookmark;
BYTE *pBookmark;
GetBookmark(5, &cbBookmark, &pBookmark);
fTestPass= CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
5, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if ( !COMPARE(fTestPass, TRUE) )
goto CLEANUP;
fTestPass= CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
CLEANUP:
PROVIDER_FREE(pBookmark);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=2nd row and offset = -2, cRows=1, Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_BookMark::Variation_9()
{
BOOL fTestPass = FALSE;
ULONG_PTR cbBookmark;
BYTE *pBookmark;
GetBookmark(2, &cbBookmark, &pBookmark);
fTestPass= CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
-2, // Offset
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
PROVIDER_FREE(pBookmark);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=DBBMK_FIRST, cRows=0 Should be no-op
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_BookMark::Variation_10()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
0, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast+1, // row to match
S_OK, // HRESULT to verify
0 // How many rows to expect.
);
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_BookMark::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Scroll_Fetch_Bookmarks)
//*-----------------------------------------------------------------------
//| Test Case: Scroll_Fetch_Bookmarks - CanScrollBackwards and CanFetchBackwards with Bookmarks
//| Created: 06/24/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_Fetch_Bookmarks::Init()
{
BOOL fTestPass = FALSE;
DBPROPID guidPropertySet[4];
ULONG cPrptSet=0;
if(!TCIRowsetFind::Init())
return FALSE;
TESTC_DRIVER(g_rgDBPrpt[IDX_OrderedBookmarks].fSupported &&
g_rgDBPrpt[IDX_FetchBackwards].fSupported &&
g_rgDBPrpt[IDX_ScrollBackwards].fSupported);
if(!g_rgDBPrpt[IDX_FetchBackwards].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_CANFETCHBACKWARDS;
if(!g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_CANSCROLLBACKWARDS;
if(!g_rgDBPrpt[IDX_OrderedBookmarks].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_ORDEREDBOOKMARKS;
if(!g_rgDBPrpt[IDX_IRowsetLocate].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_IRowsetLocate;
//DBPROP_ORDEREDBOOKMARKS,DBPROP_CANFETCHBACKWARDS and DBPROP_CANSCROLLBACKWARDS
//are requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_FIRST, cRows=5 and match 1st row. Verify S_OK and 5 hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_Bookmarks::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
5, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
5 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc pBookMarks=DBBMK_LAST,cRows=-5 match last row. Verify S_OK and 5 hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_Bookmarks::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
return CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
-5, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
S_OK, // HRESULT to verify
5 // How many rows to expect.
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=2nd row, cRows=2, Offset=1. Match 4th row. Verify S_OK and 2 hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_Bookmarks::Variation_3()
{
BOOL fTestPass;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
//get the bookmark for the 2th ro
if(!GetBookmark(2,&cbBookmark, &pBookmark))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
2, // # rows to fetch
1, // Offset
g_ulColNum, // Which column to match
g_lRowLast-1, // row to match
S_OK, // HRESULT to verify
2 // How many rows to expect.
);
PROVIDER_FREE(pBookmark);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=5th row, cRows=-2. Match3rd row. Verify S_OK and 2 hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_Bookmarks::Variation_4()
{
BOOL fTestPass;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
//get the bookmark for the 2th row
if(!GetBookmark(5,&cbBookmark, &pBookmark))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
-2, // # rows to fetch
2, // Offset
g_ulColNum, // Which column to match
3, // row to match
S_OK, // HRESULT to verify
2 // How many rows to expect.
);
PROVIDER_FREE(pBookmark);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=Last row, cRows=1, Offset=1. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_Bookmarks::Variation_5()
{
BOOL fTestPass;
ULONG_PTR cbBookmark;
BYTE * pBookmark=NULL;
//get the bookmark for the last
if(!GetBookmark(g_lRowLast,&cbBookmark, &pBookmark))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
-1, // # rows to fetch
1, // Offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
PROVIDER_FREE(pBookmark);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_Fetch_Bookmarks::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(CaseSensitive_Compares)
//*-----------------------------------------------------------------------
//| Test Case: CaseSensitive_Compares - Test the case sensitive property
//| Created: 06/26/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CaseSensitive_Compares::Init()
{
DBPROPID guidPropertySet;
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidPropertySet));
CLEANUP:
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc EQ, sensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_1()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_EQ | DBCOMPAREOPS_CASESENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc EQ, insensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_2()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_EQ | DBCOMPAREOPS_CASEINSENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc LT, sensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_3()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_LT | DBCOMPAREOPS_CASESENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc LT, insensitve
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_4()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_LT | DBCOMPAREOPS_CASEINSENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc LE, sensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_5()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_LE | DBCOMPAREOPS_CASESENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc LE, insensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_6()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_LE | DBCOMPAREOPS_CASEINSENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc GT, sensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_7()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_GT | DBCOMPAREOPS_CASESENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc GT, insensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_8()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_GT | DBCOMPAREOPS_CASEINSENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc GE, sensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_9()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_GE | DBCOMPAREOPS_CASESENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc GE, insensitve
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_10()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_GE | DBCOMPAREOPS_CASEINSENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc NE, sensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_11()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_NE | DBCOMPAREOPS_CASESENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc NE, insensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_12()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_NE | DBCOMPAREOPS_CASEINSENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc BEGINSWITH, sensitve
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_13()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_BEGINSWITH | DBCOMPAREOPS_CASESENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc BEGINSWITH, insensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_14()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_BEGINSWITH | DBCOMPAREOPS_CASEINSENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(15)
//*-----------------------------------------------------------------------
// @mfunc BEGINSWITH, sensitive negative match
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_15()
{
BOOL fTestPass = TEST_SKIPPED;
DBCOUNTITEM cRowsObtained = 0;
DBORDINAL ulColToFind;
DBTYPE wColType;
HROW * rghRows = NULL;
CCol TempCol;
m_pIRowset->RestartPosition(DB_NULL_HCHAPTER);
if (!GetVariableLengthStrAndUpdatable(&ulColToFind, DBCOMPAREOPS_BEGINSWITH, FALSE, &wColType))
goto CLEANUP;
g_pCTable->GetColInfo(ulColToFind, TempCol);
if(!ValidateCompareOp(TC_FindCompareOps(TempCol.GetColID()), DBCOMPAREOPS_BEGINSWITH | DBCOMPAREOPS_CASESENSITIVE))
return TEST_SKIPPED;
//setup
//set up a INSENSITIVE match binding
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_BEGINSWITH | DBCOMPAREOPS_CASEINSENSITIVE, g_pCTable, 1, ulColToFind, wColType, SUBOP_EMPTY));
// But actually use a CASESENSITIVE operator
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_BEGINSWITH | DBCOMPAREOPS_CASESENSITIVE, 0, NULL, 0,
1, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( m_hr == DB_E_BADCOMPAREOP )
{
// The provider only supported case insensitive compares
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
else if (!CHECK(m_hr, DB_S_ENDOFROWSET))
{
odtLog << "Found a match, when the match should have failed." << ENDL;
fTestPass = TEST_FAIL;
goto CLEANUP;
}
fTestPass = TEST_PASS;
CLEANUP:
if (cRowsObtained>0)
{
m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL);
PROVIDER_FREE(rghRows);
}
ReleaseFindValueAccessor(wColType);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(16)
//*-----------------------------------------------------------------------
// @mfunc CONTAINS, sensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_16()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_CONTAINS | DBCOMPAREOPS_CASESENSITIVE, SUBOP_CONTAINS_BEGIN);
}
// }}
// {{ TCW_VAR_PROTOTYPE(17)
//*-----------------------------------------------------------------------
// @mfunc CONTAINS, insensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_17()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_CONTAINS | DBCOMPAREOPS_CASEINSENSITIVE, SUBOP_CONTAINS_BEGIN);
}
// }}
// {{ TCW_VAR_PROTOTYPE(18)
//*-----------------------------------------------------------------------
// @mfunc CONTAINS, sensitive negative match
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_18()
{
BOOL fTestPass = TEST_SKIPPED;
DBCOUNTITEM cRowsObtained = 0;
DBORDINAL ulColToFind;
DBTYPE wColType;
HROW * rghRows = NULL;
CCol TempCol;
m_pIRowset->RestartPosition(DB_NULL_HCHAPTER);
if (!GetVariableLengthStrAndUpdatable(&ulColToFind, DBCOMPAREOPS_CONTAINS, FALSE, &wColType))
goto CLEANUP;
g_pCTable->GetColInfo(ulColToFind, TempCol);
if(!ValidateCompareOp(TC_FindCompareOps(TempCol.GetColID()), DBCOMPAREOPS_CONTAINS | DBCOMPAREOPS_CASESENSITIVE))
return TEST_SKIPPED;
//setup
//set up a INSENSITIVE match binding
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_CONTAINS | DBCOMPAREOPS_CASEINSENSITIVE, g_pCTable, 1, ulColToFind, wColType, SUBOP_CONTAINS_BEGIN));
// But actually use a CASESENSITIVE operator
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_CONTAINS | DBCOMPAREOPS_CASESENSITIVE, 0, NULL, 0,
1, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( m_hr == DB_E_BADCOMPAREOP )
{
// The provider only supported case insensitive compares
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
else if (!CHECK(m_hr, DB_S_ENDOFROWSET))
{
odtLog << "Found a match, when the match should have failed." << ENDL;
fTestPass = TEST_FAIL;
}
CLEANUP:
if (cRowsObtained>0)
{
m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL);
PROVIDER_FREE(rghRows);
}
ReleaseFindValueAccessor(wColType);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(19)
//*-----------------------------------------------------------------------
// @mfunc NOTBEGINSWITH, sensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_19()
{
BOOL fTestPass = TEST_SKIPPED;
DBCOUNTITEM cRowsObtained = 0;
DBORDINAL ulColToFind;
DBTYPE wColType;
HROW * rghRows = NULL;
m_pIRowset->RestartPosition(DB_NULL_HCHAPTER);
if (!GetVariableLengthStrAndUpdatable(&ulColToFind, DBCOMPAREOPS_NOTBEGINSWITH, FALSE, &wColType))
goto CLEANUP;
//setup
//set up a INSENSITIVE BEGINSWITH match binding to create lower case version of the data
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_BEGINSWITH | DBCOMPAREOPS_CASEINSENSITIVE, g_pCTable, 1, ulColToFind, wColType, SUBOP_EMPTY));
// But actually use a CASESENSITIVE with NOTBEGINSWITH operator
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_NOTBEGINSWITH | DBCOMPAREOPS_CASESENSITIVE, 0, NULL, 0,
1, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( m_hr == DB_E_BADCOMPAREOP )
{
// The provider only supported case insensitive compares
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
else if (!CHECK(m_hr, S_OK))
{
odtLog << "Didn't find a match." << ENDL;
fTestPass = TEST_FAIL;
}
if(!COMPARE(cRowsObtained,1) || !COMPARE(VerifyRowPosition(rghRows[0], 1, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
else
fTestPass = TEST_PASS;
CLEANUP:
if (cRowsObtained>0)
{
m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL);
PROVIDER_FREE(rghRows);
}
ReleaseFindValueAccessor(wColType);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(20)
//*-----------------------------------------------------------------------
// @mfunc NOTBEGINSWITH, insensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_20()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_NOTBEGINSWITH | DBCOMPAREOPS_CASEINSENSITIVE, SUBOP_EMPTY);
}
// }}
// {{ TCW_VAR_PROTOTYPE(21)
//*-----------------------------------------------------------------------
// @mfunc NOTBEGINSWITH, sensitive negative match
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_21()
{
BOOL fTestPass = TEST_SKIPPED;
DBCOUNTITEM cRowsObtained = 0;
DBORDINAL ulColToFind;
DBTYPE wColType;
HROW * rghRows = NULL;
CCol TempCol;
m_pIRowset->RestartPosition(DB_NULL_HCHAPTER);
if (!GetVariableLengthStrAndUpdatable(&ulColToFind, DBCOMPAREOPS_NOTBEGINSWITH, FALSE, &wColType))
goto CLEANUP;
g_pCTable->GetColInfo(ulColToFind, TempCol);
if(!ValidateCompareOp(TC_FindCompareOps(TempCol.GetColID()), DBCOMPAREOPS_NOTBEGINSWITH | DBCOMPAREOPS_CASEINSENSITIVE))
return TEST_SKIPPED;
//setup
//set up a BEGINSWITH INSENSITIVE match binding
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_BEGINSWITH | DBCOMPAREOPS_CASEINSENSITIVE, g_pCTable, 1, ulColToFind, wColType, SUBOP_EMPTY));
// Use a CASEINSENSITIVE operator
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_NOTBEGINSWITH | DBCOMPAREOPS_CASEINSENSITIVE, 0, NULL, 0,
1, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( m_hr == DB_E_BADCOMPAREOP )
{
// The provider only supported case insensitive compares
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
else if (cRowsObtained != 0 && VerifyRowPosition(rghRows[0], 1, g_pCTable))
{
odtLog << "Found a match on first row, when the match should have failed." << ENDL;
fTestPass = TEST_FAIL;
goto CLEANUP;
}
fTestPass = TEST_PASS;
CLEANUP:
if (cRowsObtained>0)
{
m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL);
PROVIDER_FREE(rghRows);
}
ReleaseFindValueAccessor(wColType);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(22)
//*-----------------------------------------------------------------------
// @mfunc NOTCONTAINS, sensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_22()
{
BOOL fTestPass = TEST_SKIPPED;
DBCOUNTITEM cRowsObtained = 0;
DBORDINAL ulColToFind;
DBTYPE wColType;
HROW * rghRows = NULL;
CCol TempCol;
m_pIRowset->RestartPosition(DB_NULL_HCHAPTER);
if (!GetVariableLengthStrAndUpdatable(&ulColToFind, DBCOMPAREOPS_NOTCONTAINS, FALSE, &wColType))
goto CLEANUP;
g_pCTable->GetColInfo(ulColToFind, TempCol);
if(!ValidateCompareOp(TC_FindCompareOps(TempCol.GetColID()), DBCOMPAREOPS_NOTCONTAINS | DBCOMPAREOPS_CASESENSITIVE))
return TEST_SKIPPED;
//setup
//set up a INSENSITIVE CONTAINS match binding to create lower case version of the data
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_CONTAINS | DBCOMPAREOPS_CASEINSENSITIVE, g_pCTable, 1, ulColToFind, wColType, SUBOP_CONTAINS_BEGIN));
// But actually use a CASESENSITIVE with NOTBEGINSWITH operator
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_NOTCONTAINS | DBCOMPAREOPS_CASESENSITIVE, 0, NULL, 0,
1, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( m_hr == DB_E_BADCOMPAREOP )
{
// The provider only supported case insensitive compares
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
else if (!CHECK(m_hr, S_OK))
{
odtLog << "Didn't find a match, but should have" << ENDL;
fTestPass = TEST_FAIL;
}
if(!COMPARE(cRowsObtained,1) || !COMPARE(VerifyRowPosition(rghRows[0], 1, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
else
fTestPass = TEST_PASS;
CLEANUP:
if (cRowsObtained>0)
{
m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL);
PROVIDER_FREE(rghRows);
}
ReleaseFindValueAccessor(wColType);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(23)
//*-----------------------------------------------------------------------
// @mfunc NOCONTAINS, insensitive
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_23()
{
return CompareOpTest(g_pCTable, DBCOMPAREOPS_NOTCONTAINS | DBCOMPAREOPS_CASEINSENSITIVE, SUBOP_CONTAINS_BEGIN);
}
// }}
// {{ TCW_VAR_PROTOTYPE(24)
//*-----------------------------------------------------------------------
// @mfunc NOCONTAINS, sensitive negative match
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CaseSensitive_Compares::Variation_24()
{
BOOL fTestPass = TEST_SKIPPED;
DBCOUNTITEM cRowsObtained = 0;
DBORDINAL ulColToFind;
DBTYPE wColType;
HROW * rghRows = NULL;
CCol TempCol;
m_pIRowset->RestartPosition(DB_NULL_HCHAPTER);
if (!GetVariableLengthStrAndUpdatable(&ulColToFind, DBCOMPAREOPS_NOTCONTAINS, FALSE, &wColType))
goto CLEANUP;
g_pCTable->GetColInfo(ulColToFind, TempCol);
if(!ValidateCompareOp(TC_FindCompareOps(TempCol.GetColID()), DBCOMPAREOPS_CONTAINS | DBCOMPAREOPS_CASESENSITIVE))
return TEST_SKIPPED;
//setup
//set up a CONTAINS INSENSITIVE match binding to generate lower case data
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_CONTAINS | DBCOMPAREOPS_CASEINSENSITIVE, g_pCTable, 1, ulColToFind, wColType, SUBOP_CONTAINS_BEGIN));
// Use a CASEINSENSITIVE operator
m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_NOTCONTAINS | DBCOMPAREOPS_CASEINSENSITIVE, 0, NULL, 0,
1, &cRowsObtained, &rghRows);
// Verify HRESULT
if ( m_hr == DB_E_BADCOMPAREOP )
{
// The provider only supported case insensitive compares
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
else if (cRowsObtained != 0 && VerifyRowPosition(rghRows[0], 1, g_pCTable))
{
odtLog << "Found a match on first row, when the match should have failed." << ENDL;
fTestPass = TEST_FAIL;
goto CLEANUP;
}
fTestPass = TEST_PASS;
CLEANUP:
if (cRowsObtained>0)
{
m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL);
PROVIDER_FREE(rghRows);
}
ReleaseFindValueAccessor(wColType);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CaseSensitive_Compares::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Scroll_Fetch_Hold)
//*-----------------------------------------------------------------------
//| Test Case: Scroll_Fetch_Hold - Test with CanScrollBack, CanFetchBack, and CanHoldRows
//| Created: 06/26/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_Fetch_Hold::Init()
{
DBPROPID guidPropertySet[3];
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
TESTC_DRIVER(g_rgDBPrpt[IDX_FetchBackwards].fSupported &&
g_rgDBPrpt[IDX_IRowsetLocate].fSupported &&
g_rgDBPrpt[IDX_CanHoldRows].fSupported);
if(!g_rgDBPrpt[IDX_FetchBackwards].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_CANFETCHBACKWARDS;
if(!g_rgDBPrpt[IDX_CanHoldRows].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_CANHOLDROWS;
if(!g_rgDBPrpt[IDX_IRowsetLocate].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_IRowsetLocate;
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS and DBPROP_CANSCROLLBACKWARDS and DBPROP_CANHOLDROWS
//are requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=2nd row, cRows=-1. Verify S_OK and one row handle
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_Hold::Variation_1()
{
BOOL fTestPass;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
//get the bookmark for the 2th row
if(!GetBookmark(2,&cbBookmark, &pBookmark))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
-1, // # rows to fetch
-1, // Offset
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
PROVIDER_FREE(pBookmark);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=3rd row. cRows=3. Match 3rd row. Do not release. pBookmark=4th row, cRows=2, match 4th. Release 1st 3, ver last 2
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_Hold::Variation_2()
{
BOOL fTestPass = TEST_PASS;
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
HROW *phRows1, *phRows2;
phRows1 = (HROW *) PROVIDER_ALLOC( 3 * sizeof(HROW) );
phRows2 = (HROW *) PROVIDER_ALLOC( 2 * sizeof(HROW) );
//get the bookmark for the 3rd row
if(!GetBookmark(3,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for the 4th row
if(!GetBookmark(4,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
rgpBookmarks[0], // bookmark;
rgcbBookmarks[0], // Length of bookmark
3, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
3, // row to match
S_OK, // HRESULT to verify
3, // How many rows to expect.
FALSE, // flag to Release rows (optional)
DBCOMPAREOPS_EQ, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
phRows1 // optional arg if client wants to control row handle mem
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
rgpBookmarks[1], // bookmark;
rgcbBookmarks[1], // Length of bookmark
2, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
4, // row to match
S_OK, // HRESULT to verify
2, // How many rows to expect.
FALSE, // flag to Release rows (optional)
DBCOMPAREOPS_EQ, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
phRows2 // optional arg if client wants to control row handle mem
);
m_pIRowset->ReleaseRows(3, phRows1, NULL, NULL, NULL);
COMPARE(VerifyRowPosition(phRows2[0], 4, g_pCTable), TRUE);
COMPARE(VerifyRowPosition(phRows2[1], 5, g_pCTable), TRUE);
m_pIRowset->ReleaseRows(2, phRows2, NULL, NULL, NULL);
CLEANUP:
PROVIDER_FREE(phRows1);
PROVIDER_FREE(phRows2);
//free memory pointed by the bookmarks
if(rgpBookmarks[0])
PROVIDER_FREE(rgpBookmarks[0]);
if(rgpBookmarks[1])
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=5th,cRows=-5, match 5th. S_OK,5 hrows. pBookmark=4th,cRows=-5. DB_S_ENDOFROWSET and 4 hrows. Release last 4, check 5
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_Hold::Variation_3()
{
BOOL fTestPass = TEST_PASS;
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
HROW *phRows1, *phRows2;
phRows1 = (HROW *) PROVIDER_ALLOC( 5 * sizeof(HROW) );
phRows2 = (HROW *) PROVIDER_ALLOC( 4 * sizeof(HROW) );
//get the bookmark for the 5th row
if(!GetBookmark(5,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for the 4th row
if(!GetBookmark(4,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
rgpBookmarks[0], // bookmark;
rgcbBookmarks[0], // Length of bookmark
-5, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
5, // row to match
S_OK, // HRESULT to verify
5, // How many rows to expect.
FALSE, // flag to Release rows (optional)
DBCOMPAREOPS_EQ, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
phRows1 // optional arg if client wants to control row handle mem
);
if ( fTestPass == TEST_FAIL ) goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
rgpBookmarks[1], // bookmark;
rgcbBookmarks[1], // Length of bookmark
-5, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
4, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
4, // How many rows to expect.
FALSE, // flag to Release rows (optional)
DBCOMPAREOPS_EQ, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
phRows2 // optional arg if client wants to control row handle mem
);
m_pIRowset->ReleaseRows(4, phRows2, NULL, NULL, NULL);
VerifyRowPosition(phRows1[0], 5, g_pCTable);
VerifyRowPosition(phRows1[1], 4, g_pCTable);
VerifyRowPosition(phRows1[1], 3, g_pCTable);
VerifyRowPosition(phRows1[1], 2, g_pCTable);
VerifyRowPosition(phRows1[1], 1, g_pCTable);
m_pIRowset->ReleaseRows(5, phRows1, NULL, NULL, NULL);
CLEANUP:
PROVIDER_FREE(phRows1);
PROVIDER_FREE(phRows2);
//free memory pointed by the bookmarks
if(rgpBookmarks[0])
PROVIDER_FREE(rgpBookmarks[0]);
if(rgpBookmarks[1])
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_Fetch_Hold::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Dynamic)
//*-----------------------------------------------------------------------
//| Test Case: Dynamic - Test with OTHERINSERT and OTHERUPDATE properties
//| Created: 06/27/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Dynamic::Init()
{
DBPROPID guidPropertySet[6];
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
if ( !AlteringRowsIsOK() )
return FALSE;
TESTC_DRIVER(g_rgDBPrpt[IDX_FetchBackwards].fSupported &&
g_rgDBPrpt[IDX_ScrollBackwards].fSupported &&
g_rgDBPrpt[IDX_CanHoldRows].fSupported);
if(!g_rgDBPrpt[IDX_FetchBackwards].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_CANFETCHBACKWARDS;
if(!g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_CANSCROLLBACKWARDS;
if(!g_rgDBPrpt[IDX_CanHoldRows].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_CANHOLDROWS;
if(!g_rgDBPrpt[IDX_OtherInsert].fDefault)
guidPropertySet[cPrptSet++]=DBPROP_OTHERINSERT;
if(!g_rgDBPrpt[IDX_IRowsetChange].fDefault)
{
guidPropertySet[cPrptSet++]=DBPROP_IRowsetChange;
guidPropertySet[cPrptSet++]=DBPROP_UPDATABILITY;
}
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS and DBPROP_CANSCROLLBACKWARDS and DBPROP_CANHOLDROWS and DBPROP_OTHERINSERT
//are requested
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,guidPropertySet))
return TEST_SKIPPED;
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Insert a new row at end. pBookmark=NULL,cRows=1. Match new row. Verify S_OK and one row handle
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Dynamic::Variation_1()
{
BOOL fTestPass;
// Insert a new row.
if (FAILED(g_pCTable->Insert()))
return TEST_FAIL;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast+1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Insert a new row at the end. pBookmark=DBBMK_LAST,cRows=1. DBCOMPAREOPS_IGNORE. Verify S_OK and new row matched.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Dynamic::Variation_2()
{
BOOL fTestPass;
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
// Insert a new row.
if (FAILED(g_pCTable->Insert()))
return TEST_FAIL;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast+1, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Dynamic::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(MaxRows)
//*-----------------------------------------------------------------------
//| Test Case: MaxRows - Test MaxRows property
//| Created: 06/27/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxRows::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
// TO DO: Add your own code here
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Set MAXROWS=3. pBookmark=2nd row. cRows=4. Match 3rd row. DB_S_ENDOFROWSET and 3 hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int MaxRows::Variation_1()
{
// TO DO: Add your own code here
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Set MAXROWS=2. pBookmark=3rd row,cRows=3. Match 3rd row. DB_S_ROWLIMITEXECEEDED and 2 hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int MaxRows::Variation_2()
{
// TO DO: Add your own code here
return TEST_PASS;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxRows::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(EmptyRowset)
//*-----------------------------------------------------------------------
//| Test Case: EmptyRowset - EmptyRowset
//| Created: 06/27/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL EmptyRowset::Init()
{
DBPROPID guidPropertySet[2];
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
if (!g_pEmptyTable)
return TEST_SKIPPED;
if(!TCIRowsetFind::Init())
return FALSE;
TESTC_DRIVER(g_rgDBPrpt[IDX_FetchBackwards].fSupported &&
g_rgDBPrpt[IDX_ScrollBackwards].fSupported );
if(!g_rgDBPrpt[IDX_FetchBackwards].fDefault)
{
guidPropertySet[cPrptSet]=DBPROP_CANFETCHBACKWARDS;
cPrptSet++;
}
if(!g_rgDBPrpt[IDX_ScrollBackwards].fDefault)
{
guidPropertySet[cPrptSet]=DBPROP_CANSCROLLBACKWARDS;
cPrptSet++;
}
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS and DBPROP_CANSCROLLBACKWARDS are requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pEmptyTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=0. DBCOMPAREOPS_IGNORE. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int EmptyRowset::Variation_1()
{
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
return CallFindNextRows( g_pEmptyTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
0, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0, // How many rows to expect.
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=1. DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int EmptyRowset::Variation_2()
{
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
return CallFindNextRows( g_pEmptyTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0, // How many rows to expect.
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=-1. DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int EmptyRowset::Variation_3()
{
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
return CallFindNextRows( g_pEmptyTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0, // How many rows to expect.
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL,cRows=0,fSkip=TRUE. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int EmptyRowset::Variation_4()
{
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
return CallFindNextRows( g_pEmptyTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
0, // # rows to fetch
TRUE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0, // How many rows to expect.
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=DBBMK_FIRST,cRows=1. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int EmptyRowset::Variation_5()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
return CallFindNextRows( g_pEmptyTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0, // How many rows to expect.
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=DBBMK_FIRST, cRows=0, DBCOMPAREOPS_IGNORE. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int EmptyRowset::Variation_6()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
// FindNextRows with cRows=0 and pBookmark=non null value is a no-op
// This conforms with IRowsetLocate's behavior with cRows=0.
return CallFindNextRows( g_pEmptyTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
0, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
S_OK, // HRESULT to verify
0, // How many rows to expect.
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=DBBMK_LAST,cRows=1. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int EmptyRowset::Variation_7()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
return CallFindNextRows( g_pEmptyTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0, // How many rows to expect.
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=DBBMK_FIRST,cRows=-1. Verify DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int EmptyRowset::Variation_8()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
//restart the cursor position
if(!CHECK(RestartRowPosition(),S_OK))
return TEST_FAIL;
return CallFindNextRows( g_pEmptyTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
-1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0, // How many rows to expect.
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL EmptyRowset::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(NULL_Collation)
//*-----------------------------------------------------------------------
//| Test Case: NULL_Collation - Test Null collatioans
//| Created: 07/07/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL NULL_Collation::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
if ( g_lNullCollation & DBPROPVAL_NC_END )
{
odtLog<<"NULLs are sorted at the end, regardless of the sort order.\n";
}
else if ( g_lNullCollation & DBPROPVAL_NC_HIGH )
{
odtLog<<"NULLs are sorted at the end\n";
}
else if ( g_lNullCollation & DBPROPVAL_NC_LOW )
{
odtLog<<"NULLs are sorted at the low end\n";
}
else if ( g_lNullCollation & DBPROPVAL_NC_START )
{
odtLog<<"NULLs are sorted at the start of the list, regardless of the sort order\n";
}
else
{
odtLog<<"No Null Collation reported!\n";
}
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc NE operator with NULL status
//
// @rdesc TEST_PASS or TEST_FAIL
//
int NULL_Collation::Variation_1()
{
BOOL fTestPass = TEST_FAIL;
DBORDINAL ulColIndex = 0;
DBCOUNTITEM cRowsObtained = 0;
HROW hrowNULL = DB_NULL_HROW;
HROW * phrowNULL = &hrowNULL;
HROW hrowNOTNULL = DB_NULL_HROW;
HROW * phrowNOTNULL = &hrowNOTNULL;
CCol TempCol;
CTable * pTable = NULL;
IRowsetIdentity * pIRowsetIden = NULL;
DBPROPID rgPropId[3] = {DBPROP_CANSCROLLBACKWARDS, DBPROP_CANHOLDROWS, DBPROP_IRowsetIdentity};
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(rgPropId), rgPropId));
TESTC(VerifyInterface(m_pIRowset, IID_IRowsetIdentity, ROWSET_INTERFACE,
(IUnknown **)&pIRowsetIden));
for (ulColIndex=1; ulColIndex <= g_pCTable->CountColumnsOnTable(); ulColIndex++)
{
TESTC(SUCCEEDED(m_pIRowset->RestartPosition(NULL)));
g_pCTable->GetColInfo(ulColIndex, TempCol);
if(!CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 0, ulColIndex,
TempCol.GetProviderType(), SUBOP_ALWAYS_NULL))
continue;
TEST2C_(m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_EQ, 0, NULL, 0,
1, &cRowsObtained, &phrowNULL), S_OK, DB_S_ENDOFROWSET);
ReleaseFindValueAccessor(TempCol.GetProviderType());
if(m_hr == S_OK)
{
// Found a null.
// The next fetch position is after the current cursor position.
// Call FindNextRows with an lOffset of -1 to start finding from
// the row just matched.
//
// This time use a NE operator and a bound value not matching any existing
// value in the column.
// Per spec, using the NE operator never matches a NULL value
// i.e. Finding a value NE to 1 is equivalent to value != 1 and value is not NULL.
TESTC(cRowsObtained == 1);
TESTC(phrowNULL[0] != DB_NULL_HROW);
TESTC(CreateFindValueAccessor(DBCOMPAREOPS_NE, g_pCTable, 0, ulColIndex,
TempCol.GetProviderType(), SUBOP_EMPTY));
TEST2C_(m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_NE, 0, NULL, -1,
1, &cRowsObtained, &phrowNOTNULL), S_OK, DB_S_ENDOFROWSET);
// If end of rowset, that's fine otherwise check that the null value was not matched
if(m_hr == S_OK)
{
TESTC(cRowsObtained == 1);
TESTC(phrowNOTNULL[0] != DB_NULL_HROW);
HRESULT hr = pIRowsetIden->IsSameRow(phrowNULL[0], phrowNOTNULL[0]);
if (hr != S_FALSE)
{
odtLog << L"Failed in column " << ulColIndex << " of type " << TempCol.GetProviderType() << L"\n";
}
CHECK(hr, S_FALSE);
TESTC_(m_pIRowset->ReleaseRows(1, phrowNOTNULL, NULL, NULL, NULL), S_OK);
}
ReleaseFindValueAccessor(TempCol.GetProviderType());
TESTC_(m_pIRowset->ReleaseRows(1, phrowNULL, NULL, NULL, NULL), S_OK);
}
}
fTestPass = TEST_PASS;
CLEANUP:
ReleaseFindValueAccessor(TempCol.GetProviderType());
SAFE_RELEASE(pIRowsetIden);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL NULL_Collation::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Prop_FINDCOMPAREOPS)
//*-----------------------------------------------------------------------
//| Test Case: Prop_FINDCOMPAREOPS - Check DBPROP_FINDCOMAPREOPS
//| Created: 08/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Prop_FINDCOMPAREOPS::Init()
{
DBPROPID guidPropertySet;
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
cPrptSet,&guidPropertySet));
CLEANUP:
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Check CO_EQUALITY and CO_STRING
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Prop_FINDCOMPAREOPS::Variation_1()
{
DWORD FindOps = 0;
CCol TempCol;
DBORDINAL ulColNum = g_pCTable->CountColumnsOnTable();
DBID *pColDBID = NULL;
for ( ULONG ulColIndex = 1; ulColIndex <= ulColNum; ulColIndex++ )
{
g_pCTable->GetColInfo(ulColIndex, TempCol);
pColDBID = TempCol.GetColID();
FindOps = TC_FindCompareOps( pColDBID );
if ( pColDBID->eKind == DBKIND_NAME )
odtLog << L" Column" << pColDBID->uName.pwszName << L": \n";
// DBPROPVAL_CO_EQUALITY and DBPROPVAL_CO_STRING are required for IRowsetFind
if ( FindOps & DBPROPVAL_CO_EQUALITY )
odtLog << L"\t" << L"Supports DBPROPVAL_CO_EQUALITY\n";
if ( FindOps & DBPROPVAL_CO_STRING )
odtLog << L"\t" << L"Supports DBPROPVAL_CO_STRING\n";
if ( FindOps & DBPROPVAL_CO_CASESENSITIVE )
odtLog << L"\t" << L"Supports DBPROPVAL_CO_CASESENSITIVE\n";
if ( FindOps & DBPROPVAL_CO_CASEINSENSITIVE )
odtLog << L"\t" << L"Supports DBPROPVAL_CO_CASEINSENSITIVE\n";
if ( FindOps & DBPROPVAL_CO_BEGINSWITH )
odtLog << L"\t" << L"Supports DBPROPVAL_CO_BEGINSWITH\n";
if ( FindOps & DBPROPVAL_CO_CONTAINS )
odtLog << L"\t" << L"Supports DBPROPVAL_CO_CONTAINS\n";
}
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Check Case Sensitivity
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Prop_FINDCOMPAREOPS::Variation_2()
{
return TEST_SKIPPED;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Prop_FINDCOMPAREOPS::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(QueryInt)
//*-----------------------------------------------------------------------
//| Test Case: QueryInt - test queryinterfaces
//| Created: 08/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL QueryInt::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
// TO DO: Add your own code here
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc IRowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int QueryInt::Variation_1()
{
BOOL fTestPass = FALSE;
IRowset * pIRowset = NULL;
DBCOUNTITEM cRowsObtained = 0;
HROW hrow[1] = { DB_NULL_HROW };
HROW * phrow = hrow;
if(!TCIRowsetFind::Init())
return FALSE;
//create a rowset and an accessor.
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0, NULL));
TESTC(DefaultObjectTesting(m_pIRowsetFind, ROWSET_INTERFACE));
TESTC(VerifyInterface(m_pIRowsetFind, IID_IRowset, ROWSET_INTERFACE, (IUnknown **)&pIRowset));
TESTC_(pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK);
TESTC(cRowsObtained == 1);
//call VerifyRowPosition
TESTC(VerifyRowPosition(phrow[0],1,g_pCTable));
TESTC_(pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL),S_OK);
fTestPass = TRUE;
CLEANUP:
SAFE_RELEASE(pIRowset);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc IAccessor
//
// @rdesc TEST_PASS or TEST_FAIL
//
int QueryInt::Variation_2()
{
HRESULT hr;
BOOL fTestPass = TRUE;
IRowsetFind * pIRowsetFind = NULL;
IRowset * pIRowset = NULL;
DBCOUNTITEM cRowsObtained;
HROW hrow[1] = { DB_NULL_HROW };
HROW * phrow = hrow;
if( !SetRowsetProperties(NULL, 0) )
goto CLEANUP;
hr = CreateRowsetObject(USE_OPENROWSET, IID_IRowsetFind, EXECUTE_IFNOERROR);
if( hr==DB_S_ERRORSOCCURRED || hr==DB_E_ERRORSOCCURRED )
goto CLEANUP;
TESTC_(hr,S_OK);
TESTC(DefaultObjectTesting(m_pIAccessor, ROWSET_INTERFACE));
//queryinterface for IRowsetFind
TESTC(VerifyInterface(m_pIAccessor, IID_IRowsetFind, ROWSET_INTERFACE, (IUnknown **)&pIRowsetFind));
//queryinterface for IRowset. IRowsetFind implies IRowset
TESTC(VerifyInterface(pIRowsetFind, IID_IRowset, ROWSET_INTERFACE, (IUnknown **)&pIRowset));
//create an accessor on the rowset
TESTC_(GetAccessorAndBindings(pIRowset,DBACCESSOR_ROWDATA,&m_hAccessor,
&m_rgBinding,&m_cBinding,&m_cRowSize,DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,ALL_COLS_BOUND,FORWARD,
NO_COLS_BY_REF,NULL,NULL,NULL,DBTYPE_EMPTY,0,NULL,NULL,
NO_COLS_OWNED_BY_PROV,DBPARAMIO_NOTPARAM,TRUE),S_OK);
//allocate memory for the row
m_pData = PROVIDER_ALLOC(m_cRowSize);
TESTC(m_pData != NULL);
TESTC_(pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK);
TESTC(cRowsObtained == 1);
//call VerifyRowPosition
TESTC(VerifyRowPosition(phrow[0],1,g_pCTable));
TESTC_(pIRowset->ReleaseRows(cRowsObtained, phrow, NULL, NULL, NULL), S_OK);
fTestPass = TRUE;
CLEANUP:
//free the consumer buffer
PROVIDER_FREE(m_pData);
PROVIDER_FREE(m_rgBinding);
PROVIDER_FREE(m_rgTableColOrds);
//free accessor handle
if(m_hAccessor)
{
if(!CHECK(m_pIAccessor->ReleaseAccessor(m_hAccessor,NULL), S_OK))
fTestPass=FALSE;
m_hAccessor=NULL;
}
SAFE_RELEASE(m_pIAccessor);
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pIRowsetFind);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//--------------------------------------------------------------------
// @mfunc Use ICmdText
//
// @rdesc TEST_PASS or TEST_FAIL
//
int QueryInt::Variation_3()
{
ICommandText* pICmdText = NULL;
IRowsetFind* pIRowsetFind = NULL;
WCHAR* pwszCmd = NULL;
if (g_pIDBCreateCommand == NULL)
return TEST_SKIPPED;
TESTC_(m_hr = g_pIDBCreateCommand->CreateCommand(NULL, IID_ICommandText, (IUnknown **)&pICmdText), S_OK);
// Get a supported command text
TESTC_(m_hr = g_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL, NULL, &pwszCmd, NULL, NULL), S_OK);
TESTC_(m_hr = pICmdText->SetCommandText(DBGUID_DEFAULT, pwszCmd), S_OK);
// Execute command
TESTC_(m_hr = pICmdText->Execute(NULL, IID_IRowsetFind, NULL, NULL, (IUnknown**) &pIRowsetFind), S_OK);
CLEANUP:
SAFE_FREE(pwszCmd);
SAFE_RELEASE(pICmdText);
SAFE_RELEASE(pIRowsetFind);
return TEST_PASS;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL QueryInt::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(TCCompareOps_Ignore)
//*-----------------------------------------------------------------------
//| Test Case: TCCompareOps_Ignore - Test specific IGNORE cases
//| Created: 10/02/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCCompareOps_Ignore::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
// TO DO: Add your own code here
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc IGNORE w/pBookmark=NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCCompareOps_Ignore::Variation_1()
{
BOOL fTestPass;
HROW * phrow = NULL;
DBCOUNTITEM cRowsObtained;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0,NULL))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
HRESULT hrExpected2 = S_OK;
int nRowPos = 8;
// match 3rd row and fetch 2 rows
// new fetch position should be after 4th
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
NULL, // Bookmark to fetch from, if any
0, // Length of bookmark
2, // maps to cRows
2, // maps to Offset
g_ulColNum, // Column to match
3, // Is there a row where the find should happen? 0 - no match
S_OK, // Expected HRESULT
2, // Expected count of rows
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
NULL, // Use client or provider memory, default=provider
TRUE, // verify rows by comparing data ?
FALSE, // Use ISeqStream ?
hrExpected2 // Second expected HRESULT for the FindNextRow step
);
// match 7th row, fetch position should advance 2 rows and be after 7th
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
NULL, // Bookmark to fetch from, if any
0, // Length of bookmark
0, // maps to cRows
2, // maps to Offset
g_ulColNum, // Column to match
7, // Is there a row where the find should happen? 0 - no match
S_OK, // Expected HRESULT
0, // Expected count of rows
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisons are rich enough to deserve a mulitple comparision operations
);
// cursor should be after 7th row.
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!COMPARE(cRowsObtained, 1))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phrow[0], nRowPos, g_pCTable), TRUE))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phrow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc IGNORE w/ pBookmark = STD_BOOKMARK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCCompareOps_Ignore::Variation_2()
{
BOOL fTestPass = TEST_SKIPPED;
DBPROPID guidProperty[1];
HROW * phrow = NULL;
DBCOUNTITEM cRowsObtained;
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE * pBookmark=(BYTE *)&DBBookmark;
TESTC_DRIVER(g_rgDBPrpt[IDX_IRowsetLocate].fSupported);
guidProperty[0] = DBPROP_IRowsetLocate;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
1,guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
HRESULT hrExpected2 = S_OK;
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
pBookmark, // Bookmark to fetch from, if any
1, // Length of bookmark
1, // maps to cRows
0, // maps to Offset
g_ulColNum, // Column to match
g_lRowLast, // Is there a row where the find should happen? 0 - no match
hrExpected2, // Expected HRESULT
1, // Expected count of rows
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
// make bookmark point to DBBMK_FIRST
DBBookmark=DBBMK_FIRST;
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
pBookmark, // Bookmark to fetch from, if any
1, // Length of bookmark
1, // maps to cRows
0, // maps to Offset
g_ulColNum, // Column to match
1, // Is there a row where the find should happen? 0 - no match
S_OK, // Expected HRESULT
1, // Expected count of rows
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
// cursor should be at start of rowset.
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!COMPARE(cRowsObtained, 1))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phrow[0], 1, g_pCTable), TRUE))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phrow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc IGNORE w/real bookmark
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCCompareOps_Ignore::Variation_3()
{
BOOL fTestPass = TEST_SKIPPED;
DBPROPID guidProperty[1];
HROW * phrow = NULL;
DBCOUNTITEM cRowsObtained;
ULONG_PTR cbBookmark;
BYTE * pBookmark=NULL;
TESTC_DRIVER(g_rgDBPrpt[IDX_IRowsetLocate].fSupported);
guidProperty[0] = DBPROP_IRowsetLocate;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
1,guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
//get the bookmark for the 2th row
if(!GetBookmark(2,&cbBookmark, &pBookmark))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
HRESULT hrExpected2 = S_OK;
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
pBookmark, // Bookmark to fetch from, if any
cbBookmark, // Length of bookmark
2, // maps to cRows
2, // maps to Offset
g_ulColNum, // Column to match
4, // Is there a row where the find should happen? 0 - no match
S_OK, // Expected HRESULT
2, // Expected count of rows
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
NULL, // Use client or provider memory, default=provider
TRUE, // verify rows by comparing data ?
FALSE, // Use ISeqStream ?
hrExpected2 // Second expected HRESULT for the FindNextRow step
);
HRESULT hrExpected1 = DB_S_ENDOFROWSET;
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
pBookmark, // Bookmark to fetch from, if any
cbBookmark, // Length of bookmark
1, // maps to cRows
g_lRowLast-1, // maps to Offset
g_ulColNum, // Column to match
g_lRowLast, // Is there a row where the find should happen? 0 - no match
hrExpected1, // Expected HRESULT
0, // Expected count of rows
TRUE, // flag to Release rows (optional)
DBCOMPAREOPS_IGNORE, // Any particular preference for comparing? (optional)
SUBOP_EMPTY // Some comparisions are rich enough to deserve a mulitple comparision operations
);
// cursor should be at start of rowset.
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, (HROW **)&phrow ), S_OK) )
goto CLEANUP;
if (!COMPARE(cRowsObtained, 1))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phrow[0], 1, g_pCTable), TRUE))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(pBookmark);
PROVIDER_FREE(phrow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCCompareOps_Ignore::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(AccessorTests)
//*-----------------------------------------------------------------------
//| Test Case: AccessorTests - Test various accessor variations
//| Created: 02/01/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL AccessorTests::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
// TO DO: Add your own code here
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc obValue = 0, bind VALUE only
//
// @rdesc TEST_PASS or TEST_FAIL
//
int AccessorTests::Variation_1()
{
BOOL fTestPass = TEST_SKIPPED;
DBPROPID guidProperty[1];
HROW * phrow = NULL;
DBCOUNTITEM cRowsObtained;
DBORDINAL ulColToFind;
HRESULT hr;
void *pMakeData = NULL;
CCol TempCol;
DBTYPE wColType;
WCHAR wszData[2000];
TESTC_DRIVER(g_rgDBPrpt[IDX_IRowsetLocate].fSupported);
guidProperty[0] = DBPROP_IRowsetLocate;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
1,guidProperty,DBACCESSOR_ROWDATA, DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,
ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, NULL, EXECUTE_IFNOERROR, DBTYPE_EMPTY,
TRUE))
goto CLEANUP;
if (!GetVariableLengthStrAndUpdatable(&ulColToFind, DBCOMPAREOPS_EQ))
goto CLEANUP;
fTestPass = TEST_FAIL;
if ( FAILED(m_pTable->GetColInfo(ulColToFind, TempCol)) )
goto CLEANUP;
wColType = TempCol.GetProviderType();
if (wColType==DBTYPE_VARIANT)
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
if (!SUCCEEDED(hr = m_pTable->MakeData( wszData,
1,
ulColToFind,
PRIMARY,
wColType)) )
goto CLEANUP;
if ( hr == S_FALSE )
{
fTestPass = TEST_SKIPPED;
goto CLEANUP; // can't deal with nulls in this variation
}
TESTC(fTestPass=CreateFindValueAccessor(DBCOMPAREOPS_EQ, g_pCTable, 1, ulColToFind, wColType, SUBOP_EMPTY, FALSE, NULL, DBPART_VALUE));
fTestPass = TEST_FAIL;
if ( FAILED( m_hr = m_pIRowsetFind->FindNextRow(DB_NULL_HCHAPTER, m_hRowsetFindAccessor, m_pFindValue,
DBCOMPAREOPS_EQ, 0, NULL, 0,
1, &cRowsObtained, &phrow)) )
goto CLEANUP;
//Verify RowsObtained
if (!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//verify phRow is not NULL
TESTC(phrow!=NULL);
if (!COMPARE(VerifyRowPosition(phrow[0], 1, g_pCTable), TRUE))
goto CLEANUP;
fTestPass = TEST_PASS;
CLEANUP:
//PROVIDER_FREE(pMakeData);
//release the row handle
if(phrow && cRowsObtained>0)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,phrow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(phrow);
}
ReleaseFindValueAccessor(wColType);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL AccessorTests::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(BindingType)
//*-----------------------------------------------------------------------
//| Test Case: BindingType - Test interesting Find coercions
//| Created: 02/03/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL BindingType::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
// TO DO: Add your own code here
CoCreateInstance(CLSID_OLEDB_CONVERSIONLIBRARY,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDataConvert,
(void **)&g_pIDataConvert);
if(!SetDCLibraryVersion((IUnknown *)g_pIDataConvert, g_ulDCVer))
{
odtLog << L"Unable to set Data Conversion Library's behavior version!" << ENDL;
odtLog << L"Need to upgrade to latest MSDADC.DLL." << ENDL;
return TEST_FAIL;
}
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Normal BSTR
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BindingType::Variation_1()
{
return BindingTypeTest(g_pCTable, DBTYPE_BSTR);
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc WSTR
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BindingType::Variation_2()
{
return BindingTypeTest(g_pCTable, DBTYPE_WSTR);
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc STR
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BindingType::Variation_3()
{
return BindingTypeTest(g_pCTable, DBTYPE_STR);
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc VARIANT
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BindingType::Variation_4()
{
return BindingTypeTest(g_pCTable, DBTYPE_VARIANT);
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc WSTR | BYREF
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BindingType::Variation_5()
{
return BindingTypeTest(g_pCTable, DBTYPE_WSTR | DBTYPE_BYREF);
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc STR | BYREF
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BindingType::Variation_6()
{
return BindingTypeTest(g_pCTable, DBTYPE_STR | DBTYPE_BYREF);
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc BSTR | BYREF
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BindingType::Variation_7()
{
return BindingTypeTest(g_pCTable, DBTYPE_BSTR | DBTYPE_BYREF);
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc VARIANT BYREF
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BindingType::Variation_8()
{
return BindingTypeTest(g_pCTable, DBTYPE_VARIANT | DBTYPE_BYREF);
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL BindingType::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Deleted_Rows)
//*-----------------------------------------------------------------------
//| Test Case: Deleted_Rows - Test with deleted rows
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Deleted_Rows::Init()
{
BOOL fTestPass = FALSE;
if(!TCIRowsetFind::Init())
return FALSE;
//make sure IID_IRowsetDelete is supported
TESTC_DRIVER(g_rgDBPrpt[IDX_IRowsetChange].fSupported);
//make sure IID_IRowsetLocate is supported
TESTC_DRIVER(g_rgDBPrpt[IDX_IRowsetLocate].fSupported);
if ( AlteringRowsIsOK() )
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc *pBookMark=last row. Delete last row. Expect DB_E_BADBOOKMARK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Deleted_Rows::Variation_1()
{
BOOL fTestPass = TEST_FAIL;
DBPROPID guidProperty[3];
BYTE * pBookmark = NULL;
ULONG_PTR cbBookmark;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_UPDATABILITY;
//open rowset, and accessor (bind LONG cols)
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty,DBACCESSOR_ROWDATA, DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,
ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, NULL, EXECUTE_IFNOERROR, DBTYPE_EMPTY,
TRUE))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (GetProp(DBPROP_BOOKMARKSKIPPED))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
//get the bookmark for the last row
if(!GetBookmark(g_lRowLast, &cbBookmark, &pBookmark))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, g_lRowLast), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_E_BADBOOKMARK, // HRESULT to verify
0 // How many rows to expect.
);
PopulateTable();
CLEANUP:
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc *pBookMark = 2, cRows=1. Delete 4th row. Match on what was in 4th row. DB_S_ENDOFROWSET and 0 row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Deleted_Rows::Variation_2()
{
int fTestPass=TEST_FAIL;
DBPROPID guidProperty[3];
BYTE * pBookmark = NULL;
ULONG_PTR cbBookmark;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_UPDATABILITY;
//open rowset, and accessor. (bind long cols)
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty,DBACCESSOR_ROWDATA, DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,
ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, NULL, EXECUTE_IFNOERROR, DBTYPE_EMPTY,
TRUE))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (GetProp(DBPROP_REMOVEDELETED))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
//get the bookmark
if(!GetBookmark(2, &cbBookmark, &pBookmark))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, 4), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
4, // row to match
DB_S_ENDOFROWSET,// HRESULT to verify
0 // How many rows to expect.
);
PopulateTable();
CLEANUP:
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc *pBookMark=4, cRows=-1. Delete 1st row. Match on what was in 1st row. DB_S_ENDOFROWSET and 0 row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Deleted_Rows::Variation_3()
{
int fTestPass=TEST_FAIL;
DBPROPID guidProperty[4];
BYTE * pBookmark = NULL;
ULONG_PTR cbBookmark;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_UPDATABILITY;
guidProperty[3]=DBPROP_CANFETCHBACKWARDS;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty,DBACCESSOR_ROWDATA, DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,
ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, NULL, EXECUTE_IFNOERROR, DBTYPE_EMPTY,
TRUE))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (GetProp(DBPROP_REMOVEDELETED))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
//get the bookmark
if(!GetBookmark(4, &cbBookmark, &pBookmark))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, 1), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
-1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
PopulateTable();
CLEANUP:
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc pBookMark=NULL, cRows=1. Match 3rd row. Delete third row. pBookmark=NULL, cRows=1, fSkip=0. Match 4th. S_OK, 1 hrow
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Deleted_Rows::Variation_4()
{
BOOL fTestPass;
DBPROPID guidProperty[3];
HROW * phRows1 = NULL;
IRowsetChange * pIRowsetChange=NULL;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
phRows1 = (HROW *) PROVIDER_ALLOC(sizeof(HROW));
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
NULL, // Bookmark to fetch from, if any
0, // Length of bookmark
1, // maps to cRows
0, // maps to Offset
g_ulColNum, // Column to match
3, // Is there a row where the find should happen? 0 - no match
S_OK, // Expected HRESULT
1, // Expected count of rows
FALSE, // flag to Release rows (optional)
DBCOMPAREOPS_EQ, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
phRows1 // optional arg if client wants to control row handle mem
);
if (!fTestPass) goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phRows1[0], 3, g_pCTable), TRUE))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!CHECK(m_pIRowsetFind->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange),S_OK))
goto CLEANUP;
//delete the row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,phRows1,NULL),S_OK))
goto CLEANUP;
if (m_cRowsFound > 0 && phRows1)
{
m_pIRowset->ReleaseRows(m_cRowsFound, phRows1, NULL, NULL, NULL);
if (phRows1 != NULL)
PROVIDER_FREE(phRows1);
}
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
4, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
CLEANUP:
PROVIDER_FREE(phRows1);
SAFE_RELEASE(pIRowsetChange);
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows=-1, match 3rd row. Delete 3rd. Match 2nd. S_OK, 1 hrow
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Deleted_Rows::Variation_5()
{
BOOL fTestPass;
DBPROPID guidProperty[4];
HROW * phRows1 = NULL;
IRowsetChange * pIRowsetChange=NULL;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_CANFETCHBACKWARDS;
guidProperty[3]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
phRows1 = (HROW *) PROVIDER_ALLOC(sizeof(HROW));
fTestPass = CallFindNextRows(
g_pCTable, // Table to find from
NULL, // Bookmark to fetch from, if any
0, // Length of bookmark
-1, // maps to cRows
0, // maps to Offset
g_ulColNum, // Column to match
3, // Is there a row where the find should happen? 0 - no match
S_OK, // Expected HRESULT
1, // Expected count of rows
FALSE, // flag to Release rows (optional)
DBCOMPAREOPS_EQ, // Any particular preference for comparing? (optional)
SUBOP_EMPTY, // Some comparisions are rich enough to deserve a mulitple comparision operations
phRows1 // optional arg if client wants to control row handle mem
);
if (!fTestPass) goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phRows1[0], 3, g_pCTable), TRUE))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!CHECK(m_pIRowsetFind->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange),S_OK))
goto CLEANUP;
//delete the row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,phRows1,NULL),S_OK))
goto CLEANUP;
if (m_cRowsFound > 0 && phRows1)
{
m_pIRowset->ReleaseRows(m_cRowsFound, phRows1, NULL, NULL, NULL);
if (phRows1 != NULL)
PROVIDER_FREE(phRows1);
}
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
0, // offset
g_ulColNum, // Which column to match
2, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
PopulateTable();
CLEANUP:
PROVIDER_FREE(phRows1);
SAFE_RELEASE(pIRowsetChange);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Delete RowLast-1 row. pBookmark=RowLast-2 row,cRows=3. Match RowLast-2 row.
// Verify S_OK, 3 hrows and DB_E_DELETEDROW when accessing deleted one
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Deleted_Rows::Variation_6()
{
BOOL fTestPass = TEST_FAIL;
DBPROPID guidProperty[4];
BYTE * pBookmark = NULL;
ULONG_PTR cbBookmark;
HROW * phRows = NULL;
phRows = (HROW *) PROVIDER_ALLOC(3 * sizeof(HROW));
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[3]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
//get the bookmark
if(!GetBookmark(g_lRowLast-2, &cbBookmark, &pBookmark))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
if (GetProp(DBPROP_REMOVEDELETED))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, g_lRowLast-1), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
3, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast-2, // row to match
S_OK, // HRESULT to verify
3, // How many rows to expect.
FALSE, // Don't release rows
DBCOMPAREOPS_EQ,
SUBOP_EMPTY,
phRows,
FALSE // Don't check row position
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phRows[0], g_lRowLast-2, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
if (!COMPARE(VerifyRowPosition(phRows[2], g_lRowLast, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
if(!CHECK(m_pIRowset->GetData(phRows[1], m_hAccessor, m_pData), DB_E_DELETEDROW))
fTestPass = TEST_FAIL;
CLEANUP:
PROVIDER_FREE(phRows);
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Delete last row. pBookmark=DBBMK_LAST, cRows=1. Verify DB_E_BADBOOKMARK, 0 rows returned
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Deleted_Rows::Variation_7()
{
BOOL fTestPass = TEST_FAIL;
DBPROPID guidProperty[4];
DBBOOKMARK dbBookMark = DBBMK_LAST;
BYTE *pBookmark = (BYTE *)&dbBookMark;
HROW *phRows = NULL;
phRows = (HROW *) PROVIDER_ALLOC(sizeof(HROW));
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[3]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (GetProp(DBPROP_REMOVEDELETED))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, g_lRowLast), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
GetProp(DBPROP_BOOKMARKSKIPPED)? S_OK : DB_E_BADBOOKMARK, // HRESULT to verify
GetProp(DBPROP_BOOKMARKSKIPPED)? 1 : 0, // How many rows to expect.
FALSE, // Don't release rows
DBCOMPAREOPS_EQ,
SUBOP_EMPTY,
phRows,
FALSE // Don't check row position
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phRows);
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Deleted_Rows::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(RemoveDeleted)
//*-----------------------------------------------------------------------
//| Test Case: RemoveDeleted - Test in context of RemoveDeleted
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted::Init()
{
BOOL fTestPass = TEST_SKIPPED;
if(!TCIRowsetFind::Init())
return FALSE;
//make sure IID_IRowsetDelete is supported
TESTC_DRIVER(g_rgDBPrpt[IDX_IRowsetChange].fSupported);
//make sure IID_IRowsetLocate is supported
TESTC_DRIVER(g_rgDBPrpt[IDX_IRowsetLocate].fSupported);
//make sure ScrollBackwards property is supported
TESTC_DRIVER(g_rgDBPrpt[IDX_ScrollBackwards].fSupported);
//make sure IID_IRemoveDeleted is supported
TESTC_DRIVER(g_rgDBPrpt[IDX_RemoveDeleted].fSupported);
if ( AlteringRowsIsOK() )
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Delete a row. pBookmark=deleted row. Verify DB_E_BADBOOKMARK.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_1()
{
int fTestPass = TEST_FAIL;;
DBPROPID guidProperty[5];
BYTE * pBookmark = NULL;
ULONG_PTR cbBookmark;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_REMOVEDELETED;
guidProperty[3]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[4]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (GetProp(DBPROP_BOOKMARKSKIPPED))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
//get the bookmark for the row 1
if(!GetBookmark(1, &cbBookmark, &pBookmark))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, 1), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_E_BADBOOKMARK, // HRESULT to verify
0 // How many rows to expect.
);
PopulateTable();
CLEANUP:
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Delete 3rd row. pBookmark=2nd row with cRows=3. Verify S_OK and 2,4,5 hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_2()
{
BOOL fTestPass = TEST_FAIL;
DBPROPID guidProperty[5];
BYTE * pBookmark = NULL;
ULONG_PTR cbBookmark;
HROW * phRows = NULL;
phRows = (HROW *) PROVIDER_ALLOC( 3 * sizeof(HROW));
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_REMOVEDELETED;
guidProperty[3]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[4]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
//get the bookmark for the 2nd row
if(!GetBookmark(2, &cbBookmark, &pBookmark))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, 3), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
3, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
2, // row to match
S_OK, // HRESULT to verify
3, // How many rows to expect.
FALSE, // Don't release rows
DBCOMPAREOPS_EQ,
SUBOP_EMPTY,
phRows,
FALSE // Don't check row position
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phRows[0], 2, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
if (!COMPARE(VerifyRowPosition(phRows[1], 4, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
if (!COMPARE(VerifyRowPosition(phRows[2], 5, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
CLEANUP:
PROVIDER_FREE(phRows);
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Delete RowLast-1 row. pBookmark=RowLast-2 row,cRows=3. Match RowLast-2 row.
// Verify DB_S_ENDOFROWSET and RowLast-2, RowLast hrows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_3()
{
BOOL fTestPass = TEST_FAIL;
DBPROPID guidProperty[5];
BYTE * pBookmark = NULL;
ULONG_PTR cbBookmark;
HROW * phRows = NULL;
phRows = (HROW *) PROVIDER_ALLOC( 2 * sizeof(HROW));
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_REMOVEDELETED;
guidProperty[3]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[4]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
//get the bookmark
if(!GetBookmark(g_lRowLast-2, &cbBookmark, &pBookmark))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, g_lRowLast-1), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
3, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast-2, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
2, // How many rows to expect.
FALSE, // Don't release rows
DBCOMPAREOPS_EQ,
SUBOP_EMPTY,
phRows,
FALSE // Don't check row position
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phRows[0], g_lRowLast-2, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
if (!COMPARE(VerifyRowPosition(phRows[1], g_lRowLast, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
CLEANUP:
PROVIDER_FREE(phRows);
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Delete last row. pBookmark=DBBMK_LAST,cRows=-1. DBCOMPAREOPS_IGNORE. Verify last-1 row returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_4()
{
BOOL fTestPass = TEST_FAIL;
DBPROPID guidProperty[5];
DBBOOKMARK dbBookMark = DBBMK_LAST;
BYTE *pBookmark = (BYTE *)&dbBookMark;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_REMOVEDELETED;
guidProperty[3]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[4]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, g_lRowLast), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
g_lRowLast-1, // row to match
S_OK, // HRESULT to verify
1, // How many rows to expect.
TRUE, // release rows
DBCOMPAREOPS_IGNORE,
SUBOP_EMPTY,
NULL,
TRUE // check row position
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
CLEANUP:
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc pBookmark=NULL, cRows = 2. match 3rd. Delete 2nd and 5th rows. Find with cRows=-1 and match 3rd
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_5()
{
BOOL fTestPass = TEST_FAIL;
DBPROPID guidProperty[6];
HROW *phRows = NULL;
HROW *phRowsToDelete = NULL;
IRowsetChange *pIRowsetChange = NULL;
DBCOUNTITEM cRowsObtained = 0;
phRows = (HROW *) PROVIDER_ALLOC( sizeof(HROW));
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_REMOVEDELETED;
guidProperty[3]=DBPROP_CANFETCHBACKWARDS;
guidProperty[4]=DBPROP_CANHOLDROWS;
guidProperty[5]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!CHECK(m_pIRowset->GetNextRows(DB_NULL_HCHAPTER, 1, 4, &cRowsObtained, (HROW **)&phRowsToDelete ), S_OK) )
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phRowsToDelete[0], 2, g_pCTable), TRUE))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phRowsToDelete[3], 5, g_pCTable), TRUE))
goto CLEANUP;
if (!CHECK(RestartRowPosition(), S_OK))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
2, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
3, // row to match
S_OK, // HRESULT to verify
2 // How many rows to expect.
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!CHECK(m_pIRowsetFind->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange),S_OK))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
//delete the row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,&phRowsToDelete[0],NULL),S_OK))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,&phRowsToDelete[3],NULL),S_OK))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
-1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
3, // row to match
S_OK, // HRESULT to verify
1 // How many rows to expect.
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
CLEANUP:
PROVIDER_FREE(phRows);
PROVIDER_FREE(phRowsToDelete);
SAFE_RELEASE(pIRowsetChange);
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc *pBookMark = NULL, cRows=1. Delete 4th row. Match on what was in 4th row. DB_S_ENDOFROWSET and 0 rows.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_6()
{
int fTestPass=TEST_FAIL;
DBPROPID guidProperty[4];
BYTE * pBookmark = NULL;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_UPDATABILITY;
guidProperty[3]=DBPROP_REMOVEDELETED;
//open rowset, and accessor. (bind long cols)
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty,DBACCESSOR_ROWDATA, DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,
ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, NULL, EXECUTE_IFNOERROR, DBTYPE_EMPTY,
TRUE))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, 4), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
4, // row to match
DB_S_ENDOFROWSET,// HRESULT to verify
0 // How many rows to expect.
);
PopulateTable();
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc *pBookMark=DBBMK_LAST, cRows=-1. Delete 1st row. Match on what was in 1st row. DB_S_ENDOFROWSET and 0 rows.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_7()
{
int fTestPass=TEST_FAIL;
DBPROPID guidProperty[5];
DBBOOKMARK dbBookMark = DBBMK_LAST;
BYTE *pBookmark = (BYTE *)&dbBookMark;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_UPDATABILITY;
guidProperty[3]=DBPROP_CANFETCHBACKWARDS;
guidProperty[4]=DBPROP_REMOVEDELETED;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty,DBACCESSOR_ROWDATA, DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,
ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, NULL, EXECUTE_IFNOERROR, DBTYPE_EMPTY,
TRUE))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, 1), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
1, // Length of bookmark
-1, // # rows to fetch
0, // Offset
g_ulColNum, // Which column to match
1, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0 // How many rows to expect.
);
CLEANUP:
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(BookmarkSkipped)
//*-----------------------------------------------------------------------
//| Test Case: BookmarkSkipped - Test in the context of DBPROP_BOOKMARKSKIPPED
//| Created: 06/18/97
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL BookmarkSkipped::Init()
{
BOOL fTestPass = TEST_FAIL;
DBPROPID DBPropID=DBPROP_BOOKMARKSKIPPED;
if(!TCIRowsetFind::Init())
return FALSE;
if ( !AlteringRowsIsOK() )
return FALSE;
//make sure IID_IRowsetChange is supported
TESTC_DRIVER(g_rgDBPrpt[IDX_IRowsetChange].fSupported);
//make sure DBPROP_BOOKMARKSKIPPED is supported
TESTC_DRIVER(g_rgDBPrpt[IDX_BookmarkSkipped].fSupported);
//open rowset, and accessor. Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
0,NULL));
//return if the bookmarkskipped is not settable and variant-false
TESTC_DRIVER(GetProp(DBPROP_BOOKMARKSKIPPED))
fTestPass = TRUE;
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Delete 1st row. pBookmark=1st row,cRows=5. Match 2nd row. DB_S_ENDOFROWSET(overrides S_BOOKMARKSKIPPED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BookmarkSkipped::Variation_1()
{
BOOL fTestPass = TEST_FAIL;;
DBPROPID guidProperty[5];
BYTE *pBookmark = NULL;
ULONG_PTR cbBookmark;
HROW *phRows = NULL;
phRows = (HROW *) PROVIDER_ALLOC( sizeof(HROW));
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_BOOKMARKSKIPPED;
guidProperty[3]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[4]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
goto CLEANUP;
//get the bookmark
if(!GetBookmark(g_lRowLast-1, &cbBookmark, &pBookmark))
goto CLEANUP;
if (!COMPARE(DeleteRow(g_pCTable, g_lRowLast-1), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
2, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
1, // How many rows to expect.
FALSE, // Don't release rows
DBCOMPAREOPS_EQ,
SUBOP_EMPTY,
phRows,
FALSE // Don't check row position
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phRows[0], g_lRowLast, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
CLEANUP:
PROVIDER_FREE(phRows);
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Delete last row. pBookmark=last row, cRows=1. Match what was in last row. DB_S_BOOKMARKSKIPPED and no rows retrieved.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BookmarkSkipped::Variation_2()
{
BOOL fTestPass = TEST_FAIL;
DBPROPID guidProperty[5];
BYTE *pBookmark = NULL;
ULONG_PTR cbBookmark;
HROW *phRows = NULL;
phRows = (HROW *) PROVIDER_ALLOC( sizeof(HROW));
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_BOOKMARKSKIPPED;
guidProperty[3]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[4]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
//get the bookmark
if(!GetBookmark(g_lRowLast, &cbBookmark, &pBookmark))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, g_lRowLast), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
g_lRowLast, // row to match
DB_S_ENDOFROWSET, // HRESULT to verify
0, // How many rows to expect.
FALSE, // Don't release rows
DBCOMPAREOPS_EQ,
SUBOP_EMPTY,
phRows,
FALSE // Don't check row position
);
CLEANUP:
PROVIDER_FREE(phRows);
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Delete the first row. pBookmark=1st row,cRows=1. Match 2nd row. DB_S_BOOKMARKSKIPED and 2nd hrow returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BookmarkSkipped::Variation_3()
{
BOOL fTestPass = TEST_FAIL;;
DBPROPID guidProperty[5];
BYTE *pBookmark = NULL;
ULONG_PTR cbBookmark;
HROW *phRows = NULL;
phRows = (HROW *) PROVIDER_ALLOC( 2*sizeof(HROW));
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_BOOKMARKSKIPPED;
guidProperty[3]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[4]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
//get the bookmark
if(!GetBookmark(1, &cbBookmark, &pBookmark))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, 1), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
2, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
2, // row to match
DB_S_BOOKMARKSKIPPED, // HRESULT to verify
2, // How many rows to expect.
FALSE, // Don't release rows
DBCOMPAREOPS_EQ,
SUBOP_EMPTY,
phRows,
FALSE // Don't check row position
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phRows[0], 2, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
if (!COMPARE(VerifyRowPosition(phRows[1], 3, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
CLEANUP:
PROVIDER_FREE(phRows);
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Delete 3rd row. pBookmark=3rd row,cRows=1. Match 5th row. DB_S_BOOKMARKSKIPPED and one hrow.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BookmarkSkipped::Variation_4()
{
BOOL fTestPass = TEST_FAIL;
DBPROPID guidProperty[5];
BYTE *pBookmark = NULL;
ULONG_PTR cbBookmark;
HROW *phRows = NULL;
phRows = (HROW *) PROVIDER_ALLOC( sizeof(HROW));
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_IRowsetLocate;
guidProperty[2]=DBPROP_BOOKMARKSKIPPED;
guidProperty[3]=DBPROP_CANSCROLLBACKWARDS;
guidProperty[4]=DBPROP_UPDATABILITY;
//open rowset, and accessor.
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetFind,
NUMELEM(guidProperty),guidProperty))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
//get the bookmark
if(!GetBookmark(3, &cbBookmark, &pBookmark))
{
fTestPass = TEST_FAIL;
goto CLEANUP;
}
if (!COMPARE(DeleteRow(g_pCTable, 3), TRUE))
goto CLEANUP;
fTestPass = CallFindNextRows( g_pCTable, // CTable pointer
pBookmark, // bookmark;
cbBookmark, // Length of bookmark
1, // # rows to fetch
FALSE, // skip current row
g_ulColNum, // Which column to match
5, // row to match
DB_S_BOOKMARKSKIPPED, // HRESULT to verify
1, // How many rows to expect.
FALSE, // Don't release rows
DBCOMPAREOPS_EQ,
SUBOP_EMPTY,
phRows,
FALSE // Don't check row position
);
if (!COMPARE(fTestPass, TRUE))
goto CLEANUP;
if (!COMPARE(VerifyRowPosition(phRows[0], 5, g_pCTable), TRUE))
fTestPass = TEST_FAIL;
CLEANUP:
PROVIDER_FREE(phRows);
ReleaseRowsetAndAccessor();
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL BookmarkSkipped::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(TCJapanese)
//*-----------------------------------------------------------------------
//| Test Case: TCJapanese - Test scenarios relevant to the JPN locale
//| Created: 1/24/99
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL TCJapanese::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetFind::Init())
// }}
{
// TO DO: Add your own code here
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Test case sensitivity and CONTAINS
//
// @rdesc TEST_PASS or TEST_FAIL
//
int TCJapanese::Variation_1()
{
BOOL fTestPass = TEST_PASS, fSubTestPass = TEST_FAIL;
DBCOUNTITEM cRowsObtained = 0;
DBTYPE wTargetType;
CCol TempCol;
CTable * pTable = NULL;
DBCOUNTITEM cRowsOnTable = 0;
DBCOMPAREOP CompareOp = DBCOMPAREOPS_CONTAINS | DBCOMPAREOPS_CASEINSENSITIVE;
//create the table
pTable = new CTable(m_pThisTestModule->m_pIUnknown2, (WCHAR *)g_wszModuleName, NONULLS);
if(!pTable || !SUCCEEDED(pTable->CreateTable(0,1,NULL,PRIMARY,TRUE)))
{
odtLog<<L"Create Table failed, test cannot proceed\n";
SAFE_DELETE(pTable);
return TEST_FAIL;
}
cRowsOnTable = pTable->GetRowsOnCTable();
if (cRowsOnTable != 0)
{
// Delete All Rows
TESTC_(pTable->DeleteRows(), S_OK);
pTable->AddRow(cRowsOnTable);
}
// Insert a row
TESTC_(pTable->Insert(0), S_OK);
//open rowset, and accessor.
TESTC(GetRowsetAndAccessor(pTable, SELECT_ALLFROMTBL, IID_IRowsetFind));
for (DBORDINAL ulColIndex=1; ulColIndex <= pTable->CountColumnsOnTable(); ulColIndex++)
{
TESTC(SUCCEEDED(m_pIRowset->RestartPosition(NULL)));
pTable->GetColInfo(ulColIndex, TempCol);
if (!IsColumnMinimumFindable(&TempCol, CompareOp))
continue;
wTargetType = TempCol.GetProviderType();
if( DBTYPE_STR == wTargetType ||
DBTYPE_WSTR == wTargetType ||
DBTYPE_BSTR == wTargetType)
{
fSubTestPass =
CallFindNextRows
(
pTable, // CTable pointer
NULL, // bookmark;
0, // Length of bookmark
1, // # rows to fetch
0, // offset
ulColIndex, // Which column to match
cRowsOnTable+1, // row to match
S_OK, // HRESULT to verify
1, // How many rows to expect.
TRUE, // Release Rows
CompareOp, // Specifically ask for a compare Op
SUBOP_CONTAINS_BEGIN, // Sub Comparision option
NULL, // Use client or provider memory, default=provider
TRUE // verify rows by comparing data ?
);
if ( fSubTestPass == TEST_FAIL )
{
fTestPass = TEST_FAIL;
odtLog<<"Error at ColName "<< TempCol.GetColName()<<L", ColIndex "<<ulColIndex<<ENDL;
odtLog<<"-------------------------------------------------------------"<< ENDL;
break;
}
}
}
CLEANUP:
ReleaseRowsetAndAccessor();
if (pTable)
{
pTable->DropTable();
SAFE_DELETE(pTable);
}
return fTestPass;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL TCJapanese::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetFind::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END