116 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2016 MariaDB Corporation Ab
 | 
						|
 *
 | 
						|
 * Use of this software is governed by the Business Source License included
 | 
						|
 * in the LICENSE.TXT file and at www.mariadb.com/bsl11.
 | 
						|
 *
 | 
						|
 * Change Date: 2024-02-10
 | 
						|
 *
 | 
						|
 * On the date above, in accordance with the Business Source License, use
 | 
						|
 * of this software will be governed by version 2 or later of the General
 | 
						|
 * Public License.
 | 
						|
 */
 | 
						|
 | 
						|
#include <maxscale/ccdefs.hh>
 | 
						|
#include <iomanip>
 | 
						|
#include <iostream>
 | 
						|
#include <maxscale/paths.h>
 | 
						|
#include "../internal/trxboundaryparser.hh"
 | 
						|
 | 
						|
using namespace std;
 | 
						|
 | 
						|
namespace
 | 
						|
{
 | 
						|
 | 
						|
char USAGE[] = "usage: trxboundaryparser -n count -s statement\n";
 | 
						|
 | 
						|
timespec timespec_subtract(const timespec& later, const timespec& earlier)
 | 
						|
{
 | 
						|
    timespec result = {0, 0};
 | 
						|
 | 
						|
    mxb_assert((later.tv_sec > earlier.tv_sec)
 | 
						|
               || ((later.tv_sec == earlier.tv_sec) && (later.tv_nsec > earlier.tv_nsec)));
 | 
						|
 | 
						|
    if (later.tv_nsec >= earlier.tv_nsec)
 | 
						|
    {
 | 
						|
        result.tv_sec = later.tv_sec - earlier.tv_sec;
 | 
						|
        result.tv_nsec = later.tv_nsec - earlier.tv_nsec;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        result.tv_sec = later.tv_sec - earlier.tv_sec - 1;
 | 
						|
        result.tv_nsec = 1000000000 + later.tv_nsec - earlier.tv_nsec;
 | 
						|
    }
 | 
						|
 | 
						|
    return result;
 | 
						|
}
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char* argv[])
 | 
						|
{
 | 
						|
    int rc = EXIT_SUCCESS;
 | 
						|
 | 
						|
    int nCount = 0;
 | 
						|
    const char* zStatement = NULL;
 | 
						|
 | 
						|
    int c;
 | 
						|
    while ((c = getopt(argc, argv, "n:s:")) != -1)
 | 
						|
    {
 | 
						|
        switch (c)
 | 
						|
        {
 | 
						|
        case 'n':
 | 
						|
            nCount = atoi(optarg);
 | 
						|
            break;
 | 
						|
 | 
						|
        case 's':
 | 
						|
            zStatement = optarg;
 | 
						|
            break;
 | 
						|
 | 
						|
        default:
 | 
						|
            rc = EXIT_FAILURE;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if ((rc == EXIT_SUCCESS) && zStatement && (nCount > 0))
 | 
						|
    {
 | 
						|
        rc = EXIT_FAILURE;
 | 
						|
 | 
						|
        set_datadir(strdup("/tmp"));
 | 
						|
        set_langdir(strdup("."));
 | 
						|
        set_process_datadir(strdup("/tmp"));
 | 
						|
 | 
						|
        if (mxs_log_init(NULL, ".", MXS_LOG_TARGET_DEFAULT))
 | 
						|
        {
 | 
						|
            size_t len = strlen(zStatement);
 | 
						|
            maxscale::TrxBoundaryParser parser;
 | 
						|
 | 
						|
            struct timespec start;
 | 
						|
            clock_gettime(CLOCK_MONOTONIC_RAW, &start);
 | 
						|
 | 
						|
            for (int i = 0; i < nCount; ++i)
 | 
						|
            {
 | 
						|
                parser.type_mask_of(zStatement, len);
 | 
						|
            }
 | 
						|
 | 
						|
            struct timespec finish;
 | 
						|
            clock_gettime(CLOCK_MONOTONIC_RAW, &finish);
 | 
						|
 | 
						|
            struct timespec diff = timespec_subtract(finish, start);
 | 
						|
 | 
						|
            cout << "Time:" << diff.tv_sec << "." << setfill('0') << setw(9) << diff.tv_nsec << endl;
 | 
						|
 | 
						|
            mxs_log_finish();
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            cerr << "error: Could not initialize log." << endl;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        cout << USAGE << endl;
 | 
						|
    }
 | 
						|
 | 
						|
    return rc;
 | 
						|
}
 |