void foo()
{
	abc(  1,   2,   3);
	abc( 10,  20,  30);
	abc(100, 200, 300);
	cab(3, 2, 1, 0);
	brat(     "foo", 2000, 3000);
	brat("question",    2,  -42);
	brat(       "a",  -22,    1);
	while (1)
	{
		brat(     "foo", 2000, 3000);
		brat("question",    2,  -42);
		brat(       "a",  -22,    1);
	}
	brat("foo", 2000, 3000);
	brat(  "a",  -22,    1);
}
// CMSOmniProvRowset::Execute
// 1. Parse the SQL query,
// 2. Execute the query, and 
// 3. Build the initial rowset
HRESULT CMSOmniProvRowset::Execute(DBPARAMS * pParams, DBROWCOUNT* pcRowsAffected)
{
	USES_CONVERSION;
	CMSOmniProvRowset* pT = (CMSOmniProvRowset*) this;
	CMSOmniProvRowset::ObjectLock cab((CMSOmniProvRowset*) this);
	HRESULT hr;

	_bstr_t m_bstrFileName; 
	if ( FAILED(hr=pT->GetDataSource(m_bstrFileName)) )
		return hr;

	// Check the property value whether read/ updatabiliy property is set or not...
	_variant_t varUpd;
	GetPropValue(&DBPROPSET_ROWSET,DBPROP_UPDATABILITY, &varUpd);
	if ( 0 != varUpd.iVal )
	{
		// 1. a) Build the file's Schema m_prgColInfo from the '.sxt' file,
		//     b) Open the file '.txt', and 
		//     c) Fill the m_DBFile.m_Rows structure
		// Open in exclusive mode
		if (!m_DBFile.Open((LPCTSTR) m_bstrFileName,true))
			return DB_E_NOTABLE;
		if (!m_DBFile.FillRowArray()) 
				return E_FAIL;
	}
	else // Open in non-exclusive mode
	{
		if (!m_DBFile.Open((LPCTSTR) m_bstrFileName,false))
			return DB_E_NOTABLE;
		if (!m_DBFile.FillRowArray()) 
				return E_FAIL;
	}

	// Validate Command 
    // 2. PARSE the SQL Query here  (Only SELECT * FROM <Table_Name> is supported)
	TCHAR sep[] = " ";
	_bstr_t bstrSQL(pT->m_strCommandText);
	LPTSTR  pchNextToken = NULL;
	TCHAR * token = _tcstok_s((TCHAR*) bstrSQL, (TCHAR*) sep, &pchNextToken);

	if (!CheckTable((TCHAR*) token)) 
	{
		// The Rowset was created using the ICommand::Execute( )...
		// Only "SELECT * FROM Table_Name"  Queries are supported
		if(_tcsicmp(token,TEXT("select")) != 0)
		{
			ATLTRACE2(atlTraceDBProvider,0,(const TCHAR*) (_bstr_t("Query: '")+ bstrSQL + _bstr_t("' is not a valid Query\n")));
			return DB_E_ERRORSINCOMMAND;
		}
		ATLTRACE2(atlTraceDBProvider,0,(const TCHAR*) (_bstr_t("\tIt is a valid '")+_bstr_t(token) + _bstr_t("' Query\n")));
		
		TCHAR szTblNm[MAX_TABLE_NAME_SIZE];
		while (token != NULL)
		{
			_tcscpy_s(szTblNm, _countof(szTblNm), token);
			token= _tcstok_s(NULL,(TCHAR*) sep, &pchNextToken);
		}
		if (!CheckTable((TCHAR*) szTblNm)) 
			return DB_E_NOTABLE;
	}

	// Allocate proxy buffers based on the schema information 
	// Each CRow contains proxy buffer that the data is trasnferred to in the native 
	// format.  This information then needs to be copied out to the file in character format
	// on SetData() calls.

	CreateColInfo();

	AllocateProxyBuffers();

	if (pcRowsAffected != NULL)
		*pcRowsAffected = m_DBFile.m_Rows.GetCount();

	return S_OK;  
}
//CMSOmniProvRowset :: GetDataSource
// Retrieves the file name including the path to the schema '.sxt' file...
HRESULT CMSOmniProvRowset::GetDataSource(_bstr_t &m_bstrLoc)
{
	CMSOmniProvRowset* pT = (CMSOmniProvRowset*) this;
	CMSOmniProvRowset::ObjectLock cab((CMSOmniProvRowset*) this);
	CComPtr<IDBCreateCommand> spSession = NULL;
	CComPtr<IRowset> spRowset = NULL;

	HRESULT hr = pT->GetSite(IID_IDBCreateCommand, (void**) &spSession);
	if (SUCCEEDED(hr))  // The Rowset was created from an IOpenRowset::OpenRowset( )...
	{
			// Get to DBPROP_INIT_DATASOURCE property
			CComPtr<IDBCreateSession> spInit;
			CComPtr<IObjectWithSite> spCreator2 = NULL;
	
			if (FAILED(hr = spSession->QueryInterface(IID_IObjectWithSite,(void**) &spCreator2)))
			{
					ATLTRACE2(atlTraceDBProvider,0,"FATAL ERROR: Cannot get to the IObjectWithSite from ICommand...\n");
					return E_FAIL;
			}

			if (FAILED(hr = spCreator2->GetSite(IID_IDBCreateSession,(void**) &spInit)))
			{
					ATLTRACE2(atlTraceDBProvider,0,"FATAL ERROR: Cannot get to the IDBCreateSession from ICommand...\n");
					return E_FAIL;
			}
			// Initialize the property variables 
			ULONG               cPropertyIDSets =1;
			DBPROPIDSET   rgPropertyIDSets[1];
			ULONG              cPropertySets;
			DBPROPSET *        prgPropertySets;
			DBPROPID	rgPropId[1];

			rgPropId[0] = DBPROP_INIT_DATASOURCE;
			rgPropertyIDSets[0].rgPropertyIDs = rgPropId;
			rgPropertyIDSets[0].cPropertyIDs = 1;
			rgPropertyIDSets[0].guidPropertySet = DBPROPSET_DBINIT;
			CComPtr<IDBProperties> spProperties = NULL;

			hr = spInit->QueryInterface(IID_IDBProperties,(void**) &spProperties);
			if(FAILED(hr))
			{
				ATLTRACE2(atlTraceDBProvider,0,"FATAL ERROR: Cannot get to the IDBCreateSession'ss IDBProperties...\n");
				return hr;
			}

			spProperties->GetProperties(cPropertyIDSets, rgPropertyIDSets,&cPropertySets, &prgPropertySets) ;
			m_bstrLoc = _bstr_t(prgPropertySets->rgProperties[0].vValue);
	}
	else // The Rowset was created from ICommand::Execute( )
	{
		CComPtr<ICommand> spCommand=NULL;
		hr = pT->GetSite(IID_ICommand,(void**) &spCommand);
		if(FAILED(hr))
		{
			ATLTRACE2(atlTraceDBProvider,0,"FATAL ERROR: Cannot get to the ICommand of the Rowset...\n");
			return E_FAIL;
		}	

		CComPtr<IObjectWithSite> spCreator = NULL;
		if (FAILED(hr = spCommand->QueryInterface(IID_IObjectWithSite,(void**) &spCreator)))
		{
				ATLTRACE2(atlTraceDBProvider,0,"FATAL ERROR: Cannot get to the IObjectWithSite from ICommand...\n");
				return E_FAIL;
		}
		
		if (FAILED(hr = spCreator->GetSite(IID_IDBCreateCommand,(void**) &spSession)))
		{
				ATLTRACE2(atlTraceDBProvider,0,"FATAL ERROR: Cannot get to the IDBCreateSession from ICommand...\n");
				return E_FAIL;
		}

		CComPtr<IDBCreateSession> spInit;
		CComPtr<IObjectWithSite> spCreator2 = NULL;
		if (FAILED(hr = spSession->QueryInterface(IID_IObjectWithSite,(void**) &spCreator2)))
		{
				ATLTRACE2(atlTraceDBProvider,0,"FATAL ERROR: Cannot get to the IObjectWithSite from ICommand...\n");
				return E_FAIL;
		}
		if (FAILED(hr = spCreator2->GetSite(IID_IDBCreateSession,(void**) &spInit)))
		{
				ATLTRACE2(atlTraceDBProvider,0,"FATAL ERROR: Cannot get to the IDBCreateSession from ICommand...\n");
				return E_FAIL;
		}

		// Get to DBPROP_INIT_DATASOURCE
		ULONG			cPropertyIDSets =1;
		DBPROPIDSET		rgPropertyIDSets[1];
		ULONG			cPropertySets;
		DBPROPSET *		prgPropertySets;
		DBPROPID		rgPropId[1];

		rgPropId[0] = DBPROP_INIT_DATASOURCE;
		rgPropertyIDSets[0].rgPropertyIDs = rgPropId;
		rgPropertyIDSets[0].cPropertyIDs = 1;
		rgPropertyIDSets[0].guidPropertySet = DBPROPSET_DBINIT;
		
		CComPtr<IDBProperties> spProperties = NULL;
		hr = spInit->QueryInterface(IID_IDBProperties,(void**) &spProperties);
		if(FAILED(hr))
		{
			ATLTRACE2(atlTraceDBProvider,0,"FATAL ERROR: Cannot get to the IDBCreateSession'ss IDBProperties...\n");
			return hr;
		}

		spProperties->GetProperties(cPropertyIDSets, rgPropertyIDSets,&cPropertySets, &prgPropertySets) ;
		m_bstrLoc = _bstr_t(prgPropertySets->rgProperties[0].vValue);
	}
	return hr;
}