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