adoInsertRecs.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:14k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. // InsertRecs.cpp : Defines the entry point for the console application.
  14. //
  15. #include "stdafx.h"
  16. #import "C:Program FilesCommon FilesSystemADOmsado15.dll" 
  17.     no_namespace rename("EOF", "EndOfFile")
  18. // data for CALL_CONTEXT and GROUP_RESOURCE
  19. static TCHAR STATUS_DATA[]=_T("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F")
  20.    _T("101112131415161718191A1B1C1D1E1F000102030405060708090A0B0C0D0E0F")
  21.    _T("202122232425262728292A2B2C2D2E2F000102030405060708090A0B0C0D0E0F")
  22.    _T("303132333435363738393A3B3C3D3E3F000102030405060708090A0B0C0D0E0F")
  23.    _T("404142434445464748494A4B4C4D4E4F000102030405060708090A0B0C0D0E0F")
  24.    _T("505152535455565758595A5B5C5D5E5F000102030405060708090A0B0C0D0E0F")
  25.    _T("606162636465666768696A6B6C6D6E6F000102030405060708090A0B0C0D0E0F")
  26.    _T("707172737475767778797A7B7C7D7E7F000102030405060708090A0B0C0D0E0F")
  27.    _T("808182838485868788898A8B8C8D8E8F000102030405060708090A0B0C0D0E0F")
  28.    _T("909192939495969798999A9B9C9D9E9F000102030405060708090A0B0C0D0E0F")
  29.    _T("10010110210310410510610710810910A000102030405060708090A0B0C0D0EF")
  30.    _T("10B10C10D10E10F110111112113114115000102030405060708090A0B0C0D0EF")
  31.    _T("11611711811911A11B11C11D11E11F120000102030405060708090A0B0C0D0EF")
  32.    _T("12112212312412512612712812912A12B000102030405060708090A0B0C0D0EF")
  33.    _T("12C12D12E12F130131132134135136137000102030405060708090A0B0C0D0EF")
  34.    _T("13813913A13B13C13D13E13F140141142000102030405060708090A0B0C0D0EF")
  35.    _T("14314414514614714814914A14B14C14D000102030405060708090A0B0C0D0EF")
  36.    _T("14E14F150151152153154155156157158000102030405060708090A0B0C0D0EF")
  37.    _T("15915A15B15C15D15E15F160161162163000102030405060708090A0B0C0D0EF")
  38.    _T("16416516616716816916A16B16C16D16E000102030405060708090A0B0C0D0EF")
  39.    _T("16F170171172173174175176177178179000102030405060708090A0B0C0D0EF")
  40.    _T("17A17B17C17D17E17F180181182183184000102030405060708090A0B0C0D0EF")
  41.    _T("18518618718818918A18B18C18D18E18F000102030405060708090A0B0C0D0EF")
  42.    _T("19019119219319419519619719819919A000102030405060708090A0B0C0D0EF")
  43.    _T("19B19C19D19E19F200201202203204205000102030405060708090A0B0C0D0EF")
  44.    _T("20620720820920A20B20C20D20F210211000102030405060708090A0B0C0D0EF")
  45.    _T("21221321421521621721821921A21B21C000102030405060708090A0B0C0D0EF")
  46.    _T("21D21E21F220221222223224225226227000102030405060708090A0B0C0D0EF")
  47.    _T("22822922A22B22C22D22E22F230231232000102030405060708090A0B0C0D0EF")
  48.    _T("23323423523623723823923A23B23C23D000102030405060708090A0B0C0D0EF")
  49.    _T("23E23F240241242243244245246247248000102030405060708090A0B0C0D0EF")
  50.    _T("24924A24B24C24D24E24F250251252253000102030405060708090A0B0C0D0EF")
  51.    _T("101112131415161718191A1B1C1D1E1F000102030405060708090A0B0C0D0E0F")
  52.    _T("202122232425262728292A2B2C2D2E2F000102030405060708090A0B0C0D0E0F")
  53.    _T("303132333435363738393A3B3C3D3E3F000102030405060708090A0B0C0D0E0F")
  54.    _T("404142434445464748494A4B4C4D4E4F000102030405060708090A0B0C0D0E0F")
  55.    _T("505152535455565758595A5B5C5D5E5F000102030405060708090A0B0C0D0E0F")
  56.    _T("606162636465666768696A6B6C6D6E6F000102030405060708090A0B0C0D0E0F")
  57.    _T("707172737475767778797A7B7C7D7E7F000102030405060708090A0B0C0D0E0F")
  58.    _T("808182838485868788898A8B8C8D8E8F000102030405060708090A0B0C0D0E0F")
  59.    _T("909192939495969798999A9B9C9D9E9F000102030405060708090A0B0C0D0E0F")
  60.    _T("10010110210310410510610710810910A000102030405060708090A0B0C0D0EF")
  61.    _T("10B10C10D10E10F110111112113114115000102030405060708090A0B0C0D0EF")
  62.    _T("11611711811911A11B11C11D11E11F120000102030405060708090A0B0C0D0EF")
  63.    _T("12112212312412512612712812912A12B000102030405060708090A0B0C0D0EF")
  64.    _T("12C12D12E12F130131132134135136137000102030405060708090A0B0C0D0EF")
  65.    _T("13813913A13B13C13D13E13F140141142000102030405060708090A0B0C0D0EF")
  66.    _T("14314414514614714814914A14B14C14D000102030405060708090A0B0C0D0EF")
  67.    _T("14E14F150151152153154155156157158000102030405060708090A0B0C0D0EF")
  68.    _T("15915A15B15C15D15E15F160161162163000102030405060708090A0B0C0D0EF")
  69.    _T("16416516616716816916A16B16C16D16E000102030405060708090A0B0C0D0EF")
  70.    _T("16F170171172173174175176177178179000102030405060708090A0B0C0D0EF")
  71.    _T("17A17B17C17D17E17F180181182183184000102030405060708090A0B0C0D0EF")
  72.    _T("18518618718818918A18B18C18D18E18F000102030405060708090A0B0C0D0EF")
  73.    _T("19019119219319419519619719819919A000102030405060708090A0B0C0D0EF")
  74.    _T("19B19C19D19E19F200201202203204205000102030405060708090A0B0C0D0EF")
  75.    _T("20620720820920A20B20C20D20F210211000102030405060708090A0B0C0D0EF")
  76.    _T("21221321421521621721821921A21B21C000102030405060708090A0B0C0D0EF")
  77.    _T("21D21E21F220221222223224225226227000102030405060708090A0B0C0D0EF")
  78.    _T("22822922A22B22C22D22E22F230231232000102030405060708090A0B0C0D0EF")
  79.    _T("23323423523623723823923A23B23C23D000102030405060708090A0B0C0D0EF")
  80.    _T("2366890FE1438751097E7F6325DC0E6326F")
  81.    _T("25425525625725825925A25B25C25D25E25F000102030405060708090A0B0C0F");
  82. // Thread function for Call Context Inserts
  83. struct _ParamStruct
  84. {
  85. HANDLE hShutdownEvent;
  86. int nStartingRecordNum;
  87. long* pnNumCallsProcessed;
  88. };
  89. HANDLE hShutdownEvent = 0;
  90. BOOL WINAPI ConsoleCtrlHandler(DWORD dwCtrlType)
  91. {
  92. if(CTRL_C_EVENT == dwCtrlType)
  93. {
  94. SetEvent(hShutdownEvent);
  95. return TRUE;
  96. }
  97. return FALSE;
  98. }
  99. DWORD WINAPI RuntimeCallContext(LPVOID lpParam)
  100. {
  101.     long nNumCallsProcessed = 0;
  102. struct _ParamStruct* pData = (struct _ParamStruct*)lpParam;
  103.     int nStartingRecordID = pData->nStartingRecordNum;
  104.     HRESULT hr = CoInitialize(NULL);
  105. if(FAILED(hr))
  106. {
  107. printf("Error Initializing COM Libraryn");
  108. return (int)hr;
  109. }
  110. _ConnectionPtr cn = NULL;
  111. _CommandPtr cmdUpdate = NULL, cmdInsert = NULL, cmdDelete = NULL, cmdSelect = NULL;
  112. _RecordsetPtr rs = NULL;
  113. _ParameterPtr paramContextID = NULL;
  114.     _ParameterPtr paramVersion = NULL;
  115. _ParameterPtr paramLockFlag = NULL;
  116. _ParameterPtr ttparamLockFlag = NULL;
  117. _ParameterPtr paramLockTime = NULL;
  118. _ParameterPtr paramLockTimeUSec = NULL;
  119. _ParameterPtr paramContextData = NULL;
  120. _variant_t vtVersion;
  121. _variant_t vtLockFlag;
  122. _variant_t vtLockTime;
  123. _variant_t vtLockTimeUSec;
  124. _variant_t vtContextData;
  125. // Initialize Values
  126.     vtVersion = CALL_CONTEXT_VERSION;
  127. vtLockFlag = CALL_CONTEXT_LOCK_FLAG;
  128. vtLockTime = CALL_CONTEXT_LOCK_TIME;
  129. vtLockTimeUSec = CALL_CONTEXT_LOCK_TIME_USEC;
  130. vtContextData = STATUS_DATA;
  131. LARGE_INTEGER freq;
  132. DWORD dwStartTime, dwEndTime;
  133. LARGE_INTEGER liStartTime, liEndTime;
  134.     try
  135.     {
  136.         cn.CreateInstance(__uuidof(Connection));
  137.         cn->ConnectionString = _T("DSN=TTTelcoCS;");
  138.         cn->Open(_T(""),_T(""),_T(""),adConnectUnspecified);
  139. cmdUpdate.CreateInstance(__uuidof(Command));
  140.         cmdInsert.CreateInstance(__uuidof(Command));
  141.         cmdDelete.CreateInstance(__uuidof(Command));
  142.         cmdSelect.CreateInstance(__uuidof(Command));
  143. TCHAR tszInsert[10000], tszUpdate[10000];
  144. memset(tszInsert, 0, sizeof(tszInsert));
  145. memset(tszUpdate, 0, sizeof(tszUpdate));
  146. strcpy(tszInsert, "INSERT INTO dbo.CallContext(ContextId,Version,LockFlag,LockTime,LockTimeUSec,ContextData) VALUES(?,?,?,?,?,'");
  147. strcat(tszInsert, STATUS_DATA);
  148. strcat(tszInsert, "')");
  149.         cmdInsert->CommandText= tszInsert;
  150. cmdInsert->ActiveConnection = cn;
  151.         cmdInsert->Prepared = TRUE;
  152. strcpy(tszUpdate, "UPDATE dbo.CallContext SET ContextData = '");
  153. strcat(tszUpdate, STATUS_DATA);
  154. strcat(tszUpdate, "' WHERE ContextId = ?");
  155.         cmdUpdate->CommandText= tszUpdate;
  156. cmdUpdate->ActiveConnection = cn;
  157.         cmdUpdate->Prepared = TRUE;
  158.         cmdDelete->CommandText=_T("DELETE FROM dbo.CallContext WHERE ContextId = ?");
  159. cmdDelete->ActiveConnection = cn;
  160.         cmdDelete->Prepared = TRUE;
  161.         cmdSelect->CommandText=_T("SELECT ContextData FROM dbo.CallContext WHERE ContextId = ?");
  162. cmdSelect->ActiveConnection = cn;
  163.         cmdSelect->Prepared = TRUE;
  164. //Create params
  165. paramContextID = cmdInsert->CreateParameter(_T("ContextID"),adInteger,adParamInput,sizeof(int),nStartingRecordID);
  166. paramVersion = cmdInsert->CreateParameter(_T("Version"),adInteger,adParamInput,sizeof(int),1);//vtVersion);
  167. paramLockFlag = cmdInsert->CreateParameter(_T("LockFlag"),adInteger,adParamInput,sizeof(int),1);//vtLockFlag);
  168. ttparamLockFlag = cmdUpdate->CreateParameter(_T("LockFlag"),adInteger,adParamInput,sizeof(int),1);//vtLockFlag);
  169. paramLockTime = cmdInsert->CreateParameter(_T("LockTime"),adInteger,adParamInput,sizeof(int),1);//vtLockTime);
  170. paramLockTimeUSec = cmdInsert->CreateParameter(_T("LockTimeUSec"),adInteger,adParamInput,sizeof(int),1);//vtLockTimeUSec);
  171. paramContextData = cmdInsert->CreateParameter(_T("ContextData"), adBSTR, adParamInput, SysStringByteLen(vtContextData.bstrVal), vtContextData);
  172. //paramContextData->put_Value(vtContextData);
  173. //Append params
  174. cmdInsert->Parameters->Append(paramContextID);
  175. cmdInsert->Parameters->Append(paramVersion);
  176. cmdInsert->Parameters->Append(paramLockFlag);
  177. cmdInsert->Parameters->Append(paramLockTime);
  178. cmdInsert->Parameters->Append(paramLockTimeUSec);
  179. //cmdInsert->Parameters->Append(paramContextData);
  180.         cmdUpdate->Parameters->Append(paramContextID);
  181. //cmdUpdate->Parameters->Append(paramContextID);
  182.         cmdSelect->Parameters->Append(paramContextID);
  183.         cmdDelete->Parameters->Append(paramContextID);
  184.         while(WaitForSingleObject(pData->hShutdownEvent,0) != WAIT_OBJECT_0)
  185.         {
  186.             paramContextID->Value = nStartingRecordID++;
  187. bool bTimeLatency = (nStartingRecordID == 100) ? TRUE : FALSE;
  188. if (bTimeLatency)
  189. {
  190. BOOL bSuccess = QueryPerformanceFrequency(&freq);
  191. if (!bSuccess)
  192. printf("Error retrieving frequency: %dn", GetLastError());
  193. }
  194.             for (int i=0; i < 20; i++)
  195.             {
  196.                 switch(i)
  197.                 {
  198.                     case 3:
  199.                     case 6:
  200.                     case 9: 
  201.                     case 11: 
  202.                     case 12: 
  203.                     case 15: 
  204.                     case 18:   // Query Record
  205. if (bTimeLatency)
  206.    QueryPerformanceCounter(&liStartTime);
  207.                         cmdSelect->Execute(NULL, NULL, -1);
  208. if (bTimeLatency)
  209. {
  210. QueryPerformanceCounter(&liEndTime);
  211. printf("Read = %d msec.n", (liEndTime.QuadPart - liStartTime.QuadPart) / (freq.QuadPart/1000));
  212. }
  213.                         break;
  214.                     case 19:    // Delete Record
  215. if (bTimeLatency)
  216.    QueryPerformanceCounter(&liStartTime);
  217.                         cmdDelete->Execute(NULL,NULL,adExecuteNoRecords);
  218. if (bTimeLatency)
  219. {
  220. QueryPerformanceCounter(&liEndTime);
  221. printf("Delete = %d msec.n", (liEndTime.QuadPart - liStartTime.QuadPart) / (freq.QuadPart/1000));
  222. }
  223.                         break;
  224.                     case 0: // Insert Record
  225. if (bTimeLatency)
  226.    QueryPerformanceCounter(&liStartTime);
  227.                 cmdInsert->Execute(NULL,NULL,adExecuteNoRecords);
  228. if (bTimeLatency)
  229. {
  230. QueryPerformanceCounter(&liEndTime);
  231. printf("Insert = %d msec.n", (liEndTime.QuadPart - liStartTime.QuadPart) / (freq.QuadPart/1000));
  232. }
  233.                         break;
  234.                     default:    // Update Record
  235. if (bTimeLatency)
  236.    QueryPerformanceCounter(&liStartTime);
  237.                         cmdUpdate->Execute(NULL,NULL,adExecuteNoRecords);
  238. if (bTimeLatency)
  239. {
  240. QueryPerformanceCounter(&liEndTime);
  241. printf("Update = %d msec.n", (liEndTime.QuadPart - liStartTime.QuadPart) / (freq.QuadPart/1000));
  242. }
  243.                         
  244. break;
  245.                 }
  246.             }
  247. nNumCallsProcessed++;
  248.             InterlockedIncrement(pData->pnNumCallsProcessed);
  249.         }
  250. cn->Close();
  251.     }
  252.     catch(_com_error &e)
  253.     {
  254.         printf("%d: nt%snt%sn", 
  255. e.Error(), 
  256. e.ErrorMessage(), 
  257. e.Source());
  258.     }
  259.     return 0;
  260. }
  261. int _tmain(int argc, _TCHAR* argv[])
  262. {
  263. long nNumThreads=4;
  264. long nSeed = 0;
  265. if(lstrcmp(argv[1],_T("/?")) == 0)
  266. {
  267. _tprintf(_T("InsertRecs [No.Of Threads] [Record Seed No.]n"));
  268. return 0;
  269. }
  270. if(argc > 1) 
  271.      nNumThreads = _ttol(argv[1]);
  272. else
  273. nNumThreads = 4;
  274. if (argc > 2)
  275. nSeed = _ttol(argv[2]);
  276. _tprintf(_T("Num of Threads = %d, Seed = %d"), nNumThreads, nSeed);
  277. long nNumCallsProcessed = 0;
  278.     SetConsoleCtrlHandler(ConsoleCtrlHandler,true); 
  279. hShutdownEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  280. DWORD dwStartTime  = GetTickCount();
  281. DWORD dwThreadID = 0;
  282. HANDLE hThreads[50];
  283. struct _ParamStruct params[50];
  284. for(int ij=0;ij<nNumThreads;ij++) {
  285. params[ij].hShutdownEvent = hShutdownEvent;
  286. params[ij].nStartingRecordNum = (ij*5000) + nSeed;
  287. params[ij].pnNumCallsProcessed = &nNumCallsProcessed;
  288. }
  289. for(int ij=0;ij<nNumThreads;ij++) {
  290. hThreads[ij] = CreateThread(NULL,NULL,RuntimeCallContext,&params[ij],0,&dwThreadID);
  291. }
  292. //Wait for the threads to finish
  293.     WaitForMultipleObjects(nNumThreads,hThreads,TRUE,INFINITE);
  294. DWORD dwEndTime  = GetTickCount();
  295. CloseHandle(hShutdownEvent);
  296. //Print time taken
  297. _tprintf(_T("Time Taken for %d Calls is %ld msec (= %ld calls/secn"),
  298. nNumCallsProcessed,dwEndTime-dwStartTime, (1000*nNumCallsProcessed/(dwEndTime-dwStartTime)));
  299. return 0;
  300. }