Source code of Windows XP (NT5)
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.

195 lines
6.6 KiB

  1. ///////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Microsoft WMIOLE DB Provider
  4. // (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
  5. //
  6. // CRowDataMemMgr class implementation - Implements class to maintain rows
  7. //
  8. //
  9. ///////////////////////////////////////////////////////////////////////////////////
  10. #include "headers.h"
  11. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. // Constructor
  13. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  14. CRowDataMemMgr::CRowDataMemMgr()
  15. {
  16. m_prgpColumnData = NULL;
  17. m_nCurrentIndex =1;
  18. }
  19. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  20. // Destructor
  21. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  22. CRowDataMemMgr::~CRowDataMemMgr()
  23. {
  24. SAFE_DELETE_PTR(m_prgpColumnData);
  25. }
  26. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  27. // ReAllocate the rowdata
  28. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  29. HRESULT CRowDataMemMgr::ReAllocRowData()
  30. {
  31. HRESULT hr = S_OK;
  32. DBCOUNTITEM cNewCols = m_cbTotalCols + DEFAULT_COLUMNS_TO_ADD;
  33. DBCOUNTITEM cOldCols = m_cbTotalCols;
  34. //==================================================
  35. // save the old buffer ptrs
  36. //==================================================
  37. PCOLUMNDATA *pOldList = m_prgpColumnData;
  38. hr = AllocRowData((ULONG_PTR)cNewCols);
  39. if( S_OK == hr ){
  40. //==============================================
  41. // copy what we have so far
  42. //==============================================
  43. memcpy(m_prgpColumnData,pOldList,cOldCols * sizeof(PCOLUMNDATA));
  44. m_nCurrentIndex = cOldCols;
  45. SAFE_DELETE_ARRAY(pOldList);
  46. }
  47. return hr;
  48. }
  49. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  50. // Reset the index of the class
  51. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  52. HRESULT CRowDataMemMgr::ResetColumns()
  53. {
  54. m_nCurrentIndex = 1;
  55. return S_OK;
  56. }
  57. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. // Allocate memory for the given number of columns
  59. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. HRESULT CRowDataMemMgr::AllocRowData(ULONG_PTR cCols)
  61. {
  62. HRESULT hr = E_OUTOFMEMORY;
  63. m_cbTotalCols = cCols ;
  64. m_prgpColumnData = new PCOLUMNDATA[m_cbTotalCols];
  65. if(m_prgpColumnData)
  66. {
  67. for( int nIndex = 0 ; nIndex < (int)m_cbTotalCols ; nIndex++)
  68. {
  69. m_prgpColumnData[nIndex] = NULL;
  70. }
  71. if ( m_prgpColumnData == NULL ){
  72. hr = E_INVALIDARG;
  73. }
  74. else
  75. {
  76. //====================================================================
  77. // Set all ptrs to the beginning
  78. //====================================================================
  79. ResetColumns();
  80. hr = S_OK;
  81. }
  82. }
  83. return hr;
  84. }
  85. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. // Set the the current column data
  87. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. HRESULT CRowDataMemMgr::CommitColumnToRowData(CVARIANT & vVar,DBTYPE lType)
  89. {
  90. HRESULT hr = S_OK;
  91. //==============================================================
  92. // Set the offset from the start of the row, for this column,
  93. // then advance past.
  94. //==============================================================
  95. if( m_nCurrentIndex > m_cbTotalCols ){
  96. hr = ReAllocRowData();
  97. }
  98. if(SUCCEEDED(hr))
  99. {
  100. if(SUCCEEDED(hr = m_prgpColumnData[m_nCurrentIndex]->SetData(vVar,lType)))
  101. {
  102. m_nCurrentIndex++;
  103. }
  104. }
  105. return hr;
  106. }
  107. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  108. // Commit the column data for the column of given index
  109. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  110. HRESULT CRowDataMemMgr::CommitColumnToRowData(CVARIANT & vVar, DBORDINAL nIndex,DBTYPE lType)
  111. {
  112. HRESULT hr = S_OK;
  113. //==============================================================
  114. // Set the offset from the start of the row, for this column,
  115. // then advance past.
  116. //==============================================================
  117. if( nIndex > m_cbTotalCols ){
  118. hr = ReAllocRowData();
  119. }
  120. // NTRaid:111829
  121. // 06/13/00
  122. if(SUCCEEDED(hr))
  123. {
  124. //=============================================
  125. // release the previously allocated data
  126. //=============================================
  127. m_prgpColumnData[nIndex]->ReleaseColumnData();
  128. hr = m_prgpColumnData[nIndex]->SetData(vVar,lType);
  129. }
  130. return hr;
  131. }
  132. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  133. // bind the memory pointers of the column data
  134. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  135. HRESULT CRowDataMemMgr::SetColumnBind( DBORDINAL dwCol, PCOLUMNDATA pColumn )
  136. {
  137. HRESULT hr = S_OK;
  138. //=====================================================================
  139. // If the column number is in range then return the pointer
  140. //=====================================================================
  141. // if ((0 == dwCol) || (m_cbTotalCols < (ULONG)dwCol)){
  142. if ( (m_cbTotalCols < (ULONG)dwCol)){
  143. hr = E_FAIL;
  144. }
  145. else{
  146. assert( pColumn );
  147. m_prgpColumnData[dwCol] = pColumn;
  148. }
  149. return hr;
  150. }
  151. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  152. // Free the data allocated for the row
  153. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  154. void CRowDataMemMgr::ReleaseRowData()
  155. {
  156. ResetColumns();
  157. ReleaseBookMarkColumn();
  158. while(m_nCurrentIndex < m_cbTotalCols)
  159. {
  160. m_prgpColumnData[m_nCurrentIndex++]->ReleaseColumnData();
  161. }
  162. }
  163. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  164. // Free the data allocated for the row
  165. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  166. void CRowDataMemMgr::ReleaseBookMarkColumn()
  167. {
  168. m_prgpColumnData[0]->ReleaseColumnData();
  169. }