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

13309 lines
354 KiB
C++

//--------------------------------------------------------------------
// Microsoft OLE DB Test
//
// Copyright 1995-2000 Microsoft Corporation.
//
// @doc
//
// @module IRowLoca.cpp | Source file for the test module IRowsetLocate.
//
#include "modstandard.hpp"
#define DBINITCONSTANTS // Must be defined to initialize constants in OLEDB.H
#define INITGUID
#include "irowloca.h"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Module Values
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// {{ TCW_MODULE_GLOBALS
DECLARE_MODULE_CLSID = { 0xfff25b4c, 0x7217, 0x11cf, { 0x89, 0x83, 0x00, 0xaa, 0x00, 0xb5, 0xa9, 0x1b }};
DECLARE_MODULE_NAME("IRowsetLocate");
DECLARE_MODULE_OWNER("Microsoft");
DECLARE_MODULE_DESCRIP("The test module for IRowsetLocate");
DECLARE_MODULE_VERSION(836347189);
// TCW_WizardVersion(2)
// TCW_Automation(True)
// }} TCW_MODULE_GLOBALS_END
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Globals
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CTable * g_pCTable=NULL; // pointer to the global table
CTable * g_p1RowTable=NULL;
IDBProperties * g_pIDBProperties=NULL; // pointer to IDBCreateSession interface
DBROWCOUNT g_lRowLast = 0; // Keeps track of rows on table
DBTYPE g_dwBookmarkType=DBTYPE_EMPTY; // the db data type of bookmarks
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};
/////////////////////////////////////////////////////////////
// Defines
//
/////////////////////////////////////////////////////////////
#define TESTC_DRIVER(exp) { if((exp)==FALSE) { odtLog << L"NotSupported by Provider, skipping Variation\n"; fTestPass = TEST_SKIPPED; goto CLEANUP; } }
#define PROPERTY_COUNT (IDX_IRowsetChange+1)
//record the properties default values
struct DBPrptRecord
{
BOOL fSupported;
BOOL fDefault;
BOOL fSettable;
}g_rgDBPrpt[PROPERTY_COUNT];
//-------------------------------------------------------------------------
// @func Func. Check whether provider allows to set DBPROP_MAXOPENROWS.
//
//-------------------------------------------------------------------------
void InitProp(IUnknown * pIDataSourceUnknown)
{
ULONG i=0;
IDBProperties* pIDBProperties =NULL;
DBPROPIDSET rgPropertyIDSets;
DBPROPID rgDBPrpt[PROPERTY_COUNT];
WCHAR* pDescBuffer =NULL;
ULONG cPropertyInfoSets=0;
DBPROPINFOSET *pPropertyInfoSets=NULL;
rgPropertyIDSets.rgPropertyIDs=rgDBPrpt;
rgPropertyIDSets.cPropertyIDs=PROPERTY_COUNT;
rgPropertyIDSets.guidPropertySet=DBPROPSET_ROWSET;
//Check if properites are supported
//Init all the properties
rgDBPrpt[IDX_Bookmarks]= DBPROP_BOOKMARKS;
rgDBPrpt[IDX_OrderedBookmarks]= DBPROP_ORDEREDBOOKMARKS;
rgDBPrpt[IDX_LiteralBookmarks]= DBPROP_LITERALBOOKMARKS;
rgDBPrpt[IDX_FetchBackwards]= DBPROP_CANFETCHBACKWARDS;
rgDBPrpt[IDX_ScrollBackwards]= DBPROP_CANSCROLLBACKWARDS;
rgDBPrpt[IDX_CanHoldRows]= DBPROP_CANHOLDROWS;
rgDBPrpt[IDX_RemoveDeleted]= DBPROP_REMOVEDELETED;
rgDBPrpt[IDX_BookmarkSkipped]= DBPROP_BOOKMARKSKIPPED;
rgDBPrpt[IDX_OtherUpdateDelete]=DBPROP_OTHERUPDATEDELETE;
rgDBPrpt[IDX_OtherInsert]=DBPROP_OTHERINSERT;
rgDBPrpt[IDX_IRowsetDeleteBookmarks]=DBPROP_IRowsetChange;
rgDBPrpt[IDX_BookmarkType]=DBPROP_BOOKMARKTYPE;
rgDBPrpt[IDX_IRowsetChange]= DBPROP_IRowsetChange;
//Verify and Create the Interface pointer for
if(!VerifyInterface(pIDataSourceUnknown, IID_IDBProperties,
DATASOURCE_INTERFACE,(IUnknown **)&pIDBProperties))
goto END;
//GetPropertyID
if(!SUCCEEDED(pIDBProperties->GetPropertyInfo(1,&rgPropertyIDSets,
&cPropertyInfoSets,&pPropertyInfoSets,&pDescBuffer)))
goto END;
for(i=0; i<PROPERTY_COUNT; i++)
{
if(pPropertyInfoSets->rgPropertyInfos[i].dwFlags & DBPROPFLAGS_WRITE)
g_rgDBPrpt[i].fSettable=TRUE;
else
g_rgDBPrpt[i].fSettable=FALSE;
}
END:
SAFE_RELEASE(pIDBProperties);
FreeProperties(&cPropertyInfoSets,&pPropertyInfoSets,&pDescBuffer);
}
//--------------------------------------------------------------------
// @func Module level initialization routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleInit(CThisTestModule * pThisTestModule)
{
HRESULT hr;
ULONG ulIndex;
DBORDINAL cColumns;
DB_LORDINAL *pColumns=NULL;
ULONG cProperties;
DBPROPSET *prgProperties=NULL;
DBPROPIDSET DBPropIDSet;
BOOL fInit=FALSE;
IUnknown *pIRowset=NULL;
WCHAR *pStringsBuffer=NULL;
DBCOLUMNINFO *rgInfo=NULL;
IColumnsInfo *pIColumnsInfo=NULL;
IRowsetInfo *pIRowsetInfo=NULL;
ULONG cPropertyCount=PROPERTY_COUNT;
//Initialize
DBPropIDSet.rgPropertyIDs=NULL;
DBPropIDSet.cPropertyIDs=PROPERTY_COUNT;
DBPropIDSet.guidPropertySet=DBPROPSET_ROWSET;
//Create a Data Source Object and Initialize
if(!ModuleCreateDBSession(pThisTestModule))
return FALSE;
//IDBCreateSession
if(!VerifyInterface(pThisTestModule->m_pIUnknown, IID_IDBProperties, DATASOURCE_INTERFACE, (IUnknown**)&g_pIDBProperties))
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);
//create the table
g_pCTable = new CTable(pThisTestModule->m_pIUnknown2, (WCHAR *)gwszModuleName, USENULLS);
g_p1RowTable = new CTable(pThisTestModule->m_pIUnknown2, (WCHAR *)gwszModuleName, USENULLS);
if(!g_pCTable ||
!SUCCEEDED(g_pCTable->CreateTable(TABLE_ROW_COUNT,1,NULL,PRIMARY,TRUE)) )
{
if(g_pCTable)
{
delete g_pCTable;
g_pCTable = NULL;
}
odtLog<<wszCreateTableFailed;
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_p1RowTable ||
!SUCCEEDED(g_p1RowTable->CreateTable(1,1,NULL,PRIMARY,TRUE)) )
{
if(g_p1RowTable)
{
delete g_p1RowTable;
g_p1RowTable = NULL;
}
}
if ( g_p1RowTable->GetRowsOnCTable() != 1 )
odtLog<<L"Warning: cannot get an one row table and the row number is "<<g_p1RowTable->GetRowsOnCTable()<<L".\n";
//make sure IRowsetLocate interface is supported by Opening a rowset
//and Requesting the IRowsetLocate interface.
hr = g_pCTable->CreateRowset(USE_OPENROWSET, IID_IRowsetLocate,
0, NULL, &pIRowset, NULL, &cColumns, &pColumns);
//free the memory
PROVIDER_FREE(pColumns);
//if E_NOINTERFACE is returned, IRowsetLocate is not supported by the provider
if(hr==ResultFromScode(E_NOINTERFACE))
{
odtLog<<wszIRowsetLocateNotSupported;
return TEST_SKIPPED;
}
if(hr!=ResultFromScode(S_OK))
{
odtLog<<wszOpenRowsetFailed;
return FALSE;
}
//get IColumnsInfo pointer
pIRowset->QueryInterface(IID_IColumnsInfo, (LPVOID *)&pIColumnsInfo);
if(!pIColumnsInfo)
goto CLEANUP;
hr=pIColumnsInfo->GetColumnInfo(&cColumns,&rgInfo,&pStringsBuffer);
if(hr!=ResultFromScode(S_OK))
goto CLEANUP;
//copy the DBTYPE of bookmark columns
g_dwBookmarkType=rgInfo->wType;
//the column for bookmark should be 0
if(0!=rgInfo->iOrdinal)
goto CLEANUP;
//check if properites are supported
cPropertyCount=IDX_IRowsetChange+1;
DBPropIDSet.rgPropertyIDs=(DBPROPID *)PROVIDER_ALLOC(cPropertyCount *
sizeof(DBPROPID));
//if properites are supported
//init all the properties
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;
//For version # 2 only
//rgDBPrpt[IDX_IRowsetDeleteBookmarks]=DBPROP_IRowsetDeleteBookmarks;
DBPropIDSet.rgPropertyIDs[IDX_IRowsetDeleteBookmarks]=DBPROP_IRowsetChange;
DBPropIDSet.rgPropertyIDs[IDX_BookmarkType]=DBPROP_BOOKMARKTYPE;
DBPropIDSet.rgPropertyIDs[IDX_IRowsetChange]=DBPROP_IRowsetChange;
if(!VerifyInterface(pIRowset, IID_IRowsetInfo, ROWSET_INTERFACE, (IUnknown**)&pIRowsetInfo))
return FALSE;
//mark everything as supported
for(ulIndex=0; ulIndex<PROPERTY_COUNT; ulIndex++)
{
g_rgDBPrpt[ulIndex].fSupported=TRUE;
g_rgDBPrpt[ulIndex].fDefault=FALSE;
}
if(!SUCCEEDED(hr=pIRowsetInfo->GetProperties(1,&DBPropIDSet, &cProperties, &prgProperties)))
goto CLEANUP;
//mark the properties
for(ulIndex=0; ulIndex<PROPERTY_COUNT; ulIndex++)
{
//mark the not supported properties
if(prgProperties[0].rgProperties[ulIndex].dwStatus==DBPROPSTATUS_NOTSUPPORTED)
{
g_rgDBPrpt[ulIndex].fSupported=FALSE;
g_rgDBPrpt[ulIndex].fDefault=FALSE;
}
else
{
if(prgProperties[0].rgProperties[ulIndex].dwStatus!=DBPROPSTATUS_OK)
odtLog<<L"Error: default value failed for properties indexed at "<<ulIndex<<L".\n";
//mark as supported properties
g_rgDBPrpt[ulIndex].fSupported=TRUE;
if(ulIndex==IDX_BookmarkType)
{
if(prgProperties[0].rgProperties[ulIndex].vValue.lVal
!=DBPROPVAL_BMK_NUMERIC)
{
odtLog<<L"ERROR: The bookmark is not based on numeric!\n";
if(prgProperties[0].rgProperties[ulIndex].vValue.lVal
!=DBPROPVAL_BMK_KEY)
odtLog<<L"ERROR: The bookmark type return false information!\n";
}
}
else
{
g_rgDBPrpt[ulIndex].fDefault=
V_BOOL(&prgProperties[0].rgProperties[ulIndex].vValue);
}
}
}
InitProp((IUnknown *)pThisTestModule->m_pIUnknown);
fInit=TRUE;
CLEANUP:
//release rowset objects
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE(pIRowsetInfo);
SAFE_RELEASE(pIRowset);
//free the memory
PROVIDER_FREE(DBPropIDSet.rgPropertyIDs);
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
FreeProperties(&cProperties,&prgProperties);
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;
}
SAFE_RELEASE(g_pIDBProperties);
//Release IDBCreateCommand interface
return (ModuleReleaseDBSession(pThisTestModule));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Base Test Case Section
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
// TCIRowsetLocate: the base class for the rest of test cases in this
// test module.
//
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class TCIRowsetLocate : public CTestCases
{
private:
protected:
//@cmember: interface pointer for IRowsetLocate
IRowsetLocate *m_pIRowsetLocate;
//@cmember: interface pointer for IRowset
IRowset *m_pIRowset;
//@cmember: interface pointer for IAccessor
IAccessor *m_pIAccessor;
//@cmember: the array of rowset object pointers
IUnknown *m_pIUnknown;
//@cmember: Count of Columns for a rowset
DBORDINAL m_cColumns;
//@cmember: the array of Column ordinals in the backend table
DB_LORDINAL *m_rgColumns;
//@cmember: accessory handle
HACCESSOR m_hAccessor;
//@cmember: the size of a row
DBCOUNTITEM 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: HRESULT
HRESULT m_hr;
//@cmember: Expected HRESULT
HRESULT m_ExpHR;
//@cmember: the flag set when DBPROP_CANHOLDROWS is on
BOOL m_fHoldRows;
//@cmember: the flag set when DBPROP_ORDEREDBOOKMARKS is on
BOOL m_fOrderedBookmark;
//@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,
ULONG cPropertiesUnset=0,
const DBPROPID *rgPropertiesUnset=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=TRUE,
ULONG cOptProperties=0,
const DBPROPID *rgOptProperties=NULL
);
//@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
(
ULONG_PTR ulRow,
ULONG_PTR * pcbBookmark,
BYTE ** ppBookmark
);
//@mfunc: compare two bookmars literally
BOOL CompareLiteralBookmark
( ULONG_PTR cbBookmark1,
const BYTE *pBookmark1,
ULONG_PTR cbBookamrk2,
const BYTE *pBookmark2,
DBCOMPARE *pDBCompare
);
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
ULONG_PTR cRow, //position 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
(
ULONG_PTR 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
);
//@mfunc: verify whether delete/update operations are legal against target Provider.
BOOL AlteringRowsIsOK();
public:
//constructor
TCIRowsetLocate(WCHAR *wstrTestCaseName);
//destructor
virtual ~TCIRowsetLocate();
};
//--------------------------------------------------------------------
// @mfunc base class TCIRowsetLocate constructor, must take testcase name
// as parameter.
//
TCIRowsetLocate::TCIRowsetLocate(WCHAR * wstrTestCaseName) //Takes TestCase Class name as parameter
: CTestCases (wstrTestCaseName)
{
//initialize member data
m_pIRowsetLocate=NULL;
m_pIRowset = NULL;
m_pIAccessor=NULL;
m_pIUnknown = NULL;
m_cColumns=0;
m_rgColumns=NULL;
m_hAccessor=NULL;
m_cRowSize=0;
m_cBinding=0;
m_rgBinding=NULL;
m_pData=NULL;
m_hr=E_FAIL;
m_ExpHR=E_FAIL;
m_fHoldRows=FALSE;
m_fOrderedBookmark=FALSE;
}
//--------------------------------------------------------------------
// @mfunc base class TCIRowsetLocate destructor
//
TCIRowsetLocate::~TCIRowsetLocate()
{
}
//--------------------------------------------------------------------
//@mfunc: Init creates a Data Source object, a DB Session object,
//and a command object and initialize corresponding interface pointers.
//
//--------------------------------------------------------------------
BOOL TCIRowsetLocate::Init()
{
return (CTestCases::Init());
}
//--------------------------------------------------------------------
//@mfunc: Terminate release the data source object, DB Session object, Command object
//
//--------------------------------------------------------------------
BOOL TCIRowsetLocate::Terminate()
{
return (CTestCases::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 TCIRowsetLocate::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
ULONG cPropertiesUnset, //the count of properties to be unset
const DBPROPID *rgPropertiesUnset, //the array of properties to be unset
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
ULONG cOptProperties, //the count of Optional properties
const DBPROPID *rgOptProperties //the array of optional props to be set
)
{
HRESULT hr;
ULONG cPropSets=1;
DBPROPSET rgPropSets[2];
ULONG cProp = 0;
DBPROP DBProp;
BOOL bReturn = FALSE;
BLOBTYPE blobType;
if(fBindLongColumns)
blobType=BLOB_LONG;
else
blobType=NO_BLOB_COLS;
//init rgPropSets[0]
rgPropSets[0].rgProperties = NULL;
rgPropSets[0].cProperties = 0;
rgPropSets[0].guidPropertySet= DBPROPSET_ROWSET;
//Set up the DB Properties struct
if(cProperties || cPropertiesUnset || cOptProperties)
{
//allocate
//Might need an extra for DBPROP_UPDATABILITY (+1)
rgPropSets[0].rgProperties=(DBPROP *)PROVIDER_ALLOC
(sizeof(DBPROP) * (cProperties + cPropertiesUnset + cOptProperties + 1));
if(!rgPropSets[0].rgProperties)
goto CLEANUP;
ULONG i;
//go through the loop to set every DB Property required
for(i=0; i<cProperties; i++)
{
//Set KAGPROP_QUERYBASEDUPDATES if need be
switch(rgProperties[i])
{
case KAGPROP_QUERYBASEDUPDATES:
memset(&DBProp, 0, sizeof(DBPROP));
DBProp.dwPropertyID=KAGPROP_QUERYBASEDUPDATES;
DBProp.dwOptions=DBPROPOPTIONS_REQUIRED;
DBProp.vValue.vt=VT_BOOL;
V_BOOL(&DBProp.vValue)=VARIANT_TRUE;
rgPropSets[1].rgProperties=&DBProp;
rgPropSets[1].cProperties=1;
rgPropSets[1].guidPropertySet=DBPROPSET_PROVIDERROWSET;
cPropSets++;
break;
case DBPROP_UPDATABILITY:
memset(&rgPropSets[0].rgProperties[cProp], 0, sizeof(DBPROP));
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;
default:
memset(&rgPropSets[0].rgProperties[cProp], 0, sizeof(DBPROP));
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;
}
}
//go through the loop to unset every DB Property required
for(i=0; i<cPropertiesUnset; i++)
{
//Only UnSet this property, if it is supported!
//Otherwise even though we don't want this property it may
//fail since it might not be supported on a certain driver
//For Example: On Access, DBPROP_OTHERINSERT is NOTSUPPORTED
//So if we try to set to to FALSE to Guarnentee not a ForwardOnly
//cursor the Rowset will fail, since its not supported...
if(SupportedProperty(rgPropertiesUnset[i], DBPROPSET_ROWSET, g_pIDBProperties))
{
memset(&rgPropSets[0].rgProperties[cProp], 0, sizeof(DBPROP));
rgPropSets[0].rgProperties[cProp].dwPropertyID = rgPropertiesUnset[i];
rgPropSets[0].rgProperties[cProp].dwOptions = DBPROPOPTIONS_REQUIRED;
rgPropSets[0].rgProperties[cProp].vValue.vt = VT_BOOL;
V_BOOL(&rgPropSets[0].rgProperties[cProp].vValue) = VARIANT_FALSE;
cProp++;
}
}
for(i=0; i<cOptProperties; i++)
{
memset(&rgPropSets[0].rgProperties[cProp], 0, sizeof(DBPROP));
rgPropSets[0].rgProperties[cProp].dwPropertyID = rgOptProperties[i];
rgPropSets[0].rgProperties[cProp].dwOptions = DBPROPOPTIONS_OPTIONAL;
rgPropSets[0].rgProperties[cProp].vValue.vt = VT_BOOL;
V_BOOL(&rgPropSets[0].rgProperties[cProp].vValue)= VARIANT_TRUE;
cProp++;
break;
}
rgPropSets[0].cProperties = cProp;
}
//Set properties and execute the SQL statement
//May fail due to combinations of properties
if (!pCTable->GetCommandSupOnCTable())
{
// We depend on commands to give back certain types of rowset.
// If commandds are not supported, bail our for certain query types
if(eSQLStmt != SELECT_EMPTYROWSET)
eSQLStmt = USE_OPENROWSET;
else
goto CLEANUP;
}
hr = pCTable->CreateRowset( eSQLStmt, IID_IRowsetLocate, cPropSets, rgPropSets, &m_pIUnknown,
NULL, &m_cColumns, &m_rgColumns);
if(hr==DB_S_ERRORSOCCURRED || hr==DB_E_ERRORSOCCURRED || hr==DB_E_NOTSUPPORTED)
{
goto CLEANUP;
}
if(!CHECK(hr,S_OK))
goto CLEANUP;
//If a pointer to a rowset is returned, retrieved the pointer
if(riid==IID_IRowsetLocate)
{
m_pIRowsetLocate=(IRowsetLocate *)m_pIUnknown;
COMPARE((m_pIRowsetLocate->AddRef() >= 1), TRUE);
}
//queryinterface for IRowset. IRowsetLocate implies IRowset
if(!SUCCEEDED(m_pIUnknown->QueryInterface(IID_IRowset,(LPVOID *)&m_pIRowset)))
goto CLEANUP;
//queryinterface for IAccessor
if(!SUCCEEDED(m_pIUnknown->QueryInterface(IID_IAccessor,(LPVOID *)&m_pIAccessor)))
goto CLEANUP;
//if dwAccessorFlags=DBACCESSOR_PASSBYREF, no need to create an accessor
if(dwAccessorFlags==DBACCESSOR_PASSBYREF)
{
bReturn = TRUE;
goto CLEANUP;
}
//create an accessor on the rowset
if(!CHECK(GetAccessorAndBindings(m_pIUnknown,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))
goto CLEANUP;
//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 TCIRowsetLocate::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_pIUnknown,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 TCIRowsetLocate::GetBookmark
(
ULONG_PTR ulRow,
ULONG_PTR * pcbBookmark,
BYTE ** ppBookmark
)
{
BOOL fPass = FALSE;
HROW * pHRow = NULL;
DBCOUNTITEM cCount;
DBREFCOUNT cRefCount;
//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
if(!CHECK(m_pIRowset->GetNextRows(NULL,(ulRow-1),1,&cCount,&pHRow),S_OK))
goto CLEANUP;
//only one row handle is retrieved
COMPARE(cCount, 1);
//get the data
if(!CHECK(m_pIRowset->GetData(*pHRow, m_hAccessor, m_pData),S_OK))
goto CLEANUP;
//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= LENGTH_BINDING(m_rgBinding[0], m_pData);
//allocate memory for bookmark
*ppBookmark=(BYTE *)PROVIDER_ALLOC(*pcbBookmark);
if(!(*ppBookmark))
goto CLEANUP;
//copy the value of the bookmark into the consumer's buffer
memcpy(*ppBookmark, (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,&cRefCount,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//restart the cursor position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
return FALSE;
return fPass;
}
//--------------------------------------------------------------------
//@mfunc: compare two bookmars literally.
//
//
//--------------------------------------------------------------------
BOOL TCIRowsetLocate::CompareLiteralBookmark
(
ULONG_PTR cbBookmark1,
const BYTE *pBookmark1,
ULONG_PTR cbBookmark2,
const BYTE *pBookmark2,
DBCOMPARE *pDBCompare
)
{
ULONG_PTR cBytes;
//the bookmarks as to be one byte long
if(!pBookmark1 || !pBookmark2 || !cbBookmark1 || !pDBCompare)
return FALSE;
//the length of two bookmarks have to be the same
if(cbBookmark1 != cbBookmark2)
return FALSE;
//the data type of bookmark should not be ORed with any type modifiers
switch(g_dwBookmarkType)
{
case DBTYPE_I1:
if(*(char *)pBookmark1 == *(char *)pBookmark2)
*pDBCompare=DBCOMPARE_EQ;
else
{
if(*(char *)pBookmark1 > *(char *)pBookmark2)
*pDBCompare=DBCOMPARE_GT;
else
*pDBCompare=DBCOMPARE_LT;
}
return TRUE;
case DBTYPE_I2:
if(*(SHORT *)pBookmark1 == *(SHORT *)pBookmark2)
*pDBCompare=DBCOMPARE_EQ;
else
{
if(*(SHORT *)pBookmark1 > *(SHORT *)pBookmark2)
*pDBCompare=DBCOMPARE_GT;
else
*pDBCompare=DBCOMPARE_LT;
}
return TRUE;
case DBTYPE_I4:
if(*(LONG *)pBookmark1 == *(LONG *)pBookmark2)
*pDBCompare=DBCOMPARE_EQ;
else
{
if(*(LONG *)pBookmark1 > *(LONG *)pBookmark2)
*pDBCompare=DBCOMPARE_GT;
else
*pDBCompare=DBCOMPARE_LT;
}
return TRUE;
case DBTYPE_UI1:
if(*(unsigned char *)pBookmark1 == *(unsigned char *)pBookmark2)
*pDBCompare=DBCOMPARE_EQ;
else
{
if(*(unsigned char *)pBookmark1 > *(unsigned char *)pBookmark2)
*pDBCompare=DBCOMPARE_GT;
else
*pDBCompare=DBCOMPARE_LT;
}
return TRUE;
case DBTYPE_UI2:
if(*(USHORT *)pBookmark1 == *(USHORT *)pBookmark2)
*pDBCompare=DBCOMPARE_EQ;
else
{
if(*(USHORT *)pBookmark1 > *(USHORT *)pBookmark2)
*pDBCompare=DBCOMPARE_GT;
else
*pDBCompare=DBCOMPARE_LT;
}
return TRUE;
case DBTYPE_UI4:
if(*(ULONG *)pBookmark1 == *(ULONG *)pBookmark2)
*pDBCompare=DBCOMPARE_EQ;
else
{
if(*(ULONG *)pBookmark1 > *(ULONG *)pBookmark2)
*pDBCompare=DBCOMPARE_GT;
else
*pDBCompare=DBCOMPARE_LT;
}
return TRUE;
case DBTYPE_BYTES:
//compare byte by byte as the unsigned bytes, most significant
//byte at the 0th position
for(cBytes=cbBookmark1; cBytes > 0; cBytes--)
{
if(*(unsigned char*)(pBookmark1+(cBytes-1)) > *(unsigned char *)(pBookmark2+(cBytes-1)))
{
*pDBCompare=DBCOMPARE_GT;
break;
}
else
{
if(*(unsigned char*)(pBookmark1+(cBytes-1)) < *(unsigned char *)(pBookmark2+(cBytes-1)))
{
*pDBCompare=DBCOMPARE_LT;
break;
}
}
}
if(cBytes==0)
*pDBCompare=DBCOMPARE_EQ;
return TRUE;
case DBTYPE_I8:
if(*(LONGLONG *)pBookmark1 == *(LONGLONG *)pBookmark2)
*pDBCompare=DBCOMPARE_EQ;
else
{
if(*(LONGLONG *)pBookmark1 > *(LONGLONG *)pBookmark2)
*pDBCompare=DBCOMPARE_GT;
else
*pDBCompare=DBCOMPARE_LT;
}
return TRUE;
case DBTYPE_UI8:
if(*(ULONGLONG *)pBookmark1 == *(ULONGLONG *)pBookmark2)
*pDBCompare=DBCOMPARE_EQ;
else
{
if(*(ULONGLONG *)pBookmark1 > *(ULONGLONG *)pBookmark2)
*pDBCompare=DBCOMPARE_GT;
else
*pDBCompare=DBCOMPARE_LT;
}
return TRUE;
//bookmark should not be float or double
case DBTYPE_R4:
case DBTYPE_R8:
case DBTYPE_EMPTY:
case DBTYPE_NULL:
case DBTYPE_DATE:
case DBTYPE_NUMERIC:
case DBTYPE_BOOL:
case DBTYPE_CY:
case DBTYPE_STR:
case DBTYPE_WSTR:
case DBTYPE_BSTR:
case DBTYPE_VARIANT:
case DBTYPE_IDISPATCH:
case DBTYPE_IUNKNOWN:
case DBTYPE_GUID:
case DBTYPE_ERROR:
case DBTYPE_DBDATE:
case DBTYPE_DBTIME:
case DBTYPE_DBTIMESTAMP:
case DBTYPE_UDT:
default:
return FALSE;
}
}
//--------------------------------------------------------------
//
// Get information about properties
//
//-----------------------------------------------------------------
BOOL TCIRowsetLocate::GetProp(DBPROPID DBPropID)
{
IRowsetInfo *pIRowsetInfo=NULL;
ULONG cProperty=0;
DBPROPIDSET DBPropIDSet;
DBPROPSET *pDBPropSet=NULL;
BOOL fSupported=FALSE;
//initialize
DBPropIDSet.guidPropertySet=DBPROPSET_ROWSET;
DBPropIDSet.cPropertyIDs=1;
DBPropIDSet.rgPropertyIDs=&DBPropID;
//QI for IRowsetInfo interface
if(!CHECK(m_pIRowset->QueryInterface(IID_IRowsetInfo,(LPVOID *)&pIRowsetInfo),S_OK))
goto CLEANUP;
if(FAILED(pIRowsetInfo->GetProperties(1,&DBPropIDSet,&cProperty,&pDBPropSet)))
goto CLEANUP;
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);
FreeProperties(&cProperty,&pDBPropSet);
SAFE_RELEASE(pIRowsetInfo);
return fSupported;
}
//--------------------------------------------------------------------
//@mfunc: If BookmarkSkipped is supported on the rowset
//--------------------------------------------------------------------
BOOL TCIRowsetLocate::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
if(!CHECK(m_pIRowset->QueryInterface(IID_IRowsetInfo,(LPVOID *)&pIRowsetInfo),S_OK))
goto CLEANUP;
//ask for DBPROP_BOOKMARKSKIPPED
if(!CHECK(pIRowsetInfo->GetProperties(1,&DBPropIDSet,&cProperty,
&pDBPropSet),S_OK))
goto CLEANUP;
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 TCIRowsetLocate::PopulateTable()
{
//delete all rows in the table.
if(!CHECK(g_pCTable->DeleteRows(ALLROWS),S_OK))
return FALSE;
// Regenerate the rowset
if(!CHECK(g_pCTable->Insert(PRIMARY, 1, g_lRowLast),S_OK))
return FALSE;
return TRUE;
}
//--------------------------------------------------------------------
//@mfunc: If RemoveDeleted is supported on the rowset
//--------------------------------------------------------------------
BOOL TCIRowsetLocate::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
if(!CHECK(m_pIRowset->QueryInterface(IID_IRowsetInfo,(LPVOID *)&pIRowsetInfo),S_OK))
goto CLEANUP;
//ask for DBPROP_BOOKMARKSKIPPED
if(!CHECK(pIRowsetInfo->GetProperties(1,&DBPropIDSet,&cProperty,
&pDBPropSet),S_OK))
goto CLEANUP;
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 TCIRowsetLocate::FreeMemory(CTable *pCTable)
{
//make sure m_pData is not NULL
if(!COMPARE(!m_pData, NULL))
return;
//make sure the columns are bound
if(!m_rgColumns)
return;
//call compareData with the option to free the memory referenced by the consumer's
//buffer without comparing data
CompareData(m_cColumns,m_rgColumns,1,m_pData,m_cBinding,m_rgBinding,pCTable,
NULL,PRIMARY,FREE_ONLY);
return;
}
//--------------------------------------------------------------------
//@mfunc: release a rowset object and accessor created on it
//
//--------------------------------------------------------------------
BOOL TCIRowsetLocate::ReleaseRowsetAndAccessor()
{
BOOL fPass=TRUE;
//free the consumer buffer
PROVIDER_FREE(m_pData);
PROVIDER_FREE(m_rgBinding);
PROVIDER_FREE(m_rgColumns);
//free accessor handle
if(m_hAccessor)
{
if(!CHECK(m_pIAccessor->ReleaseAccessor(m_hAccessor,NULL), S_OK))
fPass=FALSE;
m_hAccessor=NULL;
}
SAFE_RELEASE(m_pIAccessor);
SAFE_RELEASE(m_pIRowset);
SAFE_RELEASE(m_pIRowsetLocate);
SAFE_RELEASE(m_pIUnknown);
return fPass;
}
BOOL TCIRowsetLocate::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=FAIL;
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 TCIRowsetLocate::VerifyRowPosition
(
HROW hRow, //row handle
ULONG_PTR cRow, //potision expected
CTable * pCTable, //pointer to the CTable
EVALUE eValue //if the accessor is ReadColumnsByRef
)
{
//input validation
if(!pCTable)
return FALSE;
//m_pIRowset has to be valid
if(!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_cColumns,m_rgColumns,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 TCIRowsetLocate::VerifyCursorPosition
(
ULONG_PTR 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(COMPARE(pCTable, NULL))
return FALSE;
//m_pIRowset has to be valid
if(COMPARE(m_pIRowset, NULL) ||
COMPARE(m_pData,NULL))
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: 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 TCIRowsetLocate::AlteringRowsIsOK()
{
// If a specific table was set on the backend, assume we cannot alter it unless
// we have complete information about it.
if ( GetModInfo()->GetTableName() && !GetModInfo()->GetFileName())
return FALSE;
else
return TRUE;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Test Case Section
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// {{ TCW_TEST_CASE_MAP(BOOKMARKS)
//--------------------------------------------------------------------
// @class test DBPROP_BOOKMARKS
//
class BOOKMARKS : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(BOOKMARKS,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Compare return DBCOMPARE_NE for different rows and Hash return different hash value.
int Variation_1();
// @cmember Compare return DBCOMPARE_EQ for the same row and Hash return the same hash value.
int Variation_2();
// @cmember *pBookmark=DBBMK_FIRST and lRowsOffset=# of rows in the rowset. DB_S_ENDOFROWSET is returned and no row handles
int Variation_3();
// @cmember *pBookmark=DBBMK_LAST and IRowsetOffset=1. DB_S_ENDOFROWSET is returned and no row handles is retrieved.
int Variation_4();
// @cmember *pBookmark=DBBMK_FIRST and IRowsOffset=# of rows in the rowset-1. cRows=2. DB_S_ENDOFROWS is returned and the last row handl
int Variation_5();
// @cmember *pBookmark=DBBMK_LAST and IRowsetOffset==0. cRows=1. S_OK is returned and the last row handle is retrieved.
int Variation_6();
// @cmember *pBookmark=DBBMK_FIRST. Get one row handle at a time (lRowsetOffset==0 and cRows==1
int Variation_7();
// @cmember Pass an array of bookmarks, one bookmark for each row handle. S_OK and all the row handles in the rowset should be r
int Variation_8();
// @cmember Pass an array of two bookmarks that point to the same row. S_OK and the row handle is retrieved twice.
int Variation_9();
// @cmember Pass a bookmark to the second row. Retrieve it. Pass a bookmark to the first row, DB_E_ROWSNOTRELEASED should be returned. R
int Variation_10();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(BOOKMARKS)
#define THE_CLASS BOOKMARKS
BEG_TEST_CASE(BOOKMARKS, TCIRowsetLocate, L"test DBPROP_BOOKMARKS")
TEST_VARIATION(1, L"Compare return DBCOMPARE_NE for different rows and Hash return different hash value.")
TEST_VARIATION(2, L"Compare return DBCOMPARE_EQ for the same row and Hash return the same hash value.")
TEST_VARIATION(3, L"*pBookmark=DBBMK_FIRST and lRowsOffset=# of rows in the rowset. DB_S_ENDOFROWSET is returned and no row handles")
TEST_VARIATION(4, L"*pBookmark=DBBMK_LAST and IRowsetOffset=1. DB_S_ENDOFROWSET is returned and no row handles is retrieved.")
TEST_VARIATION(5, L"*pBookmark=DBBMK_FIRST and IRowsOffset=# of rows in the rowset-1. cRows=2. DB_S_ENDOFROWS is returned and the last row handl")
TEST_VARIATION(6, L"*pBookmark=DBBMK_LAST and IRowsetOffset==0. cRows=1. S_OK is returned and the last row handle is retrieved.")
TEST_VARIATION(7, L"*pBookmark=DBBMK_FIRST. Get one row handle at a time (lRowsetOffset==0 and cRows==1")
TEST_VARIATION(8, L"Pass an array of bookmarks, one bookmark for each row handle. S_OK and all the row handles in the rowset should be r")
TEST_VARIATION(9, L"Pass an array of two bookmarks that point to the same row. S_OK and the row handle is retrieved twice.")
TEST_VARIATION(10, L"Pass a bookmark to the second row. Retrieve it. Pass a bookmark to the first row, DB_E_ROWSNOTRELEASED should be returned. R")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(OrderedBookmarks)
//--------------------------------------------------------------------
// @class test DBPROP_ORDEREDBOOKMARKS
//
class OrderedBookmarks : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(OrderedBookmarks,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Compare return DBCOMPARE_EQ for the same row and Hash return the same hash value.
int Variation_1();
// @cmember The first bookmark is after the second. Compare return DBCOMPARE_GT for the row and Hash return a bigger hash value for the fir
int Variation_2();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(OrderedBookmarks)
#define THE_CLASS OrderedBookmarks
BEG_TEST_CASE(OrderedBookmarks, TCIRowsetLocate, L"test DBPROP_ORDEREDBOOKMARKS")
TEST_VARIATION(1, L"Compare return DBCOMPARE_EQ for the same row and Hash return the same hash value.")
TEST_VARIATION(2, L"The first bookmark is after the second. Compare return DBCOMPARE_GT for the row and Hash return a bigger hash value for the fir")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(OrderedBookmarks_Fetch_Scroll)
//--------------------------------------------------------------------
// @class DBPROP_ORDEREDBOOKMARKS + DBPROP_CANFETCHBACKWARDS + DBPROP_CANSCROLLBACKWARDS
//
class OrderedBookmarks_Fetch_Scroll : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(OrderedBookmarks_Fetch_Scroll,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember The first bookmark is before the second. Compare return for the row and Hash return a smaller hash value for the first bookmar
int Variation_1();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(OrderedBookmarks_Fetch_Scroll)
#define THE_CLASS OrderedBookmarks_Fetch_Scroll
BEG_TEST_CASE(OrderedBookmarks_Fetch_Scroll, TCIRowsetLocate, L"DBPROP_ORDEREDBOOKMARKS + DBPROP_CANFETCHBACKWARDS + DBPROP_CANSCROLLBACKWARDS")
TEST_VARIATION(1, L"The first bookmark is before the second. Compare return for the row and Hash return a smaller hash value for the first bookmar")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(LiteralBookmarks)
//--------------------------------------------------------------------
// @class test DBPROP_LITERALBOOKMARKS
//
class LiteralBookmarks : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(LiteralBookmarks,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Compare the bookmarks for the different row directly, based on the data type of the bookmark.
int Variation_1();
// @cmember Compare the bookmarks for the same row directly, based on the data type of the bookmark.
int Variation_2();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(LiteralBookmarks)
#define THE_CLASS LiteralBookmarks
BEG_TEST_CASE(LiteralBookmarks, TCIRowsetLocate, L"test DBPROP_LITERALBOOKMARKS")
TEST_VARIATION(1, L"Compare the bookmarks for the different row directly, based on the data type of the bookmark.")
TEST_VARIATION(2, L"Compare the bookmarks for the same row directly, based on the data type of the bookmark.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Literal_Ordered_CanHoldRows)
//--------------------------------------------------------------------
// @class Test DBPROP_LITERALBOOKMARKS + DBPROP_ORDEREDBOOKMARKS + DBPROP_CANHOLDROWS
//
class Literal_Ordered_CanHoldRows : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Literal_Ordered_CanHoldRows,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember The first bookmark is after the second. Compare the bookmarks directly, based on the data type of the bookmark.
int Variation_1();
// @cmember The first bookmark is before the second. Compare the bookmarks directly, based on the data type of the bookmark.
int Variation_2();
// @cmember The first bookmark is the same as the second. Compare the bookmarks directly, based on the data type of the bookmark.
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Literal_Ordered_CanHoldRows)
#define THE_CLASS Literal_Ordered_CanHoldRows
BEG_TEST_CASE(Literal_Ordered_CanHoldRows, TCIRowsetLocate, L"Test DBPROP_LITERALBOOKMARKS + DBPROP_ORDEREDBOOKMARKS + DBPROP_CANHOLDROWS")
TEST_VARIATION(1, L"The first bookmark is after the second. Compare the bookmarks directly, based on the data type of the bookmark.")
TEST_VARIATION(2, L"The first bookmark is before the second. Compare the bookmarks directly, based on the data type of the bookmark.")
TEST_VARIATION(3, L"The first bookmark is the same as the second. Compare the bookmarks directly, based on the data type of the bookmark.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(ScrollBackwards)
//--------------------------------------------------------------------
// @class Test DBPROP_CANSCROLLBACKWARDS
//
class ScrollBackwards : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ScrollBackwards,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember *pBookmark=DBBMK_FIRST and lRowsetOffset=-1. DB_S_ENDOFROWSET is returned and no row handles is retrieved.
int Variation_1();
// @cmember *pBookmark=DBBMK_LAST and lRowsetOffset=-(# of rows in the rowset
int Variation_2();
// @cmember *pBookmark is the bookmark on the second row of the rowset. lRowsetOffset=-1, cRows=# of rows in the rowset. S_OK is returned
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ScrollBackwards)
#define THE_CLASS ScrollBackwards
BEG_TEST_CASE(ScrollBackwards, TCIRowsetLocate, L"Test DBPROP_CANSCROLLBACKWARDS")
TEST_VARIATION(1, L"*pBookmark=DBBMK_FIRST and lRowsetOffset=-1. DB_S_ENDOFROWSET is returned and no row handles is retrieved.")
TEST_VARIATION(2, L"*pBookmark=DBBMK_LAST and lRowsetOffset=-(# of rows in the rowset")
TEST_VARIATION(3, L"*pBookmark is the bookmark on the second row of the rowset. lRowsetOffset=-1, cRows=# of rows in the rowset. S_OK is returned")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(FetchBackwards)
//--------------------------------------------------------------------
// @class test DBPROP_CANFETCHBACKWARDS
//
class FetchBackwards : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(FetchBackwards,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember *pBookmark=DBBMK_FIRST and lRowsetOffset==1. cRows=-3. DB_S_ENDOFROWSET is returned and only two row handle is retrieved.
int Variation_1();
// @cmember *pBookmark=DBBMK_LAST and lRowsetOffset==0. cRows=-6. DB_S_ENDOFROWSET is returned and only 5 row handles are retrieved. Ver
int Variation_2();
// @cmember *pBookmark is the bookmark on the 4th row. lRowsetOffset=1 and cRows=-2. S_OK is returned and the 5th and the 4th row handles
int Variation_3();
// @cmember *pBookmark=DBBMK_LAST. Get one row handle at a time (lRowsetOffset==0 and cRows==-1
int Variation_4();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(FetchBackwards)
#define THE_CLASS FetchBackwards
BEG_TEST_CASE(FetchBackwards, TCIRowsetLocate, L"test DBPROP_CANFETCHBACKWARDS")
TEST_VARIATION(1, L"*pBookmark=DBBMK_FIRST and lRowsetOffset==1. cRows=-3. DB_S_ENDOFROWSET is returned and only two row handle is retrieved.")
TEST_VARIATION(2, L"*pBookmark=DBBMK_LAST and lRowsetOffset==0. cRows=-6. DB_S_ENDOFROWSET is returned and only 5 row handles are retrieved. Ver")
TEST_VARIATION(3, L"*pBookmark is the bookmark on the 4th row. lRowsetOffset=1 and cRows=-2. S_OK is returned and the 5th and the 4th row handles")
TEST_VARIATION(4, L"*pBookmark=DBBMK_LAST. Get one row handle at a time (lRowsetOffset==0 and cRows==-1")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Scroll_Fetch)
//--------------------------------------------------------------------
// @class test DBPROP_CANSCROLLBACKWARDS + DBPROP_CANFETCHBACKWARDS
//
class Scroll_Fetch : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Scroll_Fetch,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember *pBookmark=DBBMK_LAST and lRowOffset=-2. cRows=-3. The third, 4th, and 5th row handles are retrieved. *pBoolmark=DBBMK_FIRST
int Variation_1();
// @cmember cRows == LONG_MIN
int Variation_2();
// @cmember lRowsOffset == LONG_MIN
int Variation_3();
// @cmember cRows = LONG_MAX/2 + 1
int Variation_4();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Scroll_Fetch)
#define THE_CLASS Scroll_Fetch
BEG_TEST_CASE(Scroll_Fetch, TCIRowsetLocate, L"test DBPROP_CANSCROLLBACKWARDS + DBPROP_CANFETCHBACKWARDS")
TEST_VARIATION(1, L"*pBookmark=DBBMK_LAST and lRowOffset=-2. cRows=-3. The third, 4th, and 5th row handles are retrieved. *pBoolmark=DBBMK_FIRST")
TEST_VARIATION(2, L"cRows == LONG_MIN")
TEST_VARIATION(3, L"lRowsOffset == LONG_MIN")
TEST_VARIATION(4, L"cRows = LONG_MAX/2 + 1")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Scroll_Fetch_CanHoldRows)
//--------------------------------------------------------------------
// @class Test DBPROP_CANSCROLLBACKWARDS + DBPROP_CANFETCHBACKWARDS + DBPROP_CANHOLDROWS
//
class Scroll_Fetch_CanHoldRows : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Scroll_Fetch_CanHoldRows,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember pBookmark points to the second row. lRowOffset=-1 cRows=-1. S_OK is returned and the first row handle is retrieved.
int Variation_1();
// @cmember *pBookmark points to the third row. lRowOffset=-1 and cRows=-3. DB_S_ENDOFROWSET is returned and the 2nd and 1st row handles
int Variation_2();
// @cmember *pBookmark points to the 4th row. lRowstOffset=-1 and cRows=-3. S_OK is returned. Do not release the row handle. *pBookmar
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Scroll_Fetch_CanHoldRows)
#define THE_CLASS Scroll_Fetch_CanHoldRows
BEG_TEST_CASE(Scroll_Fetch_CanHoldRows, TCIRowsetLocate, L"Test DBPROP_CANSCROLLBACKWARDS + DBPROP_CANFETCHBACKWARDS + DBPROP_CANHOLDROWS")
TEST_VARIATION(1, L"pBookmark points to the second row. lRowOffset=-1 cRows=-1. S_OK is returned and the first row handle is retrieved.")
TEST_VARIATION(2, L"*pBookmark points to the third row. lRowOffset=-1 and cRows=-3. DB_S_ENDOFROWSET is returned and the 2nd and 1st row handles")
TEST_VARIATION(3, L"*pBookmark points to the 4th row. lRowstOffset=-1 and cRows=-3. S_OK is returned. Do not release the row handle. *pBookmar")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(CanHoldRows)
//--------------------------------------------------------------------
// @class test DBPROP_CANHOLDROWS
//
class CanHoldRows : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(CanHoldRows,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Pass a bookmark to the second row. Retrieve it. Pass a bookmark to the third row, S_OK.
int Variation_1();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(CanHoldRows)
#define THE_CLASS CanHoldRows
BEG_TEST_CASE(CanHoldRows, TCIRowsetLocate, L"test DBPROP_CANHOLDROWS")
TEST_VARIATION(1, L"Pass a bookmark to the second row. Retrieve it. Pass a bookmark to the third row, S_OK.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(MaxOpenRows)
//--------------------------------------------------------------------
// @class test DBPROP_MAXOPENROWS
//
class MaxOpenRows : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(MaxOpenRows,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Set MAXOPENROWS to 3. *pBookmark points to the second row. lRowsOffset==1 and cRows=4. DB_S_ENDOFROWSET
int Variation_1();
// @cmember SetMAXOPENROWS to 2. *pBookmark points to the third row. lRowsOffset==0 and cRows=3. DB_S_ROWLIMITEXCEEDED
int Variation_2();
// @cmember Set MAXOPENROWS to 3. Pass an array of 3 bookmarks to different rows. S_OK.
int Variation_3();
// @cmember Set MAXOPENROWS to 2. Pass an array of 4 bookmarks. DB_S_ROWLIMITEXCEEDED is returned and only two row handles are retrieved.
int Variation_4();
// @cmember Use default MaxOpenRows
int Variation_5();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(MaxOpenRows)
#define THE_CLASS MaxOpenRows
BEG_TEST_CASE(MaxOpenRows, TCIRowsetLocate, L"test DBPROP_MAXOPENROWS")
TEST_VARIATION(1, L"Set MAXOPENROWS to 3. *pBookmark points to the second row. lRowsOffset==1 and cRows=4. DB_S_ENDOFROWSET")
TEST_VARIATION(2, L"SetMAXOPENROWS to 2. *pBookmark points to the third row. lRowsOffset==0 and cRows=3. DB_S_ROWLIMITEXCEEDED")
TEST_VARIATION(3, L"Set MAXOPENROWS to 3. Pass an array of 3 bookmarks to different rows. S_OK.")
TEST_VARIATION(4, L"Set MAXOPENROWS to 2. Pass an array of 4 bookmarks. DB_S_ROWLIMITEXCEEDED is returned and only two row handles are retrieved.")
TEST_VARIATION(5, L"Use default MaxOpenRows")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Related_IRowset)
//--------------------------------------------------------------------
// @class test related interface IRowset
//
class Related_IRowset : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Related_IRowset,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember GetRowsAt does not change the cursor location of the rowset.
int Variation_1();
// @cmember GetRowsByBookmark does not change the cursor location of the rowset
int Variation_2();
// @cmember Retrieve the same row handle twice by GetRowsAt and GetRowsByBookmark
int Variation_3();
// @cmember Make sure IRowsetLocate::GetRowsAt return DB_E_ROWSNOTRELEASED if the row handles retrieved by IRowset::GetNextRows is not rele
int Variation_4();
// @cmember Make sure IRowsetLocate::GetRowsByBookmark return DB_E_ROWSNOTRELEASED if the row handles retrieved by IRowset::GetNextRows is
int Variation_5();
// @cmember Fetch the last row. Fetch the second to last row. Fetch the 1st row. Fetch the last row.
int Variation_6();
// @cmember position at the lst row. GetRowsAt. Fetch backwards one row.
int Variation_7();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Related_IRowset)
#define THE_CLASS Related_IRowset
BEG_TEST_CASE(Related_IRowset, TCIRowsetLocate, L"test related interface IRowset")
TEST_VARIATION(1, L"GetRowsAt does not change the cursor location of the rowset.")
TEST_VARIATION(2, L"GetRowsByBookmark does not change the cursor location of the rowset")
TEST_VARIATION(3, L"Retrieve the same row handle twice by GetRowsAt and GetRowsByBookmark")
TEST_VARIATION(4, L"Make sure IRowsetLocate::GetRowsAt return DB_E_ROWSNOTRELEASED if the row handles retrieved by IRowset::GetNextRows is not rele")
TEST_VARIATION(5, L"Make sure IRowsetLocate::GetRowsByBookmark return DB_E_ROWSNOTRELEASED if the row handles retrieved by IRowset::GetNextRows is")
TEST_VARIATION(6, L"Fetch the last row. Fetch the second to last row. Fetch the 1st row. Fetch the last row.")
TEST_VARIATION(7, L"position at the lst row. GetRowsAt. Fetch backwards one row.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Rowset_SingleRow)
//--------------------------------------------------------------------
// @class test single row rowset
//
class Rowset_SingleRow : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Rowset_SingleRow,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Compare return DBCOMPARE_EQ and Hash return the same value
int Variation_1();
// @cmember GetRowsAt: *pBookmark=DBBMK_FIRST. lRowsOFfset==1 and cRows=1. DB_S_ENDOFROWSET
int Variation_2();
// @cmember GetRowsAt: *pBookmark=DBBMK_LAST, lRowsOffset=0 and cRows=1. S_OK
int Variation_3();
// @cmember GetRowsByBookmark: Pass array of two bookmarks: the first and the last row.
int Variation_4();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Rowset_SingleRow)
#define THE_CLASS Rowset_SingleRow
BEG_TEST_CASE(Rowset_SingleRow, TCIRowsetLocate, L"test single row rowset")
TEST_VARIATION(1, L"Compare return DBCOMPARE_EQ and Hash return the same value")
TEST_VARIATION(2, L"GetRowsAt: *pBookmark=DBBMK_FIRST. lRowsOFfset==1 and cRows=1. DB_S_ENDOFROWSET")
TEST_VARIATION(3, L"GetRowsAt: *pBookmark=DBBMK_LAST, lRowsOffset=0 and cRows=1. S_OK")
TEST_VARIATION(4, L"GetRowsByBookmark: Pass array of two bookmarks: the first and the last row.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Consistency)
//--------------------------------------------------------------------
// @class make sure GetRowsAt and GetRowsByBookmark return the same value
//
class Consistency : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Consistency,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Retrieve three row handles from GetRowsAt and GetRowsByBookmark, one of which is overlapping
int Variation_1();
// @cmember Retrive the first row, GetRowsAt uses DBBMK_FIRST
int Variation_2();
// @cmember Retrieve the last row. GetRowsAt uses DBBMK_LAST.
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Consistency)
#define THE_CLASS Consistency
BEG_TEST_CASE(Consistency, TCIRowsetLocate, L"make sure GetRowsAt and GetRowsByBookmark return the same value")
TEST_VARIATION(1, L"Retrieve three row handles from GetRowsAt and GetRowsByBookmark, one of which is overlapping")
TEST_VARIATION(2, L"Retrive the first row, GetRowsAt uses DBBMK_FIRST")
TEST_VARIATION(3, L"Retrieve the last row. GetRowsAt uses DBBMK_LAST.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Parameters)
//--------------------------------------------------------------------
// @class valid and invalid parameters passed into methods
//
class Parameters : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Parameters,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember GetRowsAt: *pBookmark=DBBMK_INVALID, DB_E_BADBOOKMARK
int Variation_1();
// @cmember GetRowsAt: cRow==0 and *prghRows is not NULL on input
int Variation_2();
// @cmember GetRowsAt: *pcRowsObtained is 0 and *prghRows is NULL.
int Variation_3();
// @cmember GetRowsByBookmark: cRows==0 and *prghRows and *prgErrors are not NULL.
int Variation_4();
// @cmember rgpBookmarks points to DBBMK_INVALID and fRetrunErrors=FALSE. *prghRows *prgErrors are NULL on input. DB_S_ERRORSOCCURRED
int Variation_5();
// @cmember Pass an array of 3 bookmarks. The first bookmark is valid, the second bookmark is a NULL pointer and the third element of rgcb
int Variation_6();
// @cmember Pass an array of 4 bookmarks: DBBMK_FIRST, DBBMK_LAST, valid, DBBMK_INVALID. DB_S_ERRORSOCCURRED
int Variation_7();
// @cmember Pass an array of 3 bookmarks: valid, NULL pointer, DBBMK_FIRST. fReturnErrors=FALSE and prgErrors=NULL, pcErrors is not NULL.
int Variation_8();
// @cmember Pass an array of 3 bookmarks: first cbBokmark is less length, second *pBookmark is bogus, and third is valid
int Variation_9();
// @cmember Hash:Pass an array of two bookmarks, one is valid and the other is not. pcErrors==NULL and prgErrors==NULL
int Variation_10();
// @cmember Hash:Pass an invalid bookmark. pcErrors==NULL and prgErrors is not NULL.
int Variation_11();
// @cmember Pass an array of 4 bookmarks. The first element of rgcbBookmarks is 0, the second bookmark is valid, the third and the forth
int Variation_12();
// @cmember Pass an array of 4 bookmarks: DBBMK_FIRST, DBBMK_LAST,valid, DBBMK_INVALID.
int Variation_13();
// @cmember Valid bookmark, *pcErrors=0
int Variation_14();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Parameters)
#define THE_CLASS Parameters
BEG_TEST_CASE(Parameters, TCIRowsetLocate, L"valid and invalid parameters passed into methods")
TEST_VARIATION(1, L"GetRowsAt: *pBookmark=DBBMK_INVALID, DB_E_BADBOOKMARK")
TEST_VARIATION(2, L"GetRowsAt: cRow==0 and *prghRows is not NULL on input")
TEST_VARIATION(3, L"GetRowsAt: *pcRowsObtained is 0 and *prghRows is NULL.")
TEST_VARIATION(4, L"GetRowsByBookmark: cRows==0 and *prghRows and *prgErrors are not NULL.")
TEST_VARIATION(5, L"rgpBookmarks points to DBBMK_INVALID and fRetrunErrors=FALSE. *prghRows *prgErrors are NULL on input. DB_S_ERRORSOCCURRED")
TEST_VARIATION(6, L"Pass an array of 3 bookmarks. The first bookmark is valid, the second bookmark is a NULL pointer and the third element of rgcb")
TEST_VARIATION(7, L"Pass an array of 4 bookmarks: DBBMK_FIRST, DBBMK_LAST, valid, DBBMK_INVALID. DB_S_ERRORSOCCURRED")
TEST_VARIATION(8, L"Pass an array of 3 bookmarks: valid, NULL pointer, DBBMK_FIRST. fReturnErrors=FALSE and prgErrors=NULL, pcErrors is not NULL.")
TEST_VARIATION(9, L"Pass an array of 3 bookmarks: first cbBokmark is less length, second *pBookmark is bogus, and third is valid")
TEST_VARIATION(10, L"Hash:Pass an array of two bookmarks, one is valid and the other is not. pcErrors==NULL and prgErrors==NULL")
TEST_VARIATION(11, L"Hash:Pass an invalid bookmark. pcErrors==NULL and prgErrors is not NULL.")
TEST_VARIATION(12, L"Pass an array of 4 bookmarks. The first element of rgcbBookmarks is 0, the second bookmark is valid, the third and the forth")
TEST_VARIATION(13, L"Pass an array of 4 bookmarks: DBBMK_FIRST, DBBMK_LAST,valid, DBBMK_INVALID.")
TEST_VARIATION(14, L"Valid bookmark, *pcErrors=0")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Boundary_Compare)
//--------------------------------------------------------------------
// @class boundary conditions for Compare
//
class Boundary_Compare : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
ULONG_PTR m_cbBookmark;
BYTE *m_pBookmark;
DBCOMPARE m_DBCompare;
DBBOOKMARK m_DBBookmark;
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary_Compare,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember cbBookmark1==0
int Variation_1();
// @cmember cbBookmark2==0
int Variation_2();
// @cmember pBookmark1==NULL
int Variation_3();
// @cmember pBookmark2==NULL
int Variation_4();
// @cmember pdwComparistion==NULL
int Variation_5();
// @cmember pBookmark1==DBBMK_INVALID
int Variation_6();
// @cmember pBookmark2==DBBMK_INVALID
int Variation_7();
// @cmember pBookmark1==DBBMK_FIRST
int Variation_8();
// @cmember pBookmark2==DBBMK_FIRST
int Variation_9();
// @cmember pBookmark1==DBBMK_LAST
int Variation_10();
// @cmember pBookmark2==DBBMK_LAST
int Variation_11();
// @cmember cbBookmark1==length-1
int Variation_12();
// @cmember cbBookmark1==length+1
int Variation_13();
// @cmember cbBookmark2==length-1
int Variation_14();
// @cmember cbBookmark2==length+1
int Variation_15();
// @cmember pBookmark1 points to bogus bookmark
int Variation_16();
// @cmember pBookmark2 points to bogus bookmark
int Variation_17();
// @cmember cbBmk1 != 1, cbBmk2 == 1
int Variation_18();
// @cmember cbBmk1 == 1, cbBmk2 != 1
int Variation_19();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Boundary_Compare)
#define THE_CLASS Boundary_Compare
BEG_TEST_CASE(Boundary_Compare, TCIRowsetLocate, L"boundary conditions for Compare")
TEST_VARIATION(1, L"cbBookmark1==0")
TEST_VARIATION(2, L"cbBookmark2==0")
TEST_VARIATION(3, L"pBookmark1==NULL")
TEST_VARIATION(4, L"pBookmark2==NULL")
TEST_VARIATION(5, L"pdwComparistion==NULL")
TEST_VARIATION(6, L"pBookmark1==DBBMK_INVALID")
TEST_VARIATION(7, L"pBookmark2==DBBMK_INVALID")
TEST_VARIATION(8, L"pBookmark1==DBBMK_FIRST")
TEST_VARIATION(9, L"pBookmark2==DBBMK_FIRST")
TEST_VARIATION(10, L"pBookmark1==DBBMK_LAST")
TEST_VARIATION(11, L"pBookmark2==DBBMK_LAST")
TEST_VARIATION(12, L"cbBookmark1==length-1")
TEST_VARIATION(13, L"cbBookmark1==length+1")
TEST_VARIATION(14, L"cbBookmark2==length-1")
TEST_VARIATION(15, L"cbBookmark2==length+1")
TEST_VARIATION(16, L"pBookmark1 points to bogus bookmark")
TEST_VARIATION(17, L"pBookmark2 points to bogus bookmark")
TEST_VARIATION(18, L"cbBmk1 != 1, cbBmk2 == 1")
TEST_VARIATION(19, L"cbBmk1 == 1, cbBmk2 != 1")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Boundary_GetRowsAt)
//--------------------------------------------------------------------
// @class boundary conditions for GetRowsAt
//
class Boundary_GetRowsAt : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
ULONG_PTR m_cbBookmark;
BYTE *m_pBookmark;
DBBOOKMARK m_DBBookmark;
HROW *m_pHRow;
DBCOUNTITEM m_cRowsObtained;
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary_GetRowsAt,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember cbBookmark==0, E_INVALIDARG
int Variation_1();
// @cmember pBookmark==NULL; E_INVALIDARG
int Variation_2();
// @cmember pcRowsObtained==NULL; E_INVALIDARG
int Variation_3();
// @cmember prgRows==NULL; E_INVALIDARG
int Variation_4();
// @cmember lRowsOffset==-1. DB_S_ENDOFROWSET
int Variation_5();
// @cmember cRows=-1, DB_E_CANTFETCHBACKWARDS
int Variation_6();
// @cmember cbBookmark=length-1, DB_E_BADBOOKMARK
int Variation_7();
// @cmember cbBookmark=length+1; DB_E_BADBOOKMARK
int Variation_8();
// @cmember pBookmark points to a bogus bookmark
int Variation_9();
// @cmember cRows == LONG_MAX
int Variation_12();
// @cmember lRowsOffset == LONG_MAX
int Variation_13();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Boundary_GetRowsAt)
#define THE_CLASS Boundary_GetRowsAt
BEG_TEST_CASE(Boundary_GetRowsAt, TCIRowsetLocate, L"boundary conditions for GetRowsAt")
TEST_VARIATION(1, L"cbBookmark==0, E_INVALIDARG")
TEST_VARIATION(2, L"pBookmark==NULL; E_INVALIDARG")
TEST_VARIATION(3, L"pcRowsObtained==NULL; E_INVALIDARG")
TEST_VARIATION(4, L"prgRows==NULL; E_INVALIDARG")
TEST_VARIATION(5, L"lRowsOffset==-1. DB_S_ENDOFROWSET")
TEST_VARIATION(6, L"cRows=-1, DB_E_CANTFETCHBACKWARDS")
TEST_VARIATION(7, L"cbBookmark=length-1, DB_E_BADBOOKMARK")
TEST_VARIATION(8, L"cbBookmark=length+1; DB_E_BADBOOKMARK")
TEST_VARIATION(9, L"pBookmark points to a bogus bookmark")
TEST_VARIATION(12, L"cRows == LONG_MAX")
TEST_VARIATION(13, L"lRowsOffset == LONG_MAX")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Boundary_GetRowsByBookmarks)
//--------------------------------------------------------------------
// @class boundary conditions for GetRowsByBookmark
//
class Boundary_GetRowsByBookmarks : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
ULONG_PTR m_cbBookmark;
BYTE *m_rgpBookmarks[2];
DBBOOKMARK m_DBBookmark;
DBCOUNTITEM m_cRowsObtained;
HROW m_rghRows[1];
HROW *m_pHRow;
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary_GetRowsByBookmarks,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember rgcbBookmarks==NULL; E_INVALIDARG
int Variation_1();
// @cmember prgBookmarks==NULL; E_INVALIDARG
int Variation_2();
// @cmember pcRowsObtained=NULL; E_INVALIDARG
int Variation_3();
// @cmember prghRows=NULL; E_INVALIDARG
int Variation_4();
// @cmember fReturnErrors==TRUE and pcErrors==NULL; E_INVALIDARG
int Variation_5();
// @cmember fReturnedErrors=TRUE and prgErrors=NULL; E_INVALIDARG
int Variation_6();
// @cmember fReturnErrors=FALSE and pcErrors=NULL; S_OK
int Variation_7();
// @cmember fReturnErrors=FALSE and prgErrors=NULl; S_OK
int Variation_8();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Boundary_GetRowsByBookmarks)
#define THE_CLASS Boundary_GetRowsByBookmarks
BEG_TEST_CASE(Boundary_GetRowsByBookmarks, TCIRowsetLocate, L"boundary conditions for GetRowsByBookmark")
TEST_VARIATION(1, L"rgcbBookmarks==NULL; E_INVALIDARG")
TEST_VARIATION(2, L"prgBookmarks==NULL; E_INVALIDARG")
TEST_VARIATION(3, L"pcRowsObtained=NULL; E_INVALIDARG")
TEST_VARIATION(4, L"prghRows=NULL; E_INVALIDARG")
TEST_VARIATION(5, L"fReturnErrors==TRUE and pcErrors==NULL; E_INVALIDARG")
TEST_VARIATION(6, L"fReturnedErrors=TRUE and prgErrors=NULL; E_INVALIDARG")
TEST_VARIATION(7, L"fReturnErrors=FALSE and pcErrors=NULL; S_OK")
TEST_VARIATION(8, L"fReturnErrors=FALSE and prgErrors=NULl; S_OK")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Boundary_Hash)
//--------------------------------------------------------------------
// @class boundary conditions for Hash
//
class Boundary_Hash : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
ULONG_PTR m_rgcbBookmarks[1];
BYTE *m_rgpBookmarks[1];
DBBOOKMARK m_DBBookmark;
DBHASHVALUE m_rgHashedValues[1];
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Boundary_Hash,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember cBookmarks==0, S_OK
int Variation_1();
// @cmember rgcbBookmarks==NULL; E_INVALIDARG
int Variation_2();
// @cmember rgpBookmark==NULL; E_INVALIDARG
int Variation_3();
// @cmember rgHashedvalues==NULL; E_INVALIDARG
int Variation_4();
// @cmember pcErros is valid and prgErrors=NULL; E_INVALIDARG
int Variation_5();
// @cmember pcErros=NULL, S_OK
int Variation_6();
// @cmember pcErros==NULL and prgErrors=NULL; S_OK
int Variation_7();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Boundary_Hash)
#define THE_CLASS Boundary_Hash
BEG_TEST_CASE(Boundary_Hash, TCIRowsetLocate, L"boundary conditions for Hash")
TEST_VARIATION(1, L"cBookmarks==0, S_OK")
TEST_VARIATION(2, L"rgcbBookmarks==NULL; E_INVALIDARG")
TEST_VARIATION(3, L"rgpBookmark==NULL; E_INVALIDARG")
TEST_VARIATION(4, L"rgHashedvalues==NULL; E_INVALIDARG")
TEST_VARIATION(5, L"pcErros is valid and prgErrors=NULL; E_INVALIDARG")
TEST_VARIATION(6, L"pcErros=NULL, S_OK")
TEST_VARIATION(7, L"pcErros==NULL and prgErrors=NULL; S_OK")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Zombie)
//--------------------------------------------------------------------
// @class zombie states
//
class Zombie : public CTransaction {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
DBPROPSET m_DBPropSet;
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Zombie,CTransaction);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Commit with retaining.
int Variation_1();
// @cmember Commit without retaining.
int Variation_2();
// @cmember Abort with retaining.
int Variation_3();
// @cmember Abort without retaining.
int Variation_4();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Zombie)
#define THE_CLASS Zombie
BEG_TEST_CASE(Zombie, CTransaction, L"zombie states")
TEST_VARIATION(1, L"Commit with retaining.")
TEST_VARIATION(2, L"Commit without retaining.")
TEST_VARIATION(3, L"Abort with retaining.")
TEST_VARIATION(4, L"Abort without retaining.")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Rowset_BigRowset)
//--------------------------------------------------------------------
// @class test basic functionality on a big rowset
//
class Rowset_BigRowset : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Rowset_BigRowset,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(Rowset_BigRowset)
#define THE_CLASS Rowset_BigRowset
BEG_TEST_CASE(Rowset_BigRowset, TCIRowsetLocate, L"test basic functionality on a big rowset")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(keysetCursor)
//--------------------------------------------------------------------
// @class test GetRowsAt via a keyset driven cursor
//
class keysetCursor : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(keysetCursor,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Bookmark points to the second row. lRowOffset=-1 cRows=-1. S_OK is returned and the first row handle is retrieved.
int Variation_1();
// @cmember *pBookmark points to the third row. lRowOffset=-1 and cRows=-3. DB_S_ENDOFROWSET is returned and the 2nd and 1st row handles
int Variation_2();
// @cmember *pBookmark points to the 4th row. lRowstOffset=-1 and cRows=-3. S_OK is returned. Do not release the row handle.
int Variation_3();
// @cmember *pBookmark=DBBMK_FIRST. Get one row handle at a time (lRowsetOffset==0 and cRows==1
int Variation_4();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(keysetCursor)
#define THE_CLASS keysetCursor
BEG_TEST_CASE(keysetCursor, TCIRowsetLocate, L"test GetRowsAt via a keyset driven cursor")
TEST_VARIATION(1, L"Bookmark points to the second row. lRowOffset=-1 cRows=-1. S_OK is returned and the first row handle is retrieved.")
TEST_VARIATION(2, L"*pBookmark points to the third row. lRowOffset=-1 and cRows=-3. DB_S_ENDOFROWSET is returned and the 2nd and 1st row handles")
TEST_VARIATION(3, L"*pBookmark points to the 4th row. lRowstOffset=-1 and cRows=-3. S_OK is returned. Do not release the row handle.")
TEST_VARIATION(4, L"*pBookmark=DBBMK_FIRST. Get one row handle at a time (lRowsetOffset==0 and cRows==1")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(ExtendedErrors)
//--------------------------------------------------------------------
// @class Extended Errors
//
class ExtendedErrors : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
//@cmember Extended error object
CExtError * m_pExtError;
ULONG_PTR m_cbBookmark;
BYTE *m_pBookmark;
DBBOOKMARK m_DBBookmark;
DBCOUNTITEM m_cRowsObtained;
HROW m_hRow;
HROW *m_pHRow;
BYTE *m_rgpBookmarks[2];
HROW m_rghRows[1];
ULONG_PTR m_rgcbBookmarks[1];
DBHASHVALUE m_rgHashedValues[1];
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ExtendedErrors,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Valid IRowsetLocate calls with previous error object existing.
int Variation_1();
// @cmember Valid IRowsetLocate calls with previous error object existing.
int Variation_2();
// @cmember valid IRowsetLocate calls with previous error object existing
int Variation_3();
// @cmember DB_E_CANTSCROLLBACKWARDS GetRowsAt call with previous error object existing
int Variation_4();
// @cmember E_INVALIDARG Compare call with previous error object existing
int Variation_5();
// @cmember E_INVALIDARG Hash call with previous error object existing
int Variation_6();
// @cmember E_INVALIDARG GetRowsByBookMark call with previous error object existing
int Variation_7();
// @cmember DB_E_CANTFETCHBACKWARDS GetRowsAt call with no previous error object existing
int Variation_8();
// @cmember DB_E_BADBOOKMARK Compare call with no previous error object existing
int Variation_9();
// @cmember E_INVALIDARG Hash call with no previous error object existing
int Variation_10();
// @cmember E_INVALIDARG GetRowsByBookMark call with no previous error object existing
int Variation_11();
// @cmember DB_E_BADSTARTPOSTION
int Variation_12();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ExtendedErrors)
#define THE_CLASS ExtendedErrors
BEG_TEST_CASE(ExtendedErrors, TCIRowsetLocate, L"Extended Errors")
TEST_VARIATION(1, L"Valid IRowsetLocate calls with previous error object existing.")
TEST_VARIATION(2, L"Valid IRowsetLocate calls with previous error object existing.")
TEST_VARIATION(3, L"valid IRowsetLocate calls with previous error object existing")
TEST_VARIATION(4, L"DB_E_CANTSCROLLBACKWARDS GetRowsAt call with previous error object existing")
TEST_VARIATION(5, L"E_INVALIDARG Compare call with previous error object existing")
TEST_VARIATION(6, L"E_INVALIDARG Hash call with previous error object existing")
TEST_VARIATION(7, L"E_INVALIDARG GetRowsByBookMark call with previous error object existing")
TEST_VARIATION(8, L"DB_E_CANTFETCHBACKWARDS GetRowsAt call with no previous error object existing")
TEST_VARIATION(9, L"DB_E_BADBOOKMARK Compare call with no previous error object existing")
TEST_VARIATION(10, L"E_INVALIDARG Hash call with no previous error object existing")
TEST_VARIATION(11, L"E_INVALIDARG GetRowsByBookMark call with no previous error object existing")
TEST_VARIATION(12, L"DB_E_BADSTARTPOSTION")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(DeleteRows)
//--------------------------------------------------------------------
// @class delete rows from the rowset
//
class DeleteRows : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(DeleteRows,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember *pBookmark points to a deleted row. DB_E_BADBOOKMARK is returned and no row handles will be retrieved.
int Variation_1();
// @cmember Delete the 4th row. *pBookmark points to the second row. lRowOffset=3 and cRows=1. S_OK
int Variation_2();
// @cmember Delete the 5th row. *pBookmark points to the 4th row. lRowOffset=1 and cRows=1. S_OK
int Variation_3();
// @cmember Delete the second row. Pass an array of 3 bookmarks: bookmark to the second row, to the first row, and to the second row. DB_
int Variation_4();
// @cmember Get the 3rd row handle. GetRowsAt. Delete the 3rd row. GetNextRows
int Variation_5();
// @cmember Position on 5th row. Delete 3rd row. Position on 3rd row. delete 5th row. Position on 5th row. Fetch from the 5th row
int Variation_6();
// @cmember Delete the 1st row. GetRowsAt based on standard bookmarks.
int Variation_7();
// @cmember Delete the last row. Fetch backwards one row handle. Fetch backwards again. GetRowsAt based on stand
int Variation_8();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(DeleteRows)
#define THE_CLASS DeleteRows
BEG_TEST_CASE(DeleteRows, TCIRowsetLocate, L"delete rows from the rowset")
TEST_VARIATION(1, L"*pBookmark points to a deleted row. DB_E_BADBOOKMARK is returned and no row handles will be retrieved.")
TEST_VARIATION(2, L"Delete the 4th row. *pBookmark points to the second row. lRowOffset=3 and cRows=1. S_OK")
TEST_VARIATION(3, L"Delete the 5th row. *pBookmark points to the 4th row. lRowOffset=1 and cRows=1. S_OK")
TEST_VARIATION(4, L"Delete the second row. Pass an array of 3 bookmarks: bookmark to the second row, to the first row, and to the second row. DB_")
TEST_VARIATION(5, L"Get the 3rd row handle. GetRowsAt. Delete the 3rd row. GetNextRows")
TEST_VARIATION(6, L"Position on 5th row. Delete 3rd row. Position on 3rd row. delete 5th row. Position on 5th row. Fetch from the 5th row")
TEST_VARIATION(7, L"Delete the 1st row. GetRowsAt based on standard bookmarks.")
TEST_VARIATION(8, L"Delete the last row. Fetch backwards one row handle. Fetch backwards again. GetRowsAt based on stand")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(RemoveDeleted)
//--------------------------------------------------------------------
// @class test DBPROP_REMOVEDELETED
//
class RemoveDeleted : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(RemoveDeleted,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember *pBookmark points to a deleted row. DB_E_BADBOOKMARK is returned.
int Variation_1();
// @cmember Delete the 3th row. *pBookmark points to the second row. lRowOffset=1 and cRows=3. DB_S_ENDOFROWSET
int Variation_2();
// @cmember Delete the 4th row. *pBookmark points to the 3th row. lRowOffset=1 and cRows=1. S_OK is returned and the 5th row handle is ret
int Variation_3();
// @cmember Delete the first row. Pass an array of bookmarks: bookmark to the first row and the second row.
int Variation_4();
// @cmember Delete the third row. Pass an array of two bookmarks: bookmark to the second and 4th row
int Variation_5();
// @cmember Delete 2nd row. pBookmark points to 4th row. cRows=-2, lOffset=-1. Verify 3rd and 1st row
int Variation_6();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(RemoveDeleted)
#define THE_CLASS RemoveDeleted
BEG_TEST_CASE(RemoveDeleted, TCIRowsetLocate, L"test DBPROP_REMOVEDELETED")
TEST_VARIATION(1, L"*pBookmark points to a deleted row. DB_E_BADBOOKMARK is returned.")
TEST_VARIATION(2, L"Delete the 3th row. *pBookmark points to the second row. lRowOffset=1 and cRows=3. DB_S_ENDOFROWSET")
TEST_VARIATION(3, L"Delete the 4th row. *pBookmark points to the 3th row. lRowOffset=1 and cRows=1. S_OK is returned and the 5th row handle is ret")
TEST_VARIATION(4, L"Delete the first row. Pass an array of bookmarks: bookmark to the first row and the second row.")
TEST_VARIATION(5, L"Delete the third row. Pass an array of two bookmarks: bookmark to the second and 4th row")
TEST_VARIATION(6, L"Delete 2nd row. pBookmark points to 4th row. cRows=-2, lOffset=-1. Verify 3rd and 1st row")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(BookmarkSkipped)
//--------------------------------------------------------------------
// @class Test DBPROP_BOOKMARKSKIPPPED
//
class BookmarkSkipped : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(BookmarkSkipped,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Delete the first row. *pBookmark=DBBMK_FISRT and lRowOffset=0 and cRows=5. DB_S_BOOKMARKSKIPPED
int Variation_1();
// @cmember Delete the last row. *pBookmark=DBBML_LAST and lRowOffset=0 and cRows=1. DB_S_BOOKMARKSKIPPED
int Variation_2();
// @cmember Delete the first row. *pBookmark=DBBMK_FISRT and lRowOffset=0 and cRows=1. DB_S_BOOKMARKSKIPPED
int Variation_3();
// @cmember Delete the second row. *pBookmark points to the second row and lRowOffset=1 and cRows=1. DB_S_BOOKMARKSKIPPED
int Variation_4();
// @cmember Delete the 5th row. Pass an array of two bookmarks: the bookmark to the 4th and 5th row. DB_S_ERRORSOCCURED
int Variation_5();
// @cmember Delete third row. *pBookmark=3rd row, lRowsOffset=-1, cRows=1, DB_S_BOOKMARKSKIPPED
int Variation_6();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(BookmarkSkipped)
#define THE_CLASS BookmarkSkipped
BEG_TEST_CASE(BookmarkSkipped, TCIRowsetLocate, L"Test DBPROP_BOOKMARKSKIPPPED")
TEST_VARIATION(1, L"Delete the first row. *pBookmark=DBBMK_FISRT and lRowOffset=0 and cRows=5. DB_S_BOOKMARKSKIPPED")
TEST_VARIATION(2, L"Delete the last row. *pBookmark=DBBML_LAST and lRowOffset=0 and cRows=1. DB_S_BOOKMARKSKIPPED")
TEST_VARIATION(3, L"Delete the first row. *pBookmark=DBBMK_FISRT and lRowOffset=0 and cRows=1. DB_S_BOOKMARKSKIPPED")
TEST_VARIATION(4, L"Delete the second row. *pBookmark points to the second row and lRowOffset=1 and cRows=1. DB_S_BOOKMARKSKIPPED")
TEST_VARIATION(5, L"Delete the 5th row. Pass an array of two bookmarks: the bookmark to the 4th and 5th row. DB_S_ERRORSOCCURED")
TEST_VARIATION(6, L"Delete third row. *pBookmark=3rd row, lRowsOffset=-1, cRows=1, DB_S_BOOKMARKSKIPPED")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(RemoveDeleted_BookmarkSkipped)
//--------------------------------------------------------------------
// @class Test DBPROP_REMOVEDELETED + DBPROP_BOOKMARKSKIPPED
//
class RemoveDeleted_BookmarkSkipped : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(RemoveDeleted_BookmarkSkipped,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Delete the first and the second row. *pBookmark=DBBMK_FIRST and lRowOffset=0 and cRows=4.
int Variation_1();
// @cmember Delete the first and the second row. *pBookmark=DBBMK_FIRST and lRowOffset=1 and cRows=1.
int Variation_2();
// @cmember Delete the 3th row. *pBookmark points to the second row. lRowOffset=1 and cRows=3. DB_S_ENDOFROWSET is returned and the 4th a
int Variation_3();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(RemoveDeleted_BookmarkSkipped)
#define THE_CLASS RemoveDeleted_BookmarkSkipped
BEG_TEST_CASE(RemoveDeleted_BookmarkSkipped, TCIRowsetLocate, L"Test DBPROP_REMOVEDELETED + DBPROP_BOOKMARKSKIPPED")
TEST_VARIATION(1, L"Delete the first and the second row. *pBookmark=DBBMK_FIRST and lRowOffset=0 and cRows=4.")
TEST_VARIATION(2, L"Delete the first and the second row. *pBookmark=DBBMK_FIRST and lRowOffset=1 and cRows=1.")
TEST_VARIATION(3, L"Delete the 3th row. *pBookmark points to the second row. lRowOffset=1 and cRows=3. DB_S_ENDOFROWSET is returned and the 4th a")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(ChangeRows)
//--------------------------------------------------------------------
// @class change rows in the rowset
//
class ChangeRows : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
IRowsetChange *m_pIRowsetChange;
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ChangeRows,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Change the first row and the 3rd row. *pBookmark=DBBMK_FISRT and lRowOffset=1 and cRow=1. The 3rd row is retrieved.
int Variation_1();
// @cmember Change the second row. *pBookmark points to the second row. lRowOffset=0 and cRow=2. The 3rd and 4th row handles are retriev
int Variation_2();
// @cmember Change the 1st and the last row. Pass an array of 3 bookmarks: bookmark to the first row, to the last row, and bookmark to the
int Variation_3();
// @cmember Change the second row. Pass an array of 2 bookmarks: invalid and bookmark to the second row. DB_S_ERRORSOCCURRED
int Variation_4();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ChangeRows)
#define THE_CLASS ChangeRows
BEG_TEST_CASE(ChangeRows, TCIRowsetLocate, L"change rows in the rowset")
TEST_VARIATION(1, L"Change the first row and the 3rd row. *pBookmark=DBBMK_FISRT and lRowOffset=1 and cRow=1. The 3rd row is retrieved.")
TEST_VARIATION(2, L"Change the second row. *pBookmark points to the second row. lRowOffset=0 and cRow=2. The 3rd and 4th row handles are retriev")
TEST_VARIATION(3, L"Change the 1st and the last row. Pass an array of 3 bookmarks: bookmark to the first row, to the last row, and bookmark to the")
TEST_VARIATION(4, L"Change the second row. Pass an array of 2 bookmarks: invalid and bookmark to the second row. DB_S_ERRORSOCCURRED")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(Empty_Rowset)
//*-----------------------------------------------------------------------
// @class Test empty rowset cases
//
class Empty_Rowset : public TCIRowsetLocate {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(Empty_Rowset,TCIRowsetLocate);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember GetRowsAt forward with DBMK_FIRST
int Variation_1();
// @cmember GetRowsAt backward with DBMK_LAST
int Variation_2();
// }} TCW_TESTVARS_END
} ;
// {{ TCW_TESTCASE(Empty_Rowset)
#define THE_CLASS Empty_Rowset
BEG_TEST_CASE(Empty_Rowset, TCIRowsetLocate, L"Test empty rowset cases")
TEST_VARIATION(1, L"GetRowsAt forward with DBMK_FIRST")
TEST_VARIATION(2, L"GetRowsAt backward with DBMK_LAST")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// }} END_DECLARE_TEST_CASES()
// {{ TCW_TESTMODULE(ThisModule)
TEST_MODULE(29, ThisModule, gwszModuleDescrip)
TEST_CASE(1, BOOKMARKS)
TEST_CASE(2, OrderedBookmarks)
TEST_CASE(3, OrderedBookmarks_Fetch_Scroll)
TEST_CASE(4, LiteralBookmarks)
TEST_CASE(5, Literal_Ordered_CanHoldRows)
TEST_CASE(6, ScrollBackwards)
TEST_CASE(7, FetchBackwards)
TEST_CASE(8, Scroll_Fetch)
TEST_CASE(9, Scroll_Fetch_CanHoldRows)
TEST_CASE(10, CanHoldRows)
TEST_CASE(11, MaxOpenRows)
TEST_CASE(12, Related_IRowset)
TEST_CASE(13, Rowset_SingleRow)
TEST_CASE(14, Consistency)
TEST_CASE(15, Parameters)
TEST_CASE(16, Boundary_Compare)
TEST_CASE(17, Boundary_GetRowsAt)
TEST_CASE(18, Boundary_GetRowsByBookmarks)
TEST_CASE(19, Boundary_Hash)
TEST_CASE(20, Zombie)
TEST_CASE(21, Rowset_BigRowset)
TEST_CASE(22, keysetCursor)
TEST_CASE(23, ExtendedErrors)
TEST_CASE(24, DeleteRows)
TEST_CASE(25, RemoveDeleted)
TEST_CASE(26, BookmarkSkipped)
TEST_CASE(27, RemoveDeleted_BookmarkSkipped)
TEST_CASE(28, ChangeRows)
TEST_CASE(29, Empty_Rowset)
END_TEST_MODULE()
// }} TCW_TESTMODULE_END
// {{ TCW_TC_PROTOTYPE(BOOKMARKS)
//*-----------------------------------------------------------------------
//| Test Case: BOOKMARKS - test DBPROP_BOOKMARKS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL BOOKMARKS::Init()
{
BOOL fTestPass = FALSE;
IRowsetInfo *pIRowsetInfo=NULL;
DBPROPIDSET DBPropIDSet;
DBPROPID DBPropID=DBPROP_CANHOLDROWS;
ULONG cProperty = 0;
DBPROPSET *pDBPropSet = NULL;
DBPropIDSet.rgPropertyIDs=&DBPropID;
DBPropIDSet.cPropertyIDs=1;
DBPropIDSet.guidPropertySet=DBPROPSET_ROWSET;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset and accessor. DBPROP_BOOKMARKS should be supported if
//IRowsetLocate is requested on the rowset
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate));
if(!VerifyInterface(m_pIRowsetLocate,IID_IRowsetInfo,
ROWSET_INTERFACE,(IUnknown **)&pIRowsetInfo))
goto CLEANUP;
if(!CHECK(pIRowsetInfo->GetProperties(1,&DBPropIDSet, &cProperty, &pDBPropSet), S_OK))
goto CLEANUP;
//check whether DBPROP_CANHOLDROWS is on
if(V_BOOL(&(pDBPropSet->rgProperties[0].vValue))==VARIANT_TRUE)
m_fHoldRows=TRUE;
else
m_fHoldRows=FALSE;
fTestPass = TRUE;
CLEANUP:
FreeProperties(&cProperty, &pDBPropSet);
SAFE_RELEASE(pIRowsetInfo);
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Compare return DBCOMPARE_NE for different rows and Hash return different hash value.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BOOKMARKS::Variation_1()
{
ULONG_PTR rgcbBookmarks[2];
BYTE * rgpBookmarks[2] = {NULL, NULL};
DBCOMPARE dwComparison = DBCOMPARE_EQ;
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass = FALSE;
//get the bookmark for the 5th row
if(!GetBookmark(5,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for the 3rd row
if(!GetBookmark(3,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//Compare return DBCOMPARE_NE for the different row
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
// don't supported ordered bookmarks
if(GetProp(DBPROP_ORDEREDBOOKMARKS))
{
if(!COMPARE(dwComparison, DBCOMPARE_GT))
goto CLEANUP;
}
else
{ // temp table
if(!COMPARE(dwComparison, DBCOMPARE_NE))
goto CLEANUP;
}
//Hash returns different values
if(!CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
goto CLEANUP;
if(rgHashedValues[0]!=rgHashedValues[1])
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Compare return DBCOMPARE_EQ for the same row and Hash return the same hash value.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BOOKMARKS::Variation_2()
{
ULONG_PTR rgcbBookmarks[2];
BYTE * rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_NE;
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass=FALSE;
//get the bookmark for the middle row
if(!GetBookmark(ULONG(g_lRowLast/2),&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for the middle row again
if(!GetBookmark(ULONG(g_lRowLast/2),&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//Compare return DBCOMPARE_EQ for the same row
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
//Hash returns same values
if(!CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
goto CLEANUP;
if(COMPARE(rgHashedValues[0], rgHashedValues[1]))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_FIRST and lRowsOffset=# of rows in the rowset. DB_S_ENDOFROWSET is returned and no row handles
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BOOKMARKS::Variation_3()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE * pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained;
HROW hRow[1];
HROW * pHRow=hRow;
HRESULT hr;
if(!CHECK(hr=m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,g_lRowLast,
1,&cRowsObtained,&pHRow),DB_S_ENDOFROWSET))
{
if(hr==ResultFromScode(S_OK))
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL, NULL),S_OK);
return TEST_FAIL;
}
//no row should be retrieved
if(!COMPARE(cRowsObtained, 0))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST and IRowsetOffset=1. DB_S_ENDOFROWSET is returned and no row handles is retrieved.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BOOKMARKS::Variation_4()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE * pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained;
HROW hRow[1];
HROW * pHRow=hRow;
HRESULT hr;
if(!CHECK(hr=m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,1,
1,&cRowsObtained,&pHRow),DB_S_ENDOFROWSET))
{
if(hr==ResultFromScode(S_OK))
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL, NULL),S_OK);
return TEST_FAIL;
}
//no row should be retrieved
if(!COMPARE(cRowsObtained, 0))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_FIRST and IRowsOffset=# of rows in the rowset-1. cRows=2. DB_S_ENDOFROWS is returned and the last row handl
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BOOKMARKS::Variation_5()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE * pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained=0;
HROW hRow[2];
HROW * pHRow=hRow;
HRESULT hr;
BOOL fTestPass=FALSE;
// *pBookmark points to the first row and IRowsOffset=# of rows in the rowset-1
if(!CHECK(hr=m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,g_lRowLast-1,
2,&cRowsObtained,&pHRow),DB_S_ENDOFROWSET))
{
if(hr==ResultFromScode(S_OK))
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL, NULL),S_OK);
else
CHECK(hr,S_OK);
return TEST_FAIL;
}
//the last row should be retrieved
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(hRow[0],g_lRowLast,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,hRow,NULL,NULL,NULL),S_OK);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST and IRowsetOffset==0. cRows=1. S_OK is returned and the last row handle is retrieved.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BOOKMARKS::Variation_6()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE * pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained;
HROW hRow[1];
HROW * pHRow=hRow;
// *pBookmark=DBBMK_LAST and IRowsetOffset==0. cRows=1.
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,
1,&cRowsObtained,&pHRow),S_OK))
return TEST_FAIL;
//the last row should be retrieved
if(!COMPARE(cRowsObtained, 1))
return TEST_FAIL;
if(!CHECK(m_pIRowset->ReleaseRows(1,hRow,NULL,NULL,NULL),S_OK))
return TEST_FAIL;
//repeat
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,
1,&cRowsObtained,&pHRow),S_OK))
return TEST_FAIL;
//the last row should be retrieved
if(!COMPARE(cRowsObtained, 1))
return TEST_FAIL;
COMPARE(VerifyRowPosition(hRow[0],g_lRowLast,g_pCTable),TRUE);
if(!CHECK(m_pIRowset->ReleaseRows(1,hRow,NULL,NULL,NULL),S_OK))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_FIRST. Get one row handle at a time (lRowsetOffset==0 and cRows==1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BOOKMARKS::Variation_7()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE * pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained;
HROW hRow[1];
HROW * pHRow=hRow;
DBCOUNTITEM cRowCount;
//get one row handle at a time, from the first row
for(cRowCount=0; cRowCount<ULONG(g_lRowLast); cRowCount++)
{
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,cRowCount,
1,&cRowsObtained,&pHRow),S_OK))
return TEST_FAIL;
//verify the row position
if(!COMPARE(VerifyRowPosition(hRow[0],cRowCount+1,g_pCTable),TRUE))
{
CHECK(m_pIRowset->ReleaseRows(1,hRow,NULL,NULL,NULL),S_OK);
return TEST_FAIL;
}
else
CHECK(m_pIRowset->ReleaseRows(1,hRow,NULL,NULL,NULL),S_OK);
}
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Pass an array of bookmarks, one bookmark for each row handle. S_OK and all the row handles in the rowset should be r
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BOOKMARKS::Variation_8()
{
ULONG_PTR * rgcbBookmarks;
BYTE ** rgpBookmarks;
HROW * rgHRow;
DBCOUNTITEM cRowCount;
BOOL fTestPass=FALSE;
rgcbBookmarks = (ULONG_PTR *)PROVIDER_ALLOC(sizeof(ULONG_PTR)*g_lRowLast);
rgpBookmarks = (BYTE **)PROVIDER_ALLOC(sizeof(BYTE *)*g_lRowLast);
rgHRow = (HROW *)PROVIDER_ALLOC(sizeof(HROW)*g_lRowLast);
//get bookmarks for each row in the row set
for(cRowCount=0;cRowCount<ULONG(g_lRowLast);cRowCount++)
//init the pointer
rgpBookmarks[cRowCount]=NULL;
for(cRowCount=0;cRowCount<ULONG(g_lRowLast);cRowCount++)
{
if(!GetBookmark(cRowCount+1,&rgcbBookmarks[cRowCount],&rgpBookmarks[cRowCount]))
goto CLEANUP;
}
//get the row handles
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,g_lRowLast,rgcbBookmarks,
(const BYTE **)rgpBookmarks,rgHRow,NULL),S_OK))
goto CLEANUP;
//make sure the row handle are retrieved correct
for(cRowCount=0; cRowCount<ULONG(g_lRowLast); cRowCount++)
{
if(!COMPARE(VerifyRowPosition(rgHRow[cRowCount], cRowCount+1,g_pCTable),TRUE))
goto CLEANUP;
}
fTestPass=TRUE;
CLEANUP:
//release all the bookmark
for(cRowCount=0;cRowCount<ULONG(g_lRowLast);cRowCount++)
PROVIDER_FREE(rgpBookmarks[cRowCount]);
//release all the rows
CHECK(m_pIRowset->ReleaseRows(g_lRowLast,rgHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(rgpBookmarks);
PROVIDER_FREE(rgcbBookmarks);
PROVIDER_FREE(rgHRow);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc Pass an array of two bookmarks that point to the same row. S_OK and the row handle is retrieved twice.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BOOKMARKS::Variation_9()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
HROW rgHRow[2];
DBREFCOUNT cRefCount;
DBROWSTATUS rgDBRowStatus[2];
BOOL fTestPass=FALSE;
//get the bookmark for the 10th row
if(!GetBookmark(ULONG_PTR(g_lRowLast/3),&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for the 10th row again
if(!GetBookmark(ULONG_PTR(g_lRowLast/3),&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//get the row handle
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHRow,rgDBRowStatus),S_OK))
goto CLEANUP;
if(!(COMPARE(rgDBRowStatus[0], DBROWSTATUS_S_OK) &&
COMPARE(rgDBRowStatus[1], DBROWSTATUS_S_OK)))
goto CLEANUP;
//Release the row handle, The reference count should be 1
if(!CHECK(m_pIRowset->ReleaseRows(1,rgHRow,NULL,&cRefCount,NULL),S_OK))
goto CLEANUP;
//If the HRows are the same ref count should be 1 after release
if(!COMPARE(cRefCount,ULONG_PTR(((rgHRow[0] == rgHRow[1]) ? 1 : 0))))
goto CLEANUP;
//release again
if(!CHECK(m_pIRowset->ReleaseRows(1,&(rgHRow[1]),NULL,&cRefCount,NULL),S_OK))
goto CLEANUP;
fTestPass = TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc Pass a bookmark to the second row. Retrieve it. Pass a bookmark to the first row, DB_E_ROWSNOTRELEASED should be returned. R
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BOOKMARKS::Variation_10()
{
ULONG_PTR cbFirstBookmark;
ULONG_PTR cbSecondBookmark;
BYTE *pFirstBookmark=NULL;
BYTE *pSecondBookmark=NULL;
HROW FirstHRow=NULL;
HROW SecondHRow=NULL;
DBROWSTATUS DBRowStatus;
BOOL fTestPass=FALSE;
//get the bookmark for the first row
if(!GetBookmark(1, &cbFirstBookmark, &pFirstBookmark))
return TEST_FAIL;
//get the bookmark for the second row
if(!GetBookmark(2, &cbSecondBookmark, &pSecondBookmark))
goto CLEANUP;
//retrieve the first row handle
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbFirstBookmark,
(const BYTE **)&pFirstBookmark,&FirstHRow,
&DBRowStatus),S_OK))
goto CLEANUP;
COMPARE(DBRowStatus, DBROWSTATUS_S_OK);
if(!m_fHoldRows)
{
//try to retrieve the second row handle
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbSecondBookmark,
(const BYTE **)&pSecondBookmark,&SecondHRow,
NULL),DB_E_ROWSNOTRELEASED))
goto CLEANUP;
//SecondHRow should be DB_NULL_HROW
COMPARE(SecondHRow, DB_NULL_HROW);
}
else
{
//try to retrieve the second row handle
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbSecondBookmark,
(const BYTE **)&pSecondBookmark,&SecondHRow,
NULL),S_OK))
goto CLEANUP;
}
//release the first row handle
CHECK(m_pIRowset->ReleaseRows(1,&FirstHRow,NULL,NULL,NULL),S_OK);
FirstHRow=NULL;
//try to retrieve the second row handle again
if(CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbSecondBookmark,
(const BYTE **)&pSecondBookmark,&SecondHRow,
NULL),S_OK))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(pFirstBookmark);
PROVIDER_FREE(pSecondBookmark);
//release the row handle
if(FirstHRow)
CHECK(m_pIRowset->ReleaseRows(1,&FirstHRow,NULL,NULL,NULL),S_OK);
if(SecondHRow)
CHECK(m_pIRowset->ReleaseRows(1,&SecondHRow,NULL,NULL,NULL),S_OK);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL BOOKMARKS::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(OrderedBookmarks)
//*-----------------------------------------------------------------------
//| Test Case: OrderedBookmarks - test DBPROP_ORDEREDBOOKMARKS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL OrderedBookmarks::Init()
{
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset by a join statement;create an accessor.
//DBPROP_ORDEREDBOOKMARKS is requested and
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetLocate));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Compare return DBCOMPARE_EQ for the same row and Hash return the same hash value.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int OrderedBookmarks::Variation_1()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_NE;
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass=FALSE;
//get the bookmark for the 40th row
if(!GetBookmark(g_lRowLast-2,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for the 40th row again
if(!GetBookmark(g_lRowLast-2,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//Compare return DBCOMPARE_EQ for the same row
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
//Hash returns same values
if(!CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
goto CLEANUP;
if(COMPARE(rgHashedValues[0], rgHashedValues[1]))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc The first bookmark is after the second. Compare return DBCOMPARE_GT for the row and Hash return a bigger hash value for the fir
//
// @rdesc TEST_PASS or TEST_FAIL
//
int OrderedBookmarks::Variation_2()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_NE;
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass=FALSE;
//get the bookmark for the 5th row
if(!GetBookmark(5,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for the 2nd row again
if(!GetBookmark(2,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//Compare return DBCOMPARE_GT for the same row
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
if(GetProp(DBPROP_ORDEREDBOOKMARKS))
{
if(!COMPARE(dwComparison, DBCOMPARE_GT))
goto CLEANUP;
//Hash returns a bigger value for the first row handle
if(CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
fTestPass=TRUE;
//hash values are not necessary in this order
//if(rgHashedValues[0] > rgHashedValues[1])
// fTestPass=TRUE;
}
else
{
if(COMPARE(dwComparison, DBCOMPARE_NE))
fTestPass=TRUE;
}
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL OrderedBookmarks::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(OrderedBookmarks_Fetch_Scroll)
//*-----------------------------------------------------------------------
//| Test Case: OrderedBookmarks_Fetch_Scroll - DBPROP_ORDEREDBOOKMARKS + DBPROP_CANFETCHBACKWARDS + DBPROP_CANSCROLLBACKWARDS
//| DBPROP_ORDEREDBOOKMARKS + DBPROP_CANFETCHBACKWARDS + DBPROP_CANSCROLLBACKWARDS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL OrderedBookmarks_Fetch_Scroll::Init()
{
BOOL fTestPass = FALSE;
DBPROPID guidPropertySet[3];
ULONG cPrptSet=0;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
guidPropertySet[cPrptSet++]=DBPROP_CANFETCHBACKWARDS;
guidPropertySet[cPrptSet++]=DBPROP_CANSCROLLBACKWARDS;
guidPropertySet[cPrptSet++]=DBPROP_ORDEREDBOOKMARKS;
//create a rowset by a join statement; create an accessor.
//DBPROP_ORDEREDBOOKMARKS,DBPROP_CANFETCHBACKWARDS and DBPROP_CANSCROLLBACKWARDS
//are requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc The first bookmark is before the second. Compare return for the row and Hash return a smaller hash value for the first bookmar
//
// @rdesc TEST_PASS or TEST_FAIL
//
int OrderedBookmarks_Fetch_Scroll::Variation_1()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_NE;
DBHASHVALUE rgHashedValues[2];
DBCOUNTITEM cRowsObtained;
HROW *pHRow=NULL;
BOOL fTestPass=FALSE;
//get the bookmark for the 3th 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;
//Compare return DBCOMPARE_LT
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_LT))
goto CLEANUP;
//Hash returns a smaller value for the first row handle
if(!CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
goto CLEANUP;
//make sure we can retrieve the 3rd row handle using a Ordered Bookmark
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,rgcbBookmarks[0],
rgpBookmarks[0],0,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 1);
if(COMPARE(VerifyRowPosition(*pHRow,3,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
//free the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL OrderedBookmarks_Fetch_Scroll::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(LiteralBookmarks)
//*-----------------------------------------------------------------------
//| Test Case: LiteralBookmarks - test DBPROP_LITERALBOOKMARKS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL LiteralBookmarks::Init()
{
DBPROPID guidPropertySet=DBPROP_LITERALBOOKMARKS;
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset; create an accessor.
//DBPROP_LITERALBOOKMARKS is requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
1, &guidPropertySet));
if(GetProp(DBPROP_ORDEREDBOOKMARKS))
m_fOrderedBookmark=TRUE;
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Compare the bookmarks for the different row directly, based on the data type of the bookmark.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int LiteralBookmarks::Variation_1()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_EQ;
DBHASHVALUE rgHashedValues[2];
DBCOUNTITEM cRowsObtained;
HROW *pHRow=NULL;
BOOL fTestPass=FALSE;
//get the bookmark a row near the end
if(!GetBookmark(g_lRowLast-4,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark very close to the end
if(!GetBookmark(g_lRowLast-2,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//compare the two bookmarks literally
if(!CompareLiteralBookmark(rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1], rgpBookmarks[1], &dwComparison))
goto CLEANUP;
if(dwComparison==DBCOMPARE_EQ)
goto CLEANUP;
//reset dwComparison
dwComparison=DBCOMPARE_EQ;
//Compare return DBCOMPARE_NE for the different row
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
if ( m_fOrderedBookmark )
{
if(!COMPARE(dwComparison, DBCOMPARE_LT))
goto CLEANUP;
}
else
{
if(!COMPARE(dwComparison, DBCOMPARE_NE))
goto CLEANUP;
}
//Hash returns different value
if(!CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
goto CLEANUP;
if(rgHashedValues[0] == rgHashedValues[1])
goto CLEANUP;
//make sure we can retrieve the row handle using a Ordered Bookmark
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,rgcbBookmarks[0],
rgpBookmarks[0],0,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 1);
if(COMPARE(VerifyRowPosition(*pHRow,g_lRowLast-4,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
//free the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Compare the bookmarks for the same row directly, based on the data type of the bookmark.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int LiteralBookmarks::Variation_2()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_NE;
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass=FALSE;
//get the bookmark for the 4th row
if(!GetBookmark(4,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for the 4th row again
if(!GetBookmark(4,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//compare the two bookmarks literally
if(!CompareLiteralBookmark(rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1], rgpBookmarks[1], &dwComparison))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
//reset dwComparison
dwComparison=DBCOMPARE_NE;
//Compare return DBCOMPARE_EQ
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
//Hash returns same values
if(!CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
goto CLEANUP;
if(COMPARE(rgHashedValues[0], rgHashedValues[1]))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL LiteralBookmarks::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Literal_Ordered_CanHoldRows)
//*-----------------------------------------------------------------------
//| Test Case: Literal_Ordered_CanHoldRows - Test DBPROP_LITERALBOOKMARKS + DBPROP_ORDEREDBOOKMARKS + DBPROP_CANHOLDROWS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Literal_Ordered_CanHoldRows::Init()
{
DBPROPID guidPropertySet[3];
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
guidPropertySet[cPrptSet++]=DBPROP_LITERALBOOKMARKS;
guidPropertySet[cPrptSet++]=DBPROP_CANHOLDROWS;
guidPropertySet[cPrptSet++]=DBPROP_ORDEREDBOOKMARKS;
//create a rowset; create an accessor.
//DBPROP_ORDEREDBOOKMARKS,DBPROP_LITERALBOOKMARKS and DBPROP_CANHOLDROWS
//are requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ABCANDCOLLIST, IID_IRowsetLocate,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc The first bookmark is after the second. Compare the bookmarks directly, based on the data type of the bookmark.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Literal_Ordered_CanHoldRows::Variation_1()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_EQ;
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass=FALSE;
//get the bookmark for the middle row
if(!GetBookmark(g_lRowLast/2,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for an earlier row again
if(!GetBookmark(g_lRowLast/3,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//compare the two bookmarks literally
if(!CompareLiteralBookmark(rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1], rgpBookmarks[1], &dwComparison))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_GT))
goto CLEANUP;
//reset dwComparison
dwComparison=DBCOMPARE_EQ;
//Compare return DBCOMPARE_GT
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_GT))
goto CLEANUP;
//Hash returns bigger value for the first bookmark
if(!CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
goto CLEANUP;
if(rgHashedValues[0] > rgHashedValues[1])
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc The first bookmark is before the second. Compare the bookmarks directly, based on the data type of the bookmark.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Literal_Ordered_CanHoldRows::Variation_2()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_EQ;
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass=FALSE;
//get the bookmark for a row
if(!GetBookmark(g_lRowLast/4,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for a later row
if(!GetBookmark(g_lRowLast/2,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//compare the two bookmarks literally
if(!CompareLiteralBookmark(rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1], rgpBookmarks[1], &dwComparison))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_LT))
goto CLEANUP;
//reset dwComparison
dwComparison=DBCOMPARE_EQ;
//Compare return DBCOMPARE_LT
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_LT))
goto CLEANUP;
//Hash returns smaller value for the first bookmark
if(!CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
goto CLEANUP;
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc The first bookmark is the same as the second. Compare the bookmarks directly, based on the data type of the bookmark.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Literal_Ordered_CanHoldRows::Variation_3()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_NE;
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass=FALSE;
//get a bookmark
if(!GetBookmark(g_lRowLast-5,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get same bookmark again
if(!GetBookmark(g_lRowLast-5,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//compare the two bookmarks literally
if(!CompareLiteralBookmark(rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1], rgpBookmarks[1], &dwComparison))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
//reset dwComparison
dwComparison=DBCOMPARE_NE;
//Compare return DBCOMPARE_EQ
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
//Hash returns same value
if(!CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
goto CLEANUP;
if(COMPARE(rgHashedValues[0], rgHashedValues[1]))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Literal_Ordered_CanHoldRows::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(ScrollBackwards)
//*-----------------------------------------------------------------------
//| Test Case: ScrollBackwards - Test DBPROP_CANSCROLLBACKWARDS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ScrollBackwards::Init()
{
DBPROPID guidPropertySet;
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset and an accessor.
//DBPROP_CANSCROLLBACKWARDS is requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
cPrptSet,&guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_FIRST and lRowsetOffset=-1. DB_S_ENDOFROWSET is returned and no row handles is retrieved.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained=5;
HROW *pHRow=NULL;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL, NULL, 1, pBookmark, -1,
1,&cRowsObtained, &pHRow),DB_S_ENDOFROWSET))
return TEST_FAIL;
if(!COMPARE(cRowsObtained, 0))
return TEST_FAIL;
if(!COMPARE(pHRow,NULL))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST and lRowsetOffset=-(# of rows in the rowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBROWOFFSET lRowOffset=g_lRowLast;
DBCOUNTITEM cRowsObtained;
HROW *pHRow=NULL;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL, NULL, 1, pBookmark, -lRowOffset,
3,&cRowsObtained, &pHRow),DB_S_ENDOFROWSET))
return TEST_FAIL;
if(!COMPARE(cRowsObtained, 0))
return TEST_FAIL;
if(!COMPARE(pHRow,NULL))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark is the bookmark on the second row of the rowset. lRowsetOffset=-1, cRows=# of rows in the rowset. S_OK is returned
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ScrollBackwards::Variation_3()
{
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
DBCOUNTITEM cRowsObtained=0;
HROW *pHRow=NULL;
DBCOUNTITEM cRowCount;
BOOL fTestPass=FALSE;
//pBookmark is the bookmark on the second row of the rowset.
if(!GetBookmark(2,&cbBookmark,&pBookmark))
goto CLEANUP;
// lRowsetOffset=-1, cRows=# of rows in the rowset
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,
-1,g_lRowLast,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(cRowsObtained, ULONG(g_lRowLast)))
goto CLEANUP;
//make sure the row handles are returned in the traversal order
for(cRowCount=0; cRowCount<cRowsObtained; cRowCount++)
{
if(!COMPARE(VerifyRowPosition(pHRow[cRowCount],cRowCount+1,g_pCTable),TRUE))
goto CLEANUP;
}
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(pBookmark);
//releaset the rowhandle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ScrollBackwards::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(FetchBackwards)
//*-----------------------------------------------------------------------
//| Test Case: FetchBackwards - test DBPROP_CANFETCHBACKWARDS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL FetchBackwards::Init()
{
DBPROPID guidPropertySet=DBPROP_CANFETCHBACKWARDS;
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS is requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
1,&guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_FIRST and lRowsetOffset==1. cRows=-3. DB_S_ENDOFROWSET is returned and only two row handle is retrieved.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained=0;
HROW *pHRow=NULL;
BOOL fTestPass=FALSE;
// *pBookmark=DBBMK_FIRST and lRowsetOffset==1. cRows=-3.
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,
1,-3,&cRowsObtained,&pHRow),DB_S_ENDOFROWSET))
goto CLEANUP;
if(!COMPARE(cRowsObtained, 2))
goto CLEANUP;
//make sure the row handles are returned in the order of 2nd row and 1st row
if(!COMPARE(VerifyRowPosition(*pHRow, 2,g_pCTable),TRUE))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(pHRow[1],1,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//releaset the rowhandle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST and lRowsetOffset==0. cRows=-6. DB_S_ENDOFROWSET is returned and only 5 row handles are retrieved. Ver
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained=0;
HROW *pHRow = NULL;
DBCOUNTITEM cRowCount;
BOOL fTestPass=FALSE;
pHRow = (HROW *)PROVIDER_ALLOC(sizeof(HROW)*g_lRowLast);
// *pBookmark=DBBMK_LAST and lRowsetOffset==0.
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,
0,-(g_lRowLast+1),&cRowsObtained,&pHRow),DB_S_ENDOFROWSET))
goto CLEANUP;
if(!COMPARE(cRowsObtained, ULONG(g_lRowLast)))
goto CLEANUP;
//make sure the row handles are returned in the traversal order
for(cRowCount=0; cRowCount<cRowsObtained; cRowCount++)
{
if(!COMPARE(VerifyRowPosition(pHRow[cRowCount],cRowsObtained-cRowCount,g_pCTable),TRUE))
goto CLEANUP;
}
fTestPass=TRUE;
CLEANUP:
//releaset the rowhandle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow,NULL,NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark is the bookmark on the 4th row. lRowsetOffset=1 and cRows=-2. S_OK is returned and the 5th and the 4th row handles
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_3()
{
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
DBCOUNTITEM cRowsObtained=0;
HROW *pHRow=NULL;
BOOL fTestPass=FALSE;
//get the bookmark for the 4th row
if(!GetBookmark(4,&cbBookmark,&pBookmark))
goto CLEANUP;
//lRowsetOffset=1 and cRows=-2
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,1,-2,
&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//the 5th and 4th row handles should be retrieved
if(!COMPARE(cRowsObtained, 2))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(*pHRow,5,g_pCTable),TRUE))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(pHRow[1],4,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(pBookmark);
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST. Get one row handle at a time (lRowsetOffset==0 and cRows==-1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int FetchBackwards::Variation_4()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained=0;
HROW *pHRow=NULL;
DBROWCOUNT cRowCount=0;
BOOL fTestPass=TRUE;
while(fTestPass && (cRowCount<g_lRowLast))
{
//get the row handle
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,-cRowCount,
1,&cRowsObtained,&pHRow),S_OK))
fTestPass=FALSE;
if(fTestPass)
{
if(!COMPARE(VerifyRowPosition(*pHRow, g_lRowLast-cRowCount,g_pCTable),TRUE))
fTestPass=FALSE;
}
//release the row handle
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
cRowCount++;
}
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL FetchBackwards::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Scroll_Fetch)
//*-----------------------------------------------------------------------
//| Test Case: Scroll_Fetch - test DBPROP_CANSCROLLBACKWARDS + DBPROP_CANFETCHBACKWARDS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_Fetch::Init()
{
DBPROPID guidPropertySet[2];
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
guidPropertySet[cPrptSet++]=DBPROP_CANFETCHBACKWARDS;
guidPropertySet[cPrptSet++]=DBPROP_CANSCROLLBACKWARDS;
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS and DBPROP_CANSCROLLBACKWARDS are requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_LAST and lRowOffset=-2. cRows=-3. The third, 4th, and 5th row handles are retrieved. *pBoolmark=DBBMK_FIRST
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained;
HROW *pHRow=NULL;
BOOL fTestPass=FALSE;
// *pBookmark=DBBMK_LAST and lRowOffset=2-g_lRowLast. cRows=-3
//The third, 2nd, and 1st row handles are retrieved
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,3-g_lRowLast,-3,
&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(cRowsObtained, 3))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(pHRow[0],3,g_pCTable),TRUE))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(pHRow[1],2,g_pCTable),TRUE))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(pHRow[2],1,g_pCTable),TRUE))
goto CLEANUP;
// *pBookmark=DBBMK_FIRST, lRowOffset=1 and cRows=5. Return DB_E_ROWSNOTRELEASED
DBBookmark=DBBMK_FIRST;
if ( !GetProp(DBPROP_CANHOLDROWS) )
{
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,1,5,
&cRowsObtained,&pHRow),DB_E_ROWSNOTRELEASED))
goto CLEANUP;
}
//release the row handles
CHECK(m_pIRowset->ReleaseRows(3, pHRow,NULL, NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark=DBBMK_FIRST, lRowOffset=1 and cRows=g_lRowLast. Return DB_S_ENDOFROWSET
DBBookmark=DBBMK_FIRST;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,1,g_lRowLast,
&cRowsObtained,&pHRow),DB_S_ENDOFROWSET))
goto CLEANUP;
//make sure all but one row is retrieved and the 1st row retrieved is the 2nd row
if(!COMPARE(cRowsObtained, ULONG(g_lRowLast-1)))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(pHRow[0],2,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow,NULL,NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc cRows == LONG_MIN
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch::Variation_2()
{
ULONG_PTR cbBookmark;
BYTE* pBookmark = NULL;
DBCOUNTITEM cRowsObtained = 0;
HROW* pHRow = NULL;
DBCOUNTITEM cRowCount;
BOOL fTestPass = FALSE;
//Get the last bookmark
TESTC(GetBookmark(g_lRowLast,&cbBookmark,&pBookmark));
// cRows == LONG_MIN, lRowsOffset = 0
TEST2C_(m_hr = m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,
0,LONG_MIN,&cRowsObtained,&pHRow),DB_S_ENDOFROWSET,E_OUTOFMEMORY);
//make sure the row handles are returned in reverse order
if (m_hr == DB_S_ENDOFROWSET)
{
TESTC(cRowsObtained == ULONG(g_lRowLast));
for(cRowCount=0; cRowCount<cRowsObtained; cRowCount++)
TESTC(VerifyRowPosition(pHRow[cRowCount],g_lRowLast-cRowCount,g_pCTable));
}
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(pBookmark);
//releaset the rowhandle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
return fTestPass;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc lRowsOffset == LONG_MIN
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch::Variation_3()
{
ULONG_PTR cbBookmark;
BYTE* pBookmark = NULL;
DBCOUNTITEM cRowsObtained = 0;
HROW* pHRow = NULL;
BOOL fTestPass = FALSE;
//Get the last bookmark
TESTC(GetBookmark(g_lRowLast,&cbBookmark,&pBookmark));
// cRows == 1, lRowsOffset == LONG_MIN
TEST2C_(m_hr = m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,
LONG_MIN,1,&cRowsObtained,&pHRow),DB_S_ENDOFROWSET,E_OUTOFMEMORY);
TESTC(cRowsObtained == 0);
TESTC(pHRow == NULL);
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(pBookmark);
//release the rowhandle
if (pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc cRows = LONG_MAX/2 + 1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch::Variation_4()
{
ULONG_PTR cbBookmark;
BYTE * pBookmark = NULL;
DBCOUNTITEM cRowsObtained = 0;
HROW * pHRow = NULL;
DBCOUNTITEM cRowCount;
BOOL fTestPass = FALSE;
//Get the first bookmark
TESTC(GetBookmark(1,&cbBookmark,&pBookmark));
// cRows == LONG_MAX/2 +1 == 1073741824, lRowsOffset = 0
TEST2C_(m_hr = m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,
0,MAXDBROWCOUNT/2+1,&cRowsObtained,&pHRow),DB_S_ENDOFROWSET,E_OUTOFMEMORY);
//make sure the row handles are returned in reverse order
if (m_hr == DB_S_ENDOFROWSET)
{
TESTC(cRowsObtained == ULONG_PTR(g_lRowLast));
for(cRowCount=0; cRowCount<cRowsObtained; cRowCount++)
TESTC(VerifyRowPosition(pHRow[cRowCount], cRowCount+1, g_pCTable));
}
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(pBookmark);
//releaset the rowhandle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
return fTestPass;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_Fetch::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Scroll_Fetch_CanHoldRows)
//*-----------------------------------------------------------------------
//| Test Case: Scroll_Fetch_CanHoldRows - Test DBPROP_CANSCROLLBACKWARDS + DBPROP_CANFETCHBACKWARDS + DBPROP_CANHOLDROWS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_Fetch_CanHoldRows::Init()
{
DBPROPID guidPropertySet[3];
ULONG cPrptSet=0;
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
guidPropertySet[cPrptSet++]=DBPROP_CANFETCHBACKWARDS;
guidPropertySet[cPrptSet++]=DBPROP_CANSCROLLBACKWARDS;
guidPropertySet[cPrptSet++]=DBPROP_CANHOLDROWS;
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS and DBPROP_CANSCROLLBACKWARDS and DBPROP_CANHOLDROWS
//are requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc pBookmark points to the second row. lRowOffset=-1 cRows=-1. S_OK is returned and the first row handle is retrieved.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_CanHoldRows::Variation_1()
{
ULONG_PTR cbBookmark=0;
BYTE *pBookmark=NULL;
DBCOUNTITEM cRowsObtained=0;
HROW *pHRow=NULL;
BOOL fTestPass=FALSE;
//get a bookmark for the second row
if(!GetBookmark(2,&cbBookmark,&pBookmark))
goto CLEANUP;
//lRowOffset=-1 cRows=-1
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark, -1, -1,
&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//only one row should be retrieved
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//the first row should be retrieved
if(COMPARE(VerifyRowPosition(*pHRow, 1, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the bookmark
PROVIDER_FREE(pBookmark);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark points to the third row. lRowOffset=-1 and cRows=-3. DB_S_ENDOFROWSET is returned and the 2nd and 1st row handles
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_CanHoldRows::Variation_2()
{
ULONG_PTR cbBookmark=0;
BYTE *pBookmark=NULL;
DBCOUNTITEM cRowsObtained=0;
HROW *pHRow=NULL;
BOOL fTestPass=FALSE;
//get a bookmark for the third row
if(!GetBookmark(3,&cbBookmark,&pBookmark))
goto CLEANUP;
//lRowOffset=-1 cRows=-3
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark, -1, -3,
&cRowsObtained,&pHRow),DB_S_ENDOFROWSET))
goto CLEANUP;
//two rows should be retrieved
if(!COMPARE(cRowsObtained, 2))
goto CLEANUP;
//the second row should be retrieved first
if(!COMPARE(VerifyRowPosition(*pHRow, 2, g_pCTable),TRUE))
goto CLEANUP;
//the first row should be retrieved
if(COMPARE(VerifyRowPosition(pHRow[1], 1, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the bookmark
PROVIDER_FREE(pBookmark);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark points to the 4th row. lRowstOffset=-1 and cRows=-3. S_OK is returned. Do not release the row handle. *pBookmar
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Scroll_Fetch_CanHoldRows::Variation_3()
{
ULONG_PTR cbFirstBookmark=0, cbSecondBookmark=0;
BYTE *pFirstBookmark=NULL, *pSecondBookmark=NULL;
DBCOUNTITEM cFirstRowsObtained=0, cSecondRowsObtained=0;
HROW *pFirstHRow=NULL;
HROW *pSecondHRow=NULL;
BOOL fTestPass=FALSE;
//get a bookmark for the 4th row
if(!GetBookmark(4,&cbFirstBookmark,&pFirstBookmark))
goto CLEANUP;
//get a bookmark for the 5th row
if(!GetBookmark(5,&cbSecondBookmark,&pSecondBookmark))
goto CLEANUP;
//lRowOffset=-1 cRows=-3
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbFirstBookmark,pFirstBookmark, -1, -3,
&cFirstRowsObtained,&pFirstHRow),S_OK))
goto CLEANUP;
//three rows should be retrieved
if(!COMPARE(cFirstRowsObtained, 3))
goto CLEANUP;
//the third row is the first row handle to retrieve
if(!COMPARE(VerifyRowPosition(*pFirstHRow, 3, g_pCTable),TRUE))
goto CLEANUP;
// *pBookmark points to the 5th row. lRowstOffset=-1 and cRows=-1.
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbSecondBookmark,pSecondBookmark,
-1, -1, &cSecondRowsObtained,&pSecondHRow),S_OK))
goto CLEANUP;
//only one row should be retrieved
if(!COMPARE(cSecondRowsObtained, 1))
goto CLEANUP;
//the 4th row handle should be retrieved
if(COMPARE(VerifyRowPosition(*pSecondHRow, 4, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the bookmark
PROVIDER_FREE(pFirstBookmark);
PROVIDER_FREE(pSecondBookmark);
//release the row handle
if(pFirstHRow)
{
CHECK(m_pIRowset->ReleaseRows(cFirstRowsObtained,pFirstHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pFirstHRow);
}
//release the row handle
if(pSecondHRow)
{
CHECK(m_pIRowset->ReleaseRows(cSecondRowsObtained,pSecondHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pSecondHRow);
}
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Scroll_Fetch_CanHoldRows::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(CanHoldRows)
//*-----------------------------------------------------------------------
//| Test Case: CanHoldRows - test DBPROP_CANHOLDROWS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows::Init()
{
DBPROPID guidProperty=DBPROP_CANHOLDROWS;
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset and accessor
//DBPROP_CANHOLDROWS
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTGROUPBY, IID_IRowsetLocate,
1,&guidProperty));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Pass a bookmark to the second row. Retrieve it. Pass a bookmark to the third row, S_OK.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int CanHoldRows::Variation_1()
{
ULONG_PTR rgcbBookmarks[2];
BYTE * rgpBookmarks[2]={NULL,NULL};
HROW HRowSecond=NULL;
HROW HRowThird=NULL;
HROW rgHRowArray[2]={NULL,NULL};
DBREFCOUNT rgRefCounts[2];
BOOL fTestPass=FALSE;
//get a bookmark for the seond row
if(!GetBookmark(2, &rgcbBookmarks[0], &rgpBookmarks[0]))
goto CLEANUP;
//get a bookmark for the third row
if(!GetBookmark(3, &rgcbBookmarks[1], &rgpBookmarks[1]))
goto CLEANUP;
//get the second row handle
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&rgcbBookmarks[0],
(const BYTE **)&rgpBookmarks[0],&HRowSecond,NULL),S_OK))
goto CLEANUP;
//verify the row position
if(!COMPARE(VerifyRowPosition(HRowSecond, 2, g_pCTable),TRUE))
goto CLEANUP;
//get the third row handle
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&rgcbBookmarks[1],
(const BYTE **)&rgpBookmarks[1],&HRowThird,NULL),S_OK))
goto CLEANUP;
//verify the row position
if(!COMPARE(VerifyRowPosition(HRowThird, 3, g_pCTable),TRUE))
goto CLEANUP;
//retrieve the two row handles again
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,2,rgcbBookmarks,
(const BYTE **)rgpBookmarks,rgHRowArray,NULL),S_OK))
goto CLEANUP;
//the reference count of the row handles should be 2 before AddRef
if(!CHECK(m_pIRowset->AddRefRows(2,rgHRowArray,rgRefCounts,NULL),S_OK))
goto CLEANUP;
if(COMPARE(rgRefCounts[0] >= 1, TRUE) && COMPARE(rgRefCounts[1] >= 1, TRUE))
fTestPass=TRUE;
//release the row handles as we have AddRefed them
CHECK(m_pIRowset->ReleaseRows(2, rgHRowArray,NULL,NULL, NULL),S_OK);
CLEANUP:
//release the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
//release the row handles
if(HRowSecond)
CHECK(m_pIRowset->ReleaseRows(1, &HRowSecond,NULL,NULL, NULL),S_OK);
if(HRowThird)
CHECK(m_pIRowset->ReleaseRows(1, &HRowThird, NULL,NULL, NULL),S_OK);
if(rgHRowArray[0])
CHECK(m_pIRowset->ReleaseRows(2, rgHRowArray, NULL,NULL,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CanHoldRows::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(MaxOpenRows)
//*-----------------------------------------------------------------------
//| Test Case: MaxOpenRows - test DBPROP_MAXOPENROWS
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxOpenRows::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Set MAXOPENROWS to 3. *pBookmark points to the second row. lRowsOffset==1 and cRows=4. DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int MaxOpenRows::Variation_1()
{
//TODO This test should not be commented out!
return TEST_PASS;
/*
DBPROPID guidProperty=DBPROP_MAXOPENROWS;
ULONG cOpenRowCount=0;
ULONG cMaxOpenRowsCount;
ULONG cbBookmark;
BYTE *pBookmark=NULL;
HROW *pHRow=NULL;
ULONG cRowsObtained=0;
BOOL fTestPass=FALSE;
//record the g_cMaxOpenRows
cMaxOpenRowsCount=g_cMaxOpenRowsCount;
//set max open rows to 3
g_cMaxOpenRowsCount=3;
//open rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable5Rows, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
1,&guidProperty))
goto CLEANUP;
//get bookmark to the second row
if(!GetBookmark(2, &cbBookmark, &pBookmark))
goto CLEANUP;
// *pBookmark points to the second row. lRowsOffset==1, cRows==4
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,1,4,
&cRowsObtained,&pHRow),DB_S_ENDOFROWSET))
goto CLEANUP;
//only three row handles should be retrieved
if(!COMPARE(cRowsObtained, 3))
goto CLEANUP;
//the first row handle should be 3rd row
if(COMPARE(VerifyRowPosition(*pHRow, 3, g_pCTable5Rows),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the bookmark
PROVIDER_FREE(pBookmark);
//release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow, NULL,NULL,NULL), S_OK);
PROVIDER_FREE(pHRow);
}
//restore the max open rows
g_cMaxOpenRowsCount=cMaxOpenRowsCount;
ReleaseRowsetAndAccessor();
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
*/
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc SetMAXOPENROWS to 2. *pBookmark points to the third row. lRowsOffset==0 and cRows=3. DB_S_ROWLIMITEXCEEDED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int MaxOpenRows::Variation_2()
{
//TODO This test should not be commented out!
return TEST_PASS;
/*
DBPROPID guidProperty=DBPROP_MAXOPENROWS;
DBCOUNTITEM cOpenRowCount=0;
DBCOUNTITEM cMaxOpenRowsCount;
ULONG_PTR cbBookmark;
BYTE * pBookmark=NULL;
HROW * pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
//record the g_cMaxOpenRows
cMaxOpenRowsCount=g_cMaxOpenRowsCount;
//set max open rows to 2
g_cMaxOpenRowsCount=2;
//open rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable5Rows, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
1,&guidProperty))
goto CLEANUP;
//get bookmark to the third row
if(!GetBookmark(3, &cbBookmark, &pBookmark))
goto CLEANUP;
//lRowsOffset==0 and cRows=3.
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,0,3,
&cRowsObtained,&pHRow),DB_S_ROWLIMITEXCEEDED))
goto CLEANUP;
//only two row handles should be retrieved
if(!COMPARE(cRowsObtained, 2))
goto CLEANUP;
//the first row handle should be 3rd row
if(!COMPARE(VerifyRowPosition(*pHRow, 3, g_pCTable5Rows),TRUE))
goto CLEANUP;
//the second row handle should be 4th row
if(COMPARE(VerifyRowPosition(pHRow[1], 4, g_pCTable5Rows),TRUE))
fTestPass=TRUE;;
CLEANUP:
//release the bookmark
PROVIDER_FREE(pBookmark);
//release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow, NULL,NULL,NULL), S_OK);
PROVIDER_FREE(pHRow);
}
//restore the max open rows
g_cMaxOpenRowsCount=cMaxOpenRowsCount;
ReleaseRowsetAndAccessor();
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
*/
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Set MAXOPENROWS to 3. Pass an array of 3 bookmarks to different rows. S_OK.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int MaxOpenRows::Variation_3()
{
//TODO This test should not be commented out!
return TEST_PASS;
/*
DBPROPID guidProperty=DBPROP_MAXOPENROWS;
ULONG_PTR rgcbBookmarks[3];
BYTE * rgpBookmarks[3]={NULL,NULL,NULL};
DBCOUNTITEM cMaxOpenRowsCount=0;
DBCOUNTITEM cRowsObtained;
HROW * pHRow=NULL;
DBCOUNTITEM ulCount;
BOOL fTestPass=FALSE;
//record the g_cMaxOpenRows
cMaxOpenRowsCount=g_cMaxOpenRowsCount;
//set max open rows to 3
g_cMaxOpenRowsCount=3;
//open rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
1,&guidProperty))
goto CLEANUP;
//an array of 3 bookmarks to different rows
for(ulCount=0;ulCount<3;ulCount++)
{
if(!GetBookmark((ulCount+1)*10, &rgcbBookmarks[ulCount],&rgpBookmarks[ulCount]))
goto CLEANUP;
}
//retrieve 3 row handles
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,3,rgcbBookmarks,
(const BYTE **)rgpBookmarks,&cRowsObtained,&pHRow,NULL),S_OK))
goto CLEANUP;
//three rows should be retrieved
if(!COMPARE(cRowsObtained, 3))
goto CLEANUP;
//verify all the row handles
for(ulCount=0;ulCount<3;ulCount++)
{
if(!COMPARE(VerifyRowPosition(pHRow[ulCount],(ulCount+1)*10,g_pCTable),TRUE))
goto CLEANUP;
}
fTestPass=TRUE;
CLEANUP:
for(ulCount=0; ulCount<3; ulCount++)
PROVIDER_FREE(rgpBookmarks[ulCount]);
//release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow, NULL,NULL,NULL), S_OK);
PROVIDER_FREE(pHRow);
}
//restore the max open rows
g_cMaxOpenRowsCount=cMaxOpenRowsCount;
//release the rowset
ReleaseRowsetAndAccessor();
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
*/
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Set MAXOPENROWS to 2. Pass an array of 4 bookmarks. DB_S_ROWLIMITEXCEEDED is returned and only two row handles are retrieved.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int MaxOpenRows::Variation_4()
{
//TODO This test should not be commented out!
return TEST_PASS;
/*
DBPROPID guidProperty=DBPROP_MAXOPENROWS;
ULONG_PTR rgcbBookmarks[4];
BYTE *rgpBookmarks[4]={NULL,NULL,NULL,NULL};
DBCOUNTITEM cMaxOpenRowsCount=0;
DBCOUNTITEM cRowsObtained;
HROW *pHRow=NULL;
DBCOUNTITEM ulCount;
DBINDEXEDERROR *prgErrors=NULL;
BOOL fTestPass=FALSE;
//record the g_cMaxOpenRows
cMaxOpenRowsCount=g_cMaxOpenRowsCount;
//set max open rows to 2
g_cMaxOpenRowsCount=2;
//open rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
1,&guidProperty))
goto CLEANUP;
//an array of 4 bookmarks to different rows
for(ulCount=0;ulCount<4;ulCount++)
{
if(!GetBookmark((ulCount+1)*9, &rgcbBookmarks[ulCount],&rgpBookmarks[ulCount]))
goto CLEANUP;
}
//retrieve 4 row handles
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,4,rgcbBookmarks,
(const BYTE **)rgpBookmarks,&cRowsObtained,&pHRow,TRUE,&cErrors,&prgErrors),
DB_S_ROWLIMITEXCEEDED))
goto CLEANUP;
//2 rows should be retrieved
if(!COMPARE(cRowsObtained, 2))
goto CLEANUP;
//verify no Errors should be returned
if(!COMPARE(cErrors, 0))
goto CLEANUP;
if(!COMPARE(prgErrors, NULL))
goto CLEANUP;
//verify all the row handles
for(ulCount=0;ulCount<2;ulCount++)
{
if(!COMPARE(VerifyRowPosition(pHRow[ulCount],(ulCount+1)*9,g_pCTable),TRUE))
goto CLEANUP;
}
fTestPass=TRUE;
CLEANUP:
//release the bookmarks
for(ulCount=0; ulCount<4; ulCount++)
PROVIDER_FREE(rgpBookmarks[ulCount]);
//release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow, NULL,NULL,NULL), S_OK);
PROVIDER_FREE(pHRow);
}
//release the error information if there is any
if(prgErrors)
PROVIDER_FREE(prgErrors);
//restore the max open rows
g_cMaxOpenRowsCount=cMaxOpenRowsCount;
//release the rowset
ReleaseRowsetAndAccessor();
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
*/
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Use default MaxOpenRows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int MaxOpenRows::Variation_5()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
//open rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
0,NULL))
goto CLEANUP;
// *pBookmark points to the first row
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,g_lRowLast,
&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//all the row handles should be retrieved
if(!COMPARE(cRowsObtained, ULONG(g_lRowLast)))
goto CLEANUP;
//verify the last row
if(COMPARE(VerifyRowPosition(pHRow[cRowsObtained-1],g_lRowLast,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow, NULL,NULL,NULL), S_OK);
PROVIDER_FREE(pHRow);
}
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL MaxOpenRows::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Related_IRowset)
//*-----------------------------------------------------------------------
//| Test Case: Related_IRowset - test related interface IRowset
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_IRowset::Init()
{
BOOL fTestPass = FALSE;
DBPROPID rgDBPropID[2];
rgDBPropID[0]=DBPROP_CANSCROLLBACKWARDS;
rgDBPropID[1]=DBPROP_CANFETCHBACKWARDS;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//This is for provider like Monarch.
//Monarch does not allow to set DBPROP_CANSCROLLBACKWARDS and DBPROP_CANFETCHBACKWARDS
//but, when we have IRowsetLocate, these properties are automatically on.
//We first create the rowset without setting the properties, then check whether they are on.
//If they are not on, release and reopen the rowset with properties set.
//create a rowset and create an accessor. Set IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
0, NULL));
//If the properties are already on, we are set. Otherwise, release the rowset and reopen one
if(!GetProperty(DBPROP_CANSCROLLBACKWARDS,DBPROPSET_ROWSET,m_pIAccessor)||!GetProperty(DBPROP_CANFETCHBACKWARDS,DBPROPSET_ROWSET,m_pIAccessor))
{
ReleaseRowsetAndAccessor();
//create a rowset and create an accessor. Set IRowsetLocate, and two properties
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
2, rgDBPropID));
}
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc GetRowsAt does not change the cursor location of the rowset.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_IRowset::Variation_1()
{
HROW * pHRow=NULL;
DBCOUNTITEM cRows;
BOOL fTestPass=FALSE;
//get the second to the last row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,-2,1,&cRows, &pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(*pHRow, g_lRowLast-1, g_pCTable), TRUE))
goto CLEANUP;
//release the row handle
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
//get the last row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,1,-1,&cRows, &pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(*pHRow, g_lRowLast, g_pCTable), TRUE))
goto CLEANUP;
//release the row handle
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
//get the third to the last row
if(!CHECK(m_pIRowset->GetNextRows(NULL,-1,-1,&cRows, &pHRow),S_OK))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(*pHRow, g_lRowLast-2, g_pCTable), TRUE))
fTestPass=TRUE;
CLEANUP:
//release the row handle
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
//free the memory
PROVIDER_FREE(pHRow);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc GetRowsByBookmark does not change the cursor location of the rowset
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_IRowset::Variation_2()
{
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
HROW hRow[1];
HROW *pHRow=hRow;
HROW hRowHandle=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
//get a bookmark for the first row
if(!GetBookmark(1,&cbBookmark, &pBookmark))
goto CLEANUP;
//restart position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
//move the cursor position to before the last row
if(!CHECK(m_pIRowset->GetNextRows(NULL,g_lRowLast-1,0,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//no row should have be retrieved
if(!COMPARE(cRowsObtained, 0))
goto CLEANUP;
//retrieve the first row
if(!COMPARE(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmark,&hRowHandle,NULL),S_OK))
goto CLEANUP;
//verify the first row is retrieved
if(!COMPARE(VerifyRowPosition(hRowHandle, 1, g_pCTable),TRUE))
goto CLEANUP;
if ( !GetProp(DBPROP_CANHOLDROWS) )
{
//IRowset->GetNextRows, return DB_E_ROWSNOTRELEASED
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained, &pHRow),DB_E_ROWSNOTRELEASED))
goto CLEANUP;
}
//release the row handle retrieved by IRowsetLocate::GetRowsByBookmark
if(!CHECK(m_pIRowset->ReleaseRows(1,&hRowHandle,NULL,NULL,NULL),S_OK))
goto CLEANUP;
hRowHandle=NULL;
//IRowset->GetNextRows to retrieve the last row, return S_OK
if(!CHECK(m_pIRowset->GetNextRows(NULL,g_lRowLast-1,1,&cRowsObtained, &pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//verify the last row is retrieved
if(COMPARE(VerifyRowPosition(*pHRow, g_lRowLast, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//free the bookmark
PROVIDER_FREE(pBookmark);
//free the row handle
if(cRowsObtained)
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
if(hRowHandle)
CHECK(m_pIRowset->ReleaseRows(1,&hRowHandle,NULL,NULL,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Retrieve the same row handle twice by GetRowsAt and GetRowsByBookmark
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_IRowset::Variation_3()
{
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmarkGetRowsAt=(BYTE *)&DBBookmark;
HROW hRow[1];
HROW *pHRow=hRow;
HROW hRowHandle=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
//get a bookmark for the 2rd row
if(!GetBookmark(2,&cbBookmark, &pBookmark))
goto CLEANUP;
//retrieve the 2rd row
if(!COMPARE(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmark,&hRowHandle,NULL),S_OK))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(hRowHandle, 2, g_pCTable), TRUE))
goto CLEANUP;
if ( !GetProp(DBPROP_CANHOLDROWS) )
{
//IRowsetLocate->GetRowsAt to retriev the first row, return DB_E_ROWSNOTRELEASED
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmarkGetRowsAt,
0,1,&cRowsObtained, &pHRow),DB_E_ROWSNOTRELEASED))
goto CLEANUP;
}
//release the row handle retrieved by IRowsetLocate::GetRowsByBookmark
if(!CHECK(m_pIRowset->ReleaseRows(1,&hRowHandle,NULL,NULL,NULL),S_OK))
goto CLEANUP;
hRowHandle=NULL;
//IRowsetLocate->GetRowsAt to retrieve the first row, return S_OK
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmarkGetRowsAt,
0,1,&cRowsObtained, &pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//verify the first row is retrieved
if(!COMPARE(VerifyRowPosition(*pHRow, 1, g_pCTable),TRUE))
goto CLEANUP;
if ( !GetProp(DBPROP_CANHOLDROWS) )
{
//IRowsetLocate->GetRowsByBookmark return DB_E_ROWSNOTRELEASED
if(!COMPARE(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmark,&hRowHandle,NULL),
DB_E_ROWSNOTRELEASED))
goto CLEANUP;
}
//release the row handle retrieved by IRowsetLocate::GetRowsAt
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
cRowsObtained=0;
//retrieve the 2rd row by IRowsetLocate::GetRowsByBookmark
if(!COMPARE(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmark,&hRowHandle,NULL),S_OK))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(hRowHandle, 2, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//free the bookmark
PROVIDER_FREE(pBookmark);
//free the row handle
if(cRowsObtained)
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
if(hRowHandle)
CHECK(m_pIRowset->ReleaseRows(1, &hRowHandle, NULL,NULL,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Make sure IRowsetLocate::GetRowsAt return DB_E_ROWSNOTRELEASED if the row handles retrieved by IRowset::GetNextRows is not rele
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_IRowset::Variation_4()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained=0;
HROW hRow[1];
HROW *pHRow=hRow;
BOOL fTestPass=FALSE;
//restart the position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
//get the first row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(*pHRow, 1, g_pCTable), TRUE))
goto CLEANUP;
if ( !GetProp(DBPROP_CANHOLDROWS) )
{
//IRowsetLocate::GetRowsAt return DB_E_ROWSNOTRELEASED
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,1,1,&cRowsObtained,
&pHRow),DB_E_ROWSNOTRELEASED))
goto CLEANUP;
//no row should be retrieved
if(!COMPARE(cRowsObtained,0))
goto CLEANUP;
}
//release the row handle
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
//IRowsetLocate::GetRowsAt return S_OK
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,1,1,&cRowsObtained,
&pHRow),S_OK))
goto CLEANUP;
//verify the second row handle is retrieved
if(COMPARE(VerifyRowPosition(*pHRow, 2, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
if(cRowsObtained)
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,hRow,NULL,NULL,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Make sure IRowsetLocate::GetRowsByBookmark return DB_E_ROWSNOTRELEASED if the row handles retrieved by IRowset::GetNextRows is
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_IRowset::Variation_5()
{
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
DBCOUNTITEM cRowsObtained=0;
HROW hRow[1];
HROW *pHRow=hRow;
HROW hRowHandle=NULL;
BOOL fTestPass=FALSE;
//get the bookmark for the 6th row
if(!GetBookmark(6,&cbBookmark,&pBookmark))
goto CLEANUP;
//restart the position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
//get the 4th row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,3,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(*pHRow, 4, g_pCTable), TRUE))
goto CLEANUP;
if ( !GetProp(DBPROP_CANHOLDROWS) )
{
//IRowsetLocate::GetRowsByBookmark return DB_E_ROWSNOTRELEASED
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,(const BYTE **)&pBookmark,
&hRowHandle,NULL),DB_E_ROWSNOTRELEASED))
goto CLEANUP;
}
//release the row handle
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
cRowsObtained=0;
//IRowsetLocate::GetRowsByBookmark return S_OK
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,(const BYTE **)&pBookmark,
&hRowHandle,NULL),S_OK))
goto CLEANUP;
//verify the 6th row handle is retrieved
if(COMPARE(VerifyRowPosition(hRowHandle, 6, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the bookmark
PROVIDER_FREE(pBookmark);
//release the row handle
if(cRowsObtained)
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,hRow,NULL,NULL,NULL),S_OK);
//release the row handle
if(hRowHandle)
CHECK(m_pIRowset->ReleaseRows(1,&hRowHandle,NULL,NULL,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Fetch the last row. Fetch the second to last row. Fetch the 1st row. Fetch the last row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_IRowset::Variation_6()
{
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
DBCOUNTITEM cRowsObtained=0;
HROW hRow[5];
HROW *pHRow=hRow;
HROW *pHRowHandle=NULL;
BOOL fTestPass=FALSE;
//get the bookmark for the 3rd row
if(!GetBookmark(3,&cbBookmark,&pBookmark))
goto CLEANUP;
//restart the position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
//fetch the last row
if(!CHECK(m_pIRowset->GetNextRows(NULL,g_lRowLast,-1,&cRowsObtained,
&pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(*pHRow, g_lRowLast, g_pCTable), TRUE))
goto CLEANUP;
//release the row handle
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
//call GetNextRows
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,
-1,1,&cRowsObtained,&pHRowHandle),S_OK))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(*pHRowHandle, 2, g_pCTable), TRUE))
goto CLEANUP;
//release the row handle
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRowHandle,NULL,NULL,NULL),S_OK))
goto CLEANUP;
//release memory
PROVIDER_FREE(pHRowHandle);
pHRowHandle=NULL;
//fetch the second to the last row
if(!CHECK(m_pIRowset->GetNextRows(NULL,-2,-3,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 3);
//check the row position. The last row fetched should be the (g_lRowLast-5) 55th row
if(!COMPARE(VerifyRowPosition(hRow[2],g_lRowLast-5 , g_pCTable),TRUE))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(hRow[1],g_lRowLast-4, g_pCTable), TRUE))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(hRow[0], g_lRowLast-3, g_pCTable), TRUE))
goto CLEANUP;
//release row handles
if(!CHECK(m_pIRowset->ReleaseRows(3,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
//fetch one more row
if(!CHECK(m_pIRowset->GetNextRows(NULL,-1,2,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 2);
//check the row position.
if(COMPARE(VerifyRowPosition(hRow[0],g_lRowLast-6 , g_pCTable),TRUE))
{
if(COMPARE(VerifyRowPosition(hRow[1],g_lRowLast-5 , g_pCTable),TRUE))
fTestPass = TRUE;
}
CLEANUP:
//release the bookmark
PROVIDER_FREE(pBookmark);
//release the row handles
if(pHRowHandle)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRowHandle,NULL,NULL,NULL),S_OK);
//release memory
PROVIDER_FREE(pHRowHandle);
}
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc position at the lst row. GetRowsAt. Fetch backwards one row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Related_IRowset::Variation_7()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
HROW hRow[1];
HROW *pHRow=hRow;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
//restartposition
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
//move the cursor position to before the third row
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,0,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//no row should have be retrieved
if(!COMPARE(cRowsObtained, 0))
goto CLEANUP;
// *pBookmark points to the first row, lRowOffset=0, cRow=1
if(!COMPARE(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,1,
&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//verify the first row is retrieved
if(!COMPARE(VerifyRowPosition(*pHRow, 1, g_pCTable),TRUE))
goto CLEANUP;
if ( !GetProp(DBPROP_CANHOLDROWS) )
{
//IRowset->GetNextRows, return DB_E_ROWSNOTRELEASED
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained, &pHRow),DB_E_ROWSNOTRELEASED))
goto CLEANUP;
//no row should be retrieved
if(!COMPARE(cRowsObtained,0))
goto CLEANUP;
}
//release the row handle retrieved by IRowsetLocate::GetRowsAt
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
//IRowset->GetNextRows to retrieve the third row, return S_OK
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained, &pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//verify the first row is retrieved
if(COMPARE(VerifyRowPosition(*pHRow, 1, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//free the row handle
if(cRowsObtained)
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Related_IRowset::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Rowset_SingleRow)
//*-----------------------------------------------------------------------
//| Test Case: Rowset_SingleRow - test single row rowset
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_SingleRow::Init()
{
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
if ( !g_p1RowTable )
return TEST_SKIPPED;
//create a rowset and accessor
TESTC_DRIVER(GetRowsetAndAccessor(g_p1RowTable, SELECT_ALLFROMTBL, IID_IRowsetLocate));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Compare return DBCOMPARE_EQ and Hash return the same value
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_SingleRow::Variation_1()
{
BYTE *rgpBookmarks[2]={NULL, NULL};
ULONG_PTR rgcbBookmarks[2];
DBCOMPARE dwComparison;
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass=FALSE;
//get the bookmark for the first row
if(!GetBookmark(1,&rgcbBookmarks[0],&rgpBookmarks[0]))
goto CLEANUP;
//get the bookmark for the first row again
if(!GetBookmark(1,&rgcbBookmarks[1], &rgpBookmarks[1]))
goto CLEANUP;
//Compare should return DBCOMPARE_EQ
if(!CHECK(m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1], rgpBookmarks[1],&dwComparison),S_OK))
goto CLEANUP;
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
//Hash should return the same value
if(!CHECK(m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
goto CLEANUP;
if(!COMPARE(rgHashedValues[0], rgHashedValues[1]))
goto CLEANUP;
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc GetRowsAt: *pBookmark=DBBMK_FIRST. lRowsOFfset==1 and cRows=1. DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_SingleRow::Variation_2()
{
DBCOUNTITEM cRowsObtained=0;
HROW *pHRow=NULL;
BYTE *pBookmark=NULL;
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BOOL fTestPass=FALSE;
DBCOUNTITEM totalRows = 0;
pBookmark=(BYTE *)&DBBookmark;
//For testing other providers.
//e.g. for index server, currently we always have 60 rows
if(!CHECK(CountRowsOnRowset(m_pIRowset, &totalRows), S_OK))
goto CLEANUP;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,totalRows,1,&cRowsObtained,
&pHRow),DB_S_ENDOFROWSET))
goto CLEANUP;
//no row should be retrieved
if(!COMPARE(cRowsObtained, 0))
goto CLEANUP;
if(!COMPARE(pHRow, NULL))
goto CLEANUP;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,(totalRows+1),&cRowsObtained,
&pHRow),DB_S_ENDOFROWSET))
goto CLEANUP;
//one row should be retrieved
if(!COMPARE(cRowsObtained, totalRows))
goto CLEANUP;
if(pHRow)
fTestPass=TRUE;
CLEANUP:
//release the row handle
if(cRowsObtained && pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc GetRowsAt: *pBookmark=DBBMK_LAST, lRowsOffset=0 and cRows=1. S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_SingleRow::Variation_3()
{
DBCOUNTITEM cRowsObtained;
HROW *pHRow=NULL;
BYTE *pBookmark;
DBBOOKMARK DBBookmark=DBBMK_LAST;
BOOL fTestPass=FALSE;
pBookmark=(BYTE *)&DBBookmark;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,1,&cRowsObtained,
&pHRow),S_OK))
goto CLEANUP;
//one row should be retrieved
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//pHRow should points to memory allocated by the provider
if(!pHRow)
goto CLEANUP;
fTestPass=TRUE;
CLEANUP:
//release the row handle
if(cRowsObtained && pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc GetRowsByBookmark: Pass array of two bookmarks: the first and the last row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Rowset_SingleRow::Variation_4()
{
BYTE *rgpBookmarks[2]={NULL, NULL};
ULONG_PTR rgcbBookmarks[2];
HROW rghRow[2];
HROW *pHRow=rghRow;
DBREFCOUNT cRefCount;
BOOL fTestPass=FALSE;
//get the bookmark for the first row
if(!GetBookmark(1,&rgcbBookmarks[0],&rgpBookmarks[0]))
goto CLEANUP;
//get the bookmark for the first row again
if(!GetBookmark(1,&rgcbBookmarks[1], &rgpBookmarks[1]))
goto CLEANUP;
//get the row handles for the first row
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,2,rgcbBookmarks,
(const BYTE **)rgpBookmarks,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle twice
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,&cRefCount,NULL),S_OK))
goto CLEANUP;
if(!CHECK(m_pIRowset->ReleaseRows(1,&(rghRow[1]),NULL,&cRefCount,NULL),S_OK))
goto CLEANUP;
fTestPass = TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_SingleRow::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Consistency)
//*-----------------------------------------------------------------------
//| Test Case: Consistency - make sure GetRowsAt and GetRowsByBookmark return the same value
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Consistency::Init()
{
BOOL fTestPass = FALSE;
DBPROPID guidPrpt=DBPROP_CANHOLDROWS;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset and accessor, requesting DBPROP_CANHOLDROWS
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable,SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,1,&guidPrpt));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Retrieve three row handles from GetRowsAt and GetRowsByBookmark, one of which is overlapping
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Consistency::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark1=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained1=0;
HROW hRow1[3];
HROW *pHRow1=hRow1;
BYTE *rgpBookmarks2[3]={NULL,NULL,NULL};
ULONG_PTR rgcbBookmarks2[3];
DBCOUNTITEM cRowsObtained2=0;
HROW hRow2[3];
HROW *pHRow2=hRow2;
BOOL fTestPass=FALSE;
DBREFCOUNT cRefCount;
DBROWSTATUS rgRowStatus[3];
//retrieve the 3rd, 4th, and 5th row handle
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark1,2,3,
&cRowsObtained1,&pHRow1),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained1, 3);
//get the bookmark for the first row
if(!GetBookmark(1,rgcbBookmarks2,rgpBookmarks2))
goto CLEANUP;
//get the bookmark for the 2nd row
if(!GetBookmark(2,&rgcbBookmarks2[1],&rgpBookmarks2[1]))
goto CLEANUP;
//get the bookmark for the 3rd row
if(!GetBookmark(3,&rgcbBookmarks2[2],&rgpBookmarks2[2]))
goto CLEANUP;
//retriev the first row handle again
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,3,rgcbBookmarks2,
(const BYTE **)rgpBookmarks2,pHRow2,rgRowStatus),S_OK))
goto CLEANUP;
cRowsObtained2=3;
for(cRefCount=0; cRefCount<3; cRefCount++)
COMPARE(rgRowStatus[cRefCount],DBROWSTATUS_S_OK);
//make sure the 3rd row handle is retrieved twice
if(!CHECK(m_pIRowset->ReleaseRows(1,&(hRow2[2]),NULL,&cRefCount,NULL),S_OK))
goto CLEANUP;
//If the HRows are the same ref count should be 1 after release
if(COMPARE(cRefCount,ULONG(((pHRow1[0] == hRow2[2]) ? 1 : 0))))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks2[0]);
PROVIDER_FREE(rgpBookmarks2[1]);
PROVIDER_FREE(rgpBookmarks2[2]);
//release the row handle
if(cRowsObtained1)
CHECK(m_pIRowset->ReleaseRows(3,pHRow1,NULL,NULL,NULL),S_OK);
if(cRowsObtained2)
{
if(fTestPass)
//do not attempt to release the second row handle again
CHECK(m_pIRowset->ReleaseRows(2,hRow2,NULL,NULL,NULL),S_OK);
else
CHECK(m_pIRowset->ReleaseRows(3,pHRow2,NULL,NULL,NULL),S_OK);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Retrive the first row, GetRowsAt uses DBBMK_FIRST
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Consistency::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark1=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained1=0;
HROW hRow1[1];
HROW *pHRow1=hRow1;
BYTE *rgpBookmarks2[1]={NULL};
ULONG_PTR rgcbBookmarks2[1];
DBCOUNTITEM cRowsObtained2=0;
HROW hRow2[1];
HROW *pHRow2=hRow2;
BOOL fTestPass=FALSE;
DBREFCOUNT cRefCount;
//retrieve the first row handle
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark1,0,1,
&cRowsObtained1,&pHRow1),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained1, 1);
//get the bookmark for the first row
if(!GetBookmark(1,rgcbBookmarks2,rgpBookmarks2))
goto CLEANUP;
//retrieve the first row handle again
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,rgcbBookmarks2,
(const BYTE **)rgpBookmarks2,pHRow2,
NULL),S_OK))
goto CLEANUP;
cRowsObtained2=1;
//make sure the first row handle is retrieved
if(!COMPARE(VerifyRowPosition(*pHRow1, 1,g_pCTable),TRUE))
goto CLEANUP;
//make sure the first row handle is retrieved
if(COMPARE(VerifyRowPosition(*pHRow2, 1,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks2[0]);
//release the row handle
if(cRowsObtained1)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow1,NULL,&cRefCount,NULL),S_OK);
if(cRowsObtained2)
{
//If the HRows are the same ref count should be 1 after release
if(!COMPARE(cRefCount,ULONG(((pHRow1[0] == pHRow2[0]) ? 1 : 0))))
fTestPass=FALSE;
}
}
if(cRowsObtained2)
CHECK(m_pIRowset->ReleaseRows(1,pHRow2,NULL,&cRefCount,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Retrieve the last row. GetRowsAt uses DBBMK_LAST.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Consistency::Variation_3()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark1=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained1=0;
HROW hRow1[1];
HROW *pHRow1=hRow1;
BYTE *rgpBookmarks2[1]={NULL};
ULONG_PTR rgcbBookmarks2[1];
DBCOUNTITEM cRowsObtained2=0;
HROW hRow2[1];
HROW *pHRow2=hRow2;
BOOL fTestPass=FALSE;
DBREFCOUNT cRefCount;
//retrieve the last row handle
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark1,0,1,
&cRowsObtained1,&pHRow1),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained1, 1);
//get the bookmark for the last row
if(!GetBookmark(g_lRowLast,rgcbBookmarks2,rgpBookmarks2))
goto CLEANUP;
//retrieve the last row handle again
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,rgcbBookmarks2,
(const BYTE **)rgpBookmarks2,pHRow2,NULL),S_OK))
goto CLEANUP;
cRowsObtained2=1;
//make sure the last row handle is retrieved
if(COMPARE(VerifyRowPosition(*pHRow1,g_lRowLast,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks2[0]);
//release the row handle
if(cRowsObtained1)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow1,NULL,&cRefCount,NULL),S_OK);
if(cRowsObtained2)
{
//If the HRows are the same ref count should be 1 after release
if(!COMPARE(cRefCount,ULONG(((pHRow1[0] == pHRow2[0]) ? 1 : 0))))
fTestPass=FALSE;
}
}
if(cRowsObtained2)
CHECK(m_pIRowset->ReleaseRows(1,pHRow2,NULL,&cRefCount,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Consistency::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Parameters)
//*-----------------------------------------------------------------------
//| Test Case: Parameters - valid and invalid parameters passed into methods
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Parameters::Init()
{
IColumnsInfo *pIColumnsInfo=NULL;
DBCOUNTITEM cColumns;
DBCOLUMNINFO *prgInfo=NULL;
WCHAR *pStringsBuffer=NULL;
BOOL fTestPass=FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset and accessor
//
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate));
//make sure IColumnsInfo returns correct infomation on the 0th column,
//which is the bookmark column
if(!CHECK(m_pIRowsetLocate->QueryInterface(IID_IColumnsInfo,
(void **)&pIColumnsInfo),S_OK))
goto CLEANUP;
if(!CHECK(pIColumnsInfo->GetColumnInfo(&cColumns, &prgInfo,&pStringsBuffer),S_OK))
goto CLEANUP;
//the first element in the array should be the bookmark column
if(!COMPARE(prgInfo->iOrdinal, 0))
goto CLEANUP;
if(!COMPARE((prgInfo->dwFlags)&DBCOLUMNFLAGS_ISBOOKMARK,DBCOLUMNFLAGS_ISBOOKMARK))
goto CLEANUP;
fTestPass=TRUE;
CLEANUP:
//release the interface pointer
SAFE_RELEASE(pIColumnsInfo);
//release te memory
PROVIDER_FREE(prgInfo);
PROVIDER_FREE(pStringsBuffer);
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc GetRowsAt: *pBookmark=DBBMK_INVALID, DB_E_BADBOOKMARK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_INVALID;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained;
HROW *prghRows=NULL;
if(CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,
0,1,&cRowsObtained,&prghRows),DB_E_BADBOOKMARK))
{
COMPARE(prghRows, NULL);
return TEST_PASS;
}
else
{
if(cRowsObtained)
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, prghRows, NULL,NULL,NULL),S_OK);
return TEST_FAIL;
}
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc GetRowsAt: cRow==0 and *prghRows is not NULL on input
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained;
HROW hRow[1];
HROW *prghRows=hRow;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,0,
&cRowsObtained, &prghRows),S_OK))
return TEST_FAIL;
if(!COMPARE(cRowsObtained,0))
return TEST_FAIL;
//prghRows should not be set to NULL
if(prghRows==NULL)
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc GetRowsAt: *pcRowsObtained is 0 and *prghRows is NULL.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_3()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained;
HROW *prghRows=NULL;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,0,
&cRowsObtained, &prghRows),S_OK))
return TEST_FAIL;
if(!COMPARE(cRowsObtained,0))
return TEST_FAIL;
//prghRows should still be NULL
if(prghRows)
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc GetRowsByBookmark: cRows==0 and *prghRows and *prgErrors are not NULL.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_4()
{
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
HROW hRow[1];
HROW *phRow=hRow;
BOOL fTestPass=FALSE;
//get the bookmark for the third row
if(!GetBookmark(3,&cbBookmark,&pBookmark))
return TEST_FAIL;
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,0,&cbBookmark,
(const BYTE **)&pBookmark,phRow,NULL),S_OK))
goto CLEANUP;
//try again by passing phRow and pErrors as NULLs
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmark,NULL,NULL),E_INVALIDARG))
goto CLEANUP;
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(pBookmark);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc rgpBookmarks points to DBBMK_INVALID and fRetrunErrors=FALSE. *prghRows *prgErrors are NULL on input. DB_S_ERRORSOCCURRED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_5()
{
ULONG_PTR cbBookmark=1;
DBBOOKMARK DBBookmark=DBBMK_INVALID;
BYTE *pBookmark=(BYTE *)&DBBookmark;
HROW hRow=NULL;
DBROWSTATUS DBRowStatus;
BOOL fTestPass=FALSE;
//pass the invalid bookmark
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmark,&hRow,&DBRowStatus),
DB_E_ERRORSOCCURRED))
goto CLEANUP;
//make sure no rows is retrieved
if(!COMPARE(hRow,DB_NULL_HROW))
goto CLEANUP;
if(!COMPARE(DBRowStatus, DBROWSTATUS_E_INVALID))
goto CLEANUP;
fTestPass=TRUE;
CLEANUP:
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Pass an array of 3 bookmarks. The first bookmark is valid, the second bookmark is a NULL pointer and the third element of rgcb
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_6()
{
ULONG_PTR rgcbBookmarks[3];
BYTE *rgpBookmarks[3]={NULL,NULL,NULL};
HROW hRow[3];
DBCOUNTITEM cCount;
HROW *phRow=hRow;
DBROWSTATUS rgDBRowStatus[3];
BOOL fTestPass=FALSE;
//Init
for(cCount=0; cCount<3; cCount++)
hRow[cCount]=(HROW)1;
//set up the bookmarks.
//1st is valid, 2nd is NULL pointer and third of rgcbBookmarks is 0
//get a valid bookmark
if(!GetBookmark(1,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//fill up the rest
if(!GetBookmark(3, &rgcbBookmarks[1], &rgpBookmarks[2]))
goto CLEANUP;
rgpBookmarks[1]=NULL;
rgcbBookmarks[2]=0;
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,3,rgcbBookmarks,
(const BYTE **)rgpBookmarks,phRow,rgDBRowStatus),
DB_S_ERRORSOCCURRED))
goto CLEANUP;
//only one row should be retrieved
if(!COMPARE(hRow[1], DB_NULL_HROW) ||
!COMPARE(hRow[2],DB_NULL_HROW)
)
goto CLEANUP;
//only row is valid
if(hRow[0]==DB_NULL_HROW)
goto CLEANUP;
if( !(COMPARE(rgDBRowStatus[0], DBROWSTATUS_S_OK)
&& COMPARE(rgDBRowStatus[1], DBROWSTATUS_E_INVALID)
&& COMPARE(rgDBRowStatus[2], DBROWSTATUS_E_INVALID)
)
)
goto CLEANUP;
if(COMPARE(VerifyRowPosition(hRow[0],1,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the row handle
CHECK(m_pIRowset->ReleaseRows(1, phRow, NULL,NULL,NULL),S_OK);
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[2]);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Pass an array of 4 bookmarks: DBBMK_FIRST, DBBMK_LAST, valid, DBBMK_INVALID. DB_S_ERRORSOCCURRED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_7()
{
ULONG_PTR rgcbBookmarks[4]={1,1,1,1};
DBBOOKMARK rgDBBookmarks[3]={DBBMK_FIRST, DBBMK_LAST, DBBMK_INVALID};
BYTE *rgpBookmarks[4]={NULL,NULL,NULL,NULL};
HROW hRow[4];
HROW *phRow=hRow;
DBROWSTATUS rgDBRowStatus[4];
BOOL fTestPass=FALSE;
//set up the bookmarks.
//1st=DBBMK_FIRST, 2nd=DBBMK_VALIST, 3rd=valid, 4th=DBBMK_INVALID
//get a valid bookmark
if(!GetBookmark(2,&rgcbBookmarks[2],&rgpBookmarks[2]))
return TEST_FAIL;
rgpBookmarks[0]=(BYTE *)&rgDBBookmarks[0];
rgpBookmarks[1]=(BYTE *)&rgDBBookmarks[1];
rgpBookmarks[3]=(BYTE *)&rgDBBookmarks[2];
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,4,rgcbBookmarks,
(const BYTE **)rgpBookmarks,phRow,rgDBRowStatus),
DB_S_ERRORSOCCURRED))
goto CLEANUP;
//only one row should be retrieved
if(!COMPARE(hRow[0], DB_NULL_HROW) ||
!COMPARE(hRow[1],DB_NULL_HROW) ||
!COMPARE(hRow[3],DB_NULL_HROW)
)
goto CLEANUP;
if(hRow[2]==DB_NULL_HROW)
goto CLEANUP;
if(COMPARE(rgDBRowStatus[0], DBROWSTATUS_E_INVALID)
&& COMPARE(rgDBRowStatus[1], DBROWSTATUS_E_INVALID)
&& COMPARE(rgDBRowStatus[2], DBROWSTATUS_S_OK)
&& COMPARE(rgDBRowStatus[3], DBROWSTATUS_E_INVALID))
fTestPass=TRUE;
CLEANUP:
//release the row handle
CHECK(m_pIRowset->ReleaseRows(1, &(hRow[2]), NULL,NULL,NULL),S_OK);
//release the memory used by the bookmark
PROVIDER_FREE(rgpBookmarks[2]);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Pass an array of 3 bookmarks: valid, NULL pointer, DBBMK_FIRST. fReturnErrors=FALSE and prgErrors=NULL, pcErrors is not NULL.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_8()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
ULONG_PTR rgcbBookmarks[3] = {0, 0, 0};
BYTE *rgpBookmarks[3]={NULL,NULL,NULL};
HROW hRow[3];
HROW *phRow=hRow;
DBROWSTATUS rgDBRowStatus[3];
BOOL fTestPass=FALSE;
//set up the bookmarks.
//1st is valid, 2nd is NULL pointer, 3rd is DBBMK_FIRST
//get a valid bookmark
if(!GetBookmark(1,&rgcbBookmarks[0],&rgpBookmarks[0]))
goto CLEANUP;
//fill up the rest
if(!GetBookmark(2, &rgcbBookmarks[1], &rgpBookmarks[1]))
goto CLEANUP;
//free the memory
PROVIDER_FREE(rgpBookmarks[1]);
rgpBookmarks[1]=NULL;
rgcbBookmarks[2]=2;
rgpBookmarks[2]=(BYTE *)&DBBookmark;
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,3,rgcbBookmarks,
(const BYTE **)rgpBookmarks,phRow,rgDBRowStatus),
DB_S_ERRORSOCCURRED))
goto CLEANUP;
//only one row should be retrieved
if(!COMPARE(hRow[1],DB_NULL_HROW) ||
!COMPARE(hRow[2],DB_NULL_HROW)
)
goto CLEANUP;
if(hRow[0]==DB_NULL_HROW)
goto CLEANUP;
if(COMPARE(rgDBRowStatus[0], DBROWSTATUS_S_OK)
&&COMPARE(rgDBRowStatus[1],DBROWSTATUS_E_INVALID)
&&COMPARE(rgDBRowStatus[2],DBROWSTATUS_E_INVALID))
fTestPass=TRUE;
CLEANUP:
//release the memory used by the bookmark
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
//release the row handle
if (phRow)
CHECK(m_pIRowset->ReleaseRows(1, phRow, NULL,NULL,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc Pass an array of 3 bookmarks: first cbBokmark is less length, second *pBookmark is bogus, and third is valid
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_9()
{
BYTE byteBookmark=4;
ULONG_PTR rgcbBookmarks[3];
BYTE *rgpBookmarks[3]={NULL, NULL, NULL};
HROW hRow[3];
HROW *phRow=hRow;
DBROWSTATUS rgDBRowStatus[3];
BOOL fTestPass=FALSE;
//set up the bookmarks.
//1st cbBookmark is less length, 2nd is bogus, 3rd is valid
//get a valid bookmark
if(!GetBookmark(1,&rgcbBookmarks[2],&rgpBookmarks[2]))
return TEST_FAIL;
//1st bookmark is less length
if(!GetBookmark(2, &rgcbBookmarks[0], &rgpBookmarks[0]))
goto CLEANUP;
rgcbBookmarks[0]--;
//2nd is bogus
rgcbBookmarks[1]=rgcbBookmarks[0];
rgpBookmarks[1]=&byteBookmark;
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,3,rgcbBookmarks,
(const BYTE **)rgpBookmarks,phRow,rgDBRowStatus),
DB_S_ERRORSOCCURRED))
goto CLEANUP;
//only one row should be retrieved
if(!COMPARE(hRow[0],DB_NULL_HROW) ||
!COMPARE(hRow[1],DB_NULL_HROW)
)
goto CLEANUP;
if(hRow[2]==DB_NULL_HROW)
goto CLEANUP;
if(COMPARE(rgDBRowStatus[0], DBROWSTATUS_E_INVALID)
&& COMPARE(rgDBRowStatus[1], DBROWSTATUS_E_INVALID)
&& COMPARE(rgDBRowStatus[2], DBROWSTATUS_S_OK) )
fTestPass=TRUE;
CLEANUP:
//release the memory used by the bookmark
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[2]);
//release the row handle
CHECK(m_pIRowset->ReleaseRows(1, &(hRow[2]), NULL,NULL,NULL),S_OK);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc Hash:Pass an array of two bookmarks, one is valid and the other is not. pcErrors==NULL and prgErrors==NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_10()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL,NULL};
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass=FALSE;
//get a valid bookmark
if(!GetBookmark(1,&rgcbBookmarks[0], &rgpBookmarks[0]))
goto CLEANUP;
//get a invalid bookmark
if(!GetBookmark(2,&rgcbBookmarks[1], &rgpBookmarks[1]))
goto CLEANUP;
rgcbBookmarks[1]--;
//pass rgBookmarkStatus as NULL
if(CHECK(m_pIRowsetLocate->Hash(NULL, 2, rgcbBookmarks, (const BYTE **)rgpBookmarks,
rgHashedValues,NULL),DB_S_ERRORSOCCURRED))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc Hash:Pass an invalid bookmark. pcErrors==NULL and prgErrors is not NULL.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_11()
{
ULONG_PTR cbBookmark=1;
DBBOOKMARK DBBookmark=DBBMK_INVALID;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBHASHVALUE dwHashedValue;
DBROWSTATUS DBRowStatus;
//pass pcErrors==NULL and prgErrors==NULL.
if(!CHECK(m_pIRowsetLocate->Hash(NULL, 1, &cbBookmark, (const BYTE **)&pBookmark,
&dwHashedValue,&DBRowStatus),DB_E_ERRORSOCCURRED))
return TEST_FAIL;
if(!COMPARE(DBRowStatus, DBROWSTATUS_E_INVALID))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc Pass an array of 4 bookmarks. The first element of rgcbBookmarks is 0, the second bookmark is valid, the third and the forth
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_12()
{
ULONG_PTR rgcbBookmarks[4];
BYTE *rgpBookmarks[4]={NULL, NULL, NULL, NULL};
DBHASHVALUE rgHashedValues[4];
DBROWSTATUS rgDBRowStatus[4];
BOOL fTestPass=FALSE;
//get a valid bookmark
if(!GetBookmark(5, &rgcbBookmarks[1], &rgpBookmarks[1]))
return TEST_FAIL;
//1st rgcbBookmarks is 0
if(!GetBookmark(2, &rgcbBookmarks[0], &rgpBookmarks[0]))
goto CLEANUP;
rgcbBookmarks[0]=0;
//3rd and 4th is NULL pointer
rgpBookmarks[2]=NULL;
rgpBookmarks[3]=NULL;
rgcbBookmarks[2]=rgcbBookmarks[0];
rgcbBookmarks[3]=rgcbBookmarks[0];
if(!CHECK(m_pIRowsetLocate->Hash(NULL,4,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,rgDBRowStatus),DB_S_ERRORSOCCURRED))
goto CLEANUP;
if( COMPARE(rgDBRowStatus[0],DBROWSTATUS_E_INVALID)
&& COMPARE(rgDBRowStatus[1],DBROWSTATUS_S_OK)
&& COMPARE(rgDBRowStatus[2],DBROWSTATUS_E_INVALID)
&& COMPARE(rgDBRowStatus[3],DBROWSTATUS_E_INVALID))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc Pass an array of 4 bookmarks: DBBMK_FIRST, DBBMK_LAST,valid, DBBMK_INVALID.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_13()
{
DBBOOKMARK rgDBBookmarks[3]={DBBMK_FIRST, DBBMK_LAST, DBBMK_INVALID};
ULONG_PTR rgcbBookmarks[5]={1,1,1,1,1};
BYTE *rgpBookmarks[5]={NULL,NULL,NULL,NULL,NULL};
DBROWSTATUS rgDBRowStatus[5];
DBHASHVALUE rgHashedValues[5];
BOOL fTestPass=FALSE;
//the 3rd bookmark is valid
if(!GetBookmark(6, &rgcbBookmarks[2], &rgpBookmarks[2]))
return TEST_FAIL;
//the 5th bookmark is valid
if(!GetBookmark(6, &rgcbBookmarks[4], &rgpBookmarks[4]))
goto CLEANUP;
//the 1st, 2nd and 4th is DBBMK_FIST, DBBMK_LAST, and DBBMK_INVALID
rgpBookmarks[0]=(BYTE *)&rgDBBookmarks[0];
rgpBookmarks[1]=(BYTE *)&rgDBBookmarks[1];
rgpBookmarks[3]=(BYTE *)&rgDBBookmarks[2];
if(!CHECK(m_pIRowsetLocate->Hash(NULL,5,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,rgDBRowStatus),DB_S_ERRORSOCCURRED))
goto CLEANUP;
//the two hash values has to be the same
if(!COMPARE(rgHashedValues[2], rgHashedValues[4]))
goto CLEANUP;
if(COMPARE(rgDBRowStatus[0], DBROWSTATUS_E_INVALID)
&& COMPARE(rgDBRowStatus[1], DBROWSTATUS_E_INVALID)
&& COMPARE(rgDBRowStatus[2], DBROWSTATUS_S_OK)
&& COMPARE(rgDBRowStatus[3], DBROWSTATUS_E_INVALID)
&& COMPARE(rgDBRowStatus[4], DBROWSTATUS_S_OK) )
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[2]);
PROVIDER_FREE(rgpBookmarks[4]);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc Valid bookmark, *pcErrors=0
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Parameters::Variation_14()
{
ULONG_PTR cbBookmark;
BYTE *pBookmark;
DBHASHVALUE dwHashedValue;
DBROWSTATUS DBRowStatus;
BOOL fTestPass=FALSE;
//get a valid bookmark
if(!GetBookmark(1,&cbBookmark, &pBookmark))
return TEST_FAIL;
//pass pcErrors==NULL and prgErrors is not NULL.
if(!CHECK(m_pIRowsetLocate->Hash(NULL, 1, &cbBookmark, (const BYTE **)&pBookmark,
&dwHashedValue,&DBRowStatus),S_OK))
goto CLEANUP;
if(COMPARE(DBRowStatus, DBROWSTATUS_S_OK))
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(pBookmark);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Parameters::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Boundary_Compare)
//*-----------------------------------------------------------------------
//| Test Case: Boundary_Compare - boundary conditions for Compare
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_Compare::Init()
{
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset and accessor
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetLocate));
if(GetProp(DBPROP_ORDEREDBOOKMARKS))
m_fOrderedBookmark=TRUE;
//get a valid bookmark value
m_cbBookmark=0;
m_pBookmark=NULL;
if(!GetBookmark(1,&m_cbBookmark, &m_pBookmark))
goto CLEANUP;
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc cbBookmark1==0
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_1()
{
if(CHECK(m_pIRowsetLocate->Compare(NULL,0,m_pBookmark,m_cbBookmark,
m_pBookmark,&m_DBCompare),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc cbBookmark2==0
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_2()
{
if(CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark,m_pBookmark,0,
m_pBookmark,&m_DBCompare),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pBookmark1==NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_3()
{
if(CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark,NULL,m_cbBookmark,
m_pBookmark,&m_DBCompare),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc pBookmark2==NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_4()
{
if(CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark,m_pBookmark,m_cbBookmark,
NULL,&m_DBCompare),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc pdwComparistion==NULL
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_5()
{
if(CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark,m_pBookmark,m_cbBookmark,
m_pBookmark,NULL),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc pBookmark1==DBBMK_INVALID
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_6()
{
DBBOOKMARK DBBookmark=DBBMK_INVALID;
if(CHECK(m_pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,(BYTE *)&DBBookmark,m_cbBookmark,
m_pBookmark,&m_DBCompare),DB_E_BADBOOKMARK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc pBookmark2==DBBMK_INVALID
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_7()
{
DBBOOKMARK DBBookmark=DBBMK_INVALID;
if(CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark,m_pBookmark,STD_BOOKMARKLENGTH,
(BYTE *)&DBBookmark,&m_DBCompare),DB_E_BADBOOKMARK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc pBookmark1==DBBMK_FIRST
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_8()
{
m_DBBookmark=DBBMK_FIRST;
if(!CHECK(m_pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,(BYTE *)&m_DBBookmark,
STD_BOOKMARKLENGTH,(BYTE *)&m_DBBookmark,&m_DBCompare),S_OK))
return TEST_FAIL;
if(!COMPARE(m_DBCompare, DBCOMPARE_EQ))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc pBookmark2==DBBMK_FIRST
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_9()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
m_DBBookmark=DBBMK_FIRST;
if(!CHECK(m_pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,(BYTE *)&m_DBBookmark,
STD_BOOKMARKLENGTH,(BYTE *)&DBBookmark,&m_DBCompare),S_OK))
return TEST_FAIL;
//the result is independent on whether the DBPROP_ORDEREDBOOKMARKS is on.
if(!COMPARE(m_DBCompare, DBCOMPARE_NE))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc pBookmark1==DBBMK_LAST
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_10()
{
m_DBBookmark=DBBMK_LAST;
if(!CHECK(m_pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,(BYTE *)&m_DBBookmark,
STD_BOOKMARKLENGTH,(BYTE *)&m_DBBookmark,&m_DBCompare),S_OK))
return TEST_FAIL;
if(!COMPARE(m_DBCompare, DBCOMPARE_EQ))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc pBookmark2==DBBMK_LAST
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_11()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
m_DBBookmark=DBBMK_LAST;
if(!CHECK(m_pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,(BYTE *)&m_DBBookmark,
STD_BOOKMARKLENGTH,(BYTE *)&DBBookmark,&m_DBCompare),S_OK))
return TEST_FAIL;
//the result is independent on whether the DBPROP_ORDEREDBOOKMARKS is on.
if(!COMPARE(m_DBCompare, DBCOMPARE_NE))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc cbBookmark1==length-1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_12()
{
if(CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark-1,m_pBookmark,m_cbBookmark,
m_pBookmark,&m_DBCompare),DB_E_BADBOOKMARK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc cbBookmark1==length+1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_13()
{
if(CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark+1,m_pBookmark,m_cbBookmark,
m_pBookmark,&m_DBCompare),DB_E_BADBOOKMARK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc cbBookmark2==length-1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_14()
{
if(CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark,m_pBookmark,m_cbBookmark-1,
m_pBookmark,&m_DBCompare),DB_E_BADBOOKMARK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(15)
//*-----------------------------------------------------------------------
// @mfunc cbBookmark2==length+1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_15()
{
if(CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark,m_pBookmark,m_cbBookmark+1,
m_pBookmark,&m_DBCompare),DB_E_BADBOOKMARK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(16)
//*-----------------------------------------------------------------------
// @mfunc pBookmark1 points to bogus bookmark
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_16()
{
DBBOOKMARK DBBookmark=DBBMK_INVALID;
if(CHECK(m_pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,(BYTE *)&DBBookmark,
m_cbBookmark,m_pBookmark,&m_DBCompare),DB_E_BADBOOKMARK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(17)
//*-----------------------------------------------------------------------
// @mfunc pBookmark2 points to bogus bookmark
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_17()
{
DBBOOKMARK DBBookmark=DBBMK_INVALID;
if(CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark,m_pBookmark,STD_BOOKMARKLENGTH,
(BYTE *)&DBBookmark,&m_DBCompare),DB_E_BADBOOKMARK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(18)
//*-----------------------------------------------------------------------
// @mfunc cbBmk1 != 1, cbBmk2 == 1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_18()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
if(!CHECK(m_pIRowsetLocate->Compare(NULL,m_cbBookmark,m_pBookmark,
STD_BOOKMARKLENGTH,(BYTE *)&DBBookmark,&m_DBCompare),S_OK))
return TEST_FAIL;
if(!COMPARE(m_DBCompare, DBCOMPARE_NE))
return TEST_FAIL;
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(19)
//*-----------------------------------------------------------------------
// @mfunc cbBmk1 == 1, cbBmk2 != 1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Compare::Variation_19()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
if(!CHECK(m_pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,(BYTE *)&DBBookmark,
m_cbBookmark,m_pBookmark,&m_DBCompare),S_OK))
return TEST_FAIL;
if(!COMPARE(m_DBCompare, DBCOMPARE_NE))
return TEST_FAIL;
return TEST_PASS;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_Compare::Terminate()
{
//free the memory used by the bookmark
PROVIDER_FREE(m_pBookmark);
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Boundary_GetRowsAt)
//*-----------------------------------------------------------------------
//| Test Case: Boundary_GetRowsAt - boundary conditions for GetRowsAt
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsAt::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
// Create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC,
IID_IRowsetLocate))
return FALSE;
// Get a Bookmark that points to the first row
m_cbBookmark=1;
m_DBBookmark=DBBMK_FIRST;
m_pBookmark=(BYTE *)&m_DBBookmark;
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc cbBookmark==0, E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_1()
{
// Initialize the output values
m_cRowsObtained = INVALID(ULONG);
m_pHRow = NULL;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,0,m_pBookmark,
0,1,&m_cRowsObtained,&m_pHRow),E_INVALIDARG))
return TEST_FAIL;
// Check to see if set on output
COMPARE(m_cRowsObtained, 0);
COMPARE(m_pHRow, NULL);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc pBookmark==NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_2()
{
// Initialize the output values
m_cRowsObtained = INVALID(ULONG);
m_pHRow = NULL;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,m_cbBookmark,NULL,
0,1,&m_cRowsObtained,&m_pHRow),E_INVALIDARG))
return TEST_FAIL;
// Check to see if set on output
COMPARE(m_cRowsObtained, 0);
COMPARE(m_pHRow, NULL);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pcRowsObtained==NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_3()
{
// Initialize the output values
m_pHRow = NULL;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,m_cbBookmark,
m_pBookmark,0,1,NULL,&m_pHRow),E_INVALIDARG))
return TEST_FAIL;
// Check to see if set on output
COMPARE(m_pHRow, NULL);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc prgRows==NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_4()
{
// Initialize the output values
m_cRowsObtained = INVALID(ULONG);
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,m_cbBookmark,
m_pBookmark,0,1,&m_cRowsObtained,NULL),E_INVALIDARG))
return TEST_FAIL;
// Check to see if set on output
COMPARE(m_cRowsObtained,0);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc lRowsOffset==-1. DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_5()
{
// Initialize the output values
m_cRowsObtained = INVALID(ULONG);
m_pHRow = NULL;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,m_cbBookmark,
m_pBookmark,-1,1,&m_cRowsObtained,&m_pHRow),DB_S_ENDOFROWSET))
return TEST_FAIL;
// Since IRowsetLocate is on, DBPROP_CANSCROLLBACKWARDS is TRUE
COMPARE(GetProperty(DBPROP_CANSCROLLBACKWARDS,
DBPROPSET_ROWSET,m_pIRowsetLocate), TRUE);
// Check to see if set on output
COMPARE(m_cRowsObtained, 0);
COMPARE(m_pHRow, NULL);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc cRows=-1, DB_E_CANTFETCHBACKWARDS
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_6()
{
// Initialize the output values
m_ExpHR = DB_E_CANTFETCHBACKWARDS;
m_cRowsObtained = INVALID(ULONG);
m_pHRow = NULL;
if(GetProperty(DBPROP_CANFETCHBACKWARDS,DBPROPSET_ROWSET,m_pIRowsetLocate))
m_ExpHR = S_OK;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,m_cbBookmark,
m_pBookmark,0,-1,&m_cRowsObtained,&m_pHRow),m_ExpHR))
return TEST_FAIL;
// Check to see if set on output
if(m_ExpHR != S_OK)
{
COMPARE(m_cRowsObtained, 0);
COMPARE(m_pHRow, NULL);
}
else
COMPARE(m_cRowsObtained,1);
CHECK(m_pIRowset->ReleaseRows(m_cRowsObtained, m_pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(m_pHRow);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc cbBookmark=length-1, DB_E_BADBOOKMARK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_7()
{
// Initialize the output values
m_cRowsObtained = INVALID(ULONG);
m_pHRow = NULL;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,m_cbBookmark-1,
m_pBookmark,0,1,&m_cRowsObtained,&m_pHRow),E_INVALIDARG))
return TEST_FAIL;
// Check to see if set on output
COMPARE(m_cRowsObtained, 0);
COMPARE(m_pHRow, NULL);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc cbBookmark=length+1; DB_E_BADBOOKMARK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_8()
{
// Initialize the output values
m_cRowsObtained = INVALID(ULONG);
m_pHRow = NULL;
//cbBookmark=length +1
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,m_cbBookmark+1,
m_pBookmark,0,1,&m_cRowsObtained,&m_pHRow),DB_E_BADBOOKMARK))
return TEST_FAIL;
// Check to see if set on output
COMPARE(m_cRowsObtained, 0);
COMPARE(m_pHRow, NULL);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc pBookmark points to a bogus bookmark
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_9()
{
// Initialize the output values
ULONG cbBookmark = 56;
m_cRowsObtained = INVALID(ULONG);
m_pHRow = NULL;
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,(BYTE *)&cbBookmark,
0,1,&m_cRowsObtained,&m_pHRow),DB_E_BADBOOKMARK))
return TEST_FAIL;
// Check to see if set on output
COMPARE(m_cRowsObtained, 0);
COMPARE(m_pHRow, NULL);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc cRows == LONG_MAX
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_12()
{
ULONG_PTR cbBookmark;
BYTE* pBookmark = NULL;
DBCOUNTITEM cRowsObtained = 0;
HROW* pHRow = NULL;
DBCOUNTITEM cRowCount;
BOOL fTestPass = FALSE;
//Get the first bookmark
TESTC(GetBookmark(1,&cbBookmark,&pBookmark));
// cRows == LONG_MAX, lRowsOffset = 0
TEST2C_(m_hr = m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,
0,MAXDBROWCOUNT,&cRowsObtained,&pHRow),DB_S_ENDOFROWSET,E_OUTOFMEMORY);
//Verify Rows
if (m_hr == DB_S_ENDOFROWSET)
{
TESTC(cRowsObtained == ULONG(g_lRowLast));
for(cRowCount=0; cRowCount<cRowsObtained; cRowCount++)
TESTC(VerifyRowPosition(pHRow[cRowCount],cRowCount+1,g_pCTable));
}
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(pBookmark);
//releaset the rowhandle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
return fTestPass;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc lRowsOffset == LONG_MAX
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsAt::Variation_13()
{
ULONG_PTR cbBookmark;
BYTE* pBookmark = NULL;
DBCOUNTITEM cRowsObtained = 0;
HROW* pHRow = NULL;
BOOL fTestPass = FALSE;
//Get the first bookmark
TESTC(GetBookmark(1,&cbBookmark,&pBookmark));
// cRows == 1, lRowsOffset = LONG_MAX
TEST2C_(m_hr = m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,
MAXDBROWCOUNT,1,&cRowsObtained,&pHRow),DB_S_ENDOFROWSET,E_OUTOFMEMORY);
TESTC(cRowsObtained == 0);
TESTC(pHRow == NULL);
fTestPass=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(pBookmark);
//releaset the rowhandle
if (pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL, NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsAt::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Boundary_GetRowsByBookmarks)
//*-----------------------------------------------------------------------
//| Test Case: Boundary_GetRowsByBookmarks - boundary conditions for GetRowsByBookmark
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsByBookmarks::Init()
{
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset and accessor
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_REVCOLLIST, IID_IRowsetLocate));
m_rgpBookmarks[0]=NULL;
m_rgpBookmarks[1]=NULL;
m_cbBookmark=1;
m_pHRow=m_rghRows;
m_DBBookmark=DBBMK_LAST;
//get a valid bookmark value
if(!GetBookmark(5,&m_cbBookmark, &m_rgpBookmarks[0]))
goto CLEANUP;
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc rgcbBookmarks==NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsByBookmarks::Variation_1()
{
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,NULL,(const BYTE **)m_rgpBookmarks,
m_pHRow, NULL),E_INVALIDARG))
return TEST_FAIL;
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc prgBookmarks==NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsByBookmarks::Variation_2()
{
if(CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&m_cbBookmark,NULL,
m_pHRow, NULL),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc pcRowsObtained=NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsByBookmarks::Variation_3()
{
if(CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&m_cbBookmark,(const BYTE **)m_rgpBookmarks,
NULL, NULL),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc prghRows=NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsByBookmarks::Variation_4()
{
DBROWSTATUS DBRowStatus;
if(CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&m_cbBookmark,(const BYTE **)m_rgpBookmarks,
NULL,&DBRowStatus),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc fReturnErrors==TRUE and pcErrors==NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsByBookmarks::Variation_5()
{
if(CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,0,&m_cbBookmark,(const BYTE **)m_rgpBookmarks,
m_pHRow,NULL),S_OK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc fReturnedErrors=TRUE and prgErrors=NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsByBookmarks::Variation_6()
{
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&m_cbBookmark,(const BYTE **)m_rgpBookmarks,
m_pHRow,NULL),S_OK))
return TEST_FAIL;
CHECK(m_pIRowset->ReleaseRows(1,m_pHRow, NULL,NULL,NULL),S_OK);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc fReturnErrors=FALSE and pcErrors=NULL; S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsByBookmarks::Variation_7()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
ULONG_PTR cbBookmark=1;
//try to retrieve an row by an invalid bookmark
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,
&cbBookmark,(const BYTE **)&pBookmark,
m_pHRow,NULL),DB_E_ERRORSOCCURRED))
return TEST_FAIL;
COMPARE(*m_pHRow, DB_NULL_HROW);
return TEST_PASS;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc fReturnErrors=FALSE and prgErrors=NULl; S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_GetRowsByBookmarks::Variation_8()
{
DBROWSTATUS DBRowStatus;
//only one row handle should be retrieved
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&m_cbBookmark,
(const BYTE **)m_rgpBookmarks,m_pHRow,
&DBRowStatus),S_OK))
return TEST_FAIL;
CHECK(m_pIRowset->ReleaseRows(1,m_pHRow, NULL,NULL,NULL),S_OK);
//check the row status
if(COMPARE(DBRowStatus, DBROWSTATUS_S_OK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_GetRowsByBookmarks::Terminate()
{
//free memory used by the bookmark
PROVIDER_FREE(m_rgpBookmarks[0]);
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Boundary_Hash)
//*-----------------------------------------------------------------------
//| Test Case: Boundary_Hash - boundary conditions for Hash
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_Hash::Init()
{
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
//create a rowset and accessor
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetLocate));
m_rgpBookmarks[0]=NULL;
m_DBBookmark=DBBMK_LAST;
//get a valid bookmark value
if(!GetBookmark(3,m_rgcbBookmarks, m_rgpBookmarks))
goto CLEANUP;
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc cBookmarks==0, S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Hash::Variation_1()
{
//cBookmark==0, do nothing
if(CHECK(m_pIRowsetLocate->Hash(NULL,0,m_rgcbBookmarks,(const BYTE **)m_rgpBookmarks,
m_rgHashedValues,NULL),S_OK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc rgcbBookmarks==NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Hash::Variation_2()
{
if(CHECK(m_pIRowsetLocate->Hash(NULL,1,NULL,(const BYTE **)m_rgpBookmarks,
m_rgHashedValues,NULL),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc rgpBookmark==NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Hash::Variation_3()
{
if(CHECK(m_pIRowsetLocate->Hash(NULL,1,m_rgcbBookmarks,NULL,
m_rgHashedValues,NULL),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc rgHashedvalues==NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Hash::Variation_4()
{
if(CHECK(m_pIRowsetLocate->Hash(NULL,1,m_rgcbBookmarks,(const BYTE **)m_rgpBookmarks,
NULL,NULL),E_INVALIDARG))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc pcErros is valid and prgErrors=NULL; E_INVALIDARG
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Hash::Variation_5()
{
if(CHECK(m_pIRowsetLocate->Hash(NULL,1,m_rgcbBookmarks,(const BYTE **)m_rgpBookmarks,
m_rgHashedValues,NULL),S_OK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc pcErros=NULL, S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Hash::Variation_6()
{
if(CHECK(m_pIRowsetLocate->Hash(NULL,1,m_rgcbBookmarks,(const BYTE **)m_rgpBookmarks,
m_rgHashedValues,NULL),S_OK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc pcErros==NULL and prgErrors=NULL; S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Boundary_Hash::Variation_7()
{
if(CHECK(m_pIRowsetLocate->Hash(NULL,1,m_rgcbBookmarks,(const BYTE **)m_rgpBookmarks,
m_rgHashedValues,NULL),S_OK))
return TEST_PASS;
return TEST_FAIL;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Boundary_Hash::Terminate()
{
//free the memory used by the bookmark
PROVIDER_FREE(m_rgpBookmarks[0]);
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Zombie)
//*-----------------------------------------------------------------------
//| Test Case: Zombie - zombie states
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Zombie::Init()
{
m_DBPropSet.rgProperties=NULL;
// {{ TCW_INIT_BASECLASS_CHECK
if(!CTransaction::Init())
// }}
return TEST_SKIPPED;
m_DBPropSet.guidPropertySet=DBPROPSET_ROWSET;
m_DBPropSet.cProperties=2;
m_DBPropSet.rgProperties=(DBPROP *)PROVIDER_ALLOC(2 * sizeof(DBPROP));
if(!m_DBPropSet.rgProperties)
return FALSE;
//DBPROP_IRowsetLocate
memset(&m_DBPropSet.rgProperties[0], 0, sizeof(DBPROP));
m_DBPropSet.rgProperties[0].dwPropertyID=DBPROP_IRowsetLocate;
m_DBPropSet.rgProperties[0].dwOptions=DBPROPOPTIONS_REQUIRED;
m_DBPropSet.rgProperties[0].vValue.vt=VT_BOOL;
V_BOOL(&m_DBPropSet.rgProperties[0].vValue)=VARIANT_TRUE;
//DBPROP_CANHOLDROWS
memset(&m_DBPropSet.rgProperties[1], 0, sizeof(DBPROP));
m_DBPropSet.rgProperties[1].dwPropertyID=DBPROP_CANHOLDROWS;
m_DBPropSet.rgProperties[1].dwOptions=DBPROPOPTIONS_REQUIRED;
m_DBPropSet.rgProperties[1].vValue.vt=VT_BOOL;
V_BOOL(&m_DBPropSet.rgProperties[1].vValue)=VARIANT_TRUE;
//register interface to be tested
if(!RegisterInterface(ROWSET_INTERFACE, IID_IRowsetLocate, 1, &m_DBPropSet))
return FALSE;
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Commit with retaining.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Zombie::Variation_1()
{
IRowsetLocate *pIRowsetLocate=NULL;
HROW *pHRow=NULL;
HROW HRowByBookmark=NULL;
DBCOUNTITEM cRows=1;
DBROWSTATUS DBRowStatus;
DBBOOKMARK DBBookmarkOne=DBBMK_FIRST;
BYTE *pBookmarkOne=(BYTE *)&DBBookmarkOne;
DBBOOKMARK DBBookmarkTwo=DBBMK_FIRST;
BYTE *pBookmarkTwo=(BYTE *)&DBBookmarkTwo;
ULONG_PTR cbBookmark=1;
DBCOMPARE dwComparison;
DBHASHVALUE HashedValues = NULL;
BOOL fTestPass=FALSE;
//start a transaction
if(!StartTransaction(SELECT_ORDERBYNUMERIC, (IUnknown **)&pIRowsetLocate,
1, &m_DBPropSet))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),S_OK))
goto CLEANUP;
//the two bookmark should be the same
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
//commit the transaction with fRetaining==TRUE
if(!GetCommit(TRUE))
goto CLEANUP;
if(!m_fCommitPreserve)
{
//zombie
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),E_UNEXPECTED))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmarkOne,
5,1,&cRows,&pHRow),E_UNEXPECTED))
goto CLEANUP;
COMPARE(cRows, 0);
//no row should be retrieved
COMPARE(pHRow, NULL);
if(!CHECK(pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HRowByBookmark,&DBRowStatus),E_UNEXPECTED))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->Hash(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HashedValues,&DBRowStatus),E_UNEXPECTED))
goto CLEANUP;
}
else
{
//fully functional
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),S_OK))
goto CLEANUP;
//the two bookmark should be the same
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmarkOne,
5,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//1 row should be retrieved
COMPARE(cRows, 1);
//DB_E_ERRORSOCCURRED - Cannot be standard bookmarks DBBMK_FIRST
if(!CHECK(pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HRowByBookmark,&DBRowStatus), DB_E_ERRORSOCCURRED))
goto CLEANUP;
//no rows should be retrieved
COMPARE(DBRowStatus, DBROWSTATUS_E_INVALID);
COMPARE(HRowByBookmark,NULL);
//DB_E_ERRORSOCCURRED - Cannot be standard bookmarks DBBMK_FIRST
if(!CHECK(pIRowsetLocate->Hash(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HashedValues,&DBRowStatus), DB_E_ERRORSOCCURRED))
goto CLEANUP;
COMPARE(DBRowStatus, DBROWSTATUS_E_INVALID);
COMPARE(HashedValues, NULL);
}
fTestPass=TRUE;
CLEANUP:
//release memory
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(HRowByBookmark)
{
CHECK(m_pIRowset->ReleaseRows(1,&HRowByBookmark,NULL,NULL,NULL),S_OK);
}
//release the interface pointer
SAFE_RELEASE(pIRowsetLocate);
//clean up. Expected S_OK.
CleanUpTransaction(S_OK);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Commit without retaining.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Zombie::Variation_2()
{
IRowsetLocate *pIRowsetLocate=NULL;
HROW *pHRow=NULL;
HROW HRowByBookmark=NULL;
DBCOUNTITEM cRows;
DBROWSTATUS DBRowStatus;
DBBOOKMARK DBBookmarkOne=DBBMK_FIRST;
BYTE *pBookmarkOne=(BYTE *)&DBBookmarkOne;
DBBOOKMARK DBBookmarkTwo=DBBMK_LAST;
BYTE *pBookmarkTwo=(BYTE *)&DBBookmarkTwo;
DBCOUNTITEM cbBookmark=1;
DBCOMPARE dwComparison;
DBHASHVALUE HashedValues = NULL;
BOOL fTestPass=FALSE;
//start a transaction
if(!StartTransaction(SELECT_ORDERBYNUMERIC, (IUnknown **)&pIRowsetLocate,
1, &m_DBPropSet))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),S_OK))
goto CLEANUP;
//the two bookmark should be the same
if(!COMPARE(dwComparison, DBCOMPARE_NE))
goto CLEANUP;
//commit the transaction with fRetaining==FALSE
if(!GetCommit(FALSE))
goto CLEANUP;
if(!m_fCommitPreserve)
{
//zombie
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),E_UNEXPECTED))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmarkOne,
5,1,&cRows,&pHRow),E_UNEXPECTED))
goto CLEANUP;
//no row should be retrieved
COMPARE(pHRow, NULL);
if(!CHECK(pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HRowByBookmark,&DBRowStatus),E_UNEXPECTED))
goto CLEANUP;
//no row should be retrieved
COMPARE(HRowByBookmark, DB_NULL_HROW);
if(!CHECK(pIRowsetLocate->Hash(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HashedValues,&DBRowStatus),E_UNEXPECTED))
goto CLEANUP;
}
else
{
//fully functional
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),S_OK))
goto CLEANUP;
//the two bookmark should be the same
if(!COMPARE(dwComparison, DBCOMPARE_NE))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmarkOne,
5,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//1 row should be retrieved
COMPARE(cRows, 1);
//DB_E_ERRORSOCCURRED - Cannot be standard bookmarks DBBMK_FIRST
if(!CHECK(pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HRowByBookmark,&DBRowStatus), DB_E_ERRORSOCCURRED))
goto CLEANUP;
//no rows should be retrieved
COMPARE(DBRowStatus, DBROWSTATUS_E_INVALID);
COMPARE(HRowByBookmark,NULL);
//DB_E_ERRORSOCCURRED - Cannot be standard bookmarks DBBMK_FIRST
if(!CHECK(pIRowsetLocate->Hash(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HashedValues,&DBRowStatus), DB_E_ERRORSOCCURRED))
goto CLEANUP;
COMPARE(DBRowStatus, DBROWSTATUS_E_INVALID);
COMPARE(HashedValues, NULL);
}
fTestPass=TRUE;
CLEANUP:
//release memory
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(HRowByBookmark)
{
CHECK(m_pIRowset->ReleaseRows(1,&HRowByBookmark,NULL,NULL,NULL),S_OK);
}
//release the interface pointer
SAFE_RELEASE(pIRowsetLocate);
//clean up. Expected XACT_E_NOTRANSACTION.
CleanUpTransaction(XACT_E_NOTRANSACTION);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Abort with retaining.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Zombie::Variation_3()
{
IRowsetLocate *pIRowsetLocate=NULL;
HROW *pHRow=NULL;
HROW HRowByBookmark=NULL;
DBCOUNTITEM cRows;
DBROWSTATUS DBRowStatus;
DBBOOKMARK DBBookmarkOne=DBBMK_LAST;
BYTE *pBookmarkOne=(BYTE *)&DBBookmarkOne;
DBBOOKMARK DBBookmarkTwo=DBBMK_LAST;
BYTE *pBookmarkTwo=(BYTE *)&DBBookmarkTwo;
ULONG_PTR cbBookmark=1;
DBCOMPARE dwComparison;
DBHASHVALUE HashedValues = NULL;
BOOL fTestPass=FALSE;
//start a transaction
if(!StartTransaction(SELECT_ORDERBYNUMERIC, (IUnknown **)&pIRowsetLocate,
1, &m_DBPropSet))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),S_OK))
goto CLEANUP;
//the two bookmark should be the same
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
//Abort the transaction with fRetaining==TRUE
if(!GetAbort(TRUE))
goto CLEANUP;
if(!m_fAbortPreserve)
{
//zombie
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),E_UNEXPECTED))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmarkOne,
5,1,&cRows,&pHRow),E_UNEXPECTED))
goto CLEANUP;
//no row should be retrieved
COMPARE(pHRow, NULL);
if(!CHECK(pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HRowByBookmark,&DBRowStatus),E_UNEXPECTED))
goto CLEANUP;
//no row should be retrieved
COMPARE(HRowByBookmark, DB_NULL_HROW);
if(!CHECK(pIRowsetLocate->Hash(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HashedValues,&DBRowStatus),E_UNEXPECTED))
goto CLEANUP;
}
else
{
//fully functional
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),S_OK))
goto CLEANUP;
//the two bookmark should be the same
if(!COMPARE(dwComparison, DBCOMPARE_EQ))
goto CLEANUP;
//DB_E_BADSTARTPOSION - 5 rows after DBBMK_LAST
if(!CHECK(pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmarkOne,
5,1,&cRows,&pHRow),DB_S_ENDOFROWSET))
goto CLEANUP;
//0 rows should be retrieved
COMPARE(cRows, 0);
//DB_E_ERRORSOCCURRED - Cannot be standard bookmarks DBBMK_FIRST
if(!CHECK(pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HRowByBookmark,&DBRowStatus), DB_E_ERRORSOCCURRED))
goto CLEANUP;
//no rows should be retrieved
COMPARE(DBRowStatus, DBROWSTATUS_E_INVALID);
COMPARE(HRowByBookmark,NULL);
//DB_E_ERRORSOCCURRED - Cannot be standard bookmarks DBBMK_FIRST
if(!CHECK(pIRowsetLocate->Hash(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HashedValues,&DBRowStatus), DB_E_ERRORSOCCURRED))
goto CLEANUP;
COMPARE(DBRowStatus, DBROWSTATUS_E_INVALID);
COMPARE(HashedValues, NULL);
}
fTestPass=TRUE;
CLEANUP:
//release memory
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(HRowByBookmark)
{
CHECK(m_pIRowset->ReleaseRows(1,&HRowByBookmark,NULL,NULL,NULL),S_OK);
}
//release the interface pointer
SAFE_RELEASE(pIRowsetLocate);
//clean up. Expected S_OK.
CleanUpTransaction(S_OK);
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Abort without retaining.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Zombie::Variation_4()
{
IRowsetLocate *pIRowsetLocate=NULL;
HROW *pHRow=NULL;
HROW HRowByBookmark=NULL;
DBCOUNTITEM cRows;
DBROWSTATUS DBRowStatus;
DBBOOKMARK DBBookmarkOne=DBBMK_LAST;
BYTE *pBookmarkOne=(BYTE *)&DBBookmarkOne;
DBBOOKMARK DBBookmarkTwo=DBBMK_FIRST;
BYTE *pBookmarkTwo=(BYTE *)&DBBookmarkTwo;
ULONG_PTR cbBookmark=1;
DBCOMPARE dwComparison;
DBHASHVALUE HashedValues = NULL;
BOOL fTestPass=FALSE;
//start a transaction
if(!StartTransaction(SELECT_ORDERBYNUMERIC, (IUnknown **)&pIRowsetLocate,
1, &m_DBPropSet))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),S_OK))
goto CLEANUP;
//the two bookmark should be the same
if(!COMPARE(dwComparison, DBCOMPARE_NE))
goto CLEANUP;
//Abort the transaction with fRetaining==FALSE
if(!GetAbort(FALSE))
goto CLEANUP;
if(!m_fAbortPreserve)
{
//zombie
if(!CHECK(pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,pBookmarkOne,
STD_BOOKMARKLENGTH,pBookmarkTwo,&dwComparison),E_UNEXPECTED))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmarkOne,
5,1,&cRows,&pHRow),E_UNEXPECTED))
goto CLEANUP;
//no row should be retrieved
COMPARE(pHRow, NULL);
if(!CHECK(pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HRowByBookmark,&DBRowStatus),E_UNEXPECTED))
goto CLEANUP;
//no row should be retrieved
COMPARE(HRowByBookmark, DB_NULL_HROW);
if(!CHECK(pIRowsetLocate->Hash(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HashedValues,&DBRowStatus),E_UNEXPECTED))
goto CLEANUP;
}
else
{
//fully functional
if(!CHECK(pIRowsetLocate->Compare(NULL,1,pBookmarkOne,
1,pBookmarkTwo,&dwComparison),S_OK))
goto CLEANUP;
//the two bookmark should be the same
if(!COMPARE(dwComparison, DBCOMPARE_NE))
goto CLEANUP;
if(!CHECK(pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmarkTwo,
5,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//1 row should be retrieved
COMPARE(cRows, 1);
//DB_E_ERRORSOCCURRED - Cannot be standard bookmarks DBBMK_FIRST
if(!CHECK(pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HRowByBookmark,&DBRowStatus), DB_E_ERRORSOCCURRED))
goto CLEANUP;
//no rows should be retrieved
COMPARE(DBRowStatus, DBROWSTATUS_E_INVALID);
COMPARE(HRowByBookmark,NULL);
//DB_E_ERRORSOCCURRED - Cannot be standard bookmarks DBBMK_FIRST
if(!CHECK(pIRowsetLocate->Hash(NULL,1,&cbBookmark,
(const BYTE **)&pBookmarkOne,&HashedValues,&DBRowStatus), DB_E_ERRORSOCCURRED))
goto CLEANUP;
COMPARE(DBRowStatus, DBROWSTATUS_E_INVALID);
COMPARE(HashedValues, NULL);
}
fTestPass=TRUE;
CLEANUP:
//release memory
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(HRowByBookmark)
{
CHECK(m_pIRowset->ReleaseRows(1,&HRowByBookmark,NULL,NULL,NULL),S_OK);
}
//release the interface pointer
SAFE_RELEASE(pIRowsetLocate);
//clean up. Expected XACT_E_NOTRANSACTION.
CleanUpTransaction(XACT_E_NOTRANSACTION);
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Zombie::Terminate()
{
if(m_DBPropSet.rgProperties)
PROVIDER_FREE(m_DBPropSet.rgProperties);
// {{ TCW_TERM_BASECLASS_CHECK2
return(CTransaction::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Rowset_BigRowset)
//*-----------------------------------------------------------------------
//| Test Case: Rowset_BigRowset - test basic functionality on a big rowset
//| Created: 02/12/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_BigRowset::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetLocate::Init())
// }}
{
return TRUE;
}
return FALSE;
}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL Rowset_BigRowset::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(keysetCursor)
//*-----------------------------------------------------------------------
//| Test Case: keysetCursor - test GetRowsAt via a keyset driven cursor
//| Created: 03/11/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL keysetCursor::Init()
{
BOOL fTestPass = FALSE;
DBPROPID guidPropertySet[4];
ULONG cPrptSet=0;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
guidPropertySet[cPrptSet++]=DBPROP_CANFETCHBACKWARDS;
guidPropertySet[cPrptSet++]=DBPROP_CANSCROLLBACKWARDS;
guidPropertySet[cPrptSet++]=DBPROP_CANHOLDROWS;
guidPropertySet[cPrptSet++]=DBPROP_OTHERUPDATEDELETE;
//create a rowset and an accessor.
//DBPROP_CANFETCHBACKWARDS and DBPROP_CANSCROLLBACKWARDS and DBPROP_CANHOLDROWS
//are requested
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
cPrptSet,guidPropertySet));
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Bookmark points to the second row. lRowOffset=-1 cRows=-1. S_OK is returned and the first row handle is retrieved.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int keysetCursor::Variation_1()
{
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
DBCOUNTITEM cRowsObtained;
HROW *pHRow=NULL;
BOOL fTestPass=FALSE;
//get a bookmark for the second row
if(!GetBookmark(2,&cbBookmark,&pBookmark))
goto CLEANUP;
//lRowOffset=-1 cRows=-1
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark, -1, -1,
&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//only one row should be retrieved
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//the first row should be retrieved
if(COMPARE(VerifyRowPosition(*pHRow, 1, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the bookmark
PROVIDER_FREE(pBookmark);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark points to the third row. lRowOffset=-1 and cRows=-3. DB_S_ENDOFROWSET is returned and the 2nd and 1st row handles
//
// @rdesc TEST_PASS or TEST_FAIL
//
int keysetCursor::Variation_2()
{
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
DBCOUNTITEM cRowsObtained;
HROW *pHRow=NULL;
BOOL fTestPass=FALSE;
//get a bookmark for the third row
if(!GetBookmark(3,&cbBookmark,&pBookmark))
goto CLEANUP;
//lRowOffset=-1 cRows=-3
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark, -1, -3,
&cRowsObtained,&pHRow),DB_S_ENDOFROWSET))
goto CLEANUP;
//two rows should be retrieved
if(!COMPARE(cRowsObtained, 2))
goto CLEANUP;
//the second row should be retrieved first
if(!COMPARE(VerifyRowPosition(*pHRow, 2, g_pCTable),TRUE))
goto CLEANUP;
//the first row should be retrieved
if(COMPARE(VerifyRowPosition(pHRow[1], 1, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the bookmark
PROVIDER_FREE(pBookmark);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark points to the 4th row. lRowstOffset=-1 and cRows=-3. S_OK is returned. Do not release the row handle.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int keysetCursor::Variation_3()
{
ULONG_PTR cbFirstBookmark;
BYTE *pFirstBookmark=NULL;
ULONG_PTR cbSecondBookmark;
BYTE *pSecondBookmark=NULL;
DBCOUNTITEM cFirstRowsObtained;
DBCOUNTITEM cSecondRowsObtained;
HROW *pFirstHRow=NULL;
HROW *pSecondHRow=NULL;
BOOL fTestPass=FALSE;
//get a bookmark for the 4th row
if(!GetBookmark(4,&cbFirstBookmark,&pFirstBookmark))
goto CLEANUP;
//get a bookmark for the 5th row
if(!GetBookmark(5,&cbSecondBookmark,&pSecondBookmark))
goto CLEANUP;
//lRowOffset=-1 cRows=-3
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbFirstBookmark,pFirstBookmark, -1, -3,
&cFirstRowsObtained,&pFirstHRow),S_OK))
goto CLEANUP;
//three rows should be retrieved
if(!COMPARE(cFirstRowsObtained, 3))
goto CLEANUP;
//the third row is the first row handle to retrieve
if(!COMPARE(VerifyRowPosition(*pFirstHRow, 3, g_pCTable),TRUE))
goto CLEANUP;
// *pBookmark points to the 5th row. lRowstOffset=-1 and cRows=-1.
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbSecondBookmark,pSecondBookmark,
-1, -1, &cSecondRowsObtained,&pSecondHRow),S_OK))
goto CLEANUP;
//only one row should be retrieved
if(!COMPARE(cSecondRowsObtained, 1))
goto CLEANUP;
//the 4th row handle should be retrieved
if(COMPARE(VerifyRowPosition(*pSecondHRow, 4, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the bookmark
PROVIDER_FREE(pFirstBookmark);
PROVIDER_FREE(pSecondBookmark);
//release the row handle
if(pFirstHRow)
{
CHECK(m_pIRowset->ReleaseRows(cFirstRowsObtained,pFirstHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pFirstHRow);
}
//release the row handle
if(pSecondHRow)
{
CHECK(m_pIRowset->ReleaseRows(cSecondRowsObtained,pSecondHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pSecondHRow);
}
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark=DBBMK_FIRST. Get one row handle at a time (lRowsetOffset==0 and cRows==1
//
// @rdesc TEST_PASS or TEST_FAIL
//
int keysetCursor::Variation_4()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained;
HROW hRow[1];
HROW *pHRow=hRow;
DBCOUNTITEM cRowCount;
//get one row handle at a time, from the first row
for(cRowCount=0; cRowCount<ULONG(g_lRowLast); cRowCount++)
{
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,cRowCount,
1,&cRowsObtained,&pHRow),S_OK))
return TEST_FAIL;
//verify the row position
if(!COMPARE(VerifyRowPosition(hRow[0],cRowCount+1,g_pCTable),TRUE))
{
CHECK(m_pIRowset->ReleaseRows(1,hRow,NULL,NULL,NULL),S_OK);
return TEST_FAIL;
}
else
CHECK(m_pIRowset->ReleaseRows(1,hRow,NULL,NULL,NULL),S_OK);
}
return TEST_PASS;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL keysetCursor::Terminate()
{
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(ExtendedErrors)
//*-----------------------------------------------------------------------
//| Test Case: ExtendedErrors - Extended Errors
//| Created: 07/23/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ExtendedErrors::Init()
{
//Create an object for checking extended errors, which will use
//m_pError to increment the error count as needed.
m_pExtError = new CExtError(m_pThisTestModule->m_ProviderClsid, m_pError);
if (!m_pExtError)
return FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Valid IRowsetLocate calls with previous error object existing.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_1()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_EQ;
DBHASHVALUE rgHashedValues[2];
BOOL fTestPass=FALSE;
HRESULT hr;
//For each method of the interface, first create an error object on
//the current thread, try get a success from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
//create a rowset and accessor. DBPROP_BOOKMARKS should be supported if
//IRowsetLocate is requested on the rowset
if(!GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTFROMTBL, IID_IRowsetLocate))
return TEST_FAIL;
if(GetProp(DBPROP_ORDEREDBOOKMARKS))
m_fOrderedBookmark=TRUE;
//get the bookmark for the 30th row
if(!GetBookmark(g_lRowLast/2,&rgcbBookmarks[0],&rgpBookmarks[0]))
{
fTestPass = FALSE;
goto CLEANUP;
}
//get the bookmark for the 20th row
if(!GetBookmark(g_lRowLast/3,&rgcbBookmarks[1],&rgpBookmarks[1]))
{
fTestPass = FALSE;
goto CLEANUP;
}
m_pExtError->CauseError();
//Compare return DBCOMPARE_NE for the different row
if(CHECK(hr=m_pIRowsetLocate->Compare(NULL,rgcbBookmarks[0],rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),S_OK))
//Do extended check following Compare
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
else
{
fTestPass = FALSE;
goto CLEANUP;
}
if(m_fOrderedBookmark)
{
if(!COMPARE(dwComparison, DBCOMPARE_GT))
{
fTestPass = FALSE;
goto CLEANUP;
}
}
else
{
if(!COMPARE(dwComparison, DBCOMPARE_NE))
{
fTestPass = FALSE;
goto CLEANUP;
}
}
m_pExtError->CauseError();
//Hash returns different values
if(CHECK(hr=m_pIRowsetLocate->Hash(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHashedValues,NULL),S_OK))
//Do extended check following Hash
fTestPass &= XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
else
{
fTestPass = FALSE;
goto CLEANUP;
}
if(rgHashedValues[0]!=rgHashedValues[1])
fTestPass &=TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Valid IRowsetLocate calls with previous error object existing.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_2()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowsObtained;
HROW hRow[1];
HROW *pHRow=hRow;
HRESULT hr;
BOOL fTestPass = FALSE;
//For each method of the interface, first create an error object on
//the current thread, try get a success from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
//create a rowset and accessor. DBPROP_BOOKMARKS should be supported if
//IRowsetLocate is requested on the rowset
if(!GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTFROMTBL, IID_IRowsetLocate))
return TEST_FAIL;
m_pExtError->CauseError();
// *pBookmark=DBBMK_LAST and IRowsetOffset==0. cRows=1.
if(CHECK(hr=m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,
1,&cRowsObtained,&pHRow),S_OK))
//Do extended check following GetRowsAt
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
else
{
fTestPass = FALSE;
goto CLEANUP;
}
//the last row should be retrieved
if(!COMPARE(cRowsObtained, 1))
{
fTestPass = FALSE;
goto CLEANUP;
}
if(!CHECK(m_pIRowset->ReleaseRows(1,hRow,NULL,NULL,NULL),S_OK))
{
fTestPass = FALSE;
goto CLEANUP;
}
//repeat
if(!CHECK(hr=m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,
1,&cRowsObtained,&pHRow),S_OK))
{
fTestPass = FALSE;
goto CLEANUP;
}
//the last row should be retrieved
if(!COMPARE(cRowsObtained, 1))
{
fTestPass = FALSE;
goto CLEANUP;
}
if(!CHECK(m_pIRowset->ReleaseRows(1,hRow,NULL,NULL,NULL),S_OK))
{
fTestPass = FALSE;
goto CLEANUP;
}
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc valid IRowsetLocate calls with previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_3()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
HROW rgHRow[2];
DBREFCOUNT cRefCount;
DBROWSTATUS rgDBRowStatus[2];
BOOL fTestPass=FALSE;
HRESULT hr;
//For each method of the interface, first create an error object on
//the current thread, try get a success from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
//create a rowset and accessor. DBPROP_BOOKMARKS should be supported if
//IRowsetLocate is requested on the rowset
if(!GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTFROMTBL, IID_IRowsetLocate))
return TEST_FAIL;
//get the bookmark for the 5th row
if(!GetBookmark(5,&rgcbBookmarks[0],&rgpBookmarks[0]))
return TEST_FAIL;
//get the bookmark for the 5th row again
if(!GetBookmark(5,&rgcbBookmarks[1],&rgpBookmarks[1]))
goto CLEANUP;
//create an error object
m_pExtError->CauseError();
//get the row handle
if(CHECK(hr=m_pIRowsetLocate->GetRowsByBookmark(NULL,2,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHRow,rgDBRowStatus),S_OK))
//Do extended check following GetRowsByBookmark
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
else
{
fTestPass = FALSE;
goto CLEANUP;
}
if(!(COMPARE(rgDBRowStatus[0], DBROWSTATUS_S_OK) &&
COMPARE(rgDBRowStatus[1], DBROWSTATUS_S_OK)))
goto CLEANUP;
//Release the row handle, The reference count should be 1
if(!CHECK(m_pIRowset->ReleaseRows(1,rgHRow,NULL,&cRefCount,NULL),S_OK))
goto CLEANUP;
//If the HRows are the same ref count should be 1 after release
if(!COMPARE(cRefCount,ULONG(((rgHRow[0] == rgHRow[1]) ? 1 : 0))))
goto CLEANUP;
//release again
if(!CHECK(m_pIRowset->ReleaseRows(1,&(rgHRow[1]),NULL,&cRefCount,NULL),S_OK))
goto CLEANUP;
fTestPass = TRUE;
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc DB_E_CANTSCROLLBACKWARDS GetRowsAt call with previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_4()
{
HRESULT hr;
BOOL fTestPass=FALSE;
DBPROPID rgPropertiesUnset[2];
//For each method of the interface, with no error object on
//the current thread, try get a failure from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
rgPropertiesUnset[0]= DBPROP_CANSCROLLBACKWARDS;
rgPropertiesUnset[1]= DBPROP_IRowsetLocate;
//create a rowset and accessor
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowset,
0,NULL,2,rgPropertiesUnset,DBACCESSOR_PASSBYREF));
//get a valid bookmark value, points to the first row
m_pHRow=&m_hRow;
m_cbBookmark=1;
m_DBBookmark=DBBMK_LAST;
m_pBookmark=(BYTE *)&m_DBBookmark;
m_cRowsObtained=1;
// Queryinterface for IRowsetLocate
if(!VerifyInterface(m_pIRowset, IID_IRowsetLocate,
ROWSET_INTERFACE,(IUnknown **)&m_pIRowsetLocate))
goto CLEANUP;
//create an error object
m_pExtError->CauseError();
if(CHECK(hr=m_pIRowsetLocate->GetRowsAt(NULL,NULL,m_cbBookmark,m_pBookmark,-1,1,
&m_cRowsObtained,&m_pHRow),DB_E_CANTSCROLLBACKWARDS))
{
//Do extended check following GetRowsAt
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
COMPARE(m_cRowsObtained,0);
}
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG Compare call with previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_5()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_EQ;
BOOL fTestPass=FALSE;
HRESULT hr;
//For each method of the interface, first create an error object on
//the current thread, try get a failure from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
//create a rowset and accessor. DBPROP_BOOKMARKS should be supported if
//IRowsetLocate is requested on the rowset
if(!GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTFROMTBL, IID_IRowsetLocate))
return TEST_FAIL;
//get the bookmark for the 30th row
if(!GetBookmark(ULONG(g_lRowLast/2),&rgcbBookmarks[0],&rgpBookmarks[0]))
{
fTestPass = FALSE;
goto CLEANUP;
}
//get the bookmark for the 20th row
if(!GetBookmark(ULONG(g_lRowLast/3),&rgcbBookmarks[1],&rgpBookmarks[1]))
{
fTestPass = FALSE;
goto CLEANUP;
}
m_pExtError->CauseError();
if(CHECK(hr=m_pIRowsetLocate->Compare(NULL,0,rgpBookmarks[0],
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),E_INVALIDARG))
//Do extended check following Compare
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
else
{
fTestPass = FALSE;
goto CLEANUP;
}
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG Hash call with previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_6()
{
HRESULT hr;
BOOL fTestPass=FALSE;
//For each method of the interface, first create an error object on
//the current thread, try get a failure from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
//create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetLocate))
return TEST_FAIL;
m_rgpBookmarks[0]=NULL;
m_DBBookmark=DBBMK_LAST;
//get a valid bookmark value
if(!GetBookmark(3,m_rgcbBookmarks, m_rgpBookmarks))
goto CLEANUP;
m_pExtError->CauseError();
if(CHECK(hr=m_pIRowsetLocate->Hash(NULL,1,NULL,(const BYTE **)m_rgpBookmarks,
m_rgHashedValues,NULL),E_INVALIDARG))
//Do extended check following Hash
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
CLEANUP:
//free the memory used by the bookmark
PROVIDER_FREE(m_rgpBookmarks[0]);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG GetRowsByBookMark call with previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_7()
{
HRESULT hr;
BOOL fTestPass = FALSE;
//For each method of the interface, first create an error object on
//the current thread, try get a failure from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
//create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate))
return TEST_FAIL;
m_rgpBookmarks[0]=NULL;
m_rgpBookmarks[1]=NULL;
m_cbBookmark=1;
m_pHRow=m_rghRows;
m_DBBookmark=DBBMK_LAST;
//get a valid bookmark value
if(!GetBookmark(5,&m_cbBookmark, &m_rgpBookmarks[0]))
goto CLEANUP;
m_pExtError->CauseError();
//Do extended check following GetRowsByBookmark
if(CHECK(hr=m_pIRowsetLocate->GetRowsByBookmark(NULL,1,NULL,(const BYTE **)m_rgpBookmarks,
m_pHRow, NULL),E_INVALIDARG))
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
CLEANUP:
//free memory used by the bookmark
PROVIDER_FREE(m_rgpBookmarks[0]);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc DB_E_CANTFETCHBACKWARDS GetRowsAt call with no previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_8()
{
HRESULT hr;
BOOL fTestPass=FALSE;
DBPROPID rgPropertiesUnset[1];
//For each method of the interface, with no error object on
//the current thread, try get a failure from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
rgPropertiesUnset[0]= DBPROP_CANFETCHBACKWARDS;
//create a rowset and accessor
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
0,NULL,1,rgPropertiesUnset,DBACCESSOR_PASSBYREF));
//get a valid bookmark value, points to the first row
m_pHRow=&m_hRow;
m_cbBookmark=1;
m_DBBookmark=DBBMK_FIRST;
m_pBookmark=(BYTE *)&m_DBBookmark;
m_cRowsObtained=1;
//Do extended check following GetRowsAt
if(CHECK(hr=m_pIRowsetLocate->GetRowsAt(NULL,NULL,m_cbBookmark,m_pBookmark,0,-1,
&m_cRowsObtained,&m_pHRow),DB_E_CANTFETCHBACKWARDS))
{
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
COMPARE(m_cRowsObtained,0);
}
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc DB_E_BADBOOKMARK Compare call with no previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_9()
{
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
DBCOMPARE dwComparison=DBCOMPARE_EQ;
BOOL fTestPass=FALSE;
HRESULT hr;
DBBOOKMARK DBBookmark=DBBMK_INVALID;
//For each method of the interface, first create an error object on
//the current thread, try get a failure from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
//create a rowset and accessor. DBPROP_BOOKMARKS should be supported if
//IRowsetLocate is requested on the rowset
if(!GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTFROMTBL, IID_IRowsetLocate))
return TEST_FAIL;
//get the bookmark for the 30th row
if(!GetBookmark(ULONG(g_lRowLast/2),&rgcbBookmarks[0],&rgpBookmarks[0]))
{
fTestPass = FALSE;
goto CLEANUP;
}
//get the bookmark for the 20th row
if(!GetBookmark(ULONG(g_lRowLast/3),&rgcbBookmarks[1],&rgpBookmarks[1]))
{
fTestPass = FALSE;
goto CLEANUP;
}
if(CHECK(hr=m_pIRowsetLocate->Compare(NULL,STD_BOOKMARKLENGTH,(BYTE *)&DBBookmark,
rgcbBookmarks[1],rgpBookmarks[1],&dwComparison),DB_E_BADBOOKMARK))
//Do extended check following Compare
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
else
{
fTestPass = FALSE;
goto CLEANUP;
}
CLEANUP:
//free memory pointed by the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG Hash call with no previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_10()
{
HRESULT hr;
BOOL fTestPass=FALSE;
//For each method of the interface, with no error object on
//the current thread, try get a failure from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
//create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ALLFROMTBL, IID_IRowsetLocate))
return TEST_FAIL;
m_rgpBookmarks[0]=NULL;
m_DBBookmark=DBBMK_LAST;
//get a valid bookmark value
if(!GetBookmark(3,m_rgcbBookmarks, m_rgpBookmarks))
goto CLEANUP;
if(CHECK(hr=m_pIRowsetLocate->Hash(NULL,1,NULL,(const BYTE **)m_rgpBookmarks,
m_rgHashedValues,NULL),E_INVALIDARG))
//Do extended check following Hash
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
CLEANUP:
//free the memory used by the bookmark
PROVIDER_FREE(m_rgpBookmarks[0]);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc E_INVALIDARG GetRowsByBookMark call with no previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_11()
{
HRESULT hr;
BOOL fTestPass = FALSE;
//For each method of the interface, with no error object on
//the current thread, try get a failure from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
//create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate))
return TEST_FAIL;
m_rgpBookmarks[0]=NULL;
m_rgpBookmarks[1]=NULL;
m_cbBookmark=1;
m_pHRow=m_rghRows;
m_DBBookmark=DBBMK_LAST;
//get a valid bookmark value
if(!GetBookmark(5,&m_cbBookmark, &m_rgpBookmarks[0]))
goto CLEANUP;
if(CHECK(hr=m_pIRowsetLocate->GetRowsByBookmark(NULL,1,NULL,(const BYTE **)m_rgpBookmarks,
m_pHRow, NULL),E_INVALIDARG))
//Do extended check following GetRowsByBookmark
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
CLEANUP:
//free memory used by the bookmark
PROVIDER_FREE(m_rgpBookmarks[0]);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//--------------------------------------------------------------------
// @mfunc DB_E_BADSTARTPOSTION
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ExtendedErrors::Variation_12()
{
HRESULT hr;
BOOL fTestPass=FALSE;
//For each method of the interface, first create an error object on
//the current thread, try get a failure from the IRowsetLocate method.
//We then check extended errors to verify the right extended error behavior.
//create a rowset and accessor
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
0,NULL,0,NULL,DBACCESSOR_PASSBYREF))
return TEST_FAIL;
//get a valid bookmark value, points to the first row
m_pHRow=&m_hRow;
m_cbBookmark=1;
m_DBBookmark=DBBMK_FIRST;
m_pBookmark=(BYTE *)&m_DBBookmark;
m_cRowsObtained=1;
m_pExtError->CauseError();
if(CHECK(hr=m_pIRowsetLocate->GetRowsAt(NULL,NULL,m_cbBookmark,m_pBookmark,-5,1,
&m_cRowsObtained,&m_pHRow),DB_S_ENDOFROWSET))
//Do extended check following GetRowsAt
fTestPass = XCHECK(m_pIRowsetLocate, IID_IRowsetLocate, hr);
COMPARE(m_cRowsObtained,0);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ExtendedErrors::Terminate()
{
//free error object
if (m_pExtError)
delete m_pExtError;
m_pExtError = NULL;
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(DeleteRows)
//*-----------------------------------------------------------------------
//| Test Case: DeleteRows - delete rows from the rowset
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL DeleteRows::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(!TCIRowsetLocate::Init())
// }}
return FALSE;
if (!AlteringRowsIsOK())
return TEST_SKIPPED;
return TRUE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark points to a deleted row. DB_E_BADBOOKMARK is returned and no row handles will be retrieved.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_1()
{
DBPROPID guidProperty[4];
HROW *pHRow=NULL;
HROW *pHRowDeleted=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_OTHERUPDATEDELETE;
guidProperty[2]=DBPROP_UPDATABILITY;
guidProperty[3]=DBPROP_CANHOLDROWS;
//set DBPROP_OTHERUPDATELETE is supported
//open rowset, and accessor. Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
4,guidProperty));
//get the bookmark for the 5th row
if(!GetBookmark(5, &cbBookmark, &pBookmark))
goto CLEANUP;
//get the row handle for the 5th row
if(!CHECK(m_pIRowset->GetNextRows(NULL,4,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 1);
//QI for IRowsetChange pointer
if(!CHECK(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange),S_OK))
goto CLEANUP;
//delete the row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
// *pBookmark points to a deleted row. DB_E_BADBOOKMARK
if(BookmarkSkipped())
{
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,0,1,
&cRowsObtained,&pHRowDeleted), DB_S_BOOKMARKSKIPPED))
goto CLEANUP;
if(COMPARE(cRowsObtained, 1) && COMPARE(VerifyRowPosition(*pHRowDeleted,6,g_pCTable),TRUE))
fTestPass=TRUE;
}
else
{
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,0,1,
&cRowsObtained,&pHRowDeleted), DB_E_BADBOOKMARK))
goto CLEANUP;
//no row should be retrieved
if(COMPARE(cRowsObtained,0) && COMPARE(pHRowDeleted, NULL))
fTestPass=TRUE;
}
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
if(pHRowDeleted)
CHECK(m_pIRowset->ReleaseRows(1,pHRowDeleted,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRowDeleted);
//release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Delete the 4th row. *pBookmark points to the second row. lRowOffset=3 and cRows=1. S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_2()
{
DBPROPID guidProperty[2];
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_UPDATABILITY;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
2,guidProperty));
//get the bookmark for the 2nd row
if(!GetBookmark(2, &cbBookmark, &pBookmark))
goto CLEANUP;
//get the row handle for the 4th row
if(!CHECK(m_pIRowset->GetNextRows(NULL,3,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 1);
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 4th row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark points to the second row. lRowOffset=3 and cRows=1
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,3,1,
&cRowsObtained,&pHRow), S_OK))
goto CLEANUP;
//the 5th row should be retrieved
if(RemoveDeleted())
{
if(COMPARE(VerifyRowPosition(*pHRow, 6, g_pCTable),TRUE))
fTestPass=TRUE;
}
else
{
if(COMPARE(VerifyRowPosition(*pHRow, 5, g_pCTable),TRUE))
fTestPass=TRUE;
}
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Delete the 5th row. *pBookmark points to the 4th row. lRowOffset=1 and cRows=1. S_OK
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_3()
{
/* TO DO
DBPROPID guidProperty[2] = {DBPROP_IRowsetChange, DBPROP_OTHERUPDATEDELETE};
ULONG cProperties = NUMELEM(guidProperty);
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark=0, cbDeleteBookmark=0;
BYTE *pBookmark=NULL, *pDeleteBookmark=NULL;
BOOL fTestPass=FALSE;
//open rowset and accessor, Request IRowsetDeleteBookmarks and IRowsetLocate
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
cProperties,guidProperty))
return TEST_SKIPPED;
//get the 5th row
if(!CHECK(m_pIRowset->GetNextRows(NULL,3,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//get the bookmark for the 4th row
if(!GetBookmark(4, &cbBookmark, &pBookmark))
goto CLEANUP;
//get the bookmark for the 5th row
if(!GetBookmark(5, &cbDeleteBookmark, &pDeleteBookmark))
goto CLEANUP;
//QI for IRowsetDelete pointer
if(!CHECK(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange),S_OK))
goto CLEANUP;
//delete the 5th row
if(!CHECK(pIRowsetDelete->DeleteRowsByBookmark(NULL,1,
&cbDeleteBookmark,(const BYTE **)&pDeleteBookmark,NULL,NULL,NULL),S_OK))
goto CLEANUP;
// *pBookmark points to the 4th row. lRowOffset=1 and cRows=1
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,1,1,
&cRowsObtained,&pHRow), S_OK))
goto CLEANUP;
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//the 5th row should be retrieved
if(COMPARE(VerifyRowPosition(*pHRow, 5, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the bookmark
PROVIDER_FREE(pBookmark);
PROVIDER_FREE(pDeleteBookmark);
ReleaseRowsetAndAccessor();
if(fTestPass)
return TEST_PASS;
else
return TEST_FAIL;
*/
return TEST_SKIPPED;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Delete the second row. Pass an array of 3 bookmarks: bookmark to the second row, to the first row, and to the second row. DB_
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_4()
{
DBPROPID guidProperty[3];
DBCOUNTITEM cRows;
HROW *pHRow=NULL;
HROW rgHRow[3]={NULL, NULL, NULL};
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR rgcbBookmarks[3];
BYTE *rgpBookmarks[3]={NULL,NULL,NULL};
ULONG_PTR ulCount;
DBROWSTATUS rgDBRowStatus[3];
BOOL fTestPass=FALSE;
guidProperty[0]=DBPROP_IRowsetChange;
guidProperty[1]=DBPROP_OTHERUPDATEDELETE;
guidProperty[2]=DBPROP_UPDATABILITY;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(guidProperty),guidProperty));
//get the bookmark for the 2nd row
if(!GetBookmark(2, &rgcbBookmarks[0], &rgpBookmarks[0]))
goto CLEANUP;
if(!GetBookmark(1, &rgcbBookmarks[1], &rgpBookmarks[1]))
goto CLEANUP;
if(!GetBookmark(2, &rgcbBookmarks[2], &rgpBookmarks[2]))
goto CLEANUP;
//Restart position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
//get the row handle for the 2nd row
if(!CHECK(m_pIRowset->GetNextRows(NULL,1,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRows, 1);
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_hr=m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 2nd row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRows,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
//Pass an array of 3 bookmarks: bookmark to the second row,
//to the first row, and to the second row
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,3,rgcbBookmarks,
(const BYTE **)rgpBookmarks, rgHRow,rgDBRowStatus),
DB_S_ERRORSOCCURRED))
goto CLEANUP;
//only one row is retrieved
if(!COMPARE(rgHRow[0],DB_NULL_HROW) && !COMPARE(rgHRow[2],DB_NULL_HROW))
goto CLEANUP;
//Verify the first row is retrieved
COMPARE(VerifyRowPosition(rgHRow[1], 1, g_pCTable), TRUE);
if( COMPARE(rgDBRowStatus[0], DBROWSTATUS_E_INVALID) &&
COMPARE(rgDBRowStatus[1], DBROWSTATUS_S_OK) &&
COMPARE(rgDBRowStatus[2], DBROWSTATUS_E_INVALID)
)
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the bookmark
for(ulCount=0; ulCount<3; ulCount++)
PROVIDER_FREE(rgpBookmarks[ulCount]);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Get the 3rd row handle. GetRowsAt. Delete the 3rd row. GetNextRows
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_5()
{
HROW *pHRow=NULL;
DBCOUNTITEM cRows;
DBPROPID rgDBPropID[4]={DBPROP_IRowsetChange,
DBPROP_UPDATABILITY,
DBPROP_CANSCROLLBACKWARDS,
DBPROP_CANFETCHBACKWARDS,
};
IRowsetChange *pIRowsetChange=NULL;
BOOL fTestPass=FALSE;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgDBPropID),rgDBPropID));
//get the 3rd row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 3rd row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
//getNextRows
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//the 4th row should be retrieved
if(!COMPARE(VerifyRowPosition(*pHRow, 4,g_pCTable), TRUE))
goto CLEANUP;
//release
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
PROVIDER_FREE(pHRow);
pHRow=NULL;
//restartposition
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
if(RemoveDeleted())
{
//position after the deleted row
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,-1,&cRows,&pHRow),S_OK))
goto CLEANUP;
}
else
{
//position after the deleted row
if(!CHECK(m_pIRowset->GetNextRows(NULL,3,-1,&cRows,&pHRow),S_OK))
goto CLEANUP;
}
//release
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
PROVIDER_FREE(pHRow);
pHRow=NULL;
//get the 4th row
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,-1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//the 4th row should be retrieved
if(COMPARE(VerifyRowPosition(*pHRow, 4,g_pCTable), TRUE))
fTestPass=TRUE;
CLEANUP:
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the interface pointer
SAFE_RELEASE(pIRowsetChange);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Position on 5th row. Delete 3rd row. Position on 3rd row. delete 5th row. Position on 5th row. Fetch from the 5th row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_6()
{
HROW *pHRow=NULL;
DBCOUNTITEM cRows;
HROW *pGetHRow=NULL;
DBPROPID rgDBPropID[5]={DBPROP_IRowsetChange,
DBPROP_UPDATABILITY,
DBPROP_CANHOLDROWS,
DBPROP_CANFETCHBACKWARDS,
DBPROP_CANSCROLLBACKWARDS,
};
IRowsetChange *pIRowsetChange=NULL;
BOOL fTestPass=FALSE;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgDBPropID),rgDBPropID));
//get the 3rd row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//get the last row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,g_lRowLast-4,1,&cRows,&pGetHRow),S_OK))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 3rd row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
PROVIDER_FREE(pHRow);
pHRow=NULL;
if(!RemoveDeleted())
{
//delete the last row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pGetHRow,NULL),S_OK))
goto CLEANUP;
}
//restartposition
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
if(RemoveDeleted())
{
//get the 4th row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(*pHRow,4,g_pCTable),TRUE))
goto CLEANUP;
//release
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
PROVIDER_FREE(pHRow);
pHRow=NULL;
//delete the last row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pGetHRow,NULL),S_OK))
goto CLEANUP;
//try to get the last row
if(CHECK(m_pIRowset->GetNextRows(NULL,g_lRowLast-4,-1,&cRows,&pHRow),DB_S_ENDOFROWSET))
fTestPass=TRUE;
}
else
{
//get the 3rd row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//release
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
PROVIDER_FREE(pHRow);
pHRow=NULL;
//try to get the last row
if(!CHECK(m_pIRowset->GetNextRows(NULL,g_lRowLast-3,-1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//release
if(!CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
PROVIDER_FREE(pHRow);
pHRow=NULL;
//try to get the 1st row
if(!CHECK(m_pIRowset->GetNextRows(NULL,-(g_lRowLast-2),-1,&cRows,&pHRow),S_OK))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(*pHRow,1,g_pCTable),TRUE))
fTestPass=TRUE;
}
CLEANUP:
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the row handle
if(pGetHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pGetHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pGetHRow);
}
//release the interface pointer
SAFE_RELEASE(pIRowsetChange);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc Delete the 1st row. GetRowsAt based on standard bookmarks.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_7()
{
HROW *pHRow=NULL;
DBCOUNTITEM cRows;
HROW *pGetHRow=NULL;
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBPROPID rgDBPropID[5]={DBPROP_IRowsetChange,
DBPROP_UPDATABILITY,
DBPROP_CANHOLDROWS,
DBPROP_CANFETCHBACKWARDS,
DBPROP_CANSCROLLBACKWARDS,
};
IRowsetChange *pIRowsetChange=NULL;
BOOL fTestPass=FALSE;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgDBPropID),rgDBPropID));
//get the 1st row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 1st row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//call get RowsAt
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,
0,2,&cRows,&pGetHRow),S_OK))
goto CLEANUP;
if(RemoveDeleted())
{
//the second row handle is the seond row
if(COMPARE(VerifyRowPosition(pGetHRow[1],3,g_pCTable),TRUE))
fTestPass=TRUE;
}
else
{
//the second row handle is the third row
if(COMPARE(VerifyRowPosition(pGetHRow[1],2,g_pCTable),TRUE))
fTestPass=TRUE;
}
CLEANUP:
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the row handle
if(pGetHRow)
{
CHECK(m_pIRowset->ReleaseRows(2,pGetHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pGetHRow);
}
//release the interface pointer
SAFE_RELEASE(pIRowsetChange);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc Delete the last row. Fetch backwards one row handle. Fetch backwards again. GetRowsAt based on stand
//
// @rdesc TEST_PASS or TEST_FAIL
//
int DeleteRows::Variation_8()
{
HROW *pHRow=NULL;
DBCOUNTITEM cRows;
HROW *pGetHRow=NULL;
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBPROPID rgDBPropID[5]={DBPROP_IRowsetChange,
DBPROP_UPDATABILITY,
DBPROP_CANHOLDROWS,
DBPROP_CANFETCHBACKWARDS,
DBPROP_CANSCROLLBACKWARDS,
};
IRowsetChange *pIRowsetChange=NULL;
BOOL fTestPass=FALSE;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgDBPropID),rgDBPropID));
//get the last row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,-1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the last row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release row handle
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
//fetch backwards 2 rows
if(!CHECK(m_pIRowset->GetNextRows(NULL,-1,-1,&cRows,&pHRow),S_OK))
goto CLEANUP;
//should fetch row g_lRowLast-2
if(!COMPARE(VerifyRowPosition(*pHRow,g_lRowLast-2,g_pCTable),TRUE))
goto CLEANUP;
//call GetRowsAt
if(RemoveDeleted())
{
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,
-1,-1,&cRows,&pGetHRow),S_OK))
goto CLEANUP;
}
else
{
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,
-2,-1,&cRows,&pGetHRow),S_OK))
goto CLEANUP;
}
//should fetch the g_lRowLast-2 row
if(!COMPARE(VerifyRowPosition(*pGetHRow,g_lRowLast-2,g_pCTable),TRUE))
goto CLEANUP;
//delete the 3rd row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pGetHRow,NULL),S_OK))
goto CLEANUP;
//release row handles
CHECK(m_pIRowset->ReleaseRows(1,pGetHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pGetHRow);
pGetHRow=NULL;
//get next rows
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,-1,&cRows,&pGetHRow),S_OK))
goto CLEANUP;
//should fetch the g_lRowLast-3 row
if(COMPARE(VerifyRowPosition(*pGetHRow,g_lRowLast-3,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the row handle
if(pGetHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pGetHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pGetHRow);
}
//release the interface pointer
SAFE_RELEASE(pIRowsetChange);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL DeleteRows::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(RemoveDeleted)
//*-----------------------------------------------------------------------
//| Test Case: RemoveDeleted - test DBPROP_REMOVEDELETED
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if (!TCIRowsetLocate::Init())
// }}
return FALSE;
if (!AlteringRowsIsOK())
return TEST_SKIPPED;
return TEST_PASS;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc *pBookmark points to a deleted row. DB_E_BADBOOKMARK is returned.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_1()
{
DBPROPID rgguidProperty[3];
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
//open rowset, and accessor. Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the bookmark for the 4th row
if(!GetBookmark(4, &cbBookmark, &pBookmark))
goto CLEANUP;
//get the row handle for the 4th row
if(!CHECK(m_pIRowset->GetNextRows(NULL,3,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 1);
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
if (!GetProp(DBPROP_BOOKMARKSKIPPED))
{
// *pBookmark points to a deleted row. DB_E_BADBOOKMARK
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,0,1,
&cRowsObtained,&pHRow), DB_E_BADBOOKMARK))
goto CLEANUP;
//no row should be retrieved
if(COMPARE(cRowsObtained,0) && COMPARE(pHRow, NULL))
fTestPass=TRUE;
}
else
{
// *pBookmark points to a deleted row. DB_E_BADBOOKMARK
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,0,1,
&cRowsObtained,&pHRow), DB_S_BOOKMARKSKIPPED))
goto CLEANUP;
//no row should be retrieved
if(COMPARE(cRowsObtained,1) && COMPARE(VerifyRowPosition(*pHRow,5,g_pCTable),TRUE))
fTestPass=TRUE;
}
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Delete the 3th row. *pBookmark points to the second row. lRowOffset=1 and cRows=3. DB_S_ENDOFROWSET
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_2()
{
DBPROPID rgguidProperty[3];
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]= DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the bookmark middle row
if(!GetBookmark(ULONG(g_lRowLast/2), &cbBookmark, &pBookmark))
goto CLEANUP;
//get the row handle for the middle row + 1
if(!CHECK(m_pIRowset->GetNextRows(NULL,(g_lRowLast/2),1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 1);
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark points to the middle row. lRowOffset=1 and cRows=2
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,1,2,
&cRowsObtained,&pHRow), S_OK))
goto CLEANUP;
//2 rows should be retrieved
if(!COMPARE(cRowsObtained, 2))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(*pHRow, (g_lRowLast/2)+2, g_pCTable),TRUE))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(pHRow[1],(g_lRowLast/2)+3,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
//release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Delete the 4th row. *pBookmark points to the 3th row. lRowOffset=1 and cRows=1. S_OK is returned and the 5th row handle is ret
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_3()
{
DBPROPID rgguidProperty[4];
HROW *pHRow=NULL;
HROW *pHRowDeleted=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_CANHOLDROWS;
rgguidProperty[3]=DBPROP_UPDATABILITY;
//open rowset and accessor, Request IRowsetChangeBookmarks and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the bookmark for the g_lRowLast-2
if(!GetBookmark(g_lRowLast-2, &cbBookmark, &pBookmark))
goto CLEANUP;
//get g_lRowLast-1 row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,g_lRowLast-2,1,&cRowsObtained,&pHRowDeleted),S_OK))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the g_lRowLast-1 row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRowDeleted,NULL),S_OK))
goto CLEANUP;
// *pBookmark points to the g_lRowLast-2 row. lRowOffset=1 and cRows=2
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,1,2,
&cRowsObtained,&pHRow), DB_S_ENDOFROWSET))
goto CLEANUP;
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//the last row should be retrieved
if(COMPARE(VerifyRowPosition(*pHRow, g_lRowLast, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(pHRowDeleted)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRowDeleted,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRowDeleted);
}
//release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Delete the first row. Pass an array of bookmarks: bookmark to the first row and the second row.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_4()
{
DBPROPID rgguidProperty[2] = { DBPROP_IRowsetChange, DBPROP_UPDATABILITY};
HROW *pHRow=NULL;
HROW rgHRow[2] = { DB_NULL_HROW, DB_NULL_HROW };
IRowsetChange *pIRowsetChange=NULL;
DBCOUNTITEM cRowsObtained=0;
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL,NULL};
DBROWSTATUS rgRowStatus[2];
BOOL fTestPass=FALSE;
DBCOUNTITEM ulRowEarly=0, ulRowAfter=0;
ulRowEarly = (g_lRowLast-5);
ulRowAfter = (g_lRowLast-4);
//open rowset and accessor, Request IRowsetChangeBookmarks and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the bookmark for the 14th row
if(!GetBookmark(ulRowEarly, &rgcbBookmarks[0], &rgpBookmarks[0]))
goto CLEANUP;
//get the bookmark for the 15th row
if(!GetBookmark(ulRowAfter, &rgcbBookmarks[1], &rgpBookmarks[1]))
goto CLEANUP;
//get 15th row
if(!CHECK(m_pIRowset->GetNextRows(NULL,ulRowAfter-1,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 15th row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
if(!CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK))
goto CLEANUP;
PROVIDER_FREE(pHRow);
pHRow=NULL;
//Pass an array of bookmarks: bookmark to the 14th row and the 15th row.
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,2,rgcbBookmarks,
(const BYTE **)rgpBookmarks, rgHRow,rgRowStatus),
DB_S_ERRORSOCCURRED))
goto CLEANUP;
if(!COMPARE(rgHRow[1],DB_NULL_HROW))
goto CLEANUP;
if(!COMPARE(rgRowStatus[0],DBROWSTATUS_S_OK) ||
!COMPARE(rgRowStatus[1], DBROWSTATUS_E_INVALID))
goto CLEANUP;
//the 14th row should be retrieved
if(COMPARE(VerifyRowPosition(rgHRow[0], ulRowEarly, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChangeBookmark pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(rgHRow[1])
CHECK(m_pIRowset->ReleaseRows(1,&(rgHRow[0]),NULL,NULL,NULL),S_OK);
//release the bookmark
PROVIDER_FREE(rgpBookmarks[0]);
PROVIDER_FREE(rgpBookmarks[1]);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Delete the third row. Pass an array of two bookmarks: bookmark to the second and 4th row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_5()
{
DBPROPID rgguidProperty[3];
HROW *pHRow=NULL;
HROW rgHRow[2]={NULL, NULL};
DBCOUNTITEM cRows=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL,NULL};
ULONG_PTR ulCount;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]= DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the bookmark for the 2nd and 4th row
if(!GetBookmark(2, &rgcbBookmarks[0], &rgpBookmarks[0]))
goto CLEANUP;
if(!GetBookmark(4, &rgcbBookmarks[1], &rgpBookmarks[1]))
goto CLEANUP;
//get the row handle for the 3rd row
if(!CHECK(m_pIRowset->GetNextRows(NULL,2,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRows, 1);
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 3rd row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRows,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
//Pass an array of 2 bookmarks: bookmark to the second row,
//and the 4th row
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,2,rgcbBookmarks,
(const BYTE **)rgpBookmarks, rgHRow,NULL),
S_OK))
goto CLEANUP;
//Verify the 2nd row is retrieved
if(!COMPARE(VerifyRowPosition(rgHRow[0], 2, g_pCTable),TRUE))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(rgHRow[1], 4, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRows,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(rgHRow[0])
CHECK(m_pIRowset->ReleaseRows(2, rgHRow,NULL,NULL,NULL),S_OK);
//release the bookmark
for(ulCount=0; ulCount<2; ulCount++)
PROVIDER_FREE(rgpBookmarks[ulCount]);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Delete 2nd row. pBookmark points to 4th row. cRows=-2, lOffset=-1. Verify 3rd and 1st row
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted::Variation_6()
{
DBPROPID rgguidProperty[3];
HROW* pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange* pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE* pBookmark=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]= DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the 4th row
TESTC(GetBookmark(4, &cbBookmark, &pBookmark));
//get the row handle for the 2nd row
TESTC_(m_pIRowset->GetNextRows(NULL,1,1,&cRowsObtained,&pHRow),S_OK);
COMPARE(cRowsObtained, 1);
//QI for IRowsetChange pointer
TESTC(SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,(void **)&pIRowsetChange)));
//delete the 2nd row
TESTC_(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK);
TESTC_(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
// *pBookmark points to the middle row. lRowOffset=1 and cRows=2
TESTC_(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,-1,-2,
&cRowsObtained,&pHRow), S_OK);
//2 rows should be retrieved
TESTC(cRowsObtained == 2);
TESTC(VerifyRowPosition(pHRow[0], 3, g_pCTable));
TESTC(VerifyRowPosition(pHRow[1], 1, g_pCTable));
fTestPass = TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(BookmarkSkipped)
//*-----------------------------------------------------------------------
//| Test Case: BookmarkSkipped - Test DBPROP_BOOKMARKSKIPPPED
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL BookmarkSkipped::Init()
{
BOOL fTestPass = FALSE;
DBPROPID DBPropID=DBPROP_BOOKMARKSKIPPED;
// {{ TCW_INIT_BASECLASS_CHECK
if (!TCIRowsetLocate::Init())
// }}
return FALSE;
if (!AlteringRowsIsOK())
return TEST_SKIPPED;
//open rowset, and accessor.DBPROP_BOOKMARKSKIPPED should be not settable
if(!GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,1,&DBPropID))
odtLog<<L"DBPORP_BOOKMARKSKIPPED is not settable!\n";
ReleaseRowsetAndAccessor();
//open rowset, and accessor. Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_COLLISTFROMTBL, IID_IRowsetLocate,
0,NULL));
//return if the bookmarkskipped is not settable and variant-false
if ( !GetProp(DBPROP_BOOKMARKSKIPPED) )
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
fTestPass = TRUE;
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Delete the first row. *pBookmark=DBBMK_FISRT and lRowOffset=0 and cRows=5. DB_S_BOOKMARKSKIPPED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BookmarkSkipped::Variation_1()
{
DBPROPID rgguidProperty[4];
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
DBCOUNTITEM cRowCount;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]= DBPROP_BOOKMARKSKIPPED;
rgguidProperty[2]=DBPROP_OTHERUPDATEDELETE;
rgguidProperty[3]=DBPROP_UPDATABILITY;
//open rowset, and accessor. Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
if(!TCIRowsetLocate::BookmarkSkipped())
goto CLEANUP;
//get the row handle for the 1st row
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 1);
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 1st row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark points to the deleted 1st row.
//lRowOffset=0 and cRows=5. S_OK
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,5,
&cRowsObtained,&pHRow), S_OK))
goto CLEANUP;
//5 row should be retrieved
if(!COMPARE(cRowsObtained,5))
goto CLEANUP;
//verify the rows retrieved is in the ordr of 2,3,4,5, 6
for(cRowCount=0;cRowCount<cRowsObtained;cRowCount++)
{
if(!COMPARE(VerifyRowPosition(pHRow[cRowCount],cRowCount+2,g_pCTable),TRUE))
goto CLEANUP;
}
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Delete the last row. *pBookmark=DBBML_LAST and lRowOffset=0 and cRows=1. DB_S_BOOKMARKSKIPPED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BookmarkSkipped::Variation_2()
{
DBPROPID rgguidProperty[3];
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
DBBOOKMARK DBBookmark=DBBMK_LAST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]= DBPROP_BOOKMARKSKIPPED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
//open rowset, and accessor. Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the row handle for the last row
if(!CHECK(m_pIRowset->GetNextRows(NULL,g_lRowLast-1,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 1);
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the last row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark points to the deleted last row.
//lRowOffset=0 and cRows=1. DB_S_BOOKMARKSKIPPED
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,0,1,
&cRowsObtained,&pHRow), S_OK))
goto CLEANUP;
//no row should be retrieved
if(COMPARE(cRowsObtained,1) && COMPARE(VerifyRowPosition(*pHRow,g_lRowLast-1,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Delete the first row. *pBookmark=DBBMK_FISRT and lRowOffset=0 and cRows=1. DB_S_BOOKMARKSKIPPED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BookmarkSkipped::Variation_3()
{
DBPROPID rgguidProperty[3];
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0, cbBookmark=0;
IRowsetChange *pIRowsetChange=NULL;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]= DBPROP_BOOKMARKSKIPPED;
rgguidProperty[2]=DBPROP_UPDATABILITY;
//open rowset, and accessor. Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the row handle for the 1st row
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 1);
//get the bookmark for the 1st
if(!GetBookmark(1, &cbBookmark, &pBookmark))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 1st row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark points to the deleted 1st row.
//lRowOffset=0 andcRows=1. DB_S_BOOKMARKSKIPPED
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,0,1,
&cRowsObtained,&pHRow), DB_S_BOOKMARKSKIPPED))
goto CLEANUP;
//1 row should be retrieved
if(!COMPARE(cRowsObtained,1))
goto CLEANUP;
//verify the rows retrieved is the 2nd row handle
if(COMPARE(VerifyRowPosition(*pHRow,2,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the bookmark
SAFE_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Delete the second row. *pBookmark points to the second row and lRowOffset=1 and cRows=1. DB_S_BOOKMARKSKIPPED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BookmarkSkipped::Variation_4()
{
DBPROPID rgguidProperty[3];
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_BOOKMARKSKIPPED;
rgguidProperty[2]=DBPROP_CANHOLDROWS;
//open rowset and accessor, Request IRowsetChangeBookmarks and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the bookmark for the 2nd
if(!GetBookmark(2, &cbBookmark, &pBookmark))
goto CLEANUP;
//get the 2nd row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL, 1,1,&cRowsObtained, &pHRow),S_OK))
goto CLEANUP;
//QI for IRowsetChangepointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 2nd row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
// *pBookmark points to the 2nd row. lRowOffset=1 and cRows=1
//DB_S_BOOKMARKSIPPED
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,1,1,
&cRowsObtained,&pHRow), DB_S_BOOKMARKSKIPPED))
goto CLEANUP;
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//the 3rd row should be retrieved
if(COMPARE(VerifyRowPosition(*pHRow, 3, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChangeBookmark pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc Delete the 5th row. Pass an array of two bookmarks: the bookmark to the 4th and 5th row. DB_S_ERRORSOCCURED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BookmarkSkipped::Variation_5()
{
DBPROPID rgguidProperty[4];
HROW *pHRow=NULL;
HROW rgHRow[2];
DBCOUNTITEM cRows;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL,NULL};
ULONG_PTR ulCount;
DBROWSTATUS rgDBRowStatus[2];
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_BOOKMARKSKIPPED;
rgguidProperty[2]=DBPROP_OTHERUPDATEDELETE;
rgguidProperty[3]=DBPROP_UPDATABILITY;
//init
rgHRow[1]=NULL;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the bookmark for the 5nd and 4th row
if(!GetBookmark(5, &rgcbBookmarks[0], &rgpBookmarks[0]))
goto CLEANUP;
if(!GetBookmark(4, &rgcbBookmarks[1], &rgpBookmarks[1]))
goto CLEANUP;
//get the row handle for the 5th row
if(!CHECK(m_pIRowset->GetNextRows(NULL,4,1,&cRows,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRows, 1);
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 5th row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRows,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
//Pass an array of 2 bookmarks: bookmark to the 5th row,
//and the 4th row
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,2,rgcbBookmarks,
(const BYTE **)rgpBookmarks, rgHRow,rgDBRowStatus),
DB_S_ERRORSOCCURRED))
goto CLEANUP;
//one rows is retrieved
if(!COMPARE(rgHRow[0],DB_NULL_HROW))
goto CLEANUP;
//Verify the 4th row is retrieved
if(!COMPARE(VerifyRowPosition(rgHRow[1], 4, g_pCTable),TRUE))
goto CLEANUP;
if(COMPARE(rgDBRowStatus[0], DBROWSTATUS_E_INVALID) &&
COMPARE(rgDBRowStatus[1],DBROWSTATUS_S_OK))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(1,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(rgHRow[1])
CHECK(m_pIRowset->ReleaseRows(1,&(rgHRow[1]),NULL,NULL,NULL),S_OK);
//release the bookmark
for(ulCount=0; ulCount<2; ulCount++)
PROVIDER_FREE(rgpBookmarks[ulCount]);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc Delete third row. *pBookmark=3rd row, lRowsOffset=-1, cRows=1, DB_S_BOOKMARKSKIPPED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int BookmarkSkipped::Variation_6()
{
DBPROPID rgguidProperty[3];
HROW* pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange* pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE* pBookmark=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_BOOKMARKSKIPPED;
rgguidProperty[2]=DBPROP_CANHOLDROWS;
//open rowset and accessor, Request IRowsetChangeBookmarks and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the bookmark for the 3rd row
TESTC(GetBookmark(3, &cbBookmark, &pBookmark));
//get the 2nd row handle
TESTC_(m_pIRowset->GetNextRows(NULL, 2,1,&cRowsObtained, &pHRow),S_OK);
//QI for IRowsetChangepointer
TESTC(SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)));
//delete the 3rd row
TESTC_(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK);
// *pBookmark points to the 2nd row. lRowOffset=-1 and cRows=-1
//DB_S_BOOKMARKSIPPED
TESTC_(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,-1,-1,
&cRowsObtained,&pHRow), DB_S_BOOKMARKSKIPPED);
TESTC(cRowsObtained == 1);
//the 2nd row should be retrieved
//Note that the skipped bookmark counts as one of the skipped rows
//with respect to lRowsOffset
TESTC(VerifyRowPosition(pHRow[0], 2, g_pCTable));
fTestPass = TEST_PASS;
CLEANUP:
//release IRowsetChangeBookmark pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL BookmarkSkipped::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(RemoveDeleted_BookmarkSkipped)
//*-----------------------------------------------------------------------
//| Test Case: RemoveDeleted_BookmarkSkipped - Test DBPROP_REMOVEDELETED + DBPROP_BOOKMARKSKIPPED
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted_BookmarkSkipped::Init()
{
BOOL fTestPass = FALSE;
// {{ TCW_INIT_BASECLASS_CHECK
if (!TCIRowsetLocate::Init())
// }}
return FALSE;
if (!AlteringRowsIsOK())
return TEST_SKIPPED;
//open rowset, and accessor. Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
0,NULL));
//Return if the bookmarkskipped is not settable and variant-false
if (!GetProp(DBPROP_BOOKMARKSKIPPED))
{
fTestPass = TEST_SKIPPED;
goto CLEANUP;
}
fTestPass = TRUE;
CLEANUP:
ReleaseRowsetAndAccessor();
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Delete the first and the second row. *pBookmark=DBBMK_FIRST and lRowOffset=0 and cRows=4.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted_BookmarkSkipped::Variation_1()
{
DBPROPID rgguidProperty[5];
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0, cbBookmark=0;
IRowsetChange *pIRowsetChange=NULL;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_BOOKMARKSKIPPED;
rgguidProperty[3]=DBPROP_OTHERUPDATEDELETE;
rgguidProperty[4]=DBPROP_UPDATABILITY;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the row handle for the 1st and 2nd row
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,2,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 2);
//get the bookmark for the 1st
if(!GetBookmark(1, &cbBookmark, &pBookmark))
goto CLEANUP;
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 1st and 2nd row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,2,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark points to the 1st row. lRowOffset=0 and cRows=
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,0,3,
&cRowsObtained,&pHRow), DB_S_BOOKMARKSKIPPED))
goto CLEANUP;
//the 3rd, 4th and 5th row should be retrieved
if(!COMPARE(cRowsObtained, 3))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(pHRow[0], 3, g_pCTable),TRUE))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(pHRow[1], 4, g_pCTable),TRUE))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(pHRow[2], 5, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Delete the first and the second row. *pBookmark=DBBMK_FIRST and lRowOffset=1 and cRows=1.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted_BookmarkSkipped::Variation_2()
{
DBPROPID rgguidProperty[5];
HROW *pHRow=NULL;
HROW *pHRowDeleted=NULL;
DBCOUNTITEM cRowsObtained=0, cbBookmark=0;
IRowsetChange *pIRowsetChange=NULL;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]=DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_BOOKMARKSKIPPED;
rgguidProperty[3]=DBPROP_OTHERUPDATEDELETE;
rgguidProperty[4]=DBPROP_CANHOLDROWS;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//get the bookmark for the 1st
if(!GetBookmark(1, &cbBookmark, &pBookmark))
goto CLEANUP;
//get the 1st and 2nd row handles
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,2,&cRowsObtained,&pHRowDeleted),S_OK))
goto CLEANUP;
//delete the 1st and 2nd row handles
if(!CHECK(pIRowsetChange->DeleteRows(NULL,2,pHRowDeleted,NULL),S_OK))
goto CLEANUP;
// *pBookmark=DBBMK_FIRST and lRowOffset=2 and cRows=1.
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,
2,1,&cRowsObtained, &pHRow),DB_S_BOOKMARKSKIPPED))
goto CLEANUP;
if(!COMPARE(cRowsObtained, 1))
goto CLEANUP;
//the 4th row should be retrieved
if(COMPARE(VerifyRowPosition(*pHRow, 4, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(pHRowDeleted)
{
CHECK(m_pIRowset->ReleaseRows(2,pHRowDeleted,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRowDeleted);
}
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Delete the 3th row. *pBookmark points to the second row. lRowOffset=1 and cRows=3. DB_S_ENDOFROWSET is returned and the 4th a
//
// @rdesc TEST_PASS or TEST_FAIL
//
int RemoveDeleted_BookmarkSkipped::Variation_3()
{
DBPROPID rgguidProperty[4];
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
IRowsetChange *pIRowsetChange=NULL;
ULONG_PTR cbBookmark;
BYTE *pBookmark=NULL;
BOOL fTestPass=FALSE;
rgguidProperty[0]=DBPROP_IRowsetChange;
rgguidProperty[1]= DBPROP_REMOVEDELETED;
rgguidProperty[2]=DBPROP_BOOKMARKSKIPPED;
rgguidProperty[3]=DBPROP_UPDATABILITY;
//open rowset and accessor, Request IRowsetChange and IRowsetLocate
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(rgguidProperty),rgguidProperty));
//get the bookmark for the 29th row
if(!GetBookmark(ULONG(g_lRowLast/2)-1, &cbBookmark, &pBookmark))
goto CLEANUP;
//get the row handle for the 30th row
if(!CHECK(m_pIRowset->GetNextRows(NULL,ULONG(g_lRowLast/2)-1,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
COMPARE(cRowsObtained, 1);
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowsetLocate->QueryInterface(IID_IRowsetChange,
(void **)&pIRowsetChange)))
goto CLEANUP;
//delete the 30th row
if(!CHECK(pIRowsetChange->DeleteRows(NULL,1,pHRow,NULL),S_OK))
goto CLEANUP;
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark points to the 29th row. lRowOffset=1 and cRows=2
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,1,2,
&cRowsObtained,&pHRow), S_OK))
goto CLEANUP;
//the 31stth and 32nd row should be retrieved
if(!COMPARE(cRowsObtained, 2))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(*pHRow, ULONG(g_lRowLast/2)+1, g_pCTable),TRUE))
goto CLEANUP;
if(COMPARE(VerifyRowPosition(pHRow[1],ULONG(g_lRowLast/2)+2,g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release IRowsetChange pointer
SAFE_RELEASE(pIRowsetChange);
//release the row handle
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained,pHRow,NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseRowsetAndAccessor();
if( TEST_SKIPPED != fTestPass )
PopulateTable();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL RemoveDeleted_BookmarkSkipped::Terminate()
{
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(ChangeRows)
//*-----------------------------------------------------------------------
//| Test Case: ChangeRows - change rows in the rowset
//| Created: 02/07/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ChangeRows::Init()
{
BOOL fTestPass = FALSE;
DBPROPID guidPropertySet[3];
m_pIRowsetChange=NULL;
guidPropertySet[0]=DBPROP_IRowsetChange;
guidPropertySet[1]=DBPROP_UPDATABILITY;
guidPropertySet[2]=DBPROP_OTHERUPDATEDELETE;
// {{ TCW_INIT_BASECLASS_CHECK
if (!TCIRowsetLocate::Init())
// }}
return FALSE;
if (!AlteringRowsIsOK())
return TEST_SKIPPED;
//create a rowset and create an accessor. Set IRowsetChange
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_ORDERBYNUMERIC, IID_IRowsetLocate,
NUMELEM(guidPropertySet), guidPropertySet,0,NULL,DBACCESSOR_PASSBYREF));
//QI for IRowsetChange pointer
if(!SUCCEEDED(m_pIRowset->QueryInterface(IID_IRowsetChange,
(void **)&m_pIRowsetChange)))
return TEST_SKIPPED;
fTestPass = TRUE;
CLEANUP:
return fTestPass;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Change the first row and the 3rd row. *pBookmark=DBBMK_FISRT and lRowOffset=1 and cRow=1. The 3rd row is retrieved.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ChangeRows::Variation_1()
{
DBBOOKMARK DBBookmark=DBBMK_FIRST;
BYTE *pBookmark=(BYTE *)&DBBookmark;
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
DBCOUNTITEM cRowCount=0;
BOOL fTestPass=FALSE;
if(!GetAccessorOnRowset(DBACCESSOR_ROWDATA,
DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,UPDATEABLE_COLS_BOUND))
goto CLEANUP;
//change the first and third row
for(cRowCount=1; cRowCount<=3; cRowCount=cRowCount+2)
{
if(cRowCount==3)
{
//get the third row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,cRowCount-2,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
}
else
{
//get the first row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,0,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
}
//get data for the row
if(!CHECK(m_pIRowset->GetData(*pHRow,m_hAccessor,m_pData),S_OK))
goto CLEANUP;
//set data for the row
if(!CHECK(m_pIRowsetChange->SetData(*pHRow,m_hAccessor,m_pData),S_OK))
goto CLEANUP;
//release the memory from GetData
FreeMemory();
//make sure set data is set the correct data
COMPARE(VerifyRowPosition(*pHRow, cRowCount, g_pCTable),TRUE);
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
}
//pBookmark=DBBMK_FIRST and lRowOffset=1, cRow=1
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,1,pBookmark,1,1,&cRowsObtained,
&pHRow),S_OK))
goto CLEANUP;
//verify the third row is retrieved
if(COMPARE(VerifyRowPosition(*pHRow,2, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
ReleaseAccessorOnRowset();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Change the second row. *pBookmark points to the second row. lRowOffset=0 and cRow=2. The 3rd and 4th row handles are retriev
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ChangeRows::Variation_2()
{
ULONG_PTR cbBookmark=0;
BYTE *pBookmark=NULL;
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
if(!GetAccessorOnRowset(DBACCESSOR_ROWDATA,
DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,ALL_COLS_BOUND))
goto CLEANUP;
//get the bookmark for the second row
if(!GetBookmark(2, &cbBookmark, &pBookmark))
goto CLEANUP;
//restart the position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
ReleaseAccessorOnRowset();
if(!GetAccessorOnRowset(DBACCESSOR_ROWDATA,
DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,UPDATEABLE_COLS_BOUND))
goto CLEANUP;
//change the second row
//get the row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,1,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//get data for the row
if(!CHECK(m_pIRowset->GetData(*pHRow,m_hAccessor,m_pData),S_OK))
goto CLEANUP;
//set data for the row
if(!CHECK(m_pIRowsetChange->SetData(*pHRow,m_hAccessor,m_pData),S_OK))
goto CLEANUP;
//release the memory from GetData
FreeMemory();
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
// *pBookmark points to the second row. lRowOffset=0 and cRow=2.
if(!CHECK(m_pIRowsetLocate->GetRowsAt(NULL,NULL,cbBookmark,pBookmark,0,2,
&cRowsObtained, &pHRow),S_OK))
goto CLEANUP;
//the 2nd and third row should be retrieved
if(!COMPARE(cRowsObtained, 2))
goto CLEANUP;
//verify the third row is retrieved in the second slot
if(COMPARE(VerifyRowPosition(pHRow[1], 3, g_pCTable),TRUE))
fTestPass=TRUE;
CLEANUP:
//release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
//release the bookmark
PROVIDER_FREE(pBookmark);
ReleaseAccessorOnRowset();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Change the 1st and the last row. Pass an array of 3 bookmarks: bookmark to the first row, to the last row, and bookmark to the
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ChangeRows::Variation_3()
{
ULONG_PTR rgcbBookmarks[3];
DBCOUNTITEM rgcRowCount[3]={1, g_lRowLast, 3};
DBCOUNTITEM cRowCount=0;
HROW rgHRow[3]={NULL,NULL,NULL};
BYTE *rgpBookmarks[3]={NULL, NULL, NULL};
HROW *pHRow=NULL;
DBCOUNTITEM cRowsObtained=0;
BOOL fTestPass=FALSE;
if(!GetAccessorOnRowset(DBACCESSOR_ROWDATA,
DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,ALL_COLS_BOUND))
goto CLEANUP;
//get the bookmark for the 1st, last and third row
for(cRowCount=0; cRowCount<3; cRowCount++)
{
if(!GetBookmark(rgcRowCount[cRowCount],&rgcbBookmarks[cRowCount],
&rgpBookmarks[cRowCount]))
goto CLEANUP;
}
ReleaseAccessorOnRowset();
if(!GetAccessorOnRowset(DBACCESSOR_ROWDATA,
DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,UPDATEABLE_COLS_BOUND))
goto CLEANUP;
//restart the position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
//change the first and last row
for(cRowCount=0; cRowCount<2; cRowCount=cRowCount+1)
{
//restartPosition
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
//get the row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,rgcRowCount[cRowCount]-1,1,
&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//get data for the row
if(!CHECK(m_pIRowset->GetData(*pHRow,m_hAccessor,m_pData),S_OK))
goto CLEANUP;
//set data for the row
if(!CHECK(m_pIRowsetChange->SetData(*pHRow,m_hAccessor,m_pData),S_OK))
goto CLEANUP;
//release the memory from GetData
FreeMemory();
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
}
// Pass an array of 3 bookmarks: bookmark to the first row, to the last row,
// and bookmark to the third row
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,3,rgcbBookmarks,(const BYTE **)rgpBookmarks,
rgHRow,NULL),S_OK))
goto CLEANUP;
//verify the 1st, last and the third row is retrieved
for(cRowCount=0; cRowCount<3; cRowCount++)
{
if(!COMPARE(VerifyRowPosition(rgHRow[cRowCount], rgcRowCount[cRowCount], g_pCTable),TRUE))
goto CLEANUP;
}
fTestPass=TRUE;
CLEANUP:
//release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(rgHRow[0])
CHECK(m_pIRowset->ReleaseRows(3, rgHRow,NULL,NULL,NULL),S_OK);
//free the bookmarks
for(cRowCount=0; cRowCount<3; cRowCount++)
PROVIDER_FREE(rgpBookmarks[cRowCount]);
ReleaseAccessorOnRowset();
return fTestPass;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Change the second row. Pass an array of 2 bookmarks: invalid and bookmark to the second row. DB_S_ERRORSOCCURRED
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ChangeRows::Variation_4()
{
DBBOOKMARK DBBookmark=DBBMK_LAST;
ULONG_PTR rgcbBookmarks[2];
BYTE *rgpBookmarks[2]={NULL, NULL};
HROW *pHRow=NULL;
HROW rgHRow[2];
DBCOUNTITEM cRowsObtained=0;
DBROWSTATUS rgDBRowStatus[2];
BOOL fTestPass=FALSE;
rgHRow[0]=NULL;
if(!GetAccessorOnRowset(DBACCESSOR_ROWDATA,
DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,ALL_COLS_BOUND))
goto CLEANUP;
//get the bookmark for the 2nd row
if(!GetBookmark(2,&rgcbBookmarks[0],&rgpBookmarks[0]))
goto CLEANUP;
//get an invalid bookmark
rgcbBookmarks[1]=1;
rgpBookmarks[1]=(BYTE *)&DBBookmark;
//restart the position
if(!CHECK(m_pIRowset->RestartPosition(NULL),S_OK))
goto CLEANUP;
ReleaseAccessorOnRowset();
if(!GetAccessorOnRowset(DBACCESSOR_ROWDATA,
DBPART_VALUE|DBPART_STATUS|DBPART_LENGTH,UPDATEABLE_COLS_BOUND))
goto CLEANUP;
//change the 2nd row
//get the row handle
if(!CHECK(m_pIRowset->GetNextRows(NULL,1,1,&cRowsObtained,&pHRow),S_OK))
goto CLEANUP;
//get data for the row
if(!CHECK(m_pIRowset->GetData(*pHRow,m_hAccessor,m_pData),S_OK))
goto CLEANUP;
//set data for the row
if(!CHECK(m_pIRowsetChange->SetData(*pHRow,m_hAccessor,m_pData),S_OK))
goto CLEANUP;
//release the memory from GetData
FreeMemory();
//release the row handle
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
pHRow=NULL;
//Pass an array of 2 bookmarks: invalid and bookmark to the second row.
if(!CHECK(m_pIRowsetLocate->GetRowsByBookmark(NULL,2,rgcbBookmarks,
(const BYTE **)rgpBookmarks, rgHRow,rgDBRowStatus),DB_S_ERRORSOCCURRED))
goto CLEANUP;
//verify the 2nd row is retrieved
if(!COMPARE(rgHRow[1],DB_NULL_HROW))
goto CLEANUP;
if(!COMPARE(VerifyRowPosition(rgHRow[0], 2, g_pCTable),TRUE))
goto CLEANUP;
if(COMPARE(rgDBRowStatus[0], DBROWSTATUS_S_OK) &&
COMPARE(rgDBRowStatus[1],DBROWSTATUS_E_INVALID))
fTestPass=TRUE;
CLEANUP:
//release the row handles
if(pHRow)
{
CHECK(m_pIRowset->ReleaseRows(cRowsObtained, pHRow, NULL,NULL,NULL),S_OK);
PROVIDER_FREE(pHRow);
}
if(rgHRow[0])
CHECK(m_pIRowset->ReleaseRows(1,rgHRow,NULL, NULL, NULL),S_OK);
//free the bookmarks
PROVIDER_FREE(rgpBookmarks[0]);
ReleaseAccessorOnRowset();
return fTestPass;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ChangeRows::Terminate()
{
//release the IRowsetChange pointer
SAFE_RELEASE(m_pIRowsetChange);
ReleaseRowsetAndAccessor();
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(Empty_Rowset)
//*-----------------------------------------------------------------------
//| Test Case: Empty_Rowset - Test empty rowset cases
//| Created: 1/18/99
//*-----------------------------------------------------------------------
//*-----------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL Empty_Rowset::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(TCIRowsetLocate::Init())
// }}
{
// TO DO: Add your own code here
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc GetRowsAt forward with DBMK_FIRST
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Empty_Rowset::Variation_1()
{
BOOL fTestPass = TEST_FAIL;
DBBOOKMARK bmkFirst = DBBMK_FIRST;
DBBOOKMARK *pBmk = &bmkFirst;
ULONG_PTR cbBmk = STD_BOOKMARKLENGTH;
DBCOUNTITEM cRowsObtained = MAXDBCOUNTITEM;
HROW hRow = DB_NULL_HROW;
HROW *phRow = NULL;
DBROWSTATUS RowStatus = 0;
//create a rowset and accessor
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_EMPTYROWSET, IID_IRowsetLocate));
TESTC_(m_pIRowsetLocate->GetRowsByBookmark(NULL,1,&cbBmk,(const BYTE **)&pBmk,
&hRow,&RowStatus),DB_E_ERRORSOCCURRED);
TESTC(hRow == DB_NULL_HROW);
TESTC(RowStatus == DBROWSTATUS_E_INVALID);
TESTC_(m_pIRowsetLocate->GetRowsAt(NULL,NULL,STD_BOOKMARKLENGTH,
(BYTE *)&bmkFirst,0,1,&cRowsObtained,&phRow),DB_S_ENDOFROWSET);
TESTC(cRowsObtained == 0);
TESTC(phRow == NULL);
fTestPass = TEST_PASS;
CLEANUP:
PROVIDER_FREE(phRow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc GetRowsAt backward with DBMK_LAST
//
// @rdesc TEST_PASS or TEST_FAIL
//
int Empty_Rowset::Variation_2()
{
BOOL fTestPass = TEST_FAIL;
DBBOOKMARK bmkLast = DBBMK_LAST;
DBCOUNTITEM cRowsObtained = MAXDBCOUNTITEM;
HROW* pHRow = NULL;
DBPROPID guidProperty = DBPROP_CANFETCHBACKWARDS;
TESTC_DRIVER(GetRowsetAndAccessor(g_pCTable, SELECT_EMPTYROWSET, IID_IRowsetLocate,
1,&guidProperty));
TESTC_(m_pIRowsetLocate->GetRowsAt(NULL,NULL,STD_BOOKMARKLENGTH,
(BYTE *)&bmkLast,0,-1,&cRowsObtained,&pHRow),DB_S_ENDOFROWSET);
TESTC(cRowsObtained == 0);
TESTC(pHRow == NULL);
fTestPass = TEST_PASS;
CLEANUP:
if (pHRow)
PROVIDER_FREE(pHRow);
ReleaseRowsetAndAccessor();
return fTestPass;
}
// }} TCW_VAR_PROTOTYPE_END
// {{ TCW_TERMINATE_METHOD
//*-----------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TEST_PASS or TEST_FAIL
//
BOOL Empty_Rowset::Terminate()
{
// TO DO: Add your own code here
// {{ TCW_TERM_BASECLASS_CHECK2
return(TCIRowsetLocate::Terminate());
} // }}
// }} TCW_TERMINATE_METHOD_END
// }} TCW_TC_PROTOTYPE_END