35 #include <sys/timeb.h> 56 #define TESTER_ERR_MSG_SIZE 1024 57 #define TIME_BUF_SIZE 50 58 #define MAX_DISPLAY_LENGTH 20 60 #define DEFAULT_EMPTY_STRING "\0" 61 #define DEFAULT_CUB_USER_NAME "PUBLIC" 62 #define DEFAULT_ORACLE_USER_NAME "scott" 63 #define DEFAULT_ORACLE_PASSWORD "tiger" 64 #define DEFAULT_MYSQL_USER_NAME "root" 66 #define RESULT_FORMAT "%-15s" 67 #define SHARD_ID_FORMAT "%-10d" 68 #define STR_SHARD_ID_FORMAT "%-10s" 69 #define ROWCOUNT_FORMAT "%-15d" 70 #define QUERY_FORMAT "%s" 71 #define STR_ROWCOUNT_FORMAT "%-15s" 72 #define TIME_FORMAT "%-20s" 74 #define PRINT_CCI_ERROR(...) \ 76 if (br_tester_info.verbose_mode) \ 78 if (out_file_fp != NULL) \ 80 fprintf (out_file_fp , "<Error>\n");\ 81 fprintf (out_file_fp , __VA_ARGS__); \ 83 fprintf (stderr, "<Error>\n"); \ 84 fprintf (stderr, __VA_ARGS__); \ 88 #define PRINT_RESULT(...) \ 90 if (out_file_fp != NULL) \ 92 fprintf (out_file_fp ,__VA_ARGS__); \ 94 fprintf (stdout, __VA_ARGS__); \ 97 #define PRINT_TITLE(n, ...) \ 99 if (out_file_fp != NULL) \ 101 fprintf (out_file_fp ,__VA_ARGS__); \ 103 n += fprintf (stdout, __VA_ARGS__); \ 136 static int execute_test (
int conn_handle,
int shard_flag);
142 static void print_result (
int row_count,
int err_code,
int shard_flag,
int shard_id,
char *time,
char *query);
143 static int print_result_set (
int req, T_CCI_ERROR * err_buf, T_CCI_COL_INFO * col_info,
int col_count);
145 static void print_line (
const char *ch,
int num);
154 int master_shm_id = 0;
160 if (master_shm_id <= 0)
168 fprintf (stderr,
"master shared memory open error[0x%x]\n", master_shm_id);
174 if (strcasecmp (broker_name, shm_br->
br_info[i].
name) == 0)
176 broker_info_p = &shm_br->
br_info[
i];
181 if (broker_info_p ==
NULL)
184 fprintf (stderr,
"Cannot find Broker [%s]\n", broker_name);
195 if (shm_proxy ==
NULL)
198 fprintf (stderr,
"proxy shared memory open error[0x%x]\n", broker_info_p->
proxy_shm_id);
231 const char *user_name;
232 const char *user_password;
239 switch (appl_server_type)
280 int master_shm_id = 0;
281 struct stat stat_buf;
283 const char *conf_file;
288 if (conf_file !=
NULL)
297 if (stat (conf_file_path, &stat_buf) == 0)
302 fprintf (stderr,
"cannot open conf file %s\n", conf_file_path);
308 fprintf (stderr,
"cannot find [%s] section in conf file %s\n",
SECTION_NAME, conf_file_path);
314 if (master_shm_id <= 0)
316 fprintf (stderr,
"cannot find MASTER_SHM_ID in [%s] section\n",
SECTION_NAME);
322 return master_shm_id;
328 struct timeval end_time;
329 struct timeval elapsed_time;
334 gettimeofday (&end_time,
NULL);
336 elapsed_time.tv_sec = end_time.tv_sec - start_time->tv_sec;
337 elapsed_time.tv_usec = end_time.tv_usec - start_time->tv_usec;
338 if (elapsed_time.tv_usec < 0)
340 elapsed_time.tv_sec--;
341 elapsed_time.tv_usec += 1000000;
343 snprintf (time, buf_len,
"%ld.%06ld sec", elapsed_time.tv_sec, elapsed_time.tv_usec);
352 int ret, req, col_count;
354 char query_with_hint[LINE_MAX];
355 struct timeval start_time;
357 T_CCI_SQLX_CMD cmd_type;
358 T_CCI_COL_INFO *col_info =
NULL;
366 snprintf (query_with_hint,
sizeof (query_with_hint),
"%s /*+ shard_id(%d) */ /* broker_tester */", query,
371 snprintf (query_with_hint,
sizeof (query_with_hint),
"%s /* broker_tester */", query);
374 gettimeofday (&start_time,
NULL);
376 req = cci_prepare (conn_handle, query_with_hint, 0, &err_buf);
380 err_buf.err_code, err_buf.err_msg);
386 ret = cci_execute (req, 0, 0, &err_buf);
390 err_buf.err_code, err_buf.err_msg);
399 ret = cci_get_shard_id_with_req_handle (req, &shard_id, &err_buf);
403 err_buf.err_code, err_buf.err_msg);
411 col_info = cci_get_result_info (req, &cmd_type, &col_count);
415 err_buf.err_code, err_buf.err_msg);
422 get_time (&start_time, time,
sizeof (time));
424 print_result (ret, err_buf.err_code, shard_flag, shard_id, time, query);
435 cci_close_req_handle (req);
437 cci_end_tran (conn_handle, CCI_TRAN_ROLLBACK, &err_buf);
444 while (++shard_id < br_tester_info.
num_shard);
446 return (-1 * err_num);
452 char query[LINE_MAX];
461 fprintf (stderr,
"cannot open input file %s\n", br_tester_info.
input_file_name);
467 while (fgets (query, LINE_MAX - 1, file) !=
NULL)
471 p = strchr (query,
'#');
478 if (query[0] ==
'\0')
492 return (-1 * err_num);
505 for (i = 0; i < num; i++)
515 (
"broker_tester <broker_name> [-D <database_name>] [-u <user_name>] [-p <user_password>] [-c <SQL_command>] [-i <input_file>] [-o <output_file>] [-v] [-s]\n");
516 printf (
"\t-D database-name\n");
517 printf (
"\t-u alternate user name\n");
518 printf (
"\t-p password string, give \"\" for none\n");
519 printf (
"\t-c SQL-command\n");
520 printf (
"\t-i input-file-name\n");
521 printf (
"\t-o ouput-file-name\n");
522 printf (
"\t-v verbose mode\n");
523 printf (
"\t-s single shard database\n");
533 if (shard_flag ==
ON)
600 print_result (
int row_count,
int err_code,
int shard_flag,
int shard_id,
char *time,
char *query)
610 snprintf (result_buf,
sizeof (result_buf),
"FAIL(%d) ", err_code);
615 if (shard_flag ==
ON)
636 print_result_set (
int req, T_CCI_ERROR * err_buf, T_CCI_COL_INFO * col_info,
int col_count)
646 char *data_with_quot =
NULL;
647 T_CCI_U_EXT_TYPE *col_type_arr;
649 col_size_arr = (
int *) malloc (
sizeof (
int) * col_count);
650 if (col_size_arr ==
NULL)
652 fprintf (stderr,
"malloc error\n");
656 col_type_arr = (T_CCI_U_EXT_TYPE *) malloc (
sizeof (T_CCI_U_EXT_TYPE) * col_count);
657 if (col_type_arr ==
NULL)
661 fprintf (stderr,
"malloc error\n");
667 for (i = 1; i < col_count + 1; i++)
669 col_name = CCI_GET_RESULT_INFO_NAME (col_info, i);
670 col_size_arr[i - 1] = MIN (
MAX_DISPLAY_LENGTH, CCI_GET_RESULT_INFO_PRECISION (col_info, i));
671 col_size_arr[i - 1] = MAX (col_size_arr[i - 1], (
int)
strlen (col_name));
672 col_type_arr[i - 1] = CCI_GET_RESULT_INFO_TYPE (col_info, i);
674 PRINT_TITLE (title_len,
" %-*s", col_size_arr[i - 1], col_name);
684 ret = cci_cursor (req, 1, CCI_CURSOR_CURRENT, err_buf);
685 if (ret == CCI_ER_NO_MORE_DATA)
693 PRINT_CCI_ERROR (
"ERROR CODE : %d\n%s\n\n", err_buf->err_code, err_buf->err_msg);
697 ret = cci_fetch (req, err_buf);
700 PRINT_CCI_ERROR (
"ERROR CODE : %d\n%s\n\n", err_buf->err_code, err_buf->err_msg);
704 for (i = 1; i < col_count + 1; i++)
706 ret = cci_get_data (req, i, CCI_A_TYPE_STR, &data, &ind);
709 PRINT_CCI_ERROR (
"ERROR CODE : %d\n%s\n\n", err_buf->err_code, err_buf->err_msg);
719 int len = (int)
strlen (data) + 3;
720 if (malloc_size < len)
724 data_with_quot = (
char *) malloc (malloc_size);
725 if (data_with_quot ==
NULL)
727 fprintf (stderr,
"malloc error\n");
732 snprintf (data_with_quot, len,
"'%s'", data);
734 PRINT_RESULT (
" %-*s", col_size_arr[i - 1], data_with_quot);
756 case CCI_U_TYPE_SHORT:
757 case CCI_U_TYPE_FLOAT:
758 case CCI_U_TYPE_DOUBLE:
759 case CCI_U_TYPE_BIGINT:
784 int conn_handle = -1;
786 char conn_url[LINE_MAX];
795 memset (&br_tester_info, 0,
sizeof (br_tester_info));
797 strncpy (broker_name, argv[1],
sizeof (broker_name) - 1);
799 while ((opt =
getopt (argc, argv,
"D:u:p:c:i:o:sv")) != -1)
839 snprintf (conn_url,
sizeof (conn_url),
"cci:cubrid:localhost:%u:%s:::", br_tester_info.
broker_port,
841 conn_handle = cci_connect_with_url_ex (conn_url, br_tester_info.
db_user, br_tester_info.
db_passwd, &err_buf);
847 PRINT_CCI_ERROR (
"ERROR CODE : %d\n%s\n\n", err_buf.err_code, err_buf.err_msg);
852 ret = cci_set_autocommit (conn_handle, CCI_AUTOCOMMIT_FALSE);
855 fprintf (stderr,
"cannot set autocommit mode\n");
864 fprintf (stderr,
"cannot open output file %s\n", br_tester_info.
input_file_name);
889 if (conn_handle >= 0)
891 cci_disconnect (conn_handle, &err_buf);
static void print_title(int shard_flag)
static int print_result_set(int req, T_CCI_ERROR *err_buf, T_CCI_COL_INFO *col_info, int col_count)
int ini_gethex(INI_TABLE *ini, const char *sec, const char *key, int def, int *lineno)
int getopt(int, char *const *, const char *)
static const char SECTION_NAME[]
static int execute_test_with_query(int conn_handle, char *query, int shard_flag)
static void print_line(const char *ch, int num)
static void print_result(int row_count, int err_code, int shard_flag, int shard_id, char *time, char *query)
#define DEFAULT_ORACLE_PASSWORD
#define MAX_DISPLAY_LENGTH
char broker_name[BROKER_NAME_LEN]
static void print_conn_result(char *broker_name, int conn_hd_id)
TESTER_INFO br_tester_info
#define DEFAULT_MYSQL_USER_NAME
void ini_parser_free(INI_TABLE *ini)
INI_TABLE * ini_parser_load(const char *ininame)
#define TESTER_ERR_MSG_SIZE
char shard_db_name[SRV_CON_DBNAME_SIZE]
char * get_cubrid_file(T_CUBRID_FILE_ID fid, char *buf, size_t len)
#define APPL_SERVER_CAS_MYSQL
#define APPL_SERVER_CAS_ORACLE
static int init_tester_info(char *broker_name)
#define DEFAULT_ORACLE_USER_NAME
static void init_default_conn_info(int appl_server_type)
int ini_findsec(INI_TABLE *ini, const char *sec)
#define PRINT_CCI_ERROR(...)
static void print_query_test_result(int ret)
static FILE * out_file_fp
static bool is_number_type(T_CCI_U_TYPE type)
#define DEFAULT_EMPTY_STRING
void uw_shm_detach(void *p)
#define DEFAULT_CUB_USER_NAME
#define PRINT_RESULT(...)
static int execute_test(int conn_handle, int shard_flag)
#define strncpy_bufsize(buf, str)
static void get_time(struct timeval *start_time, char *time, int buf_len)
static char tester_err_msg[TESTER_ERR_MSG_SIZE]
#define PRINT_TITLE(n,...)
static int get_master_shm_id(void)
static struct timeval start_time
static void print_usage(void)
T_SHM_SHARD_CONN shm_shard_conn
static T_SHM_BROKER * shm_br
const char * envvar_get(const char *name)
#define snprintf_dots_truncate(dest, max_len,...)
char shard_db_password[SRV_CON_DBPASSWD_SIZE]
char shard_db_user[SRV_CON_DBUSER_SIZE]
char name[BROKER_NAME_LEN]
char * strdup(const char *str)
#define STR_ROWCOUNT_FORMAT
int main(int argc, char *argv[])
void * uw_shm_open(int shm_key, int which_shm, T_SHM_MODE shm_mode)
static void print_shard_result(void)
#define STR_SHARD_ID_FORMAT
static void free_br_tester_info(void)