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

5157 lines
144 KiB
C++

//--------------------------------------------------------------------
// Microsoft OLE DB Test
//
// Copyright 1995-2000 Microsoft Corporation.
//
// @doc
//
// @module ICMDPREP.CPP | Source code for ICommandPrepare.
//
#include "modstandard.hpp"
#define DBINITCONSTANTS // Must be defined to initialize constants in OLEDB.H
#define INITGUID
#include "icmdprep.h"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Module Values
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// {{ TCW_MODULE_GLOBALS
DECLARE_MODULE_CLSID = { 0x8f3ec2ae, 0x34b3, 0x11cf, { 0x98, 0xb8, 0x00, 0xaa, 0x00, 0x37, 0xda, 0x9b }};
DECLARE_MODULE_NAME("ICommandPrepare");
DECLARE_MODULE_OWNER("Microsoft");
DECLARE_MODULE_DESCRIP("Test module for ICommandPrepare interfaces");
DECLARE_MODULE_VERSION(832456171);
// TCW_WizardVersion(2)
// TCW_Automation(True)
// }} TCW_MODULE_GLOBALS_END
//--------------------------------------------------------------------
// @func Module level initialization routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleInit(CThisTestModule * pThisTestModule)
{
BOOL bValue = FALSE;
IDBCreateSession * pIDBCreateSession = NULL;
IDBCreateCommand * pIDBCreateCommand = NULL;
ICommand * pICommand = NULL;
ICommandPrepare * pICommandPrepare = NULL;
if(ModuleCreateDBSession(pThisTestModule))
{
// IDBCreateSession
if(!VerifyInterface(pThisTestModule->m_pIUnknown, IID_IDBCreateSession, DATASOURCE_INTERFACE, (IUnknown**)&pIDBCreateSession))
goto CLEANUP;
// IDBCreateCommand
if(!VerifyInterface(pThisTestModule->m_pIUnknown2, IID_IDBCreateCommand, SESSION_INTERFACE, (IUnknown**)&pIDBCreateCommand))
{
odtLog << L"IDBCreateCommand is not supported by Provider." << ENDL;
bValue = TEST_SKIPPED;
goto CLEANUP;
}
// Create a Command object
pIDBCreateCommand->CreateCommand(NULL, IID_ICommand,(IUnknown **)&pICommand);
if(pICommand)
{
// IDBCreateCommand
if(!VerifyInterface(pICommand, IID_ICommandPrepare, COMMAND_INTERFACE, (IUnknown**)&pICommandPrepare))
{
odtLog << L"ICommandPrepare is not supported by Provider." << ENDL;
bValue = TEST_SKIPPED;
goto CLEANUP;
}
// If we get here we passed
bValue = TRUE;
}
}
CLEANUP:
SAFE_RELEASE(pIDBCreateSession);
SAFE_RELEASE(pIDBCreateCommand);
SAFE_RELEASE(pICommand);
SAFE_RELEASE(pICommandPrepare);
return bValue;
}
//--------------------------------------------------------------------
// @func Module level termination routine
//
// @rdesc Success or Failure
// @flag TRUE | Successful initialization
// @flag FALSE | Initialization problems
//
BOOL ModuleTerminate(CThisTestModule * pThisTestModule)
{
//Free the interface we got in ModuleCreateDBSession()
return ModuleReleaseDBSession(pThisTestModule);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Base Class Section
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// @class CCommand Base Class for all ICommandPrepare Testcases
class CCommand : public COLEDB
{
public:
// @cmember Constructor
CCommand(LPWSTR wszTestCaseName) : COLEDB(wszTestCaseName)
{
m_pIDBCreateSession = NULL;
m_pIDBCreateCommand = NULL;
m_pCTable = NULL;
m_pCTCTbl = NULL;
};
// @cmember Destructor
virtual ~CCommand(){};
protected:
// @cmember Common base class initialization
virtual BOOL Init();
// @cmember Common base class termination
virtual BOOL Terminate();
// @mfunc Can the data type hold Numeric with a Scale
BOOL IsColNumWithScale
(
DBTYPE wType, // @parm [IN] Data type
ULONG bScale // @parm [IN] precision for the data type
);
// @mfunc Can the data type hold string values
BOOL IsColCharacter
(
DBTYPE wType, // @parm [IN] Data type
DBLENGTH ulColumnSize // @parm [IN] precision for the data type
);
// @mfunc Can the data type hold Date values
BOOL IsColDateTime
(
DBTYPE wType // @parm [IN] Data type
);
//@member Interface for DBSession Initialization
IDBCreateSession* m_pIDBCreateSession;
//@cmember Interface for DB Session, gotten by GetDBSession
IDBCreateCommand* m_pIDBCreateCommand;
//@cmember CTable object
CTable* m_pCTable;
//@cmember CTable object
CTable* m_pCTCTbl;
};
// @class CCommandZombie Base Class for all ICommandPrepare Transaction Testcases
class CCommandZombie : public CTransaction
{
public:
// @cmember Constructor
CCommandZombie(LPWSTR wszTestCaseName) : CTransaction(wszTestCaseName)
{
m_pICmdPrepare = NULL;
m_pIColInfo = NULL;
m_pTableName = NULL;
m_pwszSQLStmt = NULL;
m_rghRows = NULL;
m_rgInfo = NULL;
m_pStringsBuffer = NULL;
};
// @cmember Destructor
virtual ~CCommandZombie(){};
protected:
// @cmember Common base class initialization
virtual BOOL Init();
// @cmember Common base class termination
virtual BOOL Terminate();
//@mfunc Cleanup the Rowsets in the Transaction
void CleanupTransactionRowset(EINTERFACE eInterface, BOOL fRetaining);
//@member Interface for ICommandPrepare
ICommandPrepare * m_pICmdPrepare;
//@member Interface for IColumnsInfo
IColumnsInfo * m_pIColInfo;
//@member Interface for IColumnsInfo structs
DBCOLUMNINFO * m_rgInfo;
//@member Interface for IColumnsInfo strings
WCHAR * m_pStringsBuffer;
//@member Interface for IColumnsInfo
HROW * m_rghRows;
//@cmember CTablename
WCHAR * m_pTableName;
//@cmember SQL Statement
WCHAR * m_pwszSQLStmt;
};
//--------------------------------------------------------------------
// @mfunc Base class Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CCommand::Init()
{
BOOL fSuccess = FALSE;
ICommand* pICommand = NULL;
ICommandPrepare* pICommandPrepare = NULL;
if (COLEDB::Init())
{
//IDBCreateSession
if(!VerifyInterface(m_pThisTestModule->m_pIUnknown, IID_IDBCreateSession, DATASOURCE_INTERFACE, (IUnknown**)&m_pIDBCreateSession))
return FALSE;
//IDBCreateCommand
if(!VerifyInterface(m_pThisTestModule->m_pIUnknown2, IID_IDBCreateCommand, SESSION_INTERFACE, (IUnknown**)&m_pIDBCreateCommand))
goto END;
// Get a ICommand object
if (!CHECK(m_pIDBCreateCommand->CreateCommand(NULL, IID_ICommand,
(IUnknown **)&pICommand), S_OK))
goto END;
// Check to see if the provider supports ICommandPrepare
if (!VerifyInterface(pICommand, IID_ICommandPrepare, COMMAND_INTERFACE, (IUnknown **)&pICommandPrepare))
goto END;
// Create a table we'll use for the whole test case.
m_pCTable = new CTable(m_pIDBCreateCommand, (LPWSTR)gwszModuleName, USENULLS);
if (!m_pCTable)
{
odtLog << wszMemoryAllocationError;
goto END;
}
// Create a 2nd table we'll use for the whole test case.
m_pCTCTbl = new CTable(m_pIDBCreateCommand, (LPWSTR)gwszModuleName, USENULLS);
if (!m_pCTCTbl)
{
odtLog << wszMemoryAllocationError;
goto END;
}
fSuccess = TRUE;
}
END:
// Release objects
SAFE_RELEASE(pICommand);
SAFE_RELEASE(pICommandPrepare);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
//--------------------------------------------------------------------
// @mfunc Base Case Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CCommand::Terminate()
{
SAFE_RELEASE(m_pIDBCreateSession);
SAFE_RELEASE(m_pIDBCreateCommand);
SAFE_DELETE(m_pCTable);
SAFE_DELETE(m_pCTCTbl);
return(COLEDB::Terminate());
}
//--------------------------------------------------------------------
// @mfunc Base class Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL CCommandZombie::Init()
{
return(CTransaction::Init());
}
//--------------------------------------------------------------------
// @mfunc Base Case Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL CCommandZombie::Terminate()
{
return(CTransaction::Terminate());
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Test Case Section
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// {{ TCW_TEST_CASE_MAP(ICommandPrepare_Invalid_Cases)
//--------------------------------------------------------------------
// @class Invalid test variations for method ICommand::Prepare
//
class ICommandPrepare_Invalid_Cases : public CCommand {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ICommandPrepare_Invalid_Cases,CCommand);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember DB_E_ERRORSINCOMMAND - Create Table statement on a table that already exists [S0001]
int Variation_1();
// @cmember DB_E_ERRORSINCOMMAND - Create View statement on a view that already exists [S0001]
int Variation_2();
// @cmember DB_E_ERRORSINCOMMAND - Select statement with invalid table name [S0002]
int Variation_3();
// @cmember DB_E_ERRORSINCOMMAND - Drop Table statement on a table that does not exist [S0002]
int Variation_4();
// @cmember DB_E_ERRORSINCOMMAND - Drop View statement on a view that does not exist [S0002]
int Variation_5();
// @cmember DB_E_ERRORSINCOMMAND - Select statement with invalid column name [S0022]
int Variation_6();
// @cmember DB_E_NOCOMMAND - Prepare a Empty text string [S1009]
int Variation_7();
// @cmember DB_E_NOCOMMAND - Prepare after a NULL ppwszCommand is set
int Variation_8();
// @cmember S_OK - Numeric Truncation [01004]
int Variation_9();
// @cmember DB_E_DATAOVERFLOW - Arithmetic overflow [22003]
int Variation_10();
// @cmember DB_E_DATAOVERFLOW - String Right Truncation [22001]
int Variation_11();
// @cmember DB_E_CANTCONVERTVALUE - String Right Truncation [22005]
int Variation_12();
// @cmember DB_E_CANTCONVERTVALUE - Implicit conversion [22005]
int Variation_13();
// @cmember DB_E_CANTCONVERTVALUE - Implicit conversion [22008]
int Variation_14();
// @cmember DB_E_ERRORSINCOMMAND - Invalid nodes in a command [37000]
int Variation_15();
// @cmember DB_E_NOCOMMAND - Prepare before setting text
int Variation_16();
// @cmember DB_E_OBJECTOPEN - Prepare with an open Rowset Object
int Variation_17();
// @cmember DB_E_ERRORSINCOMMAND - Prepare an invalid escape clause
int Variation_18();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ICommandPrepare_Invalid_Cases)
#define THE_CLASS ICommandPrepare_Invalid_Cases
BEG_TEST_CASE(ICommandPrepare_Invalid_Cases, CCommand, L"Invalid test variations for method ICommand::Prepare")
TEST_VARIATION(1, L"DB_E_ERRORSINCOMMAND - Create Table statement on a table that already exists [S0001]")
TEST_VARIATION(2, L"DB_E_ERRORSINCOMMAND - Create View statement on a view that already exists [S0001]")
TEST_VARIATION(3, L"DB_E_ERRORSINCOMMAND - Select statement with invalid table name [S0002]")
TEST_VARIATION(4, L"DB_E_ERRORSINCOMMAND - Drop Table statement on a table that does not exist [S0002]")
TEST_VARIATION(5, L"DB_E_ERRORSINCOMMAND - Drop View statement on a view that does not exist [S0002]")
TEST_VARIATION(6, L"DB_E_ERRORSINCOMMAND - Select statement with invalid column name [S0022]")
TEST_VARIATION(7, L"DB_E_NOCOMMAND - Prepare a Empty text string [S1009]")
TEST_VARIATION(8, L"DB_E_NOCOMMAND - Prepare after a NULL ppwszCommand is set")
TEST_VARIATION(9, L"S_OK - Numeric Truncation [01004]")
TEST_VARIATION(10, L"DB_E_DATAOVERFLOW - Arithmetic overflow [22003]")
TEST_VARIATION(11, L"DB_E_DATAOVERFLOW - String Right Truncation [22001]")
TEST_VARIATION(12, L"DB_E_CANTCONVERTVALUE - String Right Truncation [22005]")
TEST_VARIATION(13, L"DB_E_CANTCONVERTVALUE - Implicit conversion [22005]")
TEST_VARIATION(14, L"DB_E_CANTCONVERTVALUE - Implicit conversion [22008]")
TEST_VARIATION(15, L"DB_E_ERRORSINCOMMAND - Invalid nodes in a command [37000]")
TEST_VARIATION(16, L"DB_E_NOCOMMAND - Prepare before setting text")
TEST_VARIATION(17, L"DB_E_OBJECTOPEN - Prepare with an open Rowset Object")
TEST_VARIATION(18, L"DB_E_ERRORSINCOMMAND - Prepare an invalid escape clause")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(ICommandPrepare_Valid_Cases)
//--------------------------------------------------------------------
// @class Valid test variations for method ICommandPrepare::Prepare
//
class ICommandPrepare_Valid_Cases : public CCommand {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ICommandPrepare_Valid_Cases,CCommand);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember S_OK - Select statement with all columns
int Variation_1();
// @cmember S_OK - Prepare after IColumnsInfo::GetColumnInfo FAILS
int Variation_2();
// @cmember S_OK - IColumnsInfo::GetColumnInfo after Prepare
int Variation_3();
// @cmember S_OK - Prepare, SetCommandText, and IColumnsInfo
int Variation_4();
// @cmember S_OK - Prepare Fails, and IColumnsInfo
int Variation_5();
// @cmember S_OK - Prepare, Execute Fails, and IColumnsInfo
int Variation_6();
// @cmember S_OK - Prepare and then try to set Properties
int Variation_7();
// @cmember S_OK - Prepare an valid escape clause
int Variation_8();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ICommandPrepare_Valid_Cases)
#define THE_CLASS ICommandPrepare_Valid_Cases
BEG_TEST_CASE(ICommandPrepare_Valid_Cases, CCommand, L"Valid test variations for method ICommandPrepare::Prepare")
TEST_VARIATION(1, L"S_OK - Select statement with all columns")
TEST_VARIATION(2, L"S_OK - Prepare after IColumnsInfo::GetColumnInfo FAILS")
TEST_VARIATION(3, L"S_OK - IColumnsInfo::GetColumnInfo after Prepare")
TEST_VARIATION(4, L"S_OK - Prepare, SetCommandText, and IColumnsInfo")
TEST_VARIATION(5, L"S_OK - Prepare Fails, and IColumnsInfo")
TEST_VARIATION(6, L"S_OK - Prepare, Execute Fails, and IColumnsInfo")
TEST_VARIATION(7, L"S_OK - Prepare and then try to set Properties")
TEST_VARIATION(8, L"S_OK - Prepare an valid escape clause")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(ICommandPrepare_Trans_Cases)
//--------------------------------------------------------------------
// @class Transaction test variations for method ICommandPrepare::Prepare
//
class ICommandPrepare_Trans_Cases : public CCommandZombie {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ICommandPrepare_Trans_Cases,CCommandZombie);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember S_OK - Abort ICommandPrepare with fRetaining=TRUE
int Variation_1();
// @cmember S_OK - Commit ICommandPrepare with fRetaining=TRUE
int Variation_2();
// @cmember S_OK - Abort ICommandPrepare with fRetaining=FALSE
int Variation_3();
// @cmember S_OK - Commit ICommandPrepare with fRetaining=FALSE
int Variation_4();
// @cmember DB_E_OBJECTOPEN - Abort ICommandPrepare with fRetaining=TRUE
int Variation_5();
// @cmember DB_E_OBJECTOPEN - Commit ICommandPrepare with fRetaining=TRUE
int Variation_6();
// @cmember DB_E_OBJECTOPEN - Abort ICommandPrepare with fRetaining=FALSE
int Variation_7();
// @cmember DB_E_OBJECTOPEN - Commit ICommandPrepare with fRetaining=FALSE
int Variation_8();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ICommandPrepare_Trans_Cases)
#define THE_CLASS ICommandPrepare_Trans_Cases
BEG_TEST_CASE(ICommandPrepare_Trans_Cases, CCommandZombie, L"Transaction test variations for method ICommandPrepare::Prepare")
TEST_VARIATION(1, L"S_OK - Abort ICommandPrepare with fRetaining=TRUE")
TEST_VARIATION(2, L"S_OK - Commit ICommandPrepare with fRetaining=TRUE")
TEST_VARIATION(3, L"S_OK - Abort ICommandPrepare with fRetaining=FALSE")
TEST_VARIATION(4, L"S_OK - Commit ICommandPrepare with fRetaining=FALSE")
TEST_VARIATION(5, L"DB_E_OBJECTOPEN - Abort ICommandPrepare with fRetaining=TRUE")
TEST_VARIATION(6, L"DB_E_OBJECTOPEN - Commit ICommandPrepare with fRetaining=TRUE")
TEST_VARIATION(7, L"DB_E_OBJECTOPEN - Abort ICommandPrepare with fRetaining=FALSE")
TEST_VARIATION(8, L"DB_E_OBJECTOPEN - Commit ICommandPrepare with fRetaining=FALSE")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(ICommandUnprepare_Invalid_Cases)
//--------------------------------------------------------------------
// @class Invalid test variations for method ICommandPrepare::Unprepare
//
class ICommandUnprepare_Invalid_Cases : public CCommand {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ICommandUnprepare_Invalid_Cases,CCommand);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember DB_E_OBJECTOPEN - Unprepare with an open Rowset Object
int Variation_1();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ICommandUnprepare_Invalid_Cases)
#define THE_CLASS ICommandUnprepare_Invalid_Cases
BEG_TEST_CASE(ICommandUnprepare_Invalid_Cases, CCommand, L"Invalid test variations for method ICommandPrepare::Unprepare")
TEST_VARIATION(1, L"DB_E_OBJECTOPEN - Unprepare with an open Rowset Object")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(ICommandUnprepare_Valid_Cases)
//--------------------------------------------------------------------
// @class Valid test variations for method ICommandPrepare::Unprepare
//
class ICommandUnprepare_Valid_Cases : public CCommand {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ICommandUnprepare_Valid_Cases,CCommand);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember S_OK - Unprepare a Select statement with all columns
int Variation_1();
// @cmember S_OK - Unprepare and the IColumnsInfo::GetColumnInfo should FAILS
int Variation_2();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ICommandUnprepare_Valid_Cases)
#define THE_CLASS ICommandUnprepare_Valid_Cases
BEG_TEST_CASE(ICommandUnprepare_Valid_Cases, CCommand, L"Valid test variations for method ICommandPrepare::Unprepare")
TEST_VARIATION(1, L"S_OK - Unprepare a Select statement with all columns")
TEST_VARIATION(2, L"S_OK - Unprepare and the IColumnsInfo::GetColumnInfo should FAILS")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(ICommandUnprepare_Trans_Cases)
//--------------------------------------------------------------------
// @class Transaction test variations for method ICommandPrepare::Unprepare
//
class ICommandUnprepare_Trans_Cases : public CCommandZombie {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ICommandUnprepare_Trans_Cases,CCommandZombie);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember S_OK - Abort ICommandUnprepare with fRetaining=TRUE
int Variation_1();
// @cmember S_OK - Commit ICommandUnprepare with fRetaining=TRUE
int Variation_2();
// @cmember S_OK - Abort ICommandUnprepare with fRetaining=FALSE
int Variation_3();
// @cmember S_OK - Commit ICommandUnprepare with fRetaining=FALSE
int Variation_4();
// @cmember DB_E_OBJECTOPEN - Abort ICommandUnprepare with fRetaining=TRUE
int Variation_5();
// @cmember DB_E_OBJECTOPEN - Commit ICommandUnprepare with fRetaining=TRUE
int Variation_6();
// @cmember DB_E_OBJECTOPEN - Abort ICommandUnprepare with fRetaining=FALSE
int Variation_7();
// @cmember DB_E_OBJECTOPEN - Commit ICommandUnprepare with fRetaining=FALSE
int Variation_8();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ICommandUnprepare_Trans_Cases)
#define THE_CLASS ICommandUnprepare_Trans_Cases
BEG_TEST_CASE(ICommandUnprepare_Trans_Cases, CCommandZombie, L"Transaction test variations for method ICommandPrepare::Unprepare")
TEST_VARIATION(1, L"S_OK - Abort ICommandUnprepare with fRetaining=TRUE")
TEST_VARIATION(2, L"S_OK - Commit ICommandUnprepare with fRetaining=TRUE")
TEST_VARIATION(3, L"S_OK - Abort ICommandUnprepare with fRetaining=FALSE")
TEST_VARIATION(4, L"S_OK - Commit ICommandUnprepare with fRetaining=FALSE")
TEST_VARIATION(5, L"DB_E_OBJECTOPEN - Abort ICommandUnprepare with fRetaining=TRUE")
TEST_VARIATION(6, L"DB_E_OBJECTOPEN - Commit ICommandUnprepare with fRetaining=TRUE")
TEST_VARIATION(7, L"DB_E_OBJECTOPEN - Abort ICommandUnprepare with fRetaining=FALSE")
TEST_VARIATION(8, L"DB_E_OBJECTOPEN - Commit ICommandUnprepare with fRetaining=FALSE")
END_TEST_CASE()
#undef THE_CLASS
// }} TCW_TESTCASE_END
// }} TCW_TEST_CASE_MAP_END
// {{ TCW_TEST_CASE_MAP(ICommandPrep_ExtendedErrors)
//--------------------------------------------------------------------
// @class Extended Errors
//
class ICommandPrep_ExtendedErrors : public CCommand {
private:
// @cmember Static array of variations
DECLARE_TEST_CASE_DATA();
public:
// {{ TCW_DECLARE_FUNCS
// @cmember Execution Routine
DECLARE_TEST_CASE_FUNCS(ICommandPrep_ExtendedErrors,CCommand);
// }} TCW_DECLARE_FUNCS_END
// @cmember Initialization Routine
virtual BOOL Init();
// @cmember Termination Routine
virtual BOOL Terminate();
// {{ TCW_TESTVARS()
// @cmember Valid ICommandPrepare calls with previous error object existing.
int Variation_1();
// @cmember Invalid ICommandPrepare calls with previous error object existing
int Variation_2();
// @cmember Invalid Prepare call with no previous error object existing
int Variation_3();
// @cmember Invalid Unprepare call with no previous error object existing
int Variation_4();
// @cmember DB_E_ERRORINCOMMAND call with no previous error object existing
int Variation_5();
// }} TCW_TESTVARS_END
};
// {{ TCW_TESTCASE(ICommandPrep_ExtendedErrors)
#define THE_CLASS ICommandPrep_ExtendedErrors
BEG_TEST_CASE(ICommandPrep_ExtendedErrors, CCommand, L"Extended Errors")
TEST_VARIATION(1, L"Valid ICommandPrepare calls with previous error object existing.")
TEST_VARIATION(2, L"Invalid ICommandPrepare calls with previous error object existing")
TEST_VARIATION(3, L"Invalid Prepare call with no previous error object existing")
TEST_VARIATION(4, L"Invalid Unprepare call with no previous error object existing")
TEST_VARIATION(5, L"DB_E_ERRORINCOMMAND 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(7, ThisModule, gwszModuleDescrip)
TEST_CASE(1, ICommandPrepare_Invalid_Cases)
TEST_CASE(2, ICommandPrepare_Valid_Cases)
TEST_CASE(3, ICommandPrepare_Trans_Cases)
TEST_CASE(4, ICommandUnprepare_Invalid_Cases)
TEST_CASE(5, ICommandUnprepare_Valid_Cases)
TEST_CASE(6, ICommandUnprepare_Trans_Cases)
TEST_CASE(7, ICommandPrep_ExtendedErrors)
END_TEST_MODULE()
// }} TCW_TESTMODULE_END
// {{ TCW_TC_PROTOTYPE(ICommandPrepare_Invalid_Cases)
//*-----------------------------------------------------------------------
//| Test Case: ICommandPrepare_Invalid_Cases - Invalid test variations for method ICommand::Prepare
//| Created: 12/10/95
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandPrepare_Invalid_Cases::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(CCommand::Init())
// }}
{
// Create a table
if (CHECK(m_pCTable->CreateTable(5, 1, NULL, PRIMARY),S_OK))
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc DB_E_ERRORSINCOMMAND - Create Table statement on a table that already exists [S0001]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_1()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
//Check to see if the DSO is ReadOnly
if(GetProperty(DBPROP_DATASOURCEREADONLY, DBPROPSET_DATASOURCEINFO, m_pIDBCreateSession))
{
odtLog << L"Provider is ReadOnly." << ENDL;
return TEST_SKIPPED;
}
// Get the name of the table just created
pTableName = m_pCTable->GetTableName();
// Format SQL Statement
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) + (sizeof(WCHAR) *
(wcslen(wszCreateTable) + wcslen(pTableName))));
swprintf(pwszSQLStmt,wszCreateTable,pTableName);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
if (CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand), DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc DB_E_ERRORSINCOMMAND - Create View statement on a view that already exists [S0001]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_2()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
WCHAR* pViewName = NULL; // Name of the view
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
//Check to see if the DSO is ReadOnly
if(GetProperty(DBPROP_DATASOURCEREADONLY, DBPROPSET_DATASOURCEINFO, m_pIDBCreateSession))
{
odtLog << L"Provider is ReadOnly." << ENDL;
return TEST_SKIPPED;
}
// Drop View just in case if it exists, do not check error here
//in case of CONFPROV when tabledump generating SQL Statements it creates the View
m_pCTable->CreateSQLStmt(DROP_VIEW,
NULL, &pwszSQLStmt, NULL, NULL);
m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(CREATE_VIEW,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Create View
hr = m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand);
// Check to see if the create view failed
if (FAILED(hr)) {
odtLog<<L"Create view not supported" <<ENDL;
fSuccess = TRUE;
goto END;
}
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
if (CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand), DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Drop View
m_pCTable->DropView();
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc DB_E_ERRORSINCOMMAND - Select statement with invalid table name [S0002]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_3()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_INVALIDTBLNAME,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT. Some providers may return DB_E_NOTABLE here, which we
// will allow as it's more descriptive.
if (hr == S_OK)
{
hr = m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand);
}
if (hr == DB_E_ERRORSINCOMMAND || CHECK(hr, DB_E_NOTABLE))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc DB_E_ERRORSINCOMMAND - Drop Table statement on a table that does not exist [S0002]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_4()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
WCHAR* pszStartTblName = NULL;
//Check to see if the DSO is ReadOnly
if(GetProperty(DBPROP_DATASOURCEREADONLY, DBPROPSET_DATASOURCEINFO, m_pIDBCreateSession))
{
odtLog << L"Provider is ReadOnly." << ENDL;
return TEST_SKIPPED;
}
// Create a table
if (!CHECK(m_pCTCTbl->CreateTable(1,1,NULL,PRIMARY), S_OK))
goto END;
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTCTbl->CreateSQLStmt(DROP_TABLE,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Drop the table, also deletes the table name
m_pCTCTbl->DropTable();
//In the case of ini file pwszSQLStmt can still contain the name of main table
//confprov.ini contains DROP_TABLE with the main table name
// Just in case Replace the TableName
pszStartTblName = wcsstr(pwszSQLStmt, m_pCTable->GetTableName());
if (pszStartTblName)
*pszStartTblName = L'X';
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
if (CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand), DB_E_NOTABLE))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc DB_E_ERRORSINCOMMAND - Drop View statement on a view that does not exist [S0002]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_5()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
WCHAR* pViewName = NULL; // Name of the view
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
//Check to see if the DSO is ReadOnly
if(GetProperty(DBPROP_DATASOURCEREADONLY, DBPROPSET_DATASOURCEINFO, m_pIDBCreateSession))
{
odtLog << L"Provider is ReadOnly." << ENDL;
return TEST_SKIPPED;
}
/*
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(CREATE_VIEW,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Create View
hr = m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand);
// check to see if the create view failed
if (FAILED(hr))
{
odtLog<<L"Create view not supported" <<ENDL;
fSuccess = TRUE;
goto END;
}
// Drop View
m_pCTable->DropView();
PROVIDER_FREE(pwszSQLStmt);
*/
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(DROP_VIEW,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Drop View just in case if it exists, do not check error here
//In case of CONFPROV when tabledump generating SQL Statements it creates the View
//The second time whn executing DROP_VIEW we should receive error
m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
if (CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand), DB_E_NOTABLE))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc DB_E_ERRORSINCOMMAND - Select statement with invalid column name [S0022]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_6()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
WCHAR* pTableName = NULL; // Name of the table
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
// Get the name of the table just created
pTableName = m_pCTable->GetTableName();
// Alloc Memory
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC((sizeof(WCHAR) *
(wcslen(wszSelectBadColName) + wcslen(pTableName))) + sizeof(WCHAR) );
// Put the SQL statement together
swprintf(pwszSQLStmt, wszSelectBadColName, pTableName);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
if (CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand), DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc DB_E_NOCOMMAND - Prepare a Empty text string [S1009]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_7()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
ICommand* pICommand = NULL; // ICommand Object
ICommandText* pICommandText = NULL; // ICommandText Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
// Alloc Memory
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR));
// Make a Empty String Command
wcscpy(pwszSQLStmt, L"\0");
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// Get an ICommandText object
if (!CHECK(pICommand->QueryInterface(IID_ICommandText,(void **)&pICommandText),S_OK))
goto END;
// Set the SQL statement
if (!CHECK(pICommandText->SetCommandText(DBGUID_DEFAULT, pwszSQLStmt),S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (CHECK(pICommandPrep->Prepare(1), DB_E_NOCOMMAND))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE(pICommandText);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc DB_E_NOCOMMAND - Prepare after a NULL ppwszCommand is set
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_8()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
ICommand* pICommand = NULL; // ICommand Object
ICommandText* pICommandText = NULL; // ICommandText Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// Get an ICommandText object
if (!CHECK(pICommand->QueryInterface(IID_ICommandText,(void **)&pICommandText),S_OK))
goto END;
// Set the SQL statement
if (!CHECK(pICommandText->SetCommandText(DBGUID_DEFAULT, NULL),S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (CHECK(pICommandPrep->Prepare(1), DB_E_NOCOMMAND))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE(pICommandText);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(9)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Numeric Truncation [01004]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_9()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IUnknown * pRowset = NULL; // IRowset Object
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
WCHAR * pwszNumeric = NULL; // Numeric value
DBORDINAL pcColumns = 0; // Count of columns
ULONG ColScale = 0; // Column Scale
ULONG count = 0; // Loop counter
CList <WCHAR* ,WCHAR*> NativeTypesList;
CCol NewCol; // Class CCol
//Check to see if the DSO is ReadOnly
if(GetProperty(DBPROP_DATASOURCEREADONLY, DBPROPSET_DATASOURCEINFO, m_pIDBCreateSession))
{
odtLog << L"Provider is ReadOnly." << ENDL;
return TEST_SKIPPED;
}
//If we use ini file m_pCTCTbl->CreateTable doesn' t create a table but uses the table name from ini file
//so we can not really create a table with one column
//so we'll skip this variation otherwise it'll always fail in the case of ini file
if(GetModInfo()->GetFileName())
{
odtLog << L".ini file is used!!! Can not create a table with one column in this case" << ENDL;
return TEST_SKIPPED;
}
// Creates a column list from the Ctable
pcColumns = m_pCTable->CountColumnsOnTable();
// Loop thru column types
for(count=1; count <= pcColumns; count++)
{
m_pCTable->GetColInfo(count, NewCol);
// If first column is already numeric then were done
if (IsColNumWithScale(NewCol.GetProviderType(),
NewCol.GetScale()))
break;
}
// If No numeric column, skip out of the test
if(count > pcColumns)
{
odtLog << L"Provider does not support a Numeric Column." << ENDL;
return TEST_SKIPPED;
}
NativeTypesList.AddHead(NewCol.GetProviderTypeName());
// Create a table
if(!CHECK(m_pCTCTbl->CreateTable(NativeTypesList,1,1,NULL,PRIMARY), S_OK))
goto END;
// Get the name of the table just created
pTableName = m_pCTCTbl->GetTableName();
// Get Numeric Scale
ColScale = NewCol.GetScale();
// Alloc Memory
pwszNumeric = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) +
(sizeof(WCHAR)*(ColScale+3)));
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) + (sizeof(WCHAR) *
(wcslen(wszInsertInvalidValue) + wcslen(pTableName) + (ColScale+3))));
// Create Numeric Valus out of range
wcscpy(pwszNumeric, L"1.");
for(count=1; count <= ColScale+1; count++)
wcscat(pwszNumeric, L"1");
// Format SQL Statement
swprintf(pwszSQLStmt, wszInsertInvalidValue, pTableName, pwszNumeric);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTCTbl->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
// Execute the Command
if (CHECK(hr=pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset), S_OK))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, S_OK))
fSuccess = TRUE;
}
END:
// Free memory in the list
NativeTypesList.RemoveAll();
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
PROVIDER_FREE(pwszNumeric);
// Drop the table
m_pCTCTbl->DropTable();
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(10)
//*-----------------------------------------------------------------------
// @mfunc DB_E_DATAOVERFLOW - Arithmetic overflow [22003]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_10()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IUnknown * pRowset = NULL; // IRowset Object
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
WCHAR * pwszNumeric = NULL; // Numeric value
DBORDINAL pcColumns = 0; // Count of columns
ULONG ColPrec = 0; // Column Precision
ULONG count = 0; // Loop counter
CList <WCHAR *, WCHAR *> DBTypeList;
CCol NewCol; // Class CCol
//Check to see if the DSO is ReadOnly
if(GetProperty(DBPROP_DATASOURCEREADONLY, DBPROPSET_DATASOURCEINFO, m_pIDBCreateSession))
{
odtLog << L"Provider is ReadOnly." << ENDL;
return TEST_SKIPPED;
}
// Creates a column list from the Ctable
pcColumns = m_pCTable->CountColumnsOnTable();
// Loop thru column types
for(count=1; count <= pcColumns; count++)
{
m_pCTable->GetColInfo(count, NewCol);
// If first column is already numeric then were done
if( (IsColNumWithScale(NewCol.GetProviderType(),NewCol.GetScale())) &&
(NewCol.GetUpdateable()) )
break;
}
// If No numeric column, skip out of the test
if(count > pcColumns)
{
odtLog << L"Provider does not support an Updatable Numeric Column." << ENDL;
m_pCTCTbl->DropTable();
return TEST_SKIPPED;
}
DBTypeList.AddHead(NewCol.GetProviderTypeName());
// Create a table
if (!CHECK(m_pCTCTbl->CreateTable(DBTypeList,1,1,NULL,PRIMARY), S_OK))
goto END;
// Get the name of the table just created
pTableName = m_pCTCTbl->GetTableName();
// Get Numeric Precision
ColPrec = NewCol.GetPrecision();
// Alloc Memory
pwszNumeric= (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) +
(sizeof(WCHAR)*(ColPrec+1)));
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) + (sizeof(WCHAR) *
(wcslen(wszInsertInvalidValue) + wcslen(pTableName) + ColPrec+1)));
// Create Numeric Valus out of range
wcscpy(pwszNumeric, L"\0");
for(count=1; count <= ColPrec+1; count++)
wcscat(pwszNumeric, L"9");
// Format SQL Statement
swprintf(pwszSQLStmt, wszInsertInvalidValue, pTableName, pwszNumeric);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTCTbl->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
// Execute the Command
if (CHECK(hr=pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset), DB_E_DATAOVERFLOW))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Free memory in the list
DBTypeList.RemoveAll();
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
PROVIDER_FREE(pwszNumeric);
// Drop the table
m_pCTCTbl->DropTable();
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(11)
//*-----------------------------------------------------------------------
// @mfunc DB_E_DATAOVERFLOW - String Right Truncation [22001]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_11()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IUnknown * pRowset = NULL; // IRowset Object
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pwszSQLStmt1 = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
WCHAR * pTableNCpy = NULL; // Copy of the Table Name
WCHAR * pwszValue = NULL; // String value
DBORDINAL pcColumns = 0; // Count of columns
DBLENGTH ColSize = 0; // Column Size
ULONG count = 0; // Loop counter
CCol NewCol; // Class CCol
//Check to see if the DSO is ReadOnly
if(GetProperty(DBPROP_DATASOURCEREADONLY, DBPROPSET_DATASOURCEINFO, m_pIDBCreateSession))
{
odtLog << L"Provider is ReadOnly." << ENDL;
return TEST_SKIPPED;
}
// Create a table
if (!CHECK(m_pCTCTbl->CreateTable(1,1,NULL,PRIMARY), S_OK))
goto END;
// Creates a column list from the Ctable
pcColumns = m_pCTCTbl->CountColumnsOnTable();
// Loop thru column types
for(count=1; count <= pcColumns; count++)
{
m_pCTCTbl->GetColInfo(count, NewCol);
// If first column is already character then were done
if (IsColCharacter(NewCol.GetProviderType(),
NewCol.GetColumnSize()))
break;
}
// If no string column, skip out of the test
if((count > pcColumns) || (!NewCol.GetProviderTypeName()))
{
odtLog << L"Provider does not support a String Column " << ENDL;
odtLog << L"or the provider does not support type names." << ENDL;
return TEST_SKIPPED;
}
// Get the name of the table just created
pTableName = m_pCTCTbl->GetTableName();
// Get a copy of the table name
pTableNCpy = (WCHAR *) PROVIDER_ALLOC((wcslen(pTableName) *
sizeof(WCHAR)) + sizeof(WCHAR));
wcscpy(pTableNCpy, pTableName);
// Get Column Size
ColSize = NewCol.GetMaxSize();
// Create a table
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) + (sizeof(WCHAR) *
(wcslen(wszCreateStringTable) + wcslen(pTableNCpy) +
(NewCol.GetProviderTypeName() ? wcslen(NewCol.GetProviderTypeName()) :0) + 3)));
// Format SQL Statement
swprintf(pwszSQLStmt, wszCreateStringTable, pTableNCpy,
(NewCol.GetProviderTypeName() ? NewCol.GetProviderTypeName() :L""), ColSize-1);
// Drop the table, also deletes the table name
m_pCTCTbl->DropTable();
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTCTbl->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// Set the TableName
m_pCTCTbl->SetTableName(pTableNCpy);
// Alloc Memory
pwszValue= (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) +
(sizeof(WCHAR)*(ColSize)));
pwszSQLStmt1= (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) + (sizeof(WCHAR) *
(wcslen(wszInsertInvalidCharValue) + wcslen(pTableNCpy) + ColSize)));
// Create String value out of range
wcscpy(pwszValue, L"\0");
for(count=1; count <= ColSize; count++)
wcscat(pwszValue, L"A");
// Format SQL Statement
swprintf(pwszSQLStmt1, wszInsertInvalidCharValue, pTableNCpy, pwszValue);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTCTbl->BuildCommand(pwszSQLStmt1, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
// Execute the Command
if (CHECK(hr=pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset), DB_E_DATAOVERFLOW))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pTableNCpy);
PROVIDER_FREE(pwszSQLStmt);
PROVIDER_FREE(pwszSQLStmt1);
PROVIDER_FREE(pwszValue);
// Drop the table
m_pCTCTbl->DropTable();
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(12)
//*-----------------------------------------------------------------------
// @mfunc DB_E_CANTCONVERTVALUE - String Right Truncation [22005]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_12()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IUnknown * pRowset = NULL; // IRowset Object
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
WCHAR * pwszValue = NULL; // String value
DBORDINAL pcColumns = 0; // Count of columns
DBLENGTH ColSize = 0; // Column Size
ULONG count = 0; // Loop counter
CList <WCHAR* ,WCHAR*> NativeTypesList;
CCol NewCol; // Class CCol
//Check to see if the DSO is ReadOnly
if(GetProperty(DBPROP_DATASOURCEREADONLY, DBPROPSET_DATASOURCEINFO, m_pIDBCreateSession))
{
odtLog << L"Provider is ReadOnly." << ENDL;
return TEST_SKIPPED;
}
// Creates a column list from the Ctable
pcColumns = m_pCTable->CountColumnsOnTable();
// Loop thru column types
for(count=1; count <= pcColumns; count++)
{
m_pCTable->GetColInfo(count, NewCol);
// If first column is already character then were done
if (IsColCharacter(NewCol.GetProviderType(),
NewCol.GetColumnSize()))
break;
}
// If no string column, skip out of the test
if((count > pcColumns) || (!NewCol.GetProviderTypeName()))
{
odtLog << L"Provider does not support a String Column." << ENDL;
odtLog << L"or the provider does not support type names." << ENDL;
return TEST_SKIPPED;
}
NativeTypesList.AddHead(NewCol.GetProviderTypeName());
// Create a table
if (!CHECK(m_pCTCTbl->CreateTable(NativeTypesList,1,1,NULL,PRIMARY), S_OK))
goto END;
// Get the name of the table just created
pTableName = m_pCTCTbl->GetTableName();
// Get Column Size
ColSize = NewCol.GetMaxSize();
// Alloc Memory
pwszValue= (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) +
(sizeof(WCHAR)*(ColSize+1)));
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) + (sizeof(WCHAR) *
(wcslen(wszInsertInvalidCharValue) + wcslen(pTableName) + ColSize+1)));
// Create String value out of range
wcscpy(pwszValue, L"\0");
for(count=1; count <= ColSize+1; count++)
wcscat(pwszValue, L"A");
// Format SQL Statement
swprintf(pwszSQLStmt, wszInsertInvalidCharValue, pTableName, pwszValue);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTCTbl->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
// Execute the Command
if (CHECK(hr=pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset), DB_E_DATAOVERFLOW))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Free memory in the list
NativeTypesList.RemoveAll();
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
PROVIDER_FREE(pwszValue);
// Drop the table
m_pCTCTbl->DropTable();
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(13)
//*-----------------------------------------------------------------------
// @mfunc DB_E_CANTCONVERTVALUE - Implicit conversion [22005]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_13()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IUnknown * pRowset = NULL; // IRowset Object
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
DBORDINAL pcColumns = 0; // Count of columns
ULONG count = 0; // Loop counter
CList <WCHAR *, WCHAR *> DBTypeList;
CCol NewCol; // Class CCol
//Check to see if the DSO is ReadOnly
if(GetProperty(DBPROP_DATASOURCEREADONLY, DBPROPSET_DATASOURCEINFO, m_pIDBCreateSession))
{
odtLog << L"Provider is ReadOnly." << ENDL;
return TEST_SKIPPED;
}
// Creates a column list from the Ctable
pcColumns = m_pCTable->CountColumnsOnTable();
// Loop thru column types
for(count=1; count <= pcColumns; count++)
{
m_pCTable->GetColInfo(count, NewCol);
// If first column is already numeric then were done
if ((IsNumericType(NewCol.GetProviderType())) &&
(NewCol.GetUpdateable()))
break;
}
// If No numeric column, skip out of the test
if(count > pcColumns|| (!NewCol.GetProviderTypeName()))
{
odtLog << L"Provider does not support an Updatable Numeric Column." << ENDL;
odtLog << L"or the provider does not support type names." << ENDL;
return TEST_SKIPPED;
}
DBTypeList.AddHead(NewCol.GetProviderTypeName());
// Create a table
if (!CHECK(m_pCTCTbl->CreateTable(DBTypeList,1,1,NULL,PRIMARY), S_OK))
goto END;
// Get the name of the table just created
pTableName = m_pCTCTbl->GetTableName();
// Alloc Memory
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) + (sizeof(WCHAR) *
(wcslen(wszInsertInvalidChar) + wcslen(pTableName))));
// Format SQL Statement
swprintf(pwszSQLStmt, wszInsertInvalidChar, pTableName);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTCTbl->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
// Execute the Command
if (CHECK(hr=pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset), DB_E_CANTCONVERTVALUE))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Free memory in the list
DBTypeList.RemoveAll();
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
// Drop the table
m_pCTCTbl->DropTable();
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(14)
//*-----------------------------------------------------------------------
// @mfunc DB_E_CANTCONVERTVALUE - Implicit conversion [22008]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_14()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IUnknown * pRowset = NULL; // IRowset Object
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
WCHAR * pPrefix = NULL; // Prefix of DataType
WCHAR * pSuffix = NULL; // Suffix of DataType
DBORDINAL pcColumns = 0; // Count of columns
ULONG count = 0; // Loop counter
CList <DBTYPE, DBTYPE> DBTypeList;
CCol NewCol; // Class CCol
//Check to see if the DSO is ReadOnly
if(GetProperty(DBPROP_DATASOURCEREADONLY, DBPROPSET_DATASOURCEINFO, m_pIDBCreateSession))
{
odtLog << L"Provider is ReadOnly." << ENDL;
return TEST_SKIPPED;
}
//If we use ini file m_pCTCTbl->CreateTable doesn' t create a table but uses the table name from ini file
//so we can not really create a table with one column
//so we'll skip this variation otherwise it'll always fail in the case of ini file
if(GetModInfo()->GetFileName())
{
odtLog << L"ini file is used!!! Can not create a table with one column in this case" << ENDL;
return TEST_SKIPPED;
}
// Creates a column list from the Ctable
pcColumns = m_pCTable->CountColumnsOnTable();
// Loop thru column types
for( count=1; count <= pcColumns; count++)
{
m_pCTable->GetColInfo(count, NewCol);
// If first column is already DateTime then were done
if (IsColDateTime(NewCol.GetProviderType()))
break;
}
// If No numeric column, skip out of the test
if(count > pcColumns)
{
odtLog << L"Provider does not support a Date/Time Column." << ENDL;
return TEST_SKIPPED;
}
DBTypeList.AddHead(NewCol.GetProviderType());
// Create a table
if (!CHECK(m_pCTCTbl->CreateTable(DBTypeList,1,1,NULL,PRIMARY), S_OK))
goto END;
// Get the name of the table just created
pTableName = m_pCTCTbl->GetTableName();
// Get DataType Prefix
pPrefix = NewCol.GetPrefix();
// Get DataType Suffix
pSuffix = NewCol.GetSuffix();
// Alloc Memory
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) +
(sizeof(WCHAR) * (wcslen(wszInsertInvalidDateValue) +
wcslen(pTableName) +
(pPrefix ? wcslen(pPrefix) : 0) +
(pSuffix ? wcslen(pSuffix) : 0) +
wcslen(wszInvalidDateTime))));
// Format SQL Statement
swprintf(pwszSQLStmt, wszInsertInvalidDateValue, pTableName,
(pPrefix ? pPrefix : L""), wszInvalidDateTime, (pSuffix ? pSuffix : L""));
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTCTbl->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
// Execute the Command
if (CHECK(hr=pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset), DB_E_CANTCONVERTVALUE))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Free memory in the list
DBTypeList.RemoveAll();
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
// Drop the table
m_pCTCTbl->DropTable();
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(15)
//*-----------------------------------------------------------------------
// @mfunc DB_E_ERRORSINCOMMAND - Invalid nodes in a command [37000]
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_15()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
WCHAR * pwszSQLStmt = NULL; // SQL Statement
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
// Alloc Memory
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC((sizeof(WCHAR) *
(wcslen(wszSelectBadSelect))) + sizeof(WCHAR));
// Put the SQL statement together
wcscpy(pwszSQLStmt, wszSelectBadSelect);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
if (CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand), DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(16)
//*-----------------------------------------------------------------------
// @mfunc DB_E_NOCOMMAND - Prepare before setting text
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_16()
{
BOOL fSuccess = FALSE; // Variation passed or failed
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
// Create a command object ourselves
if (!CHECK(m_pIDBCreateCommand->CreateCommand(NULL,IID_ICommand,
(IUnknown**)&pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (CHECK(pICommandPrep->Prepare(1), DB_E_NOCOMMAND))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(17)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - Prepare with an open Rowset Object
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_17()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IRowset* pIRowset = NULL; // Array of IRowsets
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Execute Command to return a Rowset
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, (IUnknown **)&pIRowset, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (CHECK(pICommandPrep->Prepare(1), DB_E_OBJECTOPEN))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pIRowset)
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(18)
//*-----------------------------------------------------------------------
// @mfunc DB_E_ERRORSINCOMMAND - Prepare an invalid escape clause
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Invalid_Cases::Variation_18()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IUnknown * pRowset = NULL; // IRowset Object
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
// Check the SQL Support of the Provider
if( !(m_pCTable->GetSQLSupport() & DBPROPVAL_SQL_ESCAPECLAUSES) )
{
odtLog << L"Provider does not support escape clauses." << ENDL;
return TEST_SKIPPED;
}
// Get the name of the table just created
pTableName = m_pCTable->GetTableName();
// Alloc Memory
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC((sizeof(WCHAR) *
(wcslen(L"Select {Convert(} from ") + wcslen(pTableName))) + sizeof(WCHAR));
// Format SQL Statement
swprintf(pwszSQLStmt, L"Select {Convert(} from %s", pTableName);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTCTbl->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
// Execute the Command
if (CHECK(hr=pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset), DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
else
{
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
END:
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandPrepare_Invalid_Cases::Terminate()
{
// Drop the table
if (m_pCTable)
m_pCTable->DropTable();
return(CCommand::Terminate());
}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(ICommandPrepare_Valid_Cases)
//*-----------------------------------------------------------------------
//| Test Case: ICommandPrepare_Valid_Cases - Valid test variations for method ICommandPrepare::Prepare
//| Created: 12/10/95
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandPrepare_Valid_Cases::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(CCommand::Init())
// }}
{
// Create a table
if (CHECK(m_pCTable->CreateTable(5,1,NULL,PRIMARY), S_OK))
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Select statement with all columns
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Valid_Cases::Variation_1()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommandPrepare Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
CHECK(hr=pICommandPrep->Prepare(0), S_OK);
if (CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
fSuccess = TRUE;
END:
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Prepare after IColumnsInfo::GetColumnInfo FAILS
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Valid_Cases::Variation_2()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
ICommand* pICommand = NULL; // ICommandPrepare Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IColumnsInfo* pIColumnsInfo = NULL; // IColumnsInfo Object
DBORDINAL cColumns = 0; // Number of Columns in Rowset
DBCOLUMNINFO* rgInfo = NULL; // Info Structure
WCHAR* pStringsBuffer = NULL; // String Buffer
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for IColumnsInfo
if (!CHECK(pICommand->QueryInterface(IID_IColumnsInfo,
(void **)&pIColumnsInfo), S_OK))
goto END;
// Call IColumnsInfo::GetInfo and expect it to return DB_E_NOTPREPARED
if (!CHECK(pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo,
&pStringsBuffer), DB_E_NOTPREPARED))
goto END;
// Compare Results from the DB_E_NOTPREPARED call
COMPARE(cColumns, 0);
COMPARE(rgInfo, NULL);
COMPARE(pStringsBuffer, NULL);
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (CHECK(pICommandPrep->Prepare(ULONG_MAX), S_OK))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc S_OK - IColumnsInfo::GetColumnInfo after Prepare
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Valid_Cases::Variation_3()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
ICommand* pICommand = NULL; // ICommandPrepare Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IColumnsInfo* pIColumnsInfo = NULL; // IColumnsInfo Object
DBORDINAL cColumns = 0; // Number of Columns in Rowset
DBCOLUMNINFO* rgInfo = NULL; // Info Structure
WCHAR* pStringsBuffer = NULL; // String Buffer
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (!CHECK(pICommandPrep->Prepare(1), S_OK))
goto END;
// QI for IColumnsInfo
if (!CHECK(pICommand->QueryInterface(IID_IColumnsInfo,
(void **)&pIColumnsInfo), S_OK))
goto END;
// Call IColumnsInfo::GetInfo and expect it to return S_OK
if (CHECK(pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo,
&pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, pIColumnsInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
fSuccess = TRUE;
}
END:
// Release Objects
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Prepare, SetCommandText, and IColumnsInfo
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Valid_Cases::Variation_4()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
ICommand* pICommand = NULL; // ICommandPrepare Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IColumnsInfo* pIColumnsInfo = NULL; // IColumnsInfo Object
DBORDINAL cColumns = 0; // Number of Columns in Rowset
DBCOLUMNINFO* rgInfo = NULL; // Info Structure
WCHAR* pStringsBuffer = NULL; // String Buffer
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Create a ICommandPrepare Object
if (!CHECK(m_pIDBCreateCommand->CreateCommand(NULL, IID_ICommandPrepare,
(IUnknown **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (!CHECK(pICommandPrep->Prepare(1), DB_E_NOCOMMAND))
goto END;
// Command to return a ICommand with SetText
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for IColumnsInfo
if (!CHECK(pICommand->QueryInterface(IID_IColumnsInfo,
(void **)&pIColumnsInfo), S_OK))
goto END;
// Call IColumnsInfo::GetInfo and expect it to return DB_E_NOTPREPARED
if (CHECK(pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo,
&pStringsBuffer), DB_E_NOTPREPARED))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Prepare Fails, and IColumnsInfo
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Valid_Cases::Variation_5()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommandPrepare Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IColumnsInfo* pIColumnsInfo = NULL; // IColumnsInfo Object
IUnknown * pRowset = NULL; // IRowset Object
DBORDINAL cColumns = 0; // Number of Columns in Rowset
DBCOLUMNINFO* rgInfo = NULL; // Info Structure
WCHAR* pStringsBuffer = NULL; // String Buffer
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
WCHAR * pPrefix = NULL; // Prefix of DataType
WCHAR * pSuffix = NULL; // Suffix of DataType
DBORDINAL pcColumns = 0; // Count of columns
ULONG count = 0; // Loop counter
CList <DBTYPE, DBTYPE> DBTypeList;
CCol NewCol; // Class CCol
// Creates a column list from the Ctable
pcColumns = m_pCTable->CountColumnsOnTable();
// Loop thru column types
for(count=1; count <= pcColumns; count++)
{
m_pCTable->GetColInfo(count, NewCol);
// If first column is already DateTime then were done
if (IsColDateTime(NewCol.GetProviderType()))
break;
}
// If No numeric column, skip out of the test
if(count > pcColumns)
{
odtLog << L"Provider does not support a Date/Time Column." << ENDL;
m_pCTCTbl->DropTable();
return TEST_SKIPPED;
}
DBTypeList.AddHead(NewCol.GetProviderType());
// Create a table
if (!CHECK(m_pCTCTbl->CreateTable(DBTypeList,1,1,NULL,PRIMARY), S_OK))
{
// Free memory in the list
DBTypeList.RemoveAll();
return TEST_FAIL;
}
// Get the name of the table just created
pTableName = m_pCTCTbl->GetTableName();
// Get DataType Prefix
pPrefix = NewCol.GetPrefix();
// Get DataType Suffix
pSuffix = NewCol.GetSuffix();
// Alloc Memory
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) +
(sizeof(WCHAR) * (wcslen(wszInsertInvalidDateValue) +
wcslen(pTableName) +
(pPrefix ? wcslen(pPrefix) : 0) +
(pSuffix ? wcslen(pSuffix) : 0) +
wcslen(wszInvalidDateTime))));
// Format SQL Statement
swprintf(pwszSQLStmt, wszInsertInvalidDateValue, pTableName,
(pPrefix ? pPrefix : L""), wszInvalidDateTime, (pSuffix ? pSuffix : L""));
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for IColumnsInfo
if (!CHECK(pICommand->QueryInterface(IID_IColumnsInfo,
(void **)&pIColumnsInfo), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
// Execute the Command
hr=pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset);
if(SUCCEEDED(hr))
goto END;
// Call IColumnsInfo::GetColumnInfo
hr = pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo, &pStringsBuffer);
if (FAILED(hr))
CHECK(hr, E_FAIL);
else
CHECK(hr, S_OK);
// Check the return values
COMPARE(cColumns, 0);
COMPARE(rgInfo, NULL);
COMPARE(pStringsBuffer, NULL);
fSuccess = TRUE;
}
else
{
// Check HResult
CHECK(hr, DB_E_ERRORSINCOMMAND);
// Call IColumnsInfo::GetInfo and expect it to return DB_E_NOTPREPARED
if (CHECK(pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo,
&pStringsBuffer), DB_E_NOTPREPARED))
{
COMPARE(cColumns, 0);
fSuccess = TRUE;
}
}
END:
// Free memory in the list
DBTypeList.RemoveAll();
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
// Drop the table
m_pCTCTbl->DropTable();
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Prepare, Execute Fails, and IColumnsInfo
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Valid_Cases::Variation_6()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
WCHAR* pTableName = NULL; // Name of the table
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommandPrepare Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
ICommandWithParameters* pICommandParam = NULL; // ICommandWithParameters Object
IColumnsInfo* pIColumnsInfo = NULL; // IColumnsInfo Object
IUnknown * pRowset = NULL; // IRowset Object
DBORDINAL cColumns = 0; // Number of Columns in Rowset
DBCOLUMNINFO* rgInfo = NULL; // Info Structure
WCHAR* pStringsBuffer = NULL; // String Buffer
CCol NewCol; // Class CCol
// Create a table
if (!CHECK(m_pCTCTbl->CreateTable(1,1,NULL,PRIMARY), S_OK))
return TEST_FAIL;
// Get the column name
m_pCTCTbl->GetColInfo(1, NewCol);
// Get the name of the table just created
pTableName = m_pCTCTbl->GetTableName();
// Alloc Memory
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC((sizeof(WCHAR) *
(wcslen(wszSelectParam) + wcslen(pTableName) + wcslen(NewCol.GetColName())))
+ sizeof(WCHAR));
// Put the SQL statement together
swprintf(pwszSQLStmt, wszSelectParam, pTableName, NewCol.GetColName());
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for IColumnsInfo
if (!CHECK(pICommand->QueryInterface(IID_IColumnsInfo,
(void **)&pIColumnsInfo), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr = pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
// Execute the Command
hr = pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset);
// If Parameters are supported
if(VerifyInterface(pICommandPrep, IID_ICommandWithParameters, COMMAND_INTERFACE, (IUnknown**)&pICommandParam))
CHECK(hr, DB_E_PARAMNOTOPTIONAL);
else
CHECK(hr, DB_E_ERRORSINCOMMAND);
// Call IColumnsInfo::GetInfo and expect it to return S_OK
hr = pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo, &pStringsBuffer);
if (FAILED(hr))
CHECK(hr, E_FAIL);
else
CHECK(hr, S_OK);
fSuccess = TRUE;
}
else
{
// Check HResult
CHECK(hr, DB_E_ERRORSINCOMMAND);
// Call IColumnsInfo::GetInfo and expect it to return DB_E_NOTPREPARED
if (CHECK(pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo,
&pStringsBuffer), DB_E_NOTPREPARED))
{
COMPARE(cColumns, 0);
fSuccess = TRUE;
}
}
END:
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE(pICommandParam);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
// Drop the table
m_pCTCTbl->DropTable();
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Prepare and then try to set Properties
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Valid_Cases::Variation_7()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IUnknown * pRowset = NULL; // IRowset Object
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (!CHECK(pICommandPrep->Prepare(1), S_OK))
goto END;
// Check to see if the Property is supported
if( (SettableProperty(DBPROP_OWNINSERT, DBPROPSET_ROWSET, m_pIDBCreateSession)) ||
(GetProperty(DBPROP_OWNINSERT, DBPROPSET_ROWSET, m_pIDBCreateSession)) )
CHECK(hr=SetRowsetProperty(pICommand, DBPROPSET_ROWSET, DBPROP_OWNINSERT), S_OK);
else
{
hr=SetRowsetProperty(pICommand, DBPROPSET_ROWSET, DBPROP_OWNINSERT);
if(SUCCEEDED(hr))
{
CHECKW(hr, DB_E_ERRORSOCCURRED);
odtLog <<wszPropertySet;
}
else
CHECK(hr, DB_E_ERRORSOCCURRED);
}
// Execute the Command
if (CHECK(hr=pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset), S_OK))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Prepare an valid escape clause
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Valid_Cases::Variation_8()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IUnknown * pRowset = NULL; // IRowset Object
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
// Check the SQL Support of the Provider
if( !(m_pCTable->GetSQLSupport() & DBPROPVAL_SQL_ESCAPECLAUSES) )
{
odtLog << L"Provider does not support escape clauses." << ENDL;
return TEST_SKIPPED;
}
// Get the name of the table just created
pTableName = m_pCTable->GetTableName();
// Alloc Memory
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC((sizeof(WCHAR) *
(wcslen(L"Select {d '1993-10-10'} from ") + wcslen(pTableName))) + sizeof(WCHAR));
// Format SQL Statement
swprintf(pwszSQLStmt, L"Select {d '1993-10-10'} from %s", pTableName);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTCTbl->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
CHECK(hr=pICommandPrep->Prepare(1), S_OK);
// Execute the Command
if (CHECK(hr=pICommand->Execute(NULL,IID_IRowset,0, NULL, &pRowset), S_OK))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pRowset);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandPrepare_Valid_Cases::Terminate()
{
// Drop the table
if (m_pCTable)
m_pCTable->DropTable();
return(CCommand::Terminate());
}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(ICommandPrepare_Trans_Cases)
//*-----------------------------------------------------------------------
//| Test Case: ICommandPrepare_Trans_Cases - Transaction test variations for method ICommandPrepare::Prepare
//| Created: 12/10/95
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandPrepare_Trans_Cases::Init()
{
// Check to see if Transactions are usable
if(!IsUsableInterface(SESSION_INTERFACE, IID_ITransactionLocal))
return TEST_SKIPPED;
// Initialize to a invalid pointer
m_pITransactionLocal = INVALID(ITransactionLocal*);
// {{ TCW_INIT_BASECLASS_CHECK
if (CCommandZombie::Init())
// }}
{
// Register the Interface
if (!RegisterInterface(COMMAND_INTERFACE, IID_ICommandPrepare, 0, NULL))
return FALSE;
// Create a SQL Stmt and Set the Command
if (CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &m_pwszSQLStmt, NULL, NULL), S_OK))
return TRUE;
}
// Check to see if ITransaction is supported
if(!m_pITransactionLocal)
return TEST_SKIPPED;
// Clear the bad pointer value
if(m_pITransactionLocal == INVALID(ITransactionLocal*))
m_pITransactionLocal = NULL;
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Abort ICommandPrepare with fRetaining=TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Trans_Cases::Variation_1()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained= 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Abort the transaction with fRetaining==TRUE
if (!GetAbort(TRUE))
goto END;
// Test zombie
if (!m_fAbortPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Cleanup Transactions
CleanupTransactionRowset(ROWSET_INTERFACE, TRUE);
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareAbortPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Prepare the SQL Statement
if (CHECK(m_pICmdPrepare->Prepare(1), S_OK))
fSuccess = TRUE;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, TRUE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Commit ICommandPrepare with fRetaining=TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Trans_Cases::Variation_2()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Commit the transaction with fRetaining==TRUE
if (!GetCommit(TRUE))
goto END;
// Test zombie
if (!m_fCommitPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Cleanup Transactions
CleanupTransactionRowset(ROWSET_INTERFACE, TRUE);
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareCommitPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Prepare the SQL Statement
if (CHECK(m_pICmdPrepare->Prepare(1), S_OK))
fSuccess = TRUE;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, TRUE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Abort ICommandPrepare with fRetaining=FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Trans_Cases::Variation_3()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Abort the transaction with fRetaining==FALSE
if (!GetAbort(FALSE))
goto END;
// Test zombie
if (!m_fAbortPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Cleanup Transactions
CleanupTransactionRowset(ROWSET_INTERFACE, FALSE);
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareAbortPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Prepare the SQL Statement
if (CHECK(m_pICmdPrepare->Prepare(1), S_OK))
fSuccess = TRUE;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, FALSE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Commit ICommandPrepare with fRetaining=FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Trans_Cases::Variation_4()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Commit the transaction with fRetaining==FALSE
if (!GetCommit(FALSE))
goto END;
// Test zombie
if (!m_fCommitPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Cleanup Transactions
CleanupTransactionRowset(ROWSET_INTERFACE, FALSE);
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareCommitPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Prepare the SQL Statement
if (CHECK(m_pICmdPrepare->Prepare(1), S_OK))
fSuccess = TRUE;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, FALSE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - Abort ICommandPrepare with fRetaining=TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Trans_Cases::Variation_5()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Abort the transaction with fRetaining==TRUE
if (!GetAbort(TRUE))
goto END;
// Test zombie
if (!m_fAbortPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Release the row handle on the 1st rowset
if (m_rghRows)
{
CHECK(m_pIRowset->ReleaseRows(1, m_rghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(m_rghRows);
}
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareAbortPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Prepare the SQL Statement
if (CHECK(m_pICmdPrepare->Prepare(1), DB_E_OBJECTOPEN))
fSuccess = TRUE;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, TRUE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - Commit ICommandPrepare with fRetaining=TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Trans_Cases::Variation_6()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Commit the transaction with fRetaining==TRUE
if (!GetCommit(TRUE))
goto END;
// Test zombie
if (!m_fCommitPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Release the row handle on the 1st rowset
if (m_rghRows)
{
CHECK(m_pIRowset->ReleaseRows(1, m_rghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(m_rghRows);
}
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareCommitPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Prepare the SQL Statement
if (CHECK(m_pICmdPrepare->Prepare(1), DB_E_OBJECTOPEN))
fSuccess = TRUE;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, TRUE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - Abort ICommandPrepare with fRetaining=FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Trans_Cases::Variation_7()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Abort the transaction with fRetaining==FALSE
if (!GetAbort(FALSE))
goto END;
// Test zombie
if (!m_fAbortPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Release the row handle on the 1st rowset
if (m_rghRows)
{
CHECK(m_pIRowset->ReleaseRows(1, m_rghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(m_rghRows);
}
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareAbortPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Prepare the SQL Statement
if (CHECK(m_pICmdPrepare->Prepare(1), DB_E_OBJECTOPEN))
fSuccess = TRUE;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, FALSE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - Commit ICommandPrepare with fRetaining=FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrepare_Trans_Cases::Variation_8()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Commit the transaction with fRetaining==FALSE
if (!GetCommit(FALSE))
goto END;
// Test zombie
if (!m_fCommitPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Release the row handle on the 1st rowset
if (m_rghRows)
{
CHECK(m_pIRowset->ReleaseRows(1, m_rghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(m_rghRows);
}
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareCommitPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Prepare the SQL Statement
if (CHECK(m_pICmdPrepare->Prepare(1), DB_E_OBJECTOPEN))
fSuccess = TRUE;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, FALSE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandPrepare_Trans_Cases::Terminate()
{
// Release Objects
SAFE_RELEASE(m_pIColInfo);
SAFE_RELEASE(m_pICmdPrepare);
// Free Memory
PROVIDER_FREE(m_pwszSQLStmt);
return(CCommandZombie::Terminate());
}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(ICommandUnprepare_Invalid_Cases)
//*-----------------------------------------------------------------------
//| Test Case: ICommandUnprepare_Invalid_Cases - Invalid test variations for method ICommandPrepare::Unprepare
//| Created: 12/10/95
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandUnprepare_Invalid_Cases::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(CCommand::Init())
// }}
{
// Create a table
if (CHECK(m_pCTable->CreateTable(5,1,NULL,PRIMARY), S_OK))
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - Unprepare with an open Rowset Object
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Invalid_Cases::Variation_1()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IRowset* pIRowset = NULL; // IRowset Object
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Execute Command to return a Rowset
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, (IUnknown**)&pIRowset, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (CHECK(pICommandPrep->Unprepare(), DB_E_OBJECTOPEN))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandUnprepare_Invalid_Cases::Terminate()
{
// Drop the table
if (m_pCTable)
m_pCTable->DropTable();
return(CCommand::Terminate());
}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(ICommandUnprepare_Valid_Cases)
//*-----------------------------------------------------------------------
//| Test Case: ICommandUnprepare_Valid_Cases - Valid test variations for method ICommandPrepare::Unprepare
//| Created: 12/10/95
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandUnprepare_Valid_Cases::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(CCommand::Init())
// }}
{
// Create a table
if (CHECK(m_pCTable->CreateTable(5,1,NULL,PRIMARY), S_OK))
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Unprepare a Select statement with all columns
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Valid_Cases::Variation_1()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Unprepare the SQL Statement
if (!CHECK(pICommandPrep->Unprepare(), S_OK))
goto END;
// Prepare the SQL Statement
if (!CHECK(pICommandPrep->Prepare(1), S_OK))
goto END;
// Unprepare the SQL Statement
if (CHECK(pICommandPrep->Unprepare(), S_OK))
fSuccess = TRUE;
END:
// Release Objects
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Unprepare and the IColumnsInfo::GetColumnInfo should FAILS
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Valid_Cases::Variation_2()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
ICommand* pICommand = NULL; // ICommandPrepare Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IColumnsInfo* pIColumnsInfo = NULL; // IColumnsInfo Object
DBORDINAL cColumns = 0; // Number of Columns in Rowset
DBCOLUMNINFO* rgInfo = NULL; // Info Structure
WCHAR* pStringsBuffer = NULL; // String Buffer
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (!CHECK(pICommandPrep->Prepare(1), S_OK))
goto END;
// Unprepare the SQL Statement
if (!CHECK(pICommandPrep->Unprepare(), S_OK))
goto END;
// QI for IColumnsInfo
if (!CHECK(pICommand->QueryInterface(IID_IColumnsInfo,
(void **)&pIColumnsInfo), S_OK))
goto END;
// Call IColumnsInfo::GetInfo and expect it to return DB_E_NOTPREPARED
if (CHECK(pIColumnsInfo->GetColumnInfo(&cColumns, &rgInfo,
&pStringsBuffer), DB_E_NOTPREPARED))
{
// Compare Results from the DB_E_NOTPREPARED
COMPARE(cColumns, 0);
COMPARE(rgInfo, NULL);
COMPARE(pStringsBuffer, NULL);
fSuccess = TRUE;
}
END:
// Release Objects
SAFE_RELEASE(pIColumnsInfo);
SAFE_RELEASE(pICommandPrep);
SAFE_RELEASE_(pICommand);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
PROVIDER_FREE(rgInfo);
PROVIDER_FREE(pStringsBuffer);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandUnprepare_Valid_Cases::Terminate()
{
// Drop the table
if (m_pCTable)
m_pCTable->DropTable();
return(CCommand::Terminate());
}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(ICommandUnprepare_Trans_Cases)
//*-----------------------------------------------------------------------
//| Test Case: ICommandUnprepare_Trans_Cases - Transaction test variations for method ICommandPrepare::Unprepare
//| Created: 12/10/95
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandUnprepare_Trans_Cases::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if (CCommandZombie::Init())
// }}
{
// Register the Interface
if (!RegisterInterface(COMMAND_INTERFACE, IID_ICommandPrepare, 0, NULL))
return FALSE;
// Create a SQL Stmt and Set the Command
if (CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &m_pwszSQLStmt, NULL, NULL), S_OK))
return TRUE;
}
// Check to see if ITransaction is supported
if(!m_pITransactionLocal)
return TEST_SKIPPED;
// Clear the bad pointer value
if(m_pITransactionLocal == INVALID(ITransactionLocal*))
m_pITransactionLocal = NULL;
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Abort ICommandUnprepare with fRetaining=TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Trans_Cases::Variation_1()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Abort the transaction with fRetaining==TRUE
if (!GetAbort(TRUE))
goto END;
// Test zombie
if (!m_fAbortPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Cleanup the Rowset objects in the transaction
CleanupTransactionRowset(ROWSET_INTERFACE, TRUE);
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareAbortPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Unprepare the SQL Statement
if (CHECK(m_pICmdPrepare->Unprepare(), S_OK))
fSuccess = TEST_PASS;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, TRUE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Commit ICommandUnprepare with fRetaining=TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Trans_Cases::Variation_2()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Commit the transaction with fRetaining==TRUE
if (!GetCommit(TRUE))
goto END;
// Test zombie
if (!m_fCommitPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Cleanup the Rowset objects in the transaction
CleanupTransactionRowset(ROWSET_INTERFACE, TRUE);
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareCommitPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Unprepare the SQL Statement
if (CHECK(m_pICmdPrepare->Unprepare(), S_OK))
fSuccess = TEST_PASS;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, TRUE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Abort ICommandUnprepare with fRetaining=FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Trans_Cases::Variation_3()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Abort the transaction with fRetaining==FALSE
if (!GetAbort(FALSE))
goto END;
// Test zombie
if (!m_fAbortPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Cleanup the Rowset objects in the transaction
CleanupTransactionRowset(ROWSET_INTERFACE, FALSE);
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareAbortPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Unprepare the SQL Statement
if (CHECK(m_pICmdPrepare->Unprepare(), S_OK))
fSuccess = TEST_PASS;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, FALSE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc S_OK - Commit ICommandUnprepare with fRetaining=FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Trans_Cases::Variation_4()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Commit the transaction with fRetaining==FALSE
if (!GetCommit(FALSE))
goto END;
// Test zombie
if (!m_fCommitPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Cleanup the Rowset objects in the transaction
CleanupTransactionRowset(ROWSET_INTERFACE, FALSE);
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareCommitPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Unprepare the SQL Statement
if (CHECK(m_pICmdPrepare->Unprepare(), S_OK))
fSuccess = TEST_PASS;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, FALSE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - Abort ICommandUnprepare with fRetaining=TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Trans_Cases::Variation_5()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Abort the transaction with fRetaining==TRUE
if (!GetAbort(TRUE))
goto END;
// Test zombie
if (!m_fAbortPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Release the row handle on the 1st rowset
if (m_rghRows)
{
CHECK(m_pIRowset->ReleaseRows(1, m_rghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(m_rghRows);
}
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareAbortPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Unprepare the SQL Statement
CHECK(m_pICmdPrepare->Unprepare(), DB_E_OBJECTOPEN);
// Cleanup Transactions
CleanupTransactionRowset(ROWSET_INTERFACE, TRUE);
// Unprepare the SQL Statement
if (CHECK(m_pICmdPrepare->Unprepare(), S_OK))
fSuccess = TEST_PASS;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, TRUE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(6)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - Commit ICommandUnprepare with fRetaining=TRUE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Trans_Cases::Variation_6()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Commit the transaction with fRetaining==TRUE
if (!GetCommit(TRUE))
goto END;
// Test zombie
if (!m_fCommitPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Release the row handle on the 1st rowset
if (m_rghRows)
{
CHECK(m_pIRowset->ReleaseRows(1, m_rghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(m_rghRows);
}
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareCommitPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Unprepare the SQL Statement
CHECK(m_pICmdPrepare->Unprepare(), DB_E_OBJECTOPEN);
// Cleanup Transactions
CleanupTransactionRowset(ROWSET_INTERFACE, TRUE);
// Unprepare the SQL Statement
if (CHECK(m_pICmdPrepare->Unprepare(), S_OK))
fSuccess = TEST_PASS;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, TRUE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(7)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - Abort ICommandUnprepare with fRetaining=FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Trans_Cases::Variation_7()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Abort the transaction with fRetaining==FALSE
if (!GetAbort(FALSE))
goto END;
// Test zombie
if (!m_fAbortPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Release the row handle on the 1st rowset
if (m_rghRows)
{
CHECK(m_pIRowset->ReleaseRows(1, m_rghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(m_rghRows);
}
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareAbortPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Unprepare the SQL Statement
CHECK(m_pICmdPrepare->Unprepare(), DB_E_OBJECTOPEN);
// Cleanup Transactions
CleanupTransactionRowset(ROWSET_INTERFACE, FALSE);
// Unprepare the SQL Statement
if (CHECK(m_pICmdPrepare->Unprepare(), S_OK))
fSuccess = TEST_PASS;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, FALSE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(8)
//*-----------------------------------------------------------------------
// @mfunc DB_E_OBJECTOPEN - Commit ICommandUnprepare with fRetaining=FALSE
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandUnprepare_Trans_Cases::Variation_8()
{
BOOL fSuccess = FALSE; // Variation passed or failed
DBCOUNTITEM cRowsObtained = 0; // Number of rows returned, should be 1
DBORDINAL cColumns = 0; // Number of Columns in Rowset
// Retrieve an Interface pointer to ICommandPrepare within a Transaction
if (!StartTransaction(SELECT_ALLFROMTBL, (IUnknown **)&m_pICmdPrepare,
0, NULL, NULL, ISOLATIONLEVEL_READUNCOMMITTED, TRUE))
goto END;
// Commit the transaction with fRetaining==FALSE
if (!GetCommit(FALSE))
goto END;
// Test zombie
if (!m_fCommitPreserve)
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), E_UNEXPECTED);
else
CHECK(m_pIRowset->GetNextRows(0,0,1,&cRowsObtained,&m_rghRows), S_OK);
// Release the row handle on the 1st rowset
if (m_rghRows)
{
CHECK(m_pIRowset->ReleaseRows(1, m_rghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(m_rghRows);
}
// QI for IColumnsInfo
if (!CHECK(m_pICmdPrepare->QueryInterface(IID_IColumnsInfo,
(void **)&m_pIColInfo), S_OK))
goto END;
// Call IColumnsInfo::GetColumnInfo
if (!m_fPrepareCommitPreserve)
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), DB_E_NOTPREPARED))
COMPARE(cColumns, 0);
}
else
{
if (CHECK(m_pIColInfo->GetColumnInfo(&cColumns, &m_rgInfo,
&m_pStringsBuffer), S_OK))
{
// Add 1 to the to the count if Bookmarks are on
if (GetProperty(DBPROP_BOOKMARKS, DBPROPSET_ROWSET, m_pIColInfo))
COMPARE(cColumns, m_pCTable->CountColumnsOnTable()+1);
else
COMPARE(cColumns, m_pCTable->CountColumnsOnTable());
}
}
// Unprepare the SQL Statement
CHECK(m_pICmdPrepare->Unprepare(), DB_E_OBJECTOPEN);
// Cleanup Transactions
CleanupTransactionRowset(ROWSET_INTERFACE, FALSE);
// Unprepare the SQL Statement
if (CHECK(m_pICmdPrepare->Unprepare(), S_OK))
fSuccess = TEST_PASS;
END:
// Cleanup Transactions
CleanupTransactionRowset(COMMAND_INTERFACE, FALSE);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandUnprepare_Trans_Cases::Terminate()
{
// Release Objects
SAFE_RELEASE(m_pIColInfo);
SAFE_RELEASE_(m_pICmdPrepare);
// Free Memory
PROVIDER_FREE(m_pwszSQLStmt);
return(CCommandZombie::Terminate());
}
// }}
// }}
// {{ TCW_TC_PROTOTYPE(ICommandPrep_ExtendedErrors)
//*-----------------------------------------------------------------------
//| Test Case: ICommandPrep_ExtendedErrors - Extended Errors
//| Created: 07/08/96
//| Updated: 04/25/98
//*-----------------------------------------------------------------------
//--------------------------------------------------------------------
// @mfunc TestCase Initialization Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandPrep_ExtendedErrors::Init()
{
// {{ TCW_INIT_BASECLASS_CHECK
if(CCommand::Init())
// }}
{
// Create a table
if( CHECK(m_pCTable->CreateTable(5, // Number of rows to insert
1, // Column to put index on
NULL, // Table name
PRIMARY), // Primary or secondary values
S_OK) )
return TRUE;
}
return FALSE;
}
// {{ TCW_VAR_PROTOTYPE(1)
//*-----------------------------------------------------------------------
// @mfunc Valid ICommandPrepare calls with previous error object existing.
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrep_ExtendedErrors::Variation_1()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommandPrepare Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
//For each method of the interface, first create an error object on
//the current thread, then try get S_OK from the ICommandPrepare method.
//We then check extended errors to verify nothing is set since an
//error object shouldn't exist following a successful call.
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
//cause an error object
m_pExtError->CauseError();
// Prepare the SQL Statement
if (CHECK(hr = pICommandPrep->Prepare(1), S_OK))
{
//Do extended check following Prepare
fSuccess = XCHECK(pICommandPrep, IID_ICommandPrepare, hr);
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
}
else
goto END;
//cause an error object
m_pExtError->CauseError();
if (CHECK(hr = pICommandPrep->Unprepare(), S_OK))
//Do extended check following Unprepare
fSuccess &= XCHECK(pICommandPrep, IID_ICommandPrepare, hr);
else
fSuccess &=FALSE;
END:
// Release Objects
SAFE_RELEASE(pICommand);
SAFE_RELEASE_(pICommandPrep);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(2)
//*-----------------------------------------------------------------------
// @mfunc Invalid ICommandPrepare calls with previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrep_ExtendedErrors::Variation_2()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IRowset* pIRowset = NULL; // Array of IRowsets
//For each method of the interface, first create an error object on
//the current thread, then try get a failure from the ICommandPrepare method.
//We then check extended errors to verify the right extended error behavior.
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Execute Command to return a Rowset
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, (IUnknown **)&pIRowset, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
//cause an error object
m_pExtError->CauseError();
// Prepare the SQL Statement
if (CHECK(hr=pICommandPrep->Prepare(1), DB_E_OBJECTOPEN))
//Do extended check following Prepare
fSuccess = XCHECK(pICommandPrep, IID_ICommandPrepare, hr);
else
goto END;
m_pExtError->CauseError();
if (CHECK(hr=pICommandPrep->Unprepare(), DB_E_OBJECTOPEN))
//Do extended check following Unprepare
fSuccess &= XCHECK(pICommandPrep, IID_ICommandPrepare, hr);
else
fSuccess &= FALSE;
END:
// Release Objects
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pICommand);
SAFE_RELEASE_(pICommandPrep);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(3)
//*-----------------------------------------------------------------------
// @mfunc Invalid Prepare call with no previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrep_ExtendedErrors::Variation_3()
{
HRESULT hr = E_FAIL;
BOOL fSuccess = FALSE; // Variation passed or failed
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
//For the method of the interface, with no error object on
//the current thread, try get a failure from the ICommandPrepare method.
//We then check extended errors to verify the right extended error behavior.
// Create a command object ourselves
if (!CHECK(m_pIDBCreateCommand->CreateCommand(NULL,IID_ICommand,
(IUnknown**)&pICommand), S_OK))
return TEST_FAIL;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (CHECK(hr=pICommandPrep->Prepare(1), DB_E_NOCOMMAND))
//Do extended check following Prepare
fSuccess = XCHECK(pICommandPrep, IID_ICommandPrepare, hr);
END:
// Release Objects
SAFE_RELEASE(pICommand);
SAFE_RELEASE_(pICommandPrep);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(4)
//*-----------------------------------------------------------------------
// @mfunc Invalid Unprepare call with no previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrep_ExtendedErrors::Variation_4()
{
BOOL fSuccess = FALSE; // Variation passed or failed
WCHAR* pwszSQLStmt = NULL; // SQL Statement
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
IRowset* pIRowset = NULL; // IRowset Object
//For the method of the interface, with no error object on
//the current thread, try get a failure from the ICommandPrepare method.
//We then check extended errors to verify the right extended error behavior.
// Create a SQL Stmt and Set the Command
if (!CHECK(m_pCTable->CreateSQLStmt(SELECT_ALLFROMTBL,
NULL, &pwszSQLStmt, NULL, NULL), S_OK))
goto END;
// Execute Command to return a Rowset
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, (IUnknown**)&pIRowset, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
if (CHECK(hr=pICommandPrep->Unprepare(), DB_E_OBJECTOPEN))
//Do extended check following Prepare
fSuccess = XCHECK(pICommandPrep, IID_ICommandPrepare, hr);
END:
// Release Objects
SAFE_RELEASE(pIRowset);
SAFE_RELEASE(pICommand);
SAFE_RELEASE_(pICommandPrep);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
// }}
// {{ TCW_VAR_PROTOTYPE(5)
//*-----------------------------------------------------------------------
// @mfunc DB_E_ERRORINCOMMAND call with no previous error object existing
//
// @rdesc TEST_PASS or TEST_FAIL
//
int ICommandPrep_ExtendedErrors::Variation_5()
{
BOOL fSuccess = FALSE; // Variation passed or failed
HRESULT hr = E_FAIL; // HRESULT
ICommand* pICommand = NULL; // ICommand Object
ICommandPrepare* pICommandPrep = NULL; // ICommandPrepare Object
WCHAR * pwszSQLStmt = NULL; // SQL Statement
WCHAR * pTableName = NULL; // Name of the table
//For the method of the interface returning DB_E_NOCOMMAND, with no error object
//on the current thread, try get a failure from the ICommandPrepare method.
//We then check extended errors to verify the right extended error behavior.
// Get the name of the table just created
pTableName = m_pCTable->GetTableName();
pwszSQLStmt = (WCHAR *) PROVIDER_ALLOC(sizeof(WCHAR) + (sizeof(WCHAR) *
(wcslen(wszCreateTable) + wcslen(pTableName))) );
// Format SQL Statement
swprintf(pwszSQLStmt, wszCreateTable, pTableName);
// Command to return a ICommand with Text Set
if (!CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_NEVER, 0, NULL, NULL, NULL, NULL, &pICommand), S_OK))
goto END;
// QI for ICommandPrepare
if (!CHECK(pICommand->QueryInterface(IID_ICommandPrepare,
(void **)&pICommandPrep), S_OK))
goto END;
// Prepare the SQL Statement
hr= pICommandPrep->Prepare(1);
// Compare the HRESULT
if (hr == S_OK)
{
if(CHECK(m_pCTable->BuildCommand(pwszSQLStmt, IID_IRowset,
EXECUTE_IFNOERROR, 0, NULL, NULL, NULL, NULL, &pICommand), DB_E_ERRORSINCOMMAND))
fSuccess = TRUE;
}
else
{
// Do extended check following Prepare
if (CHECK(hr, DB_E_ERRORSINCOMMAND))
fSuccess = XCHECK(pICommandPrep, IID_ICommandPrepare, hr);
}
END:
// Release Objects
SAFE_RELEASE(pICommand);
SAFE_RELEASE_(pICommandPrep);
// Free Memory
PROVIDER_FREE(pwszSQLStmt);
if (fSuccess)
return TEST_PASS;
else
return TEST_FAIL;
}
//}}
// {{ TCW_TERMINATE_METHOD
//--------------------------------------------------------------------
// @mfunc TestCase Termination Routine
//
// @rdesc TRUE or FALSE
//
BOOL ICommandPrep_ExtendedErrors::Terminate()
{
// Drop the table
if (m_pCTable)
m_pCTable->DropTable();
return CCommand::Terminate();
} // }}
// }}
// }}
//---------------------------------------------------------------------------
// CCommand::IsColNumWithScale
//
// @mfunc BOOL |
// CCommand |
// IsColNumWithScale |
// Can the data type hold Numeric values with Scale?
//
//
//---------------------------------------------------------------------------
BOOL CCommand::IsColNumWithScale
(
DBTYPE wType, // @parm [IN] provider data type
ULONG Scale // @parm [IN] precision for the data type
)
{
switch(wType)
{
case DBTYPE_NUMERIC: // Numeric, Decimal
case DBTYPE_DECIMAL: // Numeric, Decimal
if (Scale)
return TRUE;
else
return FALSE;
default:
return FALSE; // Compiler needs this
}
}
//---------------------------------------------------------------------------
// CCommand::IsColCharacter
//
// @mfunc BOOL |
// CCommand |
// IsColCharacter |
// Can the data type hold string values?
//
//
//---------------------------------------------------------------------------
BOOL CCommand::IsColCharacter
(
DBTYPE wType, // @parm [IN] provider data type
DBLENGTH ulColumnSize // @parm [IN] precision for the data type
)
{
switch(wType)
{
case DBTYPE_STR: // Character
case DBTYPE_WSTR:
case DBTYPE_BSTR:
if (ulColumnSize < 8000)
return TRUE;
else
return FALSE;
default:
return FALSE; // Compiler needs this
}
}
//---------------------------------------------------------------------------
// CCommand::IsColDateTime
//
// @mfunc BOOL |
// CCommand |
// IsColDateTime |
// Can the data type hold DateTime values?
//
//
//---------------------------------------------------------------------------
BOOL CCommand::IsColDateTime
(
DBTYPE wType // @parm [IN] provider data type
)
{
switch(wType)
{
case DBTYPE_DATE: // OLE Auto. Date
case DBTYPE_DBDATE: // Date
case DBTYPE_DBTIME: // Time
case DBTYPE_DBTIMESTAMP: // TimeStamp
return TRUE;
default:
return FALSE; // Compiler needs this
}
}
//---------------------------------------------------------------------------
// CCommandZombie::CleanupTransactionRowset
//
// @mfunc void |
// CCommandZombie |
// CleanupTransactionRowset |
// Cleanup the Rowset objects in the transaction
//
//
//---------------------------------------------------------------------------
void CCommandZombie::CleanupTransactionRowset(EINTERFACE eInterface, BOOL fRetaining)
{
// Switch on the enum passed in by user
switch (eInterface)
{
case ROWSET_INTERFACE:
// Release the row handle on the 1st rowset
if (m_rghRows) {
CHECK(m_pIRowset->ReleaseRows(1, m_rghRows, NULL, NULL, NULL),S_OK);
PROVIDER_FREE(m_rghRows);
}
// Release the Rowset Objects
SAFE_RELEASE(m_pIRowset);
SAFE_RELEASE(m_pIRowsetInfo);
SAFE_RELEASE(m_pIAccessor);
SAFE_RELEASE(m_pIColumnsInfo);
break;
case COMMAND_INTERFACE:
// Cleanup Transactions
if (fRetaining)
CleanUpTransaction(S_OK);
else
CleanUpTransaction(XACT_E_NOTRANSACTION);
// Release objects created in StartTransaction
SAFE_RELEASE(m_pICmdPrepare);
SAFE_RELEASE(m_pIColInfo);
// Free Memory
PROVIDER_FREE(m_rgInfo);
PROVIDER_FREE(m_pStringsBuffer);
break;
}
}