48 #if defined (SUPPRESS_STRLEN_WARNING) 49 #define strlen(s1) ((int) strlen(s1)) 52 #define MAX_SRV_HANDLE 3000 53 #define CLIENT_MSG_BUF_SIZE 1024 54 #define CONNECT_MSG_BUF_SIZE 1024 57 typedef struct t_work_msg T_WORK_MSG;
66 static int log_top (FILE * fp,
char *filename,
long start_offset,
long end_offset);
70 static int get_file_count (
int argc,
char *
argv[],
int arg_start);
71 static int get_file_list (
char *list[],
int size,
int argc,
char *
argv[],
int arg_start);
72 static char **alloc_file_list (
int size);
73 static void free_file_list (
char **list,
int size);
82 static int search_offset (FILE * fp,
char *
string,
long *offset,
bool start);
96 static T_WORK_MSG *work_msg;
106 char **file_list =
NULL;
117 file_cnt = get_file_count (argc, argv, arg_start);
123 file_list = alloc_file_list (file_cnt);
124 if (file_list ==
NULL)
129 get_cnt = get_file_list (file_list, file_cnt, argc, argv, arg_start);
130 if (get_cnt > file_cnt)
144 free_file_list (file_list, file_cnt);
161 get_file_count (
int argc,
char *
argv[],
int arg_start)
166 WIN32_FIND_DATA find_data;
168 for (i = arg_start; i <
argc; i++)
170 handle = FindFirstFile (
argv[i], &find_data);
171 if (handle == INVALID_HANDLE_VALUE)
173 fprintf (stderr,
"No such file or directory[%s]\n",
argv[i]);
179 if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
184 while (FindNextFile (handle, &find_data));
193 get_file_list (
char *list[],
int size,
int argc,
char *
argv[],
int arg_start)
198 WIN32_FIND_DATA find_data;
199 char *slash_pos, *pos1, *pos2;
200 char prefix[MAX_PATH] = { 0 };
204 for (i = arg_start; i <
argc; i++)
206 handle = FindFirstFile (
argv[i], &find_data);
207 if (handle == INVALID_HANDLE_VALUE)
213 pos1 = strrchr (
argv[i],
'\\');
214 pos2 = strrchr (
argv[i],
'/');
215 slash_pos = MAX (pos1, pos2);
216 if (slash_pos !=
NULL)
218 strncpy (prefix,
argv[i], MAX_PATH);
219 prefix[slash_pos -
argv[
i] + 1] =
'\0';
225 if (index < size && !(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
228 if (slash_pos !=
NULL)
230 snprintf (list[index], MAX_PATH,
"%s%s", prefix, find_data.cFileName);
234 strncpy (list[index], find_data.cFileName, MAX_PATH);
239 while (FindNextFile (handle, &find_data));
248 alloc_file_list (
int size)
251 char **file_list =
NULL;
255 file_list = (
char **)
MALLOC (
sizeof (
char *) * size);
256 if (file_list ==
NULL)
258 fprintf (stderr,
"fail memory allocation\n");
262 for (i = 0; i < size; i++)
264 file_list[
i] = (
char *)
MALLOC (MAX_PATH);
266 if (file_list[i] ==
NULL)
268 fprintf (stderr,
"fail memory allocation\n");
269 for (j = 0; j <
i; j++)
282 free_file_list (
char **list,
int size)
287 for (i = 0; i < size; i++)
304 if (!start_offset || !end_offset)
309 fp = fopen (filename,
"r");
353 long start_offset, end_offset;
360 query_info_mutex_init ();
365 if (work_msg ==
NULL)
367 fprintf (stderr,
"malloc error\n");
370 memset (work_msg, 0,
sizeof (T_WORK_MSG *) * num_thread);
376 for (i = arg_start; i <
argc; i++)
379 fprintf (stdout,
"%s\n", filename);
382 fp = fopen (filename,
"rb");
384 fp = fopen (filename,
"r");
388 fprintf (stderr,
"%s[%s]\n", strerror (errno), filename);
397 start_offset = end_offset = -1;
405 if (work_msg[j].filename ==
NULL)
408 work_msg[j].filename = filename;
418 error =
log_top (fp, filename, start_offset, end_offset);
433 fprintf (stdout,
"read sql info file...\n");
440 fprintf (stdout,
"print results...\n");
450 int self_index = (int) arg;
454 if (work_msg[self_index].filename ==
NULL)
460 log_top (work_msg[self_index].fp, work_msg[self_index].filename);
461 fclose (work_msg[self_index].fp);
462 work_msg[self_index].fp =
NULL;
463 work_msg[self_index].filename =
NULL;
471 log_top (FILE * fp,
char *filename,
long start_offset,
long end_offset)
473 char *linebuf =
NULL;
480 char prepare_buf[128];
488 start_date[0] =
'\0';
499 if (cas_log_buf ==
NULL || sql_buf ==
NULL || linebuf_tstr ==
NULL)
501 fprintf (stderr,
"malloc error\n");
505 memset (client_msg_buf, 0,
sizeof (client_msg_buf));
506 memset (connect_msg_buf, 0,
sizeof (connect_msg_buf));
509 memset (prepare_buf, 0,
sizeof (prepare_buf));
511 if (start_offset != -1)
513 fseek (fp, start_offset, SEEK_SET);
518 if (end_offset != -1)
520 if (ftell (fp) > end_offset)
528 if (
ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
538 fprintf (stderr,
"invaild version of log file\n");
549 if (strncmp (linebuf + 23,
"END OF LOG", 10) == 0)
555 if (start_date[0] ==
'\0')
557 strcpy (start_date, cur_date);
561 if (strncmp (msg_p,
"execute", 7) == 0 || strncmp (msg_p,
"execute_all", 11) == 0
562 || strncmp (msg_p,
"execute_call", 12) == 0 || strncmp (msg_p,
"execute_batch", 13) == 0)
566 int end_block_flag = 0;
581 qi_idx =
log_execute (query_info_buf, linebuf, &query_p);
582 if (qi_idx < 0 || query_p ==
NULL)
595 if (
read_bind_value (fp, linebuf_tstr, &linebuf, &lineno, cas_log_buf) < 0)
603 if (strncmp (msg_p,
"query_cancel", 12) == 0)
605 if (
ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
611 if (strncmp (msg_p,
"execute", 7) != 0)
615 if (
ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
621 if (strncmp (msg_p,
"***", 3) == 0)
624 if (
ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
634 if (end_block_flag == 1)
647 strcpy (query_info_buf[qi_idx].start_date, start_date);
653 if (
query_info_add (&query_info_buf[qi_idx], qi_idx + 1, 0, filename, lineno, cur_date) < 0)
661 int execute_res, runtime;
669 query_info_buf[qi_idx].
cas_log =
690 if (
query_info_add (&query_info_buf[qi_idx], runtime, execute_res, filename, lineno, cur_date) < 0)
696 start_date[0] =
'\0';
722 p = strstr (linebuf,
"srv_h_id ");
725 fprintf (stderr,
"log error[%s]\n", linebuf);
728 exec_h_id = atoi (p + 9);
729 *query_p = strchr (p + 9,
' ');
731 *query_p = *query_p + 1;
735 fprintf (stderr,
"log error. exec id = %d\n", exec_h_id);
748 while ((c =
getopt (argc, argv,
"tq:h:F:T:")) != EOF)
764 goto date_format_err;
770 goto date_format_err;
785 fprintf (stderr,
"%s [-t] [-F <from date>] [-T <to date>] <log_file> ...\n", argv[0]);
788 fprintf (stderr,
"invalid date. valid date format is yy-mm-dd hh:mm:ss.\n");
810 fprintf (stderr,
"malloc error\n");
815 fprintf (stderr,
"malloc error\n");
835 if (strncmp (msg_p,
"bind ", 5) == 0)
845 if (
t_string_add (cas_log_buf, *linebuf, linebuf_len) < 0)
872 p = strchr (msg_p,
' ');
878 if (strncmp (p,
"error:", 6) == 0)
891 if (strncmp (p,
"tuple ", 6) != 0)
906 if (strncmp (p,
"time ", 5) != 0)
912 sscanf (p,
"%d.%d", &sec, &msec);
913 *runtime_msec = sec * 1000 + msec;
924 off_t old_start_ptr = 0;
925 bool old_start_saved =
false;
926 long tmp_offset = -1;
927 struct stat stat_buf;
928 char *linebuf =
NULL;
937 if (fstat (fileno (fp), &stat_buf) < 0)
942 end_ptr = stat_buf.st_size;
945 if (linebuf_tstr ==
NULL)
954 if (fseek (fp, cur_ptr, SEEK_SET) < 0)
959 while (
ut_get_line (fp, linebuf_tstr, &linebuf, &line_no) > 0)
965 cur_ptr = ftell (fp);
967 if (cur_ptr >= end_ptr)
969 tmp_offset = old_start_saved ? old_start_ptr : start_ptr;
978 old_start_saved =
true;
979 old_start_ptr = start_ptr;
980 start_ptr = ftell (fp);
985 if (ret_val == 0 && old_start_saved)
987 tmp_offset = start_ptr;
992 old_start_saved =
false;
997 cur_ptr = start_ptr + (end_ptr - start_ptr) / 2;
998 if (cur_ptr <= start_ptr)
1000 tmp_offset = start_ptr;
1006 if (fseek (fp, tmp_offset, SEEK_SET) < 0)
1011 while (
ut_get_line (fp, linebuf_tstr, &linebuf, &line_no) > 0)
1029 tmp_offset = ftell (fp);
1032 *offset = tmp_offset;
1047 SQL_TOKEN_DOUBLE_QUOTE,
1048 SQL_TOKEN_SINGLE_QUOTE,
1049 SQL_TOKEN_SQL_COMMENT,
1050 SQL_TOKEN_C_COMMENT,
1051 SQL_TOKEN_CPP_COMMENT
1054 SQL_TOKEN token = SQL_TOKEN_NONE;
1057 const char *q =
NULL;
1058 char *organized_sql =
NULL;
1059 bool need_copy_token =
true;
1061 organized_sql = (
char *) malloc (
strlen (sql) + 1);
1062 if (organized_sql ==
NULL)
1072 need_copy_token =
true;
1075 if (token == SQL_TOKEN_NONE)
1077 if (*q ==
'\'' && (q == sql || *(q - 1) !=
'\\'))
1079 token = SQL_TOKEN_SINGLE_QUOTE;
1081 else if (*q ==
'"' && (q == sql || *(q - 1) !=
'\\'))
1083 token = SQL_TOKEN_DOUBLE_QUOTE;
1085 else if (*q ==
'-' && *(q + 1) ==
'-')
1087 need_copy_token =
false;
1088 token = SQL_TOKEN_SQL_COMMENT;
1091 else if (*q ==
'/' && *(q + 1) ==
'*')
1093 need_copy_token =
false;
1094 token = SQL_TOKEN_C_COMMENT;
1097 else if (*q ==
'/' && *(q + 1) ==
'/')
1099 need_copy_token =
false;
1100 token = SQL_TOKEN_CPP_COMMENT;
1106 need_copy_token =
false;
1108 if (token == SQL_TOKEN_SINGLE_QUOTE)
1110 need_copy_token =
true;
1112 if (*q ==
'\'' && *(q - 1) !=
'\\')
1114 token = SQL_TOKEN_NONE;
1117 else if (token == SQL_TOKEN_DOUBLE_QUOTE)
1119 need_copy_token =
true;
1121 if (*q ==
'"' && *(q - 1) !=
'\\')
1123 token = SQL_TOKEN_NONE;
1126 else if ((token == SQL_TOKEN_SQL_COMMENT || token == SQL_TOKEN_CPP_COMMENT) && *q ==
'\n')
1128 token = SQL_TOKEN_NONE;
1130 else if (token == SQL_TOKEN_C_COMMENT && *q ==
'*' && *(q + 1) ==
'/')
1132 token = SQL_TOKEN_NONE;
1137 if (need_copy_token)
1139 memcpy (p, q, token_len);
1148 return organized_sql;
#define SLEEP_MILISEC(sec, msec)
int sql_list_make(char *list_file)
T_LOG_TOP_MODE log_top_mode
#define CAS_LOG_BEGIN_WITH_YEAR
int t_string_add(T_STRING *t_str, char *str, int str_len)
char * get_msg_start_ptr(char *linebuf)
int getopt(int, char *const *, const char *)
#define CONNECT_MSG_BUF_SIZE
static int get_args(int argc, char *argv[])
#define THREAD_BEGIN(THR_ID, FUNC, ARG)
int query_info_add(T_QUERY_INFO *qi, int exec_time, int execute_res, char *filename, int lineno, char *end_date)
static int log_top_query(int argc, char *argv[], int arg_start)
void query_info_print(void)
static THREAD_FUNC thr_main(void *arg)
void t_string_free(T_STRING *t_str)
int log_top_tran(int argc, char *argv[], int arg_start)
#define CLIENT_MSG_BUF_SIZE
int t_string_len(T_STRING *t_str)
int main(int argc, char *argv[])
#define CAS_LOG_BEGIN_WITH_MONTH
static int read_bind_value(FILE *fp, T_STRING *t_str, char **linebuf, int *lineno, T_STRING *cas_log_buf)
char * t_string_str(T_STRING *t_str)
static char * organize_query_string(const char *sql)
static int mode_max_handle_lower_bound
int is_cas_log(char *str)
static char * sql_info_file
int str_to_int32(int *ret_p, char **end_p, const char *str_p, int base)
#define GET_CUR_DATE_STR(BUF, LINEBUF)
void query_info_init(T_QUERY_INFO *qi)
static int log_execute(T_QUERY_INFO *qi, char *linebuf, char **query_p)
int count(int &result, const cub_regex_object ®, const std::string &src, const int position, const INTL_CODESET codeset)
enum t_log_top_mode T_LOG_TOP_MODE
void query_info_clear(T_QUERY_INFO *qi)
static void error(const char *msg)
static int search_offset(FILE *fp, char *string, long *offset, bool start)
static int log_top(FILE *fp, char *filename, long start_offset, long end_offset)
int query_info_add_ne(T_QUERY_INFO *qi, char *end_date)
T_STRING * t_string_make(int init_size)
int check_log_time(char *start_date, char *end_date)
static int read_multi_line_sql(FILE *fp, T_STRING *t_str, char **linebuf, int *lineno, T_STRING *sql_buf, T_STRING *cas_log_buf)
static int read_execute_end_msg(char *msg_p, int *res_code, int *runtime_msec)
int get_file_offset(char *filename, long *start_offset, long *end_offset)
char * ut_trim(char *str)
void t_string_clear(T_STRING *t_str)
int ut_get_line(FILE *fp, T_STRING *t_str, char **out_str, int *lineno)
int str_to_log_date_format(char *str, char *date_format_str)
static char from_date[128]
#define REALLOC(PTR, SIZE)