static int read_bind_value (FILE * fp, T_STRING * t_str, char **linebuf, int *lineno, T_STRING * cas_log_buf) { char *msg_p; char is_bind_value; int linebuf_len; do { is_bind_value = 0; if (IS_CAS_LOG_CMD (*linebuf)) { GET_MSG_START_PTR (msg_p, *linebuf); if (strncmp (msg_p, "bind ", 5) == 0) is_bind_value = 1; } else { is_bind_value = 1; } if (is_bind_value) { linebuf_len = t_string_len (t_str); if (t_string_add (cas_log_buf, *linebuf, linebuf_len) < 0) return -1; } else { return 0; } if (ut_get_line (fp, t_str, linebuf, lineno) <= 0) return -1; } while (1); }
int ut_get_line (FILE * fp, T_STRING * t_str, char **out_str, int *lineno) { char buf[1024]; int out_str_len; bool is_first, bind_with_size = false; int tot_val_size = 0, info_size = 0; long position; t_string_clear (t_str); is_first = true; while (1) { memset (buf, 0, sizeof (buf)); position = ftell (fp); if (fgets (buf, sizeof (buf), fp) == NULL) break; /* if it is (debug) line, skip it */ if (strncmp (buf + 19, "(debug)", 7) == 0) { continue; } if (is_first) { bind_with_size = is_bind_with_size (buf, &tot_val_size, &info_size); if (tot_val_size < 0 || info_size < 0 || (tot_val_size + info_size + 1) < 0) { fprintf (stderr, "log error\n"); return -1; } is_first = false; } if (bind_with_size) { size_t rlen; char *value = NULL; value = (char *) MALLOC (info_size + tot_val_size + 1); if (value == NULL) { fprintf (stderr, "memory allocation error.\n"); return -1; } fseek (fp, position, SEEK_SET); rlen = fread ((void *) value, sizeof (char), info_size + tot_val_size, fp); if (t_bind_string_add (t_str, value, info_size + tot_val_size, tot_val_size) < 0) { fprintf (stderr, "memory allocation error.\n"); FREE_MEM (value); return -1; } FREE_MEM (value); break; } else { if (t_string_add (t_str, buf, strlen (buf)) < 0) { fprintf (stderr, "memory allocation error.\n"); return -1; } if (buf[sizeof (buf) - 2] == '\0' || buf[sizeof (buf) - 2] == '\n') break; } } out_str_len = t_string_len (t_str); if (out_str) *out_str = t_string_str (t_str); if (lineno) *lineno = *lineno + 1; return out_str_len; }
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; }