IRowsetLocateImpl ±¸Çö ¿Ï·á

±¸Çö ¿Ï·á ÇÏ´Â IRowsetLocate ÀÎÅÍÆäÀ̽º, Ã¥°¥ÇǸ¦ ±¸Çö ÇØ¾ß ÇÕ´Ï´Ù. Ã¥°¥ÇÇ´Â Çà ÁýÇÕ¿¡ °í¼Ó µ¥ÀÌÅÍ ¾×¼¼½º¸¦ Çã¿ë ÇÏ´Â À妽º. Ã¥°¥Çǰ¡ °íÀ¯ ¼ö¸¦ °áÁ¤ ÇÏ´Â °ø±ÞÀÚ°¡ ÇàÀ» ½Äº° ÇÕ´Ï´Ù. À妽º¸¦ »ç¿ë ÇÏ ¿©ÀÌ ¿¹Á¦¸¦ m_rgAgentInfo ¹è¿­¡£

°ø±ÞÀÚ Çü½Ä¿¡¼­ Ã¥°¥ÇǸ¦ ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù. Ã¥°¥ÇǸ¦ À¯È¿ÇÑ Áö È®ÀÎ ÇÏ·Á¸é:

  1. À¯È¿ÇÑ Ã¥°¥ÇÇ Æ÷ÀÎÅ͸¦°¡Áö°í È®ÀÎ ÀüÈ­ ValidateBookmark¡£

  2. DWORD ÀÇ Å©±â ¶Ç´Â 1 ¹ÙÀÌÆ® ÀÎÁö È®ÀÎ ÇÏ·Á¸é Ã¥°¥ÇÇÀÇ Å©±â¸¦ È®ÀÎ ÇÕ´Ï´Ù. (»ç¿ëÀÚ ·¹ÄÚµå CAgentMan , dwBookmark Ç׸ñÀ» DWORD¸¦ ÁöÁ¤ ÇÕ´Ï´Ù. ½Ì±Û ¹ÙÀÌÆ® ±æÀÌ Æ¯º° ÇÑ Ã¥°¥ÇÇ DBMRK_FIRST ¹× DBMRK_LAST.)

  3. À妽º ¹è¿­ ( DBMRK_FIRST DBMRK_LAST) »çÀÌ¿¡¼­ ¿Ã¹Ù¸¥ À§Ä¡¸¦ °¡¸®Å°´ÂÁö È®ÀÎ ÇϽʽÿÀ.

(°¢ ¹®ÀÚ¿­¿¡ ´ë ÇÑ Çϳª) µÎ Ã¥°¥ÇÇÀÇ À¯È¿¼ºÀ» °Ë»ç ÇÑ ÈÄ µÎ °³ÀÇ ºÏ¸¶Å© ÇÏ °í °áÁ¤ ÇÑ º¸´Ù, º¸´Ù Å­, ºñ±³ ¸Þ¼­µå¸¦ È£Ãâ Çϰųª ´Ù¸¥ °°À½¡£

ÇàÀ» ÀÎÃâ ÇÏ·Á¸é GetRowsAt ¹× GetRowsByBookmark ÇÔ¼ö ±¸Çö¡£

GetRowsAt µ¿ÀÏ ÇÏ °Ô ÀÛµ¿ ÇÕ´Ï´Ù IRowset::GetNextRows ¸Þ¼­µå Á¦¿Ü ÇÏ °í Ã¥°¥ÇǸ¦ »ç¿ë ÇÏ ¿© µ¥ÀÌÅÍ ÀÎÃâ. Ã¥°¥ÇÇÀÇ À¯È¿¼ºÀ» °Ë»ç ÇÏ °í ÇàÀ» °¡Á®¿À·Á¸é IRowsetImpl::GetNextRows ¸¦ È£Ãâ ÇÏ´Â ´ÙÀ½¡£

GetRowsByBookmark ´Ù¾ç ÇÑ À§Ä¡¿¡¼­ ÇÑ ÇàÀ» ÀÎÃâ ÇÕ´Ï´Ù. ±×°ÍÀº ¸Þ¼­µå¸¦ »ç¿ë ÇÏ ¿© ƯÁ¤ ÇàÀ» ¹ÝÀÔ ÇÕ´Ï´Ù. GetRowsByBookmark °¢ Ã¥°¥ÇǸ¦ À¯È¿¼ºÀ» °Ë»ç ÇÑ ´ÙÀ½ È£Ãâ IRowsetImpl::CreateRow, ÇÊ¿äÇÑ °æ¿ì »õ ÇàÀ» ¸¸µå´Â ÇÏ ¿© ÇàÀ» ÀÎÃâ ÇÕ´Ï´Ù. °¡¸®Å°´Â ¹è¿­ÀÇ Çà ¹ÝȯrghRows¡£

(ÀÌ ¿¹Á¦¿¡¼­´Â ´Ü¼øÇÑ °íÁ¤ ±æÀÌ Ã¥°¥ÇǸ¦ »ç¿ë Çϱ⠶§¹®¿¡ ±×°ÍÀº ±¸Çö ÇÏÁö ¾Ê½À´Ï´Ù IRowsetLocate::Hash ¸Þ¼­µå. °ø±ÞÀÚ °¡º¯ ±æÀÌ Ã¥°¥ÇÇ ¶Ç´Â ºñ½Ñ °æ¿ì Ã¥°¥ÇǸ¦ »ç¿ë ÇÏ´Â °æ¿ì »èÁ¦ÇÒ ¼ö ÀÖ½À´Ï´Ù »Ó¸¸ ¾Æ´Ï¶ó IRowsetLocate::Hash ¸Þ¼­µå¸¦ ±¸Çö ÇÏ.)

¿ÏÀü ÇÑ ±¸Çö IRowsetLocateImpl ÀÌ Ã³·³ º¸ÀÌ´Â:

/////////////////////////////////////////////////////////////////////////// RowLoc.h
// class IRowsetLocateImpl

template <class T>
class ATL_NO_VTABLE IRowsetLocateImpl : public IRowsetImpl<T> 
{
public:
   STDMETHOD (Compare)(HCHAPTER hReserved, ULONG cbBookmark1, 
      const BYTE * pBookmark1, ULONG cbBookmark2, const BYTE * pBookmark2,
      DBCOMPARE * pComparison)
   {
      ATLTRACE("IRowsetLocateImpl::Compare");

      HRESULT hr = ValidateBookmark(cbBookmark1, pBookmark1);
      if (hr != S_OK)
         return hr;

      hr = ValidateBookmark(cbBookmark2, pBookmark2);
      if (hr != S_OK)
         return hr;

      // Return the value based on the bookmark values
      if (*pBookmark1 == *pBookmark2)
         *pComparison = DBCOMPARE_EQ;

      if (*pBookmark1 < *pBookmark2)
         *pComparison = DBCOMPARE_LT;

      if (*pBookmark1 > *pBookmark2)
         *pComparison = DBCOMPARE_GT;

      return S_OK;
   }

   STDMETHOD (GetRowsAt)(HWATCHREGION hReserved1, HCHAPTER hReserved2,
      ULONG cbBookmark, const BYTE * pBookmark, LONG lRowsOffset,
      LONG cRows, ULONG * pcRowsObtained, HROW ** prghRows)
   {
      ATLTRACE("IRowsetLocateImpl::GetRowsAt");
      T* pT = (T*)this;

      // Check bookmark
      HRESULT hr = ValidateBookmark(cbBookmark, pBookmark);
      if (hr != S_OK)
         return hr;

      // Check the other pointers
      if (pcRowsObtained == NULL || prghRows == NULL)
         return E_INVALIDARG;

      // Set the current row position to the bookmark.  Handle any
      // normal values
      pT->Lock();
      LONG iRowsetTemp = m_iRowset;  // Cache the current rowset 
      m_iRowset = *pBookmark;
      if (*pBookmark == DBBMK_FIRST)
         m_iRowset = 1;

      if (*pBookmark == DBBMK_LAST)
         m_iRowset = pT->m_rgRowData.GetSize();

      // Call IRowsetImpl::GetNextRows to actually get the rows.
      hr = GetNextRows(hReserved2, lRowsOffset,
         cRows, pcRowsObtained, prghRows);
      m_iRowset = iRowsetTemp;
      pT->Unlock();
      return hr;
   }

   STDMETHOD (GetRowsByBookmark)(HCHAPTER hReserved, ULONG cRows,
      const ULONG rgcbBookmarks[], const BYTE * rgpBookmarks[],
      HROW rghRows[], DBROWSTATUS rgRowStatus[])
   {
      HRESULT hr = S_OK;
      ATLTRACE("IRowsetLocateImpl::GetRowsByBookmark");

      T* pT = (T*)this;
      if (rgcbBookmarks == NULL || rgpBookmarks == NULL || rghRows == NULL)
         return E_INVALIDARG;

      if (cRows == 0)
         return S_OK;   // No rows fetched in this case.

      bool bErrors = false;
      pT->Lock();
      for (ULONG l=0; l<cRows; l++)
      {
         // Validate each bookmark before fetching the row.  Note, it is
         // an error for the bookmark to be one of the standard values
         hr = ValidateBookmark(rgcbBookmarks[l], rgpBookmarks[l]);
         if (hr != S_OK)
         {
            bErrors = TRUE;
            if (rgRowStatus != NULL)
            {
               rgRowStatus[l] = DBROWSTATUS_E_INVALID;
               continue;
            }
         }

         // Fetch the validated row
         ULONG ulRowsObtained = 0;
         if (CreateRow((long)*rgpBookmarks[l], ulRowsObtained, &rghRows[l]) != S_OK)
         {
            bErrors = TRUE;
         }
         else
         {
            if (rgRowStatus != NULL)
               rgRowStatus[l] = DBROWSTATUS_S_OK;
         }
      }

      pT->Unlock();
      if (bErrors)
         return DB_S_ERRORSOCCURRED;
      else
         return hr;
   }

   STDMETHOD (Hash)(HCHAPTER hReserved, ULONG cBookmarks,
      const ULONG rgcbBookmarks[], const BYTE * rgpBookmarks[],
      DWORD rgHashedValues[], DBROWSTATUS rgBookmarkStatus[])
   {
      ATLTRACENOTIMPL("IRowsetLocateImpl::GetRowsByBookmark");
   }

   // Implementation
   protected:
   HRESULT ValidateBookmark(ULONG cbBookmark, const BYTE* pBookmark)
   {
      T* pT = (T*)this;
      if (cbBookmark == 0 || pBookmark == NULL)
         return E_INVALIDARG;

      // All of our bookmarks are DWORDs, if they are anything other than 
      // sizeof(DWORD) then we have an invalid bookmark
      if ((cbBookmark != sizeof(DWORD)) && (cbBookmark != 1))
      {
         ATLTRACE("Bookmarks are invalid length, should be DWORDs");
         return DB_E_BADBOOKMARK;
      }

      // If the contents of our bookmarks are less than 0 or greater than
      // rowcount, then they are invalid
      UINT nRows = pT->m_rgRowData.GetSize();
      if ((*pBookmark <= 0 || *pBookmark > nRows) 
         && *pBookmark != DBBMK_FIRST && *pBookmark != DBBMK_LAST)
      {
         ATLTRACE("Bookmark has invalid range");
         return DB_E_BADBOOKMARK;
      }

      return S_OK;
   }
};

´ÙÀ½ Ç׸ñ¿¡¼­ ¼ÒºñÀÚ¿¡ °Ô ¹Ýȯ µÇ´Â ¿­À» µ¿ÀûÀ¸·Î °áÁ¤ ÇÏ´Â ¹æ¹ýÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.

Index