diff options
Diffstat (limited to 'innobase/btr/ts/isql.c')
-rw-r--r-- | innobase/btr/ts/isql.c | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/innobase/btr/ts/isql.c b/innobase/btr/ts/isql.c new file mode 100644 index 00000000000..db56aa65a66 --- /dev/null +++ b/innobase/btr/ts/isql.c @@ -0,0 +1,312 @@ +/************************************************************************ +Test for the client: interactive SQL + +(c) 1996-1997 Innobase Oy + +Created 2/16/1996 Heikki Tuuri +*************************************************************************/ + +#include "univ.i" +#include "ib_odbc.h" +#include "mem0mem.h" +#include "sync0sync.h" +#include "os0thread.h" +#include "os0proc.h" +#include "os0sync.h" +#include "srv0srv.h" + +ulint n_exited = 0; + +char cli_srv_endpoint_name[100]; +char cli_user_name[100]; + +ulint n_warehouses = ULINT_MAX; +ulint n_customers_d = ULINT_MAX; +bool is_tpc_d = FALSE; +ulint n_rounds = ULINT_MAX; +ulint n_users = ULINT_MAX; +ulint startdate = 0; +ulint enddate = 0; +bool own_warehouse = FALSE; + +ulint mem_pool_size = ULINT_MAX; + +/************************************************************************* +Reads a keywords and a values from an initfile. In case of an error, exits +from the process. */ +static +void +cli_read_initfile( +/*==============*/ + FILE* initfile) /* in: file pointer */ +{ + char str_buf[10000]; + ulint ulint_val; + + srv_read_init_val(initfile, FALSE, "SRV_ENDPOINT_NAME", str_buf, + &ulint_val); + + ut_a(ut_strlen(str_buf) < COM_MAX_ADDR_LEN); + + ut_memcpy(cli_srv_endpoint_name, str_buf, COM_MAX_ADDR_LEN); + + srv_read_init_val(initfile, FALSE, "USER_NAME", str_buf, + &ulint_val); + ut_a(ut_strlen(str_buf) < COM_MAX_ADDR_LEN); + + ut_memcpy(cli_user_name, str_buf, COM_MAX_ADDR_LEN); + + srv_read_init_val(initfile, TRUE, "MEM_POOL_SIZE", str_buf, + &mem_pool_size); + + srv_read_init_val(initfile, TRUE, "N_WAREHOUSES", str_buf, + &n_warehouses); + + srv_read_init_val(initfile, TRUE, "N_CUSTOMERS_D", str_buf, + &n_customers_d); + + srv_read_init_val(initfile, TRUE, "IS_TPC_D", str_buf, + &is_tpc_d); + + srv_read_init_val(initfile, TRUE, "N_ROUNDS", str_buf, + &n_rounds); + + srv_read_init_val(initfile, TRUE, "N_USERS", str_buf, + &n_users); + + srv_read_init_val(initfile, TRUE, "STARTDATE", str_buf, + &startdate); + + srv_read_init_val(initfile, TRUE, "ENDDATE", str_buf, + &enddate); + + srv_read_init_val(initfile, TRUE, "OWN_WAREHOUSE", str_buf, + &own_warehouse); +} + +/************************************************************************* +Reads configuration info for the client. */ +static +void +cli_boot( +/*=====*/ + char* name) /* in: the initialization file name */ +{ + FILE* initfile; + + initfile = fopen(name, "r"); + + if (initfile == NULL) { + printf( + "Error in client booting: could not open initfile whose name is %s!\n", + name); + os_process_exit(1); + } + + cli_read_initfile(initfile); + + fclose(initfile); +} + +/********************************************************************* +Interactive SQL loop. */ +static +void +isql( +/*=*/ + FILE* inputfile) /* in: input file containing SQL strings, + or stdin */ +{ + HENV env; + HDBC conn; + RETCODE ret; + HSTMT sql_query; + ulint tm, oldtm; + char buf[1000]; + char* str; + ulint count; + ulint n_begins; + ulint len; + ulint n; + ulint i; + ulint n_lines; + + ret = SQLAllocEnv(&env); + + ut_a(ret == SQL_SUCCESS); + + ret = SQLAllocConnect(env, &conn); + + ut_a(ret == SQL_SUCCESS); + + ret = SQLConnect(conn, (UCHAR*)cli_srv_endpoint_name, + (SWORD)ut_strlen(cli_srv_endpoint_name), + cli_user_name, + (SWORD)ut_strlen(cli_user_name), + (UCHAR*)"password", 8); + ut_a(ret == SQL_SUCCESS); + + printf("Connection established\n"); + + printf("Interactive SQL performs queries by first making a stored\n"); + printf("procedure from them, and then calling the procedure.\n"); + printf("Put a semicolon after each statement and\n"); + printf("end your query with two <enter>s.\n\n"); + printf("You can also give a single input file\n"); + printf("as a command line argument to isql.\n\n"); + printf("In the file separate SQL queries and procedure bodies\n"); + printf("by a single empty line. Do not write the final END; into\n"); + printf("a procedure body.\n\n"); + + count = 0; +loop: + count++; + n = 0; + n_lines = 0; + + sprintf(buf, "PROCEDURE P%s%lu () IS\nBEGIN ", cli_user_name, + count); + for (;;) { + len = ut_strlen(buf + n) - 1; + n += len; + + if (len == 0) { + break; + } else { + sprintf(buf + n, "\n"); + n++; + n_lines++; + } + + str = fgets(buf + n, 1000, inputfile); + + if ((str == NULL) && (inputfile != stdin)) { + /* Reached end-of-file: switch to input from + keyboard */ + + inputfile = stdin; + + break; + } + + ut_a(str); + } + + if (n_lines == 1) { + /* Empty procedure */ + + goto loop; + } + + /* If the statement is actually the body of a procedure, + erase the first BEGIN from the string: */ + + n_begins = 0; + + for (i = 0; i < n - 5; i++) { + + if (ut_memcmp(buf + i, "BEGIN", 5) == 0) { + + n_begins++; + } + } + + if (n_begins > 1) { + + for (i = 0; i < n - 5; i++) { + + if (ut_memcmp(buf + i, "BEGIN", 5) == 0) { + + /* Erase the first BEGIN: */ + ut_memcpy(buf + i, " ", 5); + + break; + } + } + } + + sprintf(buf + n, "END;\n"); + + printf("SQL procedure to execute:\n%s\n", buf); + + ret = SQLAllocStmt(conn, &sql_query); + + ut_a(ret == SQL_SUCCESS); + + ret = SQLPrepare(sql_query, (UCHAR*)buf, ut_strlen(buf)); + + ut_a(ret == SQL_SUCCESS); + + ret = SQLExecute(sql_query); + + ut_a(ret == SQL_SUCCESS); + + sprintf(buf, "{P%s%lu ()}", cli_user_name, count); + + ret = SQLAllocStmt(conn, &sql_query); + + ut_a(ret == SQL_SUCCESS); + + ret = SQLPrepare(sql_query, (UCHAR*)buf, ut_strlen(buf)); + + ut_a(ret == SQL_SUCCESS); + + printf("Starting to execute the query\n"); + + oldtm = ut_clock(); + + ret = SQLExecute(sql_query); + + tm = ut_clock(); + + printf("Wall time for query %lu milliseconds\n\n", tm - oldtm); + + ut_a(ret == SQL_SUCCESS); + + goto loop; +} + +/******************************************************************** +Main test function. */ + +void +main(int argc, char* argv[]) +/*========================*/ +{ + ulint tm, oldtm; + FILE* inputfile; + + if (argc > 2) { + printf("Only one input file allowed\n"); + + os_process_exit(1); + + } else if (argc == 2) { + inputfile = fopen(argv[1], "r"); + + if (inputfile == NULL) { + printf( + "Error: could not open the inputfile whose name is %s!\n", + argv[1]); + os_process_exit(1); + } + } else { + inputfile = stdin; + } + + cli_boot("cli_init"); + + sync_init(); + + mem_init(mem_pool_size); + + oldtm = ut_clock(); + + isql(inputfile); + + tm = ut_clock(); + + printf("Wall time for test %lu milliseconds\n", tm - oldtm); + + printf("TESTS COMPLETED SUCCESSFULLY!\n"); +} |