1
1
/*
2
- * $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.40 2005/10/04 17:10:55 teodor Exp $
2
+ * $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.41 2005/10/07 15:31:49 tgl Exp $
3
3
*
4
4
* pgbench: a simple benchmark program for PostgreSQL
5
5
* written by Tatsuo Ishii
40
40
#endif /* ! WIN32 */
41
41
42
42
#include <ctype.h>
43
- #include <search.h>
44
43
45
44
extern char * optarg ;
46
45
extern int optind ;
@@ -90,6 +89,17 @@ char *login = NULL;
90
89
char * pwd = NULL ;
91
90
char * dbName ;
92
91
92
+ /* variable definitions */
93
+ typedef struct
94
+ {
95
+ char * name ; /* variable name */
96
+ char * value ; /* its value */
97
+ } Variable ;
98
+
99
+ /*
100
+ * structures used in custom query mode
101
+ */
102
+
93
103
typedef struct
94
104
{
95
105
PGconn * con ; /* connection handle to DB */
@@ -99,23 +109,12 @@ typedef struct
99
109
int ecnt ; /* error count */
100
110
int listen ; /* 0 indicates that an async query has
101
111
* been sent */
102
- void * variables ;
112
+ Variable * variables ; /* array of variable definitions */
113
+ int nvariables ;
103
114
struct timeval txn_begin ; /* used for measuring latencies */
104
115
int use_file ; /* index in sql_files for this client */
105
116
} CState ;
106
117
107
-
108
- /*
109
- * structures used in custom query mode
110
- */
111
-
112
- /* variable definitions */
113
- typedef struct
114
- {
115
- char * name ; /* variable name */
116
- char * value ; /* its value */
117
- } Variable ;
118
-
119
118
/*
120
119
* queries read from files
121
120
*/
@@ -180,7 +179,7 @@ usage(void)
180
179
static int
181
180
getrand (int min , int max )
182
181
{
183
- return ( min + (int ) (max * 1.0 * rand () / ( RAND_MAX + 1.0 ) + 0.5 ) );
182
+ return min + (int ) ((( max - min ) * ( double ) random ()) / MAX_RANDOM_VALUE + 0.5 );
184
183
}
185
184
186
185
/* set up a connection to the backend */
@@ -256,17 +255,26 @@ check(CState * state, PGresult *res, int n, int good)
256
255
static int
257
256
compareVariables (const void * v1 , const void * v2 )
258
257
{
259
- return strcmp (((Variable * )v1 )-> name , ((Variable * )v2 )-> name );
258
+ return strcmp (((const Variable * ) v1 )-> name ,
259
+ ((const Variable * ) v2 )-> name );
260
260
}
261
261
262
262
static char *
263
263
getVariable (CState * st , char * name )
264
264
{
265
265
Variable key = { name }, * var ;
266
266
267
- var = tfind (& key , & st -> variables , compareVariables );
267
+ /* On some versions of Solaris, bsearch of zero items dumps core */
268
+ if (st -> nvariables <= 0 )
269
+ return NULL ;
270
+
271
+ var = (Variable * ) bsearch ((void * ) & key ,
272
+ (void * ) st -> variables ,
273
+ st -> nvariables ,
274
+ sizeof (Variable ),
275
+ compareVariables );
268
276
if (var != NULL )
269
- return ( * ( Variable * * ) var ) -> value ;
277
+ return var -> value ;
270
278
else
271
279
return NULL ;
272
280
}
@@ -276,30 +284,55 @@ putVariable(CState * st, char *name, char *value)
276
284
{
277
285
Variable key = { name }, * var ;
278
286
279
- var = tfind (& key , & st -> variables , compareVariables );
287
+ /* On some versions of Solaris, bsearch of zero items dumps core */
288
+ if (st -> nvariables > 0 )
289
+ var = (Variable * ) bsearch ((void * ) & key ,
290
+ (void * ) st -> variables ,
291
+ st -> nvariables ,
292
+ sizeof (Variable ),
293
+ compareVariables );
294
+ else
295
+ var = NULL ;
296
+
280
297
if (var == NULL )
281
298
{
282
- if ((var = malloc (sizeof (Variable ))) == NULL )
299
+ Variable * newvars ;
300
+
301
+ if (st -> variables )
302
+ newvars = (Variable * ) realloc (st -> variables ,
303
+ (st -> nvariables + 1 ) * sizeof (Variable ));
304
+ else
305
+ newvars = (Variable * ) malloc (sizeof (Variable ));
306
+
307
+ if (newvars == NULL )
283
308
return false;
284
309
310
+ st -> variables = newvars ;
311
+
312
+ var = & newvars [st -> nvariables ];
313
+
285
314
var -> name = NULL ;
286
315
var -> value = NULL ;
287
316
288
317
if ((var -> name = strdup (name )) == NULL
289
- || (var -> value = strdup (value )) == NULL
290
- || tsearch (var , & st -> variables , compareVariables ) == NULL )
318
+ || (var -> value = strdup (value )) == NULL )
291
319
{
292
320
free (var -> name );
293
321
free (var -> value );
294
- free (var );
295
322
return false;
296
323
}
324
+
325
+ st -> nvariables ++ ;
326
+
327
+ qsort ((void * ) st -> variables , st -> nvariables , sizeof (Variable ),
328
+ compareVariables );
297
329
}
298
330
else
299
331
{
300
- free ((* (Variable * * )var )-> value );
301
- if (((* (Variable * * )var )-> value = strdup (value )) == NULL )
332
+ if ((value = strdup (value )) == NULL )
302
333
return false;
334
+ free (var -> value );
335
+ var -> value = value ;
303
336
}
304
337
305
338
return true;
@@ -783,7 +816,7 @@ process_commands(char *buf)
783
816
return NULL ;
784
817
}
785
818
786
- if ((max = atoi (my_commands -> argv [3 ])) < min || max > RAND_MAX )
819
+ if ((max = atoi (my_commands -> argv [3 ])) < min || max > MAX_RANDOM_VALUE )
787
820
{
788
821
fprintf (stderr , "%s: invalid maximum number %s\n" ,
789
822
my_commands -> argv [0 ], my_commands -> argv [3 ]);
0 commit comments