/****************************************************************************** Copyright (c) 2000 Microsoft Corporation Module Name: Table.cpp Abstract: This file contains the implementation of the JetBlueCOM::Table class. Revision History: Davide Massarenti (Dmassare) 05/20/2000 created ******************************************************************************/ #include #ifndef NOJETBLUECOM //////////////////////////////////////////////////////////////////////////////// JetBlueCOM::Table::Table() { m_tbl = NULL; // JetBlue::Table* m_tbl; // BaseObjectWithChildren m_Columns; // BaseObjectWithChildren m_Indexes; } JetBlueCOM::Table::~Table() { Passivate(); } //////////////////////////////////////// HRESULT JetBlueCOM::Table::Initialize( /*[in]*/ JetBlue::Table& tbl ) { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::Initialize" ); HRESULT hr; int iCol = tbl.NumOfColumns(); int iIdx = tbl.NumOfIndexes(); int i; m_tbl = &tbl; for(i=0; i child; __MPC_EXIT_IF_METHOD_FAILS(hr, m_Columns.CreateChild( this, &child )); __MPC_EXIT_IF_METHOD_FAILS(hr, child->Initialize( tbl.GetCol( i ) )); } for(i=0; i child; __MPC_EXIT_IF_METHOD_FAILS(hr, m_Indexes.CreateChild( this, &child )); __MPC_EXIT_IF_METHOD_FAILS(hr, child->Initialize( tbl.GetIdx( i ) )); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } void JetBlueCOM::Table::Passivate() { MPC::SmartLock<_ThreadModel> lock( this ); m_tbl = NULL; m_Columns.Passivate(); m_Indexes.Passivate(); } //////////////////////////////////////// STDMETHODIMP JetBlueCOM::Table::get_Name( /*[out, retval]*/ BSTR *pVal ) { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::get_Name" ); USES_CONVERSION; HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL); __MPC_PARAMCHECK_END(); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); { const MPC::string& str = *m_tbl; hr = MPC::GetBSTR( A2W(str.c_str()), pVal ); } __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP JetBlueCOM::Table::get_Columns( /*[out, retval]*/ IPCHDBCollection* *pVal ) { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::get_Columns" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL); __MPC_PARAMCHECK_END(); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); hr = m_Columns.GetEnumerator( pVal ); __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP JetBlueCOM::Table::get_Indexes( /*[out, retval]*/ IPCHDBCollection* *pVal ) { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::get_Indexes" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL); __MPC_PARAMCHECK_END(); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); hr = m_Indexes.GetEnumerator( pVal ); __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////// STDMETHODIMP JetBlueCOM::Table::SelectIndex( /*[in]*/ BSTR bstrIndex , /*[in]*/ long grbit ) { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::SelectIndex" ); USES_CONVERSION; HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); hr = m_tbl->SelectIndex( (bstrIndex && bstrIndex[0]) ? W2A(bstrIndex) : NULL, grbit ); __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP JetBlueCOM::Table::SetIndexRange( /*[in]*/ long grbit ) { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::SetIndexRange" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); hr = m_tbl->SetIndexRange( grbit ); __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP JetBlueCOM::Table::PrepareInsert() { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::PrepareInsert" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); hr = m_tbl->PrepareInsert(); __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP JetBlueCOM::Table::PrepareUpdate() { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::PrepareUpdate" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); hr = m_tbl->PrepareUpdate(); __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP JetBlueCOM::Table::Move( /*[in]*/ long grbit , /*[in]*/ long cRow , /*[out, retval]*/ VARIANT_BOOL *pfValid ) { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::Move" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); bool fFound; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_POINTER_AND_SET(pfValid,VARIANT_FALSE); __MPC_PARAMCHECK_END(); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); __MPC_EXIT_IF_METHOD_FAILS(hr, m_tbl->Move( grbit, cRow, &fFound )); *pfValid = fFound ? VARIANT_TRUE : VARIANT_FALSE; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP JetBlueCOM::Table::Seek( /*[in]*/ long grbit , /*[in]*/ VARIANT vKey , /*[out, retval]*/ VARIANT_BOOL *pfValid ) { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::Seek" ); HRESULT hr; CComVariant* pvKeys = NULL; MPC::SmartLock<_ThreadModel> lock( this ); bool fFound; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_POINTER_AND_SET(pfValid,VARIANT_FALSE); __MPC_PARAMCHECK_END(); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); if(vKey.vt == VT_SAFEARRAY) { long lLBound; long lUBound; long lSize; // // Verify that the SafeArray is the proper shape. // if(::SafeArrayGetDim( vKey.parray ) != 1) { __MPC_EXIT_IF_METHOD_FAILS(hr, E_INVALIDARG); } __MPC_EXIT_IF_METHOD_FAILS(hr, ::SafeArrayGetLBound( vKey.parray, 1, &lLBound )); __MPC_EXIT_IF_METHOD_FAILS(hr, ::SafeArrayGetUBound( vKey.parray, 1, &lUBound )); lSize = lUBound - lLBound + 1; __MPC_EXIT_IF_ALLOC_FAILS(hr, pvKeys, new CComVariant[lSize]); for(long i=lLBound; i<=lUBound; i++) { __MPC_EXIT_IF_METHOD_FAILS(hr, ::SafeArrayGetElement( vKey.parray, &i, &pvKeys[i-lLBound] )); } hr = m_tbl->Seek( grbit, pvKeys, lSize, &fFound ); } else { hr = m_tbl->Seek( grbit, &vKey, 1, &fFound ); } *pfValid = fFound ? VARIANT_TRUE : VARIANT_FALSE; hr = S_OK; __HCP_FUNC_CLEANUP; if(pvKeys) delete [] pvKeys; __HCP_FUNC_EXIT(hr); } STDMETHODIMP JetBlueCOM::Table::UpdateRecord() { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::SelectIndex" ); USES_CONVERSION; HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); hr = m_tbl->UpdateRecord( /*fMove*/true ); __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP JetBlueCOM::Table::DeleteRecord() { __HCP_FUNC_ENTRY( "JetBlueCOM::Table::DeleteRecord" ); USES_CONVERSION; HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL); hr = m_tbl->DeleteRecord(); __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } #endif