MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
InsertRecs.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 <NdbApi.hpp>
24 #include <windows.h>
25 #include <tchar.h>
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 
94 struct _ParamStruct
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 
114 
115 
116 DWORD WINAPI RuntimeCallContext(LPVOID lpParam)
117 {
118  long nNumCallsProcessed = 0;
119 
120  struct _ParamStruct* pData = (struct _ParamStruct*)lpParam;
121  int nStartingRecordID = pData->nStartingRecordNum;
122 
123  Ndb* pNdb;
124  NdbConnection* pNdbConnection;
125  NdbOperation* pNdbOperation;
126  NdbRecAttr* pNdbRecAttrContextData;
127 
128  char pchContextData[4008];
129 
130  LARGE_INTEGER freq;
131  LARGE_INTEGER liStartTime, liEndTime;
132 
133  pNdb = new Ndb("TEST_DB");
134  if(!pNdb)
135  {
136  printf("new Ndb failed\n");
137  return 0;
138  }
139 
140  try
141  {
142  if(pNdb->init(1)
143  || pNdb->waitUntilReady())
144  {
145  throw pNdb;
146  }
147 
148  while(WaitForSingleObject(pData->hShutdownEvent,0) != WAIT_OBJECT_0)
149  {
150  nStartingRecordID++;
151 
152  bool bTimeLatency = (nStartingRecordID == 100) ? TRUE : FALSE;
153 
154  if (bTimeLatency)
155  {
156  BOOL bSuccess = QueryPerformanceFrequency(&freq);
157  if (!bSuccess)
158  printf("Error retrieving frequency: %d\n", GetLastError());
159 
160  }
161 
162  for (int i=0; i < 20; i++)
163  {
164  switch(i)
165  {
166  case 3:
167  case 6:
168  case 9:
169  case 11:
170  case 12:
171  case 15:
172  case 18: // Query Record
173  if (bTimeLatency)
174  QueryPerformanceCounter(&liStartTime);
175 
176  pNdbConnection = pNdb->startTransaction((Uint32)0, (const char*)&nStartingRecordID, (Uint32)4);
177  if(!pNdbConnection)
178  {
179  throw pNdb;
180  }
181  pNdbOperation = pNdbConnection->getNdbOperation(_T("CallContext"));
182  if(!pNdbOperation)
183  {
184  throw pNdbConnection;
185  }
186  if(pNdbOperation->readTuple()
187  || pNdbOperation->equal(_T("ContextId"), nStartingRecordID))
188  {
189  throw pNdbOperation;
190  }
191  pNdbRecAttrContextData = pNdbOperation->getValue(_T("ContextData"), pchContextData);
192  if(!pNdbRecAttrContextData)
193  {
194  throw pNdbOperation;
195  }
196  if(pNdbConnection->execute(Commit))
197  {
198  throw pNdbConnection;
199  }
200  pNdb->closeTransaction(pNdbConnection);
201 
202  if (bTimeLatency)
203  {
204  QueryPerformanceCounter(&liEndTime);
205  printf("Read = %d msec.\n", (liEndTime.QuadPart - liStartTime.QuadPart) / (freq.QuadPart/1000));
206  }
207  break;
208 
209  case 19: // Delete Record
210  if (bTimeLatency)
211  QueryPerformanceCounter(&liStartTime);
212 
213  pNdbConnection = pNdb->startTransaction((Uint32)0, (const char*)&nStartingRecordID, (Uint32)4);
214  if(!pNdbConnection)
215  {
216  throw pNdb;
217  }
218  pNdbOperation = pNdbConnection->getNdbOperation(_T("CallContext"));
219  if(!pNdbOperation)
220  {
221  throw pNdbConnection;
222  }
223  if(pNdbOperation->deleteTuple()
224  || pNdbOperation->equal(_T("ContextId"), nStartingRecordID))
225  {
226  throw pNdbOperation;
227  }
228  if(pNdbConnection->execute(Commit))
229  {
230  throw pNdbConnection;
231  }
232  pNdb->closeTransaction(pNdbConnection);
233 
234  if (bTimeLatency)
235  {
236  QueryPerformanceCounter(&liEndTime);
237  printf("Delete = %d msec.\n", (liEndTime.QuadPart - liStartTime.QuadPart) / (freq.QuadPart/1000));
238  }
239  break;
240 
241  case 0: // Insert Record
242  if (bTimeLatency)
243  QueryPerformanceCounter(&liStartTime);
244 
245  pNdbConnection = pNdb->startTransaction((Uint32)0, (const char*)&nStartingRecordID, (Uint32)4);
246  if(!pNdbConnection)
247  {
248  throw pNdb;
249  }
250  pNdbOperation = pNdbConnection->getNdbOperation(_T("CallContext"));
251  if(!pNdbOperation)
252  {
253  throw pNdbConnection;
254  }
255  if(pNdbOperation->insertTuple()
256  || pNdbOperation->equal(_T("ContextId"), nStartingRecordID)
257  || pNdbOperation->setValue(_T("Version"), Int32(1))
258  || pNdbOperation->setValue(_T("LockFlag"), Int32(1))
259  || pNdbOperation->setValue(_T("LockTime"), Int32(1))
260  || pNdbOperation->setValue(_T("LockTimeUSec"), Int32(1))
261  || pNdbOperation->setValue(_T("ContextData"), STATUS_DATA, sizeof(STATUS_DATA)))
262  {
263  throw pNdbOperation;
264  }
265  if(pNdbConnection->execute(Commit))
266  {
267  throw pNdbConnection;
268  }
269  pNdb->closeTransaction(pNdbConnection);
270 
271  if (bTimeLatency)
272  {
273  QueryPerformanceCounter(&liEndTime);
274  printf("Insert = %d msec.\n", (liEndTime.QuadPart - liStartTime.QuadPart) / (freq.QuadPart/1000));
275  }
276  break;
277 
278  default: // Update Record
279  if (bTimeLatency)
280  QueryPerformanceCounter(&liStartTime);
281 
282  pNdbConnection = pNdb->startTransaction((Uint32)0, (const char*)&nStartingRecordID, (Uint32)4);
283  if(!pNdbConnection)
284  {
285  throw pNdb;
286  }
287  pNdbOperation = pNdbConnection->getNdbOperation(_T("CallContext"));
288  if(!pNdbOperation)
289  {
290  throw pNdbConnection;
291  }
292  if(pNdbOperation->updateTuple())
293  {
294  throw pNdbOperation;
295  }
296  if(pNdbOperation->equal(_T("ContextId"), nStartingRecordID)
297  || pNdbOperation->setValue(_T("ContextData"), STATUS_DATA, sizeof(STATUS_DATA)))
298  {
299  throw pNdbOperation;
300  }
301  if(pNdbConnection->execute(Commit))
302  {
303  throw pNdbConnection;
304  }
305  pNdb->closeTransaction(pNdbConnection);
306 
307  if (bTimeLatency)
308  {
309  QueryPerformanceCounter(&liEndTime);
310  printf("Update = %d msec.\n", (liEndTime.QuadPart - liStartTime.QuadPart) / (freq.QuadPart/1000));
311  }
312 
313  break;
314  }
315  }
316 
317  nNumCallsProcessed++;
318 
319  InterlockedIncrement(pData->pnNumCallsProcessed);
320  }
321 
322  delete pNdb;
323  }
324  catch(Ndb* pNdb)
325  {
326  printf("%d: \n\t%s\n\t%s\n",
327  pNdb->getNdbError(),
328  pNdb->getNdbErrorString(),
329  "Ndb");
330  delete pNdb;
331  }
332  catch(NdbConnection* pNdbConnection)
333  {
334  printf("%d: \n\t%s\n\t%s\n",
335  pNdbConnection->getNdbError(),
336  pNdbConnection->getNdbErrorString(),
337  "NdbConnection");
338  pNdb->closeTransaction(pNdbConnection);
339  delete pNdb;
340  }
341  catch(NdbOperation* pNdbOperation)
342  {
343  printf("%d: \n\t%s\n\t%s\n",
344  pNdbOperation->getNdbError(),
345  pNdbOperation->getNdbErrorString(),
346  "NdbOperation");
347  pNdb->closeTransaction(pNdbConnection);
348  delete pNdb;
349  }
350 
351  return 0;
352 }
353 
354 
355 void Initialize(Ndb* pNdb, long nInsert, bool bStoredTable)
356 {
357  NdbSchemaCon* pNdbSchemaCon;
358  NdbSchemaOp* pNdbSchemaOp;
359  NdbConnection* pNdbConnection;
360  NdbOperation* pNdbOperation;
361 
362  try
363  {
364  _tprintf(_T("Create CallContext table\n"));
365 
366  pNdbSchemaCon = pNdb->startSchemaTransaction();
367  if(!pNdbSchemaCon)
368  {
369  throw pNdb;
370  }
371  pNdbSchemaOp = pNdbSchemaCon->getNdbSchemaOp();
372  if(!pNdbSchemaOp)
373  {
374  throw pNdbSchemaCon;
375  }
376  if(pNdbSchemaOp->createTable(_T("CallContext"), 8, TupleKey, 2, All, 6, 78, 80, 1, bStoredTable)
377  || pNdbSchemaOp->createAttribute(_T("ContextId"), TupleKey, 32, 1, Signed)
378  || pNdbSchemaOp->createAttribute(_T("Version"), NoKey, 32, 1, Signed)
379  || pNdbSchemaOp->createAttribute(_T("LockFlag"), NoKey, 32, 1, Signed)
380  || pNdbSchemaOp->createAttribute(_T("LockTime"), NoKey, 32, 1, Signed)
381  || pNdbSchemaOp->createAttribute(_T("LockTimeUSec"), NoKey, 32, 1, Signed)
382  || pNdbSchemaOp->createAttribute(_T("ContextData"), NoKey, 8, 4004, String))
383  {
384  throw pNdbSchemaOp;
385  }
386  if(pNdbSchemaCon->execute())
387  {
388  throw pNdbSchemaCon;
389  }
390  pNdb->closeSchemaTransaction(pNdbSchemaCon);
391 
392  _tprintf(_T("Insert %d tuples in the CallContext table\n"), nInsert);
393  for(long i=0; i<nInsert; ++i)
394  {
395  long iContextId = -i;
396  pNdbConnection = pNdb->startTransaction((Uint32)0, (const char*)&iContextId, (Uint32)4);
397  if(!pNdbConnection)
398  {
399  throw pNdb;
400  }
401  pNdbOperation = pNdbConnection->getNdbOperation(_T("CallContext"));
402  if(!pNdbOperation)
403  {
404  throw pNdbConnection;
405  }
406  if(pNdbOperation->insertTuple()
407  || pNdbOperation->equal(_T("ContextId"), iContextId)
408  || pNdbOperation->setValue(_T("Version"), Int32(1))
409  || pNdbOperation->setValue(_T("LockFlag"), Int32(1))
410  || pNdbOperation->setValue(_T("LockTime"), Int32(1))
411  || pNdbOperation->setValue(_T("LockTimeUSec"), Int32(1))
412  || pNdbOperation->setValue(_T("ContextData"), STATUS_DATA, sizeof(STATUS_DATA)))
413  {
414  throw pNdbOperation;
415  }
416  if(pNdbConnection->execute(Commit))
417  {
418  throw pNdbConnection;
419  }
420  pNdb->closeTransaction(pNdbConnection);
421  }
422  _tprintf(_T("initialisation done\n"));
423  }
424  catch(Ndb* pNdb)
425  {
426  printf("%d: \n\t%s\n\t%s\n",
427  pNdb->getNdbError(),
428  pNdb->getNdbErrorString(),
429  "Ndb");
430  delete pNdb;
431  }
432  catch(NdbConnection* pNdbConnection)
433  {
434  printf("%d: \n\t%s\n\t%s\n",
435  pNdbConnection->getNdbError(),
436  pNdbConnection->getNdbErrorString(),
437  "NdbConnection");
438  pNdb->closeTransaction(pNdbConnection);
439  delete pNdb;
440  }
441  catch(NdbOperation* pNdbOperation)
442  {
443  printf("%d: \n\t%s\n\t%s\n",
444  pNdbOperation->getNdbError(),
445  pNdbOperation->getNdbErrorString(),
446  "NdbOperation");
447  pNdb->closeTransaction(pNdbConnection);
448  delete pNdb;
449  }
450  catch(NdbSchemaCon* pNdbSchemaCon)
451  {
452  printf("%d: \n\t%s\n\t%s\n",
453  pNdbSchemaCon->getNdbError(),
454  pNdbSchemaCon->getNdbErrorString(),
455  "pNdbSchemaCon");
456  pNdb->closeSchemaTransaction(pNdbSchemaCon);
457  delete pNdb;
458  }
459  catch(NdbSchemaOp* pNdbSchemaOp)
460  {
461  printf("%d: \n\t%s\n\t%s\n",
462  pNdbSchemaOp->getNdbError(),
463  pNdbSchemaOp->getNdbErrorString(),
464  "pNdbSchemaOp");
465  pNdb->closeTransaction(pNdbConnection);
466  delete pNdb;
467  }
468 }
469 
470 
471 int _tmain(int argc, _TCHAR* argv[])
472 {
473  long nNumThreads=4;
474  long nSeed = 0;
475  long nInsert = 0;
476  bool bStoredTable = true;
477  if(lstrcmp(argv[1],_T("/?")) == 0)
478  {
479  _tprintf(_T("InsertRecs [No.Of Threads] [Record Seed No.] [Init no. of rec.] [Stored?]\n"));
480  return 0;
481  }
482 
483  if(argc > 1)
484  nNumThreads = _ttol(argv[1]);
485  else
486  nNumThreads = 4;
487  if (argc > 2)
488  nSeed = _ttol(argv[2]);
489  _tprintf(_T("Num of Threads = %d, Seed = %d"), nNumThreads, nSeed);
490 
491  if(argc>3)
492  nInsert = _ttol(argv[3]);
493  if(argc>4)
494  bStoredTable = (_ttol(argv[4])!=0);
495 
496  long nNumCallsProcessed = 0;
497 
498  SetConsoleCtrlHandler(ConsoleCtrlHandler,true);
499  hShutdownEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
500 
501  // initiate windows sockets
502  WORD wVersionRequested;
503  WSADATA wsaData;
504  int err;
505  wVersionRequested = MAKEWORD( 2, 2 );
506  err = WSAStartup( wVersionRequested, &wsaData );
507  if ( err != 0 ) {
508  _tprintf(_T("could not find a usable WinSock DLL\n"));
509  return 0;
510  }
511  if ( LOBYTE( wsaData.wVersion ) != 2
512  || HIBYTE( wsaData.wVersion ) != 2 )
513  {
514  _tprintf(_T("could not find a usable WinSock DLL\n"));
515  WSACleanup();
516  return 0;
517  }
518 
519  Ndb* pNdb = new Ndb("TEST_DB");
520  if(!pNdb)
521  {
522  _tprintf(_T("could not construct ndb\n"));
523  return 0;
524  }
525  if(pNdb->init(1)
526  || pNdb->waitUntilReady())
527  {
528  _tprintf(_T("could not initialize ndb\n"));
529  return 0;
530  }
531 
532  if(nInsert>0)
533  {
534  Initialize(pNdb, nInsert, bStoredTable);
535  }
536 
537  if(nNumThreads>0)
538  {
539  _tprintf(_T("creating %d threads\n"), nNumThreads);
540  DWORD dwStartTime = GetTickCount();
541 
542  DWORD dwThreadID = 0;
543  HANDLE hThreads[50];
544 
545  struct _ParamStruct params[50];
546 
547  for(int ij=0;ij<nNumThreads;ij++) {
548  params[ij].hShutdownEvent = hShutdownEvent;
549  params[ij].nStartingRecordNum = (ij*5000) + nSeed;
550  params[ij].pnNumCallsProcessed = &nNumCallsProcessed;
551  }
552 
553  for(ij=0;ij<nNumThreads;ij++) {
554  hThreads[ij] = CreateThread(NULL,NULL,RuntimeCallContext,&params[ij],0,&dwThreadID);
555  }
556 
557  //Wait for the threads to finish
558  WaitForMultipleObjects(nNumThreads,hThreads,TRUE,INFINITE);
559  DWORD dwEndTime = GetTickCount();
560 
561  //Print time taken
562  _tprintf(_T("Time Taken for %d Calls is %ld msec (= %ld calls/sec\n"),
563  nNumCallsProcessed,dwEndTime-dwStartTime, (1000*nNumCallsProcessed/(dwEndTime-dwStartTime)));
564  }
565 
566  delete pNdb;
567  WSACleanup();
568  CloseHandle(hShutdownEvent);
569 
570  return 0;
571 }
572 
573