Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

351 lines
8.3 KiB

  1. /******************************************************************************
  2. Copyright (c) 2000 Microsoft Corporation
  3. Module Name:
  4. Table.cpp
  5. Abstract:
  6. This file contains the implementation of the JetBlueCOM::Table class.
  7. Revision History:
  8. Davide Massarenti (Dmassare) 05/20/2000
  9. created
  10. ******************************************************************************/
  11. #include <stdafx.h>
  12. #ifndef NOJETBLUECOM
  13. ////////////////////////////////////////////////////////////////////////////////
  14. JetBlueCOM::Table::Table()
  15. {
  16. m_tbl = NULL; // JetBlue::Table* m_tbl;
  17. // BaseObjectWithChildren<Table,Column> m_Columns;
  18. // BaseObjectWithChildren<Table,Index > m_Indexes;
  19. }
  20. JetBlueCOM::Table::~Table()
  21. {
  22. Passivate();
  23. }
  24. ////////////////////////////////////////
  25. HRESULT JetBlueCOM::Table::Initialize( /*[in]*/ JetBlue::Table& tbl )
  26. {
  27. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::Initialize" );
  28. HRESULT hr;
  29. int iCol = tbl.NumOfColumns();
  30. int iIdx = tbl.NumOfIndexes();
  31. int i;
  32. m_tbl = &tbl;
  33. for(i=0; i<iCol; i++)
  34. {
  35. CComPtr<Column> child;
  36. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Columns.CreateChild( this, &child ));
  37. __MPC_EXIT_IF_METHOD_FAILS(hr, child->Initialize( tbl.GetCol( i ) ));
  38. }
  39. for(i=0; i<iIdx; i++)
  40. {
  41. CComPtr<Index> child;
  42. __MPC_EXIT_IF_METHOD_FAILS(hr, m_Indexes.CreateChild( this, &child ));
  43. __MPC_EXIT_IF_METHOD_FAILS(hr, child->Initialize( tbl.GetIdx( i ) ));
  44. }
  45. hr = S_OK;
  46. __HCP_FUNC_CLEANUP;
  47. __HCP_FUNC_EXIT(hr);
  48. }
  49. void JetBlueCOM::Table::Passivate()
  50. {
  51. MPC::SmartLock<_ThreadModel> lock( this );
  52. m_tbl = NULL;
  53. m_Columns.Passivate();
  54. m_Indexes.Passivate();
  55. }
  56. ////////////////////////////////////////
  57. STDMETHODIMP JetBlueCOM::Table::get_Name( /*[out, retval]*/ BSTR *pVal )
  58. {
  59. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::get_Name" );
  60. USES_CONVERSION;
  61. HRESULT hr;
  62. MPC::SmartLock<_ThreadModel> lock( this );
  63. __MPC_PARAMCHECK_BEGIN(hr)
  64. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  65. __MPC_PARAMCHECK_END();
  66. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  67. {
  68. const MPC::string& str = *m_tbl;
  69. hr = MPC::GetBSTR( A2W(str.c_str()), pVal );
  70. }
  71. __HCP_FUNC_CLEANUP;
  72. __HCP_FUNC_EXIT(hr);
  73. }
  74. STDMETHODIMP JetBlueCOM::Table::get_Columns( /*[out, retval]*/ IPCHDBCollection* *pVal )
  75. {
  76. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::get_Columns" );
  77. HRESULT hr;
  78. MPC::SmartLock<_ThreadModel> lock( this );
  79. __MPC_PARAMCHECK_BEGIN(hr)
  80. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  81. __MPC_PARAMCHECK_END();
  82. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  83. hr = m_Columns.GetEnumerator( pVal );
  84. __HCP_FUNC_CLEANUP;
  85. __HCP_FUNC_EXIT(hr);
  86. }
  87. STDMETHODIMP JetBlueCOM::Table::get_Indexes( /*[out, retval]*/ IPCHDBCollection* *pVal )
  88. {
  89. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::get_Indexes" );
  90. HRESULT hr;
  91. MPC::SmartLock<_ThreadModel> lock( this );
  92. __MPC_PARAMCHECK_BEGIN(hr)
  93. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  94. __MPC_PARAMCHECK_END();
  95. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  96. hr = m_Indexes.GetEnumerator( pVal );
  97. __HCP_FUNC_CLEANUP;
  98. __HCP_FUNC_EXIT(hr);
  99. }
  100. ////////////////////////////////////////
  101. STDMETHODIMP JetBlueCOM::Table::SelectIndex( /*[in]*/ BSTR bstrIndex ,
  102. /*[in]*/ long grbit )
  103. {
  104. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::SelectIndex" );
  105. USES_CONVERSION;
  106. HRESULT hr;
  107. MPC::SmartLock<_ThreadModel> lock( this );
  108. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  109. hr = m_tbl->SelectIndex( (bstrIndex && bstrIndex[0]) ? W2A(bstrIndex) : NULL, grbit );
  110. __HCP_FUNC_CLEANUP;
  111. __HCP_FUNC_EXIT(hr);
  112. }
  113. STDMETHODIMP JetBlueCOM::Table::SetIndexRange( /*[in]*/ long grbit )
  114. {
  115. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::SetIndexRange" );
  116. HRESULT hr;
  117. MPC::SmartLock<_ThreadModel> lock( this );
  118. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  119. hr = m_tbl->SetIndexRange( grbit );
  120. __HCP_FUNC_CLEANUP;
  121. __HCP_FUNC_EXIT(hr);
  122. }
  123. STDMETHODIMP JetBlueCOM::Table::PrepareInsert()
  124. {
  125. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::PrepareInsert" );
  126. HRESULT hr;
  127. MPC::SmartLock<_ThreadModel> lock( this );
  128. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  129. hr = m_tbl->PrepareInsert();
  130. __HCP_FUNC_CLEANUP;
  131. __HCP_FUNC_EXIT(hr);
  132. }
  133. STDMETHODIMP JetBlueCOM::Table::PrepareUpdate()
  134. {
  135. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::PrepareUpdate" );
  136. HRESULT hr;
  137. MPC::SmartLock<_ThreadModel> lock( this );
  138. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  139. hr = m_tbl->PrepareUpdate();
  140. __HCP_FUNC_CLEANUP;
  141. __HCP_FUNC_EXIT(hr);
  142. }
  143. STDMETHODIMP JetBlueCOM::Table::Move( /*[in]*/ long grbit ,
  144. /*[in]*/ long cRow ,
  145. /*[out, retval]*/ VARIANT_BOOL *pfValid )
  146. {
  147. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::Move" );
  148. HRESULT hr;
  149. MPC::SmartLock<_ThreadModel> lock( this );
  150. bool fFound;
  151. __MPC_PARAMCHECK_BEGIN(hr)
  152. __MPC_PARAMCHECK_POINTER_AND_SET(pfValid,VARIANT_FALSE);
  153. __MPC_PARAMCHECK_END();
  154. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  155. __MPC_EXIT_IF_METHOD_FAILS(hr, m_tbl->Move( grbit, cRow, &fFound ));
  156. *pfValid = fFound ? VARIANT_TRUE : VARIANT_FALSE;
  157. hr = S_OK;
  158. __HCP_FUNC_CLEANUP;
  159. __HCP_FUNC_EXIT(hr);
  160. }
  161. STDMETHODIMP JetBlueCOM::Table::Seek( /*[in]*/ long grbit ,
  162. /*[in]*/ VARIANT vKey ,
  163. /*[out, retval]*/ VARIANT_BOOL *pfValid )
  164. {
  165. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::Seek" );
  166. HRESULT hr;
  167. CComVariant* pvKeys = NULL;
  168. MPC::SmartLock<_ThreadModel> lock( this );
  169. bool fFound;
  170. __MPC_PARAMCHECK_BEGIN(hr)
  171. __MPC_PARAMCHECK_POINTER_AND_SET(pfValid,VARIANT_FALSE);
  172. __MPC_PARAMCHECK_END();
  173. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  174. if(vKey.vt == VT_SAFEARRAY)
  175. {
  176. long lLBound;
  177. long lUBound;
  178. long lSize;
  179. //
  180. // Verify that the SafeArray is the proper shape.
  181. //
  182. if(::SafeArrayGetDim( vKey.parray ) != 1)
  183. {
  184. __MPC_EXIT_IF_METHOD_FAILS(hr, E_INVALIDARG);
  185. }
  186. __MPC_EXIT_IF_METHOD_FAILS(hr, ::SafeArrayGetLBound( vKey.parray, 1, &lLBound ));
  187. __MPC_EXIT_IF_METHOD_FAILS(hr, ::SafeArrayGetUBound( vKey.parray, 1, &lUBound ));
  188. lSize = lUBound - lLBound + 1;
  189. __MPC_EXIT_IF_ALLOC_FAILS(hr, pvKeys, new CComVariant[lSize]);
  190. for(long i=lLBound; i<=lUBound; i++)
  191. {
  192. __MPC_EXIT_IF_METHOD_FAILS(hr, ::SafeArrayGetElement( vKey.parray, &i, &pvKeys[i-lLBound] ));
  193. }
  194. hr = m_tbl->Seek( grbit, pvKeys, lSize, &fFound );
  195. }
  196. else
  197. {
  198. hr = m_tbl->Seek( grbit, &vKey, 1, &fFound );
  199. }
  200. *pfValid = fFound ? VARIANT_TRUE : VARIANT_FALSE;
  201. hr = S_OK;
  202. __HCP_FUNC_CLEANUP;
  203. if(pvKeys) delete [] pvKeys;
  204. __HCP_FUNC_EXIT(hr);
  205. }
  206. STDMETHODIMP JetBlueCOM::Table::UpdateRecord()
  207. {
  208. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::SelectIndex" );
  209. USES_CONVERSION;
  210. HRESULT hr;
  211. MPC::SmartLock<_ThreadModel> lock( this );
  212. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  213. hr = m_tbl->UpdateRecord( /*fMove*/true );
  214. __HCP_FUNC_CLEANUP;
  215. __HCP_FUNC_EXIT(hr);
  216. }
  217. STDMETHODIMP JetBlueCOM::Table::DeleteRecord()
  218. {
  219. __HCP_FUNC_ENTRY( "JetBlueCOM::Table::DeleteRecord" );
  220. USES_CONVERSION;
  221. HRESULT hr;
  222. MPC::SmartLock<_ThreadModel> lock( this );
  223. __MPC_JET_CHECKHANDLE(hr,m_tbl,NULL);
  224. hr = m_tbl->DeleteRecord();
  225. __HCP_FUNC_CLEANUP;
  226. __HCP_FUNC_EXIT(hr);
  227. }
  228. #endif