home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / vcoledb / consumer / multiread / dbread.h next >
C/C++ Source or Header  |  1998-03-26  |  3KB  |  144 lines

  1. #include <atldbcli.h>
  2.  
  3. #if 1
  4. class CProduct
  5. {
  6. public:
  7.     long    nProductID;
  8.     char*   pName;
  9.     long    nUnitsInStock;
  10.     long    nReorderLevel;
  11.  
  12.     BEGIN_ACCESSOR_MAP(CProduct, 1)
  13.         BEGIN_ACCESSOR(0, false)
  14.             COLUMN_ENTRY(1, nProductID)
  15.             COLUMN_ENTRY_TYPE(2, DBTYPE_STR | DBTYPE_BYREF, pName)
  16.             COLUMN_ENTRY(7, nUnitsInStock)
  17.             COLUMN_ENTRY(9, nReorderLevel)
  18.         END_ACCESSOR();
  19.     END_ACCESSOR_MAP()
  20.  
  21.     DEFINE_COMMAND(CProduct, _T("SELECT * FROM Products"))
  22. };
  23. #else
  24. class CProduct
  25. {
  26. public:
  27.     long id;
  28.     char Name[80];
  29.     char PhoneNumber[50];
  30.     char Location[50];
  31.     char Title[50];
  32.     char Company[50];
  33.     char Email[50];
  34.  
  35.     BEGIN_COLUMN_MAP(CProduct)
  36.         COLUMN_ENTRY(1, id)
  37.         COLUMN_ENTRY(2, Name)
  38.         COLUMN_ENTRY(3, PhoneNumber)
  39.         COLUMN_ENTRY(4, Location)
  40.         COLUMN_ENTRY(5, Title)
  41.         COLUMN_ENTRY(6, Company)
  42.         COLUMN_ENTRY(7, Email)
  43.     END_COLUMN_MAP()
  44. };
  45. #endif
  46.  
  47. void ProcessRecord(CProduct& product);
  48.  
  49. class CMyRowset : public CRowset
  50. {
  51. public:
  52.     HRESULT MoveAndProcess()
  53.     {
  54.         CProduct product;
  55.         HRESULT hr;
  56.         hr = MoveNext();
  57.         if (hr == S_OK)
  58.         {
  59.             hr = GetDataHere(&product);
  60.             ATLASSERT(SUCCEEDED(hr));
  61.             ProcessRecord(product);
  62.         }
  63.         return hr;
  64.     }
  65. };
  66.  
  67. ULONG WINAPI ReadTable(CTable<CAccessor<CProduct>, CMyRowset>* pProduct)
  68. {
  69.     CMyRowset rowset = *((CMyRowset*)pProduct);
  70.     HRESULT   hr;
  71.     ULONG     nRows = 0;
  72.  
  73.     while ((hr=rowset.MoveAndProcess()) == S_OK)
  74.     {
  75.         nRows++;
  76.     }
  77.     ATLTRACE("Thread %d processed %d records. Last HRESULT = %X\n", GetCurrentThreadId(), nRows, hr);
  78.     return nRows;
  79. }
  80.  
  81. void ProcessRecord(CProduct& product)
  82. {
  83.     DWORD dwThreadId = GetCurrentThreadId();
  84.     ATLTRACE("%d, %4d, %s\n", dwThreadId, product.nProductID, product.pName);
  85. }
  86.  
  87. HRESULT ReadRecords(int nThreads, DWORD* pdwTime, DWORD* pRowsProcessed)
  88. {
  89.     CDataSource     db;
  90.     CSession        session;
  91.     CTable<CAccessor<CProduct>, CMyRowset>  product;
  92.     HRESULT         hr;
  93.     DWORD           dwTime;
  94.  
  95.     ATLTRACE("DoStuff: Started\n");
  96.     hr = db.Open(_T("MSDASQL"), _T("OLE_DB_NWind_Jet"));
  97.     ATLASSERT(SUCCEEDED(hr));
  98.     if (FAILED(hr))
  99.         return hr;
  100.  
  101.     hr = session.Open(db);
  102.     ATLASSERT(SUCCEEDED(hr));
  103.     if (FAILED(hr))
  104.         return hr;
  105.  
  106.     CDBPropSet propset(DBPROPSET_ROWSET);
  107.     propset.AddProperty(DBPROP_CANHOLDROWS, true);
  108.  
  109.     hr = product.Open(session, _T("Products"), &propset);
  110.     ATLASSERT(SUCCEEDED(hr));
  111.     if (FAILED(hr))
  112.         return hr;
  113.  
  114.     DWORD  idThread;
  115.     int i;
  116.     HANDLE* phThread = new HANDLE[nThreads];
  117.     if (phThread == NULL)
  118.         return E_FAIL;
  119.  
  120.     dwTime = GetTickCount();
  121.     for (i=0; i<nThreads; i++)
  122.     {
  123.         *(phThread+i) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadTable, &product, 0, &idThread);
  124.         if (*(phThread+i) == NULL)
  125.             ATLTRACE(_T("Couldn't create thread %d\n"), i);
  126.     }
  127.  
  128.     // Ensure all threads are finished before we end
  129.     WaitForMultipleObjects(nThreads, phThread, TRUE, INFINITE);
  130.     // Return the total time
  131.     *pdwTime = GetTickCount() - dwTime;
  132.  
  133.     DWORD nTotalRows = 0, nRows;
  134.     for (i=0; i<nThreads; i++)
  135.     {
  136.         GetExitCodeThread(*(phThread + i), &nRows);
  137.         nTotalRows += nRows;
  138.         CloseHandle(*(phThread + i));
  139.     }
  140.     *pRowsProcessed = nTotalRows;
  141.     ATLTRACE("DoStuff: Ended\n");
  142.     return S_OK;
  143. }
  144.