int query_info_add (T_QUERY_INFO * qi, int exec_time, int execute_res, char *filename, int lineno, char *end_date) { int qi_idx = -1; int i; int retval; if (check_log_time (qi->start_date, end_date) < 0) return 0; #ifdef MT_MODE MUTEX_LOCK (query_info_mutex); #endif #if 0 if (qi->sql == NULL) goto query_info_add_end; #endif for (i = 0; i < num_query_info; i++) { if (strcmp (query_info_arr[i].organized_sql, qi->organized_sql) == 0) { qi_idx = i; break; } } if (qi_idx == -1) { query_info_arr = (T_QUERY_INFO *) REALLOC (query_info_arr, sizeof (T_QUERY_INFO) * (num_query_info + 1)); if (query_info_arr == NULL) { fprintf (stderr, "%s\n", strerror (errno)); retval = -1; goto query_info_add_end; } qi_idx = num_query_info; query_info_init (&query_info_arr[qi_idx]); query_info_arr[qi_idx].sql = strdup (qi->sql); query_info_arr[qi_idx].organized_sql = strdup (qi->organized_sql); num_query_info++; } if (exec_time < query_info_arr[qi_idx].min) { query_info_arr[qi_idx].min = exec_time; } if (exec_time > query_info_arr[qi_idx].max) { query_info_arr[qi_idx].max = exec_time; FREE_MEM (query_info_arr[qi_idx].cas_log); query_info_arr[qi_idx].cas_log = (char *) MALLOC (strlen (filename) + qi->cas_log_len + 20); if (query_info_arr[qi_idx].cas_log == NULL) { fprintf (stderr, "%s\n", strerror (errno)); retval = -1; goto query_info_add_end; } sprintf (query_info_arr[qi_idx].cas_log, "%s:%d\n", filename, lineno); query_info_arr[qi_idx].cas_log_len = strlen (query_info_arr[qi_idx].cas_log); memcpy (query_info_arr[qi_idx].cas_log + query_info_arr[qi_idx].cas_log_len, qi->cas_log, qi->cas_log_len); query_info_arr[qi_idx].cas_log_len += qi->cas_log_len; } query_info_arr[qi_idx].count++; query_info_arr[qi_idx].sum += exec_time; if (execute_res < 0) { query_info_arr[qi_idx].err_count++; } retval = 0; query_info_add_end: #ifdef MT_MODE MUTEX_UNLOCK (query_info_mutex); #endif return retval; }
int query_info_add_ne (T_QUERY_INFO * qi, char *end_date) { #ifndef TEST /* query_info_arr_ne is used only in TEST mode */ return 0; #else int qi_idx = -1; int i; int retval; if (check_log_time (qi->start_date, end_date) < 0) { return 0; } #ifdef MT_MODE MUTEX_LOCK (query_info_mutex); #endif for (i = 0; i < num_query_info; i++) { if (strcmp (query_info_arr[i].organized_sql, qi->organized_sql) == 0) { retval = 0; goto query_info_add_ne_end; } } for (i = 0; i < num_query_info_ne; i++) { if (strcmp (query_info_arr_ne[i].organized_sql, qi->organized_sql) == 0) { qi_idx = i; break; } } if (qi_idx == -1) { query_info_arr_ne = (T_QUERY_INFO *) REALLOC (query_info_arr_ne, sizeof (T_QUERY_INFO) * (num_query_info_ne + 1)); if (query_info_arr_ne == NULL) { fprintf (stderr, "%s\n", strerror (errno)); retval = -1; goto query_info_add_ne_end; } qi_idx = num_query_info_ne; query_info_init (&query_info_arr_ne[qi_idx]); query_info_arr_ne[qi_idx].sql = strdup (qi->sql); query_info_arr_ne[qi_idx].organized_sql = strdup (qi->organized_sql); num_query_info_ne++; } FREE_MEM (query_info_arr_ne[qi_idx].cas_log); query_info_arr_ne[qi_idx].cas_log = strdup (qi->cas_log); if (query_info_arr_ne[qi_idx].cas_log == NULL) { fprintf (stderr, "%s\n", strerror (errno)); retval = -1; goto query_info_add_ne_end; } retval = 0; query_info_add_ne_end: #ifdef MT_MODE MUTEX_UNLOCK (query_info_mutex); #endif return retval; #endif /* define TEST */ }
static int log_top (FILE * fp, char *filename) { char *linebuf = NULL; T_QUERY_INFO query_info_buf[MAX_SRV_HANDLE]; char client_msg_buf[CLIENT_MSG_BUF_SIZE]; char connect_msg_buf[CONNECT_MSG_BUF_SIZE]; T_STRING *cas_log_buf = NULL; T_STRING *sql_buf = NULL; T_STRING *linebuf_tstr = NULL; char prepare_buf[128]; int i; char *msg_p; int lineno = 0; char read_flag = 1; char cur_date[32]; for (i = 0; i < MAX_SRV_HANDLE; i++) query_info_init (&query_info_buf[i]); cas_log_buf = t_string_make (1); sql_buf = t_string_make (1); linebuf_tstr = t_string_make (1000); if (cas_log_buf == NULL || sql_buf == NULL || linebuf_tstr == NULL) { fprintf (stderr, "malloc error\n"); goto log_top_err; } memset (client_msg_buf, 0, sizeof (client_msg_buf)); memset (connect_msg_buf, 0, sizeof (connect_msg_buf)); t_string_clear (cas_log_buf); t_string_clear (sql_buf); memset (prepare_buf, 0, sizeof (prepare_buf)); while (1) { if (read_flag) { if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0) { break; } } read_flag = 1; if (!IS_CAS_LOG_CMD (linebuf)) continue; if (strncmp (linebuf + 23, "END OF LOG", 10) == 0) { break; } GET_CUR_DATE_STR (cur_date, linebuf); GET_MSG_START_PTR (msg_p, linebuf); if (strncmp (msg_p, "execute", 7) == 0 || strncmp (msg_p, "execute_all", 11) == 0 || strncmp (msg_p, "execute_call", 12) == 0 || strncmp (msg_p, "execute_batch", 13) == 0) { int qi_idx; char *query_p; int end_block_flag = 0; /* * execute log format: * <execute_cmd> srv_h_id <handle_id> <query_string> * bind <bind_index> : <TYPE> <VALUE> * <execute_cmd> [error:]<res> tuple <tuple_count> time <runtime_msec> * <execute_cmd>: * execute, execute_all or execute_call * * ex) * execute srv_h_id 1 select 'a' from db_root * bind 1 : VARCHAR test str * execute 0 tuple 1 time 0.004 */ qi_idx = log_execute (query_info_buf, linebuf, &query_p); if (qi_idx < 0 || query_p == NULL) goto log_top_err; t_string_clear (sql_buf); t_string_clear (cas_log_buf); t_string_add (sql_buf, query_p, strlen (query_p)); t_string_add (cas_log_buf, linebuf, strlen (linebuf)); if (read_multi_line_sql (fp, linebuf_tstr, &linebuf, &lineno, sql_buf, cas_log_buf) < 0) { break; } if (read_bind_value (fp, linebuf_tstr, &linebuf, &lineno, cas_log_buf) < 0) { break; } GET_MSG_START_PTR (msg_p, linebuf); /* skip query_cancel */ if (strncmp (msg_p, "query_cancel", 12) == 0) { if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0) { break; } } if (strncmp (msg_p, "execute", 7) != 0) { while (1) { if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0) { break; } GET_MSG_START_PTR (msg_p, linebuf); if (strncmp (msg_p, "***", 3) == 0) { end_block_flag = 1; if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0) { /* ut_get_line error, just break; */ break; } break; } } } if (end_block_flag == 1) { continue; } query_info_buf[qi_idx].sql = (char *) REALLOC (query_info_buf[qi_idx].sql, t_string_len (sql_buf) + 1); strcpy (query_info_buf[qi_idx].sql, ut_trim (t_string_str (sql_buf))); GET_MSG_START_PTR (msg_p, linebuf); GET_CUR_DATE_STR (cur_date, linebuf); if (log_top_mode == MODE_MAX_HANDLE) { if (qi_idx >= mode_max_handle_lower_bound) { if (query_info_add (&query_info_buf[qi_idx], qi_idx + 1, 0, filename, lineno, cur_date) < 0) goto log_top_err; } } else { int execute_res, runtime; if (read_execute_end_msg (msg_p, &execute_res, &runtime) < 0) { if (query_info_add_ne (&query_info_buf[qi_idx], cur_date) < 0) goto log_top_err; read_flag = 0; continue; } if (t_string_add (cas_log_buf, linebuf, strlen (linebuf)) < 0) { goto log_top_err; } query_info_buf[qi_idx].cas_log = (char *) REALLOC (query_info_buf[qi_idx].cas_log, t_string_len (cas_log_buf) + 1); memcpy (query_info_buf[qi_idx].cas_log, t_string_str (cas_log_buf), t_string_len (cas_log_buf)); query_info_buf[qi_idx].cas_log_len = t_string_len (cas_log_buf); if (query_info_add (&query_info_buf[qi_idx], runtime, execute_res, filename, lineno, cur_date) < 0) { goto log_top_err; } } } } for (i = 0; i < MAX_SRV_HANDLE; i++) query_info_clear (&query_info_buf[i]); t_string_free (cas_log_buf); t_string_free (sql_buf); t_string_free (linebuf_tstr); return 0; log_top_err: t_string_free (cas_log_buf); t_string_free (sql_buf); t_string_free (linebuf_tstr); return -1; }