11853 lines
333 KiB
C++
11853 lines
333 KiB
C++
//--------------------------------------------------------------------
|
|
// Microsoft OLE DB Test
|
|
//
|
|
// Copyright (C) 1995-2000 Microsoft Corporation
|
|
//
|
|
// @doc
|
|
//
|
|
// @module IRowset.CPP | The test module for IRowset
|
|
//
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Includes
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
#include "modstandard.hpp" // Standard headers
|
|
#include "IRowset.h" // IRowset testmodule header
|
|
#include "ExtraLib.h"
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Module Values
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
// {{ TCW_MODULE_GLOBALS
|
|
DECLARE_MODULE_CLSID = { 0xeaf58a02, 0x0e5b, 0x11cf, { 0xac, 0x3d, 0x00, 0xaa, 0x00, 0x4a, 0x99, 0xe0 }};
|
|
DECLARE_MODULE_NAME("IRowset");
|
|
DECLARE_MODULE_OWNER("Microsoft");
|
|
DECLARE_MODULE_DESCRIP("Test Module IRowset interface");
|
|
DECLARE_MODULE_VERSION(834101102);
|
|
// TCW_WizardVersion(2)
|
|
// TCW_Automation(False)
|
|
// }} TCW_MODULE_GLOBALS_END
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// ModuleInit
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL ModuleInit(CThisTestModule * pThisTestModule)
|
|
{
|
|
//CommonModuleInit, Verify IRowset is supported, and Create a table
|
|
return CommonModuleInit(pThisTestModule, IID_IRowset, SIX_ROWS);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// ModuleTerminate
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL ModuleTerminate(CThisTestModule * pThisTestModule)
|
|
{
|
|
//Release Session
|
|
return CommonModuleTerminate(pThisTestModule);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
class TCIRowset : public CRowset
|
|
{
|
|
public:
|
|
//constructors
|
|
TCIRowset(WCHAR* pwszTestCaseName = INVALID(WCHAR*));
|
|
virtual ~TCIRowset();
|
|
|
|
//methods
|
|
virtual BOOL Init();
|
|
virtual BOOL Terminate();
|
|
|
|
//Overloaded CreateRowset method
|
|
virtual HRESULT CreateRowset
|
|
(
|
|
EQUERY eSQLStmt,
|
|
REFIID riid = IID_IRowset,
|
|
DBACCESSORFLAGS dwAccessorFlags = DBACCESSOR_ROWDATA,
|
|
DBPART dwPart = DBPART_ALL,
|
|
ECOLS_BOUND eColsToBind = ALL_COLS_BOUND,
|
|
ECOLUMNORDER eBindingOrder = FORWARD,
|
|
ECOLS_BY_REF eColsByRef = NO_COLS_BY_REF,
|
|
DBTYPE wTypeModifier = DBTYPE_EMPTY,
|
|
BLOBTYPE dwBlobType = NO_BLOB_COLS
|
|
);
|
|
|
|
virtual BOOL VerifyAddRefRows
|
|
(
|
|
DBCOUNTITEM cRows,
|
|
HROW* rghRows,
|
|
ULONG ulRefCount = 0,
|
|
DBROWSTATUS dwRowStatus = DBROWSTATUS_S_OK
|
|
);
|
|
|
|
virtual BOOL VerifyReleaseRows
|
|
(
|
|
DBCOUNTITEM cRows,
|
|
HROW* rghRows,
|
|
ULONG ulRefCount = 0,
|
|
DBROWSTATUS dwRowStatus = DBROWSTATUS_S_OK
|
|
);
|
|
|
|
//@mfunc: verify the reference counts for an array of RefCounts
|
|
virtual BOOL VerifyRowStatus
|
|
(
|
|
DBCOUNTITEM cRows, //[in] cRows
|
|
DBROWSTATUS* rgRowStatus, //[in] rgRowStatus
|
|
DBROWSTATUS dwRowStatus = DBROWSTATUS_S_OK //[in] Expected RowStatus
|
|
);
|
|
|
|
//@mfunc: verify the position of the cursor in the row set
|
|
virtual BOOL VerifyNextFetchPosition
|
|
(
|
|
DBROWCOUNT iRow //the NextFetchPosition
|
|
);
|
|
|
|
//@mfunc: verify RestartPosition
|
|
virtual BOOL VerifyRestartPosition
|
|
(
|
|
HCHAPTER hChapter = DB_NULL_HCHAPTER,
|
|
BOOL fRowsReleased = TRUE
|
|
);
|
|
|
|
//@mfunc: verify GetNextRows and row values returned
|
|
virtual BOOL VerifyGetNextRows
|
|
(
|
|
DBROWCOUNT lOffset,
|
|
DBROWCOUNT cRows,
|
|
DBCOUNTITEM iRowStart,
|
|
ECOLUMNORDER eOrder = FORWARD,
|
|
DBCOUNTITEM cRowsExpected = MAXDBCOUNTITEM,
|
|
DBMEMOWNERENUM eMemoryOwner = DBMEMOWNER_CLIENTOWNED
|
|
);
|
|
|
|
//@cmember: Confirm GetData retieve correct data into the consumers buffer
|
|
virtual BOOL VerifyAllRows();
|
|
|
|
virtual BOOL VerifyAccessorValidation
|
|
(
|
|
CRowset* pCRowset,
|
|
DBACCESSORFLAGS dwAccessorFlags,
|
|
DWORD dwBlobType,
|
|
HRESULT hrDefferred,
|
|
DBBINDSTATUS dwBindStatus,
|
|
BOOL fAllowSuccess = FALSE,
|
|
ECOLS_BOUND eColsBound = ALL_COLS_BOUND,
|
|
DBBINDSTATUS** prgBindStatus = NULL,
|
|
BOOL* pfDefferred = NULL,
|
|
ECOLS_BY_REF eColsByRef = NO_COLS_BY_REF,
|
|
DBTYPE dwModifier = DBTYPE_EMPTY
|
|
);
|
|
|
|
};
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::TCIRowset
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
TCIRowset::TCIRowset(WCHAR * wstrTestCaseName) : CRowset(wstrTestCaseName)
|
|
{
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::~TCIRowset
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
TCIRowset::~TCIRowset()
|
|
{
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::Init
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL TCIRowset::Init()
|
|
{
|
|
return CRowset::Init();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::Terminate
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL TCIRowset::Terminate()
|
|
{
|
|
return CRowset::Terminate();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::CreateRowset
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
HRESULT TCIRowset::CreateRowset
|
|
(
|
|
EQUERY eQuery, //the type of rowset to create
|
|
REFIID riid, //riid to ask for
|
|
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
|
|
DBTYPE wTypeModifier, //the type modifier used for accessor
|
|
BLOBTYPE dwBlobType //BLOB option
|
|
)
|
|
{
|
|
//Deletgate
|
|
//The only difference between this method and the CRowset one is that
|
|
//The default for eColsToBind == ALL_COLS whereas the CRowset is UPDATEABLE
|
|
//This Rowset test doesn't do any updating, so we need all cols bound...
|
|
return CRowset::CreateRowset(eQuery, riid, NULL, dwAccessorFlags, dwPart,
|
|
eColsToBind, eBindingOrder, eColsByRef, wTypeModifier, dwBlobType);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::VerifyReleaseRows
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL TCIRowset::VerifyReleaseRows
|
|
(
|
|
DBCOUNTITEM cRows,
|
|
HROW* rghRows,
|
|
ULONG ulRefCount,
|
|
DBROWSTATUS dwRowStatus
|
|
)
|
|
{
|
|
TBEGIN
|
|
ULONG* rgRefCounts = NULL;
|
|
DBROWSTATUS* rgRowStatus = NULL;
|
|
|
|
if(cRows && rghRows)
|
|
{
|
|
//Release the rows
|
|
TESTC_(ReleaseRows(cRows, rghRows, &rgRefCounts, &rgRowStatus),S_OK);
|
|
TESTC(rgRefCounts != NULL && rgRowStatus != NULL);
|
|
|
|
//Verify the ref counts and status
|
|
QTESTC(VerifyRefCounts(cRows, rgRefCounts, ulRefCount));
|
|
QTESTC(VerifyRowStatus(cRows, rgRowStatus, dwRowStatus));
|
|
}
|
|
|
|
CLEANUP:
|
|
PROVIDER_FREE(rgRefCounts);
|
|
PROVIDER_FREE(rgRowStatus);
|
|
TRETURN;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::VerifyAddRefRows
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL TCIRowset::VerifyAddRefRows
|
|
(
|
|
DBCOUNTITEM cRows,
|
|
HROW* rghRows,
|
|
ULONG ulRefCount,
|
|
DBROWSTATUS dwRowStatus
|
|
)
|
|
{
|
|
TBEGIN
|
|
ULONG* rgRefCounts = NULL;
|
|
DBROWSTATUS* rgRowStatus = NULL;
|
|
|
|
if(cRows && rghRows)
|
|
{
|
|
rgRefCounts = PROVIDER_ALLOC_(cRows, ULONG);
|
|
rgRowStatus = PROVIDER_ALLOC_(cRows, DBROWSTATUS);
|
|
TESTC(rgRefCounts != NULL);
|
|
TESTC(rgRowStatus != NULL);
|
|
|
|
//AddRef the rows
|
|
TESTC_(pIRowset()->AddRefRows(cRows, rghRows, rgRefCounts, rgRowStatus),S_OK);
|
|
|
|
//Verify the ref count / row status
|
|
TESTC(VerifyRefCounts(cRows, rgRefCounts, ulRefCount));
|
|
TESTC(VerifyRowStatus(cRows, rgRowStatus, dwRowStatus));
|
|
}
|
|
|
|
CLEANUP:
|
|
PROVIDER_FREE(rgRefCounts);
|
|
PROVIDER_FREE(rgRowStatus);
|
|
TRETURN;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::VerifyRowStatus
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL TCIRowset::VerifyRowStatus
|
|
(
|
|
DBCOUNTITEM cRows, //[in] cRows
|
|
DBROWSTATUS* rgRowStatus, //[in] rgRowStatus
|
|
DBROWSTATUS dwRowStatus //[in] Expected RowStatus
|
|
)
|
|
{
|
|
//every element in the ref count array should be the same as cExpected
|
|
for(DBCOUNTITEM i=0; i<cRows; i++)
|
|
{
|
|
if(rgRowStatus[i] != dwRowStatus)
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::VerifyNextFetchPosition
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL TCIRowset::VerifyNextFetchPosition
|
|
(
|
|
DBROWCOUNT iRow //the NextFetchPosition expected
|
|
)
|
|
{
|
|
TBEGIN
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//Get the next row handle
|
|
TESTC_(GetNextRows(&hRow),S_OK);
|
|
|
|
//VerifyRowHandles
|
|
TESTC(VerifyRowHandles(hRow, iRow));
|
|
|
|
//release the row handle
|
|
TESTC_(ReleaseRows(hRow),S_OK);
|
|
hRow = NULL;
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::VerifyRestartPosition
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL TCIRowset::VerifyRestartPosition(HCHAPTER hChapter, BOOL fRowsReleased)
|
|
{
|
|
TBEGIN
|
|
HRESULT hr = S_OK;
|
|
|
|
//RestartPosition
|
|
hr = RestartPosition(hChapter);
|
|
|
|
//Verify Results
|
|
if(fRowsReleased || SUCCEEDED(hr))
|
|
{
|
|
//Only valid return codes allowed...
|
|
TEST2C_(hr, S_OK, DB_S_COMMANDREEXECUTED);
|
|
|
|
//Verify at the first row
|
|
TESTC(VerifyNextFetchPosition(FIRST_ROW));
|
|
|
|
//Leave the state back at the begining
|
|
TESTC_(RestartPosition(hChapter),S_OK);
|
|
}
|
|
else
|
|
{
|
|
//According to the 2.0 OLE DB Spec, some providers may not be able to
|
|
//RestartPosition when there are Rows currently held, (even with CANHOLDROWS)
|
|
TESTC_(hr, DB_E_ROWSNOTRELEASED);
|
|
|
|
//But there are some restrictions. (and you thought it was going to be easy)
|
|
//DBPROP_QUICKRESTART must also be FALSE
|
|
TESTC(GetProperty(DBPROP_QUICKRESTART, DBPROPSET_ROWSET, VARIANT_FALSE));
|
|
|
|
//Return false from this method to indicate to the caller
|
|
//that the position is NOT at the head. LTM will take care of any errors occuring above
|
|
TWARNING("RestartPosition() failed, but allowed since QuickRestart=FALSE for this senario");
|
|
QTESTC(FALSE);
|
|
}
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::VerifyGetNextRows
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
BOOL TCIRowset::VerifyGetNextRows(DBROWCOUNT lOffset, DBROWCOUNT cRows, DBCOUNTITEM iRowStart, ECOLUMNORDER eOrder, DBCOUNTITEM cRowsExpected, DBMEMOWNERENUM eMemoryOwner)
|
|
{
|
|
TBEGIN
|
|
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
HROW* rghRowsInput = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
//Alloc rghRows if consumer owned
|
|
if(eMemoryOwner == DBMEMOWNER_CLIENTOWNED)
|
|
{
|
|
rghRows = PROVIDER_ALLOC_((DBCOUNTITEM)ABS(cRows), HROW);
|
|
rghRowsInput = rghRows;
|
|
}
|
|
|
|
//GetNextRows
|
|
//This is our helper function which does a majority of the validity
|
|
hr = GetNextRows(lOffset, cRows, &cRowsObtained, &rghRows);
|
|
|
|
//If expected to return the same number of rows requested
|
|
if((DBCOUNTITEM)ABS(cRows) == cRowsExpected || cRowsExpected == MAXDBCOUNTITEM)
|
|
{
|
|
//Verify results
|
|
if(hr == DB_S_ROWLIMITEXCEEDED && (DBCOUNTITEM)ABS(cRows)>1)
|
|
{
|
|
TESTC((DBCOUNTITEM)cRows > m_ulMaxOpenRows);
|
|
TESTC(cRowsObtained < cRowsExpected);
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, iRowStart, eOrder));
|
|
TOUTPUT("Maximum Rows Exceeded with cRows = " << cRows);
|
|
}
|
|
else
|
|
{
|
|
TESTC_(hr,S_OK);
|
|
TESTC(cRowsObtained==(DBCOUNTITEM)ABS(cRows));
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, iRowStart, eOrder));
|
|
TESTC_(ReleaseRows(cRowsObtained, rghRows),S_OK);
|
|
cRowsObtained = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//2.0 spec indicates DB_S_ENDOFROWSET for all outofbounds cases
|
|
//We no longer have DB_E_BADSTARTPOSITION for 2.x providers
|
|
|
|
//Otherwise we were expecting not to be able to retreive the
|
|
//full set of requested rows...
|
|
TEST3C_(hr, DB_S_ENDOFROWSET, E_OUTOFMEMORY, DB_S_ROWLIMITEXCEEDED);
|
|
|
|
//Verify Results...
|
|
if(hr==DB_S_ENDOFROWSET)
|
|
{
|
|
TESTC(cRowsObtained == cRowsExpected);
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, iRowStart, eOrder));
|
|
}
|
|
else if(hr == DB_S_ROWLIMITEXCEEDED)
|
|
{
|
|
TESTC((ULONG)cRows > m_ulMaxOpenRows);
|
|
TESTC(cRowsObtained < cRowsExpected);
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, iRowStart, eOrder));
|
|
}
|
|
else
|
|
{
|
|
//No rows should be obtained.
|
|
TESTC(cRowsObtained == 0);
|
|
if(eMemoryOwner == DBMEMOWNER_PROVIDEROWNED)
|
|
{
|
|
TESTC(rghRows == NULL);
|
|
}
|
|
|
|
//E_OUTOFMEMORY
|
|
if(hr == E_OUTOFMEMORY)
|
|
{
|
|
//This should really only be reasonably be returned for large fetches or requests.
|
|
TESTC((DBCOUNTITEM)ABS(cRows) > 1000 || (DBCOUNTITEM)ABS(lOffset) > 1000);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Verify output array, depending upon consumer or provider allocated...
|
|
if(eMemoryOwner == DBMEMOWNER_CLIENTOWNED)
|
|
{
|
|
//This is a users allocated static array,
|
|
//This had better not be nulled out by the provider, if non-null on input
|
|
TESTC(rghRows == rghRowsInput);
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::VerifyAllRows
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL TCIRowset::VerifyAllRows()
|
|
{
|
|
TBEGIN
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
//get the number of rows in the table
|
|
DBCOUNTITEM ulRowCount = pTable()->CountRowsOnTable();
|
|
|
|
//loop through the rowset, retrieve one row at a time
|
|
for(DBCOUNTITEM i=1; i<=ulRowCount; i++)
|
|
{
|
|
//GetNextRow
|
|
TESTC_(GetNextRows(0, 1, &cRowsObtained, &rghRows),S_OK);
|
|
|
|
//VerifyRowHandles
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, i));
|
|
|
|
//release the row handle
|
|
TESTC_(ReleaseRows(cRowsObtained, rghRows),S_OK);
|
|
PROVIDER_FREE(rghRows);
|
|
}
|
|
|
|
//Verify the cursor is at the end of the rowset
|
|
TESTC_(GetNextRows(0, 1, &cRowsObtained, &rghRows), DB_S_ENDOFROWSET);
|
|
PROVIDER_FREE(rghRows);
|
|
|
|
//Call again at end of rowset...
|
|
TESTC_(GetNextRows(0, 1, &cRowsObtained, &rghRows), DB_S_ENDOFROWSET);
|
|
TESTC(cRowsObtained==0 && rghRows == NULL);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// TCIRowset::VerifyAccessorValidation
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////
|
|
BOOL TCIRowset::VerifyAccessorValidation
|
|
(
|
|
CRowset* pCRowset,
|
|
DBACCESSORFLAGS dwAccessorFlags,
|
|
DWORD dwBlobType,
|
|
HRESULT hrDefferred,
|
|
DBBINDSTATUS dwBindStatus,
|
|
BOOL fAllowSuccess,
|
|
ECOLS_BOUND eColsBound,
|
|
DBBINDSTATUS** prgBindStatus,
|
|
BOOL* pfDefferred,
|
|
ECOLS_BY_REF eColsByRef,
|
|
DBTYPE dwModifier
|
|
)
|
|
{
|
|
TBEGIN
|
|
HACCESSOR hAccessor = DB_NULL_HACCESSOR;
|
|
HROW hRow = NULL;
|
|
DBLENGTH cRowSize = 0;
|
|
HRESULT hr = S_OK;
|
|
|
|
|
|
DBORDINAL cBindings = 0;
|
|
DBBINDING* rgBindings = NULL;
|
|
DBBINDSTATUS* rgBindStatus = NULL;
|
|
void* pData = NULL;
|
|
|
|
//Create Accessor
|
|
hr = pCRowset->CreateAccessor(&hAccessor, dwAccessorFlags, DBPART_ALL, &cBindings, &rgBindings, &cRowSize, dwBlobType, &rgBindStatus, eColsBound, eColsByRef, dwModifier);
|
|
TEST2C_(hr, S_OK, DB_E_ERRORSOCCURRED);
|
|
|
|
//May have Deferred Accessor Validation
|
|
if(hr == S_OK)
|
|
{
|
|
//Indicate Deferred Validation
|
|
if(pfDefferred)
|
|
*pfDefferred = TRUE;
|
|
|
|
//Grab a row handle
|
|
TESTC_(pCRowset->GetRow(FIRST_ROW, &hRow),S_OK);
|
|
|
|
//Get the row data...
|
|
SAFE_ALLOC(pData, BYTE, cRowSize);
|
|
TESTC_(GetRowData(hRow, &pData), DB_E_UNSUPPORTEDCONVERSION);
|
|
|
|
//There are "special" cases where even though there should be an error,
|
|
//A success code can be returned. ie: DBPROP_MULTIPLESTORAGEOBJECTS=FALSE
|
|
//We should not be able to obtain more than 1 storage object, but the spec
|
|
//has been relaxed to indicate FALSE - "may" not be able to obtain more than one.
|
|
//So we need to allow success in special circumstances
|
|
//(by default - fAllowSuccess = FALSE)
|
|
if(fAllowSuccess)
|
|
{
|
|
TEST3C_(hr, S_OK, DB_S_ERRORSOCCURRED, hrDefferred);
|
|
}
|
|
else
|
|
{
|
|
QTESTC_(hr, hrDefferred);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//Indicate Non-Deferred Validation
|
|
if(pfDefferred)
|
|
*pfDefferred = FALSE;
|
|
|
|
//Verify Accessor Status
|
|
//Only verify the Accessor Status if the user doesn't want the Status returned.
|
|
//So for specical cases, the variation knows better what the status of each should be,
|
|
//not neccessarly all the same...
|
|
if(prgBindStatus == NULL)
|
|
for(DBORDINAL i=0; i<cBindings; i++)
|
|
{
|
|
TESTC(rgBindStatus[i] == dwBindStatus);
|
|
}
|
|
}
|
|
|
|
CLEANUP:
|
|
if(prgBindStatus)
|
|
*prgBindStatus = rgBindStatus;
|
|
else
|
|
PROVIDER_FREE(rgBindStatus);
|
|
|
|
//Can only release out-of-line memory when there is actual data
|
|
//If this fails, we can't release this memory...
|
|
pCRowset->ReleaseAccessor(hAccessor, cBindings, rgBindings);
|
|
pCRowset->ReleaseRows(hRow);
|
|
SAFE_FREE(pData);
|
|
TRETURN;
|
|
}
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Test Case Section
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_RetrieveData)
|
|
//--------------------------------------------------------------------
|
|
// @class Retrieve data of all types from the rowset without coercion
|
|
//
|
|
class TCIRowset_RetrieveData : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_RetrieveData,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember Default Accessor - no BLOBs
|
|
int Variation_1();
|
|
// @cmember Default Accessor - with BLOBs
|
|
int Variation_2();
|
|
// @cmember BYREF accessor, no BLOBs
|
|
int Variation_3();
|
|
// @cmember BYREF with BLOBs
|
|
int Variation_4();
|
|
// @cmember OPTIMIZED, BLOBs only
|
|
int Variation_5();
|
|
// @cmember VECTOR, BYREF, with BLOBs
|
|
int Variation_6();
|
|
// @cmember VECTOR, with BLOBs
|
|
int Variation_7();
|
|
// @cmember OPTIMIZED, BYREF, with BLOBs
|
|
int Variation_8();
|
|
// @cmember ARRAY, BYREF, no BLOBs
|
|
int Variation_9();
|
|
// @cmember ARRAY, BYREF, with BLOBs
|
|
int Variation_10();
|
|
// @cmember OPTIMIZED Even Columns with BLOBs
|
|
int Variation_11();
|
|
// @cmember All Columns with BLOBs at End
|
|
int Variation_12();
|
|
// @cmember BLOBs at End only
|
|
int Variation_13();
|
|
// @cmember Very WIDE table
|
|
int Variation_14();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_RetrieveData)
|
|
#define THE_CLASS TCIRowset_RetrieveData
|
|
BEG_TEST_CASE(TCIRowset_RetrieveData, TCIRowset, L"Retrieve data of all types from the rowset without coercion")
|
|
TEST_VARIATION(1, L"Default Accessor - no BLOBs")
|
|
TEST_VARIATION(2, L"Default Accessor - with BLOBs")
|
|
TEST_VARIATION(3, L"BYREF accessor, no BLOBs")
|
|
TEST_VARIATION(4, L"BYREF with BLOBs")
|
|
TEST_VARIATION(5, L"OPTIMIZED, BLOBs only")
|
|
TEST_VARIATION(6, L"VECTOR, BYREF, with BLOBs")
|
|
TEST_VARIATION(7, L"VECTOR, with BLOBs")
|
|
TEST_VARIATION(8, L"OPTIMIZED, BYREF, with BLOBs")
|
|
TEST_VARIATION(9, L"ARRAY, BYREF, no BLOBs")
|
|
TEST_VARIATION(10, L"ARRAY, BYREF, with BLOBs")
|
|
TEST_VARIATION(11, L"OPTIMIZED Even Columns with BLOBs")
|
|
TEST_VARIATION(12, L"All Columns with BLOBs at End")
|
|
TEST_VARIATION(13, L"BLOBs at End only")
|
|
TEST_VARIATION(14, L"Very WIDE table")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_Rowsets)
|
|
//--------------------------------------------------------------------
|
|
// @class Interesting rowsets
|
|
//
|
|
class TCIRowset_Rowsets : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_Rowsets,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember Empty Rowset: Fetch one row forward and skip forward
|
|
int Variation_1();
|
|
// @cmember Empty Rowset: fetch backward
|
|
int Variation_2();
|
|
// @cmember Empty Rowset, Skip one row backward
|
|
int Variation_3();
|
|
// @cmember single row, mutiple columns rowset, fetch two rows forward. RestartPosition should succeed
|
|
int Variation_4();
|
|
// @cmember single row, multiple columns rowset, skip one row forward and fetch one row forward.
|
|
int Variation_5();
|
|
// @cmember single row, singel column rowset, fetch one row backward
|
|
int Variation_6();
|
|
// @cmember single row, single column rowset. Skip two rows backward.
|
|
int Variation_7();
|
|
// @cmember rowset with maximun # of columns in the rowset Skip one row forward and fetch one row forward
|
|
int Variation_8();
|
|
// @cmember rowset with maximun # of columns in the rowset Skip one row backward and fetch one row backward
|
|
int Variation_9();
|
|
// @cmember Strict sequential rowset, RestartPosition optimization
|
|
int Variation_10();
|
|
// @cmember Release Rowset with active Row handles - verify released
|
|
int Variation_11();
|
|
// @cmember Release Rowset with active accessors - verify released
|
|
int Variation_12();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_Rowsets)
|
|
#define THE_CLASS TCIRowset_Rowsets
|
|
BEG_TEST_CASE(TCIRowset_Rowsets, TCIRowset, L"Interesting rowsets")
|
|
TEST_VARIATION(1, L"Empty Rowset: Fetch one row forward and skip forward")
|
|
TEST_VARIATION(2, L"Empty Rowset: fetch backward")
|
|
TEST_VARIATION(3, L"Empty Rowset, Skip one row backward")
|
|
TEST_VARIATION(4, L"single row, mutiple columns rowset, fetch two rows forward. RestartPosition should succeed")
|
|
TEST_VARIATION(5, L"single row, multiple columns rowset, skip one row forward and fetch one row forward.")
|
|
TEST_VARIATION(6, L"single row, singel column rowset, fetch one row backward")
|
|
TEST_VARIATION(7, L"single row, single column rowset. Skip two rows backward.")
|
|
TEST_VARIATION(8, L"rowset with maximun # of columns in the rowset Skip one row forward and fetch one row forward")
|
|
TEST_VARIATION(9, L"rowset with maximun # of columns in the rowset Skip one row backward and fetch one row backward")
|
|
TEST_VARIATION(10, L"Strict sequential rowset, RestartPosition optimization")
|
|
TEST_VARIATION(11, L"Release Rowset with active Row handles - verify released")
|
|
TEST_VARIATION(12, L"Release Rowset with active accessors - verify released")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_Properties)
|
|
//--------------------------------------------------------------------
|
|
// @class Rowset properties
|
|
//
|
|
class TCIRowset_Properties : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_Properties,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember IRowsetLocate should not change fetch position
|
|
int Variation_1();
|
|
// @cmember IRowsetScroll should not change fetch position
|
|
int Variation_2();
|
|
// @cmember IRowsetExactScroll shoud not change fetch position
|
|
int Variation_3();
|
|
// @cmember CANHOLDROWS = FALSE
|
|
int Variation_4();
|
|
// @cmember DBPROP_ACCESSORDER - DBPROPVAL_AO_RANDOM
|
|
int Variation_5();
|
|
// @cmember DBPROP_ACCESSORDER - DBPROPVAL_AO_SEQUENTIAL
|
|
int Variation_6();
|
|
// @cmember DBPROP_ACCESSORDER - DBPROPVAL_AO_SEQUENTIAL - access in a random matter
|
|
int Variation_7();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_Properties)
|
|
#define THE_CLASS TCIRowset_Properties
|
|
BEG_TEST_CASE(TCIRowset_Properties, TCIRowset, L"Rowset properties")
|
|
TEST_VARIATION(1, L"IRowsetLocate should not change fetch position")
|
|
TEST_VARIATION(2, L"IRowsetScroll should not change fetch position")
|
|
TEST_VARIATION(3, L"IRowsetExactScroll shoud not change fetch position")
|
|
TEST_VARIATION(4, L"CANHOLDROWS = FALSE")
|
|
TEST_VARIATION(5, L"DBPROP_ACCESSORDER - DBPROPVAL_AO_RANDOM")
|
|
TEST_VARIATION(6, L"DBPROP_ACCESSORDER - DBPROPVAL_AO_SEQUENTIAL")
|
|
TEST_VARIATION(7, L"DBPROP_ACCESSORDER - DBPROPVAL_AO_SEQUENTIAL - access in a random matter")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_Parameters)
|
|
//--------------------------------------------------------------------
|
|
// @class Different combination of parameters of IRowset methods
|
|
//
|
|
class TCIRowset_Parameters : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_Parameters,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRows==0; AddRef and ReleaseRows do nothing
|
|
int Variation_1();
|
|
// @cmember cRows=1 and rghRows contain two row handles
|
|
int Variation_2();
|
|
// @cmember One element of rghRows is NULL
|
|
int Variation_3();
|
|
// @cmember Any array of duplicated HRows
|
|
int Variation_4();
|
|
// @cmember AddRef and Release a released row handle
|
|
int Variation_5();
|
|
// @cmember Call RestartPosition three times. Fetch position is not changed.
|
|
int Variation_6();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_Parameters)
|
|
#define THE_CLASS TCIRowset_Parameters
|
|
BEG_TEST_CASE(TCIRowset_Parameters, TCIRowset, L"Different combination of parameters of IRowset methods")
|
|
TEST_VARIATION(1, L"cRows==0; AddRef and ReleaseRows do nothing")
|
|
TEST_VARIATION(2, L"cRows=1 and rghRows contain two row handles")
|
|
TEST_VARIATION(3, L"One element of rghRows is NULL")
|
|
TEST_VARIATION(4, L"Any array of duplicated HRows")
|
|
TEST_VARIATION(5, L"AddRef and Release a released row handle")
|
|
TEST_VARIATION(6, L"Call RestartPosition three times. Fetch position is not changed.")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_Sequence)
|
|
//--------------------------------------------------------------------
|
|
// @class Calling sequence between interfaces and methods
|
|
//
|
|
class TCIRowset_Sequence : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_Sequence,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember AddRef, AddRef,ReleaseRows,ReleaseRows,ReleaseRows. RefCount==0
|
|
int Variation_1();
|
|
// @cmember AddRef, ReleaseRows,AddRef,AddRef,AddRef,ReleaseRows. RefCount==3
|
|
int Variation_2();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_Sequence)
|
|
#define THE_CLASS TCIRowset_Sequence
|
|
BEG_TEST_CASE(TCIRowset_Sequence, TCIRowset, L"Calling sequence between interfaces and methods")
|
|
TEST_VARIATION(1, L"AddRef, AddRef,ReleaseRows,ReleaseRows,ReleaseRows. RefCount==0")
|
|
TEST_VARIATION(2, L"AddRef, ReleaseRows,AddRef,AddRef,AddRef,ReleaseRows. RefCount==3")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_Boundary)
|
|
//--------------------------------------------------------------------
|
|
// @class Boundary conditions
|
|
//
|
|
class TCIRowset_Boundary : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_Boundary,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember AddRefRows--rghRows==NULL;E_INVALIDARG
|
|
int Variation_1();
|
|
// @cmember AddRefRows--pcRefCounted==NULL;S_OK
|
|
int Variation_2();
|
|
// @cmember AddRefRows--rgRefCounts==NULL;S_OK
|
|
int Variation_3();
|
|
// @cmember AddRefRows--pcRefCounted==NULL && rgRefCounts==NULL;S_OK
|
|
int Variation_4();
|
|
// @cmember AddRefRows - before any rows are fetched
|
|
int Variation_5();
|
|
// @cmember GetData--pData==NULL;E_INVALIDARG
|
|
int Variation_6();
|
|
// @cmember GetNextRows--pcRowsObtained==NULL;E_INVALIDARG
|
|
int Variation_7();
|
|
// @cmember GetNextRows--prghRows==NULL;E_INVALIDARG
|
|
int Variation_8();
|
|
// @cmember ReleaseRows--rghRows==NULL;E_INVALIDARG
|
|
int Variation_9();
|
|
// @cmember ReleaseRows--pcReleased=NULL;S_OK
|
|
int Variation_10();
|
|
// @cmember ReleaseRows--rgRefCounts==NULL;S_OK
|
|
int Variation_11();
|
|
// @cmember ReleaseRows--pcRelease==NULL;rgRefCounts=NULL;S_OK
|
|
int Variation_12();
|
|
// @cmember ReleaseRows - before any rows are fetched
|
|
int Variation_13();
|
|
// @cmember GetNextRows--*pcRowsObtained==0, *prgRows!=NULL
|
|
int Variation_14();
|
|
// @cmember RestartPosition - Without calling GetData
|
|
int Variation_15();
|
|
// @cmember IUnknown::AddRef / Release
|
|
int Variation_16();
|
|
// @cmember IUnknown::QueryInterface
|
|
int Variation_17();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_Boundary)
|
|
#define THE_CLASS TCIRowset_Boundary
|
|
BEG_TEST_CASE(TCIRowset_Boundary, TCIRowset, L"Boundary conditions")
|
|
TEST_VARIATION(1, L"AddRefRows--rghRows==NULL;E_INVALIDARG")
|
|
TEST_VARIATION(2, L"AddRefRows--pcRefCounted==NULL;S_OK")
|
|
TEST_VARIATION(3, L"AddRefRows--rgRefCounts==NULL;S_OK")
|
|
TEST_VARIATION(4, L"AddRefRows--pcRefCounted==NULL && rgRefCounts==NULL;S_OK")
|
|
TEST_VARIATION(5, L"AddRefRows - before any rows are fetched")
|
|
TEST_VARIATION(6, L"GetData--pData==NULL;E_INVALIDARG")
|
|
TEST_VARIATION(7, L"GetNextRows--pcRowsObtained==NULL;E_INVALIDARG")
|
|
TEST_VARIATION(8, L"GetNextRows--prghRows==NULL;E_INVALIDARG")
|
|
TEST_VARIATION(9, L"ReleaseRows--rghRows==NULL;E_INVALIDARG")
|
|
TEST_VARIATION(10, L"ReleaseRows--pcReleased=NULL;S_OK")
|
|
TEST_VARIATION(11, L"ReleaseRows--rgRefCounts==NULL;S_OK")
|
|
TEST_VARIATION(12, L"ReleaseRows--pcRelease==NULL;rgRefCounts=NULL;S_OK")
|
|
TEST_VARIATION(13, L"ReleaseRows - before any rows are fetched")
|
|
TEST_VARIATION(14, L"GetNextRows--*pcRowsObtained==0, *prgRows!=NULL")
|
|
TEST_VARIATION(15, L"RestartPosition - Without calling GetData")
|
|
TEST_VARIATION(16, L"IUnknown::AddRef / Release")
|
|
TEST_VARIATION(17, L"IUnknown::QueryInterface")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_Transactions)
|
|
//--------------------------------------------------------------------
|
|
// @class Use the interface within a transaction. Zombie State.
|
|
//
|
|
class TCIRowset_Transactions : public CTransaction {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_Transactions,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(TCIRowset_Transactions)
|
|
#define THE_CLASS TCIRowset_Transactions
|
|
BEG_TEST_CASE(TCIRowset_Transactions, CTransaction, L"Use the interface within a transaction. Zombie State.")
|
|
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(TCIRowset_Chapters)
|
|
//--------------------------------------------------------------------
|
|
// @class Chapters specific test
|
|
//
|
|
class TCIRowset_Chapters : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_Chapters,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember GetNextRows: Invalid hChapter
|
|
int Variation_1();
|
|
// @cmember GetNextRows: DB_INVALID_CHAPTER
|
|
int Variation_2();
|
|
// @cmember ReleaseChapter: Active Row handles
|
|
int Variation_3();
|
|
// @cmember ReleaseChapter: NULL
|
|
int Variation_4();
|
|
// @cmember RestartPosition: Invalid hChapter
|
|
int Variation_5();
|
|
// @cmember RestartPosition: NULL
|
|
int Variation_6();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_Chapters)
|
|
#define THE_CLASS TCIRowset_Chapters
|
|
BEG_TEST_CASE(TCIRowset_Chapters, TCIRowset, L"Chapters specific test")
|
|
TEST_VARIATION(1, L"GetNextRows: Invalid hChapter")
|
|
TEST_VARIATION(2, L"GetNextRows: DB_INVALID_CHAPTER")
|
|
TEST_VARIATION(3, L"ReleaseChapter: Active Row handles")
|
|
TEST_VARIATION(4, L"ReleaseChapter: NULL")
|
|
TEST_VARIATION(5, L"RestartPosition: Invalid hChapter")
|
|
TEST_VARIATION(6, L"RestartPosition: NULL")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_PendingChange)
|
|
//--------------------------------------------------------------------
|
|
// @class Row handles with pending changes
|
|
//
|
|
class TCIRowset_PendingChange : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_PendingChange,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember methods called with rows having pending changes will return DB_E_BADROWHANDLE
|
|
int Variation_1();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_PendingChange)
|
|
#define THE_CLASS TCIRowset_PendingChange
|
|
BEG_TEST_CASE(TCIRowset_PendingChange, TCIRowset, L"Row handles with pending changes")
|
|
TEST_VARIATION(1, L"methods called with rows having pending changes will return DB_E_BADROWHANDLE")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_CanHoldRows)
|
|
//--------------------------------------------------------------------
|
|
// @class Can Hold Rows in the rowset
|
|
//
|
|
class TCIRowset_CanHoldRows : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_CanHoldRows,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember Reteive two discontiguous row handles
|
|
int Variation_1();
|
|
// @cmember release a middle row; release the first and the last row
|
|
int Variation_2();
|
|
// @cmember Release the last row, retrieve one more row, ERROR returneed
|
|
int Variation_3();
|
|
// @cmember Addref Rows and release the first and the last rows
|
|
int Variation_4();
|
|
// @cmember Release Rowset with active Row handles - verify released
|
|
int Variation_5();
|
|
// @cmember RestartPosition - with outstanding row handles
|
|
int Variation_6();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_CanHoldRows)
|
|
#define THE_CLASS TCIRowset_CanHoldRows
|
|
BEG_TEST_CASE(TCIRowset_CanHoldRows, TCIRowset, L"Can Hold Rows in the rowset")
|
|
TEST_VARIATION(1, L"Reteive two discontiguous row handles")
|
|
TEST_VARIATION(2, L"release a middle row; release the first and the last row")
|
|
TEST_VARIATION(3, L"Release the last row, retrieve one more row, ERROR returneed")
|
|
TEST_VARIATION(4, L"Addref Rows and release the first and the last rows")
|
|
TEST_VARIATION(5, L"Release Rowset with active Row handles - verify released")
|
|
TEST_VARIATION(6, L"RestartPosition - with outstanding row handles")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_HoldRows_Discon)
|
|
//--------------------------------------------------------------------
|
|
// @class Hold rows and discontiguous
|
|
//
|
|
class TCIRowset_HoldRows_Discon : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_HoldRows_Discon,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember Skip one row forward and retrieve one row forward. Repeat
|
|
int Variation_1();
|
|
// @cmember Retrieve the two rows, call RestartPosition
|
|
int Variation_2();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_HoldRows_Discon)
|
|
#define THE_CLASS TCIRowset_HoldRows_Discon
|
|
BEG_TEST_CASE(TCIRowset_HoldRows_Discon, TCIRowset, L"Hold rows and discontiguous")
|
|
TEST_VARIATION(1, L"Skip one row forward and retrieve one row forward. Repeat")
|
|
TEST_VARIATION(2, L"Retrieve the two rows, call RestartPosition")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_Discontiguous)
|
|
//--------------------------------------------------------------------
|
|
// @class The rowset can has discontiguous rows
|
|
//
|
|
class TCIRowset_Discontiguous : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_Discontiguous,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember Retrieve one row, release it; retrieve another row
|
|
int Variation_1();
|
|
// @cmember Retrieve one row, addRef it and release it; retrieve another row
|
|
int Variation_2();
|
|
// @cmember Retrieve one row handle, addRef it and release it; Call RestartPositon
|
|
int Variation_3();
|
|
// @cmember Retrieve three rwo handles together. Release the middle row, Succeed
|
|
int Variation_4();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_Discontiguous)
|
|
#define THE_CLASS TCIRowset_Discontiguous
|
|
BEG_TEST_CASE(TCIRowset_Discontiguous, TCIRowset, L"The rowset can has discontiguous rows")
|
|
TEST_VARIATION(1, L"Retrieve one row, release it; retrieve another row")
|
|
TEST_VARIATION(2, L"Retrieve one row, addRef it and release it; retrieve another row")
|
|
TEST_VARIATION(3, L"Retrieve one row handle, addRef it and release it; Call RestartPositon")
|
|
TEST_VARIATION(4, L"Retrieve three rwo handles together. Release the middle row, Succeed")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_MaxOpenRows)
|
|
//--------------------------------------------------------------------
|
|
// @class test max open rows
|
|
//
|
|
class TCIRowset_MaxOpenRows : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_MaxOpenRows,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember MaxOpenRows is unlimted. Retrieve rows in a sequential manner.
|
|
int Variation_1();
|
|
// @cmember MaxOpenRows is unlimted. Retrieve rows in a group.
|
|
int Variation_2();
|
|
// @cmember Set the maxopen rows to be 5.
|
|
int Variation_3();
|
|
// @cmember MaxOpenRows is not unlimited. Test the limit
|
|
int Variation_4();
|
|
// @cmember DBPROP_MAXROWS - Get Value
|
|
int Variation_5();
|
|
// @cmember DBPROP_MAXROWS - Set Value
|
|
int Variation_6();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_MaxOpenRows)
|
|
#define THE_CLASS TCIRowset_MaxOpenRows
|
|
BEG_TEST_CASE(TCIRowset_MaxOpenRows, TCIRowset, L"test max open rows")
|
|
TEST_VARIATION(1, L"MaxOpenRows is unlimted. Retrieve rows in a sequential manner.")
|
|
TEST_VARIATION(2, L"MaxOpenRows is unlimted. Retrieve rows in a group.")
|
|
TEST_VARIATION(3, L"Set the maxopen rows to be 5.")
|
|
TEST_VARIATION(4, L"MaxOpenRows is not unlimited. Test the limit")
|
|
TEST_VARIATION(5, L"DBPROP_MAXROWS - Get Value")
|
|
TEST_VARIATION(6, L"DBPROP_MAXROWS - Set Value")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_ScrollBackwards_ForwardOnly)
|
|
//--------------------------------------------------------------------
|
|
// @class ScrollBackwards_ForwardOnly
|
|
//
|
|
class TCIRowset_ScrollBackwards_ForwardOnly : public TCIRowset {
|
|
private:
|
|
// @cmember ForwardOnly array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_ScrollBackwards_ForwardOnly,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRow==0, cRowToSkip forward > # of rows in the table
|
|
int Variation_1();
|
|
// @cmember cRow==0, cRowToSkip backward > # of rows in the table
|
|
int Variation_2();
|
|
// @cmember cRow==0, cRowToSkip =1
|
|
int Variation_3();
|
|
// @cmember cRow==0, cRowToSkip = -1
|
|
int Variation_4();
|
|
// @cmember cRows is negative.
|
|
int Variation_5();
|
|
// @cmember skip one row backward and fetch 5 row forward
|
|
int Variation_6();
|
|
// @cmember retrieve 2 rows. Skip 3 rows backwards
|
|
int Variation_7();
|
|
// @cmember skip backward more than the number of rows in the rowset
|
|
int Variation_8();
|
|
// @cmember skip forward more than the number of rows in the rowset
|
|
int Variation_9();
|
|
// @cmember skip forward and to the last row. skip backward to the first row
|
|
int Variation_10();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_ScrollBackwards_ForwardOnly)
|
|
#define THE_CLASS TCIRowset_ScrollBackwards_ForwardOnly
|
|
BEG_TEST_CASE(TCIRowset_ScrollBackwards_ForwardOnly, TCIRowset, L"ScrollBackwards_ForwardOnly")
|
|
TEST_VARIATION(1, L"cRow==0, cRowToSkip forward > # of rows in the table")
|
|
TEST_VARIATION(2, L"cRow==0, cRowToSkip backward > # of rows in the table")
|
|
TEST_VARIATION(3, L"cRow==0, cRowToSkip =1")
|
|
TEST_VARIATION(4, L"cRow==0, cRowToSkip = -1")
|
|
TEST_VARIATION(5, L"cRows is negative.")
|
|
TEST_VARIATION(6, L"skip one row backward and fetch 5 row forward")
|
|
TEST_VARIATION(7, L"retrieve 2 rows. Skip 3 rows backwards")
|
|
TEST_VARIATION(8, L"skip backward more than the number of rows in the rowset")
|
|
TEST_VARIATION(9, L"skip forward more than the number of rows in the rowset")
|
|
TEST_VARIATION(10, L"skip forward and to the last row. skip backward to the first row")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_ScrollBackwards_Static)
|
|
//--------------------------------------------------------------------
|
|
// @class ScrollBackwards_Static
|
|
//
|
|
class TCIRowset_ScrollBackwards_Static : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_ScrollBackwards_Static,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRow==0, cRowToSkip forward > # of rows in the table
|
|
int Variation_1();
|
|
// @cmember cRow==0, cRowToSkip backward > # of rows in the table
|
|
int Variation_2();
|
|
// @cmember cRow==0, cRowToSkip =1
|
|
int Variation_3();
|
|
// @cmember cRow==0, cRowToSkip = -1
|
|
int Variation_4();
|
|
// @cmember cRows is negative.
|
|
int Variation_5();
|
|
// @cmember skip one row backward and fetch 5 row forward
|
|
int Variation_6();
|
|
// @cmember retrieve 2 rows. Skip 3 rows backwards
|
|
int Variation_7();
|
|
// @cmember skip backward more than the number of rows in the rowset
|
|
int Variation_8();
|
|
// @cmember skip forward more than the number of rows in the rowset
|
|
int Variation_9();
|
|
// @cmember skip forward and to the last row. skip backward to the first row
|
|
int Variation_10();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_ScrollBackwards_Static)
|
|
#define THE_CLASS TCIRowset_ScrollBackwards_Static
|
|
BEG_TEST_CASE(TCIRowset_ScrollBackwards_Static, TCIRowset, L"ScrollBackwards_Static")
|
|
TEST_VARIATION(1, L"cRow==0, cRowToSkip forward > # of rows in the table")
|
|
TEST_VARIATION(2, L"cRow==0, cRowToSkip backward > # of rows in the table")
|
|
TEST_VARIATION(3, L"cRow==0, cRowToSkip =1")
|
|
TEST_VARIATION(4, L"cRow==0, cRowToSkip = -1")
|
|
TEST_VARIATION(5, L"cRows is negative.")
|
|
TEST_VARIATION(6, L"skip one row backward and fetch 5 row forward")
|
|
TEST_VARIATION(7, L"retrieve 2 rows. Skip 3 rows backwards")
|
|
TEST_VARIATION(8, L"skip backward more than the number of rows in the rowset")
|
|
TEST_VARIATION(9, L"skip forward more than the number of rows in the rowset")
|
|
TEST_VARIATION(10, L"skip forward and to the last row. skip backward to the first row")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_ScrollBackwards_Keyset)
|
|
//--------------------------------------------------------------------
|
|
// @class ScrollBackwards_Keyset
|
|
//
|
|
class TCIRowset_ScrollBackwards_Keyset : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_ScrollBackwards_Keyset,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRow==0, cRowToSkip forward > # of rows in the table
|
|
int Variation_1();
|
|
// @cmember cRow==0, cRowToSkip backward > # of rows in the table
|
|
int Variation_2();
|
|
// @cmember cRow==0, cRowToSkip =1
|
|
int Variation_3();
|
|
// @cmember cRow==0, cRowToSkip = -1
|
|
int Variation_4();
|
|
// @cmember cRows is negative.
|
|
int Variation_5();
|
|
// @cmember skip one row backward and fetch 5 row forward
|
|
int Variation_6();
|
|
// @cmember retrieve 2 rows. Skip 3 rows backwards
|
|
int Variation_7();
|
|
// @cmember skip backward more than the number of rows in the rowset
|
|
int Variation_8();
|
|
// @cmember skip forward more than the number of rows in the rowset
|
|
int Variation_9();
|
|
// @cmember skip forward and to the last row. skip backward to the first row
|
|
int Variation_10();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_ScrollBackwards_Keyset)
|
|
#define THE_CLASS TCIRowset_ScrollBackwards_Keyset
|
|
BEG_TEST_CASE(TCIRowset_ScrollBackwards_Keyset, TCIRowset, L"ScrollBackwards_Keyset")
|
|
TEST_VARIATION(1, L"cRow==0, cRowToSkip forward > # of rows in the table")
|
|
TEST_VARIATION(2, L"cRow==0, cRowToSkip backward > # of rows in the table")
|
|
TEST_VARIATION(3, L"cRow==0, cRowToSkip =1")
|
|
TEST_VARIATION(4, L"cRow==0, cRowToSkip = -1")
|
|
TEST_VARIATION(5, L"cRows is negative.")
|
|
TEST_VARIATION(6, L"skip one row backward and fetch 5 row forward")
|
|
TEST_VARIATION(7, L"retrieve 2 rows. Skip 3 rows backwards")
|
|
TEST_VARIATION(8, L"skip backward more than the number of rows in the rowset")
|
|
TEST_VARIATION(9, L"skip forward more than the number of rows in the rowset")
|
|
TEST_VARIATION(10, L"skip forward and to the last row. skip backward to the first row")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_ScrollBackwards_Dynamic)
|
|
//--------------------------------------------------------------------
|
|
// @class ScrollBackwards_Dynamic
|
|
//
|
|
class TCIRowset_ScrollBackwards_Dynamic : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_ScrollBackwards_Dynamic,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRow==0, cRowToSkip forward > # of rows in the table
|
|
int Variation_1();
|
|
// @cmember cRow==0, cRowToSkip backward > # of rows in the table
|
|
int Variation_2();
|
|
// @cmember cRow==0, cRowToSkip =1
|
|
int Variation_3();
|
|
// @cmember cRow==0, cRowToSkip = -1
|
|
int Variation_4();
|
|
// @cmember cRows is negative.
|
|
int Variation_5();
|
|
// @cmember skip one row backward and fetch 5 row forward
|
|
int Variation_6();
|
|
// @cmember retrieve 2 rows. Skip 3 rows backwards
|
|
int Variation_7();
|
|
// @cmember skip backward more than the number of rows in the rowset
|
|
int Variation_8();
|
|
// @cmember skip forward more than the number of rows in the rowset
|
|
int Variation_9();
|
|
// @cmember skip forward and to the last row. skip backward to the first row
|
|
int Variation_10();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_ScrollBackwards_Dynamic)
|
|
#define THE_CLASS TCIRowset_ScrollBackwards_Dynamic
|
|
BEG_TEST_CASE(TCIRowset_ScrollBackwards_Dynamic, TCIRowset, L"ScrollBackwards_Dynamic")
|
|
TEST_VARIATION(1, L"cRow==0, cRowToSkip forward > # of rows in the table")
|
|
TEST_VARIATION(2, L"cRow==0, cRowToSkip backward > # of rows in the table")
|
|
TEST_VARIATION(3, L"cRow==0, cRowToSkip =1")
|
|
TEST_VARIATION(4, L"cRow==0, cRowToSkip = -1")
|
|
TEST_VARIATION(5, L"cRows is negative.")
|
|
TEST_VARIATION(6, L"skip one row backward and fetch 5 row forward")
|
|
TEST_VARIATION(7, L"retrieve 2 rows. Skip 3 rows backwards")
|
|
TEST_VARIATION(8, L"skip backward more than the number of rows in the rowset")
|
|
TEST_VARIATION(9, L"skip forward more than the number of rows in the rowset")
|
|
TEST_VARIATION(10, L"skip forward and to the last row. skip backward to the first row")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_ScrollBackwards_Locate)
|
|
//--------------------------------------------------------------------
|
|
// @class ScrollBackwards_Locate
|
|
//
|
|
class TCIRowset_ScrollBackwards_Locate : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_ScrollBackwards_Locate,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRow==0, cRowToSkip forward > # of rows in the table
|
|
int Variation_1();
|
|
// @cmember cRow==0, cRowToSkip backward > # of rows in the table
|
|
int Variation_2();
|
|
// @cmember cRow==0, cRowToSkip =1
|
|
int Variation_3();
|
|
// @cmember cRow==0, cRowToSkip = -1
|
|
int Variation_4();
|
|
// @cmember cRows is negative.
|
|
int Variation_5();
|
|
// @cmember skip one row backward and fetch 5 row forward
|
|
int Variation_6();
|
|
// @cmember retrieve 2 rows. Skip 3 rows backwards
|
|
int Variation_7();
|
|
// @cmember skip backward more than the number of rows in the rowset
|
|
int Variation_8();
|
|
// @cmember skip forward more than the number of rows in the rowset
|
|
int Variation_9();
|
|
// @cmember skip forward and to the last row. skip backward to the first row
|
|
int Variation_10();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_ScrollBackwards_Locate)
|
|
#define THE_CLASS TCIRowset_ScrollBackwards_Locate
|
|
BEG_TEST_CASE(TCIRowset_ScrollBackwards_Locate, TCIRowset, L"ScrollBackwards_Locate")
|
|
TEST_VARIATION(1, L"cRow==0, cRowToSkip forward > # of rows in the table")
|
|
TEST_VARIATION(2, L"cRow==0, cRowToSkip backward > # of rows in the table")
|
|
TEST_VARIATION(3, L"cRow==0, cRowToSkip =1")
|
|
TEST_VARIATION(4, L"cRow==0, cRowToSkip = -1")
|
|
TEST_VARIATION(5, L"cRows is negative.")
|
|
TEST_VARIATION(6, L"skip one row backward and fetch 5 row forward")
|
|
TEST_VARIATION(7, L"retrieve 2 rows. Skip 3 rows backwards")
|
|
TEST_VARIATION(8, L"skip backward more than the number of rows in the rowset")
|
|
TEST_VARIATION(9, L"skip forward more than the number of rows in the rowset")
|
|
TEST_VARIATION(10, L"skip forward and to the last row. skip backward to the first row")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_ScrollBackwards_QueryBased)
|
|
//--------------------------------------------------------------------
|
|
// @class ScrollBackwards_QueryBased
|
|
//
|
|
class TCIRowset_ScrollBackwards_QueryBased : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_ScrollBackwards_QueryBased,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRow==0, cRowToSkip forward > # of rows in the table
|
|
int Variation_1();
|
|
// @cmember cRow==0, cRowToSkip backward > # of rows in the table
|
|
int Variation_2();
|
|
// @cmember cRow==0, cRowToSkip =1
|
|
int Variation_3();
|
|
// @cmember cRow==0, cRowToSkip = -1
|
|
int Variation_4();
|
|
// @cmember cRows is negative.
|
|
int Variation_5();
|
|
// @cmember skip one row backward and fetch 5 row forward
|
|
int Variation_6();
|
|
// @cmember retrieve 2 rows. Skip 3 rows backwards
|
|
int Variation_7();
|
|
// @cmember skip backward more than the number of rows in the rowset
|
|
int Variation_8();
|
|
// @cmember skip forward more than the number of rows in the rowset
|
|
int Variation_9();
|
|
// @cmember skip forward and to the last row. skip backward to the first row
|
|
int Variation_10();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_ScrollBackwards_QueryBased)
|
|
#define THE_CLASS TCIRowset_ScrollBackwards_QueryBased
|
|
BEG_TEST_CASE(TCIRowset_ScrollBackwards_QueryBased, TCIRowset, L"ScrollBackwards_QueryBased")
|
|
TEST_VARIATION(1, L"cRow==0, cRowToSkip forward > # of rows in the table")
|
|
TEST_VARIATION(2, L"cRow==0, cRowToSkip backward > # of rows in the table")
|
|
TEST_VARIATION(3, L"cRow==0, cRowToSkip =1")
|
|
TEST_VARIATION(4, L"cRow==0, cRowToSkip = -1")
|
|
TEST_VARIATION(5, L"cRows is negative.")
|
|
TEST_VARIATION(6, L"skip one row backward and fetch 5 row forward")
|
|
TEST_VARIATION(7, L"retrieve 2 rows. Skip 3 rows backwards")
|
|
TEST_VARIATION(8, L"skip backward more than the number of rows in the rowset")
|
|
TEST_VARIATION(9, L"skip forward more than the number of rows in the rowset")
|
|
TEST_VARIATION(10, L"skip forward and to the last row. skip backward to the first row")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_FetchBackwards_ForwardOnly)
|
|
//--------------------------------------------------------------------
|
|
// @class fetch backwards
|
|
//
|
|
class TCIRowset_FetchBackwards_ForwardOnly : public TCIRowset {
|
|
private:
|
|
// @cmember ForwardOnly array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_FetchBackwards_ForwardOnly,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
int Variation_1();
|
|
// @cmember fetch forward and backward of all row handles. one at a time
|
|
int Variation_2();
|
|
// @cmember fetch forward and backward of all row handles
|
|
int Variation_3();
|
|
// @cmember fetch 3 rows backwards
|
|
int Variation_4();
|
|
// @cmember fetch two rows then 3 row backwards
|
|
int Variation_5();
|
|
// @cmember skip one row forward and fetch 2 rows backwards
|
|
int Variation_6();
|
|
// @cmember skip 2 rows forward and fetch 3 rows forward
|
|
int Variation_7();
|
|
// @cmember fetch three rows forward and repeat
|
|
int Variation_8();
|
|
// @cmember skip forward 2 rows and fetch 4 rows forward
|
|
int Variation_9();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_FetchBackwards_ForwardOnly)
|
|
#define THE_CLASS TCIRowset_FetchBackwards_ForwardOnly
|
|
BEG_TEST_CASE(TCIRowset_FetchBackwards_ForwardOnly, TCIRowset, L"fetch backwards")
|
|
TEST_VARIATION(1, L"cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS")
|
|
TEST_VARIATION(2, L"fetch forward and backward of all row handles. one at a time")
|
|
TEST_VARIATION(3, L"fetch forward and backward of all row handles")
|
|
TEST_VARIATION(4, L"fetch 3 rows backwards")
|
|
TEST_VARIATION(5, L"fetch two rows then 3 row backwards")
|
|
TEST_VARIATION(6, L"skip one row forward and fetch 2 rows backwards")
|
|
TEST_VARIATION(7, L"skip 2 rows forward and fetch 3 rows forward")
|
|
TEST_VARIATION(8, L"fetch three rows forward and repeat")
|
|
TEST_VARIATION(9, L"skip forward 2 rows and fetch 4 rows forward")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_FetchBackwards_Static)
|
|
//--------------------------------------------------------------------
|
|
// @class fetch backwards
|
|
//
|
|
class TCIRowset_FetchBackwards_Static : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_FetchBackwards_Static,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
int Variation_1();
|
|
// @cmember fetch forward and backward of all row handles. one at a time
|
|
int Variation_2();
|
|
// @cmember fetch forward and backward of all row handles
|
|
int Variation_3();
|
|
// @cmember fetch 3 rows backwards
|
|
int Variation_4();
|
|
// @cmember fetch two rows then 3 row backwards
|
|
int Variation_5();
|
|
// @cmember skip one row forward and fetch 2 rows backwards
|
|
int Variation_6();
|
|
// @cmember skip 2 rows forward and fetch 3 rows forward
|
|
int Variation_7();
|
|
// @cmember fetch three rows forward and repeat
|
|
int Variation_8();
|
|
// @cmember skip forward 2 rows and fetch 4 rows forward
|
|
int Variation_9();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_FetchBackwards_Static)
|
|
#define THE_CLASS TCIRowset_FetchBackwards_Static
|
|
BEG_TEST_CASE(TCIRowset_FetchBackwards_Static, TCIRowset, L"fetch backwards")
|
|
TEST_VARIATION(1, L"cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS")
|
|
TEST_VARIATION(2, L"fetch forward and backward of all row handles. one at a time")
|
|
TEST_VARIATION(3, L"fetch forward and backward of all row handles")
|
|
TEST_VARIATION(4, L"fetch 3 rows backwards")
|
|
TEST_VARIATION(5, L"fetch two rows then 3 row backwards")
|
|
TEST_VARIATION(6, L"skip one row forward and fetch 2 rows backwards")
|
|
TEST_VARIATION(7, L"skip 2 rows forward and fetch 3 rows forward")
|
|
TEST_VARIATION(8, L"fetch three rows forward and repeat")
|
|
TEST_VARIATION(9, L"skip forward 2 rows and fetch 4 rows forward")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_FetchBackwards_Keyset)
|
|
//--------------------------------------------------------------------
|
|
// @class fetch backwards
|
|
//
|
|
class TCIRowset_FetchBackwards_Keyset : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_FetchBackwards_Keyset,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
int Variation_1();
|
|
// @cmember fetch forward and backward of all row handles. one at a time
|
|
int Variation_2();
|
|
// @cmember fetch forward and backward of all row handles
|
|
int Variation_3();
|
|
// @cmember fetch 3 rows backwards
|
|
int Variation_4();
|
|
// @cmember fetch two rows then 3 row backwards
|
|
int Variation_5();
|
|
// @cmember skip one row forward and fetch 2 rows backwards
|
|
int Variation_6();
|
|
// @cmember skip 2 rows forward and fetch 3 rows forward
|
|
int Variation_7();
|
|
// @cmember fetch three rows forward and repeat
|
|
int Variation_8();
|
|
// @cmember skip forward 2 rows and fetch 4 rows forward
|
|
int Variation_9();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_FetchBackwards_Keyset)
|
|
#define THE_CLASS TCIRowset_FetchBackwards_Keyset
|
|
BEG_TEST_CASE(TCIRowset_FetchBackwards_Keyset, TCIRowset, L"fetch backwards")
|
|
TEST_VARIATION(1, L"cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS")
|
|
TEST_VARIATION(2, L"fetch forward and backward of all row handles. one at a time")
|
|
TEST_VARIATION(3, L"fetch forward and backward of all row handles")
|
|
TEST_VARIATION(4, L"fetch 3 rows backwards")
|
|
TEST_VARIATION(5, L"fetch two rows then 3 row backwards")
|
|
TEST_VARIATION(6, L"skip one row forward and fetch 2 rows backwards")
|
|
TEST_VARIATION(7, L"skip 2 rows forward and fetch 3 rows forward")
|
|
TEST_VARIATION(8, L"fetch three rows forward and repeat")
|
|
TEST_VARIATION(9, L"skip forward 2 rows and fetch 4 rows forward")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_FetchBackwards_Dynamic)
|
|
//--------------------------------------------------------------------
|
|
// @class fetch backwards
|
|
//
|
|
class TCIRowset_FetchBackwards_Dynamic : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_FetchBackwards_Dynamic,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
int Variation_1();
|
|
// @cmember fetch forward and backward of all row handles. one at a time
|
|
int Variation_2();
|
|
// @cmember fetch forward and backward of all row handles
|
|
int Variation_3();
|
|
// @cmember fetch 3 rows backwards
|
|
int Variation_4();
|
|
// @cmember fetch two rows then 3 row backwards
|
|
int Variation_5();
|
|
// @cmember skip one row forward and fetch 2 rows backwards
|
|
int Variation_6();
|
|
// @cmember skip 2 rows forward and fetch 3 rows forward
|
|
int Variation_7();
|
|
// @cmember fetch three rows forward and repeat
|
|
int Variation_8();
|
|
// @cmember skip forward 2 rows and fetch 4 rows forward
|
|
int Variation_9();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_FetchBackwards_Dynamic)
|
|
#define THE_CLASS TCIRowset_FetchBackwards_Dynamic
|
|
BEG_TEST_CASE(TCIRowset_FetchBackwards_Dynamic, TCIRowset, L"fetch backwards")
|
|
TEST_VARIATION(1, L"cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS")
|
|
TEST_VARIATION(2, L"fetch forward and backward of all row handles. one at a time")
|
|
TEST_VARIATION(3, L"fetch forward and backward of all row handles")
|
|
TEST_VARIATION(4, L"fetch 3 rows backwards")
|
|
TEST_VARIATION(5, L"fetch two rows then 3 row backwards")
|
|
TEST_VARIATION(6, L"skip one row forward and fetch 2 rows backwards")
|
|
TEST_VARIATION(7, L"skip 2 rows forward and fetch 3 rows forward")
|
|
TEST_VARIATION(8, L"fetch three rows forward and repeat")
|
|
TEST_VARIATION(9, L"skip forward 2 rows and fetch 4 rows forward")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_FetchBackwards_Locate)
|
|
//--------------------------------------------------------------------
|
|
// @class fetch backwards
|
|
//
|
|
class TCIRowset_FetchBackwards_Locate : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_FetchBackwards_Locate,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
int Variation_1();
|
|
// @cmember fetch forward and backward of all row handles. one at a time
|
|
int Variation_2();
|
|
// @cmember fetch forward and backward of all row handles
|
|
int Variation_3();
|
|
// @cmember fetch 3 rows backwards
|
|
int Variation_4();
|
|
// @cmember fetch two rows then 3 row backwards
|
|
int Variation_5();
|
|
// @cmember skip one row forward and fetch 2 rows backwards
|
|
int Variation_6();
|
|
// @cmember skip 2 rows forward and fetch 3 rows forward
|
|
int Variation_7();
|
|
// @cmember fetch three rows forward and repeat
|
|
int Variation_8();
|
|
// @cmember skip forward 2 rows and fetch 4 rows forward
|
|
int Variation_9();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_FetchBackwards_Locate)
|
|
#define THE_CLASS TCIRowset_FetchBackwards_Locate
|
|
BEG_TEST_CASE(TCIRowset_FetchBackwards_Locate, TCIRowset, L"fetch backwards")
|
|
TEST_VARIATION(1, L"cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS")
|
|
TEST_VARIATION(2, L"fetch forward and backward of all row handles. one at a time")
|
|
TEST_VARIATION(3, L"fetch forward and backward of all row handles")
|
|
TEST_VARIATION(4, L"fetch 3 rows backwards")
|
|
TEST_VARIATION(5, L"fetch two rows then 3 row backwards")
|
|
TEST_VARIATION(6, L"skip one row forward and fetch 2 rows backwards")
|
|
TEST_VARIATION(7, L"skip 2 rows forward and fetch 3 rows forward")
|
|
TEST_VARIATION(8, L"fetch three rows forward and repeat")
|
|
TEST_VARIATION(9, L"skip forward 2 rows and fetch 4 rows forward")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_FetchBackwards_QueryBased)
|
|
//--------------------------------------------------------------------
|
|
// @class fetch backwards
|
|
//
|
|
class TCIRowset_FetchBackwards_QueryBased : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_FetchBackwards_QueryBased,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
int Variation_1();
|
|
// @cmember fetch forward and backward of all row handles. one at a time
|
|
int Variation_2();
|
|
// @cmember fetch forward and backward of all row handles
|
|
int Variation_3();
|
|
// @cmember fetch 3 rows backwards
|
|
int Variation_4();
|
|
// @cmember fetch two rows then 3 row backwards
|
|
int Variation_5();
|
|
// @cmember skip one row forward and fetch 2 rows backwards
|
|
int Variation_6();
|
|
// @cmember skip 2 rows forward and fetch 3 rows forward
|
|
int Variation_7();
|
|
// @cmember fetch three rows forward and repeat
|
|
int Variation_8();
|
|
// @cmember skip forward 2 rows and fetch 4 rows forward
|
|
int Variation_9();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_FetchBackwards_QueryBased)
|
|
#define THE_CLASS TCIRowset_FetchBackwards_QueryBased
|
|
BEG_TEST_CASE(TCIRowset_FetchBackwards_QueryBased, TCIRowset, L"fetch backwards")
|
|
TEST_VARIATION(1, L"cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS")
|
|
TEST_VARIATION(2, L"fetch forward and backward of all row handles. one at a time")
|
|
TEST_VARIATION(3, L"fetch forward and backward of all row handles")
|
|
TEST_VARIATION(4, L"fetch 3 rows backwards")
|
|
TEST_VARIATION(5, L"fetch two rows then 3 row backwards")
|
|
TEST_VARIATION(6, L"skip one row forward and fetch 2 rows backwards")
|
|
TEST_VARIATION(7, L"skip 2 rows forward and fetch 3 rows forward")
|
|
TEST_VARIATION(8, L"fetch three rows forward and repeat")
|
|
TEST_VARIATION(9, L"skip forward 2 rows and fetch 4 rows forward")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_AllProperties)
|
|
//--------------------------------------------------------------------
|
|
// @class Can Hold rows + fetch backwards + scroll backwards + Discontiguous
|
|
//
|
|
class TCIRowset_AllProperties : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_AllProperties,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember cRow<0, skip backward 4 rows
|
|
int Variation_1();
|
|
// @cmember cRow<0, skip bakcward # of rows in the rowset
|
|
int Variation_2();
|
|
// @cmember skip two rows backwards and fetch one row bakwards
|
|
int Variation_3();
|
|
// @cmember retrieve the rows in the order of 1, 5, 3, 2,4
|
|
int Variation_4();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_AllProperties)
|
|
#define THE_CLASS TCIRowset_AllProperties
|
|
BEG_TEST_CASE(TCIRowset_AllProperties, TCIRowset, L"Can Hold rows + fetch backwards + scroll backwards + Discontiguous")
|
|
TEST_VARIATION(1, L"cRow<0, skip backward 4 rows")
|
|
TEST_VARIATION(2, L"cRow<0, skip bakcward # of rows in the rowset")
|
|
TEST_VARIATION(3, L"skip two rows backwards and fetch one row bakwards")
|
|
TEST_VARIATION(4, L"retrieve the rows in the order of 1, 5, 3, 2,4")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(TCIRowset_NoDiscontiguous)
|
|
//--------------------------------------------------------------------
|
|
// @class test a rowset with properties of CanHoldRows, CanScrollBackwards, and CanFetchBackwards
|
|
//
|
|
class TCIRowset_NoDiscontiguous : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(TCIRowset_NoDiscontiguous,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember retrieve 5 row handles in the order of 3,4,2,5,1
|
|
int Variation_1();
|
|
// @cmember skip one row forward and fetch one row forward
|
|
int Variation_2();
|
|
// @cmember skip 2 rows backwards and fetch 3 rows backwards
|
|
int Variation_3();
|
|
// @cmember RestartPosition - with outstanding row handles
|
|
int Variation_4();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(TCIRowset_NoDiscontiguous)
|
|
#define THE_CLASS TCIRowset_NoDiscontiguous
|
|
BEG_TEST_CASE(TCIRowset_NoDiscontiguous, TCIRowset, L"test a rowset with properties of CanHoldRows, CanScrollBackwards, and CanFetchBackwards")
|
|
TEST_VARIATION(1, L"retrieve 5 row handles in the order of 3,4,2,5,1")
|
|
TEST_VARIATION(2, L"skip one row forward and fetch one row forward")
|
|
TEST_VARIATION(3, L"skip 2 rows backwards and fetch 3 rows backwards")
|
|
TEST_VARIATION(4, L"RestartPosition - with outstanding row handles")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(KeysetCursor)
|
|
//--------------------------------------------------------------------
|
|
// @class test keyset driven cursor model
|
|
//
|
|
class KeysetCursor : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(KeysetCursor,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember retrieve 5 row handles in the order of 3,4,2,5,1
|
|
int Variation_1();
|
|
// @cmember skip one row forward and fetch one row forward
|
|
int Variation_2();
|
|
// @cmember skip 2 rows backwards and fetch 3 rows backwards
|
|
int Variation_3();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(KeysetCursor)
|
|
#define THE_CLASS KeysetCursor
|
|
BEG_TEST_CASE(KeysetCursor, TCIRowset, L"test keyset driven cursor model")
|
|
TEST_VARIATION(1, L"retrieve 5 row handles in the order of 3,4,2,5,1")
|
|
TEST_VARIATION(2, L"skip one row forward and fetch one row forward")
|
|
TEST_VARIATION(3, L"skip 2 rows backwards and fetch 3 rows backwards")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(DynamicCursor)
|
|
//--------------------------------------------------------------------
|
|
// @class test dynamic cursor
|
|
//
|
|
class DynamicCursor : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(DynamicCursor,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember retrieve 5 row handles in the order of 3,4,2,5,1
|
|
int Variation_1();
|
|
// @cmember skip one row forward and fetch one row forward
|
|
int Variation_2();
|
|
// @cmember skip 2 rows and fetch 3 rows
|
|
int Variation_3();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(DynamicCursor)
|
|
#define THE_CLASS DynamicCursor
|
|
BEG_TEST_CASE(DynamicCursor, TCIRowset, L"test dynamic cursor")
|
|
TEST_VARIATION(1, L"retrieve 5 row handles in the order of 3,4,2,5,1")
|
|
TEST_VARIATION(2, L"skip one row forward and fetch one row forward")
|
|
TEST_VARIATION(3, L"skip 2 rows and fetch 3 rows")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
// {{ TCW_TEST_CASE_MAP(Bookmarks)
|
|
//*-----------------------------------------------------------------------
|
|
// @class Test bookmarks on and off
|
|
//
|
|
class Bookmarks : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(Bookmarks,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember Bookmarks == TRUE, ForwardOnly
|
|
int Variation_1();
|
|
// @cmember Bookmarks == TRUE, Static
|
|
int Variation_2();
|
|
// @cmember Bookmarks == TRUE, Keyset
|
|
int Variation_3();
|
|
// @cmember Bookmarks == TRUE, Dynamic
|
|
int Variation_4();
|
|
// @cmember Bookmarks == FALSE, ForwardOnly
|
|
int Variation_5();
|
|
// @cmember Bookmarks == FALSE, Static
|
|
int Variation_6();
|
|
// @cmember Bookmarks == FALSE, Keyset
|
|
int Variation_7();
|
|
// @cmember Bookmarks == FALSE, Dynamic
|
|
int Variation_8();
|
|
// }} TCW_TESTVARS_END
|
|
} ;
|
|
// {{ TCW_TESTCASE(Bookmarks)
|
|
#define THE_CLASS Bookmarks
|
|
BEG_TEST_CASE(Bookmarks, TCIRowset, L"Test bookmarks on and off")
|
|
TEST_VARIATION(1, L"Bookmarks == TRUE, ForwardOnly")
|
|
TEST_VARIATION(2, L"Bookmarks == TRUE, Static")
|
|
TEST_VARIATION(3, L"Bookmarks == TRUE, Keyset")
|
|
TEST_VARIATION(4, L"Bookmarks == TRUE, Dynamic")
|
|
TEST_VARIATION(5, L"Bookmarks == FALSE, ForwardOnly")
|
|
TEST_VARIATION(6, L"Bookmarks == FALSE, Static")
|
|
TEST_VARIATION(7, L"Bookmarks == FALSE, Keyset")
|
|
TEST_VARIATION(8, L"Bookmarks == FALSE, Dynamic")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
|
|
// {{ TCW_TEST_CASE_MAP(Status)
|
|
//--------------------------------------------------------------------
|
|
// @class test the DBROWSTATUS array
|
|
//
|
|
class Status : public TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(Status,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember DB_E_CANTFECTHBACKWARDS, DB_E_CANTSCROLLBACKWARDS
|
|
int Variation_1();
|
|
// @cmember An array of success scenario
|
|
int Variation_2();
|
|
// @cmember An array of invalid row handle
|
|
int Variation_3();
|
|
// @cmember An array of valid and unvalid row handle
|
|
int Variation_4();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(Status)
|
|
#define THE_CLASS Status
|
|
BEG_TEST_CASE(Status, TCIRowset, L"test the DBROWSTATUS array")
|
|
TEST_VARIATION(1, L"DB_E_CANTFECTHBACKWARDS, DB_E_CANTSCROLLBACKWARDS")
|
|
TEST_VARIATION(2, L"An array of success scenario")
|
|
TEST_VARIATION(3, L"An array of invalid row handle")
|
|
TEST_VARIATION(4, L"An array of valid and unvalid row handle")
|
|
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 TCIRowset {
|
|
private:
|
|
// @cmember Static array of variations
|
|
DECLARE_TEST_CASE_DATA();
|
|
//@cmember Extended error object
|
|
|
|
public:
|
|
// {{ TCW_DECLARE_FUNCS
|
|
// @cmember Execution Routine
|
|
DECLARE_TEST_CASE_FUNCS(ExtendedErrors,TCIRowset);
|
|
// }} TCW_DECLARE_FUNCS_END
|
|
|
|
|
|
// @cmember Initialization Routine
|
|
virtual BOOL Init();
|
|
// @cmember Termination Routine
|
|
virtual BOOL Terminate();
|
|
|
|
// {{ TCW_TESTVARS()
|
|
// @cmember ISupportErrorInfo for all rowset interfaces...
|
|
int Variation_1();
|
|
// @cmember Valid IRowset calls with previous error object existing.
|
|
int Variation_2();
|
|
// @cmember Valid IRowset calls with previous error object existing.
|
|
int Variation_3();
|
|
// @cmember E_INVALIDARG GetData call with previous error object existing
|
|
int Variation_4();
|
|
// @cmember E_INVALIDARG AddRefRows call with previous error object existing
|
|
int Variation_5();
|
|
// @cmember DB_E_ROWSNOTRELEASED RestartPosition call with previous error object existing
|
|
int Variation_6();
|
|
// @cmember DB_S_ENDOFROWSET GetNextRows call with previous error object existing
|
|
int Variation_7();
|
|
// @cmember E_INVALIDARG ReleaseRows call with previous error object existing
|
|
int Variation_8();
|
|
// @cmember E_INVALIDARG GetData call with no previous error object existing
|
|
int Variation_9();
|
|
// @cmember E_INVALIDARG AddRefRows call with no previous error object existing
|
|
int Variation_10();
|
|
// @cmember DB_E_ROWSNOTRELEASED RestartPosition call with no previous error object existing
|
|
int Variation_11();
|
|
// @cmember DB_S_ENDOFROWSET GetNextRows call with no previous error object existing
|
|
int Variation_12();
|
|
// @cmember E_INVALIDARG ReleaseRows call with no previous error object existing
|
|
int Variation_13();
|
|
// }} TCW_TESTVARS_END
|
|
};
|
|
// {{ TCW_TESTCASE(ExtendedErrors)
|
|
#define THE_CLASS ExtendedErrors
|
|
BEG_TEST_CASE(ExtendedErrors, TCIRowset, L"Extended Errors")
|
|
TEST_VARIATION(1, L"ISupportErrorInfo for all rowset interfaces...")
|
|
TEST_VARIATION(2, L"Valid IRowset calls with previous error object existing.")
|
|
TEST_VARIATION(3, L"Valid IRowset calls with previous error object existing.")
|
|
TEST_VARIATION(4, L"E_INVALIDARG GetData call with previous error object existing")
|
|
TEST_VARIATION(5, L"E_INVALIDARG AddRefRows call with previous error object existing")
|
|
TEST_VARIATION(6, L"DB_E_ROWSNOTRELEASED RestartPosition call with previous error object existing")
|
|
TEST_VARIATION(7, L"DB_S_ENDOFROWSET GetNextRows call with previous error object existing")
|
|
TEST_VARIATION(8, L"E_INVALIDARG ReleaseRows call with previous error object existing")
|
|
TEST_VARIATION(9, L"E_INVALIDARG GetData call with no previous error object existing")
|
|
TEST_VARIATION(10, L"E_INVALIDARG AddRefRows call with no previous error object existing")
|
|
TEST_VARIATION(11, L"DB_E_ROWSNOTRELEASED RestartPosition call with no previous error object existing")
|
|
TEST_VARIATION(12, L"DB_S_ENDOFROWSET GetNextRows call with no previous error object existing")
|
|
TEST_VARIATION(13, L"E_INVALIDARG ReleaseRows call with no previous error object existing")
|
|
END_TEST_CASE()
|
|
#undef THE_CLASS
|
|
// }} TCW_TESTCASE_END
|
|
// }} TCW_TEST_CASE_MAP_END
|
|
|
|
// }} END_DECLARE_TEST_CASES()
|
|
|
|
// {{ TCW_TESTMODULE(ThisModule)
|
|
TEST_MODULE(32, ThisModule, gwszModuleDescrip)
|
|
TEST_CASE(1, TCIRowset_RetrieveData)
|
|
TEST_CASE(2, TCIRowset_Rowsets)
|
|
TEST_CASE(3, TCIRowset_Properties)
|
|
TEST_CASE(4, TCIRowset_Parameters)
|
|
TEST_CASE(5, TCIRowset_Sequence)
|
|
TEST_CASE(6, TCIRowset_Boundary)
|
|
TEST_CASE(7, TCIRowset_Transactions)
|
|
TEST_CASE(8, TCIRowset_Chapters)
|
|
TEST_CASE(9, TCIRowset_PendingChange)
|
|
TEST_CASE(10, TCIRowset_CanHoldRows)
|
|
TEST_CASE(11, TCIRowset_HoldRows_Discon)
|
|
TEST_CASE(12, TCIRowset_Discontiguous)
|
|
TEST_CASE(13, TCIRowset_MaxOpenRows)
|
|
TEST_CASE(14, TCIRowset_ScrollBackwards_ForwardOnly)
|
|
TEST_CASE(15, TCIRowset_ScrollBackwards_Static)
|
|
TEST_CASE(16, TCIRowset_ScrollBackwards_Keyset)
|
|
TEST_CASE(17, TCIRowset_ScrollBackwards_Dynamic)
|
|
TEST_CASE(18, TCIRowset_ScrollBackwards_Locate)
|
|
TEST_CASE(19, TCIRowset_ScrollBackwards_QueryBased)
|
|
TEST_CASE(20, TCIRowset_FetchBackwards_ForwardOnly)
|
|
TEST_CASE(21, TCIRowset_FetchBackwards_Static)
|
|
TEST_CASE(22, TCIRowset_FetchBackwards_Keyset)
|
|
TEST_CASE(23, TCIRowset_FetchBackwards_Dynamic)
|
|
TEST_CASE(24, TCIRowset_FetchBackwards_Locate)
|
|
TEST_CASE(25, TCIRowset_FetchBackwards_QueryBased)
|
|
TEST_CASE(26, TCIRowset_AllProperties)
|
|
TEST_CASE(27, TCIRowset_NoDiscontiguous)
|
|
TEST_CASE(28, KeysetCursor)
|
|
TEST_CASE(29, DynamicCursor)
|
|
TEST_CASE(30, Bookmarks)
|
|
TEST_CASE(31, Status)
|
|
TEST_CASE(32, ExtendedErrors)
|
|
END_TEST_MODULE()
|
|
// }} TCW_TESTMODULE_END
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_RetrieveData)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_RetrieveData - Retrieve data of all types from the rowset without coercion
|
|
//| Created: 11/03/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_RetrieveData::Init()
|
|
{
|
|
return TCIRowset::Init();
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Default Accessor - no BLOBs
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_1()
|
|
{
|
|
TBEGIN
|
|
|
|
//open rowset with desired properties bind all columns
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//verify the row set
|
|
TESTC(VerifyAllRows())
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Default Accessor - with BLOBs
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_2()
|
|
{
|
|
TBEGIN
|
|
|
|
//May require IRowsetLocate to position on Blobs
|
|
SetSettableProperty(DBPROP_ACCESSORDER, DBPROPSET_ROWSET, (void*)DBPROPVAL_AO_RANDOM, DBTYPE_I4);
|
|
|
|
//Requires IID_IRowsetLocate to position on Blobs
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowset, DBACCESSOR_ROWDATA,
|
|
DBPART_ALL, ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_EMPTY, BLOB_LONG)==S_OK);
|
|
|
|
//verify the row set
|
|
TESTC(VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc BYREF accessor, no BLOBs
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_3()
|
|
{
|
|
TBEGIN
|
|
DBORDINAL i=0;
|
|
|
|
//Requires IID_IRowsetLocate to position on Blobs
|
|
//open rowset with desired properties
|
|
//bind all columns, forward binding, all columns are ORed with _BYREF
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowset, DBACCESSOR_ROWDATA,
|
|
DBPART_ALL, VARIABLE_LEN_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_BYREF)==S_OK);
|
|
|
|
//Make sure that all Variable Columns can be converted to BYREF
|
|
for(i=0; i<m_cBindings; i++)
|
|
{
|
|
DBTYPE wFromType = m_rgBinding[i].wType & ~DBTYPE_BYREF;
|
|
DBTYPE wToType = m_rgBinding[i].wType;
|
|
TESTC_PROVIDER(CanConvert(m_pIRowset, wFromType, wToType));
|
|
}
|
|
|
|
//verify the row set
|
|
TESTC(VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc BYREF with BLOBs
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_4()
|
|
{
|
|
TBEGIN
|
|
DBORDINAL i=0;
|
|
|
|
//May require IRowsetLocate to position on Blobs
|
|
SetSettableProperty(DBPROP_ACCESSORDER, DBPROPSET_ROWSET, (void*)DBPROPVAL_AO_RANDOM, DBTYPE_I4);
|
|
|
|
//open rowset with desired properties
|
|
//bind all columns, forward binding, all columns are ORed with _BYREF
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowset, DBACCESSOR_ROWDATA,
|
|
DBPART_ALL, VARIABLE_LEN_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_BYREF, BLOB_LONG)==S_OK);
|
|
|
|
//Make sure that all Variable Columns can be converted to BYREF
|
|
for(i=0; i<m_cBindings; i++)
|
|
{
|
|
DBTYPE wFromType = m_rgBinding[i].wType & ~DBTYPE_BYREF;
|
|
DBTYPE wToType = m_rgBinding[i].wType;
|
|
TESTC_PROVIDER(CanConvert(m_pIRowset, wFromType, wToType));
|
|
}
|
|
|
|
//verify the row set
|
|
TESTC(VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc OPTIMIZED, BLOBs only
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_5()
|
|
{
|
|
TBEGIN
|
|
|
|
//open rowset with desired properties
|
|
//bind all columns, forward binding, all columns are ORed with _BYREF
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowset, DBACCESSOR_ROWDATA | DBACCESSOR_OPTIMIZED,
|
|
DBPART_ALL, VARIABLE_LEN_COLS_BOUND, FORWARD, NO_COLS_BY_REF)==S_OK);
|
|
|
|
//verify the row set
|
|
TESTC(VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc VECTOR, BYREF, with BLOBs
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_6()
|
|
{
|
|
TBEGIN
|
|
|
|
//May require IRowsetLocate to position on Blobs
|
|
SetSettableProperty(DBPROP_IRowsetLocate);
|
|
|
|
//CreateRowset
|
|
TESTC_(CreateRowset(USE_SUPPORTED_SELECT_ALLFROMTBL), S_OK);
|
|
|
|
//BYREF is not allowed to be used with other modifiers:
|
|
//Should fail with DB_E_ERRORSOCCURRED and DBBINDSTATUS_BADBINDINFO
|
|
//Need to also handle deferred validation...
|
|
TESTC(VerifyAccessorValidation(this, DBACCESSOR_ROWDATA, NO_BLOB_COLS,
|
|
DB_E_UNSUPPORTEDCONVERSION, DBBINDSTATUS_BADBINDINFO, FALSE/*fAllowSuccess*/,
|
|
ALL_COLS_EXCEPTBOOKMARK, NULL/*prgBindStatus*/, NULL/*pfDefferred*/, NO_COLS_BY_REF,
|
|
DBTYPE_BYREF | DBTYPE_VECTOR));
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc VECTOR, with BLOBs
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_7()
|
|
{
|
|
TBEGIN
|
|
|
|
//May require IRowsetLocate to position on Blobs
|
|
SetSettableProperty(DBPROP_IRowsetLocate);
|
|
|
|
//open rowset with desired properties
|
|
//bind all columns, forward binding, all columns are ORed with _BYREF
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowset, DBACCESSOR_ROWDATA,
|
|
DBPART_ALL, ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_EMPTY, BLOB_LONG)==S_OK);
|
|
|
|
//verify the row set
|
|
TESTC(VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc OPTIMIZED, BYREF, with BLOBs
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_8()
|
|
{
|
|
TBEGIN
|
|
DBORDINAL i=0;
|
|
|
|
//May require IRowsetLocate to position on Blobs
|
|
SetSettableProperty(DBPROP_ACCESSORDER, DBPROPSET_ROWSET, (void*)DBPROPVAL_AO_RANDOM, DBTYPE_I4);
|
|
|
|
//open rowset with desired properties
|
|
//bind all columns, forward binding, all columns are ORed with _BYREF
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowset, DBACCESSOR_ROWDATA,
|
|
DBPART_ALL, VARIABLE_LEN_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_BYREF, BLOB_LONG)==S_OK);
|
|
|
|
//Make sure that all Variable Columns can be converted to BYREF
|
|
for(i=0; i<m_cBindings; i++)
|
|
{
|
|
DBTYPE wFromType = m_rgBinding[i].wType & ~DBTYPE_BYREF;
|
|
DBTYPE wToType = m_rgBinding[i].wType;
|
|
TESTC_PROVIDER(CanConvert(m_pIRowset, wFromType, wToType));
|
|
}
|
|
|
|
//verify the row set
|
|
TESTC(VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc ARRAY, BYREF, no BLOBs
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_9()
|
|
{
|
|
TBEGIN
|
|
|
|
//CreateRowset
|
|
TESTC_(CreateRowset(USE_SUPPORTED_SELECT_ALLFROMTBL), S_OK);
|
|
|
|
//BYREF is not allowed to be used with other modifiers:
|
|
//Should fail with DB_E_ERRORSOCCURRED and DBBINDSTATUS_BADBINDINFO
|
|
//Need to also handle deferred validation...
|
|
TESTC(VerifyAccessorValidation(this, DBACCESSOR_ROWDATA | DBACCESSOR_OPTIMIZED, NO_BLOB_COLS,
|
|
DB_E_UNSUPPORTEDCONVERSION, DBBINDSTATUS_BADBINDINFO, FALSE/*fAllowSuccess*/,
|
|
ALL_COLS_BOUND, NULL/*prgBindStatus*/, NULL/*pfDefferred*/, NO_COLS_BY_REF,
|
|
DBTYPE_BYREF | DBTYPE_ARRAY));
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(10)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc ARRAY, BYREF, with BLOBs
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_10()
|
|
{
|
|
TBEGIN
|
|
|
|
//Requires DBPROP_IRowsetLocate
|
|
SetSettableProperty(DBPROP_IRowsetLocate);
|
|
|
|
//CreateRowset
|
|
TESTC_(CreateRowset(USE_SUPPORTED_SELECT_ALLFROMTBL), S_OK);
|
|
|
|
//BYREF is not allowed to be used with other modifiers:
|
|
//Should fail with DB_E_ERRORSOCCURRED and DBBINDSTATUS_BADBINDINFO
|
|
//Need to also handle deferred validation...
|
|
TESTC(VerifyAccessorValidation(this, DBACCESSOR_ROWDATA, BLOB_LONG,
|
|
DB_E_UNSUPPORTEDCONVERSION, DBBINDSTATUS_BADBINDINFO, FALSE/*fAllowSuccess*/,
|
|
ALL_COLS_EXCEPTBOOKMARK, NULL/*prgBindStatus*/, NULL/*pfDefferred*/, NO_COLS_BY_REF,
|
|
DBTYPE_BYREF | DBTYPE_ARRAY));
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(11)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc OPTIMIZED Even Columns with BLOBs
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_11()
|
|
{
|
|
TBEGIN
|
|
|
|
//May require IRowsetLocate to position on Blobs
|
|
SetSettableProperty(DBPROP_ACCESSORDER, DBPROPSET_ROWSET, (void*)DBPROPVAL_AO_RANDOM, DBTYPE_I4);
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowset, DBACCESSOR_ROWDATA | DBACCESSOR_OPTIMIZED,
|
|
DBPART_ALL, EVEN_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_EMPTY, BLOB_LONG)==S_OK);
|
|
|
|
//verify the row set
|
|
TESTC(VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(12)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc All Columns with BLOBs at End
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_12()
|
|
{
|
|
TBEGIN
|
|
|
|
//May require IRowsetLocate to position on Blobs
|
|
SetSettableProperty(DBPROP_IRowsetLocate);
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_ALL_WITH_BLOB_AT_END, IID_IRowset, DBACCESSOR_ROWDATA,
|
|
DBPART_ALL, ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_EMPTY, BLOB_LONG)==S_OK);
|
|
|
|
//verify the row set
|
|
TESTC(VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(13)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc BLOBs at End only
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_RetrieveData::Variation_13()
|
|
{
|
|
TBEGIN
|
|
ULONG i=0;
|
|
|
|
//May require IRowsetLocate to position on Blobs
|
|
SetSettableProperty(DBPROP_IRowsetLocate);
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_ALL_WITH_BLOB_AT_END, IID_IRowset, DBACCESSOR_ROWDATA,
|
|
DBPART_ALL, VARIABLE_LEN_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_BYREF, BLOB_LONG)==S_OK);
|
|
|
|
//Make sure that all Variable Columns can be converted to BYREF
|
|
for(i=0; i<m_cBindings; i++)
|
|
{
|
|
DBTYPE wFromType = m_rgBinding[i].wType & ~DBTYPE_BYREF;
|
|
DBTYPE wToType = m_rgBinding[i].wType;
|
|
TESTC_PROVIDER(CanConvert(m_pIRowset, wFromType, wToType));
|
|
}
|
|
|
|
//verify the row set
|
|
TESTC(VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(14)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Very WIDE table (a special variation for covering BUG 57048)
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
static void SetCommandProperties(/*in*/ICommandText* pCommand);
|
|
|
|
int TCIRowset_RetrieveData::Variation_14()
|
|
{
|
|
TBEGIN
|
|
|
|
static const WCHAR wszCREATE_TABLE_BY_SELECT[] = L"select 'text' as c0, '' as c1, '' as c2, '' as c3, '' as c4, '' as c5, '' as c6,"
|
|
L"'' as c7, '' as c8, '' as c9, '' as c10, '' as c11, '' as c12, '' as c13, '' as c14, '' as c15, '' as c16, '' as c17, "
|
|
L"'' as c18, '' as c19, '' as c20, '' as c21, '' as c22, '' as c23, '' as c24, '' as c25, '' as c26, '' as c27, '' as c28, "
|
|
L"'' as c29, '' as c30, '' as c31, '' as c32, '' as c33, '' as c34, '' as c35, '' as c36, '' as c37, '' as c38, '' as c39, "
|
|
L"'' as c40, '' as c41, '' as c42, '' as c43, '' as c44, '' as c45, '' as c46, '' as c47, '' as c48, '' as c49, '' as c50, "
|
|
L"'' as c51, '' as c52, '' as c53, '' as c54, '' as c55, '' as c56, '' as c57, '' as c58, '' as c59, '' as c60, '' as c61, "
|
|
L"'' as c62, '' as c63, '' as c64, '' as c65, '' as c66, '' as c67, '' as c68, '' as c69, '' as c70, '' as c71, '' as c72, "
|
|
L"'' as c73, '' as c74, '' as c75, '' as c76, '' as c77, '' as c78, '' as c79, '' as c80, '' as c81, '' as c82, '' as c83, "
|
|
L"'' as c84, '' as c85, '' as c86, '' as c87, '' as c88, '' as c89, '' as c90, '' as c91, '' as c92, '' as c93, '' as c94, "
|
|
L"'' as c95, '' as c96, '' as c97, '' as c98, '' as c99, '' as c100, '' as c101, '' as c102, '' as c103, '' as c104, '' as c105, "
|
|
L"'' as c106, '' as c107, '' as c108, '' as c109, '' as c110, '' as c111, '' as c112, '' as c113, '' as c114, '' as c115, "
|
|
L"'' as c116, '' as c117, '' as c118, '' as c119, '' as c120, '' as c121, '' as c122, '' as c123, '' as c124, '' as c125, "
|
|
L"'' as c126, '' as c127, '' as c128, '' as c129, '' as c130, '' as c131, '' as c132, '' as c133, '' as c134, '' as c135, "
|
|
L"'' as c136, '' as c137, '' as c138, '' as c139, '' as c140, '' as c141, '' as c142, '' as c143, '' as c144, '' as c145, "
|
|
L"'' as c146, '' as c147, '' as c148, '' as c149, '' as c150, '' as c151, '' as c152, '' as c153, '' as c154, '' as c155, "
|
|
L"'' as c156, '' as c157, '' as c158, '' as c159, '' as c160, '' as c161, '' as c162, '' as c163, '' as c164, '' as c165, "
|
|
L"'' as c166, '' as c167, '' as c168, '' as c169, '' as c170, '' as c171, '' as c172, '' as c173, '' as c174, '' as c175, "
|
|
L"'' as c176, '' as c177, '' as c178, '' as c179, '' as c180, '' as c181, '' as c182, '' as c183, '' as c184, '' as c185, "
|
|
L"'' as c186, '' as c187, '' as c188, '' as c189, '' as c190, '' as c191, '' as c192, '' as c193, '' as c194, '' as c195, "
|
|
L"'' as c196, '' as c197, '' as c198, '' as c199, '' as c200, '' as c201, '' as c202, '' as c203, '' as c204, '' as c205, "
|
|
L"'' as c206, '' as c207, '' as c208, '' as c209, '' as c210, '' as c211, '' as c212, '' as c213, '' as c214, '' as c215, "
|
|
L"'' as c216, '' as c217, '' as c218, '' as c219, '' as c220, '' as c221, '' as c222, '' as c223, '' as c224, '' as c225, "
|
|
L"'' as c226, '' as c227, '' as c228, '' as c229, '' as c230, '' as c231, '' as c232, '' as c233, '' as c234, '' as c235, "
|
|
L"'' as c236, '' as c237, '' as c238, '' as c239, '' as c240, '' as c241, '' as c242, '' as c243, '' as c244, '' as c245, "
|
|
L"'' as c246, '' as c247, '' as c248, '' as c249 into %s";
|
|
|
|
WCHAR buf[4000]; // command text buffer
|
|
HRESULT hr = 0;
|
|
CTable WideTable(pISession()); // dummy class for creating TableName
|
|
bool bTableCreated = false; // flag - table was created successfully
|
|
|
|
ICommandText* pICommandText = NULL; // ICommandText interface pointer
|
|
IRowset* pIRowset = NULL; // IRowset interface pointer
|
|
|
|
HROW hRow = 0, *phRow = &hRow;
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
DBROWCOUNT RowsAffected = 0;
|
|
DBREFCOUNT RefCounts[] = { -1 };
|
|
DBROWSTATUS RowStatus[] = { -1 };
|
|
|
|
// run this variation only for Kagera against Jet
|
|
TEST_PROVIDER(wcsstr(m_pwszInitString, L"Microsoft Access Driver") != NULL);
|
|
|
|
// create a new table name
|
|
TESTC_((hr = WideTable.MakeTableName(NULL)), S_OK);
|
|
|
|
// get IID_ICommandText interface
|
|
if (!VerifyInterface(pICommand(), IID_ICommandText, COMMAND_INTERFACE, (IUnknown**)&pICommandText))
|
|
goto CLEANUP;
|
|
SetCommandProperties(pICommandText);
|
|
|
|
// create a table
|
|
swprintf(buf, wszCREATE_TABLE_BY_SELECT, WideTable.GetTableName());
|
|
TESTC_(hr = pICommandText->SetCommandText(DBGUID_DBSQL, &buf[0]),S_OK);
|
|
TESTC_(hr = pICommandText->Execute(NULL, IID_NULL, NULL, &RowsAffected, NULL),S_OK);
|
|
bTableCreated = true;
|
|
|
|
// select * from this table
|
|
swprintf(buf, wszSELECT_ALLFROMTBL, WideTable.GetTableName());
|
|
TESTC_(hr = pICommandText->SetCommandText(DBGUID_DBSQL, &buf[0]),S_OK);
|
|
TESTC_(hr = pICommandText->Execute(NULL, IID_IRowset, NULL, &RowsAffected, (IUnknown**)&pIRowset), S_OK);
|
|
|
|
// fetch all rows (1 row)
|
|
TESTC_(hr = pIRowset->GetNextRows(DB_NULL_HCHAPTER, 0, 1, &cRowsObtained, &phRow), S_OK) ;
|
|
|
|
|
|
CLEANUP:
|
|
// release Rowset
|
|
if (*phRow && pIRowset)
|
|
pIRowset->ReleaseRows(1, &hRow, NULL, &RefCounts[0], &RowStatus[0]);
|
|
if (pIRowset)
|
|
pIRowset->Release();
|
|
|
|
// delete table
|
|
if (bTableCreated && pICommandText)
|
|
{
|
|
swprintf(buf, wszDROP_TABLE, WideTable.GetTableName());
|
|
hr = pICommandText->SetCommandText(DBGUID_DBSQL, &buf[0]);
|
|
hr = pICommandText->Execute(NULL, IID_NULL, NULL, &RowsAffected, NULL);
|
|
}
|
|
|
|
// release command
|
|
if (pICommandText)
|
|
pICommandText->Release();
|
|
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// set command properties for reproducing bug 57048
|
|
static void SetCommandProperties(/*in*/ICommandText* pCommand)
|
|
{
|
|
ASSERT(pCommand);
|
|
ICommandProperties* pCommandProperties = NULL; // ICommandText interface pointer
|
|
|
|
// get pCommandProperties interface
|
|
HRESULT hr = pCommand->QueryInterface(IID_ICommandProperties, (void**)&pCommandProperties);
|
|
if (hr!=S_OK || !pCommandProperties)
|
|
return;
|
|
|
|
// for reproducing bug 57048 we need set
|
|
// DBPROP_CANHOLDROWS, DBPROP_CANSCROLLBACKWARDS, DBPROP_CANFETCHBACKWARDS,
|
|
// DBPROP_IRowsetChange to VARIANT_TRUE
|
|
// and
|
|
// DBPROP_UPDATABILITY to 7
|
|
DBPROPID bool_props[] =
|
|
{
|
|
DBPROP_CANHOLDROWS, DBPROP_CANSCROLLBACKWARDS, DBPROP_CANFETCHBACKWARDS, DBPROP_IRowsetChange
|
|
};
|
|
DBPROP props[sizeof(bool_props)/sizeof(DBPROPID) + 1];
|
|
|
|
memset(&props[0], 0, sizeof(props));
|
|
|
|
props[0].dwOptions = DBPROPOPTIONS_REQUIRED;
|
|
props[0].dwPropertyID = DBPROP_UPDATABILITY;
|
|
props[0].vValue.vt = VT_I4;
|
|
props[0].vValue.intVal = 7;
|
|
|
|
for (int i=1; i<=sizeof(bool_props)/sizeof(DBPROPID); i++)
|
|
{
|
|
props[i].dwOptions = DBPROPOPTIONS_REQUIRED;
|
|
props[i].dwPropertyID = bool_props[i-1];
|
|
props[i].vValue.vt = VT_BOOL;
|
|
props[i].vValue.boolVal = VARIANT_TRUE;
|
|
}
|
|
|
|
// define DBPROPSET and set indicated properties
|
|
DBPROPSET propSets[1];
|
|
propSets[0].cProperties = sizeof(props)/sizeof(DBPROP);
|
|
propSets[0].guidPropertySet = DBPROPSET_ROWSET;
|
|
propSets[0].rgProperties = &props[0];
|
|
hr = pCommandProperties->SetProperties(1, propSets);
|
|
|
|
if (pCommandProperties)
|
|
pCommandProperties->Release();
|
|
}
|
|
|
|
|
|
|
|
|
|
// }}
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_RetrieveData::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
// }}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_Rowsets)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_Rowsets - Interesting rowsets
|
|
//| Created: 11/03/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Rowsets::Init()
|
|
{
|
|
return TCIRowset::Init();
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Empty Rowset: Fetch one row forward and skip forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_1()
|
|
{
|
|
TBEGIN
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_EMPTYROWSET, IID_IRowset)==S_OK);
|
|
|
|
//fetch rows forward row forward
|
|
//Empty Rowset should retrieve no rows...
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS));
|
|
|
|
//skip one row forward and fetch one row forward
|
|
//Empty Rowset should be off of the rowset...
|
|
//2.0 spec indicates DB_S_ENDOFROWSET for all outofbounds cases
|
|
//We no longer have DB_E_BADSTARTPOSITION for 2.x providers
|
|
TESTC(VerifyGetNextRows(1, 1, NO_ROWS, FORWARD, NO_ROWS));
|
|
|
|
CLEANUP:
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Empty Rowset: fetch backward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_2()
|
|
{
|
|
TBEGIN
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//Requires DBPROP_CANFETCHBACKWARDS
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_EMPTYROWSET, IID_IRowset)==S_OK);
|
|
TESTC_PROVIDER(GetProperty(DBPROP_CANFETCHBACKWARDS, DBPROPSET_ROWSET));
|
|
|
|
//fetch one row backward
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Empty Rowset, Skip one row backward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_3()
|
|
{
|
|
TBEGIN
|
|
HROW hRow = ULONG_MAX;
|
|
|
|
//Requires DBPROP_CANSCROLLBACKWARDS
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_ALLFROMTBL, IID_IRowset)==S_OK);
|
|
TESTC_PROVIDER(GetProperty(DBPROP_CANSCROLLBACKWARDS, DBPROPSET_ROWSET));
|
|
|
|
//fetch one row backward, no op
|
|
TESTC_(GetNextRows(-1, 0, &hRow), S_OK);
|
|
|
|
CLEANUP:
|
|
//drop the rowset
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc single row, mutiple columns rowset, fetch two rows forward. RestartPosition should succeed
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_4()
|
|
{
|
|
TBEGIN
|
|
DBROWCOUNT i=0;
|
|
|
|
//open rowset with desired properties
|
|
TESTC_(CreateRowset(SELECT_VALIDATIONORDER),S_OK);
|
|
|
|
//Ask for the largest set of cRows...
|
|
//Should just return DB_S_ENDOFROWSET with m_ulTableRows in the Rowset
|
|
TESTC(VerifyGetNextRows(0, MAXDBROWCOUNT, FIRST_ROW, FORWARD, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//Loop through large values...
|
|
//Some providers like to hard code to work arround LONG_MAX, LONG_MIN
|
|
//Work arround this!
|
|
for(i=m_ulTableRows+1; i<MAXDBROWCOUNT && (i+i>i); i+=i)
|
|
{
|
|
//Restart Position
|
|
TESTC_(RestartPosition(),S_OK);
|
|
|
|
//fetch one more row than the total rows forward
|
|
//NOTE: This call is only expecting m_ulTableRows to be returned...
|
|
TESTC(VerifyGetNextRows(0, i, FIRST_ROW, FORWARD, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
}
|
|
|
|
CLEANUP:
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc single row, multiple columns rowset, skip one row forward and fetch one row forward.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_5()
|
|
{
|
|
TBEGIN
|
|
HROW hRow = DB_NULL_HROW;
|
|
DBCOUNTITEM cRowsetRows = 0;
|
|
|
|
//Requires DBPROP_CANFETCHBACKWARDS
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_COUNT)==S_OK);
|
|
TESTC_PROVIDER(GetProperty(DBPROP_CANFETCHBACKWARDS, DBPROPSET_ROWSET));
|
|
|
|
//NOTE: We can't use m_ulTableRows since thats the totoal rows in the table,
|
|
//not neccessarily in our query. So we will just quickly caluclate it, incase
|
|
//a provider has a different meaning of SELECT_COUNT in the INI file...
|
|
cRowsetRows = GetTotalRows();
|
|
|
|
//Skip all rows
|
|
//2.0 spec indicates DB_S_ENDOFROWSET for all outofbounds cases
|
|
//We no longer have DB_E_BADSTARTPOSITION for 2.x providers
|
|
TESTC_(GetNextRows(cRowsetRows, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//Can't use VerfiyRestartPosition with SELECT_COUNT since the data
|
|
//is not what we are expecting, its the total row count...
|
|
TESTC_(RestartPosition(),S_OK);
|
|
TESTC_(GetNextRows(cRowsetRows, -1, &hRow), S_OK);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc single row, singel column rowset, fetch one row backward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_6()
|
|
{
|
|
TBEGIN
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//Requires DBPROP_CANFETCHBACKWARDS
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_COUNT)==S_OK);
|
|
TESTC_PROVIDER(GetProperty(DBPROP_CANFETCHBACKWARDS, DBPROPSET_ROWSET));
|
|
|
|
//fetch one backward
|
|
TESTC_(GetNextRows(0, -1, &hRow), S_OK);
|
|
TESTC(VerifyReleaseRows(1, &hRow));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc single row, single column rowset. Skip two rows backward.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_7()
|
|
{
|
|
TBEGIN
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//Requires DBPROP_CANSCROLLBACKWARDS
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_COUNT)==S_OK);
|
|
TESTC_PROVIDER(GetProperty(DBPROP_CANSCROLLBACKWARDS, DBPROPSET_ROWSET));
|
|
|
|
//fetch one backward
|
|
TESTC_(GetNextRows(-1, 1, &hRow), S_OK);
|
|
TESTC(VerifyReleaseRows(1, &hRow));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc rowset with maximun # of columns in the rowset Skip one row forward and fetch one row forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_8()
|
|
{
|
|
TBEGIN
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//skip one row forward, fetch one forward
|
|
TESTC(VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
CLEANUP:
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc rowset with maximun # of columns in the rowset Skip one row backward and fetch one row backward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_9()
|
|
{
|
|
TBEGIN
|
|
|
|
//Requires DBPROP_CANFETCHBACKWARDS
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
TESTC_PROVIDER(GetProperty(DBPROP_CANFETCHBACKWARDS, DBPROPSET_ROWSET));
|
|
TESTC_PROVIDER(GetProperty(DBPROP_CANSCROLLBACKWARDS, DBPROPSET_ROWSET));
|
|
|
|
//skip one row backward, fetch one backward
|
|
TESTC(VerifyGetNextRows(-1, -1, m_ulTableRows-1));
|
|
|
|
CLEANUP:
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(10)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Strict sequential rowset, RestartPosition optimization
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_10()
|
|
{
|
|
TBEGIN
|
|
TCIRowset RowsetA;
|
|
HRESULT hr = S_OK;
|
|
|
|
//Open a new rowset
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//On the "freshly" created rowset, there should be no reason a provider cannot
|
|
//call RestartPosition. Should not recieve DB_S_COMMANDREEXECUTED or DB_E_CANNOTRESTART.
|
|
//Even on providers/rowsets that are a live data stream calling RestartPosition before ANY
|
|
//rows are fetched should be a common optmization, since more services will do this blindly
|
|
//when handed a rowset to ensure its at the head, as they are not aware of the current position...
|
|
|
|
//Call directly as our helper maskes the normally warnings...
|
|
TEST3C_(hr = RowsetA.pIRowset()->RestartPosition(NULL),S_OK,DB_S_COMMANDREEXECUTED,DB_E_CANNOTRESTART);
|
|
|
|
//Its a good idea to allow this optimization, although its not required by the spec...
|
|
TESTW_(hr, S_OK);
|
|
|
|
CLEANUP:
|
|
RowsetA.DropRowset();
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(11)
|
|
//--------------------------------------------------------------------
|
|
// @mfunc Release Rowset with active Row handles - verify released
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_11()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
ULONG i=0;
|
|
|
|
TCIRowset RowsetA;
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//We want to verify that the row handles do not take any references on the Rowset
|
|
//According to the spec, Releasing the Rowset even with unreleased rows should
|
|
//Still release the rowset and all assoicated rows and accessors...
|
|
|
|
//Retrive the first row
|
|
TESTC_(RowsetA.GetNextRows(0, 1, &hRow),S_OK);
|
|
//Verify this row
|
|
TESTC(RowsetA.VerifyRowHandles(hRow, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
//Don't release row handles
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(12)
|
|
//--------------------------------------------------------------------
|
|
// @mfunc Release Rowset with active accessors - verify released
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Rowsets::Variation_12()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
HACCESSOR hAccessor = NULL;
|
|
|
|
TCIRowset RowsetA;
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//We want to verify that the row handles do not take any references on the Rowset
|
|
//According to the spec, Releasing the Rowset even with unreleased rows should
|
|
//Still release the rowset and all assoicated rows and accessors...
|
|
|
|
//Create an Accessor
|
|
TESTC_(GetAccessorAndBindings(RowsetA(), DBACCESSOR_ROWDATA, &hAccessor, NULL, NULL, NULL),S_OK);
|
|
|
|
//Retrive the first row
|
|
TESTC_(RowsetA.GetNextRows(0, 1, &hRow),S_OK);
|
|
//Verify this row
|
|
TESTC(RowsetA.VerifyRowHandles(hRow, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
//Don't release row handles
|
|
//Don't release hAccessor
|
|
TRETURN
|
|
}
|
|
// }}
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Rowsets::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
// }}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_Properties)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_Properties - Rowset properties
|
|
//| Created: 11/03/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Properties::Init()
|
|
{
|
|
return TCIRowset::Init();
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc IRowsetLocate should not change fetch position
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Properties::Variation_1()
|
|
{
|
|
TBEGIN
|
|
IRowsetLocate* pIRowsetLocate = NULL;
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW hRow = NULL;
|
|
HROW* rghRows = NULL;
|
|
DBBKMARK cbBookmark = 0;
|
|
BYTE* pBookmark = NULL;
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowsetLocate)==S_OK);
|
|
|
|
//Obtain IRowsetLocate
|
|
TESTC(VerifyInterface(pIRowset(), IID_IRowsetLocate, ROWSET_INTERFACE, (IUnknown**)&pIRowsetLocate));
|
|
|
|
//Get the Bookmark for the first row
|
|
TESTC_(GetNextRows(0, 1, &hRow), S_OK);
|
|
TESTC_(GetBookmark(hRow, &cbBookmark, &pBookmark),S_OK);
|
|
TESTC(VerifyReleaseRows(1, &hRow));
|
|
|
|
//NextFetchPosition Should be unchanged
|
|
//Also the 2.0 spec indicates lRowOffset is ignored
|
|
TESTC_(GetNextRows(10000, 0, &hRow), S_OK);
|
|
|
|
//get the first row
|
|
TESTC_(pIRowsetLocate->GetRowsAt(NULL, NULL, cbBookmark, pBookmark, 0,1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC(cRowsObtained == 1 && rghRows != NULL);
|
|
|
|
//make sure the row fetched is the first row
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
TESTC(VerifyReleaseRows(cRowsObtained, rghRows));
|
|
|
|
//the cursor is at the third row right now
|
|
TESTC(VerifyGetNextRows(1, 1, THIRD_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
PROVIDER_FREE(pBookmark);
|
|
SAFE_RELEASE(pIRowsetLocate);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc IRowsetScroll should not change fetch position
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Properties::Variation_2()
|
|
{
|
|
TBEGIN
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW hRow = NULL;
|
|
HROW* rghRows = NULL;
|
|
IRowsetScroll* pIRowsetScroll = NULL;
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowsetScroll)==S_OK);
|
|
|
|
//Obtain IRowsetScroll
|
|
TESTC(VerifyInterface(pIRowset(), IID_IRowsetScroll, ROWSET_INTERFACE, (IUnknown**)&pIRowsetScroll));
|
|
|
|
//Retreive the first row handle
|
|
TESTC_(pIRowsetScroll->GetRowsAtRatio(NULL, NULL, 0, 1, ONE_ROW, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC(cRowsObtained == 1 && rghRows != NULL);
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
TESTC_(ReleaseRows(cRowsObtained, rghRows),S_OK);
|
|
|
|
//NextFetchPosition Should be unchanged by IRowsetScroll
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
SAFE_RELEASE(pIRowsetScroll);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc IRowsetExactScroll shoud not change fetch position
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Properties::Variation_3()
|
|
{
|
|
//TODO Change to use IRowsetExactScroll for V2
|
|
//Currently just uses IRowsetScroll
|
|
|
|
TBEGIN
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW hRow = NULL;
|
|
HROW* rghRows = NULL;
|
|
IRowsetScroll* pIRowsetScroll = NULL;
|
|
|
|
//open rowset with desired properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowsetScroll)==S_OK);
|
|
|
|
//Obtain IRowsetScroll
|
|
TESTC(VerifyInterface(pIRowset(), IID_IRowsetScroll, ROWSET_INTERFACE, (IUnknown**)&pIRowsetScroll));
|
|
|
|
//Retreive the first row handle
|
|
TESTC_(pIRowsetScroll->GetRowsAtRatio(NULL, NULL, 0, 1, ONE_ROW, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC(cRowsObtained == 1 && rghRows != NULL);
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
TESTC_(ReleaseRows(cRowsObtained, rghRows),S_OK);
|
|
|
|
//NextFetchPosition Should be unchanged by IRowsetScroll
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
SAFE_RELEASE(pIRowsetScroll);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc CANHOLDROWS = FALSE
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Properties::Variation_4()
|
|
{
|
|
HROW hRowA = INVALID(HROW);
|
|
HROW hRowB = INVALID(HROW);
|
|
HRESULT hr = S_OK;
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
|
|
//DBPROP_CANHOLDROWS = FALSE
|
|
SetProperty(DBPROP_CANHOLDROWS, DBPROPSET_ROWSET,(void*)VARIANT_FALSE, DBTYPE_BOOL);
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//Verify DBPROP_CANHOLDROWS = FALSE
|
|
//NOTE: This is only a warning since its odd to be able to successfully set CANHOLDROWS=TRUE
|
|
//above and then GetProperties returns FALSE. More than likely a bug in the provider, but their
|
|
//is the "rare" condition allowed by the spec for this one property, that if FALSE has no meaning
|
|
//for the provider and they may or may not return ROWSNOTRELEASED, then GetProperties can return
|
|
//TRUE...
|
|
TESTW(GetProperty(DBPROP_CANHOLDROWS, DBPROPSET_ROWSET, VARIANT_FALSE));
|
|
|
|
//Fetch Row 1
|
|
TESTC_(GetNextRows(&hRowA), S_OK);
|
|
|
|
//Setting CANHOLROWS=FALSE, According to the spec indicates that holding rows may or
|
|
//may not be allowed, since you didn't request the ability to hold rows. Prevents the
|
|
//provider from having artifical limiting functionality.
|
|
|
|
//Fetch Row 2
|
|
TEST3C_(hr = GetNextRows(0, 1, &cRowsObtained, &hRowB), S_OK, DB_S_ROWLIMITEXCEEDED, DB_E_ROWSNOTRELEASED);
|
|
if(hr == S_OK)
|
|
{
|
|
//Able to hold row when CANHOLDROWS = FALSE
|
|
TESTC(VerifyRowHandles(hRowB, SECOND_ROW));
|
|
}
|
|
else if(hr == DB_S_ROWLIMITEXCEEDED)
|
|
{
|
|
//Unable to have more than 1 row open
|
|
TESTC(cRowsObtained == 0 /* && hRowB == NULL*/); //TODO Spec issue:
|
|
TESTC(m_ulMaxOpenRows == 1);
|
|
}
|
|
else
|
|
{
|
|
//Unable to hold rows when CANHOLDROWS = FALSE
|
|
TESTC(cRowsObtained == 0 /* && hRowB == NULL*/); //TODO Spec issue:
|
|
}
|
|
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRowA);
|
|
ReleaseRows(hRowB);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc DBPROP_ACCESSORDER - DBPROPVAL_AO_RANDOM
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Properties::Variation_5()
|
|
{
|
|
TBEGIN
|
|
ULONG_PTR ulValue = 0;
|
|
|
|
//DBPROP_ACCESSORDER - DBPROPVAL_AO_RANDOM
|
|
//NOTE: If this property is not supported, then the provider has no problem is
|
|
//getting the columns already fetched (order doesn't matter). Providers would support
|
|
//this property if the "random" mode is expensive and can provide a more
|
|
//efficent (less functional) mode.
|
|
SetSettableProperty(DBPROP_ACCESSORDER, DBPROPSET_ROWSET, (void*)DBPROPVAL_AO_RANDOM, DBTYPE_I4);
|
|
|
|
//Create a rowset, (Accessor contains BLOB columns)
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowset, DBACCESSOR_ROWDATA,
|
|
DBPART_ALL, ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_EMPTY, BLOB_LONG)==S_OK);
|
|
|
|
//If the property is not supported, then the provider has no problem returning data in
|
|
//a random order. (ie: don't check the return code from GetProperties)
|
|
if(!GetProperty(DBPROP_ACCESSORDER, DBPROPSET_ROWSET, &ulValue) || ulValue==DBPROPVAL_AO_RANDOM)
|
|
{
|
|
//Obtain all the rows at once, and verify
|
|
//This tests the senario of being able to "see" BLOBs are the beyond
|
|
//the current fetch position, meaning the provider may have to "cache" the entire BLOB
|
|
//in order to obtain th value (ie: meaning of DBPROP_ACCESSORODER)
|
|
TESTC(VerifyGetNextRows(0, m_ulTableRows, FIRST_ROW));
|
|
}
|
|
|
|
CLEANUP:
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc DBPROP_ACCESSORDER - DBPROPVAL_AO_SEQUENTIAL
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Properties::Variation_6()
|
|
{
|
|
TBEGIN
|
|
|
|
//DBPROP_ACCESSORDER - DBPROPVAL_AO_SEQUENTIAL
|
|
//NOTE: DBPROPVAL_AO_SEQUENTIALSTORAGEOBJECTS is covered in the IStorage test...
|
|
SetSettableProperty(DBPROP_ACCESSORDER, DBPROPSET_ROWSET, (void*)DBPROPVAL_AO_SEQUENTIAL, DBTYPE_I4);
|
|
|
|
//Create a rowset, (Accessor contains BLOB columns)
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowset, DBACCESSOR_ROWDATA,
|
|
DBPART_ALL, ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_EMPTY, BLOB_LONG)==S_OK);
|
|
|
|
//Obtain all the rows one at a time, obtaining all rows and columns sequentially
|
|
//NOTE: Even if Sequential could not be set (readonly or not supported), reading the data
|
|
//in a sequential matter is the "least common denominator" and must work in any of the
|
|
//property value settings
|
|
TESTC(VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc DBPROP_ACCESSORDER - DBPROPVAL_AO_SEQUENTIAL - access in a random matter
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Properties::Variation_7()
|
|
{
|
|
TBEGIN
|
|
ULONG_PTR ulValue = 0;
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
void* pData = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
//DBPROP_ACCESSORDER - DBPROPVAL_AO_SEQUENTIAL
|
|
//NOTE: DBPROPVAL_AO_SEQUENTIALSTORAGEOBJECTS is covered in the IStorage test...
|
|
SetSettableProperty(DBPROP_ACCESSORDER, DBPROPSET_ROWSET, (void*)DBPROPVAL_AO_SEQUENTIAL, DBTYPE_I4);
|
|
|
|
//Create a rowset, (Accessor contains BLOB columns)
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowset, DBACCESSOR_ROWDATA,
|
|
DBPART_ALL, ALL_COLS_BOUND, FORWARD, NO_COLS_BY_REF, DBTYPE_EMPTY, BLOB_LONG)==S_OK);
|
|
|
|
//Maybe the property was not supported, or notsettable.
|
|
if(!GetProperty(DBPROP_ACCESSORDER, DBPROPSET_ROWSET, &ulValue) || ulValue==DBPROPVAL_AO_RANDOM)
|
|
{
|
|
//Obtain all the rows at once, and verify
|
|
//This tests the senario of being able to "see" BLOBs are the beyond
|
|
//the current fetch position, meaning the provider may have to "cache" the entire BLOB
|
|
//in order to obtain th value (ie: meaning of DBPROP_ACCESSORODER)
|
|
TESTC(VerifyGetNextRows(0, m_ulTableRows, FIRST_ROW));
|
|
}
|
|
else
|
|
{
|
|
//Obtain all the rows in the rowset (or as many as possible)
|
|
TEST2C_(GetNextRows(0, m_ulTableRows, &cRowsObtained, &rghRows),S_OK,DB_S_ROWLIMITEXCEEDED);
|
|
|
|
//The property value is Sequential, so try to obtain the rows in a random order anyway...
|
|
//ie: Common user senario: not realizing their is (yet another) property for this
|
|
//and doing the operations anyway...
|
|
for(ULONG iRow=0; iRow<cRowsObtained; iRow++)
|
|
{
|
|
//Obtain the Data for this row...
|
|
//NOTE: The provider still might be alb eto obtain previous fetched rows
|
|
//depending upon the columns/data/cursor, but will more than likely fail for the
|
|
//BLOB columns with DBSTATUS_E_UNAVAILABLE as spec'd
|
|
TEST3C_(hr = GetRowData(rghRows[iRow], &m_pData),S_OK,DB_S_ERRORSOCCURRED,DB_E_ERRORSOCCURRED);
|
|
|
|
if(hr == S_OK)
|
|
{
|
|
//All data was successfully retrived (verify row data)
|
|
//We can't just call VerifyRowHandles since that calls GetData again.
|
|
//Were as we are testing "sequential" and getting data again is not a
|
|
//sequential fasion and a provider could fail that...
|
|
if(!CompareTableData(FIRST_ROW+iRow, m_pData, m_cBindings, m_rgBinding))
|
|
{
|
|
//Data incorrect for this row!
|
|
TERROR("Data was incorrect for row " << FIRST_ROW+iRow);
|
|
QTESTC(FALSE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//Verify the errors...
|
|
for(ULONG iBinding=0; iBinding<m_cBindings; iBinding++)
|
|
{
|
|
DBBINDING* pBinding = &m_rgBinding[iBinding];
|
|
DBSTATUS dbStatus = STATUS_BINDING(*pBinding, m_pData);
|
|
|
|
switch(dbStatus)
|
|
{
|
|
case DBSTATUS_S_OK:
|
|
case DBSTATUS_S_ISNULL:
|
|
//Verify the data so this successfully obtained column
|
|
if(!CompareTableData(FIRST_ROW+iRow, m_pData, 1/*cBindings*/, pBinding))
|
|
{
|
|
//Data incorrect for this row!
|
|
TERROR("Data was incorrect for row " << FIRST_ROW+iRow);
|
|
QTESTC(FALSE);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
TESTC(dbStatus == DBSTATUS_E_UNAVAILABLE);
|
|
};
|
|
}
|
|
}
|
|
|
|
ReleaseRowData(m_pData, m_hAccessor, FALSE/*fFreeBuffer*/);
|
|
}
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
SAFE_FREE(rghRows);
|
|
DropRowset();
|
|
SAFE_FREE(pData);
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Properties::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
// }}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_Parameters)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_Parameters - Different combination of parameters of IRowset methods
|
|
//| Created: 11/03/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Parameters::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//open rowset with desired properties
|
|
if(CreateRowset(SELECT_VALIDATIONORDER)==S_OK)
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRows==0; AddRef and ReleaseRows do nothing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Parameters::Variation_1()
|
|
{
|
|
TBEGIN
|
|
HROW hRow = DB_NULL_HROW;
|
|
ULONG rgRefCounts[1] = {0};
|
|
|
|
//Obtain the first row
|
|
TESTC_(GetNextRows(0, 1, &hRow), S_OK);
|
|
|
|
//ReleasRows cRows==0 (do nothing)
|
|
TESTC_(m_pIRowset->ReleaseRows(0, &hRow, NULL, rgRefCounts, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, rgRefCounts, 0));
|
|
|
|
//AddRef cRows==0 (do nothing)
|
|
TESTC_(m_pIRowset->AddRefRows(0, &hRow, rgRefCounts, NULL), S_OK);
|
|
TESTC(VerifyRefCounts(1, rgRefCounts, 0));
|
|
TESTC(VerifyReleaseRows(1, &hRow));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRows=1 and rghRows contain two row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Parameters::Variation_2()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW rghRows[TWO_ROWS];
|
|
ULONG rgRefCounts[TWO_ROWS];
|
|
|
|
//This variation requires more than 1 active row
|
|
TESTC_PROVIDER(m_ulMaxOpenRows == 0 || m_ulMaxOpenRows >= TWO_ROWS);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//set up an arry of two row handles.
|
|
TESTC_(GetNextRows(0, 2, &cRowsObtained, &rghRows[0]), S_OK);
|
|
|
|
//addRefRows
|
|
TESTC_(m_pIRowset->AddRefRows(1, rghRows, rgRefCounts, NULL), S_OK);
|
|
TESTC(VerifyRefCounts(1, rgRefCounts, 2));
|
|
|
|
//releaseRows
|
|
TESTC_(m_pIRowset->ReleaseRows(1, rghRows, NULL, rgRefCounts, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, rgRefCounts, 1));
|
|
TESTC(VerifyReleaseRows(2, rghRows, 0));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(2, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc One element of rghRows is NULL
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Parameters::Variation_3()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW rghRows[3] = { LONG_MIN, NULL, LONG_MAX };
|
|
ULONG rgRefCounts[3] = { ULONG_MAX, ULONG_MAX, ULONG_MAX };
|
|
ULONG rgRowStatus[3] = { ULONG_MAX, ULONG_MAX, ULONG_MAX };
|
|
|
|
//Create a "fresh" rowset...
|
|
TCIRowset RowsetA;
|
|
TESTC_(RowsetA.CreateRowset(SELECT_VALIDATIONORDER),S_OK);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//retrieve one row
|
|
TESTC_(RowsetA.GetNextRows(0, 1, &cRowsObtained, &rghRows[1]), S_OK);
|
|
|
|
//addRef the array of row handles (with - valid, valid)
|
|
TESTC_(RowsetA()->AddRefRows(3, rghRows, rgRefCounts, rgRowStatus), DB_S_ERRORSOCCURRED);
|
|
//addRef the array of row handles (with - NULL, valid)
|
|
TESTC_(RowsetA()->AddRefRows(3, rghRows, NULL, rgRowStatus), DB_S_ERRORSOCCURRED);
|
|
//addRef the array of row handles (with - valid, NULL)
|
|
TESTC_(RowsetA()->AddRefRows(3, rghRows, rgRefCounts, NULL), DB_S_ERRORSOCCURRED);
|
|
|
|
//Verify RowStatus
|
|
TESTC(rgRowStatus[0] == DBROWSTATUS_E_INVALID);
|
|
TESTC(rgRowStatus[1] == DBROWSTATUS_S_OK);
|
|
TESTC(rgRowStatus[2] == DBROWSTATUS_E_INVALID);
|
|
|
|
//Verify Reference Counts
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[0], 0));
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[1], 4));
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[2], 0));
|
|
|
|
//Release the array of row handles. rgRowOptions should be ignored
|
|
rgRefCounts[0] = ULONG_MAX;
|
|
TESTC_(RowsetA()->ReleaseRows(3, rghRows, INVALID(DBROWOPTIONS*), rgRefCounts, rgRowStatus), DB_S_ERRORSOCCURRED);
|
|
TESTC(rgRowStatus[0] == DBROWSTATUS_E_INVALID);
|
|
TESTC(rgRowStatus[1] == DBROWSTATUS_S_OK);
|
|
TESTC(rgRowStatus[2] == DBROWSTATUS_E_INVALID);
|
|
|
|
//Verify Reference Counts
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[0], 0));
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[1], 3));
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[2], 0));
|
|
|
|
//Release the array of row handles. (With - NULL, NULL, NULL)
|
|
TESTC_(RowsetA()->ReleaseRows(3, rghRows, NULL, NULL, NULL), DB_S_ERRORSOCCURRED);
|
|
//Release the array of row handles. (With - NULL, NULL, valid)
|
|
TESTC_(RowsetA()->ReleaseRows(3, rghRows, NULL, NULL, rgRowStatus), DB_S_ERRORSOCCURRED);
|
|
//Release the array of row handles. (With - NULL, valid, NULL)
|
|
TESTC_(RowsetA()->ReleaseRows(3, rghRows, NULL, rgRefCounts, NULL), DB_S_ERRORSOCCURRED);
|
|
|
|
TCOMPARE(rgRowStatus[0], DBROWSTATUS_E_INVALID);
|
|
TCOMPARE(rgRowStatus[1], DBROWSTATUS_S_OK);
|
|
TCOMPARE(rgRowStatus[2], DBROWSTATUS_E_INVALID);
|
|
TESTC(VerifyRefCounts(3, rgRefCounts, 0));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(3, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Any array of duplicated HRows
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Parameters::Variation_4()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW rghRows[3] = { NULL, NULL, NULL };
|
|
ULONG rgRefCounts[3] = { 0, 0, 0 };
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retrieve two rows
|
|
TESTC_(GetNextRows(0, 1, &rghRows[0]), S_OK);
|
|
|
|
//Duplicate row handle
|
|
rghRows[1]=rghRows[0];
|
|
|
|
//addRef
|
|
TESTC_(m_pIRowset->AddRefRows(2, rghRows, rgRefCounts, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[0], 2));
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[1], 3));
|
|
|
|
//releaseRows
|
|
TESTC_(m_pIRowset->ReleaseRows(2, rghRows, NULL, rgRefCounts, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[0], 2));
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[1], 1));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(2, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc AddRef and Release a released row handle
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Parameters::Variation_5()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ULONG cRowsObtained = 0;
|
|
HROW hRow = NULL;
|
|
ULONG ulRefCount = 1;
|
|
DBROWSTATUS dwRowStatus = 0;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Obtain and release a rows handle
|
|
TESTC_(GetNextRows(0, 1, &hRow),S_OK);
|
|
TESTC(VerifyReleaseRows(1, &hRow));
|
|
|
|
//Since "Released" RowHandles are really undefined by the spec.
|
|
//The provider may still have them arround, or may not. The consumer
|
|
//Really should assume there gone, but some providers may just keep them arround
|
|
//All we can really check for here, is that either they are alive to released.
|
|
|
|
//AddRef - Released row handle
|
|
hr = m_pIRowset->AddRefRows(1, &hRow, &ulRefCount, &dwRowStatus);
|
|
TESTC(hr == S_OK || hr == DB_E_ERRORSOCCURRED);
|
|
|
|
if(hr == S_OK)
|
|
{
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 1));
|
|
TESTC(dwRowStatus == DBROWSTATUS_S_OK);
|
|
|
|
//Release - Valid row handle
|
|
TESTC_(m_pIRowset->ReleaseRows(1, &hRow, NULL, &ulRefCount, &dwRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(dwRowStatus == DBROWSTATUS_S_OK);
|
|
}
|
|
if(hr == DB_E_ERRORSOCCURRED)
|
|
{
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(dwRowStatus == DBROWSTATUS_E_INVALID);
|
|
|
|
//Release - Released row handle
|
|
TESTC_(m_pIRowset->ReleaseRows(1, &hRow, NULL, &ulRefCount, &dwRowStatus), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(dwRowStatus == DBROWSTATUS_E_INVALID);
|
|
}
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Call RestartPosition three times. Fetch position is not changed.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Parameters::Variation_6()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//move the cursor away from the first row
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
CLEANUP:
|
|
TRETURN;
|
|
}
|
|
|
|
|
|
// }}
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Parameters::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
// }}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_Sequence)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_Sequence - Calling sequence between interfaces and methods
|
|
//| Created: 11/03/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Sequence::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//open rowset with desired properties
|
|
if(CreateRowset(SELECT_VALIDATIONORDER)==S_OK)
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc AddRef, AddRef,ReleaseRows,ReleaseRows,ReleaseRows. RefCount==0
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Sequence::Variation_1()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW rghRows[3];
|
|
ULONG rgRefCounts[3];
|
|
|
|
//This variation requires more than 1 active row
|
|
TESTC_PROVIDER(m_ulMaxOpenRows == 0 || m_ulMaxOpenRows >= THREE_ROWS);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Get 3 rows
|
|
TEST2C_(GetNextRows(0, 3, &cRowsObtained, rghRows), S_OK, DB_S_ROWLIMITEXCEEDED);
|
|
|
|
//addRef
|
|
TESTC_(m_pIRowset->AddRefRows(cRowsObtained, rghRows, rgRefCounts, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(cRowsObtained, rgRefCounts, 2));
|
|
|
|
//addRef again
|
|
TESTC_(m_pIRowset->AddRefRows(cRowsObtained, rghRows, rgRefCounts, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(cRowsObtained, rgRefCounts, 3));
|
|
|
|
//release three times
|
|
TESTC_(m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, rgRefCounts, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(cRowsObtained, rgRefCounts, 2));
|
|
|
|
//second relase
|
|
TESTC_(m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, rgRefCounts, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(cRowsObtained, rgRefCounts, 1));
|
|
|
|
//third relase
|
|
TESTC_(m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, rgRefCounts, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(cRowsObtained, rgRefCounts, 0));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc AddRef, ReleaseRows,AddRef,AddRef,AddRef,ReleaseRows. RefCount==3
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Sequence::Variation_2()
|
|
{
|
|
HROW hRow;
|
|
ULONG ulRefCount;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//get a row handle. Skip a row
|
|
TESTC_(GetNextRows(1, 1, &hRow),S_OK);
|
|
|
|
//AddRef: RefCounts==2
|
|
TESTC_(m_pIRowset->AddRefRows(1, &hRow, &ulRefCount, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 2));
|
|
|
|
//AddRef: RefCounts==3
|
|
TESTC_(m_pIRowset->AddRefRows(1, &hRow, &ulRefCount, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 3));
|
|
|
|
//AddRef: RefCounts==4
|
|
TESTC_(m_pIRowset->AddRefRows(1, &hRow, &ulRefCount, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 4));
|
|
|
|
//ReleaseRows:RefCounts==3
|
|
TESTC_(m_pIRowset->ReleaseRows(1, &hRow, NULL, &ulRefCount, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 3));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Sequence::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
// }}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_Boundary)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_Boundary - Boundary conditions
|
|
//| Created: 11/03/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Boundary::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//open rowset with desired properties
|
|
if(CreateRowset(SELECT_VALIDATIONORDER)==S_OK)
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc AddRefRows--rghRows==NULL;E_INVALIDARG
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_1()
|
|
{
|
|
HROW rghRows[1];
|
|
ULONG rgRefCounts[1];
|
|
DBROWSTATUS rgRowStatus[1];
|
|
|
|
//No-op
|
|
TESTC_(m_pIRowset->AddRefRows(0, NULL, NULL, NULL),S_OK);
|
|
TESTC_(m_pIRowset->AddRefRows(0, rghRows, NULL, NULL),S_OK);
|
|
TESTC_(m_pIRowset->AddRefRows(0, rghRows, rgRefCounts, NULL),S_OK);
|
|
TESTC_(m_pIRowset->AddRefRows(0, rghRows, rgRefCounts, rgRowStatus),S_OK);
|
|
|
|
//E_INVALIDARG
|
|
TESTC_(m_pIRowset->AddRefRows(1, NULL, NULL, NULL),E_INVALIDARG);
|
|
TESTC_(m_pIRowset->AddRefRows(1, NULL, rgRefCounts, rgRowStatus),E_INVALIDARG);
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc AddRefRows--pcRefCounted==NULL;S_OK
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_2()
|
|
{
|
|
HROW hRow;
|
|
ULONG ulRefCount;
|
|
|
|
//get one row handle
|
|
TESTC_(GetNextRows(0, 1, &hRow),S_OK);
|
|
TESTC_(m_pIRowset->AddRefRows(1, &hRow, &ulRefCount, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 2));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(1, &hRow);
|
|
ReleaseRows(1, &hRow);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc AddRefRows--rgRefCounts==NULL;S_OK
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_3()
|
|
{
|
|
HROW rghRows[1];
|
|
DBROWSTATUS rgRowStatus[1];
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//get two row handle
|
|
TESTC_(GetNextRows(0, 1, rghRows),S_OK);
|
|
TESTC_(m_pIRowset->AddRefRows(1, rghRows, NULL, rgRowStatus),S_OK);
|
|
TESTC(rgRowStatus[0] == DBROWSTATUS_S_OK);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(1, rghRows);
|
|
ReleaseRows(1, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc AddRefRows--pcRefCounted==NULL && rgRefCounts==NULL;S_OK
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_4()
|
|
{
|
|
HROW rghRows[1];
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//get row handles
|
|
TESTC_(GetNextRows(0, 1, rghRows),S_OK);
|
|
TESTC_(m_pIRowset->AddRefRows(1, rghRows, NULL, NULL),S_OK);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(1, rghRows);
|
|
ReleaseRows(1, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc AddRefRows - before any rows are fetched
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_5()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW rghRows[3] = { LONG_MIN, NULL, LONG_MAX };
|
|
ULONG rgRefCounts[3] = { ULONG_MAX, ULONG_MAX, ULONG_MAX };
|
|
ULONG rgRowStatus[3] = { ULONG_MAX, ULONG_MAX, ULONG_MAX };
|
|
|
|
//Create a "fresh" rowset...
|
|
CRowset RowsetA;
|
|
TESTC_(RowsetA.CreateRowset(SELECT_VALIDATIONORDER),S_OK);
|
|
|
|
//Before fetching any rows, call AddRefRows...
|
|
//This is a good senario since most providers allocate a row buffer at fetch time which
|
|
//will be NULL for this senario. Make sure they handle it...
|
|
|
|
//No-op
|
|
TESTC_(RowsetA()->AddRefRows(0, NULL, NULL, NULL),S_OK);
|
|
TESTC_(RowsetA()->AddRefRows(0, rghRows, NULL, NULL),S_OK);
|
|
TESTC_(RowsetA()->AddRefRows(0, rghRows, rgRefCounts, NULL),S_OK);
|
|
TESTC_(RowsetA()->AddRefRows(0, rghRows, rgRefCounts, rgRowStatus),S_OK);
|
|
|
|
//E_INVALIDARG
|
|
TESTC_(RowsetA()->AddRefRows(1, NULL, NULL, NULL),E_INVALIDARG);
|
|
TESTC_(RowsetA()->AddRefRows(1, NULL, rgRefCounts, rgRowStatus),E_INVALIDARG);
|
|
|
|
//(3, invalid, valid, valid) - DB_E_ERRORSOCCURRED
|
|
TESTC_(RowsetA()->AddRefRows(THREE_ROWS, rghRows, rgRefCounts, rgRowStatus), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyArray(THREE_ROWS, rgRowStatus, DBROWSTATUS_E_INVALID));
|
|
TESTC(VerifyArray(THREE_ROWS, rgRefCounts, 0));
|
|
|
|
//(3, invalid, valid, NULL) - DB_E_ERRORSOCCURRED
|
|
TESTC_(RowsetA()->AddRefRows(THREE_ROWS, rghRows, rgRefCounts, NULL), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyArray(THREE_ROWS, rgRefCounts, 0));
|
|
|
|
//(3, invalid, NULL, valid) - DB_E_ERRORSOCCURRED
|
|
TESTC_(RowsetA()->AddRefRows(THREE_ROWS, rghRows, NULL, rgRowStatus), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyArray(THREE_ROWS, rgRowStatus, DBROWSTATUS_E_INVALID));
|
|
|
|
//(3, invalid, NULL, NULL) - DB_E_ERRORSOCCURRED
|
|
TESTC_(RowsetA()->AddRefRows(THREE_ROWS, rghRows, NULL, NULL), DB_E_ERRORSOCCURRED);
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc GetData--pData==NULL;E_INVALIDARG
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_6()
|
|
{
|
|
HROW hRow = NULL;
|
|
HACCESSOR hNullAccessor = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
//GetData (pData==NULL, valid accessor) - E_INVALIDARG
|
|
TESTC_(GetNextRows(0, 1, &hRow),S_OK);
|
|
TESTC_(m_pIRowset->GetData(hRow, m_hAccessor, NULL),E_INVALIDARG);
|
|
|
|
//Create a "null" accessor (used when inserting data)
|
|
TEST2C_(hr = pIAccessor()->CreateAccessor(DBACCESSOR_ROWDATA, 0, NULL, 0, &hNullAccessor, NULL),S_OK, DB_E_NULLACCESSORNOTSUPPORTED);
|
|
|
|
//Verify NullAccessors are correctly not supported if error occurrs...
|
|
if(hr == DB_E_NULLACCESSORNOTSUPPORTED)
|
|
{
|
|
//Make sure that IRowsetChange is not supported, or at least
|
|
//IRowsetChange::InsertRow is not supported...
|
|
ULONG_PTR dwValue = 0;
|
|
if(GetProperty(DBPROP_IRowsetChange, DBPROPSET_ROWSET))
|
|
TESTC(GetProperty(DBPROP_UPDATABILITY, DBPROPSET_ROWSET, &dwValue) && !(dwValue & DBPROPVAL_UP_INSERT));
|
|
}
|
|
else
|
|
{
|
|
//GetData (pData==NULL, "null" Accessor) - S_OK
|
|
//NullAccessors are supported, only at the rowset level,
|
|
TESTC_(m_pIRowset->GetData(hRow, hNullAccessor, NULL),S_OK);
|
|
}
|
|
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
ReleaseAccessor(hNullAccessor);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc GetNextRows--pcRowsObtained==NULL;E_INVALIDARG
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_7()
|
|
{
|
|
HROW* rghRows = NULL;
|
|
|
|
//GetNextRows
|
|
TESTC_(m_pIRowset->GetNextRows(NULL, 0, 1, NULL, &rghRows),E_INVALIDARG);
|
|
TESTC(rghRows == NULL);
|
|
|
|
CLEANUP:
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc GetNextRows--prghRows==NULL;E_INVALIDARG
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_8()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 1;
|
|
|
|
//GetNextRows
|
|
TESTC_(m_pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, NULL),E_INVALIDARG);
|
|
TESTC(cRowsObtained == 0);
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc ReleaseRows--rghRows==NULL;E_INVALIDARG
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_9()
|
|
{
|
|
HROW rghRows[2];
|
|
ULONG rgRowOptions[2];
|
|
ULONG rgRefCounts[2];
|
|
DBROWSTATUS rgRowStatus[2];
|
|
|
|
//No-op case
|
|
TESTC_(m_pIRowset->ReleaseRows(0, NULL, NULL, NULL, NULL),S_OK);
|
|
TESTC_(m_pIRowset->ReleaseRows(0, rghRows, NULL, NULL, NULL),S_OK);
|
|
TESTC_(m_pIRowset->ReleaseRows(0, rghRows, rgRowOptions, rgRefCounts, rgRowStatus),S_OK);
|
|
|
|
//E_INVALIDARG
|
|
TESTC_(m_pIRowset->ReleaseRows(2, NULL, NULL, NULL, NULL),E_INVALIDARG);
|
|
TESTC_(m_pIRowset->ReleaseRows(2, NULL, rgRowOptions, rgRefCounts, rgRowStatus),E_INVALIDARG);
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(10)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc ReleaseRows--pcReleased=NULL;S_OK
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_10()
|
|
{
|
|
HROW hRow;
|
|
ULONG ulRefCount;
|
|
|
|
//get one row handle
|
|
TESTC_(GetNextRows(0, 1, &hRow),S_OK);
|
|
TESTC_(m_pIRowset->ReleaseRows(1, &hRow, NULL, &ulRefCount, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(11)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc ReleaseRows--rgRefCounts==NULL;S_OK
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_11()
|
|
{
|
|
HROW rghRows[1];
|
|
DBROWSTATUS rgRowStatus[1];
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//get one row handle
|
|
TESTC_(GetNextRows(0, 1, rghRows),S_OK);
|
|
TESTC_(m_pIRowset->ReleaseRows(1, rghRows, NULL, NULL, rgRowStatus),S_OK);
|
|
|
|
//Verify Status
|
|
TESTC(rgRowStatus[0] == DBROWSTATUS_S_OK);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(1, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(12)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc ReleaseRows--pcRelease==NULL;rgRefCounts=NULL;S_OK
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_12()
|
|
{
|
|
HROW rghRows[1];
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//get one row handle
|
|
TESTC_(GetNextRows(2, 1, rghRows),S_OK);
|
|
TESTC_(m_pIRowset->ReleaseRows(1, rghRows, NULL, NULL, NULL),S_OK);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(1, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(13)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc ReleaseRows - before any rows are fetched
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_13()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW rghRows[3] = { LONG_MIN, NULL, LONG_MAX };
|
|
ULONG rgRefCounts[3] = { ULONG_MAX, ULONG_MAX, ULONG_MAX };
|
|
ULONG rgRowStatus[3] = { ULONG_MAX, ULONG_MAX, ULONG_MAX };
|
|
|
|
//Create a "fresh" rowset...
|
|
CRowset RowsetA;
|
|
TESTC_(RowsetA.CreateRowset(SELECT_VALIDATIONORDER),S_OK);
|
|
|
|
//Before fetching any rows, call AddRefRows...
|
|
//This is a good senario since most providers allocate a row buffer at fetch time which
|
|
//will be NULL for this senario. Make sure they handle it...
|
|
|
|
//No-op
|
|
TESTC_(RowsetA()->ReleaseRows(0, NULL, NULL, NULL, NULL),S_OK);
|
|
TESTC_(RowsetA()->ReleaseRows(0, rghRows, NULL, NULL, NULL),S_OK);
|
|
TESTC_(RowsetA()->ReleaseRows(0, rghRows, NULL, rgRefCounts, NULL),S_OK);
|
|
TESTC_(RowsetA()->ReleaseRows(0, rghRows, NULL, rgRefCounts, rgRowStatus),S_OK);
|
|
|
|
//E_INVALIDARG
|
|
TESTC_(RowsetA()->ReleaseRows(1, NULL, NULL, NULL, NULL),E_INVALIDARG);
|
|
TESTC_(RowsetA()->ReleaseRows(1, NULL, NULL, rgRefCounts, rgRowStatus),E_INVALIDARG);
|
|
|
|
//(3, invalid, valid, valid) - DB_E_ERRORSOCCURRED
|
|
TESTC_(RowsetA()->ReleaseRows(THREE_ROWS, rghRows, NULL, rgRefCounts, rgRowStatus), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyArray(THREE_ROWS, rgRowStatus, DBROWSTATUS_E_INVALID));
|
|
TESTC(VerifyArray(THREE_ROWS, rgRefCounts, 0));
|
|
|
|
//(3, invalid, valid, NULL) - DB_E_ERRORSOCCURRED
|
|
TESTC_(RowsetA()->ReleaseRows(THREE_ROWS, rghRows, NULL, rgRefCounts, NULL), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyArray(THREE_ROWS, rgRefCounts, 0));
|
|
|
|
//(3, invalid, NULL, valid) - DB_E_ERRORSOCCURRED
|
|
TESTC_(RowsetA()->ReleaseRows(THREE_ROWS, rghRows, NULL, NULL, rgRowStatus), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyArray(THREE_ROWS, rgRowStatus, DBROWSTATUS_E_INVALID));
|
|
|
|
//(3, invalid, NULL, NULL) - DB_E_ERRORSOCCURRED
|
|
TESTC_(RowsetA()->ReleaseRows(THREE_ROWS, rghRows, NULL, NULL, NULL), DB_E_ERRORSOCCURRED);
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(14)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc GetNextRows--*pcRowsObtained==0, *prgRows!=NULL
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_14()
|
|
{
|
|
HROW rghRows[3];
|
|
|
|
//NextFetchPosition should not be changed
|
|
TESTC_(GetNextRows(0, 0, rghRows),S_OK);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(3, rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(15)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc RestartPosition - Without calling GetData
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_15()
|
|
{
|
|
HROW hRow = NULL;
|
|
|
|
//NextFetchPosition should not be changed
|
|
TESTC_(GetNextRows(&hRow),S_OK);
|
|
TESTC_(ReleaseRows(hRow), S_OK);
|
|
|
|
//RestartPosition (without calling GetData first)
|
|
//Most of the variations in this test always verify the row handle returned
|
|
//From GetNextRows which is done by calling GetData. We need to make sure that
|
|
//RestartPosition works without any state setup from GetData...
|
|
TESTC_(RestartPosition(),S_OK);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(16)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc IUnknown::AddRef / Release
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_16()
|
|
{
|
|
TBEGIN
|
|
ULONG ulOrgRefCount = GetRefCount(pIRowset());
|
|
|
|
//AddRef/Release Combinations
|
|
SetRefCount(pIRowset(), 100); // AddRef 100 times
|
|
SetRefCount(pIRowset(), -10); // Release 10 times
|
|
SetRefCount(pIRowset(), 1); // AddRef 1 time
|
|
SetRefCount(pIRowset(), -90); // Release 90 times
|
|
SetRefCount(pIRowset(), -1); // Release 1 time
|
|
|
|
//Make sure the RefCount is back where we started...
|
|
TESTC(ulOrgRefCount == GetRefCount(pIRowset()));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(17)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc IUnknown::QueryInterface
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Boundary::Variation_17()
|
|
{
|
|
TBEGIN
|
|
|
|
//QI [MANDATORY] interfaces
|
|
TCOMPARE_(DefaultObjectTesting(pIRowset(), ROWSET_INTERFACE));
|
|
|
|
//IRowsetIdentity - is required for level-0,
|
|
//but may require actually setting the property
|
|
if(GetProperty(DBPROP_IRowsetIdentity, DBPROPSET_ROWSET))
|
|
{
|
|
//Should be available if the property is TRUE
|
|
TCHECK(QI(pIRowset(), IID_IRowsetIdentity), S_OK);
|
|
}
|
|
else
|
|
{
|
|
//Otherwise create a rowset setting the property first
|
|
CRowset RowsetB;
|
|
TCHECK(RowsetB.CreateRowset(DBPROP_IRowsetIdentity),S_OK);
|
|
|
|
//Should be available if the property is TRUE
|
|
TCHECK(QI(RowsetB.pIRowset(), IID_IRowsetIdentity), S_OK);
|
|
}
|
|
|
|
//QI [OPTIONAL] interfaces
|
|
//Providers that support an interface must also
|
|
//support the property assoicated with that interface with a value of VARIANT_TRUE
|
|
TCHECK(QI(pIRowset(), IID_IChapteredRowset), GetProperty(DBPROP_IChapteredRowset) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IColumnsRowset), GetProperty(DBPROP_IColumnsRowset) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IConnectionPointContainer), GetProperty(DBPROP_IConnectionPointContainer) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IDBAsynchStatus), GetProperty(DBPROP_IDBAsynchStatus) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IRowsetChange), GetProperty(DBPROP_IRowsetChange) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IRowsetFind), GetProperty(DBPROP_IRowsetFind) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IRowsetIdentity), GetProperty(DBPROP_IRowsetIdentity) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IRowsetIndex), GetProperty(DBPROP_IRowsetIndex) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IRowsetLocate), GetProperty(DBPROP_IRowsetLocate) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IRowsetRefresh), GetProperty(DBPROP_IRowsetRefresh) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IRowsetScroll), GetProperty(DBPROP_IRowsetScroll) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IRowsetUpdate), GetProperty(DBPROP_IRowsetUpdate) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_IRowsetView), GetProperty(DBPROP_IRowsetView) ? S_OK : E_NOINTERFACE);
|
|
TCHECK(QI(pIRowset(), IID_ISupportErrorInfo), GetProperty(DBPROP_ISupportErrorInfo) ? S_OK : E_NOINTERFACE);
|
|
|
|
//CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Boundary::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
// }}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_Transactions)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_Transactions - Use the interface within a transaction. Zombie State.
|
|
//| Created: 11/03/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Transactions::Init()
|
|
{
|
|
if(CTransaction::Init())
|
|
{
|
|
//register interface to be tested
|
|
if(RegisterInterface(ROWSET_INTERFACE, IID_IRowset, 0, NULL))
|
|
return TRUE;
|
|
}
|
|
|
|
//Not all providers have to support transactions
|
|
//If a required interface, an error would have been posted by VerifyInterface
|
|
TEST_PROVIDER(m_pITransactionLocal != NULL);
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Commit with retaining
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Transactions::Variation_1()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
DBROWSTATUS ulRowStatus;
|
|
ULONG ulRefCount;
|
|
HACCESSOR hAccessor = NULL;
|
|
|
|
DBLENGTH cbRowSize = 0;
|
|
BYTE* pData = NULL;
|
|
|
|
IRowset* pIRowset = NULL;
|
|
|
|
//start a transaction
|
|
TESTC(StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&pIRowset, 0, NULL));
|
|
|
|
//Create an Accessor
|
|
TESTC_(GetAccessorAndBindings(pIRowset, DBACCESSOR_ROWDATA, &hAccessor, NULL, NULL, &cbRowSize),S_OK);
|
|
pData = (BYTE*)PROVIDER_ALLOC(cbRowSize);
|
|
|
|
//get a row handle
|
|
TESTC_(pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),S_OK);
|
|
|
|
//commit the transaction with fRetaining==TRUE
|
|
TESTC(GetCommit(TRUE))
|
|
|
|
if(!m_fCommitPreserve)
|
|
{
|
|
//zombie
|
|
TESTC_(pIRowset->RestartPosition(NULL),E_UNEXPECTED);
|
|
TESTC_(pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),E_UNEXPECTED);
|
|
TESTC(cRowsObtained == 0);
|
|
|
|
TESTC_(pIRowset->AddRefRows(1,rghRows, NULL, NULL),E_UNEXPECTED);
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),E_UNEXPECTED);
|
|
|
|
//release should be successful, can always release rows in Zombie state
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(ulRowStatus == DBROWSTATUS_S_OK);
|
|
}
|
|
else
|
|
{
|
|
//fully functional
|
|
//try to get another row handle
|
|
TESTC_(pIRowset->ReleaseRows(1,rghRows, NULL, NULL, NULL),S_OK);
|
|
TEST2C_(pIRowset->RestartPosition(NULL),S_OK, DB_S_COMMANDREEXECUTED);
|
|
|
|
//get a row
|
|
TESTC_(pIRowset->GetNextRows(NULL, 4, 1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC_(pIRowset->AddRefRows(1, rghRows, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 2));
|
|
|
|
//GetData
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),S_OK);
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, NULL, NULL),S_OK);
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(ulRowStatus == DBROWSTATUS_S_OK);
|
|
}
|
|
|
|
CLEANUP:
|
|
PROVIDER_FREE(pData);
|
|
PROVIDER_FREE(rghRows);
|
|
|
|
//release the hAccessor
|
|
if(hAccessor)
|
|
CHECK(m_pIAccessor->ReleaseAccessor(hAccessor, NULL),S_OK);
|
|
SAFE_RELEASE(pIRowset);
|
|
|
|
//clean up. Expected S_OK.
|
|
CleanUpTransaction(S_OK);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Commit without retaining.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Transactions::Variation_2()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
DBROWSTATUS ulRowStatus;
|
|
ULONG ulRefCount;
|
|
HACCESSOR hAccessor = NULL;
|
|
|
|
DBLENGTH cbRowSize = 0;
|
|
BYTE* pData = NULL;
|
|
|
|
IRowset* pIRowset = NULL;
|
|
|
|
//start a transaction
|
|
TESTC(StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&pIRowset, 0, NULL));
|
|
|
|
//Create an Accessor
|
|
TESTC_(GetAccessorAndBindings(pIRowset, DBACCESSOR_ROWDATA, &hAccessor, NULL, NULL, &cbRowSize),S_OK);
|
|
pData = (BYTE*)PROVIDER_ALLOC(cbRowSize);
|
|
|
|
//get a row handle
|
|
TESTC_(pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),S_OK);
|
|
|
|
//commit the transaction with fRetaining==FALSE
|
|
TESTC(GetCommit(FALSE))
|
|
|
|
if(!m_fCommitPreserve)
|
|
{
|
|
//zombie
|
|
TESTC_(pIRowset->RestartPosition(NULL),E_UNEXPECTED);
|
|
TESTC_(pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),E_UNEXPECTED);
|
|
TESTC(cRowsObtained == 0);
|
|
|
|
TESTC_(pIRowset->AddRefRows(1,rghRows, NULL, NULL),E_UNEXPECTED);
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),E_UNEXPECTED);
|
|
|
|
//release should be successful
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(ulRowStatus == DBROWSTATUS_S_OK);
|
|
}
|
|
else
|
|
{
|
|
//fully functional
|
|
//try to get another row handle
|
|
TESTC_(pIRowset->ReleaseRows(1,rghRows, NULL, NULL, NULL),S_OK);
|
|
TEST2C_(pIRowset->RestartPosition(NULL),S_OK, DB_S_COMMANDREEXECUTED);
|
|
|
|
//get a row
|
|
TESTC_(pIRowset->GetNextRows(NULL, 4, 1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC_(pIRowset->AddRefRows(1, rghRows, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 2));
|
|
|
|
//GetData
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),S_OK);
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, NULL, NULL),S_OK);
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(ulRowStatus == DBROWSTATUS_S_OK);
|
|
}
|
|
|
|
CLEANUP:
|
|
PROVIDER_FREE(pData);
|
|
PROVIDER_FREE(rghRows);
|
|
|
|
//release the hAccessor
|
|
if(hAccessor)
|
|
CHECK(m_pIAccessor->ReleaseAccessor(hAccessor, NULL),S_OK);
|
|
SAFE_RELEASE(pIRowset);
|
|
|
|
//clean up. Expected S_OK.
|
|
CleanUpTransaction(XACT_E_NOTRANSACTION);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Abort with retaining.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Transactions::Variation_3()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
DBROWSTATUS ulRowStatus;
|
|
ULONG ulRefCount;
|
|
HACCESSOR hAccessor = NULL;
|
|
|
|
DBLENGTH cbRowSize = 0;
|
|
BYTE* pData = NULL;
|
|
|
|
IRowset* pIRowset = NULL;
|
|
|
|
//start a transaction
|
|
TESTC(StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&pIRowset, 0, NULL));
|
|
|
|
//Create an Accessor
|
|
TESTC_(GetAccessorAndBindings(pIRowset, DBACCESSOR_ROWDATA, &hAccessor, NULL, NULL, &cbRowSize),S_OK);
|
|
pData = (BYTE*)PROVIDER_ALLOC(cbRowSize);
|
|
|
|
//get a row handle
|
|
TESTC_(pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),S_OK);
|
|
|
|
//Abort the transaction with fRetaining==TRUE
|
|
TESTC(GetAbort(TRUE))
|
|
|
|
if(!m_fAbortPreserve)
|
|
{
|
|
//zombie
|
|
TESTC_(pIRowset->RestartPosition(NULL),E_UNEXPECTED);
|
|
TESTC_(pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),E_UNEXPECTED);
|
|
TESTC(cRowsObtained == 0);
|
|
|
|
TESTC_(pIRowset->AddRefRows(1,rghRows, NULL, NULL),E_UNEXPECTED);
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),E_UNEXPECTED);
|
|
|
|
//release should be successful
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(ulRowStatus == DBROWSTATUS_S_OK);
|
|
}
|
|
else
|
|
{
|
|
//fully functional
|
|
//try to get another row handle
|
|
TESTC_(pIRowset->ReleaseRows(1,rghRows, NULL, NULL, NULL),S_OK);
|
|
TEST2C_(pIRowset->RestartPosition(NULL),S_OK, DB_S_COMMANDREEXECUTED);
|
|
|
|
//get a row
|
|
TESTC_(pIRowset->GetNextRows(NULL, 4, 1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC_(pIRowset->AddRefRows(1, rghRows, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 2));
|
|
TESTC(ulRowStatus == DBROWSTATUS_S_OK);
|
|
|
|
//GetData
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),S_OK);
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, NULL, NULL),S_OK);
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(ulRowStatus == DBROWSTATUS_S_OK);
|
|
}
|
|
|
|
CLEANUP:
|
|
PROVIDER_FREE(pData);
|
|
PROVIDER_FREE(rghRows);
|
|
|
|
//release the hAccessor
|
|
if(hAccessor)
|
|
CHECK(m_pIAccessor->ReleaseAccessor(hAccessor, NULL),S_OK);
|
|
SAFE_RELEASE(pIRowset);
|
|
|
|
//clean up. Expected S_OK.
|
|
CleanUpTransaction(S_OK);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Abort without retaining.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Transactions::Variation_4()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
DBROWSTATUS ulRowStatus;
|
|
ULONG ulRefCount;
|
|
HACCESSOR hAccessor = NULL;
|
|
|
|
DBLENGTH cbRowSize = 0;
|
|
BYTE* pData = NULL;
|
|
|
|
IRowset* pIRowset = NULL;
|
|
|
|
//start a transaction
|
|
TESTC(StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&pIRowset, 0, NULL));
|
|
|
|
//Create an Accessor
|
|
TESTC_(GetAccessorAndBindings(pIRowset, DBACCESSOR_ROWDATA, &hAccessor, NULL, NULL, &cbRowSize),S_OK);
|
|
pData = (BYTE*)PROVIDER_ALLOC(cbRowSize);
|
|
|
|
//get a row handle
|
|
TESTC_(pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),S_OK);
|
|
|
|
//Abort the transaction with fRetaining==FALSE
|
|
TESTC(GetAbort(FALSE))
|
|
|
|
if(!m_fAbortPreserve)
|
|
{
|
|
//zombie
|
|
TESTC_(pIRowset->RestartPosition(NULL),E_UNEXPECTED);
|
|
TESTC_(pIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &rghRows),E_UNEXPECTED);
|
|
TESTC(cRowsObtained == 0);
|
|
|
|
TESTC_(pIRowset->AddRefRows(1,rghRows, NULL, NULL),E_UNEXPECTED);
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),E_UNEXPECTED);
|
|
|
|
//release should be successful
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(ulRowStatus == DBROWSTATUS_S_OK);
|
|
}
|
|
else
|
|
{
|
|
//fully functional
|
|
//try to get another row handle
|
|
TESTC_(pIRowset->ReleaseRows(1,rghRows, NULL, NULL, NULL),S_OK);
|
|
TEST2C_(pIRowset->RestartPosition(NULL),S_OK, DB_S_COMMANDREEXECUTED);
|
|
|
|
//get a row
|
|
TESTC_(pIRowset->GetNextRows(NULL, 4, 1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC_(pIRowset->AddRefRows(1, rghRows, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 2));
|
|
TESTC(ulRowStatus == DBROWSTATUS_S_OK);
|
|
|
|
//GetData
|
|
TESTC_(pIRowset->GetData(rghRows[0], hAccessor, pData),S_OK);
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, NULL, NULL),S_OK);
|
|
TESTC_(pIRowset->ReleaseRows(1, rghRows, NULL, &ulRefCount, &ulRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 0));
|
|
TESTC(ulRowStatus == DBROWSTATUS_S_OK);
|
|
}
|
|
|
|
CLEANUP:
|
|
PROVIDER_FREE(pData);
|
|
PROVIDER_FREE(rghRows);
|
|
|
|
//release the hAccessor
|
|
if(hAccessor)
|
|
CHECK(m_pIAccessor->ReleaseAccessor(hAccessor, NULL),S_OK);
|
|
SAFE_RELEASE(pIRowset);
|
|
|
|
//clean up. Expected S_OK.
|
|
CleanUpTransaction(XACT_E_NOTRANSACTION);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Transactions::Terminate()
|
|
{
|
|
return CTransaction::Terminate();
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_Chapters)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_Chapters - Chapters specific test
|
|
//| Created: 11/03/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Chapters::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//open rowset with desired properties
|
|
if(CreateRowset(SELECT_VALIDATIONORDER)==S_OK)
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc GetNextRows: Invalid hChapter
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Chapters::Variation_1()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
HROW hRow = NULL;
|
|
HRESULT hr = E_FAIL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Pass an invalid hChapter
|
|
//Providers that don't support chapters should just ingore hchapter
|
|
//Providers that do support support chapters should have DB_E_BADCHAPTER
|
|
hr = m_pIRowset->GetNextRows(INVALID(HCHAPTER), 0, 1, &cRowsObtained, &rghRows);
|
|
TEST2C_(hr, S_OK, DB_E_BADCHAPTER);
|
|
|
|
if(hr == S_OK)
|
|
{
|
|
//Should have retreived the first row
|
|
TESTC(cRowsObtained == 1 && rghRows != NULL);
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
TESTC(VerifyReleaseRows(cRowsObtained, rghRows));
|
|
}
|
|
else
|
|
{
|
|
//Failed, so should not have moved the NextFetchPosition
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
TESTC_(GetNextRows(0, 1, &hRow),S_OK);
|
|
TESTC(VerifyRowHandles(hRow, FIRST_ROW));
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc GetNextRows: DB_INVALID_CHAPTER
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Chapters::Variation_2()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Providers ingore hChapter
|
|
TESTC_(m_pIRowset->GetNextRows(DB_INVALID_HCHAPTER, 0, 1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC(cRowsObtained == 1 && rghRows != NULL);
|
|
TESTC(VerifyReleaseRows(cRowsObtained, rghRows));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc ReleaseChapter: Active Row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Chapters::Variation_3()
|
|
{
|
|
TBEGIN
|
|
HROW hRow = NULL;
|
|
ULONG ulRefCount = 0;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Get the Third row of the rowset
|
|
TESTC_(GetNextRows(2, 1, &hRow),S_OK);
|
|
TESTC(VerifyRowHandles(hRow, THIRD_ROW));
|
|
|
|
//TODO V2
|
|
//Release the chapter
|
|
// TESTC_(pIRowset()->ReleaseChapter(INVALID(HCHAPTER)),E_INVALIDARG);
|
|
|
|
//addRef the row handle
|
|
TESTC_(pIRowset()->AddRefRows(1, &hRow, &ulRefCount, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 2));
|
|
TESTC_(ReleaseRows(hRow),S_OK);
|
|
TESTC_(ReleaseRows(hRow),S_OK);
|
|
|
|
//Verify FetchPosition: is still intact
|
|
TESTC(VerifyGetNextRows(0, 1, FOURTH_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc ReleaseChapter: NULL
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Chapters::Variation_4()
|
|
{
|
|
TBEGIN
|
|
|
|
//TODO V2
|
|
//ReleaseChapter - NULL
|
|
// TESTC_(pIRowset()->ReleaseChapter(NULL),E_INVALIDARG);
|
|
|
|
//CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc RestartPosition: Invalid hChapter
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Chapters::Variation_5()
|
|
{
|
|
TBEGIN
|
|
HROW rghRows[2];
|
|
HRESULT hr = E_FAIL;
|
|
|
|
//Restart The Position
|
|
TESTC(VerifyRestartPosition(NULL));
|
|
|
|
//retieve one row forward
|
|
TESTC_(GetNextRows(0, 1, &rghRows[0]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
TESTC(VerifyReleaseRows(1, &rghRows[0], 0));
|
|
|
|
//Pass an invalid hChapter
|
|
//Providers that don't support chapters should just ingore hchapter
|
|
//Providers that do support support chapters should have DB_E_BADCHAPTER
|
|
hr = m_pIRowset->RestartPosition(INVALID(HCHAPTER));
|
|
TEST3C_(hr, S_OK, DB_S_COMMANDREEXECUTED, DB_E_BADCHAPTER);
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
//Should have restarted and the next row is the First Row
|
|
TESTC_(GetNextRows(0, 1, &rghRows[1]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[1], FIRST_ROW));
|
|
}
|
|
else
|
|
{
|
|
//Should NOT have restarted and the next row is the SecondRow
|
|
TESTC_(GetNextRows(0, 1, &rghRows[1]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[1], SECOND_ROW));
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(2, rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc RestartPosition: NULL
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Chapters::Variation_6()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition(NULL));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Chapters::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_PendingChange)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_PendingChange - Row handles with pending changes
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_PendingChange::Init()
|
|
{
|
|
return TCIRowset::Init();
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc methods called with rows having pending changes will return DB_E_BADROWHANDLE
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_PendingChange::Variation_1()
|
|
{
|
|
TBEGIN
|
|
HROW rghRows[2] = { NULL, NULL};
|
|
ULONG rgRefCount[2];
|
|
DBROWSTATUS rgRowStatus[2];
|
|
|
|
CRowsetUpdate RowsetA;
|
|
|
|
//IID_IRowsetUpdate implies IRowsetChange
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER, IID_IRowsetUpdate, NULL,
|
|
DBACCESSOR_ROWDATA, DBPART_ALL, UPDATEABLE_COLS_BOUND)==S_OK);
|
|
|
|
//get the second row
|
|
TESTC_(RowsetA.GetNextRows(1, 1, &rghRows[0]),S_OK);
|
|
|
|
//get the data
|
|
TESTC(RowsetA.VerifyRowHandles(rghRows[0], SECOND_ROW));
|
|
|
|
//change data
|
|
TESTC_(RowsetA.GetData(rghRows[0], RowsetA.m_hAccessor, RowsetA.m_pData),S_OK);
|
|
TESTC_(RowsetA.SetData(rghRows[0], RowsetA.m_hAccessor, RowsetA.m_pData),S_OK);
|
|
TESTC(RowsetA.VerifyRowHandles(rghRows[0], SECOND_ROW));
|
|
|
|
//addref, release, and GetData on the row hanle that has pending changes
|
|
TESTC_(RowsetA.pIRowset()->AddRefRows(2, rghRows, rgRefCount, rgRowStatus), DB_S_ERRORSOCCURRED);
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[0], 2));
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[1], 0));
|
|
TESTC(rgRowStatus[0] == DBROWSTATUS_S_OK && rgRowStatus[1] == DBROWSTATUS_E_INVALID);
|
|
|
|
TESTC_(RowsetA.pIRowset()->ReleaseRows(2, rghRows, NULL, rgRefCount, rgRowStatus), DB_S_ERRORSOCCURRED);
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[0], 1));
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[1], 0));
|
|
TESTC(rgRowStatus[0] == DBROWSTATUS_S_PENDINGCHANGES && rgRowStatus[1] == DBROWSTATUS_E_INVALID);
|
|
|
|
//GetData
|
|
TESTC_(RowsetA.GetData(rghRows[0], RowsetA.m_hAccessor, RowsetA.m_pData),S_OK);
|
|
|
|
CLEANUP:
|
|
RowsetA.ReleaseRows(rghRows[0]);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_PendingChange::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_CanHoldRows)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_CanHoldRows - Can Hold Rows in the rowset
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_CanHoldRows::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
|
|
//Create rowset
|
|
if(CreateRowset(SELECT_VALIDATIONORDER)==S_OK)
|
|
{
|
|
if(GetProperty(DBPROP_CANHOLDROWS, DBPROPSET_ROWSET))
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Reteive two discontiguous row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_CanHoldRows::Variation_1()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW rghRows[2];
|
|
|
|
//retieve one row forward
|
|
TESTC_(GetNextRows(0, 1, &cRowsObtained, &rghRows[0]),S_OK);
|
|
TESTC(cRowsObtained == 1);
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
|
|
if(m_ulMaxOpenRows == 1)
|
|
{
|
|
TESTC_(GetNextRows(1, 1, &cRowsObtained, &rghRows[1]), DB_S_ROWLIMITEXCEEDED);
|
|
TESTC(cRowsObtained == 0);
|
|
}
|
|
else
|
|
{
|
|
//skip one row and retrieve one row forward
|
|
TESTC_(GetNextRows(1, 1, &rghRows[1]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[1], THIRD_ROW));
|
|
}
|
|
|
|
//retrieve the data on the first row and to make sure we can get data on a
|
|
//previously retrieved row handle
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(2, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc release a middle row; release the first and the last row
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_CanHoldRows::Variation_2()
|
|
{
|
|
HROW rghRows[3];
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retieve one row forward
|
|
TESTC_(GetNextRows(0, 1, &rghRows[0]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
if(m_ulMaxOpenRows != 0)
|
|
TESTC_(ReleaseRows(rghRows[0]),S_OK);
|
|
|
|
//retrieve the second row
|
|
TESTC_(GetNextRows(0, 1, &rghRows[1]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[1], SECOND_ROW));
|
|
if(m_ulMaxOpenRows != 0)
|
|
TESTC_(ReleaseRows(rghRows[1]),S_OK);
|
|
|
|
//retrieve the third row
|
|
TESTC_(GetNextRows(0, 1, &rghRows[2]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[2], THIRD_ROW));
|
|
if(m_ulMaxOpenRows != 0)
|
|
TESTC_(ReleaseRows(rghRows[2]),S_OK);
|
|
|
|
//try to relese the second row
|
|
if(m_ulMaxOpenRows == 0)
|
|
{
|
|
TESTC_(ReleaseRows(rghRows[1]),S_OK);
|
|
TESTC_(ReleaseRows(rghRows[0]),S_OK);
|
|
TESTC_(ReleaseRows(rghRows[2]),S_OK);
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(3, rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Release the last row, retrieve one more row, ERROR returneed
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_CanHoldRows::Variation_3()
|
|
{
|
|
HROW rghRows[FOUR_ROWS];
|
|
TESTC_PROVIDER(m_ulMaxOpenRows == 0 || m_ulMaxOpenRows >= FOUR_ROWS);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retrieve three rows
|
|
TESTC_(GetNextRows(0, 3, rghRows),S_OK);
|
|
TESTC(VerifyRowHandles(3, rghRows, FIRST_ROW));
|
|
|
|
//release the last row handle
|
|
TESTC_(ReleaseRows(rghRows[2]),S_OK);
|
|
|
|
//retrieve one more row handle
|
|
TESTC_(GetNextRows(1, 1, &rghRows[3]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[3], FIFTH_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(FOUR_ROWS, rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Addref Rows and release the first and the last rows
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_CanHoldRows::Variation_4()
|
|
{
|
|
HROW rghRows[FOUR_ROWS];
|
|
TESTC_PROVIDER(m_ulMaxOpenRows == 0 || m_ulMaxOpenRows >= FOUR_ROWS);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retrieve three rows
|
|
TESTC_(GetNextRows(0, 3, rghRows),S_OK);
|
|
TESTC(VerifyRowHandles(3, rghRows, FIRST_ROW));
|
|
|
|
//addRef to all of the three row handles
|
|
TESTC_(m_pIRowset->AddRefRows(3, rghRows, NULL, NULL),S_OK);
|
|
|
|
//release the first and third row handles
|
|
TESTC_(ReleaseRows(rghRows[0]),S_OK);
|
|
TESTC_(ReleaseRows(rghRows[2]),S_OK);
|
|
|
|
//release the second row for the first time
|
|
TESTC(VerifyReleaseRows(1, &rghRows[1], 1));
|
|
|
|
//the three row handles are release together
|
|
TESTC(VerifyReleaseRows(3, rghRows, 0));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(FOUR_ROWS, rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//--------------------------------------------------------------------
|
|
// @mfunc Release Rowset with active Row handles - verify released
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_CanHoldRows::Variation_5()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
ULONG i=0;
|
|
|
|
TCIRowset RowsetA;
|
|
|
|
//open rowset with desired properties
|
|
RowsetA.SetProperty(DBPROP_CANHOLDROWS);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
TESTC_PROVIDER(RowsetA.m_ulMaxOpenRows == 0 || RowsetA.m_ulMaxOpenRows >= RowsetA.m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//We want to verify that the row handles do not take any references on the Rowset
|
|
//According to the spec, Releasing the Rowset even with unreleased rows should
|
|
//Still release the rowset and all assoicated rows and accessors...
|
|
for(i=0; i<RowsetA.m_ulTableRows; i++)
|
|
{
|
|
//Retrive this row
|
|
TESTC_(RowsetA.GetNextRows(0, 1, &hRow),S_OK);
|
|
//Verify this row
|
|
TESTC(RowsetA.VerifyRowHandles(hRow, FIRST_ROW+i));
|
|
}
|
|
|
|
|
|
CLEANUP:
|
|
//Don't release row handles
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc RestartPosition - with outstanding row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_CanHoldRows::Variation_6()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
HROW rghRows2[FIVE_ROWS];
|
|
HRESULT hr = S_OK;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Retrieve rows
|
|
TEST2C_(hr = GetNextRows(0, TWO_ROWS, &cRowsObtained, &rghRows), S_OK, DB_S_ROWLIMITEXCEEDED);
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, FIRST_ROW));
|
|
|
|
//RestartPosition, (with outstanding row handles)
|
|
if(!VerifyRestartPosition(NULL, FALSE/*fRowsReleased*/))
|
|
{
|
|
//Some providers require releasing all rows, before restarting...
|
|
//We can still continue testing, but not the outstanding row handle part...
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
cRowsObtained = 0;
|
|
}
|
|
|
|
//The rest of the verification requires verification of outstanding row handles...
|
|
if(hr == DB_S_ROWLIMITEXCEEDED)
|
|
TESTC(m_ulMaxOpenRows == ONE_ROW);
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=FOUR_ROWS);
|
|
|
|
//Obtain the second and third rows...
|
|
//NOTE: If the above RestartPosition failed (ie: cRowsObtained==0) this call
|
|
//will returned the fourth and fifth rows instead, since the cursor is not at the head...
|
|
TESTC_(GetNextRows(1, TWO_ROWS, &rghRows2[SECOND_ROW]),S_OK);
|
|
TESTC(VerifyRowHandles(TWO_ROWS, &rghRows2[SECOND_ROW], cRowsObtained ? SECOND_ROW : FOURTH_ROW));
|
|
|
|
//Make sure the previously (outstanding) returned row handles are still valid...
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
ReleaseRows(TWO_ROWS, rghRows2);
|
|
SAFE_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_CanHoldRows::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_HoldRows_Discon)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_HoldRows_Discon - Hold rows and discontiguous
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_HoldRows_Discon::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
|
|
//Create rowset
|
|
if(CreateRowset(SELECT_VALIDATIONORDER)==S_OK)
|
|
if(GetProperty(DBPROP_CANHOLDROWS, DBPROPSET_ROWSET))
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Skip one row forward and retrieve one row forward. Repeat
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_HoldRows_Discon::Variation_1()
|
|
{
|
|
HROW rghRows[2];
|
|
ULONG rgRefCounts[2];
|
|
TESTC_PROVIDER(m_ulMaxOpenRows == 0 || m_ulMaxOpenRows >= TWO_ROWS);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//get one row handle
|
|
TESTC_(GetNextRows(1, 1, &rghRows[0]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], SECOND_ROW));
|
|
|
|
//get another one
|
|
TESTC_(GetNextRows(1, 1, &rghRows[1]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[1], FOURTH_ROW));
|
|
|
|
//AddRef the first row handle
|
|
TESTC_(m_pIRowset->AddRefRows(1, &rghRows[0], &rgRefCounts[0], NULL), S_OK);
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[0], 2));
|
|
|
|
//AddRef the second row handle
|
|
TESTC_(m_pIRowset->AddRefRows(1, &rghRows[1], &rgRefCounts[1], NULL), S_OK);
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[1], 2));
|
|
|
|
//RestartPosition, (FALSE - not all rows are released)
|
|
VerifyRestartPosition(NULL, FALSE);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(2, rghRows);
|
|
ReleaseRows(2, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Retrieve the two rows, call RestartPosition
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_HoldRows_Discon::Variation_2()
|
|
{
|
|
HROW rghRows[2];
|
|
TESTC_PROVIDER(m_ulMaxOpenRows == 0 || m_ulMaxOpenRows >= TWO_ROWS);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//get one row handle
|
|
TESTC_(GetNextRows(2, 1, &rghRows[0]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], THIRD_ROW));
|
|
|
|
//get the last one
|
|
TESTC_(GetNextRows(m_ulTableRows-(2+1+1), 1, &rghRows[1]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[1], m_ulTableRows));
|
|
|
|
//RestartPosition, (FALSE - not all rows are released)
|
|
VerifyRestartPosition(NULL, FALSE);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(2, rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_HoldRows_Discon::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_Discontiguous)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_Discontiguous - The rowset can has discontiguous rows
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Discontiguous::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Create rowset
|
|
if(CreateRowset(SELECT_VALIDATIONORDER)==S_OK)
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Retrieve one row, release it; retrieve another row
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Discontiguous::Variation_1()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HROW rghRows[2] = {NULL, NULL};
|
|
ULONG rgRefCounts[2] = {0,0};
|
|
|
|
//retrieve one row
|
|
TESTC_(GetNextRows(0, 1, &rghRows[0]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
|
|
//NextFetchPosition should not be changed
|
|
TESTC_(GetNextRows(0, 0, &rghRows[1]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
|
|
//addRef the row
|
|
TESTC_(m_pIRowset->AddRefRows(1, &rghRows[0], &rgRefCounts[0], NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[0], 2));
|
|
|
|
//release the row
|
|
TESTC_(ReleaseRows(rghRows[0]),S_OK);
|
|
|
|
//RestartPosition. The Provider May or may not have the ability to HoldRows,
|
|
//even though we didn't specfically ask for CANHOLDROWS.
|
|
hr = RestartPosition();
|
|
TEST3C_(hr, S_OK, DB_S_COMMANDREEXECUTED, DB_E_ROWSNOTRELEASED);
|
|
|
|
//If they have the ability to hold rows
|
|
if(hr == S_OK || hr==DB_S_COMMANDREEXECUTED)
|
|
{
|
|
//retrieve another row
|
|
TESTC_(GetNextRows(1, 1, &rghRows[1]),S_OK);
|
|
//Since RestartPosition succeeded, we should be at the 2nd row
|
|
TESTC(VerifyRowHandles(rghRows[1], 2));
|
|
}
|
|
//Otherwise
|
|
else
|
|
{
|
|
//release the first row
|
|
TESTC_(ReleaseRows(rghRows[0]),S_OK);
|
|
|
|
//retrieve another row
|
|
TESTC_(GetNextRows(1, 1, &rghRows[1]),S_OK);
|
|
//Since RestartPosition didn't succeed, we should be at the 3rd row
|
|
TESTC(VerifyRowHandles(rghRows[1], 3));
|
|
}
|
|
|
|
//release the second row
|
|
TESTC_(ReleaseRows(rghRows[1]),S_OK);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(2, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Retrieve one row, addRef it and release it; retrieve another row
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Discontiguous::Variation_2()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HROW rghRows[2];
|
|
ULONG rgRefCounts[2];
|
|
DBROWSTATUS rgRowStatus[2];
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retrieve one row
|
|
TESTC_(GetNextRows(0, 1, &rghRows[0]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
|
|
//GetNextRows. The Provider May or may not have the ability to HoldRows,
|
|
//even though we didn't specfically ask for CANHOLDROWS.
|
|
hr = GetNextRows(1, 1, &rghRows[1]);
|
|
TEST2C_(hr, S_OK, DB_E_ROWSNOTRELEASED);
|
|
|
|
//If they have the ability to hold rows
|
|
if(hr == S_OK)
|
|
{
|
|
//release the row and set to invalid
|
|
TESTC(VerifyRowHandles(rghRows[1], THIRD_ROW));
|
|
TESTC_(ReleaseRows(rghRows[1]),S_OK);
|
|
rghRows[1] = INVALID(HROW);
|
|
}
|
|
|
|
//release the rows
|
|
TESTC_(pIRowset()->ReleaseRows(2, rghRows, NULL, rgRefCounts, rgRowStatus), DB_S_ERRORSOCCURRED);
|
|
TESTC(VerifyRefCounts(1, &rgRefCounts[0], 0));
|
|
TESTC(rgRowStatus[0] == DBROWSTATUS_S_OK);
|
|
TESTC(rgRefCounts[1] == 0);
|
|
TESTC(rgRowStatus[1] == DBROWSTATUS_E_INVALID);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(2, rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Retrieve one row handle, addRef it and release it; Call RestartPositon
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Discontiguous::Variation_3()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retrieve one row
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW, FORWARD));
|
|
|
|
//retrieve another row
|
|
TESTC(VerifyGetNextRows(1, 1, THIRD_ROW, FORWARD));
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Retrieve three rwo handles together. Release the middle row, Succeed
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_Discontiguous::Variation_4()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HROW rghRows[3];
|
|
ULONG rgRefCounts[3];
|
|
ULONG rgRowStatus[3];
|
|
TESTC_PROVIDER(m_ulMaxOpenRows == 0 || m_ulMaxOpenRows >= THREE_ROWS);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retrieve three row handles
|
|
TESTC_(GetNextRows(0, 3, rghRows),S_OK);
|
|
TESTC(VerifyRowHandles(3, rghRows, FIRST_ROW));
|
|
|
|
//release the middle row handle
|
|
TESTC_(pIRowset()->ReleaseRows(1, &rghRows[1], NULL, rgRefCounts, NULL),S_OK);
|
|
|
|
//release the three row handles
|
|
hr = pIRowset()->ReleaseRows(3, rghRows, NULL, NULL, rgRowStatus);
|
|
|
|
//Some providers might be able to hold onto rows...
|
|
if(rgRefCounts[0] != 0)
|
|
{
|
|
TESTC(hr == S_OK);
|
|
TESTC(rgRowStatus[0] == DBROWSTATUS_S_OK);
|
|
TESTC(rgRowStatus[1] == DBROWSTATUS_S_OK);
|
|
TESTC(rgRowStatus[2] == DBROWSTATUS_S_OK);
|
|
}
|
|
|
|
if(rgRefCounts[0] == 0)
|
|
{
|
|
TESTC(hr == DB_S_ERRORSOCCURRED);
|
|
TESTC(rgRowStatus[0] == DBROWSTATUS_S_OK);
|
|
TESTC(rgRowStatus[1] == DBROWSTATUS_E_INVALID);
|
|
TESTC(rgRowStatus[2] == DBROWSTATUS_S_OK);
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(3, rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_Discontiguous::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_MaxOpenRows)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_MaxOpenRows - test max open rows
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_MaxOpenRows::Init()
|
|
{
|
|
return TCIRowset::Init();
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc MaxOpenRows is unlimted. Retrieve rows in a sequential manner.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_MaxOpenRows::Variation_1()
|
|
{
|
|
TBEGIN
|
|
HROW* rghRows = NULL;
|
|
DBCOUNTITEM i,cRows = 0;
|
|
ULONG_PTR ulMaxOpenRows = 0;
|
|
|
|
HROW hRow = NULL;
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
|
|
//Set requireed Properties
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
|
|
//Create rowset
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
TESTC(GetProperty(DBPROP_CANHOLDROWS, DBPROPSET_ROWSET));
|
|
|
|
//GetProperty
|
|
TESTC_PROVIDER(GetProperty(DBPROP_MAXOPENROWS, DBPROPSET_ROWSET, &ulMaxOpenRows));
|
|
rghRows = PROVIDER_ALLOC_(m_ulTableRows, HROW);
|
|
|
|
//Setup total expected open rows
|
|
if(ulMaxOpenRows == 0 || ulMaxOpenRows > m_ulTableRows)
|
|
ulMaxOpenRows = m_ulTableRows;
|
|
|
|
//get all the rows in the rowset, one at a time
|
|
for(i=0; i<ulMaxOpenRows; i++)
|
|
{
|
|
TESTC_(GetNextRows(&rghRows[i]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[i], FIRST_ROW+i));
|
|
cRows++;
|
|
}
|
|
|
|
//test pass is all the row handles are retrieved
|
|
TESTC(cRows == ulMaxOpenRows);
|
|
|
|
//Try to obtain one more
|
|
TESTC_(GetNextRows(0, 1, &cRowsObtained, &hRow), cRows < m_ulTableRows ? DB_S_ROWLIMITEXCEEDED : DB_S_ENDOFROWSET);
|
|
TESTC(cRowsObtained == 0);
|
|
|
|
//release all the row handles
|
|
TESTC_(ReleaseRows(cRows, rghRows),S_OK);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(m_ulTableRows, rghRows);
|
|
DropRowset();
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc MaxOpenRows is unlimted. Retrieve rows in a group.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_MaxOpenRows::Variation_2()
|
|
{
|
|
TBEGIN
|
|
DBCOUNTITEM i,cRows = 0;
|
|
ULONG_PTR ulMaxOpenRows = 0;
|
|
|
|
//Set requireed Properties
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//GetProperty
|
|
//NOTE: If the property is not supported, then there is no limit (within reason)
|
|
GetProperty(DBPROP_MAXOPENROWS, DBPROPSET_ROWSET, &ulMaxOpenRows);
|
|
cRows = ulMaxOpenRows ? min(ulMaxOpenRows, m_ulTableRows) : m_ulTableRows;
|
|
|
|
//NOTE: We want these calls on "freshly" created rowsets, so we create the
|
|
//rowset within the loop...
|
|
DropRowset();
|
|
|
|
//Spin through all types of request for row handles (in groups)
|
|
for(i=0; i<cRows+2; i++)
|
|
{
|
|
//Create rowset
|
|
TESTC_(CreateRowset(SELECT_VALIDATIONORDER),S_OK);
|
|
|
|
//Obtain rows.
|
|
//ie: {[0, 0]...[0, cTableRows-2]...[0, cTableRows]...[0, cTableRows+2]}
|
|
TESTC(VerifyGetNextRows(0, i, FIRST_ROW, FORWARD, min(i,cRows), DBMEMOWNER_PROVIDEROWNED));
|
|
DropRowset();
|
|
}
|
|
|
|
CLEANUP:
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Set the maxopen rows to be 5.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_MaxOpenRows::Variation_3()
|
|
{
|
|
TBEGIN
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW rghRows[SIX_ROWS];
|
|
DBCOUNTITEM i,cRows = 0;
|
|
HRESULT hr = S_OK;
|
|
|
|
//open a rowset with DBPROP_CANHOLDROWS and set DBPROP_MAXOPENROWS=5
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
SetProperty(DBPROP_MAXOPENROWS, DBPROPSET_ROWSET, (void*)5, DBTYPE_I4);
|
|
|
|
//Create rowset
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
TESTC(GetProperty(DBPROP_CANHOLDROWS, DBPROPSET_ROWSET));
|
|
|
|
//retrieve max # of row, one at a time
|
|
for(i=0; i<FIVE_ROWS; i++)
|
|
{
|
|
TESTC_(GetNextRows(&rghRows[i]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[i], FIRST_ROW+i));
|
|
cRows++;
|
|
}
|
|
|
|
//AddRef the third row handle
|
|
TESTC_(m_pIRowset->AddRefRows(1, &rghRows[2], NULL, NULL),S_OK);
|
|
TESTC_(m_pIRowset->ReleaseRows(1, &rghRows[2], NULL, NULL, NULL),S_OK);
|
|
|
|
//retrieve another row handle,
|
|
//2.0 Spec now indicates that "setting" MAXOPENROWS is just a "suggestion"
|
|
//A provider can return more rows than specified by the consumer
|
|
rghRows[5] = INVALID(HROW);
|
|
hr = GetNextRows(0, 1, &cRowsObtained, &rghRows[5]);
|
|
TEST2C_(hr, S_OK, DB_S_ROWLIMITEXCEEDED);
|
|
if(hr==S_OK)
|
|
{
|
|
//S_OK
|
|
TESTC(cRowsObtained != 0 && rghRows[5] != DB_NULL_HROW);
|
|
TESTC(VerifyRowHandles(rghRows[5], FIRST_ROW+5));
|
|
}
|
|
else
|
|
{
|
|
//DB_S_ROWLIMITEXCEEDED
|
|
TESTC(cRowsObtained == 0 /*&& rghRows[5] == DB_NULL_HROW*/); //TODO Spec issue:
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(6, rghRows);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc MaxOpenRows is not unlimited. Test the limit
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_MaxOpenRows::Variation_4()
|
|
{
|
|
TBEGIN
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
ULONG_PTR ulMaxOpenRows = 0;
|
|
|
|
//open a rowset with DBPROP_CANHOLDROWS
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
|
|
//Create rowset
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
TESTC_PROVIDER(GetProperty(DBPROP_MAXOPENROWS, DBPROPSET_ROWSET, &ulMaxOpenRows));
|
|
TESTC(GetProperty(DBPROP_CANHOLDROWS, DBPROPSET_ROWSET));
|
|
|
|
//if MaxOpenRows is unlimited, pass the test variation
|
|
TESTC_PROVIDER(ulMaxOpenRows != 0);
|
|
|
|
//If there are less rows in the rowset than MaxOpenRows, we have no choice but
|
|
//to skip this variation, since we cannot hit the maximum!
|
|
TESTC_PROVIDER(m_ulTableRows > ulMaxOpenRows);
|
|
|
|
//retrieve 1 less than the max number of rows
|
|
TESTC_(GetNextRows(0, ulMaxOpenRows-1, &cRowsObtained, &rghRows),S_OK);
|
|
PROVIDER_FREE(rghRows);
|
|
|
|
//Try to retrieve three more row handles
|
|
//MAXOPENROWS returned by the provider should be obeyed.
|
|
//Since the consumer didn't set it, its exactly what the provider indicates...
|
|
TESTC_(GetNextRows(0, 3, &cRowsObtained, &rghRows), DB_S_ROWLIMITEXCEEDED);
|
|
TESTC(cRowsObtained == 1 && rghRows != NULL);
|
|
TESTC(VerifyRowHandles(rghRows[0], ulMaxOpenRows));
|
|
TESTC_(ReleaseRows(cRowsObtained, rghRows), S_OK);
|
|
PROVIDER_FREE(rghRows);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc DBPROP_MAXROWS - Get Value
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_MaxOpenRows::Variation_5()
|
|
{
|
|
TBEGIN
|
|
ULONG_PTR ulMaxRows = 0;
|
|
DBCOUNTITEM cExpectedRows = 0;
|
|
|
|
//open a rowset with DBPROP_CANHOLDROWS
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
|
|
//Create rowset
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
TESTC_PROVIDER(GetProperty(DBPROP_MAXROWS, DBPROPSET_ROWSET, &ulMaxRows));
|
|
TESTC(GetProperty(DBPROP_CANHOLDROWS, DBPROPSET_ROWSET));
|
|
|
|
//Figure out how many rows were are expecting in the rowset
|
|
cExpectedRows = ulMaxRows > 0 ? ulMaxRows : m_ulTableRows;
|
|
|
|
//Verify we have the correct number of rows in the rowset
|
|
TESTC(cExpectedRows == GetTotalRows());
|
|
|
|
CLEANUP:
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc DBPROP_MAXROWS - Set Value
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_MaxOpenRows::Variation_6()
|
|
{
|
|
TBEGIN
|
|
ULONG ulMaxRows = 5;
|
|
ULONG cExpectedRows = 0;
|
|
|
|
//open a rowset with DBPROP_CANHOLDROWS
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
TESTC_PROVIDER(SetSettableProperty(DBPROP_MAXROWS, DBPROPSET_ROWSET, (void*)(LONG_PTR)ulMaxRows, DBTYPE_I4));
|
|
|
|
//Create rowset
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//Verify we have the correct number of rows in the rowset
|
|
TESTC(ulMaxRows == GetTotalRows());
|
|
|
|
CLEANUP:
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_MaxOpenRows::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_ScrollBackwards_ForwardOnly)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_ScrollBackwards_ForwardOnly - ScrollBackwards_ForwardOnly
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_ForwardOnly::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip forward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_ForwardOnly::Variation_1()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//cRow==0, cRowToSkip ==m_ulTableRows+2. No-Op
|
|
TESTC_(GetNextRows(m_ulTableRows, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the begining of the rowset
|
|
//skip backward one row and fetch one row forward.
|
|
TESTC(VerifyGetNextRows(-1, 1, m_ulTableRows));
|
|
|
|
//make sure the second to last row is fetched
|
|
TESTC(VerifyGetNextRows(-2, 1, m_ulTableRows-1));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip backward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_ForwardOnly::Variation_2()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
HRESULT hr = S_OK;
|
|
DBROWCOUNT i = 0;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Loop through all large (negative) offset values...
|
|
//Some providers like to hard code to work arround LONG_MAX, LONG_MIN
|
|
//Work arround this!
|
|
for(i=NEGATIVE(m_ulTableRows+10); i>LONG_MIN && (i+i<i); i+=i)
|
|
{
|
|
hr = GetNextRows(i, 1, &hRow);
|
|
//2.0 spec indicates DB_S_ENDOFROWSET for all outofbounds cases
|
|
//We no longer have DB_E_BADSTARTPOSITION for 2.x providers
|
|
TEST3C_(hr, DB_S_ENDOFROWSET, E_OUTOFMEMORY, DB_E_BADSTARTPOSITION);
|
|
}
|
|
|
|
//Loop through all large offset values...
|
|
//Some providers like to hard code to work arround LONG_MAX, LONG_MIN
|
|
//Work arround this!
|
|
for(i=m_ulTableRows + 10; i<MAXDBROWCOUNT && (i+i>i); i+=i)
|
|
{
|
|
hr = GetNextRows(i, 1, &hRow);
|
|
//2.0 spec indicates DB_S_ENDOFROWSET for all outofbounds cases
|
|
//We no longer have DB_E_BADSTARTPOSITION for 2.x providers
|
|
TEST3C_(hr, DB_S_ENDOFROWSET, E_OUTOFMEMORY, DB_E_BADSTARTPOSITION);
|
|
}
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip =1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_ForwardOnly::Variation_3()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//NextFetchPosition should be unchanged
|
|
//Also the 2.0 spec indicates lRowOffset is ignored
|
|
TESTC_(GetNextRows(-1000, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the 1st row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip = -1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_ForwardOnly::Variation_4()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRow==0, cRowToSkip ==1 No-Op
|
|
TESTC_(GetNextRows(-1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the first row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRows is negative.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_ForwardOnly::Variation_5()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows-2), m_ulTableRows-2, &cRowsObtained, &rghRows), S_OK);
|
|
TESTC(cRowsObtained == (m_ulTableRows-2) && rghRows != NULL);
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, THIRD_ROW, FORWARD));
|
|
|
|
CLEANUP:
|
|
CHECK(ReleaseRows(cRowsObtained, rghRows),S_OK);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row backward and fetch 5 row forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_ForwardOnly::Variation_6()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row backward and fetch m_ulTableRows row forward.
|
|
//Only one row (last row) should be retrieved, no reason for reaching any limit...
|
|
TESTC(VerifyGetNextRows(-1, LONG_MAX, m_ulTableRows, FORWARD, 1, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc retrieve 2 rows. Skip 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_ForwardOnly::Variation_7()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 3 row backwards
|
|
TESTC(VerifyGetNextRows(-3, 1, m_ulTableRows-2, FORWARD));
|
|
|
|
//skip one row and fetch one row forward
|
|
TESTC(VerifyGetNextRows(1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip backward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_ForwardOnly::Variation_8()
|
|
{
|
|
HROW hRow = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip forward more than the number of rows in the rowset
|
|
hr = GetNextRows(LONG_MAX, 1, &hRow);
|
|
TEST3C_(hr, DB_S_ENDOFROWSET, E_OUTOFMEMORY, DB_E_BADSTARTPOSITION);
|
|
hr = GetNextRows(LONG_MAX-1, 1, &hRow);
|
|
TEST3C_(hr, DB_S_ENDOFROWSET, E_OUTOFMEMORY, DB_E_BADSTARTPOSITION);
|
|
|
|
//skip backward more than the number of rows in the rowset
|
|
hr = GetNextRows(LONG_MIN, 1, &hRow);
|
|
TEST3C_(hr, DB_S_ENDOFROWSET, E_OUTOFMEMORY, DB_E_BADSTARTPOSITION);
|
|
hr = GetNextRows(LONG_MIN+1, 1, &hRow);
|
|
TEST3C_(hr, DB_S_ENDOFROWSET, E_OUTOFMEMORY, DB_E_BADSTARTPOSITION);
|
|
|
|
//skip backward 5 more row
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+1), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_ForwardOnly::Variation_9()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//2.0 spec indicates DB_S_ENDOFROWSET for all outofbounds cases
|
|
//We no longer have DB_E_BADSTARTPOSITION for 2.x providers
|
|
TESTC_(GetNextRows(m_ulTableRows, 1, &cRowsObtained, &rghRows), DB_S_ENDOFROWSET);
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip to last row of the rowset
|
|
TESTC(VerifyGetNextRows(m_ulTableRows-1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(10)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward and to the last row. skip backward to the first row
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_ForwardOnly::Variation_10()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row forward and fetch (m_ulTableRows-3) rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows-3, SECOND_ROW, FORWARD));
|
|
|
|
//skip one row forward and fetch more rows than in the rowset
|
|
TESTC(VerifyGetNextRows(1, LONG_MAX, m_ulTableRows, FORWARD, 1, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//Since the RowPosition is now unknown, I really can't verify it is correct.
|
|
//But I can restart the position and skip to the last...
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(m_ulTableRows-1, 1, m_ulTableRows));
|
|
|
|
//skip totalRowNum row backward and fetch one row forward
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows), 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_ForwardOnly::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_ScrollBackwards_Static)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_ScrollBackwards_Static - ScrollBackwards_Static
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_Static::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip forward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Static::Variation_1()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//cRow==0, cRowToSkip ==m_ulTableRows+2. No-Op
|
|
TESTC_(GetNextRows(m_ulTableRows, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the begining of the rowset
|
|
//skip backward one row and fetch one row forward.
|
|
TESTC(VerifyGetNextRows(-1, 1, m_ulTableRows));
|
|
|
|
//make sure the second to last row is fetched
|
|
TESTC(VerifyGetNextRows(-2, 1, m_ulTableRows-1));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip backward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Static::Variation_2()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRow==0, cRowToSkip ==-(m_ulTableRows+2)
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+2), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip =1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Static::Variation_3()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//NextFetchPosition should be unchanged
|
|
TESTC_(GetNextRows(1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the 1st row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip = -1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Static::Variation_4()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRow==0, cRowToSkip ==1 No-Op
|
|
TESTC_(GetNextRows(-1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the first row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRows is negative.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Static::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows-2), m_ulTableRows-2, THIRD_ROW, FORWARD, m_ulTableRows-2, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row backward and fetch 5 row forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Static::Variation_6()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row backward and fetch m_ulTableRows row forward. One row should be retrieved
|
|
TESTC(VerifyGetNextRows(-1, m_ulTableRows, m_ulTableRows, FORWARD, ONE_ROW, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc retrieve 2 rows. Skip 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Static::Variation_7()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 3 row backwards
|
|
TESTC(VerifyGetNextRows(-3, 1, m_ulTableRows-2, FORWARD));
|
|
|
|
//skip one row and fetch one row forward
|
|
TESTC(VerifyGetNextRows(1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip backward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Static::Variation_8()
|
|
{
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip backward more than the number of rows in the rowset
|
|
//2.0 spec indicates DB_S_ENDOFROWSET for all outofbounds cases
|
|
//We no longer have DB_E_BADSTARTPOSITION for 2.x providers
|
|
TESTC_(GetNextRows(m_ulTableRows+1, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//skip backward 5 more row
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+1), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Static::Variation_9()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//2.0 spec indicates DB_S_ENDOFROWSET for all outofbounds cases
|
|
//We no longer have DB_E_BADSTARTPOSITION for 2.x providers
|
|
TESTC_(GetNextRows(m_ulTableRows, 1, &cRowsObtained, &rghRows), DB_S_ENDOFROWSET);
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip to last row of the rowset
|
|
TESTC(VerifyGetNextRows(m_ulTableRows-1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(10)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward and to the last row. skip backward to the first row
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Static::Variation_10()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row forward and fetch (m_ulTableRows-3) rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows-3, SECOND_ROW, FORWARD));
|
|
|
|
//skip one row forward and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, 2, m_ulTableRows, FORWARD, ONE_ROW, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//skip totalRowNum row backward and fetch one row forward
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows), 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_Static::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_ScrollBackwards_Keyset)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_ScrollBackwards_Keyset - ScrollBackwards_Keyset
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_Keyset::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
SetProperty(DBPROP_OTHERUPDATEDELETE);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip forward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Keyset::Variation_1()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//cRow==0, cRowToSkip ==m_ulTableRows+2. No-Op
|
|
TESTC_(GetNextRows(m_ulTableRows, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the begining of the rowset
|
|
//skip backward one row and fetch one row forward.
|
|
TESTC(VerifyGetNextRows(-1, 1, m_ulTableRows));
|
|
|
|
//make sure the second to last row is fetched
|
|
TESTC(VerifyGetNextRows(-2, 1, m_ulTableRows-1));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip backward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Keyset::Variation_2()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRow==0, cRowToSkip ==-(m_ulTableRows+2)
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+2), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip =1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Keyset::Variation_3()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//NextFetchPosition should be unchanged
|
|
TESTC_(GetNextRows(1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the 1st row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip = -1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Keyset::Variation_4()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRow==0, cRowToSkip ==1 No-Op
|
|
TESTC_(GetNextRows(-1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the first row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRows is negative.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Keyset::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//GetNextRows
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows-2), m_ulTableRows-2, THIRD_ROW, FORWARD, m_ulTableRows-2, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row backward and fetch 5 row forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Keyset::Variation_6()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row backward and fetch m_ulTableRows row forward. One row should be retrieved
|
|
TESTC(VerifyGetNextRows(-1, m_ulTableRows, m_ulTableRows, FORWARD, ONE_ROW, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc retrieve 2 rows. Skip 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Keyset::Variation_7()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 3 row backwards
|
|
TESTC(VerifyGetNextRows(-3, 1, m_ulTableRows-2, FORWARD));
|
|
|
|
//skip one row and fetch one row forward
|
|
TESTC(VerifyGetNextRows(1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip backward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Keyset::Variation_8()
|
|
{
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip backward more than the number of rows in the rowset
|
|
TESTC_(GetNextRows(m_ulTableRows+1, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//skip backward 5 more row
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+1), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Keyset::Variation_9()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
TESTC_(GetNextRows(m_ulTableRows, 1, &cRowsObtained, &rghRows), DB_S_ENDOFROWSET);
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip to last row of the rowset
|
|
TESTC(VerifyGetNextRows(m_ulTableRows-1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(10)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward and to the last row. skip backward to the first row
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Keyset::Variation_10()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row forward and fetch (m_ulTableRows-3) rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows-3, SECOND_ROW, FORWARD));
|
|
|
|
//skip one row forward and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, 2, m_ulTableRows, FORWARD, ONE_ROW, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//skip totalRowNum row backward and fetch one row forward
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows), 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_Keyset::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_ScrollBackwards_Dynamic)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_ScrollBackwards_Dynamic - ScrollBackwards_Dynamic
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_Dynamic::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
SetProperty(DBPROP_OTHERINSERT);
|
|
|
|
//Create rowset
|
|
//Note: We don't set CANHOLDROWS, since this maybe conflicting with
|
|
//OtherInsert on some providers. We are mainly interested with Scrolling
|
|
//backwards on Dynamic cursor and less requirement on holding rows...
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip forward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Dynamic::Variation_1()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//cRow==0, cRowToSkip ==m_ulTableRows+2. No-Op
|
|
TESTC_(GetNextRows(m_ulTableRows, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the begining of the rowset
|
|
//skip backward one row and fetch one row forward.
|
|
TESTC(VerifyGetNextRows(-1, 1, m_ulTableRows));
|
|
|
|
//make sure the second to last row is fetched
|
|
TESTC(VerifyGetNextRows(-2, 1, m_ulTableRows-1));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip backward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Dynamic::Variation_2()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//lOffset is off the rowset, 0 rows should be returned...
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+2), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip =1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Dynamic::Variation_3()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRows == 0, NextFetchPosition should be unchanged
|
|
TESTC_(GetNextRows(1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the 1st row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip = -1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Dynamic::Variation_4()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRow==0, cRowToSkip ==1 No-Op
|
|
TESTC_(GetNextRows(-1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the first row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRows is negative.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Dynamic::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows-2), m_ulTableRows-2, THIRD_ROW, FORWARD, m_ulTableRows-2, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row backward and fetch 5 row forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Dynamic::Variation_6()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row backward and fetch m_ulTableRows row forward. One row should be retrieved
|
|
TESTC(VerifyGetNextRows(-1, m_ulTableRows, m_ulTableRows, FORWARD, ONE_ROW, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc retrieve 2 rows. Skip 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Dynamic::Variation_7()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 3 row backwards
|
|
TESTC(VerifyGetNextRows(-3, 1, m_ulTableRows-2, FORWARD));
|
|
|
|
//skip one row and fetch one row forward
|
|
TESTC(VerifyGetNextRows(1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip backward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Dynamic::Variation_8()
|
|
{
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip backward more than the number of rows in the rowset
|
|
TESTC_(GetNextRows(m_ulTableRows+1, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//skip backward 5 more rows
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+1), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Dynamic::Variation_9()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC_(GetNextRows(m_ulTableRows, 1, &cRowsObtained, &rghRows), DB_S_ENDOFROWSET);
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip to last row of the rowset
|
|
TESTC(VerifyGetNextRows(m_ulTableRows-1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(10)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward and to the last row. skip backward to the first row
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Dynamic::Variation_10()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row forward and fetch (m_ulTableRows-3) rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows-3, SECOND_ROW, FORWARD));
|
|
|
|
//skip one row forward and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, 2, m_ulTableRows, FORWARD, ONE_ROW, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//skip totalRowNum row backward and fetch one row forward
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows), 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_Dynamic::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_ScrollBackwards_Locate)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_ScrollBackwards_Locate - ScrollBackwards_Locate
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_Locate::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_IRowsetLocate, DBPROPSET_ROWSET);
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS, DBPROPSET_ROWSET);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip forward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Locate::Variation_1()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//cRow==0, cRowToSkip ==m_ulTableRows+2. No-Op
|
|
TESTC_(GetNextRows(m_ulTableRows, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the begining of the rowset
|
|
//skip backward one row and fetch one row forward.
|
|
TESTC(VerifyGetNextRows(-1, 1, m_ulTableRows));
|
|
|
|
//make sure the second to last row is fetched
|
|
TESTC(VerifyGetNextRows(-2, 1, m_ulTableRows-1));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip backward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Locate::Variation_2()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRow==0, cRowToSkip ==-(m_ulTableRows+2)
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+2), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip =1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Locate::Variation_3()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//NextFetchPosition should be unchanged
|
|
TESTC_(GetNextRows(1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the 1st row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip = -1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Locate::Variation_4()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRow==0, cRowToSkip ==1 No-Op
|
|
TESTC_(GetNextRows(-1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the first row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRows is negative.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Locate::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows-2), m_ulTableRows-2, THIRD_ROW, FORWARD, m_ulTableRows-2, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row backward and fetch 5 row forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Locate::Variation_6()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row backward and fetch m_ulTableRows row forward. One row should be retrieved
|
|
TESTC(VerifyGetNextRows(-1, m_ulTableRows, m_ulTableRows, FORWARD, ONE_ROW, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc retrieve 2 rows. Skip 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Locate::Variation_7()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 3 row backwards
|
|
TESTC(VerifyGetNextRows(-3, 1, m_ulTableRows-2, FORWARD));
|
|
|
|
//skip one row and fetch one row forward
|
|
TESTC(VerifyGetNextRows(1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip backward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Locate::Variation_8()
|
|
{
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip backward more than the number of rows in the rowset
|
|
TESTC_(GetNextRows(m_ulTableRows+1, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//skip backward 5 more row
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+1), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Locate::Variation_9()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC_(GetNextRows(m_ulTableRows, 1, &cRowsObtained, &rghRows), DB_S_ENDOFROWSET);
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip to last row of the rowset
|
|
TESTC(VerifyGetNextRows(m_ulTableRows-1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(10)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward and to the last row. skip backward to the first row
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_Locate::Variation_10()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row forward and fetch (m_ulTableRows-3) rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows-3, SECOND_ROW, FORWARD));
|
|
|
|
//skip one row forward and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, 2, m_ulTableRows, FORWARD, ONE_ROW, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//skip totalRowNum row backward and fetch one row forward
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows), 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_Locate::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_ScrollBackwards_QueryBased)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_ScrollBackwards_QueryBased - ScrollBackwards_QueryBased
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_QueryBased::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
SetSettableProperty(KAGPROP_QUERYBASEDUPDATES, DBPROPSET_PROVIDERROWSET);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip forward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_QueryBased::Variation_1()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//cRow==0, cRowToSkip ==m_ulTableRows+2. No-Op
|
|
TESTC_(GetNextRows(m_ulTableRows, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the begining of the rowset
|
|
//skip backward one row and fetch one row forward.
|
|
TESTC(VerifyGetNextRows(-1, 1, m_ulTableRows));
|
|
|
|
//make sure the second to last row is fetched
|
|
TESTC(VerifyGetNextRows(-2, 1, m_ulTableRows-1));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip backward > # of rows in the table
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_QueryBased::Variation_2()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRow==0, cRowToSkip ==-(m_ulTableRows+2)
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+2), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip =1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_QueryBased::Variation_3()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//NextFetchPosition should be unchanged
|
|
TESTC_(GetNextRows(1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the 1st row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow==0, cRowToSkip = -1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_QueryBased::Variation_4()
|
|
{
|
|
HROW hRow = DB_NULL_HROW;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//cRow==0, cRowToSkip ==1 No-Op
|
|
TESTC_(GetNextRows(-1, 0, &hRow),S_OK);
|
|
|
|
//make sure the cursor is at the first row of the rowset
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRows is negative.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_QueryBased::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows-2), m_ulTableRows-2, THIRD_ROW, FORWARD, m_ulTableRows-2, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row backward and fetch 5 row forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_QueryBased::Variation_6()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row backward and fetch m_ulTableRows row forward. One row should be retrieved
|
|
TESTC(VerifyGetNextRows(-1, m_ulTableRows, m_ulTableRows, FORWARD, ONE_ROW, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc retrieve 2 rows. Skip 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_QueryBased::Variation_7()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 3 row backwards
|
|
TESTC(VerifyGetNextRows(-3, 1, m_ulTableRows-2, FORWARD));
|
|
|
|
//skip one row and fetch one row forward
|
|
TESTC(VerifyGetNextRows(1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip backward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_QueryBased::Variation_8()
|
|
{
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip backward more than the number of rows in the rowset
|
|
TESTC_(GetNextRows(m_ulTableRows+1, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//skip backward 5 more row
|
|
TESTC_(GetNextRows(NEGATIVE(m_ulTableRows+1), 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward more than the number of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_QueryBased::Variation_9()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC_(GetNextRows(m_ulTableRows, 1, &cRowsObtained, &rghRows), DB_S_ENDOFROWSET);
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip to last row of the rowset
|
|
TESTC(VerifyGetNextRows(m_ulTableRows-1, 1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(10)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward and to the last row. skip backward to the first row
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_ScrollBackwards_QueryBased::Variation_10()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows-3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row forward and fetch (m_ulTableRows-3) rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows-3, SECOND_ROW, FORWARD));
|
|
|
|
//skip one row forward and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, 2, m_ulTableRows, FORWARD, ONE_ROW, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//skip totalRowNum row backward and fetch one row forward
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows), 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_ScrollBackwards_QueryBased::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_FetchBackwards_ForwardOnly)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_FetchBackwards_ForwardOnly - fetch backwards
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_ForwardOnly::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_ForwardOnly::Variation_1()
|
|
{
|
|
//Get Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
//Get Second to the Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-1));
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Get the Last row
|
|
TESTC(VerifyGetNextRows(m_ulTableRows, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles. one at a time
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_ForwardOnly::Variation_2()
|
|
{
|
|
ULONG i = 0;
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch all rows
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW+i));
|
|
|
|
//try to fetch forward two more row
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch rows backwards
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-i));
|
|
|
|
//try to fetch backward two more row
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_ForwardOnly::Variation_3()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
HRESULT hr = S_OK;
|
|
DBROWCOUNT i=0;
|
|
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Do the LONG_MIN case
|
|
//should return DB_S_ENDOFROWSET with m_ulTableRows returned in reserve order
|
|
TESTC(VerifyGetNextRows(0, LONG_MIN, m_ulTableRows, REVERSE, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch 1 more than available rows backwards
|
|
//Some providers like to hard code to work arround LONG_MAX, LONG_MIN
|
|
//Work arround this!
|
|
for(i= NEGATIVE(m_ulTableRows+10); i>LONG_MIN && (i+i<i); i+=i)
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Try to obtain all row fetched backwards...
|
|
TESTC(VerifyGetNextRows(0, i, m_ulTableRows, REVERSE, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
}
|
|
|
|
//Spec allows the cursor position to be unknown for this error.
|
|
//So just restart it to be sure for the next call...
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch 1 more than available rows forwards
|
|
TESTC(VerifyGetNextRows(0, m_ulTableRows+1, FIRST_ROW, FORWARD, m_ulTableRows));
|
|
|
|
//try to fetch forward again
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//Try extreme fetch backwards
|
|
hr = GetNextRows(LONG_MAX, LONG_MIN, &cRowsObtained, &rghRows);
|
|
TEST3C_(hr, DB_S_ENDOFROWSET, E_OUTOFMEMORY, DB_E_BADSTARTPOSITION);
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_ForwardOnly::Variation_4()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, m_ulTableRows, REVERSE));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch two rows then 3 row backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_ForwardOnly::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch the first two rows
|
|
TESTC(VerifyGetNextRows(0, 2, FIRST_ROW, FORWARD));
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, SECOND_ROW, REVERSE, TWO_ROWS));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row forward and fetch 2 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_ForwardOnly::Variation_6()
|
|
{
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row forward and fetch 2 rows backwards
|
|
TESTC(VerifyGetNextRows(1, -2, FIRST_ROW, REVERSE, ONE_ROW));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip 2 rows forward and fetch 3 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_ForwardOnly::Variation_7()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=5);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 3 rows forward
|
|
TESTC(VerifyGetNextRows(2, 3, THIRD_ROW));
|
|
|
|
//fetch 5 rows backwards
|
|
TESTC(VerifyGetNextRows(0, -5, 5, REVERSE));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch three rows forward and repeat
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_ForwardOnly::Variation_8()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows forward
|
|
TESTC(VerifyGetNextRows(0, 3, FIRST_ROW));
|
|
|
|
//skip one row forward, and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows, FIFTH_ROW, FORWARD, m_ulTableRows-3-1, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch one row backward
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward 2 rows and fetch 4 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_ForwardOnly::Variation_9()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 4 rows forward
|
|
TESTC(VerifyGetNextRows(2, m_ulTableRows, THIRD_ROW, FORWARD, m_ulTableRows-2, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//skip one row forward, and fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_ForwardOnly::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_FetchBackwards_Static)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_FetchBackwards_Static - fetch backwards
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_Static::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Static::Variation_1()
|
|
{
|
|
//Get Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
//Get Second to the Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-1));
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Get the Last row
|
|
TESTC(VerifyGetNextRows(m_ulTableRows, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles. one at a time
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Static::Variation_2()
|
|
{
|
|
ULONG i = 0;
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch all rows
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW+i));
|
|
|
|
//try to fetch forward two more row
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch rows backwards
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-i));
|
|
|
|
//try to fetch backward two more row
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Static::Variation_3()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch 1 more than available rows backwards
|
|
TESTC(VerifyGetNextRows(0, NEGATIVE(m_ulTableRows+1), m_ulTableRows, REVERSE, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//try to fetch backward again
|
|
TESTC(VerifyGetNextRows(0, -1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch 1 more than available rows forwards
|
|
TESTC(VerifyGetNextRows(0, m_ulTableRows+1, FIRST_ROW, FORWARD, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//try to fetch forward again
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Static::Variation_4()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, m_ulTableRows, REVERSE));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch two rows then 3 row backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Static::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch the first two rows
|
|
TESTC(VerifyGetNextRows(0, 2, FIRST_ROW, FORWARD));
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, SECOND_ROW, REVERSE, TWO_ROWS));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row forward and fetch 2 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Static::Variation_6()
|
|
{
|
|
//Create a new rowset...
|
|
//This is a good senario where RestartPosition has never been called and
|
|
//no previous rows have been fetched...
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_CANHOLDROWS);
|
|
RowsetA.SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//Skip three row forward and fetch 4 rows backwards
|
|
//Should be only able to obtain 3 rows, and then end of rowset
|
|
TESTC(RowsetA.VerifyGetNextRows(3, -4, THIRD_ROW, REVERSE, THREE_ROWS));
|
|
|
|
//fetch one row forward
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip 2 rows forward and fetch 3 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Static::Variation_7()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=5);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 3 rows forward
|
|
TESTC(VerifyGetNextRows(2, 3, THIRD_ROW));
|
|
|
|
//fetch 5 rows backwards
|
|
TESTC(VerifyGetNextRows(0, -5, 5, REVERSE));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch three rows forward and repeat
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Static::Variation_8()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows forward
|
|
TESTC(VerifyGetNextRows(0, 3, FIRST_ROW));
|
|
|
|
//skip one row forward, and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows, FIFTH_ROW, FORWARD, m_ulTableRows-3-1, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch one row backward
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward 2 rows and fetch 4 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Static::Variation_9()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 4 rows forward
|
|
TESTC(VerifyGetNextRows(2, m_ulTableRows, THIRD_ROW, FORWARD, m_ulTableRows-2, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//skip one row forward, and fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_Static::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_FetchBackwards_Keyset)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_FetchBackwards_Keyset - fetch backwards
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_Keyset::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
SetProperty(DBPROP_OTHERUPDATEDELETE);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Keyset::Variation_1()
|
|
{
|
|
//Get Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
//Get Second to the Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-1));
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Get the Last row
|
|
TESTC(VerifyGetNextRows(m_ulTableRows, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles. one at a time
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Keyset::Variation_2()
|
|
{
|
|
ULONG i = 0;
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch all rows
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW+i));
|
|
|
|
//try to fetch forward two more row
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch rows backwards
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-i));
|
|
|
|
//try to fetch backward two more row
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Keyset::Variation_3()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch 1 more than available rows backwards
|
|
TESTC(VerifyGetNextRows(0, NEGATIVE(m_ulTableRows+1), m_ulTableRows, REVERSE, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//try to fetch backward again
|
|
TESTC(VerifyGetNextRows(0, -1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch 1 more than available rows forwards
|
|
TESTC(VerifyGetNextRows(0, m_ulTableRows+1, FIRST_ROW, FORWARD, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//try to fetch forward again
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Keyset::Variation_4()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, m_ulTableRows, REVERSE));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch two rows then 3 row backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Keyset::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch the first two rows
|
|
TESTC(VerifyGetNextRows(0, 2, FIRST_ROW, FORWARD));
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, SECOND_ROW, REVERSE, TWO_ROWS));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row forward and fetch 2 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Keyset::Variation_6()
|
|
{
|
|
//Create a new rowset...
|
|
//This is a good senario where RestartPosition has never been called and
|
|
//no previous rows have been fetched...
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_CANHOLDROWS);
|
|
RowsetA.SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
RowsetA.SetProperty(DBPROP_OTHERUPDATEDELETE);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//Skip three row forward and fetch 4 rows backwards
|
|
//Should be only able to obtain 3 rows, and then end of rowset
|
|
TESTC(RowsetA.VerifyGetNextRows(3, -4, THIRD_ROW, REVERSE, THREE_ROWS));
|
|
|
|
//fetch one row forward
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip 2 rows forward and fetch 3 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Keyset::Variation_7()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=5);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 3 rows forward
|
|
TESTC(VerifyGetNextRows(2, 3, THIRD_ROW));
|
|
|
|
//fetch 5 rows backwards
|
|
TESTC(VerifyGetNextRows(0, -5, 5, REVERSE));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch three rows forward and repeat
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Keyset::Variation_8()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows forward
|
|
TESTC(VerifyGetNextRows(0, 3, FIRST_ROW));
|
|
|
|
//skip one row forward, and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows, FIFTH_ROW, FORWARD, m_ulTableRows-3-1, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch one row backward
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward 2 rows and fetch 4 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Keyset::Variation_9()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 4 rows forward
|
|
TESTC(VerifyGetNextRows(2, m_ulTableRows, THIRD_ROW, FORWARD, m_ulTableRows-2, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//skip one row forward, and fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_Keyset::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_FetchBackwards_Dynamic)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_FetchBackwards_Dynamic - fetch backwards
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_Dynamic::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
SetProperty(DBPROP_OTHERINSERT);
|
|
|
|
//Create rowset
|
|
//Note: We don't set CANHOLDROWS, since this maybe conflicting with
|
|
//OtherInsert on some providers. We are mainly interested with Scrolling
|
|
//backwards on Dynamic cursor and less requirement on holding rows...
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Dynamic::Variation_1()
|
|
{
|
|
//Get Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
//Get Second to the Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-1));
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Get the Last row
|
|
TESTC(VerifyGetNextRows(m_ulTableRows, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles. one at a time
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Dynamic::Variation_2()
|
|
{
|
|
ULONG i = 0;
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch all rows
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW+i));
|
|
|
|
//try to fetch forward two more row
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch rows backwards
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-i));
|
|
|
|
//try to fetch backward two more row
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Dynamic::Variation_3()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch 1 more than available rows backwards
|
|
TESTC(VerifyGetNextRows(0, NEGATIVE(m_ulTableRows+1), m_ulTableRows, REVERSE, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//try to fetch backward again
|
|
TESTC(VerifyGetNextRows(0, -1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch 1 more than available rows forwards
|
|
TESTC(VerifyGetNextRows(0, m_ulTableRows+1, FIRST_ROW, FORWARD, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//try to fetch forward again
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Dynamic::Variation_4()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, m_ulTableRows, REVERSE));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch two rows then 3 row backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Dynamic::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch the first two rows
|
|
TESTC(VerifyGetNextRows(0, 2, FIRST_ROW, FORWARD));
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, SECOND_ROW, REVERSE, TWO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row forward and fetch 2 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Dynamic::Variation_6()
|
|
{
|
|
//Create a new rowset...
|
|
//This is a good senario where RestartPosition has never been called and
|
|
//no previous rows have been fetched...
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
RowsetA.SetProperty(DBPROP_OTHERINSERT);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//Skip three row forward and fetch 4 rows backwards
|
|
//Should be only able to obtain 3 rows, and then end of rowset
|
|
TESTC(RowsetA.VerifyGetNextRows(3, -4, THIRD_ROW, REVERSE, THREE_ROWS));
|
|
|
|
//fetch one row forward
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip 2 rows forward and fetch 3 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Dynamic::Variation_7()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=5);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 3 rows forward
|
|
TESTC(VerifyGetNextRows(2, 3, THIRD_ROW));
|
|
|
|
//fetch 5 rows backwards
|
|
TESTC(VerifyGetNextRows(0, -5, 5, REVERSE));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch three rows forward and repeat
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Dynamic::Variation_8()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows forward
|
|
TESTC(VerifyGetNextRows(0, 3, FIRST_ROW));
|
|
|
|
//skip one row forward, and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows, FIFTH_ROW, FORWARD, m_ulTableRows-3-1, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch one row backward
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward 2 rows and fetch 4 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Dynamic::Variation_9()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 4 rows forward
|
|
TESTC(VerifyGetNextRows(2, m_ulTableRows, THIRD_ROW, FORWARD, m_ulTableRows-2, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//skip one row forward, and fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_Dynamic::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_FetchBackwards_Locate)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_FetchBackwards_Locate - fetch backwards
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_Locate::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_IRowsetLocate);
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Locate::Variation_1()
|
|
{
|
|
//Get Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
//Get Second to the Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-1));
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Get the Last row
|
|
TESTC(VerifyGetNextRows(m_ulTableRows, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles. one at a time
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Locate::Variation_2()
|
|
{
|
|
ULONG i = 0;
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch all rows
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW+i));
|
|
|
|
//try to fetch forward two more row
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch rows backwards
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-i));
|
|
|
|
//try to fetch backward two more row
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Locate::Variation_3()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch 1 more than available rows backwards
|
|
TESTC(VerifyGetNextRows(0, NEGATIVE(m_ulTableRows+1), m_ulTableRows, REVERSE, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//try to fetch backward again
|
|
TESTC(VerifyGetNextRows(0, -1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch 1 more than available rows forwards
|
|
TESTC(VerifyGetNextRows(0, m_ulTableRows+1, FIRST_ROW, FORWARD, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//try to fetch forward again
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Locate::Variation_4()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, m_ulTableRows, REVERSE));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch two rows then 3 row backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Locate::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch the first two rows
|
|
TESTC(VerifyGetNextRows(0, 2, FIRST_ROW, FORWARD));
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, SECOND_ROW, REVERSE, TWO_ROWS));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row forward and fetch 2 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Locate::Variation_6()
|
|
{
|
|
//Create a new rowset...
|
|
//This is a good senario where RestartPosition has never been called and
|
|
//no previous rows have been fetched...
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_IRowsetLocate);
|
|
RowsetA.SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//Skip three row forward and fetch 4 rows backwards
|
|
//Should be only able to obtain 3 rows, and then end of rowset
|
|
TESTC(RowsetA.VerifyGetNextRows(3, -4, THIRD_ROW, REVERSE, THREE_ROWS));
|
|
|
|
//fetch one row forward
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip 2 rows forward and fetch 3 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Locate::Variation_7()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=5);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 3 rows forward
|
|
TESTC(VerifyGetNextRows(2, 3, THIRD_ROW));
|
|
|
|
//fetch 5 rows backwards
|
|
TESTC(VerifyGetNextRows(0, -5, FIFTH_ROW, REVERSE));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch three rows forward and repeat
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Locate::Variation_8()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows forward
|
|
TESTC(VerifyGetNextRows(0, 3, FIRST_ROW));
|
|
|
|
//skip one row forward, and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows, FIFTH_ROW, FORWARD, m_ulTableRows-3-1, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch one row backward
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward 2 rows and fetch 4 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_Locate::Variation_9()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 4 rows forward
|
|
TESTC(VerifyGetNextRows(2, m_ulTableRows, THIRD_ROW, FORWARD, m_ulTableRows-2, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//skip one row forward, and fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, THIRD_ROW, FORWARD, 0, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_Locate::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_FetchBackwards_QueryBased)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_FetchBackwards_QueryBased - fetch backwards
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_QueryBased::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
SetSettableProperty(KAGPROP_QUERYBASEDUPDATES, DBPROPSET_PROVIDERROWSET);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRowsToSkip is negative, return DB_E_CANSCROLLBACKWARDS
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_QueryBased::Variation_1()
|
|
{
|
|
//Get Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
//Get Second to the Last row of the Rowset
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-1));
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Get the Last row
|
|
TESTC(VerifyGetNextRows(m_ulTableRows, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles. one at a time
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_QueryBased::Variation_2()
|
|
{
|
|
ULONG i = 0;
|
|
HROW hRow = NULL;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch all rows
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW+i));
|
|
|
|
//try to fetch forward two more row
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, 1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch rows backwards
|
|
for(i=0; i<m_ulTableRows; i++)
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows-i));
|
|
|
|
//try to fetch backward two more row
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC_(GetNextRows(0, -1, &hRow), DB_S_ENDOFROWSET);
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch forward and backward of all row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_QueryBased::Variation_3()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch 1 more than available rows backwards
|
|
TESTC(VerifyGetNextRows(0, NEGATIVE(m_ulTableRows+1), m_ulTableRows, REVERSE, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//try to fetch backward again
|
|
TESTC(VerifyGetNextRows(0, -1, FIRST_ROW, REVERSE, 0, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//fetch 1 more than available rows forwards
|
|
TESTC(VerifyGetNextRows(0, m_ulTableRows+1, FIRST_ROW, FORWARD, m_ulTableRows, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//try to fetch forward again
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW, FORWARD, 0, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_QueryBased::Variation_4()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, m_ulTableRows, REVERSE));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch two rows then 3 row backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_QueryBased::Variation_5()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch the first two rows
|
|
TESTC(VerifyGetNextRows(0, 2, FIRST_ROW, FORWARD));
|
|
|
|
//fetch three rows backwards
|
|
TESTC(VerifyGetNextRows(0, -3, SECOND_ROW, REVERSE, TWO_ROWS));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row forward and fetch 2 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_QueryBased::Variation_6()
|
|
{
|
|
//Create a new rowset...
|
|
//This is a good senario where RestartPosition has never been called and
|
|
//no previous rows have been fetched...
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_CANHOLDROWS);
|
|
RowsetA.SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
RowsetA.SetSettableProperty(KAGPROP_QUERYBASEDUPDATES, DBPROPSET_PROVIDERROWSET);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//Skip three row forward and fetch 4 rows backwards
|
|
//Should be only able to obtain 3 rows, and then end of rowset
|
|
TESTC(RowsetA.VerifyGetNextRows(3, -4, THIRD_ROW, REVERSE, THREE_ROWS));
|
|
|
|
//fetch one row forward
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip 2 rows forward and fetch 3 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_QueryBased::Variation_7()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=5);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 3 rows forward
|
|
TESTC(VerifyGetNextRows(2, 3, THIRD_ROW));
|
|
|
|
//fetch 5 rows backwards
|
|
TESTC(VerifyGetNextRows(0, -5, 5, REVERSE));
|
|
|
|
//fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc fetch three rows forward and repeat
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_QueryBased::Variation_8()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch three rows forward
|
|
TESTC(VerifyGetNextRows(0, 3, FIRST_ROW));
|
|
|
|
//skip one row forward, and fetch two rows forward
|
|
TESTC(VerifyGetNextRows(1, m_ulTableRows, FIFTH_ROW, FORWARD, m_ulTableRows-3-1));
|
|
|
|
//fetch one row backward
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip forward 2 rows and fetch 4 rows forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_FetchBackwards_QueryBased::Variation_9()
|
|
{
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=m_ulTableRows);
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip 2 rows forward and fetch 4 rows forward
|
|
TESTC(VerifyGetNextRows(2, m_ulTableRows, THIRD_ROW, FORWARD, m_ulTableRows-2));
|
|
|
|
//skip one row forward, and fetch one row forward
|
|
TESTC(VerifyGetNextRows(0, 1, NO_ROWS, FORWARD, NO_ROWS));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_FetchBackwards_QueryBased::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_AllProperties)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_AllProperties - Can Hold rows + fetch backwards + scroll backwards + Discontiguous
|
|
//| Created: 11/29/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_AllProperties::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
SetProperty(DBPROP_CANHOLDROWS);
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow<0, skip backward 4 rows
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_AllProperties::Variation_1()
|
|
{
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip totalrows-1 backwards and fetch 2 rows backwards
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows-1), -2, FIRST_ROW, REVERSE, ONE_ROW));
|
|
|
|
//fetch one more row forward
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc cRow<0, skip bakcward # of rows in the rowset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_AllProperties::Variation_2()
|
|
{
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip all rows backwards and fetch 1 rows backwards, no row should be returned
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows), -1, NO_ROWS, FORWARD, NO_ROWS));
|
|
|
|
//Try all combinations of large values
|
|
TESTC(VerifyGetNextRows(LONG_MIN, LONG_MAX, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
TESTC(VerifyGetNextRows(LONG_MIN, LONG_MIN, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
TESTC(VerifyGetNextRows(LONG_MAX, LONG_MAX, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
TESTC(VerifyGetNextRows(LONG_MAX, LONG_MIN, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//They maybe adding these values together in some combination...
|
|
TESTC(VerifyGetNextRows(LONG_MIN+1, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
TESTC(VerifyGetNextRows(LONG_MIN, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
TESTC(VerifyGetNextRows(LONG_MAX, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
TESTC(VerifyGetNextRows(LONG_MAX-1, 1, NO_ROWS, FORWARD, NO_ROWS, DBMEMOWNER_PROVIDEROWNED));
|
|
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//NextFetchPosition should be unchanged
|
|
TESTC(VerifyGetNextRows(m_ulTableRows, 0, NO_ROWS, FORWARD, NO_ROWS));
|
|
TESTC(VerifyGetNextRows(1, 0, NO_ROWS, FORWARD, NO_ROWS));
|
|
|
|
//skip all rows forward and fetch one row backward.
|
|
TESTC(VerifyGetNextRows(m_ulTableRows, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip two rows backwards and fetch one row bakwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_AllProperties::Variation_3()
|
|
{
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retrieve the third row
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows-3), -1, THIRD_ROW));
|
|
|
|
//skip two rows forward and fetch one row forward (last row)
|
|
TESTC(VerifyGetNextRows((m_ulTableRows-3), 1, m_ulTableRows));
|
|
|
|
//fetch one more row backward, the last row should be fetched again
|
|
TESTC(VerifyGetNextRows(0, -1, m_ulTableRows));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc retrieve the rows in the order of 1, 5, 3, 2,4
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_AllProperties::Variation_4()
|
|
{
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retrieve the first row
|
|
TESTC(VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
//retrieve the fifth row
|
|
TESTC(VerifyGetNextRows(3, 1, FIFTH_ROW));
|
|
|
|
//retriev the third row
|
|
TESTC(VerifyGetNextRows(-3, 1, THIRD_ROW));
|
|
|
|
//retrieve the second row
|
|
TESTC(VerifyGetNextRows(-1, -1, SECOND_ROW));
|
|
|
|
//retrieve the fourth row
|
|
TESTC(VerifyGetNextRows(3, -1, FOURTH_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_AllProperties::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(TCIRowset_NoDiscontiguous)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: TCIRowset_NoDiscontiguous - test a rowset with properties of CanHoldRows, CanScrollBackwards, and CanFetchBackwards
|
|
//| Created: 12/14/95
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_NoDiscontiguous::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
SetProperty(DBPROP_CANHOLDROWS); //Required Level-0
|
|
SetProperty(DBPROP_IRowsetIdentity); //Required Level-0
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc retrieve 5 row handles in the order of 3,4,2,5,1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_NoDiscontiguous::Variation_1()
|
|
{
|
|
//retrieve the third row
|
|
TESTC(VerifyGetNextRows(2, 1, THIRD_ROW));
|
|
|
|
//retrieve the fourth row
|
|
TESTC(VerifyGetNextRows(0, 1, FOURTH_ROW));
|
|
|
|
//retrieve the 2nd row
|
|
TESTC(VerifyGetNextRows(-2, -1, SECOND_ROW));
|
|
|
|
//retrieve the fifth row
|
|
TESTC(VerifyGetNextRows(4, -1, FIFTH_ROW));
|
|
|
|
//retrieve the first row
|
|
TESTC(VerifyGetNextRows(-3, -1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row forward and fetch one row forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_NoDiscontiguous::Variation_2()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW rghRows[5];
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Fetch the second row
|
|
TESTC_(GetNextRows(1, 1, &rghRows[0]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], SECOND_ROW));
|
|
|
|
//Fetch the first row
|
|
TESTC_(GetNextRows(-1, -1, &rghRows[1]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[1], FIRST_ROW));
|
|
|
|
//restart the cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch the first and second row handles again
|
|
TESTC_(GetNextRows(0, 2, &rghRows[2]),S_OK);
|
|
TESTC(VerifyRowHandles(2, &rghRows[2], FIRST_ROW));
|
|
|
|
//Make sure the RowHandles are of the same row
|
|
TESTC(IsSameRow(rghRows[0], rghRows[3]));
|
|
TESTC(IsSameRow(rghRows[1], rghRows[2]));
|
|
|
|
//Release the first and second row handles.
|
|
//Their reference counts should be 1, (only if there the same handle)
|
|
TESTC(VerifyReleaseRows(1, &rghRows[0], rghRows[0] == rghRows[3] ? 1 : 0));
|
|
TESTC(VerifyReleaseRows(1, &rghRows[1], rghRows[1] == rghRows[2] ? 1 : 0));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(5, rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip 2 rows backwards and fetch 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_NoDiscontiguous::Variation_3()
|
|
{
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//skip 2 rows backwards and fetch three rows backwards.
|
|
//fetch the first three row handles
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows-3), -3, THIRD_ROW, REVERSE));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc RestartPosition - with outstanding row handles
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int TCIRowset_NoDiscontiguous::Variation_4()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
HROW rghRows2[FIVE_ROWS];
|
|
HRESULT hr = S_OK;
|
|
|
|
//RestartPosition, verify
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//Retrieve rows
|
|
TEST2C_(hr = GetNextRows(0, TWO_ROWS, &cRowsObtained, &rghRows), S_OK, DB_S_ROWLIMITEXCEEDED);
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, FIRST_ROW));
|
|
|
|
//RestartPosition, (with outstanding row handles)
|
|
if(!VerifyRestartPosition(NULL, FALSE/*fRowsReleased*/))
|
|
{
|
|
//Some providers require releasing all rows, before restarting...
|
|
//We can still continue testing, but not the outstanding row handle part...
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
cRowsObtained = 0;
|
|
}
|
|
|
|
//The rest of the verification requires verification of outstanding row handles...
|
|
if(hr == DB_S_ROWLIMITEXCEEDED)
|
|
TESTC(m_ulMaxOpenRows == ONE_ROW);
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=FOUR_ROWS);
|
|
|
|
//Obtain the second and third rows...
|
|
//NOTE: If the above RestartPosition failed (ie: cRowsObtained==0) this call
|
|
//will returned the fourth and fifth rows instead, since the cursor is not at the head...
|
|
TESTC_(GetNextRows(1, TWO_ROWS, &rghRows2[SECOND_ROW]),S_OK);
|
|
TESTC(VerifyRowHandles(TWO_ROWS, &rghRows2[SECOND_ROW], cRowsObtained ? SECOND_ROW : FOURTH_ROW));
|
|
|
|
//Make sure the previously (outstanding) returned row handles are still valid...
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
ReleaseRows(TWO_ROWS, rghRows2);
|
|
SAFE_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL TCIRowset_NoDiscontiguous::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(KeysetCursor)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: KeysetCursor - test keyset driven cursor model
|
|
//| Created: 03/11/96
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL KeysetCursor::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
SetProperty(DBPROP_OTHERUPDATEDELETE);
|
|
SetProperty(DBPROP_CANHOLDROWS); //Required Level-0
|
|
SetProperty(DBPROP_IRowsetIdentity); //Required Level-0
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc retrieve 5 row handles in the order of 3,4,2,5,1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int KeysetCursor::Variation_1()
|
|
{
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retrieve the third row
|
|
TESTC(VerifyGetNextRows(2, 1, THIRD_ROW));
|
|
|
|
//retrieve the fourth row
|
|
TESTC(VerifyGetNextRows(0, 1, FOURTH_ROW));
|
|
|
|
//retrieve the 2nd row
|
|
TESTC(VerifyGetNextRows(-2, -1, SECOND_ROW));
|
|
|
|
//retrieve the fifth row
|
|
TESTC(VerifyGetNextRows(4, -1, FIFTH_ROW));
|
|
|
|
//retrieve the first row
|
|
TESTC(VerifyGetNextRows(-3, -1, FIRST_ROW));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row forward and fetch one row forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int KeysetCursor::Variation_2()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW rghRows[5];
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//skip one row forward and fetch one row forward. Fetch the second row
|
|
TESTC_(GetNextRows(1, 1, &rghRows[0]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], SECOND_ROW));
|
|
|
|
//skip one row backward and fetch oen row backward. Fetch the first row
|
|
TESTC_(GetNextRows(-1, -1, &rghRows[1]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[1], FIRST_ROW));
|
|
|
|
//restart the cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch the first and second row handles again
|
|
TESTC_(GetNextRows(0, 2, &rghRows[2]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[2], FIRST_ROW));
|
|
TESTC(VerifyRowHandles(rghRows[3], SECOND_ROW));
|
|
|
|
//Make sure the RowHandles are of the same row
|
|
TESTC(IsSameRow(rghRows[0], rghRows[3]));
|
|
TESTC(IsSameRow(rghRows[1], rghRows[2]));
|
|
|
|
//release the first and second row handles. Their reference counts should be 1
|
|
//Their reference counts should be 1, (only if there the same handle)
|
|
TESTC(VerifyReleaseRows(1, &rghRows[0], rghRows[0] == rghRows[3] ? 1 : 0));
|
|
TESTC(VerifyReleaseRows(1, &rghRows[1], rghRows[1] == rghRows[2] ? 1 : 0));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(5, rghRows);
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip 2 rows backwards and fetch 3 rows backwards
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int KeysetCursor::Variation_3()
|
|
{
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//skip 2 rows backwards and fetch three rows backwards.
|
|
//fetch the first three row handles
|
|
TESTC(VerifyGetNextRows(NEGATIVE(m_ulTableRows-3), -3, THIRD_ROW, REVERSE));
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL KeysetCursor::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(DynamicCursor)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: DynamicCursor - test dynamic cursor
|
|
//| Created: 03/11/96
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL DynamicCursor::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Set required Properties
|
|
//Note: We have already testing scrolling and fetching backwards
|
|
//with dynamic cursor, which some providers may not support those
|
|
//combinations, so here, strictly test dynamic cursor without
|
|
//these other requirements...
|
|
SetProperty(DBPROP_OTHERINSERT);
|
|
SetProperty(DBPROP_IRowsetIdentity); //Required Level-0
|
|
|
|
//Create rowset
|
|
TEST_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc retrieve 5 row handles in the order of 3,4,2,5,1
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int DynamicCursor::Variation_1()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW rghRows[5];
|
|
|
|
//NOTE: We didn't ask for CANHOLDROWS, since this may be conflicting
|
|
//with OtherInsert on some providers, and we want to do the most amount of
|
|
//testing, so if CanHoldRows is on by default we will try to holdrows with
|
|
//the dynamic cursor, otherwise were are forced to release them...
|
|
|
|
//We also didn't ask for CanScrollBackwards or CanFetchBackwards since these
|
|
//combinations are already tested in ScrollBackwards_Dynamic, and
|
|
//FetchBackwards_Dynamic, which may have been skipped due to conflicting
|
|
//properties. This way we are testing Dynamic cursor, and if any of these
|
|
//other properties are natively on, will test the additional functionality...
|
|
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//retrieve the third row
|
|
TESTC_(GetNextRows(2, 1, &rghRows[0]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], THIRD_ROW));
|
|
if(!m_bCanHoldRows)
|
|
TESTC_(ReleaseRows(1, &rghRows[0]),S_OK);
|
|
|
|
//retrieve the fourth row
|
|
TESTC_(GetNextRows(0, 1, &rghRows[1]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[1], FOURTH_ROW));
|
|
if(!m_bCanHoldRows)
|
|
TESTC_(ReleaseRows(1, &rghRows[1]),S_OK);
|
|
|
|
//retrieve the 2nd row
|
|
if(m_bCanScrollBackwards && m_bCanFetchBackwards)
|
|
{
|
|
TESTC_(GetNextRows(-2, -1, &rghRows[2]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[2], SECOND_ROW));
|
|
if(!m_bCanHoldRows)
|
|
TESTC_(ReleaseRows(1, &rghRows[2]),S_OK);
|
|
}
|
|
|
|
//retrieve the fifth row
|
|
if(m_bCanFetchBackwards)
|
|
{
|
|
TESTC_(GetNextRows(4, -1, &rghRows[3]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[3], FIFTH_ROW));
|
|
if(!m_bCanHoldRows)
|
|
TESTC_(ReleaseRows(1, &rghRows[3]),S_OK);
|
|
}
|
|
|
|
//retrieve the first row
|
|
if(m_bCanScrollBackwards && m_bCanFetchBackwards)
|
|
{
|
|
TESTC_(GetNextRows(-3, -1, &rghRows[4]),S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[4], FIRST_ROW));
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(5, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip one row forward and fetch one row forward
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int DynamicCursor::Variation_2()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW rghRows[5];
|
|
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//Fetch the second and third rows
|
|
TESTC_(GetNextRows(1, 2, &rghRows[0]),S_OK);
|
|
TESTC(VerifyRowHandles(2, &rghRows[0], SECOND_ROW));
|
|
|
|
//We might need to release these rows, if CanHoldRows is not on...
|
|
if(!m_bCanHoldRows)
|
|
TESTC_(ReleaseRows(2, &rghRows[0]),S_OK);
|
|
|
|
//restart the cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//fetch the first three rows...
|
|
TESTC_(GetNextRows(0, 3, &rghRows[2]),S_OK);
|
|
TESTC(VerifyRowHandles(3, &rghRows[2], FIRST_ROW));
|
|
|
|
if(m_bCanHoldRows)
|
|
{
|
|
//Make sure the RowHandles are the same row
|
|
TESTC(IsSameRow(rghRows[0], rghRows[3]));
|
|
TESTC(IsSameRow(rghRows[1], rghRows[4]));
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(5, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc skip 2 rows and fetch 3 rows
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int DynamicCursor::Variation_3()
|
|
{
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=3);
|
|
|
|
//skip 2 rows fetch three rows.
|
|
TESTC(VerifyGetNextRows(2, 3, THIRD_ROW));
|
|
|
|
//Fetch the first two rows again
|
|
hr = GetNextRows(-3, -3, &cRowsObtained, &rghRows);
|
|
TEST3C_(hr, DB_S_ENDOFROWSET, DB_E_CANTSCROLLBACKWARDS, DB_E_CANTFETCHBACKWARDS);
|
|
|
|
if(hr==DB_S_ENDOFROWSET)
|
|
{
|
|
//Verify results
|
|
TESTC(m_bCanFetchBackwards == TRUE);
|
|
TESTC(m_bCanScrollBackwards == TRUE);
|
|
|
|
//Verify Row handles and data
|
|
TESTC(cRowsObtained == 2 && rghRows != NULL);
|
|
TESTC(VerifyRowHandles(cRowsObtained, rghRows, SECOND_ROW, REVERSE));
|
|
}
|
|
else
|
|
{
|
|
//Verify results
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
if(hr==DB_E_CANTSCROLLBACKWARDS)
|
|
TESTC(m_bCanScrollBackwards == FALSE);
|
|
if(hr==DB_E_CANTFETCHBACKWARDS)
|
|
TESTC(m_bCanFetchBackwards == FALSE);
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL DynamicCursor::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
} // }}
|
|
// }}
|
|
// }}
|
|
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(Bookmarks)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: Bookmarks - Test bookmarks on and off
|
|
//| Created: 7/7/98
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL Bookmarks::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Bookmarks has to be supported for this testcase, either true or false
|
|
TEST_PROVIDER(SupportedProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET));
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Bookmarks == TRUE, ForwardOnly
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Bookmarks::Variation_1()
|
|
{
|
|
//Create rowset
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_BOOKMARKS);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//skip one row and fetch one row forward.
|
|
TESTC(RowsetA.VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
//fetch the last row
|
|
TESTC(RowsetA.VerifyGetNextRows(RowsetA.m_ulTableRows-2-1, 1, RowsetA.m_ulTableRows));
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//Fetch every row and verify the data...
|
|
TESTC(RowsetA.VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Bookmarks == TRUE, Static
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Bookmarks::Variation_2()
|
|
{
|
|
//Create rowset
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_BOOKMARKS);
|
|
RowsetA.SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//skip one row and fetch one row forward.
|
|
TESTC(RowsetA.VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
//fetch the first row again
|
|
TESTC(RowsetA.VerifyGetNextRows(-2, 1, FIRST_ROW));
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//Fetch every row and verify the data...
|
|
TESTC(RowsetA.VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Bookmarks == TRUE, Keyset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Bookmarks::Variation_3()
|
|
{
|
|
//Create rowset
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_BOOKMARKS);
|
|
RowsetA.SetProperty(DBPROP_OTHERUPDATEDELETE);
|
|
RowsetA.SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//fetch the first row
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
//fetch the first row (again)
|
|
TESTC(RowsetA.VerifyGetNextRows(0, -1, FIRST_ROW));
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//fetch the last row
|
|
TESTC(RowsetA.VerifyGetNextRows(0, -1, RowsetA.m_ulTableRows));
|
|
|
|
//fetch the last row (again)
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, RowsetA.m_ulTableRows));
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//Fetch every row and verify the data...
|
|
TESTC(RowsetA.VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Bookmarks == TRUE, Dynamic
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Bookmarks::Variation_4()
|
|
{
|
|
//Create rowset
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_BOOKMARKS);
|
|
RowsetA.SetProperty(DBPROP_OTHERINSERT);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//fetch the first row
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
//fetch the first row (again)
|
|
if(RowsetA.m_bCanFetchBackwards)
|
|
TESTC(RowsetA.VerifyGetNextRows(0, -1, FIRST_ROW));
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//fetch the last row
|
|
if(RowsetA.m_bCanFetchBackwards)
|
|
{
|
|
TESTC(RowsetA.VerifyGetNextRows(0, -1, RowsetA.m_ulTableRows));
|
|
|
|
//fetch the last row (again)
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, RowsetA.m_ulTableRows));
|
|
}
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//Fetch every row and verify the data...
|
|
TESTC(RowsetA.VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Bookmarks == FALSE, ForwardOnly
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Bookmarks::Variation_5()
|
|
{
|
|
//Create rowset
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, (void*)VARIANT_FALSE);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//skip one row and fetch one row forward.
|
|
TESTC(RowsetA.VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
//fetch the last row
|
|
TESTC(RowsetA.VerifyGetNextRows(RowsetA.m_ulTableRows-2-1, 1, RowsetA.m_ulTableRows));
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//Fetch every row and verify the data...
|
|
TESTC(RowsetA.VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Bookmarks == FALSE, Static
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Bookmarks::Variation_6()
|
|
{
|
|
//Create rowset
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, (void*)VARIANT_FALSE);
|
|
RowsetA.SetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//skip one row and fetch one row forward.
|
|
TESTC(RowsetA.VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
//fetch the first row again
|
|
TESTC(RowsetA.VerifyGetNextRows(-2, 1, FIRST_ROW));
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//Fetch every row and verify the data...
|
|
TESTC(RowsetA.VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Bookmarks == FALSE, Keyset
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Bookmarks::Variation_7()
|
|
{
|
|
//Create rowset
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, (void*)VARIANT_FALSE);
|
|
RowsetA.SetProperty(DBPROP_OTHERUPDATEDELETE);
|
|
RowsetA.SetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//fetch the first row
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
//fetch the first row (again)
|
|
TESTC(RowsetA.VerifyGetNextRows(0, -1, FIRST_ROW));
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//fetch the last row
|
|
TESTC(RowsetA.VerifyGetNextRows(0, -1, RowsetA.m_ulTableRows));
|
|
|
|
//fetch the last row (again)
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, RowsetA.m_ulTableRows));
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//Fetch every row and verify the data...
|
|
TESTC(RowsetA.VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Bookmarks == FALSE, Dynamic
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Bookmarks::Variation_8()
|
|
{
|
|
//Create rowset
|
|
TCIRowset RowsetA;
|
|
RowsetA.SetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, (void*)VARIANT_FALSE);
|
|
RowsetA.SetProperty(DBPROP_OTHERINSERT);
|
|
TESTC_PROVIDER(RowsetA.CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//fetch the first row
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, FIRST_ROW));
|
|
|
|
//fetch the first row (again)
|
|
if(RowsetA.m_bCanFetchBackwards)
|
|
TESTC(RowsetA.VerifyGetNextRows(0, -1, FIRST_ROW));
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//fetch the last row
|
|
if(RowsetA.m_bCanFetchBackwards)
|
|
{
|
|
TESTC(RowsetA.VerifyGetNextRows(0, -1, RowsetA.m_ulTableRows));
|
|
|
|
//fetch the last row (again)
|
|
TESTC(RowsetA.VerifyGetNextRows(0, 1, RowsetA.m_ulTableRows));
|
|
}
|
|
|
|
//restart cursor position
|
|
TESTC(RowsetA.VerifyRestartPosition());
|
|
|
|
//Fetch every row and verify the data...
|
|
TESTC(RowsetA.VerifyAllRows());
|
|
|
|
CLEANUP:
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
BOOL Bookmarks::Terminate()
|
|
{
|
|
// TO DO: Add your own code here
|
|
|
|
// {{ TCW_TERM_BASECLASS_CHECK2
|
|
return(TCIRowset::Terminate());
|
|
} // }}
|
|
// }} TCW_TERMINATE_METHOD_END
|
|
// }} TCW_TC_PROTOTYPE_END
|
|
|
|
// {{ TCW_TC_PROTOTYPE(Status)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: Status - test the DBROWSTATUS array
|
|
//| Created: 06/06/96
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL Status::Init()
|
|
{
|
|
if(TCIRowset::Init())
|
|
{
|
|
//Create rowset
|
|
if(CreateRowset(SELECT_VALIDATIONORDER)==S_OK)
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc DB_E_CANTFECTHBACKWARDS, DB_E_CANTSCROLLBACKWARDS
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Status::Variation_1()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
DBCOUNTITEM cRowsObtained = 1;
|
|
HROW* rghRows = NULL;
|
|
BOOL fCanFetchBackwards = GetProperty(DBPROP_CANFETCHBACKWARDS);
|
|
BOOL fCanScrollBackwards = GetProperty(DBPROP_CANSCROLLBACKWARDS);
|
|
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//can not scroll bakcwards. As cRows==0, no-op.
|
|
hr = GetNextRows(-1, 0, &cRowsObtained, &rghRows);
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
|
|
//It provider specific on cRows=0 wither it immeiately returns S_OK or
|
|
//weither it tries to validate other params
|
|
TEST2C_(hr, S_OK, DB_E_CANTSCROLLBACKWARDS);
|
|
if(fCanScrollBackwards)
|
|
TESTC_(hr, S_OK);
|
|
|
|
//DB_E_CANTFETCHBACKWARDS
|
|
TESTC_(hr = GetNextRows(5, -2, &cRowsObtained, &rghRows), fCanFetchBackwards ? S_OK : DB_E_CANTFETCHBACKWARDS);
|
|
TESTC_(ReleaseRows(cRowsObtained, rghRows), S_OK);
|
|
PROVIDER_FREE(rghRows);
|
|
|
|
//DB_E_CANTSCROLLBACKWARDS
|
|
TESTC_(hr = GetNextRows(-1, 1, &cRowsObtained, &rghRows), fCanScrollBackwards ? S_OK : DB_E_CANTSCROLLBACKWARDS);
|
|
TESTC_(ReleaseRows(cRowsObtained, rghRows), S_OK);
|
|
PROVIDER_FREE(rghRows);
|
|
|
|
//DB_S_ENDOFROWSET
|
|
TESTC_(GetNextRows(m_ulTableRows + 10000, 1, &cRowsObtained, &rghRows), DB_S_ENDOFROWSET);
|
|
TESTC(cRowsObtained == 0 && rghRows == NULL);
|
|
|
|
CLEANUP:
|
|
PROVIDER_FREE(rghRows)
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc An array of success scenario
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Status::Variation_2()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW rghRows[5];
|
|
|
|
ULONG rgRefCount[5];
|
|
DBROWSTATUS rgRowStatus[5];
|
|
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//get two row handles
|
|
TESTC_(GetNextRows(0, 2, rghRows), S_OK);
|
|
TESTC(VerifyRowHandles(2, rghRows, FIRST_ROW));
|
|
|
|
//add ref
|
|
TESTC_(m_pIRowset->AddRefRows(2, rghRows, rgRefCount, rgRowStatus),S_OK);
|
|
TESTC(VerifyRefCounts(2, rgRefCount, 2));
|
|
TESTC(VerifyRowStatus(2, rgRowStatus, DBROWSTATUS_S_OK));
|
|
|
|
//release the row handle
|
|
TESTC(VerifyReleaseRows(2, rghRows, 1, DBROWSTATUS_S_OK));
|
|
TESTC(VerifyReleaseRows(2, rghRows, 0, DBROWSTATUS_S_OK));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(5, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc An array of invalid row handle
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Status::Variation_3()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW rghRows[2];
|
|
ULONG rgRefCount[2] = { 1, 1 };
|
|
DBROWSTATUS rgRowStatus[2] = { 0, 0};
|
|
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
|
|
//get one row handle
|
|
TESTC_(GetNextRows(2, 1, rghRows), S_OK);
|
|
TESTC(VerifyRowHandles(rghRows[0], THIRD_ROW));
|
|
TESTC(VerifyReleaseRows(1, rghRows));
|
|
|
|
//get an invalid row handle
|
|
rghRows[0] = DB_NULL_HROW;
|
|
rghRows[1] = ULONG_MAX;
|
|
|
|
//add ref
|
|
TESTC_(m_pIRowset->AddRefRows(2, rghRows, rgRefCount, rgRowStatus), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[0], 0));
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[1], 0));
|
|
TESTC(VerifyRowStatus(2, rgRowStatus, DBROWSTATUS_E_INVALID));
|
|
|
|
//release the row handle
|
|
TESTC_(pIRowset()->ReleaseRows(2, rghRows, NULL, rgRefCount, rgRowStatus), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[0], 0));
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[1], 0));
|
|
TESTC(VerifyRowStatus(2, rgRowStatus, DBROWSTATUS_E_INVALID));
|
|
|
|
//add ref (NULL rgRefCount)
|
|
TESTC_(m_pIRowset->AddRefRows(2, rghRows, NULL, rgRowStatus), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyRowStatus(2, rgRowStatus, DBROWSTATUS_E_INVALID));
|
|
|
|
//release the row handle (NULL rgRefCount)
|
|
TESTC_(pIRowset()->ReleaseRows(2, rghRows, NULL, NULL, rgRowStatus), DB_E_ERRORSOCCURRED);
|
|
TESTC(VerifyRowStatus(2, rgRowStatus, DBROWSTATUS_E_INVALID));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(2, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc An array of valid and unvalid row handle
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int Status::Variation_4()
|
|
{
|
|
ULONG cRowsObtained = 0;
|
|
HROW rghRows[5];
|
|
ULONG rgRefCount[5];
|
|
DBROWSTATUS rgRowStatus[5];
|
|
|
|
//restart cursor position
|
|
TESTC(VerifyRestartPosition());
|
|
TESTC_PROVIDER(m_ulMaxOpenRows==0 || m_ulMaxOpenRows>=2);
|
|
|
|
//get two row handles
|
|
TESTC_(GetNextRows(1, 2, rghRows),S_OK);
|
|
TESTC(VerifyRowHandles(2, rghRows, SECOND_ROW));
|
|
|
|
//release the second row handle
|
|
TESTC(VerifyReleaseRows(1, &rghRows[1], 0 , DBROWSTATUS_S_OK));
|
|
rghRows[1] = DB_NULL_HROW;
|
|
|
|
//add ref
|
|
TESTC_(m_pIRowset->AddRefRows(2, rghRows, rgRefCount, rgRowStatus), DB_S_ERRORSOCCURRED);
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[0], 2));
|
|
TESTC(VerifyRowStatus(1, &rgRowStatus[0], DBROWSTATUS_S_OK));
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[1], 0));
|
|
TESTC(VerifyRowStatus(1, &rgRowStatus[1], DBROWSTATUS_E_INVALID));
|
|
|
|
//release the row handle
|
|
TESTC_(pIRowset()->ReleaseRows(2, rghRows, NULL, rgRefCount, rgRowStatus), DB_S_ERRORSOCCURRED);
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[0], 1));
|
|
TESTC(VerifyRowStatus(1, &rgRowStatus[0], DBROWSTATUS_S_OK));
|
|
TESTC(rgRefCount[1] == 0);
|
|
TESTC(VerifyRowStatus(1, &rgRowStatus[1], DBROWSTATUS_E_INVALID));
|
|
|
|
//release the row handle
|
|
TESTC_(pIRowset()->ReleaseRows(1, &rghRows[0], NULL,rgRefCount,rgRowStatus), S_OK);
|
|
TESTC(VerifyRefCounts(1, &rgRefCount[0], 0));
|
|
TESTC(VerifyRowStatus(1, &rgRowStatus[0], DBROWSTATUS_S_OK));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(5, rghRows);
|
|
TRETURN
|
|
}
|
|
// }}
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL Status::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
} // }}
|
|
// }}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_TC_PROTOTYPE(ExtendedErrors)
|
|
//*-----------------------------------------------------------------------
|
|
//| Test Case: ExtendedErrors - Extended Errors
|
|
//| Created: 07/20/96
|
|
//*-----------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Initialization Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
|
|
BOOL ExtendedErrors::Init()
|
|
{
|
|
return TCIRowset::Init();
|
|
}
|
|
|
|
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(1)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc ISupportErrorInfo for all rowset interfaces...
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_1()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ULONG i,cInterfaceMaps = 0;
|
|
INTERFACEMAP* rgInterfaceMaps = NULL;
|
|
|
|
COpenRowset OpenRowsetA;
|
|
IRowset* pIRowset = NULL;
|
|
IUnknown* pIUnknown = NULL;
|
|
|
|
//Obtain all interfaces for this object...
|
|
TESTC(GetInterfaceArray(ROWSET_INTERFACE, &cInterfaceMaps, &rgInterfaceMaps));
|
|
|
|
//Set all required properties and all other as optional.
|
|
for(i=0; i<cInterfaceMaps; i++)
|
|
{
|
|
if(rgInterfaceMaps[i].dwPropertyID)
|
|
{
|
|
DBPROPOPTIONS dwPropOptions = DBPROPOPTIONS_OPTIONAL;
|
|
if(rgInterfaceMaps[i].fMandatory || rgInterfaceMaps[i].dwConfLevel==0)
|
|
dwPropOptions = DBPROPOPTIONS_REQUIRED;
|
|
|
|
//Set the property...
|
|
TESTC(OpenRowsetA.SetProperty(rgInterfaceMaps[i].dwPropertyID, DBPROPSET_ROWSET, (void*)VARIANT_TRUE, DBTYPE_BOOL, dwPropOptions));
|
|
}
|
|
}
|
|
|
|
//Create rowset
|
|
//NOTE: This function already does DefaultObjectTesting
|
|
TEST2C_(OpenRowsetA.CreateOpenRowset(IID_IRowset, (IUnknown**)&pIRowset), S_OK, DB_S_ERRORSOCCURRED);
|
|
|
|
//Run through the interfaces obtained (especially ISupportErrorInfo)...
|
|
for(i=0; i<cInterfaceMaps; i++)
|
|
{
|
|
//Obtain this inteface.
|
|
if(VerifyInterface(pIRowset, *(rgInterfaceMaps[i].pIID), ROWSET_INTERFACE, &pIUnknown))
|
|
TESTC(DefaultInterfaceTesting(pIUnknown, ROWSET_INTERFACE, *(rgInterfaceMaps[i].pIID)));
|
|
SAFE_RELEASE(pIUnknown);
|
|
}
|
|
|
|
CLEANUP:
|
|
SAFE_RELEASE(pIRowset);
|
|
SAFE_RELEASE(pIUnknown);
|
|
TRETURN
|
|
}
|
|
// }} TCW_VAR_PROTOTYPE_END
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(2)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Valid IRowset calls with previous error object existing.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_2()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HROW hRow = NULL;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//Cause an error to occur
|
|
m_pExtError->CauseError();
|
|
|
|
//restart cursor position
|
|
TESTC_(hr = RestartPosition(),S_OK);
|
|
TESTC(XCHECK(pIRowset(), IID_IRowset, hr));
|
|
|
|
m_pExtError->CauseError();
|
|
|
|
//NextFetchPosition should not be changed
|
|
//It is provider specific wiether S_OK is returned or other
|
|
//parameter validation is done when cRows == 0
|
|
hr = GetNextRows(NEGATIVE(m_ulTableRows+2), 0, &hRow);
|
|
TEST2C_(hr, S_OK, DB_E_CANTSCROLLBACKWARDS);
|
|
if(GetProperty(DBPROP_CANSCROLLBACKWARDS))
|
|
TESTC_(hr, S_OK)
|
|
|
|
//Check Extended Errors
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
|
|
//make sure the cursor is at the beginning of the rowset
|
|
//skip forward one row and fetch one row forward.
|
|
TESTC(VerifyGetNextRows(1, 1, SECOND_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(3)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc Valid IRowset calls with previous error object existing.
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_3()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
DBBKMARK cbBookmark;
|
|
BYTE* pBookmark = NULL;
|
|
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
HROW hRow = NULL;
|
|
|
|
ULONG ulRefCount = 0;
|
|
IRowsetLocate* pIRowsetLocate = NULL;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER, IID_IRowsetLocate)==S_OK);
|
|
TESTC(VerifyInterface(pIRowset(), IID_IRowsetLocate, ROWSET_INTERFACE, (IUnknown**)&pIRowsetLocate));
|
|
|
|
m_pExtError->CauseError();
|
|
|
|
//get the book marks for the first row
|
|
TESTC_(GetNextRows(0, 1, &hRow),S_OK);
|
|
TESTC_(hr = GetBookmark(hRow, &cbBookmark, &pBookmark),S_OK);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
|
|
m_pExtError->CauseError();
|
|
|
|
//addRef on the row handle and release it
|
|
TESTC_(hr = pIRowset()->AddRefRows(1, &hRow, &ulRefCount, NULL),S_OK);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
TESTC_(ReleaseRows(hRow),S_OK);
|
|
TESTC_(ReleaseRows(hRow),S_OK);
|
|
|
|
//NextFetchPosition should be unchanged
|
|
//Also the 2.0 spec indicates lRowOffset is ignored
|
|
TESTC_(GetNextRows(10000, 0, &hRow),S_OK);
|
|
//get the first row
|
|
TESTC_(pIRowsetLocate->GetRowsAt(NULL, NULL, cbBookmark, pBookmark, 0, 1, &cRowsObtained, &rghRows),S_OK);
|
|
TESTC(cRowsObtained == 1 && rghRows != NULL);
|
|
|
|
//get data for the first row
|
|
TESTC(VerifyRowHandles(rghRows[0], FIRST_ROW));
|
|
TESTC_(ReleaseRows(cRowsObtained, rghRows),S_OK);
|
|
PROVIDER_FREE(rghRows);
|
|
|
|
//the cursor is at the third row right now
|
|
TESTC(VerifyGetNextRows(1, 1, THIRD_ROW));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
ReleaseRows(cRowsObtained, rghRows);
|
|
PROVIDER_FREE(rghRows);
|
|
PROVIDER_FREE(pBookmark);
|
|
SAFE_RELEASE(pIRowsetLocate);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
//}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(4)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc E_INVALIDARG GetData call with previous error object existing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_4()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HROW hRow = NULL;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//get one row handle
|
|
TESTC_(GetNextRows(0, 1, &hRow),S_OK);
|
|
TESTC(VerifyRowHandles(hRow, FIRST_ROW));
|
|
|
|
m_pExtError->CauseError();
|
|
|
|
TESTC_(hr = pIRowset()->GetData(hRow, m_hAccessor, NULL),E_INVALIDARG);
|
|
TESTC(XCHECK(pIRowset(), IID_IRowset, hr));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
//}}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(5)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc E_INVALIDARG AddRefRows call with previous error object existing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_5()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HROW hRow = NULL;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
m_pExtError->CauseError();
|
|
|
|
TESTC_(hr = pIRowset()->AddRefRows(1, NULL, NULL, NULL),E_INVALIDARG);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
//}}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(6)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc DB_E_ROWSNOTRELEASED RestartPosition call with previous error object existing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_6()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
HROW hRow = NULL;
|
|
ULONG ulRefCount = 0;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_ALLFROMTBL)==S_OK);
|
|
|
|
//retrieve one row
|
|
TESTC_(GetNextRows(0, 1, &hRow),S_OK);
|
|
TESTC(VerifyRowHandles(hRow, FIRST_ROW));
|
|
|
|
//NextFetchPosition should not be changed
|
|
TESTC_(GetNextRows(0, 0, &hRow),S_OK);
|
|
|
|
//addRef the row
|
|
TESTC_(pIRowset()->AddRefRows(1, &hRow, &ulRefCount, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 2));
|
|
TESTC_(ReleaseRows(hRow),S_OK);
|
|
|
|
m_pExtError->CauseError();
|
|
|
|
//call RestartPosition
|
|
hr = RestartPosition();
|
|
TEST3C_(hr, S_OK, DB_S_COMMANDREEXECUTED, DB_E_ROWSNOTRELEASED);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
|
|
//release the first row
|
|
TESTC_(ReleaseRows(hRow),S_OK);
|
|
|
|
if(hr == S_OK)
|
|
{
|
|
TESTC_(GetNextRows(1, 1, &hRow),S_OK);
|
|
TESTC(VerifyRowHandles(hRow, SECOND_ROW));
|
|
}
|
|
else if(hr == DB_E_ROWSNOTRELEASED)
|
|
{
|
|
TESTC_(GetNextRows(1, 1, &hRow),S_OK);
|
|
TESTC(VerifyRowHandles(hRow, THIRD_ROW));
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(7)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc DB_S_ENDOFROWSET GetNextRows call with previous error object existing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_7()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW hRow = NULL;
|
|
ULONG ulRefCount = 0;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_EMPTYROWSET)==S_OK);
|
|
|
|
//count the row number in the rowset
|
|
TESTC(GetTotalRows() == 0);
|
|
m_pExtError->CauseError();
|
|
|
|
//fetch one row forward
|
|
TESTC_(hr = GetNextRows(0, 1, &cRowsObtained, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
TESTC(cRowsObtained == 0 && hRow == DB_NULL_HROW);
|
|
|
|
m_pExtError->CauseError();
|
|
|
|
//skip one row forward and fetch one row forward
|
|
hr = GetNextRows(LONG_MAX, 1, &cRowsObtained, &hRow);
|
|
TEST3C_(hr, DB_S_ENDOFROWSET, E_OUTOFMEMORY, DB_E_BADSTARTPOSITION);
|
|
TESTC(cRowsObtained == 0 && hRow == DB_NULL_HROW);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
//}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(8)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc E_INVALIDARG ReleaseRows call with previous error object existing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_8()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
ULONG cRowsObtained = 0;
|
|
HROW hRow = NULL;
|
|
ULONG ulRefCount = 0;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
m_pExtError->CauseError();
|
|
|
|
TESTC_(hr = pIRowset()->ReleaseRows(2, NULL, NULL, NULL, NULL),E_INVALIDARG);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
//}}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(9)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc E_INVALIDARG GetData call with no previous error object existing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_9()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
ULONG cRowsObtained = 0;
|
|
HROW hRow = NULL;
|
|
ULONG ulRefCount = 0;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//get one row handle
|
|
TESTC_(GetNextRows(0, 1, &hRow),S_OK);
|
|
TESTC(VerifyRowHandles(hRow, FIRST_ROW));
|
|
|
|
//GetData
|
|
TESTC_(hr = pIRowset()->GetData(hRow, m_hAccessor, NULL),E_INVALIDARG);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
|
|
//ReleaseRows
|
|
TESTC_(ReleaseRows(hRow),S_OK);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
//}}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(10)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc E_INVALIDARG AddRefRows call with no previous error object existing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_10()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
ULONG cRowsObtained = 0;
|
|
HROW hRow = NULL;
|
|
ULONG ulRefCount = 0;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
TESTC_(hr = pIRowset()->AddRefRows(1, NULL, NULL, NULL),E_INVALIDARG);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
//}}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(11)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc DB_E_ROWSNOTRELEASED RestartPosition call with no previous error object existing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_11()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
ULONG cRowsObtained = 0;
|
|
HROW hRow = NULL;
|
|
ULONG ulRefCount = 0;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
//retrieve one row
|
|
TESTC_(GetNextRows(0, 1, &hRow),S_OK);
|
|
TESTC(VerifyRowHandles(hRow, FIRST_ROW));
|
|
|
|
//NextFetchPosition should not be changed
|
|
TESTC_(GetNextRows(0, 0, &hRow),S_OK);
|
|
//addRef the row
|
|
TESTC_(pIRowset()->AddRefRows(1, &hRow, &ulRefCount, NULL),S_OK);
|
|
TESTC(VerifyRefCounts(1, &ulRefCount, 2));
|
|
TESTC_(ReleaseRows(hRow),S_OK);
|
|
|
|
//call RestartPosition
|
|
hr = RestartPosition();
|
|
TEST3C_(hr, S_OK, DB_S_COMMANDREEXECUTED, DB_E_ROWSNOTRELEASED);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
|
|
//release the first row
|
|
TESTC_(ReleaseRows(hRow),S_OK);
|
|
|
|
if(hr == S_OK)
|
|
{
|
|
TESTC_(GetNextRows(1, 1, &hRow),S_OK);
|
|
TESTC(VerifyRowHandles(hRow, SECOND_ROW));
|
|
}
|
|
else if(hr == DB_E_ROWSNOTRELEASED)
|
|
{
|
|
TESTC_(GetNextRows(1, 1, &hRow),S_OK);
|
|
TESTC(VerifyRowHandles(hRow, THIRD_ROW));
|
|
}
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
// }}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(12)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc DB_S_ENDOFROWSET GetNextRows call with no previous error object existing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_12()
|
|
{
|
|
TBEGIN
|
|
HRESULT hr = S_OK;
|
|
|
|
DBCOUNTITEM cRowsObtained = 0;
|
|
HROW hRow = NULL;
|
|
ULONG ulRefCount = 0;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_EMPTYROWSET)==S_OK);
|
|
|
|
//count the row number in the rowset
|
|
TESTC(GetTotalRows() == 0);
|
|
|
|
//fetch one row forward
|
|
TESTC_(GetNextRows(0, 1, &cRowsObtained, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC(cRowsObtained == 0 && hRow == NULL);
|
|
|
|
//skip one row forward and fetch one row forward
|
|
TESTC_(hr = GetNextRows(1, 1, &cRowsObtained, &hRow), DB_S_ENDOFROWSET);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
TESTC(cRowsObtained == 0 && hRow == NULL);
|
|
|
|
CLEANUP:
|
|
ReleaseRows(hRow);
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
//}
|
|
|
|
|
|
// {{ TCW_VAR_PROTOTYPE(13)
|
|
//*-----------------------------------------------------------------------
|
|
// @mfunc E_INVALIDARG ReleaseRows call with no previous error object existing
|
|
//
|
|
// @rdesc TEST_PASS or TEST_FAIL
|
|
//
|
|
int ExtendedErrors::Variation_13()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
ULONG cRowsObtained = 0;
|
|
HROW* rghRows = NULL;
|
|
ULONG ulRefCount = 0;
|
|
|
|
//For each method of the interface, first create an error object on
|
|
//the current thread, try get a success from the IRowset method.
|
|
//We then check extended errors to verify the right extended error behavior.
|
|
|
|
//get the rowset, create an accessor. The rowset will only have 5 rows
|
|
TESTC_PROVIDER(CreateRowset(SELECT_VALIDATIONORDER)==S_OK);
|
|
|
|
TESTC_(hr = pIRowset()->ReleaseRows(2, NULL, NULL, NULL, NULL),E_INVALIDARG);
|
|
TESTC(XCHECK(m_pIRowset, IID_IRowset, hr));
|
|
|
|
CLEANUP:
|
|
DropRowset();
|
|
TRETURN
|
|
}
|
|
//}}
|
|
|
|
|
|
// {{ TCW_TERMINATE_METHOD
|
|
//--------------------------------------------------------------------
|
|
// @mfunc TestCase Termination Routine
|
|
//
|
|
// @rdesc TRUE or FALSE
|
|
//
|
|
BOOL ExtendedErrors::Terminate()
|
|
{
|
|
return TCIRowset::Terminate();
|
|
} // }}
|
|
|
|
// }}
|
|
|
|
|