//-------------------------------------------------------------------- // Microsoft OLE DB Test // // Copyright 1995-2000 Microsoft Corporation. // // @doc // // @module IDBINFO.CPP | Source code for autotest IDBINFO.CPP. // #include "MODStandard.hpp" #define DBINITCONSTANTS // Must be defined to initialize constants in OLEDB.H #define INITGUID #include "IDBInfo.h" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Module Values // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // {{ TCW_MODULE_GLOBALS DECLARE_MODULE_CLSID = { 0xd6bf9810, 0xd00c, 0x11ce, { 0x98, 0x77, 0x00, 0xaa, 0x00, 0x37, 0xda, 0x9b }}; DECLARE_MODULE_NAME("IDBInfo"); DECLARE_MODULE_OWNER("Microsoft"); DECLARE_MODULE_DESCRIP("Test module for IDBInfo Interfaces"); DECLARE_MODULE_VERSION(831585464); // 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) { IDBInfo* pIDBInfo = NULL; BOOL bValue = FALSE; if(ModuleCreateDBSession(pThisTestModule)) { // IDBInfo if(!VerifyInterface(pThisTestModule->m_pIUnknown, IID_IDBInfo, DATASOURCE_INTERFACE, (IUnknown**)&pIDBInfo)) { odtLog << L"IDBInfo is not supported by this Provider." << ENDL; return TEST_SKIPPED; } bValue = TRUE; } // Release the Interfaces SAFE_RELEASE(pIDBInfo); 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 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - class DBProp : public CDataSourceObject { protected: // @cmember If the variation passed BOOL m_fSucceed; // @cmember Interface pointer IDBInfo * m_pIDBInfo; // @cmember Count of DBLITERAL objects ULONG m_cLiterals; // @cmember Array of DBLITERAL objects DBLITERAL * m_rgLiterals; // @cmember Count of DBLITERALINFO objects ULONG m_cLiteralInfo; // @cmember Array of DBLITERALINFO objects DBLITERALINFO * m_rgLiteralInfo; // @cmember Character Buffer for GetLiteralInfo WCHAR * m_pCharBuffer; // @cmember Buffer of keywords LPWSTR m_pwszKeywords; // @cmember Constructor DBProp(LPWSTR wszTestCaseName): CDataSourceObject(wszTestCaseName) { // Initialize the members m_cLiterals = 0; m_cLiteralInfo = 0; m_pIDBInfo = NULL; m_rgLiterals = NULL; m_rgLiteralInfo = NULL; m_pCharBuffer = NULL; m_pwszKeywords = NULL; m_hr = E_FAIL; m_fSucceed = FALSE; }; // @cmember Destructor virtual ~DBProp(){}; // @cmember Test Case Initialization BOOL Init(); // @cmember Test Case Termination BOOL Terminate(); // @cember Test Variation Initialization BOOL InitVar(); // @cmember Test Variation Termination BOOL TermVar(); // @cmember Verify results of GetKeywords BOOL KeywordsVerify(HRESULT hr); // @cmember Verify results of GetLiteralInfo BOOL LiteralsVerify(HRESULT hr, BOOL fToScreen=FALSE); // @cmember Arrange DBLITERAL objects for GetLiteralInfo BOOL ArrangeLiterals(ARRANGELITERAL eArrangeLiteral); }; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Init for Test Case // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BOOL DBProp::Init() { if(CDataSourceObject::Init()) { // IDBInitialize TESTC(VerifyInterface(m_pThisTestModule->m_pIUnknown, IID_IDBInitialize, DATASOURCE_INTERFACE, (IUnknown**)&m_pIDBInitialize)); // Get interface pointer for test case TESTC(VerifyInterface(m_pIDBInitialize, IID_IDBInfo, DATASOURCE_INTERFACE, (IUnknown**)&m_pIDBInfo)); // Release the Session Object SAFE_RELEASE(m_pThisTestModule->m_pIUnknown2); return TRUE; } CLEANUP: return FALSE; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Terminate for Test Case // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BOOL DBProp::Terminate() { // Release the objects SAFE_RELEASE(m_pIDBInfo); ReleaseDataSourceObject(); return CDataSourceObject::Terminate(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Init for Test Case Variation // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BOOL DBProp::InitVar() { // Initialize the members m_cLiterals = 0; m_cLiteralInfo = 0; m_rgLiterals = NULL; m_rgLiteralInfo = NULL; m_pCharBuffer = NULL; m_pwszKeywords = NULL; m_hr = E_FAIL; m_fSucceed = FALSE; return TRUE; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Terminate for Test Case Variation // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BOOL DBProp::TermVar() { // Clean everything up if( (m_rgLiteralInfo) && (m_rgLiteralInfo != INVALID(DBLITERALINFO*)) ) PROVIDER_FREE(m_rgLiteralInfo); if( (m_pCharBuffer) && (m_pCharBuffer != INVALID(OLECHAR*)) ) PROVIDER_FREE(m_pCharBuffer); if( (m_pwszKeywords) && (m_pwszKeywords != INVALID(OLECHAR*)) ) PROVIDER_FREE(m_pwszKeywords); PROVIDER_FREE(m_rgLiterals); return TRUE; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Test Case Section // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // {{ TCW_TEST_CASE_MAP(Keywords) //-------------------------------------------------------------------- // @class testing keywords // class Keywords : public DBProp { private: // @cmember Static array of variations DECLARE_TEST_CASE_DATA(); public: // {{ TCW_DECLARE_FUNCS // @cmember Execution Routine DECLARE_TEST_CASE_FUNCS(Keywords,DBProp); // }} TCW_DECLARE_FUNCS_END // @cmember Initialization Routine virtual BOOL Init(); // @cmember Termination Routine virtual BOOL Terminate(); // {{ TCW_TESTVARS() // @cmember S_OK int Variation_1(); // @cmember E_INVALIDARG int Variation_2(); // @cmember E_UNEXPECTED int Variation_3(); // }} TCW_TESTVARS_END }; // {{ TCW_TESTCASE(Keywords) #define THE_CLASS Keywords BEG_TEST_CASE(Keywords, DBProp, L"testing keywords") TEST_VARIATION(1, L"S_OK") TEST_VARIATION(2, L"E_INVALIDARG") TEST_VARIATION(3, L"E_UNEXPECTED") END_TEST_CASE() #undef THE_CLASS // }} TCW_TESTCASE_END // }} TCW_TEST_CASE_MAP_END // {{ TCW_TEST_CASE_MAP(LiteralInfo) //-------------------------------------------------------------------- // @class testing LiteralInfo // class LiteralInfo : public DBProp { private: // @cmember Static array of variations DECLARE_TEST_CASE_DATA(); public: // {{ TCW_DECLARE_FUNCS // @cmember Execution Routine DECLARE_TEST_CASE_FUNCS(LiteralInfo,DBProp); // }} TCW_DECLARE_FUNCS_END // @cmember Initialization Routine virtual BOOL Init(); // @cmember Termination Routine virtual BOOL Terminate(); // {{ TCW_TESTVARS() // @cmember S_OK - cLiterals == 0 int Variation_1(); // @cmember S_OK - cLiterals == 1 int Variation_2(); // @cmember S_OK - cLiterals == ALL Literals int Variation_3(); // @cmember E_INVALIDARG - cLiterals != 0, and rgLiterals == NULL int Variation_4(); // @cmember E_INVALIDARG - pcLiteralInfo was a null pointer int Variation_5(); // @cmember E_INVALIDARG - prgLiteralInfo was a null pointer int Variation_6(); // @cmember E_INVALIDARG - pCharBuffer was a null pointer int Variation_7(); // @cmember S_OK - Half of valid literals int Variation_8(); // @cmember S_OK - Reverse of all valid literals int Variation_9(); // @cmember S_OK - rgLiterals contained at least 1 unsupported or invalid literal with cLiterals = 0 int Variation_10(); // @cmember S_OK - all literals invalid or unsupported with cLiterals = 0 int Variation_11(); // @cmember DB_S_ERRORSOCCURRED - rgLiterals contained at least 1 unsupported or invalid literal int Variation_12(); // @cmember DB_E_ERRORSOCCURRED - all literals invalid or unsupported int Variation_13(); // @cmember E_UNEXPECTED - Uninitialized int Variation_14(); // @cmember S_OK - 2.x Provider has both QUOTE_PREFIX and QUOTE_SUFFIX int Variation_15(); // @cmember S_OK - Check for both CATALOG_NAME and CATALOG_SEPARATOR int Variation_16(); // @cmember S_OK - 2.x Provider has both SCHEMA_NAME and SCHEMA_SEPARATOR int Variation_17(); // @cmember S_OK - cLiterals == ALL Literals multiple times int Variation_18(); // }} TCW_TESTVARS_END }; // {{ TCW_TESTCASE(LiteralInfo) #define THE_CLASS LiteralInfo BEG_TEST_CASE(LiteralInfo, DBProp, L"testing LiteralInfo") TEST_VARIATION(1, L"S_OK - cLiterals == 0") TEST_VARIATION(2, L"S_OK - cLiterals == 1") TEST_VARIATION(3, L"S_OK - cLiterals == ALL Literals") TEST_VARIATION(4, L"E_INVALIDARG - cLiterals != 0, and rgLiterals == NULL") TEST_VARIATION(5, L"E_INVALIDARG - pcLiteralInfo was a null pointer") TEST_VARIATION(6, L"E_INVALIDARG - prgLiteralInfo was a null pointer") TEST_VARIATION(7, L"E_INVALIDARG - pCharBuffer was a null pointer") TEST_VARIATION(8, L"S_OK - Half of valid literals") TEST_VARIATION(9, L"S_OK - Reverse of all valid literals") TEST_VARIATION(10, L"S_OK - rgLiterals contained at least 1 unsupported or invalid literal with cLiterals = 0") TEST_VARIATION(11, L"S_OK - all literals invalid or unsupported with cLiterals = 0") TEST_VARIATION(12, L"DB_S_ERRORSOCCURRED - rgLiterals contained at least 1 unsupported or invalid literal") TEST_VARIATION(13, L"DB_E_ERRORSOCCURRED - all literals invalid or unsupported") TEST_VARIATION(14, L"E_UNEXPECTED - Uninitialized") TEST_VARIATION(15, L"S_OK - 2.x Provider has both QUOTE_PREFIX and QUOTE_SUFFIX") TEST_VARIATION(16, L"S_OK - Check for both CATALOG_NAME and CATALOG_SEPARATOR") TEST_VARIATION(17, L"S_OK - 2.x Provider has both SCHEMA_NAME and SCHEMA_SEPARATOR") TEST_VARIATION(18, L"S_OK - cLiterals == ALL Literals multiple times") END_TEST_CASE() #undef THE_CLASS // }} TCW_TESTCASE_END // }} TCW_TEST_CASE_MAP_END // {{ TCW_TEST_CASE_MAP(TCZOMBIE_Zombie) //-------------------------------------------------------------------- // @class Induce zombie states // class TCZOMBIE_Zombie : public CTransaction { private: // @cmember Static array of variations DECLARE_TEST_CASE_DATA(); public: // {{ TCW_DECLARE_FUNCS // @cmember Execution Routine DECLARE_TEST_CASE_FUNCS(TCZOMBIE_Zombie,CTransaction); // }} TCW_DECLARE_FUNCS_END // @cmember Initialization Routine virtual BOOL Init(); // @cmember Termination Routine virtual BOOL Terminate(); // @cmember IDBInfo object IDBInfo * m_pIDBInfo; // @cmember TestTxn int TestTxn(ETXN eTxn, BOOL fRetaining); // {{ TCW_TESTVARS() // @cmember S_OK - Commit IDBInfo with fRetaining=TRUE int Variation_1(); // @cmember S_OK - Commit IDBInfo with fRetaining=FALSE int Variation_2(); // @cmember S_OK - Abort IDBInfo with fRetaining=TRUE int Variation_3(); // @cmember S_OK - Abort IDBInfo with fRetaining=FALSE int Variation_4(); // }} TCW_TESTVARS_END }; // {{ TCW_TESTCASE(TCZOMBIE_Zombie) #define THE_CLASS TCZOMBIE_Zombie BEG_TEST_CASE(TCZOMBIE_Zombie, CTransaction, L"Induce zombie states") TEST_VARIATION(1, L"S_OK - Commit IDBInfo with fRetaining=TRUE") TEST_VARIATION(2, L"S_OK - Commit IDBInfo with fRetaining=FALSE") TEST_VARIATION(3, L"S_OK - Abort IDBInfo with fRetaining=TRUE") TEST_VARIATION(4, L"S_OK - Abort IDBInfo with fRetaining=FALSE") END_TEST_CASE() #undef THE_CLASS // }} TCW_TESTCASE_END // }} TCW_TEST_CASE_MAP_END // {{ TCW_TEST_CASE_MAP(TCExtendedErrors) //-------------------------------------------------------------------- // @class Extended Errors // class TCExtendedErrors : public DBProp { private: // @cmember Static array of variations DECLARE_TEST_CASE_DATA(); public: // {{ TCW_DECLARE_FUNCS // @cmember Execution Routine DECLARE_TEST_CASE_FUNCS(TCExtendedErrors,DBProp); // }} TCW_DECLARE_FUNCS_END // @cmember Initialization Routine virtual BOOL Init(); // @cmember Termination Routine virtual BOOL Terminate(); // {{ TCW_TESTVARS() // @cmember Valid GetKeywords call with previous error object existing. int Variation_1(); // @cmember Valid GetLiteralInfo call with previous error object existing. int Variation_2(); // @cmember E_INVALIDARG GetKeywords call with previous error object existing. int Variation_3(); // @cmember E_INVALIDARG GetLiteralInfo call with previous error object existing. int Variation_4(); // @cmember DB_S_ERRORSOCCURRED GetLiteralInfo call with no previous error object existing. int Variation_5(); // @cmember DB_E_ERRORSOCCURRED GetLiteralInfo call with no previous error object existing. int Variation_6(); // }} TCW_TESTVARS_END }; // {{ TCW_TESTCASE(TCExtendedErrors) #define THE_CLASS TCExtendedErrors BEG_TEST_CASE(TCExtendedErrors, DBProp, L"Extended Errors") TEST_VARIATION(1, L"Valid GetKeywords call with previous error object existing.") TEST_VARIATION(2, L"Valid GetLiteralInfo call with previous error object existing.") TEST_VARIATION(3, L"E_INVALIDARG GetKeywords call with previous error object existing.") TEST_VARIATION(4, L"E_INVALIDARG GetLiteralInfo call with previous error object existing.") TEST_VARIATION(5, L"DB_S_ERRORSOCCURRED GetLiteralInfo call with no previous error object existing.") TEST_VARIATION(6, L"DB_E_ERRORSOCCURRED GetLiteralInfo 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(4, ThisModule, gwszModuleDescrip) TEST_CASE(1, Keywords) TEST_CASE(2, LiteralInfo) TEST_CASE(3, TCZOMBIE_Zombie) TEST_CASE(4, TCExtendedErrors) END_TEST_MODULE() // }} TCW_TESTMODULE_END // {{ TCW_TC_PROTOTYPE(Keywords) //*----------------------------------------------------------------------- //| Test Case: Keywords - testing keywords //| Created: 06/03/96 //| Updated: 04/25/98 //*----------------------------------------------------------------------- //-------------------------------------------------------------------- // @mfunc TestCase Initialization Routine // // @rdesc TRUE or FALSE // BOOL Keywords::Init() { // {{ TCW_INIT_BASECLASS_CHECK return (DBProp::Init()); // }} } // {{ TCW_VAR_PROTOTYPE(1) //*----------------------------------------------------------------------- // @mfunc S_OK // // @rdesc TEST_PASS or TEST_FAIL // int Keywords::Variation_1() { // Initialize TBEGIN; INIT; // Call with a valid pwszKeywords pointer TESTC_(m_hr=m_pIDBInfo->GetKeywords(&m_pwszKeywords), S_OK); TESTC(KeywordsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(2) //*----------------------------------------------------------------------- // @mfunc E_INVALIDARG // // @rdesc TEST_PASS or TEST_FAIL // int Keywords::Variation_2() { // Initialize TBEGIN; INIT; // Call with a NULL pwszKeywords pointer TESTC_(m_hr=m_pIDBInfo->GetKeywords(NULL), E_INVALIDARG); TESTC(KeywordsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(3) //*----------------------------------------------------------------------- // @mfunc E_UNEXPECTED // // @rdesc TEST_PASS or TEST_FAIL // int Keywords::Variation_3() { // Initialize TBEGIN; INIT; // Dirty the output params m_pwszKeywords = INVALID(OLECHAR*); // Uninitialize the DSO TESTC_(m_pIDBInitialize->Uninitialize(), S_OK); // Call with a valid pwszKeywords pointer TESTC_(m_hr=m_pIDBInfo->GetKeywords(&m_pwszKeywords), E_UNEXPECTED); TESTC(KeywordsVerify(m_hr)); // Reinitialize the DSO InitializeDSO(REINITIALIZE_YES); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_TERMINATE_METHOD //-------------------------------------------------------------------- // @mfunc TestCase Termination Routine // // @rdesc TRUE or FALSE // BOOL Keywords::Terminate() { // {{ TCW_TERM_BASECLASS_CHECK2 return(DBProp::Terminate()); } // }} // }} // }} // {{ TCW_TC_PROTOTYPE(LiteralInfo) //*----------------------------------------------------------------------- //| Test Case: LiteralInfo - testing LiteralInfo //| Created: 06/03/96 //| Updated: 04/25/98 //*----------------------------------------------------------------------- //-------------------------------------------------------------------- // @mfunc TestCase Initialization Routine // // @rdesc TRUE or FALSE // BOOL LiteralInfo::Init() { // {{ TCW_INIT_BASECLASS_CHECK return (DBProp::Init()); // }} } // {{ TCW_VAR_PROTOTYPE(1) //*----------------------------------------------------------------------- // @mfunc S_OK - cLiterals == 0 // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_1() { // Initialize TBEGIN; INIT; // Check the first valid Literal case ArrangeLiterals(ZERO); // Check the 0 cLiteral case TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), S_OK); TESTC(LiteralsVerify(m_hr, TRUE)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(2) //*----------------------------------------------------------------------- // @mfunc S_OK - cLiterals == 1 // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_2() { // Initialize TBEGIN; INIT; // Check the first valid Literal case ArrangeLiterals(ONE); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), S_OK); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(3) //*----------------------------------------------------------------------- // @mfunc S_OK - cLiterals == ALL Literals // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_3() { // Initialize TBEGIN; INIT; // Check all valid Literals case ArrangeLiterals(ALLSUPPORTED); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), S_OK); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(4) //*----------------------------------------------------------------------- // @mfunc E_INVALIDARG - cLiterals != 0, and rgLiterals == NULL // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_4() { // Initialize TBEGIN; INIT; // Check all valid Literals case with a NULL rgLiterals ArrangeLiterals(ALLSUPPORTED); // Dirty the output params m_cLiteralInfo = INVALID(ULONG); m_rgLiteralInfo = INVALID(DBLITERALINFO*); m_pCharBuffer = INVALID(OLECHAR*); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(1, NULL, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), E_INVALIDARG); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(5) //*----------------------------------------------------------------------- // @mfunc E_INVALIDARG - pcLiteralInfo was a null pointer // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_5() { // Initialize TBEGIN; INIT; // Check all valid Literals case with a NULL pcLiteralInfo ArrangeLiterals(ALLSUPPORTED); // Dirty the output params m_rgLiteralInfo = INVALID(DBLITERALINFO*); m_pCharBuffer = INVALID(OLECHAR*); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, NULL, &m_rgLiteralInfo, &m_pCharBuffer), E_INVALIDARG); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(6) //*----------------------------------------------------------------------- // @mfunc E_INVALIDARG - prgLiteralInfo was a null pointer // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_6() { // Initialize TBEGIN; INIT; // Check all valid Literals case with a NULL prgLiteralInfo ArrangeLiterals(ALLSUPPORTED); // Dirty the output params m_cLiteralInfo = INVALID(ULONG); m_pCharBuffer = INVALID(OLECHAR*); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, NULL, &m_pCharBuffer), E_INVALIDARG); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(7) //*----------------------------------------------------------------------- // @mfunc E_INVALIDARG - pCharBuffer was a null pointer // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_7() { // Initialize TBEGIN; INIT; // Check all valid Literals case with a NULL pCharBuffer ArrangeLiterals(ALLSUPPORTED); // Dirty the output params m_cLiteralInfo = INVALID(ULONG); m_rgLiteralInfo = INVALID(DBLITERALINFO*); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, NULL), E_INVALIDARG); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(8) //*----------------------------------------------------------------------- // @mfunc S_OK - Half of valid literals // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_8() { // Initialize TBEGIN; INIT; // Check the first half of the valid Literals ArrangeLiterals(HALF); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), S_OK); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(9) //*----------------------------------------------------------------------- // @mfunc S_OK - Reverse of all valid literals // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_9() { // Initialize TBEGIN; INIT; // Check all valid Literals case in reverse order ArrangeLiterals(ALLREVERSE); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), S_OK); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(10) //*----------------------------------------------------------------------- // @mfunc S_OK - rgLiterals contained at least 1 unsupported or invalid literal with cLiterals = 0 // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_10() { // Initialize TBEGIN; INIT; // Check first invalid Literal case ArrangeLiterals(INVALID1); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(0, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), S_OK); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(11) //*----------------------------------------------------------------------- // @mfunc S_OK - all literals invalid or unsupported with cLiterals = 0 // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_11() { // Initialize TBEGIN; INIT; // Check all invalid Literals case ArrangeLiterals(INVALIDALL); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(0, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), S_OK); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(12) //*----------------------------------------------------------------------- // @mfunc DB_S_ERRORSOCCURRED - rgLiterals contained at least 1 unsupported or invalid literal // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_12() { // Initialize TBEGIN; INIT; // Check first invalid Literal case ArrangeLiterals(INVALID1); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), (m_cLiterals ? DB_S_ERRORSOCCURRED : S_OK)); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(13) //*----------------------------------------------------------------------- // @mfunc DB_E_ERRORSOCCURRED - all literals invalid or unsupported // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_13() { // Initialize TBEGIN; INIT; // Check all invalid Literals case ArrangeLiterals(INVALIDALL); // Dirty the output params m_pCharBuffer = INVALID(OLECHAR*); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), DB_E_ERRORSOCCURRED); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(14) //*----------------------------------------------------------------------- // @mfunc E_UNEXPECTED - Uninitialized // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_14() { // Initialize TBEGIN; INIT; // Check before Initializing the Provider TESTC_(m_pIDBInitialize->Uninitialize(), S_OK); // Dirty the output params m_cLiteralInfo = INVALID(ULONG); m_rgLiteralInfo = INVALID(DBLITERALINFO*); m_pCharBuffer = INVALID(OLECHAR*); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(0, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), E_UNEXPECTED); TESTC(LiteralsVerify(m_hr)); // Reinitialize the DSO InitializeDSO(REINITIALIZE_YES); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(15) //*----------------------------------------------------------------------- // @mfunc S_OK - 2.x Provider has both QUOTE_PREFIX and QUOTE_SUFFIX // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_15() { // Initialize TBEGIN; INIT; // Allocate memory and set QUOTE_PREFIX and QUOTE_SUFFIX SAFE_ALLOC(m_rgLiterals, DBLITERAL, 2); m_rgLiterals[0] = DBLITERAL_QUOTE_PREFIX; m_rgLiterals[1] = DBLITERAL_QUOTE_SUFFIX; TEST2C_(m_hr=m_pIDBInfo->GetLiteralInfo(2, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer),S_OK, DB_E_ERRORSOCCURRED); // Compare DBLITERAL_QUOTE_PREFIX and DBLITERAL_QUOTE_SUFFIX TESTC(m_cLiteralInfo == 2); TESTC(m_rgLiteralInfo[0].fSupported == m_rgLiteralInfo[1].fSupported); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(16) //*----------------------------------------------------------------------- // @mfunc S_OK - Check for both CATALOG_NAME and CATALOG_SEPARATOR // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_16() { // Initialize TBEGIN; INIT; // Allocate memory and set CATALOG_NAME and CATALOG_SEPARATOR SAFE_ALLOC(m_rgLiterals, DBLITERAL, 2); m_rgLiterals[0] = DBLITERAL_CATALOG_NAME; m_rgLiterals[1] = DBLITERAL_CATALOG_SEPARATOR; TEST2C_(m_hr=m_pIDBInfo->GetLiteralInfo(2, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer),S_OK, DB_E_ERRORSOCCURRED); // Compare DBLITERAL_CATALOG_NAME and DBLITERAL_CATALOG_SEPARATOR TESTC(m_cLiteralInfo == 2); TESTC(m_rgLiteralInfo[0].fSupported == m_rgLiteralInfo[1].fSupported); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(17) //*----------------------------------------------------------------------- // @mfunc S_OK - 2.x Provider has both SCHEMA_NAME and SCHEMA_SEPARATOR // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_17() { // Initialize TBEGIN; INIT; // Allocate memory and set SCHEMA_NAME and SCHEMA_SEPARATOR SAFE_ALLOC(m_rgLiterals, DBLITERAL, 2); m_rgLiterals[0] = DBLITERAL_SCHEMA_NAME; m_rgLiterals[1] = DBLITERAL_SCHEMA_SEPARATOR; TEST2C_(m_hr=m_pIDBInfo->GetLiteralInfo(2, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer),S_OK, DB_E_ERRORSOCCURRED); // Compare DBLITERAL_SCHEMA_NAME and DBLITERAL_SCHEMA_SEPARATOR TESTC(m_cLiteralInfo == 2); TESTC(m_rgLiteralInfo[0].fSupported == m_rgLiteralInfo[1].fSupported); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(18) //*----------------------------------------------------------------------- // @mfunc S_OK - cLiterals == ALL Literals multiple times // // @rdesc TEST_PASS or TEST_FAIL // int LiteralInfo::Variation_18() { TBEGIN; // Initialize ULONG ulIndex = 0; INIT; // Check all valid Literals case ArrangeLiterals(ALLSUPPORTED); // Allocate memory and set Literals #define MAX_LITERALS 2050 SAFE_REALLOC(m_rgLiterals, DBLITERAL, m_cLiterals*MAX_LITERALS); for(ulIndex=0; ulIndex < MAX_LITERALS; ulIndex++) memcpy(&m_rgLiterals[m_cLiterals*ulIndex],m_rgLiterals,(m_cLiterals*sizeof(DBLITERAL))); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo((m_cLiterals * MAX_LITERALS), m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), S_OK); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_TERMINATE_METHOD //-------------------------------------------------------------------- // @mfunc TestCase Termination Routine // // @rdesc TRUE or FALSE // BOOL LiteralInfo::Terminate() { // {{ TCW_TERM_BASECLASS_CHECK2 return(DBProp::Terminate()); } // }} // }} // }} // {{ TCW_TC_PROTOTYPE(TCZOMBIE_Zombie) //*----------------------------------------------------------------------- //| Test Case: TCZOMBIE_Zombie - Induce zombie states //| Created: 02/02/96 //| Updated: 04/25/98 //*----------------------------------------------------------------------- //-------------------------------------------------------------------- // @mfunc TestCase Initialization Routine // // @rdesc TRUE or FALSE // BOOL TCZOMBIE_Zombie::Init() { // Check to see if Transactions are usable if(!IsUsableInterface(SESSION_INTERFACE, IID_ITransactionLocal)) return TEST_SKIPPED; // Initialize to a invalid pointer m_pIDBInfo = NULL; m_pITransactionLocal = INVALID(ITransactionLocal*); // {{ TCW_INIT_BASECLASS_CHECK if(CTransaction::Init()) // }} { // IDBInfo TESTC(VerifyInterface(m_pThisTestModule->m_pIUnknown, IID_IDBInfo, DATASOURCE_INTERFACE, (IUnknown**)&m_pIDBInfo)); // Register Interface with Zombie TESTC(RegisterInterface(DATASOURCE_INTERFACE, IID_IDBInfo,0,NULL)); 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; CLEANUP: return FALSE; } // {{ TCW_VAR_PROTOTYPE(1) //*----------------------------------------------------------------------- // @mfunc S_OK - Commit IDBInfo with fRetaining=TRUE // // @rdesc TEST_PASS or TEST_FAIL // int TCZOMBIE_Zombie::Variation_1() { // S_OK - Commit IDBInfo with fRetaining=TRUE return TestTxn(ETXN_COMMIT, TRUE); } // }} // {{ TCW_VAR_PROTOTYPE(2) //*----------------------------------------------------------------------- // @mfunc S_OK - Commit IDBInfo with fRetaining=FALSE // // @rdesc TEST_PASS or TEST_FAIL // int TCZOMBIE_Zombie::Variation_2() { // S_OK - Commit IDBInfo with fRetaining=FALSE return TestTxn(ETXN_COMMIT, FALSE); } // }} // {{ TCW_VAR_PROTOTYPE(3) //*----------------------------------------------------------------------- // @mfunc S_OK - Abort IDBInfo with fRetaining=TRUE // // @rdesc TEST_PASS or TEST_FAIL // int TCZOMBIE_Zombie::Variation_3() { // S_OK - Abort IDBInfo with fRetaining=TRUE return TestTxn(ETXN_ABORT, TRUE); } // }} // {{ TCW_VAR_PROTOTYPE(4) //*----------------------------------------------------------------------- // @mfunc S_OK - Abort IDBInfo with fRetaining=FALSE // // @rdesc TEST_PASS or TEST_FAIL // int TCZOMBIE_Zombie::Variation_4() { // S_OK - Abort IDBInfo with fRetaining=FALSE return TestTxn(ETXN_ABORT, FALSE); } // }} // {{ TCW_TERMINATE_METHOD //-------------------------------------------------------------------- // @mfunc TestCase Termination Routine // // @rdesc TRUE or FALSE // BOOL TCZOMBIE_Zombie::Terminate() { // Release the Interfaces SAFE_RELEASE(m_pIDBInfo); return(CTransaction::Terminate()); } // }} // }} // {{ TCW_TC_PROTOTYPE(TCExtendedErrors) //*----------------------------------------------------------------------- //| Test Case: TCExtendedErrors - Extended Errors //| Created: 08/12/96 //| Updated: 04/25/98 //*----------------------------------------------------------------------- //-------------------------------------------------------------------- // @mfunc TestCase Initialization Routine // // @rdesc TRUE or FALSE // BOOL TCExtendedErrors::Init() { // {{ TCW_INIT_BASECLASS_CHECK return (DBProp::Init()); // }} } // {{ TCW_VAR_PROTOTYPE(1) //*----------------------------------------------------------------------- // @mfunc Valid GetKeywords call with previous error object existing. // // @rdesc TEST_PASS or TEST_FAIL // int TCExtendedErrors::Variation_1() { // Initialize TBEGIN; INIT; // Cause an Error m_pExtError->CauseError(); TESTC_(m_hr=m_pIDBInfo->GetKeywords(&m_pwszKeywords),S_OK); // Do extended check following GetKeywords TESTC(XCHECK(m_pIDBInfo, IID_IDBInfo, m_hr)); TESTC(KeywordsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(2) //*----------------------------------------------------------------------- // @mfunc Valid GetLiteralInfo call with previous error object existing. // // @rdesc TEST_PASS or TEST_FAIL // int TCExtendedErrors::Variation_2() { // Initialize TBEGIN; INIT; // Cause an Error m_pExtError->CauseError(); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(0, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), S_OK); // Do extended check following GetLiteralInfo TESTC(XCHECK(m_pIDBInfo, IID_IDBInfo, m_hr)); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(3) //*----------------------------------------------------------------------- // @mfunc E_INVALIDARG GetKeywords call with previous error object existing. // // @rdesc TEST_PASS or TEST_FAIL // int TCExtendedErrors::Variation_3() { // Initialize TBEGIN; INIT; // Cause an Error m_pExtError->CauseError(); TESTC_(m_hr=m_pIDBInfo->GetKeywords(NULL),E_INVALIDARG); // Do extended check following GetKeywords TESTC(XCHECK(m_pIDBInfo, IID_IDBInfo, m_hr)); TESTC(KeywordsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(4) //*----------------------------------------------------------------------- // @mfunc E_INVALIDARG GetLiteralInfo call with previous error object existing. // // @rdesc TEST_PASS or TEST_FAIL // int TCExtendedErrors::Variation_4() { // Initialize TBEGIN; INIT; ArrangeLiterals(ALLSUPPORTED); // Cause an Error m_pExtError->CauseError(); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(1, NULL, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), E_INVALIDARG); // Do extended check following GetLiteralInfo TESTC(XCHECK(m_pIDBInfo, IID_IDBInfo, m_hr)); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } // }} // {{ TCW_VAR_PROTOTYPE(5) //*----------------------------------------------------------------------- // @mfunc DB_S_ERRORSOCCURRED GetLiteralInfo call with no previous error object existing. // // @rdesc TEST_PASS or TEST_FAIL // int TCExtendedErrors::Variation_5() { // Initialize TBEGIN; INIT; // Check first invalid Literal case ArrangeLiterals(INVALID1); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), (m_cLiterals ? DB_S_ERRORSOCCURRED : S_OK)); // Do extended check following GetLiteralInfo TESTC(XCHECK(m_pIDBInfo, IID_IDBInfo, m_hr)); TESTC(LiteralsVerify(m_hr)); CLEANUP: TERM; TRETURN; } //}} // {{ TCW_VAR_PROTOTYPE(6) //*----------------------------------------------------------------------- // @mfunc DB_E_ERRORSOCCURRED GetLiteralInfo call with no previous error object existing. // // @rdesc TEST_PASS or TEST_FAIL // int TCExtendedErrors::Variation_6() { // Initialize TBEGIN; INIT; ArrangeLiterals(INVALIDALL); TESTC_(m_hr=m_pIDBInfo->GetLiteralInfo(m_cLiterals, m_rgLiterals, &m_cLiteralInfo, &m_rgLiteralInfo, &m_pCharBuffer), DB_E_ERRORSOCCURRED); // Do extended check following GetLiteralInfo TESTC(XCHECK(m_pIDBInfo, IID_IDBInfo, m_hr)); CLEANUP: TERM; TRETURN; } //}} // {{ TCW_TERMINATE_METHOD //-------------------------------------------------------------------- // @mfunc TestCase Termination Routine // // @rdesc TRUE or FALSE // BOOL TCExtendedErrors::Terminate() { return (DBProp::Terminate()); } // }} // }} // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Verify that Keywords returned what it should have // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BOOL DBProp::KeywordsVerify(HRESULT hr) { //============================================================================ // KEYWORDS Constants from V2.0 //============================================================================ const LPWSTR rgpwszKeywords[] = { L"ABSOLUTE",L"ACTION",L"ADD",L"ALL",L"ALLOCATE",L"ALTER",L"AND",L"ANY",L"ARE",L"AS",L"ASC", L"ASSERTION",L"AT",L"AUTHORIZATION",L"AVG",L"BEGIN",L"BETWEEN",L"BIT",L"BIT_LENGTH",L"BOTH", L"BY",L"CASCADE",L"CASCADED",L"CASE",L"CAST",L"CATALOG",L"CHAR",L"CHAR_LENGTH",L"CHARACTER", L"CHARACTER_LENGTH",L"CHECK",L"CLOSE",L"COALESCE",L"COLLATE",L"COLLATION",L"COLUMN", L"COMMIT",L"CONNECT",L"CONNECTION",L"CONSTRAINT",L"CONSTRAINTS",L"CONTINUE",L"CONVERT", L"CORRESPONDING",L"COUNT",L"CREATE",L"CROSS",L"CURRENT",L"CURRENT_DATE",L"CURRENT_TIME", L"CURRENT_TIMESTAMP",L"CURRENT_USER",L"CURSOR",L"DATE",L"DAY",L"DEALLOCATE",L"DEC", L"DECIMAL",L"DECLARE",L"DEFAULT",L"DEFERRABLE",L"DEFERRED",L"DELETE",L"DESC",L"DESCRIBE", L"DESCRIPTOR",L"DIAGNOSTICS",L"DISCONNECT",L"DISTINCT",L"DISTINCTROW",L"DOMAIN",L"DOUBLE", L"DROP",L"ELSE",L"END",L"END-EXEC",L"ESCAPE",L"EXCEPT",L"EXCEPTION",L"EXEC",L"EXECUTE", L"EXISTS",L"EXTERNAL",L"EXTRACT",L"FALSE",L"FETCH",L"FIRST",L"FLOAT",L"FOR",L"FOREIGN", L"FOUND",L"FROM",L"FULL",L"GET",L"GLOBAL",L"GO",L"GOTO",L"GRANT",L"GROUP",L"HAVING",L"HOUR", L"IDENTITY",L"IMMEDIATE",L"IN",L"INDICATOR",L"INITIALLY",L"INNER",L"INPUT",L"INSENSITIVE", L"INSERT",L"INT",L"INTEGER",L"INTERSECT",L"INTERVAL",L"INTO",L"IS",L"ISOLATION",L"JOIN", L"KEY",L"LANGUAGE",L"LAST",L"LEADING",L"LEFT",L"LEVEL",L"LIKE",L"LOCAL",L"LOWER",L"MATCH",L"MAX", L"MIN",L"MINUTE",L"MODULE",L"MONTH",L"NAMES",L"NATIONAL",L"NATURAL",L"NCHAR",L"NEXT",L"NO", L"NOT",L"NULL",L"NULLIF",L"NUMERIC",L"OCTET_LENGTH",L"OF",L"ON",L"ONLY",L"OPEN",L"OPTION", L"OR",L"ORDER",L"OUTER",L"OUTPUT",L"OVERLAPS",L"PARTIAL",L"POSITION",L"PRECISION",L"PREPARE", L"PRESERVE",L"PRIMARY",L"PRIOR",L"PRIVILEGES",L"PROCEDURE",L"PUBLIC",L"READ",L"REAL", L"REFERENCES",L"RELATIVE",L"RESTRICT",L"REVOKE",L"RIGHT",L"ROLLBACK",L"ROWS",L"SCHEMA", L"SCROLL",L"SECOND",L"SECTION",L"SELECT",L"SESSION",L"SESSION_USER",L"SET",L"SIZE",L"SMALLINT", L"SOME",L"SQL",L"SQLCODE",L"SQLERROR",L"SQLSTATE",L"SUBSTRING",L"SUM",L"SYSTEM_USER",L"TABLE", L"TEMPORARY",L"THEN",L"TIME",L"TIMESTAMP",L"TIMEZONE_HOUR",L"TIMEZONE_MINUTE",L"TO", L"TRAILING",L"TRANSACTION",L"TRANSLATE",L"TRANSLATION",L"TRIGGER",L"TRIM",L"TRUE",L"UNION", L"UNIQUE",L"UNKNOWN",L"UPDATE",L"UPPER",L"USAGE",L"USER",L"USING",L"VALUE",L"VALUES",L"VARCHAR", L"VARYING",L"VIEW",L"WHEN",L"WHENEVER",L"WHERE",L"WITH",L"WORK",L"WRITE",L"YEAR",L"ZONE", }; ULONG ulErrors = 0; ULONG ulSpaces = 0; ULONG ulExtra = 0; // If HRESULT is a failure code if((FAILED(hr)) && (!m_pwszKeywords)) return TRUE; // If HRESULT is a success code if(SUCCEEDED(hr)) { // It is legal to return a NULL on S_OK if(!m_pwszKeywords) { odtLog << L"The Provider returned no Keywords." < for pwszKeywords." <GetLiteralInfo(0, NULL, &m_cLiterals, &m_rgLiteralInfo, &m_pCharBuffer))) return FALSE; // Check to see if we got Literals if((!m_cLiterals) && (eArrangeLiteral != INVALIDALL)) { odtLog << L"Provider did not return any supported Literals." < DBLITERAL_QUOTE_SUFFIX) case INVALID1: m_cLiterals = MAX_DBLITERALINFO; for(ulIndex=DBLITERAL_INVALID; ulIndex <= DBLITERAL_QUOTE_SUFFIX; ulIndex++) m_rgLiterals[ulIndex] = ulIndex; break; // ALL unsupported Literals case INVALIDALL: m_cLiterals = MAX_DBLITERALINFO; for(ulIndex=0; ulIndex < MAX_DBLITERALINFO; ulIndex++) m_rgLiterals[ulIndex] = DBLITERAL_INVALID; break; // ALL supported Literals in reverse order case ALLREVERSE: for(ulIndex=0; ulIndex < m_cLiterals; ulIndex++) m_rgLiterals[ulIndex] = m_rgLiteralInfo[(m_cLiterals-ulIndex)-1].lt; break; default: odtLog << L"ArrangeLiterals used incorrectly" < 0 if(m_cLiteralInfo) { // Count the supported Literals for(ULONG i=0; i < m_cLiteralInfo; i++) if(m_rgLiteralInfo[i].fSupported) ulSupported++; // All supported if(hr == S_OK) COMPARE(m_cLiteralInfo, ulSupported); // Atleast 1 unsupported if(hr == DB_S_ERRORSOCCURRED) COMPARE(((m_cLiteralInfo > ulSupported) && ulSupported), TRUE); // Atleast 1 unsupported if(hr == DB_E_ERRORSOCCURRED) COMPARE((!ulSupported && m_rgLiteralInfo), TRUE); // Check the pCharBuffer, it should be NULL on ERROR if(SUCCEEDED(hr)) COMPARE(!m_pCharBuffer, NULL); else COMPARE(m_pCharBuffer, NULL); // Check the Data returned for(ULONG ulIndex=0; ulIndex < m_cLiteralInfo; ulIndex++) { // Check for unsupported Literals if(!(m_rgLiteralInfo[ulIndex].fSupported)) { // Everything should be NULL or 0 COMPARE(((m_rgLiteralInfo[ulIndex].pwszLiteralValue) || (m_rgLiteralInfo[ulIndex].pwszInvalidChars) || (m_rgLiteralInfo[ulIndex].pwszInvalidStartingChars) || (m_rgLiteralInfo[ulIndex].cchMaxLen)), FALSE); continue; } // These are the only 8 that should modify pwszLiteralValue and cchMaxLen, // and not modify pwszInvalidChar and pwszInvalidStartingChar. if( (m_rgLiteralInfo[ulIndex].lt == DBLITERAL_CATALOG_SEPARATOR) || (m_rgLiteralInfo[ulIndex].lt == DBLITERAL_ESCAPE_PERCENT_PREFIX) || (m_rgLiteralInfo[ulIndex].lt == DBLITERAL_ESCAPE_PERCENT_SUFFIX) || (m_rgLiteralInfo[ulIndex].lt == DBLITERAL_ESCAPE_UNDERSCORE_PREFIX) || (m_rgLiteralInfo[ulIndex].lt == DBLITERAL_ESCAPE_UNDERSCORE_SUFFIX) || (m_rgLiteralInfo[ulIndex].lt == DBLITERAL_LIKE_PERCENT) || (m_rgLiteralInfo[ulIndex].lt == DBLITERAL_LIKE_UNDERSCORE) || (m_rgLiteralInfo[ulIndex].lt == DBLITERAL_QUOTE_PREFIX) || (m_rgLiteralInfo[ulIndex].lt == DBLITERAL_QUOTE_SUFFIX) || (m_rgLiteralInfo[ulIndex].lt == DBLITERAL_SCHEMA_SEPARATOR) ) { // Check pwszLiteralValue exceptions if(!m_rgLiteralInfo[ulIndex].pwszLiteralValue) { odtLog << L"ERROR: pwszLiteralValue exceptions: "; odtLog << rgpwszLiterals[m_rgLiteralInfo[ulIndex].lt]; odtLog << L" should not be NULL." <" <" <" <GetNextRows(0,0,1,&cRowsObtained,&rghRows), ExpectedHr); // Make sure that this Interface is unaffected TESTC_(m_pIDBInfo->GetKeywords(&pwszKeywords),S_OK); // Make sure that this Interface is unaffected TESTC_(m_pIDBInfo->GetLiteralInfo(0, NULL, &cLiteralInfo, &rgLiteralInfo, &pCharBuffer), S_OK); CLEANUP: // Release the row handle on the 1st rowset CHECK(m_pIRowset->ReleaseRows(cRowsObtained, rghRows, NULL, NULL, NULL), S_OK); PROVIDER_FREE(rghRows); // Release the IDBInfo SAFE_RELEASE(pIDBInfo); PROVIDER_FREE(pwszKeywords); PROVIDER_FREE(rgLiteralInfo); PROVIDER_FREE(pCharBuffer); // Cleanup Transactions CleanUpTransaction(fRetaining ? S_OK : XACT_E_NOTRANSACTION); TRETURN; }