~drizzle-trunk/drizzle/development

1999.6.1 by kalebral at gmail
update Copyright strings to a more common format to help with creating the master debian copyright file
1
/* Copyright (C) 2005 PrimeBase Technologies GmbH
1455.3.1 by Vladimir Kolesnikov
lp:drizzle + pbxt 1.1 + test results
2
 *
3
 * PrimeBase XT
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; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
1802.10.2 by Monty Taylor
Update all of the copyright headers to include the correct address.
17
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1455.3.1 by Vladimir Kolesnikov
lp:drizzle + pbxt 1.1 + test results
18
 *
19
 * 2005-01-03	Paul McCullagh
20
 *
21
 * H&G2JCtL
22
 */
23
24
#include "xt_config.h"
25
26
#include <stdio.h>
27
#include <string.h>
28
#include <ctype.h>
29
30
#include "strutil_xt.h"
31
32
xtPublic void xt_strcpy(size_t size, char *to, c_char *from)
33
{
34
	if (size > 0) {
35
		size--;
36
		while (*from && size--)
37
			*to++ = *from++;
38
		*to = 0;
39
	}
40
}
41
42
xtPublic void xt_strncpy(size_t size, char *to, c_char *from, size_t len_from)
43
{
44
	if (size > 0) {
45
		size--;
46
		while (len_from-- && size--)
47
			*to++ = *from++;
48
		*to = 0;
49
	}
50
}
51
52
xtPublic void xt_strcpy_term(size_t size, char *to, c_char *from, char term)
53
{
54
	if (size > 0) {
55
		size--;
56
		while (*from && *from != term && size--)
57
			*to++ = *from++;
58
		*to = 0;
59
	}
60
}
61
62
xtPublic void xt_strcat_term(size_t size, char *to, c_char *from, char term)
63
{
64
	while (*to && size--) to++;
65
	if (size > 0) {
66
		size--;
67
		while (*from && *from != term && size--)
68
			*to++ = *from++;
69
		*to = 0;
70
	}
71
}
72
73
xtPublic void xt_strcat(size_t size, char *to, c_char *from)
74
{
75
	while (*to && size--) to++;
76
	xt_strcpy(size, to, from);
77
}
78
79
xtPublic void xt_strcati(size_t size, char *to, int i)
80
{
81
	char buffer[50];
82
	
83
	sprintf(buffer, "%d", i);
84
	xt_strcat(size, to, buffer);
85
}
86
87
xtPublic xtBool xt_ends_with(c_char *str, c_char *sub)
88
{
89
	unsigned long len = strlen(str);
90
	
91
	if (len >= strlen(sub))
92
		return strcmp(&str[len-strlen(sub)], sub) == 0;
93
	return FALSE;
94
}
95
96
xtPublic xtPublic xtBool xt_starts_with(c_char *str, c_char *sub)
97
{
98
	return (strstr(str, sub) == str);
99
}
100
101
/* This function returns "" if the path ends with a dir char */
102
xtPublic void xt_2nd_last_name_of_path(size_t size, char *dest, c_char *path)
103
{
104
	size_t	len;
105
	c_char	*ptr, *pend;
106
107
	len = strlen(path);
108
	if (!len) {
109
		*dest = 0;
110
		return;
111
	}
112
113
 	/* {INVALID-OLD-TABLE-FIX}
114
	 * I have changed the implementation of
115
	 * this bug fix (see {INVALID-OLD-TABLE-FIX}).
116
       if (!is_prefix(path, mysql_data_home) &&
117
            !is_prefix(path, mysql_real_data_home))
118
        {
119
          *dest= 0;
120
          return;
121
        }
122
	 */
123
124
	ptr = path + len - 1;
125
	while (ptr != path && !XT_IS_DIR_CHAR(*ptr))
126
		ptr--;
127
	if (!XT_IS_DIR_CHAR(*ptr)) {
128
		*dest = 0;
129
		return;
130
	}
131
	pend = ptr;
132
	ptr--;
133
	while (ptr != path && !XT_IS_DIR_CHAR(*ptr))
134
		ptr--;
135
	if (XT_IS_DIR_CHAR(*ptr))
136
		ptr++;
137
	len = (size_t) (pend - ptr);
138
	if (len > size-1)
139
		len = size-1;
140
	memcpy(dest, ptr, len);
141
	dest[len] = 0;
142
}
143
144
/* This function returns "" if the path ends with a dir char */
145
xtPublic char *xt_last_name_of_path(c_char *path)
146
{
147
	size_t	length;
148
	c_char	*ptr;
149
150
	length = strlen(path);
151
	if (!length)
152
		return (char *) path;
153
	ptr = path + length - 1;
154
	while (ptr != path && !XT_IS_DIR_CHAR(*ptr)) ptr--;
155
	if (XT_IS_DIR_CHAR(*ptr)) ptr++;
156
	return (char *) ptr;
157
}
158
159
xtPublic char *xt_last_2_names_of_path(c_char *path)
160
{
161
	size_t	length;
162
	c_char	*ptr;
163
164
	length = strlen(path);
165
	if (!length)
166
		return (char *) path;
167
	ptr = path + length - 1;
168
	while (ptr != path && !XT_IS_DIR_CHAR(*ptr)) ptr--;
169
	if (XT_IS_DIR_CHAR(*ptr)) {
170
		ptr--;
171
		while (ptr != path && !XT_IS_DIR_CHAR(*ptr)) ptr--;
172
		if (XT_IS_DIR_CHAR(*ptr))
173
			ptr++;
174
	}
175
	return (char *) ptr;
176
}
177
178
xtPublic c_char *xt_last_directory_of_path(c_char *path)
179
/* This function returns the last name component, even if the path ends with a dir char */
180
{
181
	size_t	length;
182
	c_char	*ptr;
183
184
	length = strlen(path);
185
	if (!length)
186
		return(path);
187
	ptr = path + length - 1;
188
	/* Path may end with multiple slashes: */
189
	while (ptr != path && XT_IS_DIR_CHAR(*ptr))
190
		ptr--;
191
	while (ptr != path && !XT_IS_DIR_CHAR(*ptr))
192
		ptr--;
193
	if (XT_IS_DIR_CHAR(*ptr)) ptr++;
194
	return(ptr);
195
}
196
197
xtPublic char *xt_find_extension(c_char *file_name)
198
{
199
	c_char	*ptr;
200
201
	for (ptr = file_name + strlen(file_name) - 1; ptr >= file_name; ptr--) {
202
		if (XT_IS_DIR_CHAR(*ptr))
203
			break;
204
		if (*ptr == '.')
205
			return (char *) (ptr + 1);
206
	}
207
	return NULL;
208
}
209
210
xtPublic void xt_remove_extension(char *file_name)
211
{
212
	char *ptr = xt_find_extension(file_name);
213
214
	if (ptr)
215
		*(ptr - 1) = 0;
216
}
217
218
xtPublic xtBool xt_is_extension(c_char *file_name, c_char *ext)
219
{
220
	char *ptr;
221
	
222
	if (!(ptr = xt_find_extension(file_name)))
223
		return FALSE;
224
	return strcmp(ptr, ext) == 0;
225
}
226
227
/*
228
 * Optionally remove trailing directory delimiters (If the directory name consists of one
229
 * character, the directory delimiter is not removed).
230
 */
231
xtPublic xtBool xt_remove_dir_char(char *dir_name)
232
{
233
	size_t	length;
234
	xtBool	removed = FALSE;
235
	
236
	length = strlen(dir_name);
237
	while (length > 1 && XT_IS_DIR_CHAR(dir_name[length - 1])) {
238
		dir_name[length - 1] = '\0';
239
		length--;
240
		removed = TRUE;
241
	}
242
	return removed;
243
}
244
245
xtPublic void xt_remove_last_name_of_path(char *path)
246
{
247
	char *ptr;
248
249
	if ((ptr = xt_last_name_of_path(path)))
250
		*ptr = 0;
251
}
252
253
xtBool xt_add_dir_char(size_t max, char *path)
254
{
255
	size_t slen = strlen(path);
256
257
	if (slen >= max)
258
		return FALSE;
259
260
	if (slen == 0) {
261
		/* If no path is given we will be at the current working directory, under UNIX we must
262
		 * NOT add a directory delimiter character:
263
		 */
264
		return FALSE;
265
	}
266
267
	if (!XT_IS_DIR_CHAR(path[slen - 1])) {
268
		path[slen] = XT_DIR_CHAR;
269
		path[slen + 1] = '\0';
270
		return TRUE;
271
	}
272
	return FALSE;
273
}
274
275
xtPublic xtInt8 xt_str_to_int8(c_char *ptr, xtBool *overflow)
276
{
277
	xtInt8 value = 0;
278
279
	if (overflow)
280
		*overflow = FALSE;
281
	while (*ptr == '0') ptr++;
282
	if (!*ptr)
283
		value = (xtInt8) 0;
284
	else {
285
		sscanf(ptr, "%"PRId64, &value);
286
		if (!value && overflow)
287
			*overflow = TRUE;
288
	}
289
	return value;
290
}
291
292
xtPublic void xt_int8_to_str(xtInt8 value, char *string)
293
{
294
	sprintf(string, "%"PRId64, value);
295
}
296
297
xtPublic void xt_double_to_str(double value, int scale, char *string)
298
{
299
	char *ptr;
300
301
	sprintf(string, "%.*f", scale, value);
302
	ptr = string + strlen(string) - 1;
303
	
304
	if (strchr(string, '.') && (*ptr == '0' || *ptr == '.')) {
305
		while (ptr-1 > string && *(ptr-1) == '0') ptr--;
306
		if (ptr-1 > string && *(ptr-1) == '.') ptr--;
307
		*ptr = 0;
308
	}
309
}
310
311
/*
312
 * This function understand GB, MB, KB.
313
 */
314
xtPublic xtInt8 xt_byte_size_to_int8(c_char *ptr)
315
{
316
	char	number[101], *num_ptr;
317
	xtInt8	size;
318
319
	while (*ptr && isspace(*ptr))
320
		ptr++;
321
322
	num_ptr = number;
323
	while (*ptr && isdigit(*ptr)) {
324
		if (num_ptr < number+100) {
325
			*num_ptr = *ptr;
326
			num_ptr++;
327
		}
328
		ptr++;
329
	}
330
	*num_ptr = 0;
331
	size = xt_str_to_int8(number, NULL);
332
333
	while (*ptr && isspace(*ptr))
334
		ptr++;
335
	
336
	switch (toupper(*ptr)) {
337
		case 'P':
338
			size *= 1024;
339
		case 'T':
340
			size *= 1024;
341
		case 'G':
342
			size *= 1024;
343
		case 'M':
344
			size *= 1024;
345
		case 'K':
346
			size *= 1024;
347
			break;
348
	}
349
	
350
	return size;
351
}
352
353
xtPublic void xt_int8_to_byte_size(xtInt8 value, char *string)
354
{
355
	double	v;
356
	c_char	*unit;
357
	char	val_str[100];
358
359
	if (value >= (xtInt8) (1024 * 1024 * 1024)) {
360
		v = (double) value / (double) (1024 * 1024 * 1024);
361
		unit = "GB";
362
	}
363
	else if (value >= (xtInt8) (1024 * 1024)) {
364
		v = (double) value / (double) (1024 * 1024);
365
		unit = "MB";
366
	}
367
	else if (value >= (xtInt8) 1024) {
368
		v = (double) value / (double) (1024);
369
		unit = "Kb";
370
	}
371
	else {
372
		v = (double) value;
373
		unit = "bytes";
374
	}
375
	
376
	xt_double_to_str(v, 2, val_str);
377
	sprintf(string, "%s %s (%"PRId64" bytes)", val_str, unit, value);
378
}
379
380
/* Version number must also be set in configure.in! */
381
xtPublic c_char *xt_get_version(void)
382
{
1753.3.1 by Paul McCullagh
Merged with 1.1 trunk
383
	return "1.1.01 RC";
1455.3.1 by Vladimir Kolesnikov
lp:drizzle + pbxt 1.1 + test results
384
}
385
386
/* Copy and URL decode! */
387
xtPublic void xt_strcpy_url(size_t size, char *to, c_char *from)
388
{
389
	if (size > 0) {
390
		size--;
391
		while (*from && size--) {
392
			if (*from == '%' && isxdigit(*(from+1)) && isxdigit(*(from+2))) {
393
				unsigned char a = xt_hex_digit(*(from+1));
394
				unsigned char b = xt_hex_digit(*(from+2));
395
				*to++ = a << 4 | b;
396
				from += 3;
397
			}
398
			else
399
				*to++ = *from++;
400
		}
401
		*to = 0;
402
	}
403
}
404
405
/* Copy and URL decode! */
406
xtPublic void xt_strncpy_url(size_t size, char *to, c_char *from, size_t len_from)
407
{
408
	if (size > 0) {
409
		size--;
410
		while (len_from-- && size--) {
411
			if (*from == '%' && len_from >= 2 && isxdigit(*(from+1)) && isxdigit(*(from+2))) {
412
				unsigned char a = xt_hex_digit(*(from+1));
413
				unsigned char b = xt_hex_digit(*(from+2));
414
				*to++ = a << 4 | b;
415
				from += 3;
416
			}
417
			else
418
				*to++ = *from++;
419
		}
420
		*to = 0;
421
	}
422
}
423
424
/* Returns a pointer to the end of the string if nothing found! */
425
const char *xt_strchr(const char *str, char ch)
426
{
427
	while (*str && *str != ch) str++;
428
	return str;
429
}
430
431
unsigned char xt_hex_digit(char ch)
432
{
433
	if (isdigit(ch))
434
		return((unsigned char) ch - (unsigned char) '0');
435
436
	ch = toupper(ch);
437
	if (ch >= 'A' && ch <= 'F')
438
		return((unsigned char) ch - (unsigned char) 'A' + (unsigned char) 10);
439
440
	return((unsigned char) 0);
441
}
442
443
#ifdef XT_WIN
444
xtPublic void xt_win_dialog(char *message)
445
{
446
	MessageBoxA(NULL, message, "Debug Me!", MB_ICONWARNING | MB_OK);
447
}
448
#endif
449
450
/*
451
 * --------------- SYSTEM STATISTICS ------------------
452
 */
453
454
static char					su_t_unit[10] = "usec";
455
/*
456
 * Note times, are return in microseconds, but the display in xtstat is currently
457
 * in milliseconds.
458
 */
459
static XTStatMetaDataRec	pbxt_stat_meta_data[XT_STAT_MAXIMUM] = {
460
	{ XT_STAT_TIME_CURRENT,	"Current Time",				"time",	"curr",		XT_STAT_DATE,
461
		"The current time in seconds" },
462
	{ XT_STAT_TIME_PASSED,	"Time Since Last Call",		"time",	su_t_unit,	XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
463
		"Time passed in %sseconds since last statistics call" },
464
465
	{ XT_STAT_COMMITS,			"Commit Count",			"xact", "commt",	XT_STAT_ACCUMULATIVE,
466
		"Number of transactions committed" },
467
	{ XT_STAT_ROLLBACKS,		"Rollback Count",		"xact", "rollb",	XT_STAT_ACCUMULATIVE,
468
		"Number of transactions rolled back" },
469
	{ XT_STAT_WAIT_FOR_XACT,	"Wait for Xact Count",	"xact", "waits",	XT_STAT_ACCUMULATIVE,
470
		"Number of times waited for another transaction" },
471
	{ XT_STAT_XACT_TO_CLEAN,	"Dirty Xact Count",		"xact", "dirty",	0,
472
		"Number of transactions still to be cleaned up" },
473
474
	{ XT_STAT_STAT_READS,		"Read Statements",		"stat", "read",		XT_STAT_ACCUMULATIVE,
475
		"Number of SELECT statements" },
476
	{ XT_STAT_STAT_WRITES,		"Write Statements",		"stat", "write",	XT_STAT_ACCUMULATIVE,
477
		"Number of UPDATE/INSERT/DELETE statements" },
478
479
	{ XT_STAT_REC_BYTES_IN,		"Record Bytes Read",	"rec", "in",		XT_STAT_ACCUMULATIVE | XT_STAT_BYTE_COUNT,
480
		"Bytes read from the record/row files" },
481
	{ XT_STAT_REC_BYTES_OUT,	"Record Bytes Written",	"rec", "out",		XT_STAT_ACCUMULATIVE | XT_STAT_BYTE_COUNT,
482
		"Bytes written from the record/row files" },
483
	{ XT_STAT_REC_SYNC_COUNT,	"Record File Flushes",	"rec", "syncs",		XT_STAT_ACCUMULATIVE | XT_STAT_COMBO_FIELD,
484
		"Number of flushes to record/row files" },
485
	{ XT_STAT_REC_SYNC_TIME,	"Record Flush Time",	"rec", su_t_unit,	XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE | XT_STAT_COMBO_FIELD_2,
486
		"The time in %sseconds to flush record/row files" },
487
	{ XT_STAT_REC_CACHE_HIT,	"Record Cache Hits",	"rec", "hits",		XT_STAT_ACCUMULATIVE,
488
		"Hits when accessing the record cache" },
489
	{ XT_STAT_REC_CACHE_MISS,	"Record Cache Misses",	"rec", "miss",		XT_STAT_ACCUMULATIVE,
490
		"Misses when accessing the record cache" },
491
	{ XT_STAT_REC_CACHE_FREES,	"Record Cache Frees",	"rec", "frees",		XT_STAT_ACCUMULATIVE,
492
		"Number of record cache pages freed" },
493
	{ XT_STAT_REC_CACHE_USAGE,	"Record Cache Usage",	"rec", "%use",		XT_STAT_PERCENTAGE,
494
		"Percentage of record cache in use" },
495
496
	{ XT_STAT_IND_BYTES_IN,		"Index Bytes Read",		"ind", "in",		XT_STAT_ACCUMULATIVE | XT_STAT_BYTE_COUNT,
497
		"Bytes read from the index files" },
498
	{ XT_STAT_IND_BYTES_OUT,	"Index Bytes Written",	"ind", "out",		XT_STAT_ACCUMULATIVE | XT_STAT_BYTE_COUNT,
499
		"Bytes written from the index files" },
500
	{ XT_STAT_IND_SYNC_COUNT,	"Index File Flushes",	"ind", "syncs",		XT_STAT_ACCUMULATIVE | XT_STAT_COMBO_FIELD,
501
		"Number of flushes to index files" },
502
	{ XT_STAT_IND_SYNC_TIME,	"Index Flush Time",		"ind", su_t_unit,	XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE | XT_STAT_COMBO_FIELD_2,
503
		"The time in %sseconds to flush index files" },
504
	{ XT_STAT_IND_CACHE_HIT,	"Index Cache Hits",		"ind", "hits",		XT_STAT_ACCUMULATIVE,
505
		"Hits when accessing the index cache" },
506
	{ XT_STAT_IND_CACHE_MISS,	"Index Cache Misses",	"ind", "miss",		XT_STAT_ACCUMULATIVE,
507
		"Misses when accessing the index cache" },
508
	{ XT_STAT_IND_CACHE_USAGE,	"Index Cache Usage",	"ind", "%use",		XT_STAT_PERCENTAGE,
509
		"Percentage of index cache used" },
510
	{ XT_STAT_ILOG_BYTES_IN,	"Index Log Bytes In",	"ilog", "in",		XT_STAT_ACCUMULATIVE | XT_STAT_BYTE_COUNT,
511
		"Bytes read from the index log files" },
512
	{ XT_STAT_ILOG_BYTES_OUT,	"Index Log Bytes Out",	"ilog", "out",		XT_STAT_ACCUMULATIVE | XT_STAT_BYTE_COUNT,
513
		"Bytes written from the index log files" },
514
	{ XT_STAT_ILOG_SYNC_COUNT,	"Index Log File Syncs",	"ilog", "syncs",	XT_STAT_ACCUMULATIVE | XT_STAT_COMBO_FIELD,
515
		"Number of flushes to index log files" },
516
	{ XT_STAT_ILOG_SYNC_TIME,	"Index Log Sync Time",	"ilog", su_t_unit,	XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE | XT_STAT_COMBO_FIELD_2,
517
		"The time in %sseconds to flush index log files" },
518
519
	{ XT_STAT_XLOG_BYTES_IN,	"Xact Log Bytes In",	"xlog", "in",		XT_STAT_ACCUMULATIVE | XT_STAT_BYTE_COUNT,
520
		"Bytes read from the transaction log files" },
521
	{ XT_STAT_XLOG_BYTES_OUT,	"Xact Log Bytes Out",	"xlog", "out",		XT_STAT_ACCUMULATIVE | XT_STAT_BYTE_COUNT,
522
		"Bytes written from the transaction log files" },
523
	{ XT_STAT_XLOG_SYNC_COUNT,	"Xact Log File Syncs",	"xlog", "syncs",	XT_STAT_ACCUMULATIVE,
524
		"Number of flushes to transaction log files" },
525
	{ XT_STAT_XLOG_SYNC_TIME,	"Xact Log Sync Time",	"xlog", su_t_unit,	XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
526
		"The time in %sseconds to flush transaction log files" },
527
	{ XT_STAT_XLOG_CACHE_HIT,	"Xact Log Cache Hits",	"xlog", "hits",		XT_STAT_ACCUMULATIVE,
528
		"Hits when accessing the transaction log cache" },
529
	{ XT_STAT_XLOG_CACHE_MISS,	"Xact Log Cache Misses","xlog", "miss",		XT_STAT_ACCUMULATIVE,
530
		"Misses when accessing the transaction log cache" },
531
	{ XT_STAT_XLOG_CACHE_USAGE,	"Xact Log Cache Usage",	"xlog", "%use",		XT_STAT_PERCENTAGE,
532
		"Percentage of transaction log cache used" },
533
534
	{ XT_STAT_DATA_BYTES_IN,	"Data Log Bytes In",	"data", "in",		XT_STAT_ACCUMULATIVE | XT_STAT_BYTE_COUNT,
535
		"Bytes read from the data log files" },
536
	{ XT_STAT_DATA_BYTES_OUT,	"Data Log Bytes Out",	"data", "out",		XT_STAT_ACCUMULATIVE | XT_STAT_BYTE_COUNT,
537
		"Bytes written from the data log files" },
538
	{ XT_STAT_DATA_SYNC_COUNT,	"Data Log File Syncs",	"data", "syncs",	XT_STAT_ACCUMULATIVE,
539
		"Number of flushes to data log files" },
540
	{ XT_STAT_DATA_SYNC_TIME,	"Data Log Sync Time",	"data", su_t_unit,	XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
541
		"The time in %sseconds to flush data log files" },
542
543
	{ XT_STAT_BYTES_TO_CHKPNT,	"Bytes to Checkpoint",	"to", "chkpt",		XT_STAT_BYTE_COUNT,
544
		"Bytes written to the log since the last checkpoint" },
545
	{ XT_STAT_LOG_BYTES_TO_WRITE, "Log Bytes to Write",	"to", "write",		XT_STAT_BYTE_COUNT,
546
		"Bytes written to the log, still to be written to the database" },
547
	{ XT_STAT_BYTES_TO_SWEEP,	"Log Bytes to Sweep",	"to", "sweep",		XT_STAT_BYTE_COUNT,
548
		"Bytes written to the log, still to be read by the sweeper" },
549
	{ XT_STAT_SWEEPER_WAITS,	"Sweeper Wait on Xact",	"sweep", "waits",	XT_STAT_ACCUMULATIVE,
550
		"Attempts to cleanup a transaction" },
551
552
	{ XT_STAT_SCAN_INDEX,		"Index Scan Count",		"scan", "index",	XT_STAT_ACCUMULATIVE,
553
		"Number of index scans" },
554
	{ XT_STAT_SCAN_TABLE,		"Table Scan Count",		"scan", "table",	XT_STAT_ACCUMULATIVE,
555
		"Number of table scans" },
556
	{ XT_STAT_ROW_SELECT,		"Select Row Count",		"row", "sel",		XT_STAT_ACCUMULATIVE,
557
		"Number of rows selected" },
558
	{ XT_STAT_ROW_INSERT,		"Insert Row Count",		"row", "ins",		XT_STAT_ACCUMULATIVE,
559
		"Number of rows inserted" },
560
	{ XT_STAT_ROW_UPDATE,		"Update Row Count",		"row", "upd",		XT_STAT_ACCUMULATIVE,
561
		"Number of rows updated" },
562
	{ XT_STAT_ROW_DELETE,		"Delete Row Count",		"row", "del",		XT_STAT_ACCUMULATIVE,
563
		"Number of rows deleted" },
564
565
	{ XT_STAT_RETRY_INDEX_SCAN,	"Index Scan Retries",	"retry", "iscan",	XT_STAT_ACCUMULATIVE,
566
		"Index scans restarted because of locked record" },
567
	{ XT_STAT_REREAD_REC_LIST,	"Record List Rereads",	"retry", "rlist",	XT_STAT_ACCUMULATIVE,
568
		"Record list rescanned due to lock" },
569
570
	{ XT_STAT_IND_CACHE_DIRTY,	"Index Cache Dirty",	"ind", "%dty",		XT_STAT_PERCENTAGE,
571
		"Percentage of index cache that is dirty" },
572
573
#ifdef XT_TIME_DISK_WRITES
1753.3.1 by Paul McCullagh
Merged with 1.1 trunk
574
	{ XT_STAT_REC_WRITE_TIME,	"Record Write Time",	"rec", "w/ms",		XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
1455.3.1 by Vladimir Kolesnikov
lp:drizzle + pbxt 1.1 + test results
575
		"The time in %sseconds to write record/row files" },
1753.3.1 by Paul McCullagh
Merged with 1.1 trunk
576
	{ XT_STAT_IND_WRITE_TIME,	"Index Write Time",	"ind", "w/ms",		XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
1455.3.1 by Vladimir Kolesnikov
lp:drizzle + pbxt 1.1 + test results
577
		"The time in %sseconds to write index files" },
1753.3.1 by Paul McCullagh
Merged with 1.1 trunk
578
	{ XT_STAT_ILOG_WRITE_TIME,	"Index Log Write Time",	"ilog", "w/ms",		XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
1455.3.1 by Vladimir Kolesnikov
lp:drizzle + pbxt 1.1 + test results
579
		"The time in %sseconds to index log files" },
1753.3.1 by Paul McCullagh
Merged with 1.1 trunk
580
	{ XT_STAT_XLOG_WRITE_TIME,	"Xact Log Write Time",	"*xlog", "w/ms",		XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
1455.3.1 by Vladimir Kolesnikov
lp:drizzle + pbxt 1.1 + test results
581
		"The time in %sseconds to transaction log files" },
582
	{ XT_STAT_DATA_WRITE_TIME,	"Data Log Write Time",	"*data", "w/ms",		XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
583
		"The time in %sseconds to write data log files" }
584
#endif
585
586
#ifdef XT_TIME_DISK_READS
587
    ,
1753.3.1 by Paul McCullagh
Merged with 1.1 trunk
588
	{ XT_STAT_REC_READ_TIME,	"Record Read Time",	"rec", "r/ms",		XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
1455.3.1 by Vladimir Kolesnikov
lp:drizzle + pbxt 1.1 + test results
589
		"The time in %sseconds to read record/row files" },
1753.3.1 by Paul McCullagh
Merged with 1.1 trunk
590
	{ XT_STAT_IND_READ_TIME,	"Index Read Time",	"ind", "r/ms",		XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
1455.3.1 by Vladimir Kolesnikov
lp:drizzle + pbxt 1.1 + test results
591
		"The time in %sseconds to read index files" },
592
	{ XT_STAT_LOG_READ_TIME,	"Log Read Time",	"log", "r/ms",		XT_STAT_ACCUMULATIVE | XT_STAT_TIME_VALUE,
593
		"The time in %sseconds to read index, transaction and data log files" },
594
#endif
595
};
596
597
static int pbxt_stat_meta_order[XT_STAT_MAXIMUM] = {
598
	XT_STAT_TIME_CURRENT,
599
	XT_STAT_TIME_PASSED,
600
	XT_STAT_COMMITS,
601
	XT_STAT_ROLLBACKS,
602
	XT_STAT_WAIT_FOR_XACT,
603
	XT_STAT_XACT_TO_CLEAN,
604
	XT_STAT_STAT_READS,
605
	XT_STAT_STAT_WRITES,
606
	XT_STAT_REC_BYTES_IN,
607
	XT_STAT_REC_BYTES_OUT,
608
#ifdef XT_TIME_DISK_READS
609
	XT_STAT_REC_READ_TIME,
610
#endif
611
#ifdef XT_TIME_DISK_WRITES
612
	XT_STAT_REC_WRITE_TIME,
613
#endif
614
	XT_STAT_REC_SYNC_COUNT,
615
	XT_STAT_REC_SYNC_TIME,
616
	XT_STAT_REC_CACHE_HIT,
617
	XT_STAT_REC_CACHE_MISS,
618
	XT_STAT_REC_CACHE_FREES,
619
	XT_STAT_REC_CACHE_USAGE,
620
	XT_STAT_IND_BYTES_IN,
621
	XT_STAT_IND_BYTES_OUT,
622
#ifdef XT_TIME_DISK_READS
623
	XT_STAT_IND_READ_TIME,
624
#endif
625
#ifdef XT_TIME_DISK_WRITES
626
	XT_STAT_IND_WRITE_TIME,
627
#endif
628
	XT_STAT_IND_SYNC_COUNT,
629
	XT_STAT_IND_SYNC_TIME,
630
	XT_STAT_IND_CACHE_HIT,
631
	XT_STAT_IND_CACHE_MISS,
632
	XT_STAT_IND_CACHE_USAGE,
633
	XT_STAT_IND_CACHE_DIRTY,
634
	XT_STAT_ILOG_BYTES_IN,
635
	XT_STAT_ILOG_BYTES_OUT,
636
#ifdef XT_TIME_DISK_WRITES
637
	XT_STAT_ILOG_WRITE_TIME,
638
#endif
639
	XT_STAT_ILOG_SYNC_COUNT,
640
	XT_STAT_ILOG_SYNC_TIME,
641
	XT_STAT_XLOG_BYTES_IN,
642
	XT_STAT_XLOG_BYTES_OUT,
643
#ifdef XT_TIME_DISK_WRITES
644
	XT_STAT_XLOG_WRITE_TIME,
645
#endif
646
	XT_STAT_XLOG_SYNC_COUNT,
647
	XT_STAT_XLOG_SYNC_TIME,
648
	XT_STAT_XLOG_CACHE_HIT,
649
	XT_STAT_XLOG_CACHE_MISS,
650
	XT_STAT_XLOG_CACHE_USAGE,
651
	XT_STAT_DATA_BYTES_IN,
652
	XT_STAT_DATA_BYTES_OUT,
653
#ifdef XT_TIME_DISK_WRITES
654
	XT_STAT_DATA_WRITE_TIME,
655
#endif
656
	XT_STAT_DATA_SYNC_COUNT,
657
	XT_STAT_DATA_SYNC_TIME,
658
	XT_STAT_BYTES_TO_CHKPNT,
659
#ifdef XT_TIME_DISK_READS
660
	XT_STAT_LOG_READ_TIME,
661
#endif
662
	XT_STAT_LOG_BYTES_TO_WRITE,
663
	XT_STAT_BYTES_TO_SWEEP,
664
	XT_STAT_SWEEPER_WAITS,
665
	XT_STAT_SCAN_INDEX,
666
	XT_STAT_SCAN_TABLE,
667
	XT_STAT_ROW_SELECT,
668
	XT_STAT_ROW_INSERT,
669
	XT_STAT_ROW_UPDATE,
670
	XT_STAT_ROW_DELETE,
671
	XT_STAT_RETRY_INDEX_SCAN,
672
	XT_STAT_REREAD_REC_LIST
673
};
674
675
xtPublic XTStatMetaDataPtr xt_get_stat_meta_data(int i)
676
{
677
	return &pbxt_stat_meta_data[i];
678
}
679
680
/* This is the default order of statistics for display: */
681
xtPublic int xt_get_stat_meta_order(int i)
682
{
683
	return pbxt_stat_meta_order[i];
684
}
685
686
xtPublic void xt_set_time_unit(const char *u)
687
{
688
	xt_strcpy(10, su_t_unit, u);
689
}
690