~paul-mccullagh/perconatools/tpcc-fix-mac-build

« back to all changes in this revision

Viewing changes to src/main.c

  • Committer: Vadim Tkachenko
  • Date: 2008-12-04 02:50:59 UTC
  • Revision ID: vadim@percona.com-20081204025059-7qdugxws565smubk
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * main.pc 
 
3
 * driver for the tpcc transactions
 
4
 */
 
5
 
 
6
#include <stdio.h>
 
7
#include <stdlib.h>
 
8
#include <unistd.h>
 
9
#include <string.h>
 
10
#include <sys/time.h>
 
11
#include <signal.h>
 
12
#include <pthread.h>
 
13
#include <fcntl.h>
 
14
 
 
15
#include <mysql.h>
 
16
 
 
17
#include "tpc.h"
 
18
#include "trans_if.h"
 
19
#include "spt_proc.h"
 
20
#include "sequence.h"
 
21
#include "rthist.h"
 
22
 
 
23
/* Global SQL Variables */
 
24
MYSQL **ctx;
 
25
MYSQL_STMT ***stmt;
 
26
 
 
27
#define DB_STRING_MAX 51
 
28
 
 
29
char connect_string[DB_STRING_MAX];
 
30
char db_string[DB_STRING_MAX];
 
31
char db_user[DB_STRING_MAX];
 
32
char db_password[DB_STRING_MAX];
 
33
 
 
34
int num_ware;
 
35
int num_conn;
 
36
int lampup_time;
 
37
int measure_time;
 
38
 
 
39
int num_node; /* number of servers that consists of cluster i.e. RAC (0:normal mode)*/
 
40
#define NUM_NODE_MAX 8
 
41
char node_string[NUM_NODE_MAX][DB_STRING_MAX];
 
42
 
 
43
int time_count;
 
44
#define PRINT_INTERVAL 10
 
45
 
 
46
int success[5];
 
47
int late[5];
 
48
int retry[5];
 
49
int failure[5];
 
50
 
 
51
int* success2[5];
 
52
int* late2[5];
 
53
int* retry2[5];
 
54
int* failure2[5];
 
55
 
 
56
int success2_sum[5];
 
57
int late2_sum[5];
 
58
int retry2_sum[5];
 
59
int failure2_sum[5];
 
60
 
 
61
int prev_s[5];
 
62
int prev_l[5];
 
63
 
 
64
float max_rt[5];
 
65
 
 
66
int activate_transaction;
 
67
int counting_on;
 
68
 
 
69
long clk_tck;
 
70
 
 
71
int is_local = 0; /* "1" mean local */
 
72
int valuable_flg = 0; /* "1" mean valuable ratio */
 
73
 
 
74
 
 
75
int thread_main(int t_num);
 
76
 
 
77
void alarm_handler(int signum);
 
78
void alarm_dummy();
 
79
 
 
80
int main( int argc, char *argv[] )
 
81
{
 
82
  int i, k, t_num, arg_offset;
 
83
  long j;
 
84
  float f;
 
85
  pthread_t *t;
 
86
  timer_t timer;
 
87
  struct itimerval itval;
 
88
  struct sigaction  sigact;
 
89
 
 
90
  int fd, seed;
 
91
 
 
92
  printf("***************************************\n");
 
93
  printf("*** ###easy### TPC-C Load Generator ***\n");
 
94
  printf("***************************************\n");
 
95
 
 
96
  /* initialize */
 
97
  hist_init();
 
98
  activate_transaction = 1;
 
99
  counting_on = 0;
 
100
 
 
101
  for ( i=0; i<5; i++ ){
 
102
    success[i]=0;
 
103
    late[i]=0;
 
104
    retry[i]=0;
 
105
    failure[i]=0;
 
106
 
 
107
    prev_s[i]=0;
 
108
    prev_l[i]=0;
 
109
 
 
110
    max_rt[i]=0.0;
 
111
  }
 
112
 
 
113
  /* dummy initialize*/
 
114
  num_ware = 1;
 
115
  num_conn = 10;
 
116
  lampup_time = 10;
 
117
  measure_time = 20;
 
118
  strcpy( connect_string, "tpcc/tpcc" );
 
119
  strcpy( db_string, "tpcc" );
 
120
 
 
121
  /* number of node (default 0) */
 
122
  num_node = 0;
 
123
  arg_offset = 0;
 
124
 
 
125
  /* alarm initialize */
 
126
  time_count = 0;
 
127
  itval.it_interval.tv_sec = PRINT_INTERVAL;
 
128
  itval.it_interval.tv_usec = 0;
 
129
  itval.it_value.tv_sec = PRINT_INTERVAL;
 
130
  itval.it_value.tv_usec = 0;
 
131
  sigact.sa_handler = alarm_handler;
 
132
  sigact.sa_flags = 0;
 
133
  sigemptyset(&sigact.sa_mask);
 
134
 
 
135
  /* setup handler&timer */
 
136
  if( sigaction( SIGALRM, &sigact, NULL ) == -1 ) {
 
137
    fprintf(stderr, "error in sigaction()\n");
 
138
    exit(1);
 
139
  }
 
140
 
 
141
  clk_tck = sysconf(_SC_CLK_TCK);
 
142
 
 
143
  /* Parse args */
 
144
 
 
145
  if ((num_node == 0)&&(argc == 14)) { /* hidden mode */
 
146
    valuable_flg = 1;
 
147
  }
 
148
      
 
149
  if ((num_node == 0)&&(valuable_flg == 0)&&(argc != 9)) {
 
150
    fprintf(stderr, "\n usage: tpcc_start [server] [DB] [user] [pass] [warehouse] [connection] [rampup] [measure]\n");
 
151
    exit(1);
 
152
  }
 
153
 
 
154
  if ( strlen(argv[1]) >= DB_STRING_MAX ) {
 
155
    fprintf(stderr, "\n server phrase is too long\n");
 
156
    exit(1);
 
157
  }
 
158
  if ( strlen(argv[2]) >= DB_STRING_MAX ) {
 
159
    fprintf(stderr, "\n DBname phrase is too long\n");
 
160
    exit(1);
 
161
  }
 
162
  if ( strlen(argv[3]) >= DB_STRING_MAX ) {
 
163
    fprintf(stderr, "\n user phrase is too long\n");
 
164
    exit(1);
 
165
  }
 
166
  if ( strlen(argv[4]) >= DB_STRING_MAX ) {
 
167
    fprintf(stderr, "\n pass phrase is too long\n");
 
168
    exit(1);
 
169
  }
 
170
  if ((num_ware = atoi(argv[5 + arg_offset])) <= 0) {
 
171
    fprintf(stderr, "\n expecting positive number of warehouses\n");
 
172
    exit(1);
 
173
  }
 
174
  if ((num_conn = atoi(argv[6 + arg_offset])) <= 0) {
 
175
    fprintf(stderr, "\n expecting positive number of connections\n");
 
176
    exit(1);
 
177
  }
 
178
  if ((lampup_time = atoi(argv[7 + arg_offset])) < 0) {
 
179
    fprintf(stderr, "\n expecting positive number of lampup_time [sec]\n");
 
180
    exit(1);
 
181
  }
 
182
  if ((measure_time = atoi(argv[8 + arg_offset])) < 0) {
 
183
    fprintf(stderr, "\n expecting positive number of measure_time [sec]\n");
 
184
    exit(1);
 
185
  }
 
186
  strcpy( connect_string, argv[1] );
 
187
  strcpy( db_string, argv[2] );
 
188
  strcpy( db_user, argv[3] );
 
189
  strcpy( db_password, argv[4] );
 
190
  if(strcmp(db_string,"l")==0){
 
191
    is_local = 1;
 
192
  }else{
 
193
    is_local = 0;
 
194
  }
 
195
 
 
196
  if(valuable_flg==1){
 
197
    if( (atoi(argv[9 + arg_offset]) < 0)||(atoi(argv[10 + arg_offset]) < 0)||(atoi(argv[11 + arg_offset]) < 0)
 
198
        ||(atoi(argv[12 + arg_offset]) < 0)||(atoi(argv[13 + arg_offset]) < 0) ) {
 
199
      fprintf(stderr, "\n expecting positive number of ratio parameters\n");
 
200
      exit(1);
 
201
    }
 
202
  }
 
203
 
 
204
  if( num_node > 0 ){
 
205
    if( num_ware % num_node != 0 ){
 
206
      fprintf(stderr, "\n [warehouse] value must be devided by [num_node].\n");
 
207
      exit(1);
 
208
    }
 
209
    if( num_conn % num_node != 0 ){
 
210
      fprintf(stderr, "\n [connection] value must be devided by [num_node].\n");
 
211
      exit(1);
 
212
    }
 
213
  }
 
214
 
 
215
  printf("<Parameters>\n");
 
216
  if(is_local==0)printf("     [server]: %s\n", connect_string);
 
217
  printf("     [DBname]: %s\n", db_string);
 
218
  printf("       [user]: %s\n", db_user);
 
219
  printf("       [pass]: %s\n", db_password);
 
220
 
 
221
  printf("  [warehouse]: %d\n", num_ware);
 
222
  printf(" [connection]: %d\n", num_conn);
 
223
  printf("     [rampup]: %d (sec.)\n", lampup_time);
 
224
  printf("    [measure]: %d (sec.)\n", measure_time);
 
225
 
 
226
  if(valuable_flg==1){
 
227
    printf("      [ratio]: %d:%d:%d:%d:%d\n", atoi(argv[9 + arg_offset]), atoi(argv[10 + arg_offset]),
 
228
           atoi(argv[11 + arg_offset]), atoi(argv[12 + arg_offset]), atoi(argv[13 + arg_offset]) );
 
229
  }
 
230
 
 
231
  fd = open("/dev/urandom", O_RDONLY);
 
232
  if (fd == -1) {
 
233
    fd = open("/dev/random", O_RDONLY);
 
234
    if (fd == -1) {
 
235
      struct timeval  tv;
 
236
      gettimeofday(&tv, NULL);
 
237
      seed = (tv.tv_sec ^ tv.tv_usec) * tv.tv_sec * tv.tv_usec ^ tv.tv_sec;
 
238
    }else{
 
239
      read(fd, &seed, sizeof(seed));
 
240
      close(fd);
 
241
    }
 
242
  }else{
 
243
    read(fd, &seed, sizeof(seed));
 
244
    close(fd);
 
245
  }
 
246
  SetSeed(seed);
 
247
 
 
248
  if(valuable_flg==0){
 
249
    seq_init(10,10,1,1,1); /* normal ratio */
 
250
  }else{
 
251
    seq_init( atoi(argv[9 + arg_offset]), atoi(argv[10 + arg_offset]), atoi(argv[11 + arg_offset]),
 
252
              atoi(argv[12 + arg_offset]), atoi(argv[13 + arg_offset]) );
 
253
  }
 
254
 
 
255
  /* set up each counter */
 
256
  for ( i=0; i<5; i++ ){
 
257
      success2[i] = malloc( sizeof(int) * num_conn );
 
258
      late2[i] = malloc( sizeof(int) * num_conn );
 
259
      retry2[i] = malloc( sizeof(int) * num_conn );
 
260
      failure2[i] = malloc( sizeof(int) * num_conn );
 
261
      for ( k=0; k<num_conn; k++ ){
 
262
          success2[i][k] = 0;
 
263
          late2[i][k] = 0;
 
264
          retry2[i][k] = 0;
 
265
          failure2[i][k] = 0;
 
266
      }
 
267
  }
 
268
 
 
269
  /* set up threads */
 
270
 
 
271
  t = malloc( sizeof(pthread_t) * num_conn );
 
272
  if ( t == NULL ){
 
273
    fprintf(stderr, "error at malloc(pthread_t)\n");
 
274
    exit(1);
 
275
  }
 
276
 
 
277
  ctx = malloc( sizeof(MYSQL *) * num_conn );
 
278
  stmt = malloc( sizeof(MYSQL_STMT **) * num_conn );
 
279
  for( i=0; i < num_conn; i++ ){
 
280
      stmt[i] = malloc( sizeof(MYSQL_STMT *) * 40 );
 
281
  }
 
282
 
 
283
  if ( ctx == NULL ){
 
284
    fprintf(stderr, "error at malloc(sql_context)\n");
 
285
    exit(1);
 
286
  }
 
287
 
 
288
  /* EXEC SQL WHENEVER SQLERROR GOTO sqlerr; */
 
289
 
 
290
  for( i=0; i < num_conn; i++ ){
 
291
    ctx[i] = mysql_init(NULL);
 
292
    if(!ctx[i]) goto sqlerr;
 
293
  }
 
294
 
 
295
  for( t_num=0; t_num < num_conn; t_num++ ){
 
296
    pthread_create( &t[t_num], NULL, (void *)thread_main, (void *)t_num );
 
297
  }
 
298
 
 
299
 
 
300
  printf("\nRAMP-UP TIME.(%d sec.)\n",lampup_time);
 
301
  fflush(stdout);
 
302
  sleep(lampup_time);
 
303
  printf("\nMEASURING START.\n\n");
 
304
  fflush(stdout);
 
305
 
 
306
  /* sleep(measure_time); */
 
307
  /* start timer */
 
308
 
 
309
#ifndef _SLEEP_ONLY_
 
310
  if( setitimer(ITIMER_REAL, &itval, NULL) == -1 ) {
 
311
    fprintf(stderr, "error in setitimer()\n");
 
312
  }
 
313
#endif
 
314
 
 
315
  counting_on = 1;
 
316
  /* wait signal */
 
317
  for(i = 0; i < (measure_time / PRINT_INTERVAL); i++ ) {
 
318
#ifndef _SLEEP_ONLY_
 
319
    pause();
 
320
#else
 
321
    sleep(PRINT_INTERVAL);
 
322
    alarm_dummy();
 
323
#endif
 
324
  }
 
325
  counting_on = 0;
 
326
 
 
327
#ifndef _SLEEP_ONLY_
 
328
  /* stop timer */
 
329
  itval.it_interval.tv_sec = 0;
 
330
  itval.it_interval.tv_usec = 0;
 
331
  itval.it_value.tv_sec = 0;
 
332
  itval.it_value.tv_usec = 0;
 
333
  if( setitimer(ITIMER_REAL, &itval, NULL) == -1 ) {
 
334
    fprintf(stderr, "error in setitimer()\n");
 
335
  }
 
336
#endif
 
337
 
 
338
  printf("\nSTOPPING THREADS");
 
339
  activate_transaction = 0;
 
340
 
 
341
  /* wait threads' ending and close connections*/
 
342
  for( i=0; i < num_conn; i++ ){
 
343
    pthread_join( t[i], NULL );
 
344
  }
 
345
 
 
346
  printf("\n");
 
347
 
 
348
  free(ctx);
 
349
  for( i=0; i < num_conn; i++ ){
 
350
      free(stmt[i]);
 
351
  }
 
352
  free(stmt);
 
353
 
 
354
  free(t);
 
355
 
 
356
  hist_report();
 
357
 
 
358
  printf("\n<Raw Results>\n");
 
359
  for ( i=0; i<5; i++ ){
 
360
    printf("  [%d] sc:%d  lt:%d  rt:%d  fl:%d \n", i, success[i], late[i], retry[i], failure[i]);
 
361
  }
 
362
  printf(" in %d sec.\n", (measure_time / PRINT_INTERVAL) * PRINT_INTERVAL);
 
363
 
 
364
  printf("\n<Raw Results2(sum ver.)>\n");
 
365
  for( i=0; i<5; i++ ){
 
366
      success2_sum[i] = 0;
 
367
      late2_sum[i] = 0;
 
368
      retry2_sum[i] = 0;
 
369
      failure2_sum[i] = 0;
 
370
      for( k=0; k<num_conn; k++ ){
 
371
          success2_sum[i] += success2[i][k];
 
372
          late2_sum[i] += late2[i][k];
 
373
          retry2_sum[i] += retry2[i][k];
 
374
          failure2_sum[i] += failure2[i][k];
 
375
      }
 
376
  }
 
377
  for ( i=0; i<5; i++ ){
 
378
      printf("  [%d] sc:%d  lt:%d  rt:%d  fl:%d \n", i, success2_sum[i], late2_sum[i], retry2_sum[i], failure2_sum[i]);
 
379
  }
 
380
 
 
381
  printf("\n<Constraint Check> (all must be [OK])\n [transaction percentage]\n");
 
382
  for ( i=0, j=0; i<5; i++ ){
 
383
    j += (success[i] + late[i]);
 
384
  }
 
385
 
 
386
  f = 100.0 * (float)(success[1] + late[1])/(float)j;
 
387
  printf("        Payment: %3.2f%% (>=43.0%%)",f);
 
388
  if ( f >= 43.0 ){
 
389
    printf(" [OK]\n");
 
390
  }else{
 
391
    printf(" [NG] *\n");
 
392
  }
 
393
  f = 100.0 * (float)(success[2] + late[2])/(float)j;
 
394
  printf("   Order-Status: %3.2f%% (>= 4.0%%)",f);
 
395
  if ( f >= 4.0 ){
 
396
    printf(" [OK]\n");
 
397
  }else{
 
398
    printf(" [NG] *\n");
 
399
  }
 
400
  f = 100.0 * (float)(success[3] + late[3])/(float)j;
 
401
  printf("       Delivery: %3.2f%% (>= 4.0%%)",f);
 
402
  if ( f >= 4.0 ){
 
403
    printf(" [OK]\n");
 
404
  }else{
 
405
    printf(" [NG] *\n");
 
406
  }
 
407
  f = 100.0 * (float)(success[4] + late[4])/(float)j;
 
408
  printf("    Stock-Level: %3.2f%% (>= 4.0%%)",f);
 
409
  if ( f >= 4.0 ){
 
410
    printf(" [OK]\n");
 
411
  }else{
 
412
    printf(" [NG] *\n");
 
413
  }
 
414
 
 
415
  printf(" [response time (at least 90%% passed)]\n");
 
416
  f = 100.0 * (float)success[0]/(float)(success[0] + late[0]);
 
417
  printf("      New-Order: %3.2f%% ",f);
 
418
  if ( f >= 90.0 ){
 
419
    printf(" [OK]\n");
 
420
  }else{
 
421
    printf(" [NG] *\n");
 
422
  }
 
423
  f = 100.0 * (float)success[1]/(float)(success[1] + late[1]);
 
424
  printf("        Payment: %3.2f%% ",f);
 
425
  if ( f >= 90.0 ){
 
426
    printf(" [OK]\n");
 
427
  }else{
 
428
    printf(" [NG] *\n");
 
429
  }
 
430
  f = 100.0 * (float)success[2]/(float)(success[2] + late[2]);
 
431
  printf("   Order-Status: %3.2f%% ",f);
 
432
  if ( f >= 90.0 ){
 
433
    printf(" [OK]\n");
 
434
  }else{
 
435
    printf(" [NG] *\n");
 
436
  }
 
437
  f = 100.0 * (float)success[3]/(float)(success[3] + late[3]);
 
438
  printf("       Delivery: %3.2f%% ",f);
 
439
  if ( f >= 90.0 ){
 
440
    printf(" [OK]\n");
 
441
  }else{
 
442
    printf(" [NG] *\n");
 
443
  }
 
444
  f = 100.0 * (float)success[4]/(float)(success[4] + late[4]);
 
445
  printf("    Stock-Level: %3.2f%% ",f);
 
446
  if ( f >= 90.0 ){
 
447
    printf(" [OK]\n");
 
448
  }else{
 
449
    printf(" [NG] *\n");
 
450
  }
 
451
 
 
452
  printf("\n<TpmC>\n");
 
453
  f = (float)(success[0] + late[0]) * 60.0 
 
454
    / (float)((measure_time / PRINT_INTERVAL) * PRINT_INTERVAL);
 
455
  printf("                 %.3f TpmC\n",f);
 
456
  exit(0);
 
457
 
 
458
 sqlerr:
 
459
  fprintf(stdout, "error at main\n");
 
460
  error(ctx[i],0);
 
461
  exit(1);
 
462
 
 
463
}
 
464
 
 
465
 
 
466
void alarm_handler(int signum)
 
467
{
 
468
  int i;
 
469
  int s[5],l[5];
 
470
  float rt90[5];
 
471
 
 
472
  for( i=0; i<5; i++ ){
 
473
    s[i] = success[i];
 
474
    l[i] = late[i];
 
475
    rt90[i] = hist_ckp(i);
 
476
  }
 
477
 
 
478
  time_count += PRINT_INTERVAL;
 
479
  printf("%4d, %d(%d):%.1f, %d(%d):%.1f, %d(%d):%.1f, %d(%d):%.1f, %d(%d):%.1f\n",
 
480
         time_count,
 
481
         ( s[0] + l[0] - prev_s[0] - prev_l[0] ),
 
482
         ( l[0] - prev_l[0] ),
 
483
         rt90[0],
 
484
         ( s[1] + l[1] - prev_s[1] - prev_l[1] ),
 
485
         ( l[1] - prev_l[1] ),
 
486
         rt90[1],
 
487
         ( s[2] + l[2] - prev_s[2] - prev_l[2] ),
 
488
         ( l[2] - prev_l[2] ),
 
489
         rt90[2],
 
490
         ( s[3] + l[3] - prev_s[3] - prev_l[3] ),
 
491
         ( l[3] - prev_l[3] ),
 
492
         rt90[3],
 
493
         ( s[4] + l[4] - prev_s[4] - prev_l[4] ),
 
494
         ( l[4] - prev_l[4] ),
 
495
         rt90[4]
 
496
         );
 
497
  fflush(stdout);
 
498
 
 
499
  for( i=0; i<5; i++ ){
 
500
    prev_s[i] = s[i];
 
501
    prev_l[i] = l[i];
 
502
  }
 
503
}
 
504
 
 
505
void alarm_dummy()
 
506
{
 
507
  int i;
 
508
  int s[5],l[5];
 
509
  float rt90[5];
 
510
 
 
511
  for( i=0; i<5; i++ ){
 
512
    s[i] = success[i];
 
513
    l[i] = late[i];
 
514
    rt90[i] = hist_ckp(i);
 
515
  }
 
516
 
 
517
  time_count += PRINT_INTERVAL;
 
518
  printf("%4d, %d(%d):%.1f, %d(%d):%.1f, %d(%d):%.1f, %d(%d):%.1f, %d(%d):%.1f\n",
 
519
         time_count,
 
520
         ( s[0] + l[0] - prev_s[0] - prev_l[0] ),
 
521
         ( l[0] - prev_l[0] ),
 
522
         rt90[0],
 
523
         ( s[1] + l[1] - prev_s[1] - prev_l[1] ),
 
524
         ( l[1] - prev_l[1] ),
 
525
         rt90[1],
 
526
         ( s[2] + l[2] - prev_s[2] - prev_l[2] ),
 
527
         ( l[2] - prev_l[2] ),
 
528
         rt90[2],
 
529
         ( s[3] + l[3] - prev_s[3] - prev_l[3] ),
 
530
         ( l[3] - prev_l[3] ),
 
531
         rt90[3],
 
532
         ( s[4] + l[4] - prev_s[4] - prev_l[4] ),
 
533
         ( l[4] - prev_l[4] ),
 
534
         rt90[4]
 
535
         );
 
536
  fflush(stdout);
 
537
 
 
538
  for( i=0; i<5; i++ ){
 
539
    prev_s[i] = s[i];
 
540
    prev_l[i] = l[i];
 
541
  }
 
542
}
 
543
 
 
544
int thread_main (int t_num)
 
545
{
 
546
  int r,i;
 
547
 
 
548
  char *db_string_ptr;
 
549
  MYSQL* resp;
 
550
 
 
551
  db_string_ptr = db_string;
 
552
 
 
553
  /* EXEC SQL WHENEVER SQLERROR GOTO sqlerr;*/
 
554
 
 
555
  if(num_node > 0){ /* RAC mode */
 
556
    db_string_ptr = node_string[((num_node * t_num)/num_conn)];
 
557
  }
 
558
 
 
559
  if(is_local==1){
 
560
    /* exec sql connect :connect_string; */
 
561
    resp = mysql_real_connect(ctx[t_num], "localhost", db_user, db_password, db_string, 3306, NULL, 0);
 
562
  }else{
 
563
    /* exec sql connect :connect_string USING :db_string; */
 
564
    resp = mysql_real_connect(ctx[t_num], connect_string, db_user, db_password, db_string, 3306, NULL, 0);
 
565
  }
 
566
 
 
567
  if(resp) {
 
568
    mysql_autocommit(ctx[t_num], 0);
 
569
  } else {
 
570
    mysql_close(ctx[t_num]);
 
571
    goto sqlerr;
 
572
  }
 
573
 
 
574
  for(i=0;i<40;i++){
 
575
      stmt[t_num][i] = mysql_stmt_init(ctx[t_num]);
 
576
      if(!stmt[t_num][i]) goto sqlerr;
 
577
  }
 
578
 
 
579
  /* Prepare ALL of SQLs */
 
580
  if( mysql_stmt_prepare(stmt[t_num][0], "SELECT c_discount, c_last, c_credit, w_tax FROM customer, warehouse WHERE w_id = ? AND c_w_id = w_id AND c_d_id = ? AND c_id = ?", 128) ) goto sqlerr;
 
581
  if( mysql_stmt_prepare(stmt[t_num][1], "SELECT d_next_o_id, d_tax FROM district WHERE d_id = ? AND d_w_id = ? FOR UPDATE", 80) ) goto sqlerr;
 
582
  if( mysql_stmt_prepare(stmt[t_num][2], "UPDATE district SET d_next_o_id = ? + 1 WHERE d_id = ? AND d_w_id = ?", 69) ) goto sqlerr;
 
583
  if( mysql_stmt_prepare(stmt[t_num][3], "INSERT INTO orders (o_id, o_d_id, o_w_id, o_c_id, o_entry_d, o_ol_cnt, o_all_local) VALUES(?, ?, ?, ?, ?, ?, ?)", 111) ) goto sqlerr;
 
584
  if( mysql_stmt_prepare(stmt[t_num][4], "INSERT INTO new_orders (no_o_id, no_d_id, no_w_id) VALUES (?,?,?)", 65) ) goto sqlerr;
 
585
  if( mysql_stmt_prepare(stmt[t_num][5], "SELECT i_price, i_name, i_data FROM item WHERE i_id = ?", 55) ) goto sqlerr;
 
586
  if( mysql_stmt_prepare(stmt[t_num][6], "SELECT s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, s_dist_06, s_dist_07, s_dist_08, s_dist_09, s_dist_10 FROM stock WHERE s_i_id = ? AND s_w_id = ? FOR UPDATE", 189) ) goto sqlerr;
 
587
  if( mysql_stmt_prepare(stmt[t_num][7], "UPDATE stock SET s_quantity = ? WHERE s_i_id = ? AND s_w_id = ?", 63) ) goto sqlerr;
 
588
  if( mysql_stmt_prepare(stmt[t_num][8], "INSERT INTO order_line (ol_o_id, ol_d_id, ol_w_id, ol_number, ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_dist_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", 159) ) goto sqlerr;
 
589
  if( mysql_stmt_prepare(stmt[t_num][9], "UPDATE warehouse SET w_ytd = w_ytd + ? WHERE w_id = ?", 53) ) goto sqlerr;
 
590
  if( mysql_stmt_prepare(stmt[t_num][10], "SELECT w_street_1, w_street_2, w_city, w_state, w_zip, w_name FROM warehouse WHERE w_id = ?", 91) ) goto sqlerr;
 
591
  if( mysql_stmt_prepare(stmt[t_num][11], "UPDATE district SET d_ytd = d_ytd + ? WHERE d_w_id = ? AND d_id = ?", 67) ) goto sqlerr;
 
592
  if( mysql_stmt_prepare(stmt[t_num][12], "SELECT d_street_1, d_street_2, d_city, d_state, d_zip, d_name FROM district WHERE d_w_id = ? AND d_id = ?", 105) ) goto sqlerr;
 
593
  if( mysql_stmt_prepare(stmt[t_num][13], "SELECT count(c_id) FROM customer WHERE c_w_id = ? AND c_d_id = ? AND c_last = ?", 79) ) goto sqlerr;
 
594
  if( mysql_stmt_prepare(stmt[t_num][14], "SELECT c_id FROM customer WHERE c_w_id = ? AND c_d_id = ? AND c_last = ? ORDER BY c_first", 89) ) goto sqlerr;
 
595
  if( mysql_stmt_prepare(stmt[t_num][15], "SELECT c_first, c_middle, c_last, c_street_1, c_street_2, c_city, c_state, c_zip, c_phone, c_credit, c_credit_lim, c_discount, c_balance, c_since FROM customer WHERE c_w_id = ? AND c_d_id = ? AND c_id = ? FOR UPDATE", 215) ) goto sqlerr;
 
596
  if( mysql_stmt_prepare(stmt[t_num][16], "SELECT c_data FROM customer WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?", 72) ) goto sqlerr;
 
597
  if( mysql_stmt_prepare(stmt[t_num][17], "UPDATE customer SET c_balance = ?, c_data = ? WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?", 90) ) goto sqlerr;
 
598
  if( mysql_stmt_prepare(stmt[t_num][18], "UPDATE customer SET c_balance = ? WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?", 78) ) goto sqlerr;
 
599
  if( mysql_stmt_prepare(stmt[t_num][19], "INSERT INTO history(h_c_d_id, h_c_w_id, h_c_id, h_d_id, h_w_id, h_date, h_amount, h_data) VALUES(?, ?, ?, ?, ?, ?, ?, ?)", 120) ) goto sqlerr;
 
600
  if( mysql_stmt_prepare(stmt[t_num][20], "SELECT count(c_id) FROM customer WHERE c_w_id = ? AND c_d_id = ? AND c_last = ?", 79) ) goto sqlerr;
 
601
  if( mysql_stmt_prepare(stmt[t_num][21], "SELECT c_balance, c_first, c_middle, c_last FROM customer WHERE c_w_id = ? AND c_d_id = ? AND c_last = ? ORDER BY c_first", 121) ) goto sqlerr;
 
602
  if( mysql_stmt_prepare(stmt[t_num][22], "SELECT c_balance, c_first, c_middle, c_last FROM customer WHERE c_w_id = ? AND c_d_id = ? AND c_id = ?", 102) ) goto sqlerr;
 
603
  if( mysql_stmt_prepare(stmt[t_num][23], "SELECT o_id, o_entry_d, COALESCE(o_carrier_id,0) FROM orders WHERE o_w_id = ? AND o_d_id = ? AND o_c_id = ? AND o_id = (SELECT MAX(o_id) FROM orders WHERE o_w_id = ? AND o_d_id = ? AND o_c_id = ?)", 196) ) goto sqlerr;
 
604
  if( mysql_stmt_prepare(stmt[t_num][24], "SELECT ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_delivery_d FROM order_line WHERE ol_w_id = ? AND ol_d_id = ? AND ol_o_id = ?", 135) ) goto sqlerr;
 
605
  if( mysql_stmt_prepare(stmt[t_num][25], "SELECT COALESCE(MIN(no_o_id),0) FROM new_orders WHERE no_d_id = ? AND no_w_id = ?", 81) ) goto sqlerr;
 
606
  if( mysql_stmt_prepare(stmt[t_num][26], "DELETE FROM new_orders WHERE no_o_id = ? AND no_d_id = ? AND no_w_id = ?", 72) ) goto sqlerr;
 
607
  if( mysql_stmt_prepare(stmt[t_num][27], "SELECT o_c_id FROM orders WHERE o_id = ? AND o_d_id = ? AND o_w_id = ?", 70) ) goto sqlerr;
 
608
  if( mysql_stmt_prepare(stmt[t_num][28], "UPDATE orders SET o_carrier_id = ? WHERE o_id = ? AND o_d_id = ? AND o_w_id = ?", 79) ) goto sqlerr;
 
609
  if( mysql_stmt_prepare(stmt[t_num][29], "UPDATE order_line SET ol_delivery_d = ? WHERE ol_o_id = ? AND ol_d_id = ? AND ol_w_id = ?", 89) ) goto sqlerr;
 
610
  if( mysql_stmt_prepare(stmt[t_num][30], "SELECT SUM(ol_amount) FROM order_line WHERE ol_o_id = ? AND ol_d_id = ? AND ol_w_id = ?", 87) ) goto sqlerr;
 
611
  if( mysql_stmt_prepare(stmt[t_num][31], "UPDATE customer SET c_balance = c_balance + ? , c_delivery_cnt = c_delivery_cnt + 1 WHERE c_id = ? AND c_d_id = ? AND c_w_id = ?", 128) ) goto sqlerr;
 
612
  if( mysql_stmt_prepare(stmt[t_num][32], "SELECT d_next_o_id FROM district WHERE d_id = ? AND d_w_id = ?", 62) ) goto sqlerr;
 
613
  if( mysql_stmt_prepare(stmt[t_num][33], "SELECT DISTINCT ol_i_id FROM order_line WHERE ol_w_id = ? AND ol_d_id = ? AND ol_o_id < ? AND ol_o_id >= (? - 20)", 113) ) goto sqlerr;
 
614
  if( mysql_stmt_prepare(stmt[t_num][34], "SELECT count(*) FROM stock WHERE s_w_id = ? AND s_i_id = ? AND s_quantity < ?", 77) ) goto sqlerr;
 
615
 
 
616
  r = driver(t_num);
 
617
 
 
618
  /* EXEC SQL COMMIT WORK; */
 
619
  if( mysql_commit(ctx[t_num]) ) goto sqlerr;
 
620
 
 
621
  for(i=0;i<40;i++){
 
622
      mysql_stmt_free_result(stmt[t_num][i]);
 
623
      mysql_stmt_close(stmt[t_num][i]);
 
624
  }
 
625
 
 
626
  /* EXEC SQL DISCONNECT; */
 
627
  mysql_close(ctx[t_num]);
 
628
 
 
629
  printf(".");
 
630
  fflush(stdout);
 
631
 
 
632
  return(r);
 
633
 
 
634
 sqlerr:
 
635
  fprintf(stdout, "error at thread_main\n");
 
636
  error(ctx[t_num],0);
 
637
  return(0);
 
638
 
 
639
}